ZGlmZiAtLWdpdCBhL3NjcmlwdHMvaG9zdC1hZGQuc2ggYi9zY3JpcHRzL2hvc3QtYWRkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmMjEzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2hvc3QtYWRkLnNoCkBAIC0wLDAgKzEsNDA2IEBACisjIS9iaW4vYmFzaAorCisjIworIyBDb3B5cmlnaHQgMjAxNSBUZWxlZvNuaWNhIEludmVzdGlnYWNp824geSBEZXNhcnJvbGxvLCBTLkEuVS4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyMgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KKyMgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorIyBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKKyMgY29udGFjdCB3aXRoOiBuZnZsYWJzQHRpZC5lcworIyMKKworI0dldCBjb25maWd1cmF0aW9uIG9mIGEgaG9zdCBmb3IgdXNpbmcgaXQgYXMgYSBjb21wdXRlIG5vZGUKKworZnVuY3Rpb24gdXNhZ2UoKXsKKyAgICBlY2hvICAtZSAidXNhZ2U6ICQwIHVzZXIgaXBfbmFtZSBbPj4gaG9zdC55YW1sXVxuICBHZXQgaG9zdCBwYXJhbWV0ZXJzIGFuZCBnZW5lcmF0ZWQgYSB5YW1sIGZpbGUgdG8gYmUgdXNlZCBmb3Igb3BlbnZpbSBob3N0LWFkZCIKKyAgICBleGl0IDEKK30KKworZnVuY3Rpb24gbG9hZF92Zl9kcml2ZXIoKXsKKyAgbG9jYWwgcGZfZHJpdmVyPSQxCisgIGlmIFtbIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICRwZl9kcml2ZXIgfCBncmVwIC12IHZmYCBdXSAmJiBbWyAhIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICR7cGZfZHJpdmVyfXZmYCBdXQorICB0aGVuCisgICAgPiYyIGVjaG8gIiRwZl9kcml2ZXIgaXMgbG9hZGVkIGJ1dCBub3QgJHtwZl9kcml2ZXJ9dmYuIFRoaXMgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gcHJvcGVybHkgYWRkIFNSLUlPVi4iCisgICAgcmVhZCAtcCAiRG8geW91IHdhbnQgdG8gbG9hZCAke3BmX2RyaXZlcn12ZiBbWS9uXSAiIGxvYWRfZHJpdmVyCisgICAgY2FzZSAkbG9hZF9kcml2ZXIgaW4KKyAgICAgIFtuTl0qICkgZXhpdCAxOzsKKyAgICAgICogKSA+JjIgZWNobyAiTG9hZGluZyAke3BmX2RyaXZlcn12Zi4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAke3BmX2RyaXZlcn12ZjsKKyAgICAgICAgICA+JjIgZWNobyAiUmVsb2FkaW5nICR7cGZfZHJpdmVyfS4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAtciAkcGZfZHJpdmVyOworICAgICAgICAgIG1vZHByb2JlICRwZl9kcml2ZXI7OworICAgIGVzYWMKKyAgZmkKK30KKworZnVuY3Rpb24gcmVtb3ZlX3ZmX2RyaXZlcigpeworICBsb2NhbCBwZl9kcml2ZXI9JDEKKyAgaWYgW1sgYGxzbW9kIHwgY3V0IC1kIiAiIC1mMSB8IGdyZXAgJHBmX2RyaXZlciB8IGdyZXAgLXYgdmZgIF1dICYmIFtbIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICR7cGZfZHJpdmVyfXZmYCBdXQorICB0aGVuCisgICAgPiYyIGVjaG8gIiR7cGZfZHJpdmVyfXZmIGlzIGxvYWRlZC4gSW4gb3JkZXIgdG8gZW5zdXJlIHByb3BlciBTUi1JT1YgYmVoYXZpb3IgdGhlIGRyaXZlciBtdXN0IGJlIHJlbW92ZWQuIgorICAgIHJlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHJlbW92ZSAke3BmX2RyaXZlcn12ZiBub3c/IFtZL25dICIgcmVtb3ZlX2RyaXZlcgorICAgIGNhc2UgJHJlbW92ZV9kcml2ZXIgaW4KKyAgICAgIFtuTl0qICkgPiYyIGVjaG8gIk9LLiBSZW1lbWJlciB0byByZW1vdmUgdGhlIGRyaXZlciBwcmlvciBzdGFydCB1c2luZyB0aGUgY29tcHV0ZSBub2RlIGV4ZWN1dGluZzoiOworICAgICAgICAgICAgICA+JjIgZWNobyAibW9kcHJvYmUgLXIgJHtwZl9kcml2ZXJ9dmYiOworICAgICAgICAgICAgICA+JjIgZWNobyAibW9kcHJvYmUgLXIgJHtwZl9kcml2ZXJ9IjsKKyAgICAgICAgICAgICAgPiYyIGVjaG8gIm1vZHByb2JlICR7cGZfZHJpdmVyfSI7OworICAgICAgKiApID4mMiBlY2hvICJSZW1vdmluZyAke3BmX2RyaXZlcn12Zi4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAtciAke3BmX2RyaXZlcn12ZjsKKyAgICAgICAgICA+JjIgZWNobyAiUmVsb2FkaW5nICR7cGZfZHJpdmVyfS4uLiIKKyAgICAgICAgICBtb2Rwcm9iZSAtciAkcGZfZHJpdmVyOworICAgICAgICAgIG1vZHByb2JlICRwZl9kcml2ZXI7OworICAgIGVzYWMKKyAgZmkKK30KKworZnVuY3Rpb24gZ2V0X2hhc2hfdmFsdWUoKSB7ICAgZWNobyBgZXZhbCAgZWNobyAkXHtcYGVjaG8gJDFbJDJdXGBcfWA7IH0KKworZnVuY3Rpb24geG1scGF0aF9hcmdzKCkKK3sKKyAgbG9jYWwgZXhwcj0iJHsxLy9cLy8gfSIKKyAgbG9jYWwgcGF0aD0oKQorICBsb2NhbCBjaHVuayB0YWcgZGF0YQorICBsb2NhbCBleGl0X2NvZGU9MQorICBsb2NhbCBwcmludF9saW5lPTAKKyAgbG9jYWwgY2xvc2luZ190YWc9MAorCisgIHdoaWxlIElGUz0nJyByZWFkIC1yIC1kICc8JyBjaHVuazsgZG8KKyAgICBkYXRhPWFyZ3VtZW50cz0iIgorICAgIElGUz0nPicgcmVhZCAtciB0YWdfYXJnIGRhdGEgPDw8ICIkY2h1bmsiCisgICAgSUZTPScgJyByZWFkIC1yIHRhZyBhcmd1bWVudHMgPDw8ICIkdGFnX2FyZyIKKyAgICAjSWYgbGFzdCB0YWcgd2FzIHNpbmdsZSBsZXZlbCByZW1vdmUgaXQgZnJvbSBwYXRoCisgICAgaWYgW1sgJGNsb3NpbmdfdGFnIC1lcSAxIF1dIAorICAgIHRoZW4gCisgICAgICB1bnNldCBwYXRoWyR7I3BhdGhbQF19LTFdCisgICAgICBjbG9zaW5nX3RhZz0wCisgICAgZmkKKyAgICAjSW4gY2FzZSB0aGUgdGFnIGlzIGNsb3NlZCBpbiB0aGUgc2FtZSBsaW5lIG1hcmsgaXQKKyAgICBbWyAkYXJndW1lbnRzID0gPyonLycgXV0gJiYgY2xvc2luZ190YWc9MQorICAgIGFyZ3VtZW50cz0iJHthcmd1bWVudHMvL1wvL30iCisgICAgY2FzZSAiJHRhZyIgaW4KKyAgICAgICc/JyopIDs7CisgICAgICAnIS0tJyopIDs7CisgICAgICA/KicvJykgOzsKKyAgICAgICcvJz8qKSB1bnNldCBwYXRoWyR7I3BhdGhbQF19LTFdIDs7CisgICAgICA/KikgcGF0aCs9KCIkdGFnIik7OyAgICAgICAgCisgICAgZXNhYworICAgIAorICAgICNlY2hvICJcIiR7cGF0aFtAXX1cIiBcIiRleHByXCIgXCIkZGF0YVwiIFwiJGFyZ3VtZW50c1wiICRleGl0X2NvZGUgJHByaW50X2xpbmUiCisgICAgCisgICAgaWYgW1sgIiR7cGF0aFtAXX0iID09ICIkZXhwciIgXV0KKyAgICB0aGVuCisgICAgICAjSWYgdGhlcmUgaXMgZGF0YSBwcmludCBpdCBhbmQgYXBwZW5kIGFyZ3VtZW50cyBpZiBhbnkKKyAgICAgIGlmIFsgIiRkYXRhIiAhPSAiIiBdIAorICAgICAgdGhlbgorICAgICAgICBlY2hvICIkZGF0YSAkYXJndW1lbnRzIgorICAgICAgICAjcmV0dXJuIGNvZGUgMCBtZWFucyBkYXRhIHdhcyBmb3VuZAorICAgICAgICBleGl0X2NvZGU9MAorICAgICAgICBjb250aW51ZQorICAgICAgI2lmIHRoZXJlIGlzIG5vIGRhdGEgYnV0IHRoZXJlIGFyZSBhcmd1bWVudHMgcHJpbnQgYXJndW1lbnRzCisgICAgICBlbGlmIFsgIiRhcmd1bWVudHMiICE9ICIiIF0KKyAgICAgIHRoZW4KKyAgICAgICAgZWNobyAiJGFyZ3VtZW50cyIKKyAgICAgICAgI3JldHVybiBjb2RlIDIgbWVhbnMgbm8gZGF0YSBidXQgYXJndW1lbnRzIHdlcmUgZm91bmQKKyAgICAgICAgZXhpdF9jb2RlPTIKKyAgICAgICAgY29udGludWUKKyAgICAgICNvdGhlcndpc2Ugc3dpdGNoIGZsYWcgdG8gc3RhcnQvc3RvcCBlY2hvaW5nIGVhY2ggbGluZSB1bnRpbCB0aGUgdGFnIGlzIGNsb3NlZAorICAgICAgZWxpZiBbWyAkZXhpdF9jb2RlIC1lcSAxIF1dCisgICAgICB0aGVuCisgICAgICAgIHByaW50X2xpbmU9JCgoKHByaW50X2xpbmUrMSklMikpCisgICAgICAgICNyZXR1cm4gY29kZSAzIG1lYW5zIHRoYXQgdGhlIHdob2xlIHhtbCBzZWdtZW50IGlzIHJldHVybmVkCisgICAgICAgIGV4aXRfY29kZT0zCisgICAgICBmaQorICAgIGZpCisgICAgW1sgJHByaW50X2xpbmUgPT0gIjEiIF1dICYmIGVjaG8gIjwiJGNodW5rCisgIGRvbmUKKyAgcmV0dXJuICRleGl0X2NvZGUKK30KKworCisjY2hlY2sgcm9vdCBwcml2aWxlZ2VzIGFuZCBub24gYSByb290IHVzZXIgYmVoaW5kCisKK1tbICIkIyIgLWx0ICIyIiBdXSAmJiBlY2hvICJNaXNzaW5nIHBhcmFtZXRlcnMiICYmIHVzYWdlCitsb2FkX3ZmX2RyaXZlciBpeGdiZQorbG9hZF92Zl9kcml2ZXIgaTQwZQorCitIT1NUX05BTUU9YGNhdCAvZXRjL2hvc3RuYW1lYAorRkVBVFVSRVM9YGdyZXAgIl5mbGFncyIgIC9wcm9jL2NwdWluZm9gCitGRUFUVVJFU19MSVNUPSIiCitpZiBlY2hvICRGRUFUVVJFUyB8IGdyZXAgLXEgcGRwZTFnYiA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxscHMiOyAgZmkKK2lmIGVjaG8gJEZFQVRVUkVTIHwgZ3JlcCAtcSBkY2EgICAgIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LGRpb2MiOyBmaQoraWYgZWNobyAkRkVBVFVSRVMgfCBlZ3JlcCAtcSAiKHZteHxzdm0pIiA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxod3N2IjsgZmkKK2lmIGVjaG8gJEZFQVRVUkVTIHwgZWdyZXAgLXEgIihlcHR8bnB0KSIgOyB0aGVuIEZFQVRVUkVTX0xJU1Q9IiR7RkVBVFVSRVNfTElTVH0sdGxicHMiOyBmaQoraWYgZWNobyAkRkVBVFVSRVMgfCBncmVwIC1xIGh0ICAgICAgOyB0aGVuIEZFQVRVUkVTX0xJU1Q9IiR7RkVBVFVSRVNfTElTVH0saHQiOyAgIGZpCitpZiB1bmFtZSAtbSB8IGdyZXAgLXEgeDg2XzY0ICAgICAgICA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSw2NGIiOyAgZmkKK2lmIGNhdCAvdmFyL2xvZy9kbWVzZyB8IGdyZXAgLXEgLWUgSW50ZWwtSU9NTVUgICA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxpb21tdSI7ICBmaQorRkVBVFVSRVNfTElTVD0ke0ZFQVRVUkVTX0xJU1QjLH0KKworTlVNQVM9YGdhd2sgJ0JFR0lOe251bWFzPTA7fQorICAoJDE9PSJwaHlzaWNhbCIgJiYgJDI9PSJpZCIgKXsgaWYgKCQ0KzE+bnVtYXMpe251bWFzPSQ0KzF9IH07CisgIEVORHtwcmludGYoIiVkIixudW1hcyk7fScgL3Byb2MvY3B1aW5mb2AKKworQ1BVUz1gZ2F3ayAnKCQxPT0icHJvY2Vzc29yIil7cHJvPSQzO30KKyAgKCQxPT0icGh5c2ljYWwiICYmICQyPT0iaWQiKXsgcGh5PSQ0O30KKyAgKCQxPT0iY29yZSIgJiYgJDI9PSJpZCIpe3ByaW50ZiAiICVkLSVkLSVkIiwgcGh5LCQ0LHBybzt9JyAvcHJvYy9jcHVpbmZvYAorCitpZiBncmVwIC1xIGlzb2xjcHVzIC9wcm9jL2NtZGxpbmUKK3RoZW4KKyAgaXNvbGNwdXM9YGNhdCAvcHJvYy9jbWRsaW5lYAorICBpc29sY3B1cz0ke2lzb2xjcHVzIyMqaXNvbGNwdXM9fQorICBpc29sY3B1cz0ke2lzb2xjcHVzJSUgKn0KKyAgaXNvbGNwdXM9JHtpc29sY3B1cy8vLC8gfQorZWxzZQorICBpc29sY3B1cz0iIgorZmkKKworCisjb2J0YWluIGludGVyZmFjZXMgaW5mb3JtYXRpb24KK3Vuc2V0IGRwaWQKK3JlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgY29ubmVjdGl2aXR5IGluZm9ybWF0aW9uIChkYXRhcGF0aGlkL2RwaWQgb2YgdGhlIHN3aXRjaCBhbmQgc3dpdGNoIHBvcnQgaWQpPyBbWS9uXSAiIGNvbm5faW5mbworY2FzZSAkY29ubl9pbmZvIGluCisgICAgW05uXSogKSBwcm92X2Nvbm49ZmFsc2U7OworICAgICogKSBwcm92X2Nvbm49dHJ1ZTsKKyAgICAgICAgcmVhZCAtcCAiV2hhdCBpcyB0aGUgc3dpdGNoIGRhcGFwYXRoaWQvZHBkaT8gKDAxOjAyOjAzOjA0OjA1OjA2OjA3OjA4KSAiIGRwaWQ7CisgICAgICAgIFtbIC16ICRkcGlkIF1dICYmIGRwaWQ9IjAxOjAyOjAzOjA0OjA1OjA2OjA3OjA4IjsKKyAgICAgICAgUE9SVF9SQU5ET009JFJBTkRPTQorICAgICAgICBpZmFjZV9jb3VudGVyPTA7OworZXNhYyAgICAgICAKK09MRElGUz0kSUZTCitJRlM9JCdcbicKK3Vuc2V0IFBGX2xpc3QKK3Vuc2V0IFZGX2xpc3QKK2ZvciBkZXZpY2UgaW4gYHZpcnNoIG5vZGVkZXYtbGlzdCAtLWNhcCBuZXQgfCBncmVwIC12IG5ldF9sb18wMF8wMF8wMF8wMF8wMF8wMGAKK2RvCit2aXJzaCBub2RlZGV2LWR1bXB4bWwgJGRldmljZSA+IGRldmljZV94bWwKK25hbWU9YHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvaW50ZXJmYWNlIiA8IGRldmljZV94bWxgCituYW1lPSIke25hbWUvLyAvfSIKK2FkZHJlc3M9YHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvYWRkcmVzcyIgPCBkZXZpY2VfeG1sYAorYWRkcmVzcz0iJHthZGRyZXNzLy8gL30iCitwYXJlbnQ9YHhtbHBhdGhfYXJncyAiZGV2aWNlL3BhcmVudCIgPCBkZXZpY2VfeG1sYAorcGFyZW50PSIke3BhcmVudC8vIC99IgorI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVkIHZhcmlhYmxlcyAnc3BlZWQnIGFuZCAnc3RhdGUnCitldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2xpbmsiIDwgZGV2aWNlX3htbGAKK3ZpcnNoIG5vZGVkZXYtZHVtcHhtbCAkcGFyZW50ID4gcGFyZW50X3htbAorZHJpdmVyPWB4bWxwYXRoX2FyZ3MgImRldmljZS9kcml2ZXIvbmFtZSIgPCBwYXJlbnRfeG1sYAorWyAkPyAtZXEgMSBdICYmIGRyaXZlcj0iTi9BIgorZHJpdmVyPSIke2RyaXZlci8vIC99IgorCisjSWYgdGhlIGRldmljZSBpcyBub3QgdXAgdHJ5IHRvIGJyaW5nIGl0IHVwIGFuZCByZWxvYWQgc3RhdGUKK2lmIFtbICRzdGF0ZSA9PSAnZG93bicgXV0gJiYgKCBbWyAkZHJpdmVyID09ICJpeGdiZSIgXV0gfHwgW1sgJGRyaXZlciA9PSAiaTQwZSIgXV0gKQordGhlbgorICA+JjIgZWNobyAiJG5hbWUgaXMgZG93bi4gVHJ5aW5nIHRvIGJyaW5nIGl0IHVwIgorICBpZmNvbmZpZyAkbmFtZSB1cAorICBzbGVlcCAyCisgIHZpcnNoIG5vZGVkZXYtZHVtcHhtbCAkZGV2aWNlID4gZGV2aWNlX3htbAorICBldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2xpbmsiIDwgZGV2aWNlX3htbGAKK2ZpCisKK2lmIFtbICRzdGF0ZSA9PSAnZG93bicgXV0gICYmICggW1sgJGRyaXZlciA9PSAiaXhnYmUiIF1dIHx8IFtbICRkcml2ZXIgPT0gImk0MGUiIF1dICkKK3RoZW4KKyAgICA+JjIgZWNobyAiSW50ZXJmYWNlcyBtdXN0IGJlIGNvbm5lY3RlZCBhbmQgdXAgaW4gb3JkZXIgdG8gcHJvcGVybHkgZGV0ZWN0IHRoZSBzcGVlZC4gWW91IGNhbiBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gbWFudWFsbHkgb3Igc2tpcCB0aGUgaW50ZXJmYWNlIgorICAgIGtlZXBfYXNraW5nPXRydWUKKyAgICBza2lwX2ludGVyZmFjZT10cnVlCisgICAgdW5zZXQgc3BlZWQKKyAgICB3aGlsZSAka2VlcF9hc2tpbmc7IGRvCisgICAgICAgIHJlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHNraXAgaW50ZXJmYWNlICRuYW1lICgkYWRkcmVzcykgW3kvTl0gIiAtaSAibiIgc2tpcAorICAgICAgICBjYXNlICRza2lwIGluCisgICAgICAgICAgICBbWXldKiApIGtlZXBfYXNraW5nPWZhbHNlOzsKKyAgICAgICAgICAgICogKSBza2lwX2ludGVyZmFjZT1mYWxzZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0X3NwZWVkPSIxMDAwMCIKKyAgICAgICAgICAgICAgICB3aGlsZSAka2VlcF9hc2tpbmc7IGRvCisgICAgICAgICAgICAgICAgICAgcmVhZCAtcCAiV2hhdCBpcyB0aGUgc3BlZWQgb2YgdGhlIGludGVyZmFjZSBleHByZXNzZWQgaW4gTWJwcz8gKCRkZWZhdWx0X3NwZWVkKSAiIHNwZWVkOworICAgICAgICAgICAgICAgICAgIFtbIC16ICRzcGVlZCBdXSAmJiBzcGVlZD0kZGVmYXVsdF9zcGVlZAorICAgICAgICAgICAgICAgICAgIFtbICRzcGVlZCA9fiAnJ3wqWyEwLTldIF1dICYmIGVjaG8gIlRoZSBpbnB1dCBtdXN0IGJlIGFuIGludGVnZXIiICYmIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgIGtlZXBfYXNraW5nPWZhbHNlIDsKKyAgICAgICAgICAgICAgICBkb25lOzsKKyAgICAgICAgZXNhYworICAgIGRvbmUKKworICAgJHNraXBfaW50ZXJmYWNlICYmIGNvbnRpbnVlCitmaQorI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgJ25vZGUnIHZhcmlhYmxlCitldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L251bWEiIDwgcGFyZW50X3htbGAKKyN0aGUgZm9sbG93aW5nIGxpbmUgY3JlYXRlcyB0aGUgdmFyaWFibGUgJ3R5cGUnCisjaW4gY2FzZSB0aGUgaW50ZXJmYWNlIGlzIGEgUEYgdGhlIHZhbHVlIGlzICd2aXJ0X2Z1bmN0aW9ucycKKyNpbiBjYXNlIHRoZSBpbnRlcmZhY2UgaXMgYSBWRiB0aGUgdmFsdWUgaXMgJ3BoeXNfZnVuY3Rpb24nCit0eXBlPSJOL0EiCitldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2NhcGFiaWxpdHkiIDwgcGFyZW50X3htbGAKKyNvYnRhaW4gcGNpCisjdGhlIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgdGhlIHZhcmlhYmxlcyAnZG9tYWluJyAnYnVzJyAnc2xvdCcgYW5kICdmdW5jdGlvbicKK2V2YWwgYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvaW9tbXVHcm91cC9hZGRyZXNzIiA8IHBhcmVudF94bWxgCitwY2k9IiR7ZG9tYWluIyp4fToke2J1cyMqeH06JHtzbG90Iyp4fS4ke2Z1bmN0aW9uIyp4fSIKK3VuZGVyc2NvcmVkX3BjaT0iJHtwY2kvL1w6L199IgordW5kZXJzY29yZWRfcGNpPSJwY2lfJHt1bmRlcnNjb3JlZF9wY2kvL1wuL199IgorCitpZiAoIFtbICRkcml2ZXIgPT0gIml4Z2JlIiBdXSB8fCBbWyAkZHJpdmVyID09ICJpNDBlIiBdXSApIAordGhlbgorICB1bmRlcnNjb3JlZF9wY2k9InBmIiR1bmRlcnNjb3JlZF9wY2kKKyAgUEZfbGlzdFskeyNQRl9saXN0W0BdfV09JHVuZGVyc2NvcmVkX3BjaQorICBldmFsIGRlY2xhcmUgLUEgJHVuZGVyc2NvcmVkX3BjaQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm5hbWUiXT0kbmFtZQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm51bWEiXT0kbm9kZQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm1hYyJdPSRhZGRyZXNzCisgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsic3BlZWQiXT0kc3BlZWQKKyAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJwY2kiXT0kcGNpCisgICNyZXF1ZXN0IHN3aXRjaCBwb3J0IHRvIHRoZSB1c2VyIGlmIHRoaXMgaW5mb3JtYXRpb24gaXMgYmVpbmcgcHJvdmlkZWQgYW5kIGluY2x1ZGUgaXQKKyAgaWYgICRwcm92X2Nvbm4gCisgIHRoZW4KKyAgICB1bnNldCBzd2l0Y2hfcG9ydAorICAgIHJlYWQgLXAgIldoYXQgaXMgdGhlIHBvcnQgbmFtZSBpbiB0aGUgc3dpdGNoICRkcGlkIHdoZXJlIHBvcnQgJG5hbWUgKCRwY2kpIGlzIGNvbm5lY3RlZD8gKCR7bmFtZX0tJHtQT1JUX1JBTkRPTX0vJGlmYWNlX2NvdW50ZXIpICIgc3dpdGNoX3BvcnQKKyAgICBbWyAteiAkc3dpdGNoX3BvcnQgXV0gJiYgc3dpdGNoX3BvcnQ9IiR7bmFtZX0tJHtQT1JUX1JBTkRPTX0vJGlmYWNlX2NvdW50ZXIiCisgICAgaWZhY2VfY291bnRlcj0kKChpZmFjZV9jb3VudGVyKzEpKQorICAgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsiZHBpZCJdPSRkcGlkCisgICAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJzd2l0Y2hfcG9ydCJdPSRzd2l0Y2hfcG9ydAorICBmaQorCisgICNB8WFkbyBlbCBwY2kgZGUgY2FkYSB1bm8gZGUgbG9zIGhpam9zCisgIFNSSU9WX2NvdW50ZXI9MAorICBmb3IgY2hpbGQgaW4gYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvY2FwYWJpbGl0eS9hZGRyZXNzIiA8IHBhcmVudF94bWxgCisgIGRvIAorICAgIFNSSU9WX2NvdW50ZXI9JCgoU1JJT1ZfY291bnRlcisxKSkKKyAgICAjdGhlIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgdGhlIHZhcmlhYmxlcyAnZG9tYWluJyAnYnVzJyAnc2xvdCcgYW5kICdmdW5jdGlvbicKKyAgICBldmFsICRjaGlsZAorICAgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsiU1JJT1YiJFNSSU9WX2NvdW50ZXJdPSIke2RvbWFpbiMqeH1fJHtidXMjKnh9XyR7c2xvdCMqeH1fJHtmdW5jdGlvbiMqeH0iCisgIGRvbmUKKyAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJTUklPViJdPSRTUklPVl9jb3VudGVyCisgIAorI1NpIHNlIHRyYXRhIGRlIHVuIFNSSU9WICh0aWVuZSB1bmEgY2FwYWJpbGl0eSBjb24gdHlwZSAncGh5c19mdW5jdGlvbicpCitlbGlmIFtbICR0eXBlID09ICdwaHlzX2Z1bmN0aW9uJyBdXQordGhlbgorICB1bmRlcnNjb3JlZF9wY2k9InZmIiR1bmRlcnNjb3JlZF9wY2kKKyAgVkZfbGlzdFskeyNWRl9saXN0W0BdfV09JHVuZGVyc2NvcmVkX3BjaQorICBldmFsIGRlY2xhcmUgLUEgJHVuZGVyc2NvcmVkX3BjaQorICBldmFsICR1bmRlcnNjb3JlZF9wY2lbInNvdXJjZV9uYW1lIl09JG5hbWUKKyAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJtYWMiXT0kYWRkcmVzcworICBldmFsICR1bmRlcnNjb3JlZF9wY2lbInBjaSJdPSRwY2kKK2ZpCitybSAtZiBkZXZpY2VfeG1sIHBhcmVudF94bWwKK2RvbmUKK0lGUz0kT0xESUZTCisKK2VjaG8gIiNUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgJDAiCitlY2hvICIjZm9yIGFkZGluZyB0aGlzIGNvbXB1dGUgbm9kZSB0byBvcGVudmltIgorZWNobyAiI2NvcHkgdGhpcyBmaWxlIHRvIG9wZW52aW0gY29udHJvbGxlciBhbmQgcnVuIgorZWNobyAiI29wZW52aW0gaG9zdC1hZGQgPHRoaXM+IgorZWNobworZWNobyAiaG9zdDoiCitlY2hvICIgIG5hbWU6ICAgICRIT1NUX05BTUUiCitlY2hvICIgIHVzZXI6ICAgICQxIgorZWNobyAiICBpcF9uYW1lOiAkMiIKK2VjaG8gImhvc3QtZGF0YToiCitlY2hvICIgIG5hbWU6ICAgICAgICAkSE9TVF9OQU1FIgorZWNobyAiICB1c2VyOiAgICAgICAgJDEiCitlY2hvICIgIGlwX25hbWU6ICAgICAkMiIKK2VjaG8gIiAgcmFua2luZzogICAgIDEwMCIKK2VjaG8gIiAgZGVzY3JpcHRpb246ICRIT1NUX05BTUUiCitlY2hvICIgIGZlYXR1cmVzOiAgICAkRkVBVFVSRVNfTElTVCIKK2VjaG8gIiAgbnVtYXM6IgorCitudW1hPTAKK3doaWxlIFtbICRudW1hIC1sdCAkTlVNQVMgXV0KK2RvCisgIGVjaG8gIiAgLSBudW1hX3NvY2tldDogICRudW1hIgorI01FTU9SWQorICBpZiBbIC1mIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJHtudW1hfS9odWdlcGFnZXMvaHVnZXBhZ2VzLTEwNDg1NzZrQi9ucl9odWdlcGFnZXMgXQorICB0aGVuCisgICAgZWNobyAiICAgIGh1Z2VwYWdlczogIiBgY2F0IC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlJHtudW1hfS9odWdlcGFnZXMvaHVnZXBhZ2VzLTEwNDg1NzZrQi9ucl9odWdlcGFnZXNgCisgIGVsc2UKKyAgICAjVE9ETyBodWdlcGFnZXMgb2YgMjA0OGtCIHNpemUKKyAgICBlY2hvICIgICAgaHVnZXBhZ2VzOiAgMCIKKyAgZmkKKyAgbWVtb3J5PWBoZWFkIC1uMSAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZSR7bnVtYX0vbWVtaW5mbyAgfCBnYXdrICcoJDU9PSJrQiIpe3ByaW50ICQ0fSdgCisgIG1lbW9yeT0kKChtZW1vcnkrMTA0ODU3Ni0xKSkgICAjbWVtb3J5IG11c3QgYmUgY2VpbGVkCisgIG1lbW9yeT0kKChtZW1vcnkvMTA0ODU3NikpICAgI2Zyb20gYGtCIHRvIEdCCisgIGVjaG8gIiAgICBtZW1vcnk6ICAgICRtZW1vcnkiCisKKyNDT1JFUworICBlY2hvICIgICAgY29yZXM6IgorICBGSVJTVD0iLSIgI2ZpcnN0IGl0ZW0gaW4gYSBsaXN0IHN0YXJ0IHdpdGggIi0iIGluIHlhbWwgZmlsZXMsIHRoZW4gaXQgd2lsbCBzZXQgdG8gIiAiCisgIGZvciBjcHUgaW4gJENQVVMKKyAgZG8KKyAgICBQSFlTSUNBTD1gZWNobyAkY3B1IHwgY3V0IC1mIDEgLWQiLSJgCisgICAgQ09SRT1gZWNobyAkY3B1IHwgY3V0IC1mIDIgLWQiLSJgCisgICAgVEhSRUFEPWBlY2hvICRjcHUgfCBjdXQgLWYgMyAtZCItImAKKyAgICBbWyAkUEhZU0lDQUwgIT0gJG51bWEgXV0gJiYgY29udGludWUgICAjc2tpcCBub24gcGh5c2ljYWwKKyAgICBlY2hvICIgICAgLSBjb3JlX2lkOiAgICRDT1JFIgorICAgIGVjaG8gIiAgICAgIHRocmVhZF9pZDogJFRIUkVBRCIKKyAgICAjY2hlY2sgaWYgZWxpZ2libGUKKyAgICBjcHVfaXNvbGF0ZWQ9Im5vIgorICAgIGZvciBpc29sY3B1IGluICRpc29sY3B1cworICAgIGRvCisgICAgICBpc29sY3B1X3N0YXJ0PWBlY2hvICRpc29sY3B1IHwgY3V0IC1mIDEgLWQiLSJgCisgICAgICBpc29sY3B1X2VuZD1gZWNobyAkaXNvbGNwdSB8IGN1dCAtZiAyIC1kIi0iYAorICAgICAgaWYgWyAiJFRIUkVBRCIgLWdlICIkaXNvbGNwdV9zdGFydCIgLWEgIiRUSFJFQUQiIC1sZSAiJGlzb2xjcHVfZW5kIiBdCisgICAgICB0aGVuCisgICAgICAgIGNwdV9pc29sYXRlZD0ieWVzIgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgW1sgJGNwdV9pc29sYXRlZCA9PSAibm8iIF1dICYmICAgZWNobyAiICAgICAgc3RhdHVzOiAgICBub3RlbGlnaWJsZSIKKyAgICBGSVJTVD0iICIKKyAgZG9uZQorIAorICAjTklDIElOVEVSRkFDRVMKKyAgaW50ZXJmYWNlc19uYj0wCisgIGZvciAoKGk9MDsgaTwkeyNQRl9saXN0W0BdfTtpKyspKQorICBkbworICAgIHVuZGVyc2NvcmVkX3BjaT0ke1BGX2xpc3RbJGldfQorICAgIHBuYW1lPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAibmFtZSIpCisgICAgcG51bWE9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJudW1hIikKKyAgICBbWyAkcG51bWEgIT0gJG51bWEgXV0gJiYgY29udGludWUgCisgICAgcG1hYz0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIm1hYyIpCisgICAgcHBjaT0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgInBjaSIpCisgICAgcHNwZWVkPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAic3BlZWQiKQorICAgIHBTUklPVj0kKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIlNSSU9WIikKKyAgICBbWyAkaW50ZXJmYWNlc19uYiAtZXEgMCBdXSAmJiBlY2hvICIgICAgaW50ZXJmYWNlczoiCisgICAgaW50ZXJmYWNlc19uYj0kKChpbnRlcmZhY2VzX25iKzEpKQorICAgIHNyaW92X25iPTAKKyAgICBlY2hvICIgICAgLSBzb3VyY2VfbmFtZTogJHBuYW1lIgorICAgIGVjaG8gIiAgICAgIE1icHM6ICRwc3BlZWQiCisgICAgZWNobyAiICAgICAgcGNpOiBcIiRwcGNpXCIiCisgICAgZWNobyAiICAgICAgbWFjOiBcIiRwbWFjXCIiCisgICAgaWYgJHByb3ZfY29ubiAKKyAgICAgIHRoZW4KKyAgICAgICAgcGRwaWQ9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJkcGlkIikKKyAgICAgICAgcHN3aXRjaF9wb3J0PSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAic3dpdGNoX3BvcnQiKQorICAgICAgICBlY2hvICIgICAgICBzd2l0Y2hfZHBpZDogJHBkcGlkIgorICAgICAgICBlY2hvICIgICAgICBzd2l0Y2hfcG9ydDogJHBzd2l0Y2hfcG9ydCIKKyAgICBmaQorICAgIGZvciAoKGo9MTtqPD0kcFNSSU9WO2orKykpCisgICAgZG8KKyAgICAgIGNoaWxkU1JJT1Y9InZmcGNpXyIkKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIlNSSU9WIiRqKQorICAgICAgcG5hbWU9JChnZXRfaGFzaF92YWx1ZSAkY2hpbGRTUklPViAic291cmNlX25hbWUiKQorICAgICAgaW5kZXg9JHtwbmFtZSMjKl99CisgICAgICBwbWFjPSQoZ2V0X2hhc2hfdmFsdWUgJGNoaWxkU1JJT1YgIm1hYyIpCisgICAgICBwcGNpPSQoZ2V0X2hhc2hfdmFsdWUgJGNoaWxkU1JJT1YgInBjaSIpCisgICAgICBbWyAkc3Jpb3ZfbmIgLWVxIDAgXV0gJiYgZWNobyAiICAgICAgc3Jpb3ZzOiIKKyAgICAgIHNyaW92X25iPSQoKHNyaW92X25iKzEpKQorICAgICAgZWNobyAiICAgICAgLSBtYWM6IFwiJHBtYWNcIiIKKyAgICAgIGVjaG8gIiAgICAgICAgcGNpOiBcIiRwcGNpXCIiCisgICAgICBlY2hvICIgICAgICAgIHNvdXJjZV9uYW1lOiAkaW5kZXgiCisgICAgZG9uZQorICBkb25lCisKKyAgbnVtYT0kKChudW1hKzEpKQorZG9uZQorcmVtb3ZlX3ZmX2RyaXZlciBpeGdiZQorcmVtb3ZlX3ZmX2RyaXZlciBpNDBlCisjQnJpbmcgdXAgYWxsIGludGVyZmFjZXMKK2ZvciAoKGk9MDsgaTwkeyNQRl9saXN0W0BdfTtpKyspKQorZG8KKyAgdW5kZXJzY29yZWRfcGNpPSR7UEZfbGlzdFskaV19CisgIHBuYW1lPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAibmFtZSIpCisgIGlmY29uZmlnICRwbmFtZSB1cAorZG9uZQo=