ZGlmZiAtLWdpdCBhLy5naXRhdHRyaWJ1dGVzIGIvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmNGNmOAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEsMTYxIEBACisqIHRleHQ9YXV0byAhZW9sCisKKyouYyB0ZXh0ICFlb2wKKyouY2MgdGV4dCAhZW9sCisqLmNsYXNzcGF0aCB0ZXh0ICFlb2wKKyouY3BwIHRleHQgIWVvbAorKi5jc3MgdGV4dCAhZW9sCisqLmRzcCB0ZXh0ICFlb2wKKyouZHN3IHRleHQgIWVvbAorKi5maWx0ZXJzIHRleHQgIWVvbAorKi5oIHRleHQgIWVvbAorKi5odG0gdGV4dCAhZW9sCisqLmh0bWwgdGV4dCAhZW9sCisqLmluIHRleHQgIWVvbAorKi5qYXZhIHRleHQgIWVvbAorKi5sYXVuY2ggdGV4dCAhZW9sCisqLm1hayB0ZXh0ICFlb2wKKyoubWQgdGV4dCAhZW9sCisqLk1GIHRleHQgIWVvbAorKi5tayB0ZXh0ICFlb2wKKyoucGwgdGV4dCAhZW9sCisqLnBtIHRleHQgIWVvbAorKi5wcm9qZWN0IHRleHQgIWVvbAorKi5wcm9wZXJ0aWVzIHRleHQgIWVvbAorKi5weSB0ZXh0ICFlb2wKKyoucmMgdGV4dCAhZW9sCisqLnNoIHRleHQgZW9sPWxmCisqLnNsbiB0ZXh0ICFlb2wKKyouc3R1YiB0ZXh0ICFlb2wKKyoudHh0IHRleHQgIWVvbAorKi51Y20gdGV4dCAhZW9sCisqLnZjcHJvaiB0ZXh0ICFlb2wKKyoudmN4cHJvaiB0ZXh0ICFlb2wKKyoueG1sIHRleHQgIWVvbAorKi54c2wgdGV4dCAhZW9sCisqLnhzbHQgdGV4dCAhZW9sCitNYWtlZmlsZSB0ZXh0ICFlb2wKK2NvbmZpZ3VyZSB0ZXh0ICFlb2wKK0xJQ0VOU0UgdGV4dCAhZW9sCitSRUFETUUgdGV4dCAhZW9sCisKKyouYmluIC10ZXh0CisqLmJyayAtdGV4dAorKi5jbnYgLXRleHQKKyouaWN1IC10ZXh0CisqLnJlcyAtdGV4dAorKi5ucm0gLXRleHQKKyouc3BwIC10ZXh0CisqLnRyaTIgLXRleHQKKworY3VycmVuY3kvLmNsYXNzcGF0aCAtdGV4dAorY3VycmVuY3kvLnByb2plY3QgLXRleHQKK2N1cnJlbmN5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyAtdGV4dAorY3VycmVuY3kvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIC10ZXh0CitjdXJyZW5jeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIC10ZXh0CittdWx0aS9jL01ha2VmaWxlLWMuaW5jIC10ZXh0CittdWx0aS9jL3BhdGNoLzNfMCAtdGV4dAorbXVsdGkvYy9wYXRjaC8zXzIgLXRleHQKK211bHRpL2MvcGF0Y2gvM180XzEgLXRleHQKK211bHRpL2NvbW1vbi9NYWtlZmlsZS1tdWx0aS5pbmMgLXRleHQKK211bHRpL2ovTWFrZWZpbGUtai5pbmMgLXRleHQKK211bHRpL3Byb2ovcHJvdmlkZXIvTWFrZWZpbGUubG9jYWwtc2FtcGxlIC10ZXh0CittdWx0aS9wcm9qL3Byb3ZpZGVyL2ljdS1jb25maWcuc2VkIC10ZXh0CittdWx0aS9wcm9qL3Byb3ZpZGVyL3JlYWRtZS50eHQgLXRleHQKK3JlbGVhc2UvYy9ib21maXgucHkgLXRleHQKK3JlbGVhc2UvamF2YS8uY2xhc3NwYXRoIC10ZXh0CityZWxlYXNlL2phdmEvLnByb2plY3QgLXRleHQKK3JlbGVhc2UvamF2YS9NYWtlZmlsZSAtdGV4dAorcmVsZWFzZS9qYXZhL2ljdTRjLmNzcyAtdGV4dAorcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ0Z1bmNfeG1sLnhzbHQgLXRleHQKK3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENwcEZ1bmNfeG1sLnhzbHQgLXRleHQKK3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VucmVwb3J0X3htbC54c2x0IC10ZXh0CitzY3JpcHRzL2ljdXJ1biAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvX19pbml0X18ucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL2RjdXQucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL2h0ZG9jcy9jc3MvaWN1eHRuLmNzcyAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvaHRkb2NzL2pzL3Jldmlldy5qcyAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvcmV2aWV3LnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90ZW1wbGF0ZXMvbm90aGluZy5odG1sIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90ZW1wbGF0ZXMvcmV2aWV3Lmh0bWwgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RpY2tldG1nci5weSAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGt0bGlzdC5weSAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9saWNlbnNlLmh0bWwgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvcmVhZG1lLnR4dCAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9zZXR1cC5jZmcgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9kY3V0LnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9odGRvY3MvY3NzL2ljdXh0bi5jc3MgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL2h0ZG9jcy9qcy9yZXZpZXcuanMgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3Jldmlldy5weSAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL25vdGhpbmcuaHRtbCAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvbGljZW5zZS5odG1sIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL3JlYWRtZS50eHQgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvc2V0dXAuY2ZnIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLnB5IC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2Fycm93X2J1bGxldC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9pYm1fbG9nb19zbWFsbF93aGl0ZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9SQlJlcG9ydGVyLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2ZpbGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfZ3JvdXAuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfcmVzb3VyY2UuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfdHJhbnNsYXRpb24uZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfdW50cmFuc2xhdGVkLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2NyZWF0ZV9ncm91cC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9ncm91cC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9yZXNvdXJjZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9zY3JlZW4uZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfd2l0aF9wcmVmZXJlbmNlcy5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sYWZfbWV0YWwuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21vdGlmLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl93aW5kb3dzLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xvb2t1cF9yZXNvdXJjZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tYWluX3BhZ2UuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZV9leHBvcnQuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlX2ltcG9ydC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2hlbHAuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9vcHRpb25zLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfcG9wdXBfdHJlZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYmFzZWNsYXNzLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL25ld19idW5kbGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvcHJlZmVyZW5jZXNfZGlhbG9nLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2J1bmRsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19maWxlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc2VhcmNoLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfYnVuZGxlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfZmlsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3RyZWVfYmFzaWMuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2J1bmRsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZGlhbG9nMC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZmlsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zcGFjZXIuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fYnVuZGxlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2NvdW50cnkuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fZmlsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9ncm91cC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9pdGVtLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2xhbmd1YWdlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX3Byb2plY3QuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fdmFyaWFudC5naWYgLXRleHQKKworIyBUaGUgZm9sbG93aW5nIGZpbGUgdHlwZXMgYXJlIHN0b3JlZCBpbiBHaXQtTEZTLgorKi5qYXIgZmlsdGVyPWxmcyBkaWZmPWxmcyBtZXJnZT1sZnMgLXRleHQKKyouZGF0IGZpbHRlcj1sZnMgZGlmZj1sZnMgbWVyZ2U9bGZzIC10ZXh0CisqLnppcCBmaWx0ZXI9bGZzIGRpZmY9bGZzIG1lcmdlPWxmcyAtdGV4dAorKi5neiBmaWx0ZXI9bGZzIGRpZmY9bGZzIG1lcmdlPWxmcyAtdGV4dAorKi5iejIgZmlsdGVyPWxmcyBkaWZmPWxmcyBtZXJnZT1sZnMgLXRleHQKKyouZ2lmIGZpbHRlcj1sZnMgZGlmZj1sZnMgbWVyZ2U9bGZzIC10ZXh0CisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmIyNTEKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNDkgQEAKK211bHRpL2MvTWFrZWZpbGUubG9jYWwKK211bHRpL3BhY2thZ2VzLyouamFyCittdWx0aS9wYWNrYWdlcy8qLnRnegorbXVsdGkvcHJvai9jaGVsbG8vb3V0CittdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlLmxvY2FsCittdWx0aS9wcm9qL3Byb3ZpZGVyL291dAorbXVsdGkvdG1wCityZWxlYXNlL2MvdWNvbmZpZ3Rlc3QKK3JlbGVhc2UvYy91Y29uZmlndGVzdC5sb2NhbAorcmVsZWFzZS9qYXZhL0FQSUNoYW5nZVJlcG9ydCoKK3JlbGVhc2UvamF2YS9NYWtlZmlsZS5sb2NhbAorcmVsZWFzZS9qYXZhL2NsYXNzZXMKK3JlbGVhc2UvamF2YS9saWIKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvKi5lZ2ctaW5mbwordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9idWlsZAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvKi5weWMKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvKi5lZ2ctaW5mbwordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9idWlsZAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvKi5weWMKK3VuaWNvZGUvYy9nZW5wcm9wcy8qLmQKK3VuaWNvZGUvYy9nZW5wcm9wcy8qLm5jYgordW5pY29kZS9jL2dlbnByb3BzLyoubwordW5pY29kZS9jL2dlbnByb3BzLyoub3B0Cit1bmljb2RlL2MvZ2VucHJvcHMvKi5wZGIKK3VuaWNvZGUvYy9nZW5wcm9wcy8qLnBsZwordW5pY29kZS9jL2dlbnByb3BzL0RlYnVnCit1bmljb2RlL2MvZ2VucHJvcHMvTWFrZWZpbGUKK3VuaWNvZGUvYy9nZW5wcm9wcy9SZWxlYXNlCit1bmljb2RlL2MvZ2VucHJvcHMvZGVidWcKK3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcwordW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLlswLTldCit1bmljb2RlL2MvZ2VucHJvcHMvZ2VucHJvcHMudmNwcm9qLiouKi51c2VyCit1bmljb2RlL2MvZ2VucHJvcHMvcmVsZWFzZQordW5pY29kZS9jL2dlbnByb3BzL3g2NAordW5pY29kZS9jL2dlbnByb3BzL3g4NgordW5pY29kZS9jL2dlbnVjYS8qLmQKK3VuaWNvZGUvYy9nZW51Y2EvKi5vCit1bmljb2RlL2MvZ2VudWNhLyoucGRiCit1bmljb2RlL2MvZ2VudWNhL0RlYnVnCit1bmljb2RlL2MvZ2VudWNhL01ha2VmaWxlCit1bmljb2RlL2MvZ2VudWNhL1JlbGVhc2UKK3VuaWNvZGUvYy9nZW51Y2EvZGVidWcKK3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhCit1bmljb2RlL2MvZ2VudWNhL2dlbnVjYS44Cit1bmljb2RlL2MvZ2VudWNhL2dlbnVjYS52Y3Byb2ouKi4qLnVzZXIKK3VuaWNvZGUvYy9nZW51Y2EvcmVsZWFzZQordW5pY29kZS9jL2dlbnVjYS94NjQKK3VuaWNvZGUvYy9nZW51Y2EveDg2Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vbGliCmRpZmYgLS1naXQgYS9jb2xwcm9iZS9NYWtlZmlsZS5pbiBiL2NvbHByb2JlL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmVmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDgxIEBACisjIyBNYWtlZmlsZS5pbiBmb3IgSUNVIC0gZXh0cmEvY29scHJvYmUKKyMjIENvcHlyaWdodCAoYykgMjAwMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyMjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIyMgU291cmNlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKwordG9wX2J1aWxkZGlyID0gLi4vLi4KKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaWN1ZGVmcy5taworCisjIyBCdWlsZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N1YmRpciA9IGV4dHJhL2NvbHByb2JlCisKKyMjIEV4dHJhIGZpbGVzIHRvIHJlbW92ZSBmb3IgJ21ha2UgY2xlYW4nCitDTEVBTkZJTEVTID0gKn4gJChERVBTKQorCisjIyBUYXJnZXQgaW5mb3JtYXRpb24KK1RBUkdFVCA9IGNvbHByb2JlIAorTE9OR05BTUUgPSBsb25nbmFtZQorCitDUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvY29tbW9uIC1JJCh0b3Bfc3JjZGlyKS9pMThuIC1JJCh0b3Bfc3JjZGlyKS90b29scy90b29sdXRpbCAtSSQodG9wX3NyY2RpcikvaW8KK0xJQlMgPSAkKExJQklDVUkxOE4pICQoTElCSUNVVUMpICQoTElCVVNURElPKSAkKExJQklDVVRPT0xVVElMKSAkKERFRkFVTFRfTElCUykgJChMSUJfTSkKKworT0JKRUNUUyA9IGNvbHByb2JlTmV3Lm8gbGluZS5vIHNvcnRlZGxpbmVzLm8gc3RyZW5ndGhwcm9iZS5vIHVwcmludGVyLm8gCitMT05HTkFNRV9PQkogPSBsb25nbmFtZS5vCisKK0RFUFMgPSAkKE9CSkVDVFM6Lm89LmQpCitMT05HTkFNRV9ERVBTID0gJChMT05HTkFNRV9PQko6Lm89LmQpCisKKyMjIExpc3Qgb2YgcGhvbnkgdGFyZ2V0cworLlBIT05ZIDogYWxsIGFsbC1sb2NhbCBpbnN0YWxsIGluc3RhbGwtbG9jYWwgY2xlYW4gY2xlYW4tbG9jYWwJXAorZGlzdGNsZWFuIGRpc3RjbGVhbi1sb2NhbCBkaXN0IGRpc3QtbG9jYWwgY2hlY2sgY2hlY2stbG9jYWwKKworIyMgQ2xlYXIgc3VmZml4IGxpc3QKKy5TVUZGSVhFUyA6CisKKyMjIExpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cworYWxsOiBhbGwtbG9jYWwKK2luc3RhbGw6IGluc3RhbGwtbG9jYWwKK2NsZWFuOiBjbGVhbi1sb2NhbAorZGlzdGNsZWFuIDogZGlzdGNsZWFuLWxvY2FsCitkaXN0OiBkaXN0LWxvY2FsCitjaGVjazogYWxsIGNoZWNrLWxvY2FsCisKK2FsbC1sb2NhbDogJChUQVJHRVQpCisKK2luc3RhbGwtbG9jYWw6CisKK2Rpc3QtbG9jYWw6CisKK2NsZWFuLWxvY2FsOgorCXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8ICQoUk1WKSAkKENMRUFORklMRVMpCisJJChSTVYpICQoT0JKRUNUUykgJChUQVJHRVQpCisKK2Rpc3RjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwKKwkkKFJNVikgTWFrZWZpbGUKKworY2hlY2stbG9jYWw6IGFsbC1sb2NhbAorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKFRBUkdFVCkgOiAkKE9CSkVDVFMpCisJJChMSU5LLmNjKSAtbyAkQCAkXiAkKExJQlMpCisKKyQoTE9OR05BTUUpIDogJChMT05HTkFNRV9PQkopCisJJChMSU5LLmNjKSAtbyAkQCAkXiAkKExJQlMpCisKK2ludm9rZToKKwlJQ1VfREFUQT0kJHtJQ1VfREFUQTotJCh0b3BfYnVpbGRkaXIpL2RhdGEvfSBUWj1QU1Q4UERUICQoSU5WT0tFKSAkKElOVk9DQVRJT04pCisKK2lmZXEgKCwkKE1BS0VDTURHT0FMUykpCistaW5jbHVkZSAkKERFUFMpCitlbHNlCitpZm5lcSAoJChwYXRzdWJzdCAlY2xlYW4sLCQoTUFLRUNNREdPQUxTKSksKQorLWluY2x1ZGUgJChERVBTKQorZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9jb2xwcm9iZS9jb2xwcm9iZS5jcHAgYi9jb2xwcm9iZS9jb2xwcm9iZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NTFiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2NvbHByb2JlLmNwcApAQCAtMCwwICsxLDE3MzAgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgY29scHJvYmUuY3BwCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDMvMTgvMjAwMyAgd2VpdiAgICAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjb2wuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjb2xlaXRyLmgiCisjaW5jbHVkZSAidW5pY29kZS91cmVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzZXRpdGVyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2hhci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNjcmlwdC5oIgorI2luY2x1ZGUgInVwcm9wcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJ1Y29sX2ltcC5oIgorCisjaW5jbHVkZSAidW5pY29kZS91c3RkaW8uaCIKKyNpbmNsdWRlICJ1bmljb2RlL3V0cmFucy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisvLworLy8gIFN0dWJzIGZvciBXaW5kb3dzIEFQSSBmdW5jdGlvbnMgd2hlbiBidWlsZGluZyBvbiBVTklYZXMuCisvLwordHlwZWRlZiBpbnQgRFdPUkQ7CitpbmxpbmUgaW50IENvbXBhcmVTdHJpbmdXKERXT1JELCBEV09SRCwgVUNoYXIgKiwgaW50LCBVQ2hhciAqLCBpbnQpIHtyZXR1cm4gMDt9OworI2luY2x1ZGUgPHN5cy90aW1lLmg+Cit1bnNpZ25lZCBsb25nIHRpbWVHZXRUaW1lKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgZ2V0dGltZW9mZGF5KCZ0LCAwKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbCA9IHQudHZfc2VjICogMTAwMDsgIC8vIExldCBpdCBvdmVyZmxvdy4gIFdobyBjYXJlcy4KKyAgICB2YWwgKz0gdC50dl91c2VjIC8gMTAwMDsKKyAgICByZXR1cm4gdmFsOworfTsKK2lubGluZSBpbnQgTENNYXBTdHJpbmdXKERXT1JELCBEV09SRCwgVUNoYXIgKiwgaW50LCBVQ2hhciAqLCBpbnQpIHtyZXR1cm4gMDt9OworY29uc3QgaW50IExDTUFQX1NPUlRLRVkgPSAwOworI2RlZmluZSBNQUtFTENJRChhLGIpIDAKK2NvbnN0IGludCBTT1JUX0RFRkFVTFQgPSAwOworI2VuZGlmCisKKyNpbmNsdWRlICJsaW5lLmgiCisKK3N0YXRpYyBVQm9vbCBnVmVyYm9zZSA9IEZBTFNFOworc3RhdGljIFVCb29sIGdEZWJ1ZyA9IEZBTFNFOworc3RhdGljIFVCb29sIGdRdWlldCA9IEZBTFNFOworc3RhdGljIFVCb29sIGdFeGVtcGxhciA9IEZBTFNFOworCitEV09SRCAgICAgICAgICBnV2luTENJRDsKK2ludCAgICAgICAgICAgIGdDb3VudDsKK0xpbmUgICAgICAgICAgKipnSUNVTGluZXM7CitVQ29sbGF0b3IgICAgICpnQ29sOworVUNvbGxhdG9yICAgICAqZ1VDQTsKK0xpbmUgICAgICAgICAgc291cmNlOworTGluZSAgICAgICAgICB0YXJnZXQ7CitMaW5lICAgICAgICAgICpnU291cmNlID0gJnNvdXJjZTsKK0xpbmUgICAgICAgICAgKmdUYXJnZXQgPSAmdGFyZ2V0OworSGFzaHRhYmxlICAgICBnRWxlbWVudHMoRkFMU0UpOworSGFzaHRhYmxlICAgICBnRXhwYW5zaW9ucyhGQUxTRSk7CitDb21wYXJlRm4gZ0NvbXBhcmVyOworCitjb25zdCBVQ2hhciBzZXBhcmF0b3JDaGFyID0gMHgwMDMwOworCitVRklMRSAqb3V0ID0gTlVMTDsKK1VGSUxFICplcnIgPSBOVUxMOworVUZJTEUgKmxvZyA9IE5VTEw7IAorCitjb25zdCBjaGFyICpwcm9nTmFtZSA9ICJjb2xwcm9iZSI7CisKK2NvbnN0IGNoYXIgKmdMb2NhbGUgPSBOVUxMOworLy9jaGFyIHBsYXRmb3JtWzI1Nl07CitpbnQzMl90IHBsYXRmb3JtSW5kZXggPSAtMTsKK2ludDMyX3QgZ1BsYXRmb3JtTm8gPSAwOworaW50MzJfdCBnUGxhdGZvcm1JbmRleGVzWzEwXTsKK2ludDMyX3QgZ0xvY2FsZU5vID0gMDsKK2NvbnN0IGNoYXIqIGdMb2NhbGVzWzEwMF07CitVQm9vbCBnUnVsZXNTdGRpbiA9IEZBTFNFOworCitlbnVtIHsKKyAgSEVMUDEsCisgICAgSEVMUDIsCisgICAgVkVSQk9TRSwKKyAgICBRVUlFVCwKKyAgICBWRVJTSU9OLAorICAgIElDVURBVEFESVIsCisgICAgQ09QWVJJR0hULAorICAgIExPQ0FMRSwKKyAgICBQTEFURk9STSwKKyAgICBERUJVRywgCisgICAgRVhFTVBMQVIsCisgICAgUlVMRVNTVERJTgorfTsKKworVU9wdGlvbiBvcHRpb25zW109eworICAvKjAqLyBVT1BUSU9OX0hFTFBfSCwKKyAgLyoxKi8gVU9QVElPTl9IRUxQX1FVRVNUSU9OX01BUkssCisgIC8qMiovIFVPUFRJT05fVkVSQk9TRSwKKyAgLyozKi8gVU9QVElPTl9RVUlFVCwKKyAgLyo0Ki8gVU9QVElPTl9WRVJTSU9OLAorICAvKjUqLyBVT1BUSU9OX0lDVURBVEFESVIsCisgIC8qNiovIFVPUFRJT05fQ09QWVJJR0hULAorICAvKjcqLyBVT1BUSU9OX0RFRigibG9jYWxlIiwgJ2wnLCBVT1BUX1JFUVVJUkVTX0FSRyksCisgIC8qOCovIFVPUFRJT05fREVGKCJwbGF0Zm9ybSIsICdwJywgVU9QVF9SRVFVSVJFU19BUkcpLAorICAvKjkqLyBVT1BUSU9OX0RFRigiZGVidWciLCAnRCcsIFVPUFRfTk9fQVJHKSwKKyAgLyoxMCovIFVPUFRJT05fREVGKCJleGVtcGxhciIsICdFJywgVU9QVF9OT19BUkcpLAorICAvKjExKi8gVU9QVElPTl9ERUYoInJ1bGVzc3RkaW4iLCAnUicsIFVPUFRfTk9fQVJHKQorfTsKKworaW50IFdpbnN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CisgICAgZ0NvdW50Kys7CisgICAgaW50IHQ7CisgICAgdCA9IENvbXBhcmVTdHJpbmdXKGdXaW5MQ0lELCAwLCAKKyAgICAgICgqKExpbmUgKiopYSktPm5hbWUsICgqKExpbmUgKiopYSktPmxlbiwgCisgICAgICAoKihMaW5lICoqKWIpLT5uYW1lLCAoKihMaW5lICoqKWIpLT5sZW4pOworICAgIHJldHVybiB0LTI7Cit9CisKK2ludCBJQ1VzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICAgIGdDb3VudCsrOworICAgIFVDb2xsYXRpb25SZXN1bHQgdDsKKyAgICB0ID0gdWNvbF9zdHJjb2xsKGdDb2wsIAorICAgICAgKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCAgCisgICAgICAoKihMaW5lICoqKWIpLT5uYW1lLCAoKihMaW5lICoqKWIpLT5sZW4pOworICAgIGlmICh0ID09IFVDT0xfTEVTUykgcmV0dXJuIC0xOworICAgIGlmICh0ID09IFVDT0xfR1JFQVRFUikgcmV0dXJuICsxOworICAgIHJldHVybiAwOworfQorCitzdHJ1Y3QgeworICBjb25zdCBjaGFyKiBuYW1lOworICBDb21wYXJlRm4gY29tcGFyZXI7Cit9IHBsYXRmb3Jtc1tdID0geworICB7ICJpY3UiLCBJQ1VzdHJjbXAgfSwKKyAgeyAid2luIiwgV2luc3RyY21wfQorfTsKKworCit2b2lkIGRlbGV0ZUxpbmVFbGVtZW50KHZvaWQgKmxpbmUpIHsKKyAgZGVsZXRlKChMaW5lICopbGluZSk7Cit9CisKK3ZvaWQgc3RyaW5nVG9Mb3dlcihjaGFyICpzdHJpbmcpIHsKKyAgdWludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IHN0cmxlbihzdHJpbmcpOyBpKyspIHsKKyAgICBzdHJpbmdbaV0gPSB0b2xvd2VyKHN0cmluZ1tpXSk7CisgIH0KK30KKwordm9pZCB1c2FnZShjb25zdCBjaGFyICpuYW1lKSB7CisgIHVfZnByaW50ZihvdXQsICJVc2FnZTogJXMgLS1sb2NhbGUgbG9jX25hbWUgLS1wbGF0Zm9ybSBwbGF0Zm9ybVxuIiwgbmFtZSk7Cit9CisKK3ZvaWQgbGlzdEtub3duUGxhdGZvcm1zKCkgeworICBpbnQzMl90IGkgPSAwOworICB1X2ZwcmludGYoZXJyLCAiS25vd24gcGxhdGZvcm1zOlxuIik7CisgIGZvcihpID0gMDsgaSA8IHNpemVvZihwbGF0Zm9ybXMpL3NpemVvZihwbGF0Zm9ybXNbMF0pOyBpKyspIHsKKyAgICB1X2ZwcmludGYoZXJyLCAiXHQlc1xuIiwgcGxhdGZvcm1zW2ldKTsKKyAgfQorfQorCit2b2lkIGFkZFBsYXRmb3JtKGNvbnN0IGNoYXIgKnBsYXRmb3JtKSB7CisgIGludDMyX3QgaTsKKyAgLy9zdHJpbmdUb0xvd2VyKHBsYXRmb3JtKTsKKyAgaW50MzJfdCBvbGRQbGF0Zm9ybU5vID0gZ1BsYXRmb3JtTm87CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHBsYXRmb3Jtcykvc2l6ZW9mKHBsYXRmb3Jtc1swXSk7IGkrKykgeworICAgIGlmKHN0cmNtcChwbGF0Zm9ybSwgcGxhdGZvcm1zW2ldLm5hbWUpID09IDApIHsKKyAgICAgIGdQbGF0Zm9ybUluZGV4ZXNbZ1BsYXRmb3JtTm8rK10gPSBpOworICAgIH0KKyAgfQorICBpZihnUGxhdGZvcm1ObyA9PSBvbGRQbGF0Zm9ybU5vKSB7CisgICAgdV9mcHJpbnRmKGVyciwgIlVua25vd24gcGxhdGZvcm0gJXNcbiIsIHBsYXRmb3JtKTsKKyAgICBsaXN0S25vd25QbGF0Zm9ybXMoKTsKKyAgfQorfQorCit2b2lkIHByb2Nlc3NBcmdzKGludCBhcmdjLCBjaGFyKiBhcmd2W10sIFVFcnJvckNvZGUgJnN0YXR1cykKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgVV9NQUlOX0lOSVRfQVJHUyhhcmdjLCBhcmd2KTsKKworICBhcmdjID0gdV9wYXJzZUFyZ3MoYXJnYywgYXJndiwgKGludDMyX3QpKHNpemVvZihvcHRpb25zKS9zaXplb2Yob3B0aW9uc1swXSkpLCBvcHRpb25zKTsKKworICBpZihhcmdjIDwgMCkgeworICAgIHVfZnByaW50ZihlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIGFyZ3ZbLWFyZ2NdKTsKKyAgICB1c2FnZShwcm9nTmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYob3B0aW9uc1swXS5kb2VzT2NjdXIgfHwgb3B0aW9uc1sxXS5kb2VzT2NjdXIpIHsKKyAgICB1c2FnZShwcm9nTmFtZSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKG9wdGlvbnNbVkVSQk9TRV0uZG9lc09jY3VyKSB7CisgICAgZ1ZlcmJvc2UgPSBUUlVFOworICB9CisgIGlmKG9wdGlvbnNbREVCVUddLmRvZXNPY2N1cikgeworICAgIGdEZWJ1ZyA9IFRSVUU7CisgICAgZ1ZlcmJvc2UgPSBUUlVFOworICB9CisgIGlmKG9wdGlvbnNbRVhFTVBMQVJdLmRvZXNPY2N1cikgeworICAgIGdFeGVtcGxhciA9IFRSVUU7CisgIH0KKyAgaWYob3B0aW9uc1tRVUlFVF0uZG9lc09jY3VyKSB7CisgICAgZ1F1aWV0ID0gVFJVRTsKKyAgfQorLyoKKyAgZm9yKGkgPSA4OyBpIDwgOTsgaSsrKSB7CisgICAgaWYoIW9wdGlvbnNbaV0uZG9lc09jY3VyKSB7CisgICAgICB1X2ZwcmludGYoZXJyLCAiT3B0aW9uICVzIGlzIHJlcXVpcmVkIVxuIiwgb3B0aW9uc1tpXS5sb25nTmFtZSk7CisgICAgICB1c2FnZShwcm9nTmFtZSk7CisgICAgICBzdGF0dXMgPSBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CisgICAgfQorICAgIGlmKG9wdGlvbnNbaV0udmFsdWUgPT0gTlVMTCkgeworICAgICAgdV9mcHJpbnRmKGVyciwgIk9wdGlvbiAlcyBuZWVkcyBhbiBhcmd1bWVudCFcbiIsIG9wdGlvbnNbaV0ubG9uZ05hbWUpOworICAgICAgdXNhZ2UocHJvZ05hbWUpOworICAgICAgc3RhdHVzID0gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgIH0KKyAgfQorKi8KKyAgLy8gQVNDSUkgYmFzZWQgb3B0aW9ucyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorICAvLyB0aGlzIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3aWxsIGFsbG93IHRvIGxvYWQKKyAgLy8gdXAgSUNVIHJ1bGVzIGFuZCB0aGVuIHBva2UgdGhyb3VnaCB0aGVtLgorICAvLyBJbiB0aGF0IGNhc2UsIHdlIHRlc3Qgb25seSBJQ1UgYW5kIGRvbid0IG5lZWQgCisgIC8vIGEgbG9jYWxlLgorICBpZihvcHRpb25zW1JVTEVTU1RESU5dLmRvZXNPY2N1cikgeworICAgIGdSdWxlc1N0ZGluID0gVFJVRTsKKyAgICBhZGRQbGF0Zm9ybSgiaWN1Iik7CisgICAgcmV0dXJuOworICB9IAorCisgIGlmKG9wdGlvbnNbTE9DQUxFXS5kb2VzT2NjdXIpIHsKKyAgICBnTG9jYWxlID0gb3B0aW9uc1tMT0NBTEVdLnZhbHVlOworICB9IGVsc2UgeworICAgIGZvcihpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgZ0xvY2FsZXNbZ0xvY2FsZU5vKytdID0gYXJndltpXTsKKyAgICB9CisgIH0KKyAgaWYob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyKSB7CisgICAgLy9zdHJjcHkocGxhdGZvcm0sIG9wdGlvbnNbUExBVEZPUk1dLnZhbHVlKTsKKyAgICAvL2FkZFBsYXRmb3JtKCJpY3UiKTsKKyAgICBhZGRQbGF0Zm9ybShvcHRpb25zW1BMQVRGT1JNXS52YWx1ZSk7CisgIH0gZWxzZSB7IC8vIHRoZXJlIGlzIGEgbGlzdCBvZiBwbGF0Zm9ybXMgCisgICAgdV9mcHJpbnRmKGVyciwgIk9wdGlvbiAlcyBpcyByZXF1aXJlZCFcbiIsIG9wdGlvbnNbaV0ubG9uZ05hbWUpOworICAgIHVzYWdlKHByb2dOYW1lKTsKKyAgICBzdGF0dXMgPSBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CisgIH0KKworICAvLworICAvLyAgU2V0IHVwIGEgV2luZG93cyBMQ0lECisgIC8vCisgIGdXaW5MQ0lEID0gdWxvY19nZXRMQ0lEKGdMb2NhbGUpOworICAvKgorICBpZiAoZ0xvY2FsZSAhPSAwKSB7CisgICAgICBnV2luTENJRCA9IE1BS0VMQ0lEKGdMb2NhbGUsIFNPUlRfREVGQVVMVCk7CisgIH0KKyAgZWxzZSB7CisgICAgICBnV2luTENJRCA9IHVsb2NfZ2V0TENJRChnTG9jYWxlKTsKKyAgfQorICAqLworCit9CisKK3ZvaWQgcHJpbnRSdWxlcyhjb25zdCBVQ2hhciAqbmFtZSwgaW50MzJfdCBsZW4sIFVGSUxFICpmaWxlKSB7CisgIC8vIHZlcnkgcnVkaW1lbnRhcnkgcHJldHR5IHJ1bGVzIHByaW50CisgIGludDMyX3QgaSA9IDA7CisgIFVDaGFyIHRvUHJpbnRbMTYzODRdOworICBpbnQzMl90IHRvUHJpbnRJbmRleCA9IDA7CisgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgaWYobmFtZVtpXSA9PSAweDAwMjYpIHsKKyAgICAgIGlmKHRvUHJpbnRJbmRleCkgeworICAgICAgICB0b1ByaW50W3RvUHJpbnRJbmRleF0gPSAwOworICAgICAgICB1X2ZwcmludGYoZmlsZSwgIiVVXG4iLCB0b1ByaW50KTsKKyAgICAgICAgdG9QcmludEluZGV4ID0gMDsKKyAgICAgICAgdG9QcmludFt0b1ByaW50SW5kZXgrK10gPSBuYW1lW2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG9QcmludFt0b1ByaW50SW5kZXgrK10gPSBuYW1lW2ldOworICAgICAgfSAKKyAgICB9IGVsc2UgeworICAgICAgdG9QcmludFt0b1ByaW50SW5kZXgrK10gPSBuYW1lW2ldOworICAgIH0KKyAgfQorICBpZih0b1ByaW50SW5kZXgpIHsKKyAgICB0b1ByaW50W3RvUHJpbnRJbmRleF0gPSAwOworICAgIHVfZnByaW50ZihmaWxlLCAiJVVcbiIsIHRvUHJpbnQpOworICAgIHRvUHJpbnRJbmRleCA9IDA7CisgIH0KKworCit9CisKK3ZvaWQgZXNjYXBlU3RyaW5nKGNvbnN0IFVDaGFyICpuYW1lLCBpbnQzMl90IGxlbiwgVUZJTEUgKmZpbGUpIHsKKyAgdV9mcHJpbnRmKGZpbGUsICIlVSIsIG5hbWUpOworLyoKKyAgaW50MzJfdCBqID0gMDsKKyAgZm9yKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICBpZihuYW1lW2pdID49IDB4MjAgJiYgbmFtZVtqXSA8IDB4ODApIHsKKyAgICAgIHVfZnByaW50ZihmaWxlLCAiJWMiLCBuYW1lW2pdKTsKKyAgICB9IGVsc2UgeworICAgICAgdV9mcHJpbnRmKGZpbGUsICJcXHUlMDRYIiwgbmFtZVtqXSk7CisgICAgfQorICB9CisqLworfQordm9pZCBlc2NhcGVBTGluZShMaW5lICpsaW5lLCBVRklMRSAqZmlsZSkgeworICBlc2NhcGVTdHJpbmcobGluZS0+bmFtZSwgbGluZS0+bGVuLCBmaWxlKTsKK30KKwordm9pZCBlc2NhcGVFeHBhbnNpb24oTGluZSAqbGluZSwgVUZJTEUgKmZpbGUpIHsKKyAgZXNjYXBlU3RyaW5nKGxpbmUtPmV4cGFuc2lvblN0cmluZywgbGluZS0+ZXhwTGVuLCBmaWxlKTsKK30KKwordm9pZCBzaG93TmFtZXMoTGluZSAqbGluZSwgVUZJTEUgKmZpbGUpIHsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIGludDMyX3QgaiA9IDA7CisgIGNoYXIgY2hhck5hbWVbMjU2XTsKKyAgZm9yKGogPSAwOyBqIDwgbGluZS0+bGVuOyBqKyspIHsKKyAgICB1X2NoYXJOYW1lKGxpbmUtPm5hbWVbal0sIFVfRVhURU5ERURfQ0hBUl9OQU1FLCBjaGFyTmFtZSwgMjU2LCAmc3RhdHVzKTsKKyAgICB1X2ZwcmludGYoZmlsZSwgIiVzICIsIGNoYXJOYW1lKTsKKyAgfQorfQorCit2b2lkIHNldEFycmF5KExpbmUgKiphcnJheSwgTGluZSAqY29udGVudHMsIGludDMyX3Qgc2l6ZSkgeworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBhcnJheVtpXSA9IGNvbnRlbnRzK2k7CisgIH0KK30KKworLy8gc2V0IGFuIGFycmF5IGZyb20gYSBIYXNodGFibGUKK2ludDMyX3QgCitzZXRBcnJheShMaW5lICoqYXJyYXksIEhhc2h0YWJsZSAqdGFibGUgPSAmZ0VsZW1lbnRzKSB7CisgIGludDMyX3Qgc2l6ZSA9IHRhYmxlLT5jb3VudCgpOworICBpbnQzMl90IGhhc2hJbmRleCA9IC0xOworICBjb25zdCBVSGFzaEVsZW1lbnQgKmhhc2hFbGVtZW50ID0gTlVMTDsKKyAgaW50MzJfdCBjb3VudCA9IDA7CisgIHdoaWxlKChoYXNoRWxlbWVudCA9IHRhYmxlLT5uZXh0RWxlbWVudChoYXNoSW5kZXgpKSAhPSBOVUxMKSB7CisgICAgYXJyYXlbY291bnQrK10gPSAoTGluZSAqKWhhc2hFbGVtZW50LT52YWx1ZS5wb2ludGVyOworICB9CisgIHJldHVybiBzaXplOworfQorCitVQm9vbCB0cnlTd2FtcGVkKExpbmUgKipzbWFsbGVyLCBMaW5lICoqZ3JlYXRlciwgVUNoYXIgY2hhcnNbMl0sIENvbXBhcmVGbiBjb21wYXJlcikgeworICB1X3N0cmNweShnU291cmNlLT5uYW1lLCAoKnNtYWxsZXIpLT5uYW1lKTsKKyAgZ1NvdXJjZS0+bmFtZVsoKnNtYWxsZXIpLT5sZW5dID0gc2VwYXJhdG9yQ2hhcjsKKyAgZ1NvdXJjZS0+bmFtZVsoKnNtYWxsZXIpLT5sZW4rMV0gPSBjaGFyc1swXTsKKyAgZ1NvdXJjZS0+bmFtZVsoKnNtYWxsZXIpLT5sZW4rMl0gPSAwOworICBnU291cmNlLT5sZW4gPSAoKnNtYWxsZXIpLT5sZW4rMjsKKworICB1X3N0cmNweShnVGFyZ2V0LT5uYW1lLCAoKmdyZWF0ZXIpLT5uYW1lKTsKKyAgZ1RhcmdldC0+bmFtZVsoKmdyZWF0ZXIpLT5sZW5dID0gc2VwYXJhdG9yQ2hhcjsKKyAgZ1RhcmdldC0+bmFtZVsoKmdyZWF0ZXIpLT5sZW4rMV0gPSBjaGFyc1sxXTsKKyAgZ1RhcmdldC0+bmFtZVsoKmdyZWF0ZXIpLT5sZW4rMl0gPSAwOworICBnVGFyZ2V0LT5sZW4gPSAoKmdyZWF0ZXIpLT5sZW4rMjsKKworICBpZihjb21wYXJlcigmZ1NvdXJjZSwgJmdUYXJnZXQpID4gMCkgeworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitVQm9vbCB0cnlTd2FtcHMoTGluZSAqKnNtYWxsZXIsIExpbmUgKipncmVhdGVyLCBVQ2hhciBjaGFyc1syXSwgQ29tcGFyZUZuIGNvbXBhcmVyKSB7CisgIGdTb3VyY2UtPm5hbWVbMF0gPSBjaGFyc1swXTsKKyAgZ1NvdXJjZS0+bmFtZVsxXSA9IHNlcGFyYXRvckNoYXI7CisgIHVfc3RyY3B5KGdTb3VyY2UtPm5hbWUrMiwgKCpzbWFsbGVyKS0+bmFtZSk7CisgIGdTb3VyY2UtPmxlbiA9ICgqc21hbGxlciktPmxlbisyOworCisgIGdUYXJnZXQtPm5hbWVbMF0gPSBjaGFyc1sxXTsKKyAgZ1RhcmdldC0+bmFtZVsxXSA9IHNlcGFyYXRvckNoYXI7CisgIHVfc3RyY3B5KGdUYXJnZXQtPm5hbWUrMiwgKCpncmVhdGVyKS0+bmFtZSk7CisgIGdUYXJnZXQtPmxlbiA9ICgqZ3JlYXRlciktPmxlbisyOworCisgIGlmKGNvbXBhcmVyKCZnU291cmNlLCAmZ1RhcmdldCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK3Byb2JlU3RyZW5ndGgoTGluZSoqIHByZXZMaW5lLCBMaW5lICoqY3VyckxpbmUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICAvLyBQcmltYXJ5IHN3YW1wcyBzZWNvbmRhcnkKKyAgLy8gaGF2ZSBwYWlycyB3aGVyZSBbMF0gMj4gWzFdCisgIFVDaGFyIHByaW1Td2FtcHNbXVsyXSA9IHsKKyAgICB7IDB4MDBFMCwgMHgwMDYxIH0sCisgICAgeyAweDA0NTAsIDB4MDQzNSB9LAorICAgIHsgMHgzMWEzLCAweDMxMGQgfQorICB9OworICAvLyBTZWNvbmRhcnkgc3dhbXBzIHRlcnRpYXJ5CisgIC8vIGhhdmUgcGFpcnMgd2hlcmUgWzBdIDM+IFsxXQorICBVQ2hhciBzZWNTd2FtcHNbXVsyXSA9IHsKKyAgICB7IDB4MDA1MywgMHgwMDczIH0sCisgICAgeyAweDA0MTUsIDB4MDQzNSB9LAorICAgIHsgMHgzMWI2LCAweDMxMGUgfQorICB9OworICAvLyBTZWNvbmRhcnkgaXMgc3dhbXBlZCBieSBwcmltYXJ5CisgIC8vIGhhdmUgcGFpcnMgd2hlcmUgWzBdIDE+IFsxXQorICBVQ2hhciBzZWNTd2FtcGVkW11bMl0gPSB7CisgICAgeyAweDAwNjIsIDB4MDA2MSB9LAorICAgIHsgMHgwNDM2LCAweDA0NTQgfSwKKyAgICB7IDB4MzEwZSwgMHgzMTBkIH0KKyAgfTsKKyAgLy8gVGVydGlhcnkgaXMgc3dhbXBlZCBieSBzZWNvbmRhcnkKKyAgLy8gaGF2ZSBwYWlycyB3aGVyZSBbMF0gMj4gWzFdCisgIFVDaGFyIHRlclN3YW1wZWRbXVsyXSA9IHsKKyAgICB7IDB4MDBFMCwgMHgwMDYxIH0sCisgICAgeyAweDA0NTAsIDB4MDQzNSB9LAorICAgIHsgMHgzMWEzLCAweDMxMGQgfQorICB9OworICBpbnQzMl90IGkgPSAwOworICAvLyBUZXJ0aWFyeSBzd2FtcHMgZXF1YWw/CisgIGludCByZXN1bHQgPSAwOworICAvLyBDaG9vc2UgdGhlIHBhaXIKKyAgaSA9IDA7CisgIC8qCisgIGlmKCgqcHJldkxpbmUpLT5uYW1lWzBdID4gMHhGRiAmJiAoKmN1cnJMaW5lKS0+bmFtZVswXSA+IDB4RkYpIHsKKyAgICBpID0gMDsKKyAgfSBlbHNlIGlmKCgqcHJldkxpbmUpLT5uYW1lWzBdIDwgMHgwNDAwICYmICgqY3VyckxpbmUpLT5uYW1lWzBdIDwgMHgwNDAwKSB7CisgICAgaSA9IDE7CisgIH0gZWxzZSB7CisgICAgaSA9IDI7CisgIH0KKyAgKi8KKyAgLy8gYXJlIHRoZXkgZXF1YWw/CisgIGlmKChyZXN1bHQgPSBjb21wYXJlcihwcmV2TGluZSwgY3VyckxpbmUpKSA9PSAwKSB7CisgICAgcmV0dXJuIFVDT0xfSURFTlRJQ0FMOworICB9IGVsc2UgaWYocmVzdWx0ID4gMCkgeworICAgIC8vZnByaW50ZihzdGRlcnIsICJsaW5lcyBzaG91bGQgYmUgb3JkZXJlZCEiKTsKKyAgICByZXR1cm4gVUNPTF9PRkY7CisgIH0gZWxzZSBpZih0cnlTd2FtcHMocHJldkxpbmUsIGN1cnJMaW5lLCBwcmltU3dhbXBzW2ldLCBjb21wYXJlcikpIHsKKyAgICByZXR1cm4gVUNPTF9QUklNQVJZOworICB9IGVsc2UgaWYodHJ5U3dhbXBzKHByZXZMaW5lLCBjdXJyTGluZSwgc2VjU3dhbXBzW2ldLCBjb21wYXJlcikpIHsKKyAgICByZXR1cm4gVUNPTF9TRUNPTkRBUlk7CisgIH0gZWxzZSBpZih0cnlTd2FtcGVkKHByZXZMaW5lLCBjdXJyTGluZSwgdGVyU3dhbXBlZFtpXSwgY29tcGFyZXIpKSB7CisgICAgLy8gaXMgdGhlcmUgYSB0ZXJ0aWFyeSBkaWZmZXJlbmNlCisgICAgcmV0dXJuIFVDT0xfVEVSVElBUlk7CisgIH0gZWxzZSB7CisgICAgLy9mcHJpbnRmKHN0ZGVyciwgIlVua25vd24gc3RyZW5ndGghXG4iKTsKKyAgICByZXR1cm4gVUNPTF9PTjsKKyAgfQorfQorCisvLyBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHByb2JlIHRoZSBzZXQgb2YgbGluZXMgCisvLyAoYWxyZWFkeSBzb3J0ZWQgYnkgcXNvcnQpIGFuZCBkZWR1Y3QgdGhlIHN0cmVuZ3Rocwordm9pZCAKK2FuYWx5emVTdHJlbmd0aChMaW5lICoqbGluZXMsIGludDMyX3Qgc2l6ZSwgQ29tcGFyZUZuIGNvbXBhcmVyKSB7CisgIGludDMyX3QgaSA9IDA7CisKKyAgZm9yKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgTGluZSAqKnByZXZMaW5lID0gbGluZXMraS0xOworICAgIExpbmUgKipjdXJyTGluZSA9IGxpbmVzK2k7CisgICAgKCpjdXJyTGluZSktPnN0cmVuZ3RoID0gcHJvYmVTdHJlbmd0aChwcmV2TGluZSwgY3VyckxpbmUsIGNvbXBhcmVyKTsKKyAgICAoKmN1cnJMaW5lKS0+c29ydGVkSW5kZXggPSBpOworICAgICgqY3VyckxpbmUpLT5wcmV2aW91cyA9ICpwcmV2TGluZTsKKyAgICAoKnByZXZMaW5lKS0+bmV4dCA9ICpjdXJyTGluZTsKKworICB9CisKK30KKwordm9pZCBwcmludFN0cmVuZ3RoKFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCwgVUZJTEUgKmZpbGUpIHsKKyAgdV9mcHJpbnRmKGZpbGUsICIgIik7CisgIHN3aXRjaChzdHJlbmd0aCkgeworICBjYXNlIFVDT0xfSURFTlRJQ0FMOgorICAgIHVfZnByaW50ZihmaWxlLCAiPSIpOworICAgIGJyZWFrOworICBjYXNlIFVDT0xfVEVSVElBUlk6CisgICAgLy91X2ZwcmludGYoZmlsZSwgIjwzIik7CisgICAgdV9mcHJpbnRmKGZpbGUsICI8PDwiKTsKKyAgICBicmVhazsKKyAgY2FzZSBVQ09MX1NFQ09OREFSWToKKyAgICAvL3VfZnByaW50ZihmaWxlLCAiPDIiKTsKKyAgICB1X2ZwcmludGYoZmlsZSwgIjw8Iik7CisgICAgYnJlYWs7CisgIGNhc2UgVUNPTF9QUklNQVJZOgorICAgIC8vdV9mcHJpbnRmKGZpbGUsICI8MSIpOworICAgIHVfZnByaW50ZihmaWxlLCAiPCIpOworICAgIGJyZWFrOworICBjYXNlIFVDT0xfT0ZGOgorICAgIHVfZnByaW50ZihmaWxlLCAiPj8iKTsKKyAgZGVmYXVsdDoKKyAgICB1X2ZwcmludGYoZmlsZSwgIj8hIik7CisgICAgYnJlYWs7CisgIH0KKyAgdV9mcHJpbnRmKGZpbGUsICIgIik7Cit9CisKK3ZvaWQgcHJpbnRTdHJlbmd0aChMaW5lICpsaW5lLCBVRklMRSAqZmlsZSkgeworICBwcmludFN0cmVuZ3RoKGxpbmUtPnN0cmVuZ3RoLCBmaWxlKTsKK30KKwordm9pZCBwcmludExpbmUoTGluZSAqbGluZSwgVUZJTEUgKmZpbGUpIHsKKyAgZXNjYXBlQUxpbmUobGluZSwgZmlsZSk7CisgIGlmKGxpbmUtPmlzRXhwYW5zaW9uKSB7CisgICAgdV9mcHJpbnRmKGZpbGUsICIvIik7CisgICAgZXNjYXBlRXhwYW5zaW9uKGxpbmUsIGZpbGUpOworICB9Cit9CisKK3ZvaWQgcHJpbnRPcmRlcmluZyhMaW5lICoqbGluZXMsIGludDMyX3Qgc2l6ZSwgVUZJTEUgKmZpbGUsIFVCb29sIHVzZUxpbmtzID0gRkFMU0UpIHsKKyAgaW50MzJfdCBpID0gMDsKKworICAvL3ByaW50TGluZSgqbGluZXMpOworICAvL2VzY2FwZUFMaW5lKCpsaW5lcyk7IC8vIFByaW50IGZpcnN0IGxpbmUKKworICBMaW5lICpsaW5lID0gTlVMTDsKKyAgTGluZSAqcHJldmlvdXMgPSAqbGluZXM7CisgIGlmKHByZXZpb3VzLT5pc1Jlc2V0KSB7CisgICAgdV9mcHJpbnRmKGZpbGUsICJcbiYgIik7CisgICAgZXNjYXBlQUxpbmUocHJldmlvdXMsIGZpbGUpOworICB9IGVsc2UgaWYoIXByZXZpb3VzLT5pc1JlbW92ZWQpIHsKKyAgICBwcmludExpbmUocHJldmlvdXMsIGZpbGUpOworICB9CisgIGkgPSAxOworICB3aGlsZShpIDwgc2l6ZSAmJiBwcmV2aW91cy0+bmV4dCkgeworICAgIGlmKHVzZUxpbmtzKSB7CisgICAgICBsaW5lID0gcHJldmlvdXMtPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUgPSAqKGxpbmVzK2kpOworICAgIH0KKyAgICBpZihsaW5lLT5pc1Jlc2V0KSB7CisgICAgICB1X2ZwcmludGYoZmlsZSwgIlxuJiAiKTsKKyAgICAgIGVzY2FwZUFMaW5lKGxpbmUsIGZpbGUpOworICAgIH0gZWxzZSBpZighbGluZS0+aXNSZW1vdmVkKSB7CisgICAgICBpZihmaWxlID09IG91dCkgeworICAgICAgICB1X2ZwcmludGYoZmlsZSwgIlxuIik7CisgICAgICB9CisgICAgICBpZihpID4gMCkgeworICAgICAgICBwcmludFN0cmVuZ3RoKGxpbmUsIGZpbGUpOworICAgICAgfQorICAgICAgcHJpbnRMaW5lKGxpbmUsIGZpbGUpOworICAgICAgLy9lc2NhcGVBTGluZShsaW5lLCBmaWxlKTsKKyAgICB9CisgICAgcHJldmlvdXMgPSBsaW5lOworICAgIGkrKzsKKyAgfQorICB1X2ZwcmludGYoZmlsZSwgIlxuIik7Cit9CisKKwordm9pZCBzZXRJbmRleGVzKExpbmUgKipsaW5lcywgaW50MzJfdCBzaXplKSB7CisgIGludDMyX3QgaSA9IDA7CisgICgqbGluZXMpLT5zb3J0ZWRJbmRleCA9IDA7CisgIGZvcihpID0gMTsgaSA8IHNpemU7IGkrKykgeworICAgIExpbmUgKmxpbmUgPSAqKGxpbmVzK2kpOworICAgIExpbmUgKnByZXYgPSAqKGxpbmVzK2ktMSk7CisgICAgbGluZS0+cHJldmlvdXMgPSBwcmV2OworICAgIHByZXYtPm5leHQgPSBsaW5lOworICAgIGxpbmUtPnNvcnRlZEluZGV4ID0gaTsKKyAgfQorfQorCisKKy8vIHRoaXMgc2VlbXMgdG8gYmUgYSBkZWFkIGVuZAordm9pZAorbm90ZUV4cGFuc2lvbihMaW5lICoqZ0xpbmVzLCBMaW5lICpsaW5lLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworICBVbmljb2RlU3RyaW5nIGtleShsaW5lLT5uYW1lLCBsaW5lLT5sZW4pOworICAvL0xpbmUgKnRvSW5zZXJ0ID0gKExpbmUgKilnRWxlbWVudHMuZ2V0KGtleSk7CisgIExpbmUgKnRvSW5zZXJ0ID0gKExpbmUgKilnRXhwYW5zaW9ucy5nZXQoa2V5KTsKKyAgaWYodG9JbnNlcnQgIT0gTlVMTCkgeworICAgIHRvSW5zZXJ0LT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgdV9zdHJjcHkodG9JbnNlcnQtPmV4cGFuc2lvblN0cmluZywgbGluZS0+ZXhwYW5zaW9uU3RyaW5nKTsKKyAgICB0b0luc2VydC0+ZXhwTGVuID0gbGluZS0+ZXhwTGVuOworICAgIHRvSW5zZXJ0LT5wcmV2aW91cy0+bmV4dCA9IHRvSW5zZXJ0LT5uZXh0OworICAgIHRvSW5zZXJ0LT5uZXh0LT5wcmV2aW91cyA9IHRvSW5zZXJ0LT5wcmV2aW91czsKKyAgICBnRWxlbWVudHMucmVtb3ZlKGtleSk7CisgIH0gZWxzZSB7CisgICAgdG9JbnNlcnQgPSBuZXcgTGluZSgqbGluZSk7IAorICAgIHRvSW5zZXJ0LT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKHRvSW5zZXJ0LT5uYW1lLCB0b0luc2VydC0+bGVuKSwgdG9JbnNlcnQsIHN0YXR1cyk7CisgIH0KKworICBpbnQzMl90IGkgPSAwOworICBMaW5lIHRlc3RMaW5lOworICBMaW5lICpsID0gJnRlc3RMaW5lOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICB1X3N0cmNweSh0ZXN0TGluZS5uYW1lLCAoKihnTGluZXMraSkpLT5uYW1lKTsKKyAgICB1X3N0cmNhdCh0ZXN0TGluZS5uYW1lLCBsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICAgIHRlc3RMaW5lLmxlbiA9ICgqKGdMaW5lcytpKSktPmxlbiArIGxpbmUtPmV4cExlbjsKKyAgICBpZihjb21wYXJlcigmbCwgJmxpbmUpID4gMCkgeworICAgICAgdG9JbnNlcnQtPnByZXZpb3VzID0gKihnTGluZXMraS0xKTsKKyAgICAgIHRvSW5zZXJ0LT5uZXh0ID0gKihnTGluZXMraSk7CisgICAgICB0b0luc2VydC0+cHJldmlvdXMtPm5leHQgPSB0b0luc2VydDsKKyAgICAgIHRvSW5zZXJ0LT5uZXh0LT5wcmV2aW91cyA9IHRvSW5zZXJ0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKGdWZXJib3NlKSB7CisgICAgdV9mcHJpbnRmKGxvZywgIkFkZGluZyBleHBhbnNpb25cbiIpOworICAgIGVzY2FwZUFMaW5lKGxpbmUsIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIi8iKTsKKyAgICBlc2NhcGVFeHBhbnNpb24obGluZSwgbG9nKTsKKyAgICB1X2ZwcmludGYobG9nLCAiICIpOworICB9Cit9CisKK3ZvaWQKK3Bvc2l0aW9uRXhwYW5zaW9ucyhMaW5lICoqZ0xpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgTGluZSAqbGluZSA9IE5VTEw7CisgIExpbmUgKnRvTW92ZSA9IE5VTEw7CisgIGludDMyX3QgaSA9IDAsIGogPSAwOworICBMaW5lICoqc29ydGVkRXhwYW5zaW9ucyA9IG5ldyBMaW5lKltnRXhwYW5zaW9ucy5jb3VudCgpXTsKKyAgaW50MzJfdCBzb3J0ZWRFeHBhbnNpb25zU2l6ZSA9IHNldEFycmF5KHNvcnRlZEV4cGFuc2lvbnMsICZnRXhwYW5zaW9ucyk7CisgIHFzb3J0KHNvcnRlZEV4cGFuc2lvbnMsIHNvcnRlZEV4cGFuc2lvbnNTaXplLCBzaXplb2YoTGluZSAqKSwgY29tcGFyZXIpOworICAvLyBNYWtlIGEgbGlzdCBvZiB0aGluZ3MgaW4gdGhlIHZpbmNpbml0eSBvZiBleHBhbnNpb24gY2FuZGlkYXRlCisgIGZvcihqID0gMDsgaiA8IHNvcnRlZEV4cGFuc2lvbnNTaXplOyBqKyspIHsKKyAgICBsaW5lID0gKihzb3J0ZWRFeHBhbnNpb25zK2opOworICAgIFVuaWNvZGVTdHJpbmcga2V5KGxpbmUtPm5hbWUsIGxpbmUtPmxlbik7CisgICAgdG9Nb3ZlID0gKExpbmUgKilnRWxlbWVudHMuZ2V0KGtleSk7CisgICAgaW50MzJfdCBpID0gMDsKKyAgICBMaW5lIHRlc3RMaW5lLCBwcmV2VGVzdExpbmU7CisgICAgTGluZSAqbCA9ICZ0ZXN0TGluZTsKKyAgICBMaW5lICpwcmV2TCA9ICZwcmV2VGVzdExpbmU7CisgICAgLy8gVGhpcyBjYW4gYmUgZnVydGhlciBvcHRpbWl6ZWQsIHNpbmNlIHdlIG5vdyBrbm93IHRoYXQgd2UgaGF2ZSBhIAorICAgIC8vIHNvcnRlZCBsaXN0IG9mIGV4cGFuc2lvbnMsIHNvIGN1cnJlbnQgY2FuIHN0YXJ0IGZyb20gdG9Nb3ZlLCBzaW5jZSBhbGwKKyAgICAvLyB0aGUgZWxlbWVudHMgYmVmb3JlIGl0IGFyZSBhbHJlYWR5IHNtYWxsZXIuIEluIHRoZSBiZWdnaW5pbmcgaXQgbmVlZHMgdG8gCisgICAgLy8gYmUgb24gZ0xpbmVzLCB0aG91Z2guCisgICAgTGluZSAqY3VycmVudCA9ICpnTGluZXM7CisgICAgd2hpbGUoY3VycmVudCkgeworICAgICAgaWYoY3VycmVudCA9PSB0b01vdmUpIHsKKyAgICAgICAgLy8gd2UgYXJlIHdhZGluZyB0aHJvdWdoIGEgc29ydGVkIGxpc3QKKyAgICAgICAgLy8gaWYgd2UgZm91bmQgb3Vyc2VsdmVzLCBpdCBtZWFucyB0aGF0IHdlIAorICAgICAgICAvLyBhcmUgYWxyZWFkeSBpbiBhIHJpZ2h0IHBsYWNlLCBzbyBubyBtb3ZpbmcKKyAgICAgICAgLy8gaXMgbmVlZGVkLCBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZQorICAgICAgICAvLyB0aGUgcmlnaHQgc3RyZW5ndGguCisgICAgICAgIHRvTW92ZS0+c3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKCZwcmV2TCwgJnRvTW92ZSwgY29tcGFyZXIpOworICAgICAgICBpZigwKSB7CisgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIlBvc2l0aW9uZWQgZXhwYW5zaW9uIHdpdGhvdXQgbW92aW5nICIpOworICAgICAgICAgIHByaW50TGluZSh0b01vdmUsIGxvZyk7CisgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIiBuZXcgb3JkZXJpbmc6IFxuIik7CisgICAgICAgICAgcHJpbnRPcmRlcmluZyhnTGluZXMsIHNpemUsIGxvZywgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB1X3N0cmNweSh0ZXN0TGluZS5uYW1lLCBjdXJyZW50LT5uYW1lKTsKKyAgICAgICAgaWYoIWN1cnJlbnQtPmlzRXhwYW5zaW9uKSB7CisgICAgICAgICAgdV9zdHJjYXQodGVzdExpbmUubmFtZSwgbGluZS0+ZXhwYW5zaW9uU3RyaW5nKTsKKyAgICAgICAgICB0ZXN0TGluZS5sZW4gPSBjdXJyZW50LT5sZW4gKyBsaW5lLT5leHBMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGVzdExpbmUubGVuID0gY3VycmVudC0+bGVuOworICAgICAgICB9CisgICAgICAgIGlmKGNvbXBhcmVyKCZsLCAmbGluZSkgPiAwKSB7CisgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY2hhaW4KKyAgICAgICAgICBpZih0b01vdmUtPm5leHQpIHsKKyAgICAgICAgICAgIHRvTW92ZS0+bmV4dC0+c3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKCYodG9Nb3ZlLT5wcmV2aW91cyksICYodG9Nb3ZlLT5uZXh0KSwgY29tcGFyZXIpOworICAgICAgICAgICAgdG9Nb3ZlLT5uZXh0LT5wcmV2aW91cyA9IHRvTW92ZS0+cHJldmlvdXM7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKHRvTW92ZS0+cHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRvTW92ZS0+cHJldmlvdXMtPm5leHQgPSB0b01vdmUtPm5leHQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaW5zZXJ0CisgICAgICAgICAgdG9Nb3ZlLT5wcmV2aW91cyA9IGN1cnJlbnQtPnByZXZpb3VzOworICAgICAgICAgIHRvTW92ZS0+bmV4dCA9IGN1cnJlbnQ7CisKKyAgICAgICAgICBpZihjdXJyZW50LT5wcmV2aW91cykgeworICAgICAgICAgICAgY3VycmVudC0+cHJldmlvdXMtPm5leHQgPSB0b01vdmU7CisgICAgICAgICAgfQorICAgICAgICAgIGN1cnJlbnQtPnByZXZpb3VzID0gdG9Nb3ZlOworCisgICAgICAgICAgdG9Nb3ZlLT5zdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJnByZXZMLCAmdG9Nb3ZlLCBjb21wYXJlcik7CisgICAgICAgICAgdG9Nb3ZlLT5uZXh0LT5zdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJnRvTW92ZSwgJmwsIGNvbXBhcmVyKTsKKyAgICAgICAgICBpZigwKSB7CisgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiUG9zaXRpb25lZCBleHBhbnNpb24gIik7CisgICAgICAgICAgICBwcmludExpbmUodG9Nb3ZlLCBsb2cpOworICAgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIiBuZXcgb3JkZXJpbmc6IFxuIik7CisgICAgICAgICAgICBwcmludE9yZGVyaW5nKGdMaW5lcywgc2l6ZSwgbG9nLCBUUlVFKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYodG9Nb3ZlLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNyYXppbmVzcyBzdWNoIGFzIHMgPSBzcy9zCisgICAgICAgICAgICAvLyBzdWNoIGxpbmUgd291bGQgY29uc2lzdCBvZiBwcmV2aW91cyAob3IgbmV4dCkgY29uY2F0ZW5hdGVkIHdpdGggdGhlIGV4cGFuc2lvbiB2YWx1ZQorICAgICAgICAgICAgLy8gbWFrZSBhIHRlc3QKKyAgICAgICAgICAgIFVDaGFyIGZ1bGxTdHJpbmdbMjU2XTsKKyAgICAgICAgICAgIHVfc3RyY3B5KGZ1bGxTdHJpbmcsIHRvTW92ZS0+cHJldmlvdXMtPm5hbWUpOworICAgICAgICAgICAgdV9zdHJjYXQoZnVsbFN0cmluZywgdG9Nb3ZlLT5leHBhbnNpb25TdHJpbmcpOworICAgICAgICAgICAgaWYodV9zdHJjbXAoZnVsbFN0cmluZywgdG9Nb3ZlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgIHRvTW92ZS0+cHJldmlvdXMtPm5leHQgPSB0b01vdmUtPm5leHQ7CisgICAgICAgICAgICAgIHRvTW92ZS0+bmV4dC0+cHJldmlvdXMgPSB0b01vdmUtPnByZXZpb3VzOworICAgICAgICAgICAgICB0b01vdmUtPmlzUmVtb3ZlZCA9IFRSVUU7CisgICAgICAgICAgICAgIHVfZnByaW50Zihsb2csICJSZW1vdmVkOiAiKTsKKyAgICAgICAgICAgICAgcHJpbnRMaW5lKHRvTW92ZSwgbG9nKTsKKyAgICAgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgICAgICAgICAgICB9IAorICAgICAgICAgIH0gZWxzZSBpZih0b01vdmUtPm5leHQtPnN0cmVuZ3RoID09IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgICAgICAgICBVQ2hhciBmdWxsU3RyaW5nWzI1Nl07CisgICAgICAgICAgICB1X3N0cmNweShmdWxsU3RyaW5nLCB0b01vdmUtPm5leHQtPm5hbWUpOworICAgICAgICAgICAgdV9zdHJjYXQoZnVsbFN0cmluZywgdG9Nb3ZlLT5leHBhbnNpb25TdHJpbmcpOworICAgICAgICAgICAgaWYodV9zdHJjbXAoZnVsbFN0cmluZywgdG9Nb3ZlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgIHRvTW92ZS0+bmV4dC0+c3RyZW5ndGggPSB0b01vdmUtPnN0cmVuZ3RoOworICAgICAgICAgICAgICB0b01vdmUtPnByZXZpb3VzLT5uZXh0ID0gdG9Nb3ZlLT5uZXh0OworICAgICAgICAgICAgICB0b01vdmUtPm5leHQtPnByZXZpb3VzID0gdG9Nb3ZlLT5wcmV2aW91czsKKyAgICAgICAgICAgICAgdG9Nb3ZlLT5pc1JlbW92ZWQgPSBUUlVFOworICAgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiUmVtb3ZlZCBiZWNhdXNlIG9mIGJhY2s6ICIpOworICAgICAgICAgICAgICBwcmludExpbmUodG9Nb3ZlLCBsb2cpOworICAgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiXG4iKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByZXZUZXN0TGluZSA9IHRlc3RMaW5lOworICAgICAgfQorICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorICB9CisgIGRlbGV0ZVtdIHNvcnRlZEV4cGFuc2lvbnM7Cit9CisKKwordm9pZAorbm90ZUV4cGFuc2lvbihMaW5lICpsaW5lKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVbmljb2RlU3RyaW5nIGtleShsaW5lLT5uYW1lLCBsaW5lLT5sZW4pOworICBMaW5lICplbCA9IChMaW5lICopZ0VsZW1lbnRzLmdldChrZXkpOworICBpZihlbCAhPSBOVUxMKSB7CisgICAgZWwtPmlzRXhwYW5zaW9uID0gVFJVRTsKKyAgICB1X3N0cmNweShlbC0+ZXhwYW5zaW9uU3RyaW5nLCBsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICAgIGVsLT5leHBMZW4gPSBsaW5lLT5leHBMZW47CisgIH0gZWxzZSB7CisgICAgTGluZSAqdG9JbnNlcnQgPSBuZXcgTGluZSgqbGluZSk7IAorICAgIHRvSW5zZXJ0LT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKGxpbmUtPm5hbWUsIGxpbmUtPmxlbiksIHRvSW5zZXJ0LCBzdGF0dXMpOworICB9CisKKyAgTGluZSAqZWwyID0gKExpbmUgKilnRXhwYW5zaW9ucy5nZXQoa2V5KTsKKyAgZWwyLT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgIHVfc3RyY3B5KGVsMi0+ZXhwYW5zaW9uU3RyaW5nLCBsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICBlbDItPmV4cExlbiA9IGxpbmUtPmV4cExlbjsKKworICBpZihnRGVidWcpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiQWRkaW5nIGV4cGFuc2lvblxuIik7CisgICAgcHJpbnRMaW5lKGxpbmUsIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgIH0KK30KKwordm9pZCAKK25vdGVDb250cmFjdGlvbihMaW5lICpsaW5lKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBMaW5lICp0b0luc2VydCA9IG5ldyBMaW5lKCpsaW5lKTsgCisgIHRvSW5zZXJ0LT5pc0NvbnRyYWN0aW9uID0gVFJVRTsKKyAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKGxpbmUtPm5hbWUsIGxpbmUtPmxlbiksIHRvSW5zZXJ0LCBzdGF0dXMpOworICBpZihnVmVyYm9zZSkgeworICAgIHVfZnByaW50Zihsb2csICJBZGRpbmcgY29udHJhY3Rpb25cbiIpOworICAgIGVzY2FwZUFMaW5lKGxpbmUsIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIiAiKTsKKyAgfQorfQorCit2b2lkCitub3RlRWxlbWVudChMaW5lICpsaW5lKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBMaW5lICp0b0luc2VydCA9IG5ldyBMaW5lKCpsaW5lKTsKKyAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKGxpbmUtPm5hbWUsIGxpbmUtPmxlbiksIHRvSW5zZXJ0LCBzdGF0dXMpOworICBpZigwKSB7IC8vaWYoZ0RlYnVnKSAKKyAgICBlc2NhcGVBTGluZShsaW5lLCBsb2cpOworICAgIHVfZnByaW50Zihsb2csICIgIik7CisgIH0KK30KKworCisKKy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGEgY29tYmluYXRpb24gb2YgY2hhcmFjdGVycyBoYXMgY2hhbmdlZCBwbGFjZSB3aXRoIHRoZSAKKy8vIGFkamFjZW50IGVsZW1lbnRzLiBJZiBzbywgdGhlc2UgYXJlIG1vc3QgcHJvYmFibHkgY29udHJhY3Rpb25zLgorLy8gSG93ZXZlciwgaXQgc3RpbGwgbmVlZHMgdG8gYmUgY2hlY2tlZCBpZiB0aGVzZSBjb250cmFjdGlvbnMgYXJlIGZha2UgLSB0aGUgCisvLyB0ZXN0IGlzIHNpbXBsZSAtIGlmIHh5IGlzIHN1c3BlY3RlZCBjb250cmFjdGlvbiwgaWYgd2UgZ2V0IHRoYXQgeC95IGlzIGV4cGFuc2lvbiwgdGhlbgorLy8geHkgaXMgYSBmYWtlIGNvbnRyYWN0aW9uLgoraW50MzJfdCAKK2FuYWx5emVDb250cmFjdGlvbnMoTGluZSoqIGxpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgaW50MzJfdCBvdXRPZk9yZGVyID0gMDsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoID0gVUNPTF9PRkY7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBjdXJyU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgTGluZSAqKnByZXZMaW5lID0gbGluZXM7CisgIExpbmUgKipjdXJyTGluZSA9IE5VTEw7CisgIExpbmUgKipiYWNrdXBMaW5lID0gTlVMTDsKKyAgVUJvb2wgcHJldklzQ29udHJhY3Rpb24gPSBGQUxTRSwgY3VycklzQ29udHJhY3Rpb24gPSBGQUxTRTsKKyAgLy8gUHJvYmxlbSBoZXJlIGlzIGRldGVjdGluZyBhIGNvbnRyYWN0aW9uIHRoYXQgaXMgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBzb3J0ZWQgbGlzdAorICBmb3IoaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKKyAgICBjdXJyTGluZSA9IGxpbmVzK2k7CisgICAgc3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKHByZXZMaW5lLCBjdXJyTGluZSwgY29tcGFyZXIpOworICAgIGlmKHN0cmVuZ3RoID09IFVDT0xfT0ZGIHx8IHN0cmVuZ3RoICE9ICgqY3VyckxpbmUpLT5zdHJlbmd0aCkgeworICAgICAgcHJldklzQ29udHJhY3Rpb24gPSBGQUxTRTsKKyAgICAgIGN1cnJJc0NvbnRyYWN0aW9uID0gRkFMU0U7CisgICAgICBpZighb3V0T2ZPcmRlcikgeworICAgICAgICBpZihnVmVyYm9zZSkgeworICAgICAgICAgIHVfZnByaW50Zihsb2csICJQb3NzaWJsZSBjb250cmFjdGlvbnM6ICIpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBub3cgd2UgaGF2ZSB0d28gZWxlbWVudHMgdGhhdCBhcmUgZGlmZmVyZW50LiBUaGUgcXVlc3Rpb24gaXMsIAorICAgICAgLy8gd2hpY2ggb25lIG9mIHRoZW0gaXMgdGhlIGNvbnRyYWN0aW9uIC0gd2hpY2ggb25lIGhhcyBtb3ZlZC4gCisgICAgICAvLyBDb3VsZCBiZSB0aGUgcHJldmlvdXMsIGJ1dCBjb3VsZCBhbHNvIGJlIHRoZSBjdXJyZW50LgorCisgICAgICBvdXRPZk9yZGVyKys7CisKKyAgICAgIC8vIEZpcnN0LCBsZXRzIGNoZWNrIHdoZXRoZXIgdGhlIHByZXZpb3VzIGhhcyBqdW1wZWQgYmFjaworICAgICAgaiA9IGkrMTsKKyAgICAgIC8vIHNraXAgYWxsIHRoZSBuZXh0cyB0aGF0IGhhdmUgc21hbGxlciBzdHJlbmd0aCwgdGhleSBkb24ndCBoYXZlIGFuIGVmZmVjdAorICAgICAgd2hpbGUoaiA8IHNpemUgJiYgKCoobGluZXMraikpLT5zdHJlbmd0aCA+ICgqY3VyckxpbmUpLT5zdHJlbmd0aCkgeworICAgICAgICBqKys7CisgICAgICB9CisgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgb2Ygc2FtZSBvciBncmVhdGVyIHN0cmVuZ3RoCisgICAgICB3aGlsZShqIDwgc2l6ZSAmJiAKKyAgICAgICAgKHN0cmVuZ3RoID0gcHJvYmVTdHJlbmd0aChwcmV2TGluZSwgKGJhY2t1cExpbmUgPSBsaW5lcytqKSwgY29tcGFyZXIpKSA9PSBVQ09MX09GRikgeworICAgICAgICBqKys7CisgICAgICAgIC8vIGlmIHdlIHNraXBwZWQgbW9yZSB0aGFuIG9uZSwgaXQgbWlnaHQgYmUgaW4gZmFjdCBhIGNvbnRyYWN0aW9uCisgICAgICAgIHByZXZJc0NvbnRyYWN0aW9uID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmKHByZXZJc0NvbnRyYWN0aW9uKSB7CisgICAgICAgIG5vdGVDb250cmFjdGlvbigqcHJldkxpbmUpOworICAgICAgICBqID0gaS0yOworICAgICAgICAvLyBhZGQgYWxsIHRoZSBwcmV2aW91cyBlbGVtZW50cyB3aXRoIHNtYWxsZXIgc3RyZW5ndGgsIHNpbmNlIHRoZXkgYWxzbworICAgICAgICAvLyB3aWxsIGp1bXAgb3ZlciBhbmQgYXJlIGNvbnRyYWN0aW9ucworICAgICAgICB3aGlsZShqID49IDAgJiYgKCoobGluZXMraisxKSktPnN0cmVuZ3RoID4gKCpjdXJyTGluZSktPnN0cmVuZ3RoKSB7CisgICAgICAgICAgc3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKGxpbmVzK2osIGN1cnJMaW5lLCBjb21wYXJlcik7CisgICAgICAgICAgaWYoc3RyZW5ndGggPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICAgIG5vdGVDb250cmFjdGlvbigqKGxpbmVzK2opKTsKKyAgICAgICAgICB9CisgICAgICAgICAgai0tOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIG5vdyB3ZSBjaGVjayBpZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIGp1bXBpbmcgZm9yd2FyZCwKKyAgICAgIC8vIHRoZSBkYW5jZSBzdGVwcyBhcmUgYW5hbG9nb3VzIHRvIGFib3ZlLgorICAgICAgaiA9IGkgLSAyOworICAgICAgd2hpbGUoaiA+PSAwICYmICgqKGxpbmVzK2orMSkpLT5zdHJlbmd0aCA+ICgqY3VyckxpbmUpLT5zdHJlbmd0aCkgeworICAgICAgICBqLS07CisgICAgICB9CisgICAgICB3aGlsZShqID49IDAgJiYgCisgICAgICAgIChzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoKGJhY2t1cExpbmUgPSBsaW5lcytqKSwgY3VyckxpbmUsIGNvbXBhcmVyKSkgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgai0tOworICAgICAgICBjdXJySXNDb250cmFjdGlvbiA9IFRSVUU7CisgICAgICB9CisgICAgICBpZihjdXJySXNDb250cmFjdGlvbikgeworICAgICAgICBpZihnVmVyYm9zZSkgeworICAgICAgICAgIGVzY2FwZUFMaW5lKCpjdXJyTGluZSwgbG9nKTsKKyAgICAgICAgICB1X2ZwcmludGYobG9nLCAiICIpOworICAgICAgICB9CisgICAgICAgIGogPSBpKzE7CisgICAgICAgIHdoaWxlKGogPCBzaXplICYmICgqKGxpbmVzK2opKS0+c3RyZW5ndGggPiAoKmN1cnJMaW5lKS0+c3RyZW5ndGgpIHsKKyAgICAgICAgICBzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgocHJldkxpbmUsIGxpbmVzK2osIGNvbXBhcmVyKTsKKyAgICAgICAgICBpZihzdHJlbmd0aCA9PSBVQ09MX09GRikgeworICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCoobGluZXMraikpOworICAgICAgICAgIH0KKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gTm90IHN1cmUgYWJvdXQgZWl0aGVyLiBMaXN0IGJvdGggYW5kIHRoZW4gY2hlY2sKKyAgICAgIGlmKCEocHJldklzQ29udHJhY3Rpb24gfHwgY3VycklzQ29udHJhY3Rpb24pKSB7CisgICAgICAgIG5vdGVDb250cmFjdGlvbigqcHJldkxpbmUpOworICAgICAgICBub3RlQ29udHJhY3Rpb24oKmN1cnJMaW5lKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJldkxpbmUgPSBjdXJyTGluZTsKKyAgfQorICBpZihvdXRPZk9yZGVyKSB7CisgICAgaWYoZ1ZlcmJvc2UpIHsKKyAgICAgIHVfZnByaW50Zihsb2csICJcbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gb3V0T2ZPcmRlcjsKK30KKworaW50MzJfdAorZGV0ZWN0Q29udHJhY3Rpb25zKExpbmUgKipnTGluZXMsIExpbmUgKmxpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgaW50MzJfdCBub0NvbnRyYWN0aW9ucyA9IDA7CisgIC8vIENyZWF0ZSBhbmQgY29tcGFyZSBkb3VibGVzOgorICBMaW5lICpiYWNrdXBMaW5lcyA9IG5ldyBMaW5lW3NpemVdOyAKKyAgTGluZTo6Y29weUFycmF5KGJhY2t1cExpbmVzLCBsaW5lcywgc2l6ZSk7IAorICAvLyBkZXRlY3QgY29udHJhY3Rpb25zCisKKyAgTGluZSAqKmdMaW5lc0JhY2t1cCA9IE5VTEw7IC8vbmV3IExpbmUqW3NpemVdOyAKKworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAvLyBwcmVzZXJ2ZSBpbmRleCBhbmQgcHJldmlvdXMKKyAgICBMaW5lOjpjb3B5QXJyYXkobGluZXMsIGJhY2t1cExpbmVzLCBzaXplKTsgCisgICAgZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICB1X3N0cmNweShsaW5lc1tqXS5uYW1lLCBiYWNrdXBMaW5lc1tpXS5uYW1lKTsKKyAgICAgIHVfc3RyY2F0KGxpbmVzW2pdLm5hbWUsIGJhY2t1cExpbmVzW2pdLm5hbWUpOworICAgICAgbGluZXNbal0ubGVuID0gYmFja3VwTGluZXNbaV0ubGVuK2JhY2t1cExpbmVzW2pdLmxlbjsgICAgIAorICAgIH0KKworICAgIGlmKChub0NvbnRyYWN0aW9ucyArPSBhbmFseXplQ29udHJhY3Rpb25zKGdMaW5lcywgc2l6ZSwgY29tcGFyZXIpKSAmJiBnRGVidWcpIHsKKyAgICAgIGlmKGdMaW5lc0JhY2t1cCA9PSBOVUxMKSB7CisgICAgICAgIGdMaW5lc0JhY2t1cCA9IG5ldyBMaW5lKltzaXplXTsKKyAgICAgIH0KKyAgICAgIC8vIFNob3cgdGhlIHNvcnRlZCBkb3VibGVzLCBmb3IgZGVidWdnaW5nCisgICAgICBzZXRBcnJheShnTGluZXNCYWNrdXAsIGxpbmVzLCBzaXplKTsKKyAgICAgIHFzb3J0KGdMaW5lc0JhY2t1cCwgc2l6ZSwgc2l6ZW9mKExpbmUgKiksIGNvbXBhcmVyKTsKKyAgICAgIC8vc2V0SW5kZXhlcyhnTGluZXNCYWNrdXAsIHNpemUpOworICAgICAgYW5hbHl6ZVN0cmVuZ3RoKGdMaW5lc0JhY2t1cCwgc2l6ZSwgY29tcGFyZXIpOworICAgICAgcHJpbnRPcmRlcmluZyhnTGluZXNCYWNrdXAsIHNpemUsIGxvZyk7CisgICAgfQorICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgIHVfZnByaW50Zihsb2csICIuIik7CisgICAgfQorICB9CisgIGlmKCFnUXVpZXQpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiXG4iKTsKKyAgfQorICBkZWxldGVbXSBiYWNrdXBMaW5lczsgCisgIGlmKGdMaW5lc0JhY2t1cCkgeworICAgIGRlbGV0ZVtdIGdMaW5lc0JhY2t1cDsgCisgIH0KKyAgcmV0dXJuIG5vQ29udHJhY3Rpb25zOworfQorCisvLyBnTGluZXMgaW4gdGhpcyBmdW5jdGlvbiBpcyBhbiBhcnJheSBvZiBzb3J0ZWQgcG9pbnRlcnMuCisvLyBDb250cmFjdGlvbnMgYXJlIGFscmVhZHkgaW5jbHVkZWQuIAoraW50MzJfdAorZGV0ZWN0RXhwYW5zaW9ucyhMaW5lICoqZ0xpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgLy8gZGV0ZWN0IGV4cGFuc2lvbnMKKworICBVQ29sQXR0cmlidXRlVmFsdWUgc3RhcnRTdHJlbmd0aCA9IFVDT0xfT0ZGLCBlbmRTdHJlbmd0aCA9IFVDT0xfT0ZGLCAKKyAgICBzdHJlbmd0aCA9IFVDT0xfT0ZGLCBwcmV2aW91c1N0cmVuZ3RoID0gVUNPTF9PRkY7CisgIExpbmUgc3RhcnQsIGVuZCwgc3JjOworICBMaW5lICpzdGFydFAgPSAmc3RhcnQsICplbmRQID0gJmVuZCwgKnNyY1AgPSAmc3JjOworICBMaW5lICpjdXJyZW50ID0gTlVMTDsKKyAgbWVtc2V0KHN0YXJ0UCwgMCwgc2l6ZW9mKExpbmUpKTsKKyAgbWVtc2V0KGVuZFAsIDAsIHNpemVvZihMaW5lKSk7CisgIG1lbXNldChzcmNQLCAwLCBzaXplb2YoTGluZSkpOworICBpbnQzMl90IHNyY0xlbjsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDAsIGsgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICB1X3N0cmNweShzdGFydC5uYW1lLCAoKihnTGluZXMraSkpLT5uYW1lKTsKKyAgICB1X3N0cmNweShlbmQubmFtZSwgKCooZ0xpbmVzK2kpKS0+bmFtZSk7CisgICAgc3JjTGVuID0gKCooZ0xpbmVzK2kpKS0+bGVuOworICAgIHVfc3RyY3B5KHN0YXJ0Lm5hbWUrc3JjTGVuLCAoKihnTGluZXMpKS0+bmFtZSk7CisgICAgc3RhcnQubGVuID0gc3JjTGVuICsgKCooZ0xpbmVzKSktPmxlbjsKKyAgICB1X3N0cmNweShlbmQubmFtZStzcmNMZW4sICgqKGdMaW5lcytzaXplLTEpKS0+bmFtZSk7CisgICAgZW5kLmxlbiA9IHNyY0xlbiArICgqKGdMaW5lcytzaXplLTEpKS0+bGVuOworCisgICAgZm9yKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7IC8vIGsgaXMgaW5kZXggb2YgYSB0aGluZyB0aGF0IGlzIG5vdCBkb3VibGVkCisgICAgICBjdXJyZW50ID0gKihnTGluZXMrayk7CisgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBtb3ZlZCB0byBmcm9udAorICAgICAgLy8gaGFzIGl0IG1vdmVkIHRvIHRoZSB2ZXJ5IGJlZ2dpbmluZworICAgICAgaWYoKHN0YXJ0U3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKChnTGluZXMrayksICZzdGFydFAsIGNvbXBhcmVyKSkgIT0gVUNPTF9PRkYpIHsKKyAgICAgICAgY29udGludWU7IC8vIHRoaXMgb25lIGlzIGluIHRoZSBmcm9udAorICAgICAgfQorICAgICAgLy8gaGFzIGl0IG1vdmVkIHRvIHRoZSB2ZXJ5IGVuZD8KKyAgICAgIGlmKChlbmRTdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJmVuZFAsIChnTGluZXMrayksIGNvbXBhcmVyKSkgIT0gVUNPTF9PRkYpIHsKKyAgICAgICAgY29udGludWU7IC8vIHRoaXMgb25lIGlzIGluIHRoZSBiYWNrCisgICAgICB9CisgICAgICAvLyBQb3RlbnRpYWwgRXhwYW5zaW9uICAgICAKKyAgICAgIGlmKGdEZWJ1ZykgeyAvL2dWZXJib3NlCisgICAgICAgIHVfZnByaW50Zihsb2csICJQb3NzaWJsZSBleHBhbnNpb246ICIpOworICAgICAgICBlc2NhcGVBTGluZSgqKGdMaW5lcytrKSwgbG9nKTsKKyAgICAgICAgdV9mcHJpbnRmKGxvZywgIiAiKTsKKyAgICAgIH0KKyAgICAgIC8vIE5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGV4cGFuc2lvbgorICAgICAgLy8gRmlyc3QsIHdlIGhhdmUgdG8gZmluZCBpdAorICAgICAgdV9zdHJjcHkoc3JjLm5hbWUsICgqKGdMaW5lcytpKSktPm5hbWUpOworICAgICAgZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgIHVfc3RyY3B5KHNyYy5uYW1lK3NyY0xlbiwgKCooZ0xpbmVzK2opKS0+bmFtZSk7CisgICAgICAgIHNyYy5sZW4gPSBzcmNMZW4gKyAoKihnTGluZXMraikpLT5sZW47CisgICAgICAgIGlmKChzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJnNyY1AsIChnTGluZXMrayksIGNvbXBhcmVyKSkgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoKGdMaW5lcytrKSwgJnNyY1AsIGNvbXBhcmVyKTsKKyAgICAgICAgICAvLyB3ZSBmb3VuZCBpdCAqKGdMaW5lcytqLTEpIGlzIHRoZSBlbGVtZW50IHRoYXQgaXMgaW50ZXJlc3RpbmcKKyAgICAgICAgICAvLyBzaW5jZSBnTGluZXMrai0xIDwgZ0xpbmVzK2sgPCBnTGluZXMragorICAgICAgICAgIGlmKGdEZWJ1ZykgeyAvL2dWZXJib3NlCisgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiaSA9ICVpLCBrID0gJWksIGogPSAlaSAiLCBpLCBrLCBqKTsKKyAgICAgICAgICAgIGVzY2FwZUFMaW5lKCooZ0xpbmVzK2kpLCBsb2cpOworICAgICAgICAgICAgZXNjYXBlQUxpbmUoKihnTGluZXMrai0xKSwgbG9nKTsKKyAgICAgICAgICAgIHByaW50U3RyZW5ndGgocHJldmlvdXNTdHJlbmd0aCwgbG9nKTsKKyAgICAgICAgICAgIGVzY2FwZUFMaW5lKGN1cnJlbnQsIGxvZyk7CisgICAgICAgICAgICBwcmludFN0cmVuZ3RoKHN0cmVuZ3RoLCBsb2cpOworICAgICAgICAgICAgZXNjYXBlQUxpbmUoKihnTGluZXMraSksIGxvZyk7CisgICAgICAgICAgICBlc2NhcGVBTGluZSgqKGdMaW5lcytqKSwgbG9nKTsKKyAgICAgICAgICAgIHVfZnByaW50Zihsb2csICJcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGl0IGlzIGEgY29udHJhY3Rpb24gdGhhdCBpcyB0aGUgc2FtZSBhcyBhbiBleHBhbnNpb24KKyAgICAgICAgICAvLyBvciBhIG11bHRpIGNoYXJhY3RlciB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICBjdXJyZW50LT5hZGRFeHBhbnNpb25IaXQoaSwgaik7CisgICAgICAgICAgY3VycmVudC0+aXNFeHBhbnNpb24gPSBUUlVFOworICAgICAgICAgIGN1cnJlbnQtPmV4cEluZGV4ID0gazsKKyAgICAgICAgICAvLyBjYWNoZSBleHBhbnNpb24KKyAgICAgICAgICBnRXhwYW5zaW9ucy5wdXQoVW5pY29kZVN0cmluZyhjdXJyZW50LT5uYW1lLCBjdXJyZW50LT5sZW4pLCBjdXJyZW50LCBzdGF0dXMpOyAvL25ldyBMaW5lKCpjdXJyZW50KQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByZXZpb3VzU3RyZW5ndGggPSBzdHJlbmd0aDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoIWdRdWlldCkgeworICAgICAgdV9mcHJpbnRmKGxvZywgIi4iKTsKKyAgICB9CisgIH0gIAorICBpZighZ1F1aWV0KSB7CisgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgIH0KKyAgLy8gbm93IHdlIGhhdmUgaWRlbnRpZmllZCBwb3NzaWJsZSBleHBhbnNpb25zLiBXZSBuZWVkIHRvIGZpbmQgb3V0IGhvdyBkbyB0aGV5IGV4cGFuZC4gCisgIC8vIExldCdzIGl0ZXJhdGUgb3ZlciBleHBhbnNpb25zIGNhY2hlIC0gaXQncyBlYXNpZXIuCisgIGNvbnN0IFVIYXNoRWxlbWVudCAqZWwgPSBOVUxMOworICBpbnQzMl90IGhhc2hJbmRleCA9IC0xOworICBMaW5lICpkb3VibGVzID0gbmV3IExpbmVbc2l6ZSoxMF07IAorICBMaW5lICoqc29ydGVyID0gbmV3IExpbmUqW3NpemUqMTBdOworICBpbnQzMl90IGN1cnJTaXplID0gMDsKKyAgaW50MzJfdCBuZXdTaXplID0gMDsKKyAgTGluZSAqcHJldiA9IE5VTEw7CisgIExpbmUgKm5leHQgPSBOVUxMOworICBMaW5lICpvcmlnaW4gPSBOVUxMOworICBpbnQgcmVzdWx0ID0gMDsKKyAgLy8gTWFrZSBhIGxpc3Qgb2YgdGhpbmdzIGluIHRoZSB2aW5jaW5pdHkgb2YgZXhwYW5zaW9uIGNhbmRpZGF0ZQorICAvLyBpbiBleHBhbnNpb25QcmVmaXhlcyBhbmQgZXhwYW5zaW9uQWZ0ZXIgd2UgaGF2ZSBzdG9yZWQgdGhlCisgIC8vIHByZWZpeGVzIG9mIHN0dWZmIHRoYXQgY2F1c2VkIHRoZSBkZXRlY3Rpb24gb2YgYW4gZXhwYW5zaW9uCisgIC8vIGFuZCBhIHBvc2l0aW9uIHdoZXJlIHRoZSBleHBhbnNpb24gd2FzLiAKKyAgLy8gRm9yIGV4YW1wbGUgKGljdSwgZGVfX1BIT05FQk9PSyksIHdlIGhhZDoKKyAgLy8gYUUgPDw8IFx1MDBFNCA8IGFmCisgIC8vIEFEIDwgXHUwMEU0IDw8PCBBZQorICAvLyBGcm9tIHRoYXQgd2Ugd2lsbCBjb25zdHJ1Y3QgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKyAgLy8gQUQgPCBhRSA8PDwgXHUwMEU0LyA8PDwgQWUgPCBhZgorICAvLyB0aGVuIHdlIHdpbGwgdGFrZSB0aGUgdmluY2luaXR5IG9mIFx1MDBFNDoKKyAgLy8gYUUgPDw8IFx1MDBFNC8gPDw8IEFlCisgIC8vIHRoZW4gd2Ugd2lsbCBjaG9vc2UgdGhlIHNtYWxsZXN0IGV4cGFuc2lvbiB0byBiZSB0aGUgZXhwYW5zaW9uCisgIC8vIHBhcnQ6ICdlJy4KKyAgLy8gaWYgdGhlcmUgaXMgZXF1YWxpdHksIHdlIGNob29zZSB0aGUgZXF1YWwgcGFydDoKKyAgLy8gKHdpbjMyLCBkZV9fUEhPTkVCT09LKToKKyAgLy8gQUQgPCBcdTAwRTQvID0gYWUgPDw8IGFFIDw8PCBBZQorICAvLyB3ZSBjaG9vc2UgJ2UnLgorCisgIHdoaWxlKChlbCA9IGdFeHBhbnNpb25zLm5leHRFbGVtZW50KGhhc2hJbmRleCkpICE9IE5VTEwpIHsKKyAgICBuZXdTaXplID0gMDsKKyAgICBjdXJyZW50ID0gKExpbmUgKillbC0+dmFsdWUucG9pbnRlcjsKKyAgICBjdXJyU2l6ZSA9IHNpemUqY3VycmVudC0+ZXhwYW5zaW9uUHJlZml4ZXNTaXplOworICAgIGlmKGdEZWJ1ZykgeworICAgICAgZXNjYXBlQUxpbmUoY3VycmVudCwgbG9nKTsKKyAgICAgIHVfZnByaW50Zihsb2csICIgTnVtYmVyOiAlaVxuIiwgY3VycmVudC0+ZXhwYW5zaW9uUHJlZml4ZXNTaXplKTsKKyAgICB9CisgICAgLy8gY29uc3RydWN0IHRoZSBkb3VibGVzIAorICAgIGZvcihpID0gMDsgaSA8IGN1cnJlbnQtPmV4cGFuc2lvblByZWZpeGVzU2l6ZTsgaSsrKSB7CisgICAgICBkb3VibGVzW25ld1NpemVdLnN1ZmZpeCA9IGN1cnJlbnQtPmV4cGFuc2lvbkFmdGVyW2ldLTE7CisgICAgICBkb3VibGVzW25ld1NpemUrK10uc2V0VG9Db25jYXQoKihnTGluZXMrY3VycmVudC0+ZXhwYW5zaW9uUHJlZml4ZXNbaV0pLCAqKGdMaW5lcytjdXJyZW50LT5leHBhbnNpb25BZnRlcltpXS0xKSk7CisgICAgICBkb3VibGVzW25ld1NpemVdLnN1ZmZpeCA9IGN1cnJlbnQtPmV4cGFuc2lvbkFmdGVyW2ldOworICAgICAgZG91Ymxlc1tuZXdTaXplKytdLnNldFRvQ29uY2F0KCooZ0xpbmVzK2N1cnJlbnQtPmV4cGFuc2lvblByZWZpeGVzW2ldKSwgKihnTGluZXMrY3VycmVudC0+ZXhwYW5zaW9uQWZ0ZXJbaV0pKTsKKyAgICB9CisgICAgLy8gYWRkIHRoZSBleHBhbnNpb24gd2UncmUgb2JzZXJ2aW5nCisgICAgZG91Ymxlc1tuZXdTaXplKytdID0gKmN1cnJlbnQ7CisgICAgc2V0QXJyYXkoc29ydGVyLCBkb3VibGVzLCBuZXdTaXplKTsKKyAgICBxc29ydChzb3J0ZXIsIG5ld1NpemUsIHNpemVvZihMaW5lKiksIGNvbXBhcmVyKTsKKyAgICBhbmFseXplU3RyZW5ndGgoc29ydGVyLCBuZXdTaXplLCBjb21wYXJlcik7CisgICAgaWYoZ0RlYnVnKSB7CisgICAgICBwcmludE9yZGVyaW5nKHNvcnRlciwgbmV3U2l6ZSwgbG9nKTsKKyAgICB9CisgICAgaSA9IDA7CisgICAgd2hpbGUoKiooc29ydGVyK2kpICE9ICpjdXJyZW50KSB7CisgICAgICBpKys7CisgICAgfQorICAgIC8vIGZpbmQgdGhlIHR3byBhZGRpdGlvbnMKKyAgICBpZigoKihzb3J0ZXIraSkpLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgLy8gaWYgd2UgYWUgaWQKKyAgICAgIG9yaWdpbiA9ICooZ0xpbmVzKygoKihzb3J0ZXIraS0xKSktPnN1ZmZpeCkpOworICAgICAgdV9zdHJjcHkoY3VycmVudC0+ZXhwYW5zaW9uU3RyaW5nLCBvcmlnaW4tPm5hbWUpOworICAgICAgY3VycmVudC0+ZXhwTGVuID0gb3JpZ2luLT5sZW47CisgICAgfSBlbHNlIGlmKGkgPCBuZXdTaXplLTEgJiYgKCooc29ydGVyK2krMSkpLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgb3JpZ2luID0gKihnTGluZXMrKCgqKHNvcnRlcitpKzEpKS0+c3VmZml4KSk7CisgICAgICB1X3N0cmNweShjdXJyZW50LT5leHBhbnNpb25TdHJpbmcsIG9yaWdpbi0+bmFtZSk7CisgICAgICBjdXJyZW50LT5leHBMZW4gPSBvcmlnaW4tPmxlbjsKKyAgICB9IGVsc2UgeworICAgICAgaWYoaSA+IDApIHsKKyAgICAgICAgcHJldiA9ICooZ0xpbmVzKygqKHNvcnRlcitpLTEpKS0+c3VmZml4KTsKKyAgICAgICAgaWYoaSA8IG5ld1NpemUtMSkgeworICAgICAgICAgIG5leHQgPSAqKGdMaW5lcysoKihzb3J0ZXIraSsxKSktPnN1ZmZpeCk7CisgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZXIoJnByZXYsICZuZXh0KTsKKyAgICAgICAgICBpZihyZXN1bHQgPD0gMCkgeworICAgICAgICAgICAgdV9zdHJjcHkoY3VycmVudC0+ZXhwYW5zaW9uU3RyaW5nLCBwcmV2LT5uYW1lKTsKKyAgICAgICAgICAgIGN1cnJlbnQtPmV4cExlbiA9IHByZXYtPmxlbjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdV9zdHJjcHkoY3VycmVudC0+ZXhwYW5zaW9uU3RyaW5nLCBuZXh0LT5uYW1lKTsKKyAgICAgICAgICAgIGN1cnJlbnQtPmV4cExlbiA9IG5leHQtPmxlbjsKKyAgICAgICAgICB9CisgICAgICAgIH0gICAgICAKKyAgICAgIH0KKyAgICAgIGlmKDApIHsgLy9pZihnRGVidWcpCisgICAgICAgIHVfZnByaW50Zihsb2csICJFeHBhbnNpb24gaXM6ICIpOworICAgICAgICBlc2NhcGVBTGluZShjdXJyZW50LCBsb2cpOworICAgICAgICB1X2ZwcmludGYobG9nLCAiLyIpOworICAgICAgICBlc2NhcGVFeHBhbnNpb24oY3VycmVudCwgbG9nKTsKKyAgICAgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgICAgICB9CisgICAgfQorICAgIG5vdGVFeHBhbnNpb24oY3VycmVudCk7CisgICAgLy9ub3RlRXhwYW5zaW9uKGdMaW5lcywgY3VycmVudCwgc2l6ZSwgY29tcGFyZXIpOworICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgIHVfZnByaW50Zihsb2csICIuIik7CisgICAgfQorICB9CisgIGlmKCFnUXVpZXQpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiXG4iKTsKKyAgfQorICBkZWxldGVbXSBkb3VibGVzOworICBkZWxldGVbXSBzb3J0ZXI7CisgIHJldHVybiBnRXhwYW5zaW9ucy5jb3VudCgpOworfQorCitVQm9vbAoraXNUYWlsb3JlZChMaW5lICpsaW5lLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgVUJvb2wgcmVzdWx0ID0gRkFMU0U7CisgIFVDb2xsYXRpb25FbGVtZW50cyAqdGFpbG9yaW5nID0gdWNvbF9vcGVuRWxlbWVudHMoZ0NvbCwgbGluZS0+bmFtZSwgbGluZS0+bGVuLCAmc3RhdHVzKTsKKyAgVUNvbGxhdGlvbkVsZW1lbnRzICp1Y2EgPSB1Y29sX29wZW5FbGVtZW50cyhnVUNBLCBsaW5lLT5uYW1lLCBsaW5lLT5sZW4sICZzdGF0dXMpOworCisgIGludDMyX3QgdGFpbEVsZW1lbnQgPSBVQ09MX05VTExPUkRFUjsKKyAgaW50MzJfdCB1Y2FFbGVtZW50ID0gVUNPTF9OVUxMT1JERVI7CisKKyAgZG8geworICAgIGRvIHsKKyAgICAgIHRhaWxFbGVtZW50ID0gdWNvbF9uZXh0KHRhaWxvcmluZywgJnN0YXR1cyk7CisgICAgfSB3aGlsZSh0YWlsRWxlbWVudCA9PSAwKTsKKyAgICBkbyB7CisgICAgICB1Y2FFbGVtZW50ID0gdWNvbF9uZXh0KHVjYSwgJnN0YXR1cyk7CisgICAgfSB3aGlsZSh1Y2FFbGVtZW50ID09IDApOworICAgIGlmKHRhaWxFbGVtZW50ICE9IHVjYUVsZW1lbnQpIHsKKyAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHRhaWxFbGVtZW50ICE9IFVDT0xfTlVMTE9SREVSICYmIHVjYUVsZW1lbnQgIT0gVUNPTF9OVUxMT1JERVIpOworCisgIHVjb2xfY2xvc2VFbGVtZW50cyh0YWlsb3JpbmcpOworICB1Y29sX2Nsb3NlRWxlbWVudHModWNhKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorcmVkdWNlVW50YWlsb3JlZChMaW5lICoqZ0xpbmVzLCBpbnQzMl90IHNpemUpeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgTGluZSAqY3VycmVudCA9ICooZ0xpbmVzKTsKKyAgTGluZSAqcHJldmlvdXMgPSBOVUxMOworICB3aGlsZShjdXJyZW50KSB7CisgICAgLy8gaWYgdGhlIGN1cnJlbnQgbGluZSBpcyBub3QgdGFpbG9yZWQgYWNjb3JkaW5nIHRvIHRoZSBVQ0EKKyAgICBpZighaXNUYWlsb3JlZChjdXJyZW50LCBzdGF0dXMpKSB7CisgICAgICAvLyB3ZSByZW1vdmUgaXQKKyAgICAgIGN1cnJlbnQtPmlzUmVtb3ZlZCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGlmIGl0J3MgdGFpbG9yZWQgCisgICAgICBpZihjdXJyZW50LT5wcmV2aW91cyAmJiBjdXJyZW50LT5wcmV2aW91cy0+aXNSZW1vdmVkID09IFRSVUUpIHsKKyAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50LT5wcmV2aW91czsKKyAgICAgICAgd2hpbGUocHJldmlvdXMgJiYgKHByZXZpb3VzLT5zdHJlbmd0aCA+IGN1cnJlbnQtPnN0cmVuZ3RoIHx8IHByZXZpb3VzLT5pc0V4cGFuc2lvbiB8fCBwcmV2aW91cy0+aXNDb250cmFjdGlvbikgJiYgcHJldmlvdXMtPmlzUmVtb3ZlZCkgeworICAgICAgICAgIGlmKHByZXZpb3VzLT5wcmV2aW91cyAmJiBwcmV2aW91cy0+cHJldmlvdXMtPmlzUmVtb3ZlZCkgeworICAgICAgICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy0+cHJldmlvdXM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihwcmV2aW91cykgeworICAgICAgICAgIHByZXZpb3VzLT5pc1Jlc2V0ID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoKihnTGluZXMpKS0+aXNSZXNldCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgIH0KK30KKwordm9pZAorY29uc3RydWN0QW5kQW5hbHl6ZShMaW5lICoqZ0xpbmVzLCBMaW5lICpsaW5lcywgaW50MzJfdCBzaXplLCBDb21wYXJlRm4gY29tcGFyZXIpIHsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDAsIGsgPSAwOworICAvLyBzZXR1cCBvdXIgY29tcGFyZSBhcnJheXMgdG8gcG9pbnQgdG8gc2luZ2xlIHNldC4KKworICAvLyBGb3IgY29udHJhY3Rpb25zIHdlIG5lZWQgYSBibG9jayBvZiBkYXRhCisgIHNldEFycmF5KGdMaW5lcywgbGluZXMsIHNpemUpOworICAvL3NpemUgPSBzZXRBcnJheShnTGluZXMpOworCisgIHFzb3J0KGdMaW5lcywgc2l6ZSwgc2l6ZW9mKExpbmUgKiksIGNvbXBhcmVyKTsKKworICAvLyBFc3RhYmxpc2ggd2hvIGlzIHByZXZpb3VzIGFjY29yZGluZyB0byB0aGUgc29ydCBvcmRlcgorICAvL3NldEluZGV4ZXMoZ0xpbmVzLCBzaXplKTsKKworICBhbmFseXplU3RyZW5ndGgoZ0xpbmVzLCBzaXplLCBjb21wYXJlcik7CisgIGlmKGdWZXJib3NlKSB7CisgICAgdV9mcHJpbnRmKGxvZywgIk9yZGVyaW5nOlxuIik7CisgICAgcHJpbnRPcmRlcmluZyhnTGluZXMsIHNpemUsIGxvZyk7CisgIH0KKworICAvL3Nob3dEaWZmZXJlbmNlcyhleGVtcGxhclNldFNpemUpOworICAvL2R1bXBEYXRhKGV4ZW1wbGFyU2V0U2l6ZSk7CisKKyAgaWYoIWdRdWlldCkgeworICAgIHVfZnByaW50Zihsb2csICJEZXRlY3RpbmcgY29udHJhY3Rpb25zP1xuIik7CisgIH0KKyAgaW50MzJfdCBub0NvbnRyYWN0aW9ucyA9IDA7CisgIG5vQ29udHJhY3Rpb25zID0gZGV0ZWN0Q29udHJhY3Rpb25zKGdMaW5lcywgbGluZXMsIHNpemUsIGNvbXBhcmVyKTsKKyAgaWYoIWdRdWlldCkgeworICAgIHVfZnByaW50Zihsb2csICJEZXRlY3RlZCAlaSBjb250cmFjdGlvbnNcbiIsIG5vQ29udHJhY3Rpb25zKTsKKyAgfQorCisgIC8vIG5vdyB3ZSBoYXZlIHN1c3BlY3RlZCBjb250cmFjdGlvbnMgaW4gdGhlIHRhYmxlCisgIC8vIHdlIGhhdmUgdG8gcmUtc29ydCB0aGUgdGhpbmdzIAorICBzaXplID0gc2V0QXJyYXkoZ0xpbmVzKTsKKyAgcXNvcnQoZ0xpbmVzLCBzaXplLCBzaXplb2YoTGluZSAqKSwgY29tcGFyZXIpOworICBhbmFseXplU3RyZW5ndGgoZ0xpbmVzLCBzaXplLCBjb21wYXJlcik7CisKKyAgaWYoIWdRdWlldCkgeworICAgIHVfZnByaW50Zihsb2csICJEZXRlY3RpbmcgZXhwYW5zaW9uc1xuIik7CisgIH0KKyAgaW50MzJfdCBub0V4cGFuc2lvbnMgPSBkZXRlY3RFeHBhbnNpb25zKGdMaW5lcywgc2l6ZSwgY29tcGFyZXIpOworICBpZighZ1F1aWV0KSB7CisgICAgdV9mcHJpbnRmKGxvZywgIkRldGVjdGVkICVpIGV4cGFuc2lvbnNcbiIsIG5vRXhwYW5zaW9ucyk7CisgIH0KKworICBwb3NpdGlvbkV4cGFuc2lvbnMoZ0xpbmVzLCBzaXplLCBjb21wYXJlcik7CisKKyAgaWYoZ1ZlcmJvc2UpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiQWZ0ZXIgcG9zaXRpb25pbmcgZXhwYW5zaW9uczpcbiIpOworICAgIHByaW50T3JkZXJpbmcoZ0xpbmVzLCBzaXplLCBsb2csIFRSVUUpOworICB9CisgIC8vcmVkdWNlVW50YWlsb3JlZChnTGluZXMsIHNpemUpOworICBpZighZ1F1aWV0KSB7CisgICAgdV9mcHJpbnRmKG91dCwgIkZpbmFsIHJlc3VsdFxuIik7CisgIH0KKyAgcHJpbnRPcmRlcmluZyhnTGluZXMsIHNpemUsIG91dCwgVFJVRSk7CisgIHByaW50T3JkZXJpbmcoZ0xpbmVzLCBzaXplLCBsb2csIFRSVUUpOworfQorCisvLyBDaGVjayB3aGV0aGVyIHVwcGVyIGNhc2UgY29tZXMgYmVmb3JlIGxvd2VyIGNhc2Ugb3IgdmljZS12ZXJzYQoraW50MzJfdCAKK2NoZWNrQ2FzZU9yZGVyaW5nKHZvaWQpIHsKKyAgVUNoYXIgc3R1ZmZbXVszXSA9IHsKKyAgICB7IDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDYxfSwgLy8iYWEiLAorICAgIHsgMHgwMDYxLCBzZXBhcmF0b3JDaGFyLCAweDAwNDEgfSwgLy8iYVxcdTAwRTAiLAorICAgIHsgMHgwMDQxLCBzZXBhcmF0b3JDaGFyLCAweDAwNjEgfSwgLy8iXFx1MDBFMGEiLAorICAgIHsgMHgwMDQxLCBzZXBhcmF0b3JDaGFyLCAweDAwNDEgfSwgLy8iXFx1MDBFMGEiLAorICAgIC8veyAweDAwRTAsIHNlcGFyYXRvckNoYXIsIDB4MDBFMCB9ICAvLyJcXHUwMEUwXFx1MDBFMCIKKyAgfTsKKyAgY29uc3QgaW50MzJfdCBzaXplID0gc2l6ZW9mKHN0dWZmKS9zaXplb2Yoc3R1ZmZbMF0pOworCisgIExpbmUgKipzb3J0ZWRMaW5lcyA9IG5ldyBMaW5lKltzaXplXTsKKyAgTGluZSBsaW5lc1tzaXplXTsKKworICBpbnQzMl90IGkgPSAwOworICBpbnQzMl90IG9yZGVyZWQgPSAwLCByZXZlcnNlZCA9IDA7CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgbGluZXNbaV0uc2V0TmFtZShzdHVmZltpXSwgMyk7CisgIH0KKyAgc2V0QXJyYXkoc29ydGVkTGluZXMsIGxpbmVzLCBzaXplKTsKKyAgcXNvcnQoc29ydGVkTGluZXMsIHNpemUsIHNpemVvZihMaW5lKiksIGdDb21wYXJlcik7CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbaV0pIHsKKyAgICAgIG9yZGVyZWQrKzsKKyAgICB9CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbc2l6ZS1pLTFdKSB7CisgICAgICByZXZlcnNlZCsrOworICAgIH0KKyAgfQorCisgIGRlbGV0ZVtdIHNvcnRlZExpbmVzOworICBpZihvcmRlcmVkID09IHNpemUpIHsKKyAgICByZXR1cm4gMDsgLy8gaW4gbm9ybWFsIG9yZGVyCisgIH0gZWxzZSBpZihyZXZlcnNlZCA9PSBzaXplKSB7CisgICAgcmV0dXJuIDE7IC8vIGluIHJldmVyc2VkIG9yZGVyCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOyAvLyB1bmtub3duIG9yZGVyCisgIH0KK30KKworCisvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWNvbmRhcmllcyBhcmUgaW4gdGhlIHN0cmFpZ2h0IG9yIHJldmVyc2VkIG9yZGVyCitpbnQzMl90IAorY2hlY2tTZWNvbmRhcnlPcmRlcmluZyh2b2lkKSB7CisgIFVDaGFyIHN0dWZmW11bNV0gPSB7CisgICAgeyAweDAwNjEsIHNlcGFyYXRvckNoYXIsIDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMEUwIH0sIC8vImFhIiwKKyAgICB7IDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMEUwLCBzZXBhcmF0b3JDaGFyLCAweDAwNjEgfSwgLy8iYVxcdTAwRTAiLAorICAgIHsgMHgwMEUwLCBzZXBhcmF0b3JDaGFyLCAweDAwNjEsIHNlcGFyYXRvckNoYXIsIDB4MDA2MSB9LCAvLyJcXHUwMEUwYSIsCisgICAgLy97IDB4MDBFMCwgc2VwYXJhdG9yQ2hhciwgMHgwMEUwIH0gIC8vIlxcdTAwRTBcXHUwMEUwIgorICB9OworICBjb25zdCBpbnQzMl90IHNpemUgPSBzaXplb2Yoc3R1ZmYpL3NpemVvZihzdHVmZlswXSk7CisKKyAgTGluZSAqKnNvcnRlZExpbmVzID0gbmV3IExpbmUqW3NpemVdOworICBMaW5lIGxpbmVzW3NpemVdOworCisgIGludDMyX3QgaSA9IDA7CisgIGludDMyX3Qgb3JkZXJlZCA9IDAsIHJldmVyc2VkID0gMDsKKworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBsaW5lc1tpXS5zZXROYW1lKHN0dWZmW2ldLCA1KTsKKyAgfQorICBzZXRBcnJheShzb3J0ZWRMaW5lcywgbGluZXMsIHNpemUpOworICBxc29ydChzb3J0ZWRMaW5lcywgc2l6ZSwgc2l6ZW9mKExpbmUqKSwgZ0NvbXBhcmVyKTsKKworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZigqKHNvcnRlZExpbmVzK2kpID09ICZsaW5lc1tpXSkgeworICAgICAgb3JkZXJlZCsrOworICAgIH0KKyAgICBpZigqKHNvcnRlZExpbmVzK2kpID09ICZsaW5lc1tzaXplLWktMV0pIHsKKyAgICAgIHJldmVyc2VkKys7CisgICAgfQorICB9CisKKyAgZGVsZXRlW10gc29ydGVkTGluZXM7CisgIGlmKG9yZGVyZWQgPT0gc2l6ZSkgeworICAgIHJldHVybiAwOyAvLyBpbiBub3JtYWwgb3JkZXIKKyAgfSBlbHNlIGlmKHJldmVyc2VkID09IHNpemUpIHsKKyAgICByZXR1cm4gMTsgLy8gaW4gcmV2ZXJzZWQgb3JkZXIKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7IC8vIHVua25vd24gb3JkZXIKKyAgfQorfQorCisvLyBXZSBoYXZlIHRvIHJlbW92ZSBpZ25vcmFibGUgY2hhcmFjdGVycyBmcm9tIHRoZSBleGVtcGxhciBzZXQsCisvLyBvdGhlcndpc2UsIHdlIGdldCBtZXNzZWQgdXAgcmVzdWx0cwordm9pZCByZW1vdmVJZ25vcmFibGVDaGFycyhVbmljb2RlU2V0ICZleGVtcGxhclVTZXQsIENvbXBhcmVGbiBjb21wYXJlciwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIFVuaWNvZGVTZXQgaWdub3JhYmxlcywgcHJpbWFyeUlnbm9yYWJsZXM7CisgIFVuaWNvZGVTZXRJdGVyYXRvciBleGVtcGxhclVTZXRJdGVyKGV4ZW1wbGFyVVNldCk7CisgIGV4ZW1wbGFyVVNldEl0ZXIucmVzZXQoKTsKKyAgTGluZSBlbXB0eTsKKyAgTGluZSAqZW1wdHlQID0gJmVtcHR5OworICBMaW5lIGN1cnJlbnQ7CisgIExpbmUgKmN1cnJMaW5lID0gJmN1cnJlbnQ7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCA9IFVDT0xfT0ZGOworCisKKyAgd2hpbGUoZXhlbXBsYXJVU2V0SXRlci5uZXh0KCkpIHsKKyAgICBpZihleGVtcGxhclVTZXRJdGVyLmlzU3RyaW5nKCkpIHsgLy8gcHJvY2VzcyBhIHN0cmluZworICAgICAgdV9tZW1jcHkoY3VyckxpbmUtPm5hbWUsIGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkuZ2V0QnVmZmVyKCksIGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkubGVuZ3RoKCkpOworICAgICAgY3VyckxpbmUtPmxlbiA9IGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkubGVuZ3RoKCk7CisgICAgICBzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJmVtcHR5UCwgJmN1cnJMaW5lLCBjb21wYXJlcik7CisgICAgICBpZihzdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICBpZ25vcmFibGVzLmFkZChleGVtcGxhclVTZXRJdGVyLmdldFN0cmluZygpKTsKKyAgICAgIH0gZWxzZSBpZihzdHJlbmd0aCA+IFVDT0xfUFJJTUFSWSkgeworICAgICAgICBwcmltYXJ5SWdub3JhYmxlcy5hZGQoZXhlbXBsYXJVU2V0SXRlci5nZXRTdHJpbmcoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBVQm9vbCBpc0Vycm9yID0gRkFMU0U7CisgICAgICBVQ2hhcjMyIGNvZGVQb2ludCA9IGV4ZW1wbGFyVVNldEl0ZXIuZ2V0Q29kZXBvaW50KCk7CisgICAgICBjdXJyTGluZS0+bGVuID0gMDsKKyAgICAgIFUxNl9BUFBFTkQoY3VyckxpbmUtPm5hbWUsIGN1cnJMaW5lLT5sZW4sIDI1LCBjb2RlUG9pbnQsIGlzRXJyb3IpOworICAgICAgc3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKCZlbXB0eVAsICZjdXJyTGluZSwgY29tcGFyZXIpOworICAgICAgaWYoc3RyZW5ndGggPT0gVUNPTF9JREVOVElDQUwpIHsKKyAgICAgICAgaWdub3JhYmxlcy5hZGQoY29kZVBvaW50KTsKKyAgICAgIH0gZWxzZSBpZihzdHJlbmd0aCA+IFVDT0xfUFJJTUFSWSkgeworICAgICAgICBwcmltYXJ5SWdub3JhYmxlcy5hZGQoY29kZVBvaW50KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisKKyAgZXhlbXBsYXJVU2V0LnJlbW92ZUFsbChpZ25vcmFibGVzKTsKKyAgZXhlbXBsYXJVU2V0LnJlbW92ZUFsbChwcmltYXJ5SWdub3JhYmxlcyk7CisKKyAgVW5pY29kZVN0cmluZyByZW1vdmVkUGF0dGVybjsKKyAgaWYoaWdub3JhYmxlcy5zaXplKCkpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiSWdub3JhYmxlczpcbiIpOworICAgIGlnbm9yYWJsZXMudG9QYXR0ZXJuKHJlbW92ZWRQYXR0ZXJuLCBUUlVFKTsKKyAgICByZW1vdmVkUGF0dGVybi5zZXRDaGFyQXQocmVtb3ZlZFBhdHRlcm4ubGVuZ3RoKCksIDApOworICAgIGVzY2FwZVN0cmluZyhyZW1vdmVkUGF0dGVybi5nZXRCdWZmZXIoKSwgcmVtb3ZlZFBhdHRlcm4ubGVuZ3RoKCksIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgIH0KKyAgaWYocHJpbWFyeUlnbm9yYWJsZXMuc2l6ZSgpKSB7CisgICAgdV9mcHJpbnRmKGxvZywgIlByaW1hcnkgaWdub3JhYmxlczpcbiIpOworICAgIHByaW1hcnlJZ25vcmFibGVzLnRvUGF0dGVybihyZW1vdmVkUGF0dGVybiwgVFJVRSk7CisgICAgcmVtb3ZlZFBhdHRlcm4uc2V0Q2hhckF0KHJlbW92ZWRQYXR0ZXJuLmxlbmd0aCgpLCAwKTsKKyAgICBlc2NhcGVTdHJpbmcocmVtb3ZlZFBhdHRlcm4uZ2V0QnVmZmVyKCksIHJlbW92ZWRQYXR0ZXJuLmxlbmd0aCgpLCBsb2cpOworICAgIHVfZnByaW50Zihsb2csICJcbiIpOworICB9CisKK30KKworLy8gVE9ETzogZGV2ZWxvcCBsb2dpYyBmb3IgY2hvb3NpbmcgYm91bmRhcnkgY2hhcmFjdGVycyAtIHJpZ2h0IG5vdyBpdCBpcyBoYXJkY29kZWQKKy8vIEl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9mIHVzZWQgc2NyaXB0cy4gQWxzbywgY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHNhdmUgCisvLyB1c2VkIHNjcmlwdCBuYW1lcwordm9pZCBhZGRVdGlsaXR5Q2hhcnMoVW5pY29kZVNldCAmZXhlbXBsYXJVU2V0LCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKworICAvLyBpbiBvcmRlciB0byBnZXQgbmljZSBydWxlcywgd2UgbmVlZCB0byBhZGQgc29tZSBjaGFyYWN0ZXJzIHRvIHRoZQorICAvLyBzdGFydGluZyBzZXQuIFRoZXNlIGFyZSBtb3N0bHkgcGFydHMgb2YgY29tcGF0aWJpdHkgY29tcG9zZWQgY2hhcmFjdGVycywKKyAgLy8gc3VjaCBhcyBMLW1pZGRsZSBkb3QgKG1pZGRsZSBkb3QgaXMgMHgwMEI3KS4gSWYgd2UgZG9uJ3QgYWRkIHRoZXNlLCB3ZSB3b3VsZAorICAvLyBnZXQgYSByZXNldCBhdCBhIGZ1bmt5IGNoYXJhY3Rlciwgc3VjaCBhcyBMLW1pZGRsZSBkb3QuIFRoaXMgbGlzdCB3aWxsIHByb2JhYmx5CisgIC8vIGdyb3cuCisgIGV4ZW1wbGFyVVNldC5hZGQoMHgwMEI3KTsKKworICAvLyB0aGVzZSB0aGluZ3MgcmVwcmVzZW50IGEgc2NyaXB0IGJlZm9yZSB0aGUgdGFyZ2V0IHNjcmlwdCBhbmQgCisgIC8vIGEgc2NyaXB0IGFmdGVyLiBNb3JlIGxvZ2ljIHNob3VsZCBiZSBhZGRlZCBzbyB0aGF0IHRoZXNlIGNoYXJhY3RlcnMgYXJlCisgIC8vIGNob3NlbiBhdXRvbWF0aWNhbGx5CisKKyAgZXhlbXBsYXJVU2V0LmFkZCgweDAwMzgpOworICBleGVtcGxhclVTZXQuYWRkKDB4MDAzOSk7CisKKyAgLy9leGVtcGxhclVTZXQuYWRkKDB4MDQzMyk7CisgIC8vZXhlbXBsYXJVU2V0LmFkZCgweDA0MzYpOworICBleGVtcGxhclVTZXQuYWRkKDB4ZmEyOSk7CisgIGV4ZW1wbGFyVVNldC5hZGQoMHhmYTI4KTsKK30KKwordm9pZAorZ2V0RXhlbXBsYXJzKGNvbnN0IGNoYXIgKmxvY2FsZSwgVW5pY29kZVNldCAmZXhlbXBsYXJzLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgLy8gZmlyc3Qgd2UgZmlsbCBvdXQgc3RydWN0dXJlcyB3aXRoIGV4ZW1wbGFyIGNoYXJhY3RlcnMuCisgIFVSZXNvdXJjZUJ1bmRsZSAqcmVzID0gdXJlc19vcGVuKE5VTEwsIGxvY2FsZSwgJnN0YXR1cyk7CisgIGludDMyX3QgZXhlbXBsYXJMZW5ndGggPSAwOworICBVbmljb2RlU3RyaW5nIGV4ZW1wbGFyU3RyaW5nID0gdXJlc19nZXRVbmljb2RlU3RyaW5nQnlLZXkocmVzLCAiRXhlbXBsYXJDaGFyYWN0ZXJzIiwgJnN0YXR1cyk7CisgIGV4ZW1wbGFycy5jbGVhcigpOworICBleGVtcGxhcnMuYXBwbHlQYXR0ZXJuKGV4ZW1wbGFyU3RyaW5nLCBzdGF0dXMpOworICB1cmVzX2Nsb3NlKHJlcyk7Cit9CisKK3ZvaWQKK3ByZXBhcmVTdGFydGluZ1NldChVbmljb2RlU2V0ICZleGVtcGxhclVTZXQsIENvbXBhcmVGbiBjb21wYXJlciwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIGludDMyX3QgaSA9IDA7CisgIFVuaWNvZGVTdHJpbmcgZXhlbXBsYXJTdHJpbmc7CisgIGV4ZW1wbGFyVVNldC50b1BhdHRlcm4oZXhlbXBsYXJTdHJpbmcpOworICAvLyBQcm9kdWNlIGNhc2UgY2xvc3VyZSBvZiBleGVtcGxhciBjaGFyYWN0ZXJzCisgIC8vIFRoZW4gd2Ugd2FudCB0byBmaWd1cmUgb3V0IHdoYXQgaXMgdGhlIHNjcmlwdCBvZiB0aGUgZXhlbXBsYXIgY2hhcmFjdGVycworICAvLyBqdXN0IHBpY2sgc2V2ZXJhbCBhbmQgc2VlIHRoZWlyIHNjcmlwdAorICBjb25zdCBjaGFyKiB1c2VkU2NyaXB0TmFtZXNbVVNDUklQVF9DT0RFX0xJTUlUXTsKKyAgaW50MzJfdCBudW1iZXJPZlVzZWRTY3JpcHRzID0gMDsKKyAgY2hhciBzY3JpcHRTZXRQYXR0ZXJuWzI1Nl07CisgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsgLy8gZm9yIGRlYnVnZ2luZworICBVQ2hhcjMyIGV4Q2hhciA9IC0xOworICB3aGlsZShleGVtcGxhclVTZXQuc2l6ZSgpICE9IDAgJiYgKGV4Q2hhciA9IGV4ZW1wbGFyVVNldC5jaGFyQXQoMCkpICE9IC0xKSB7IAorICAgIGludDMyX3Qgc2NyaXB0Tm8gPSB1X2dldEludFByb3BlcnR5VmFsdWUoZXhDaGFyLCBVQ0hBUl9TQ1JJUFQpOworICAgIHVzZWRTY3JpcHROYW1lc1tudW1iZXJPZlVzZWRTY3JpcHRzXSA9IHVfZ2V0UHJvcGVydHlWYWx1ZU5hbWUoVUNIQVJfU0NSSVBULCBzY3JpcHRObywgVV9TSE9SVF9QUk9QRVJUWV9OQU1FKTsKKyAgICBzcHJpbnRmKHNjcmlwdFNldFBhdHRlcm4sICJbOiVzOl0iLCB1c2VkU2NyaXB0TmFtZXNbbnVtYmVyT2ZVc2VkU2NyaXB0c10pOworICAgIG51bWJlck9mVXNlZFNjcmlwdHMrKzsKKyAgICBVbmljb2RlU2V0IHNjcmlwdFNldChVbmljb2RlU3RyaW5nKHNjcmlwdFNldFBhdHRlcm4sICIiKSwgc3RhdHVzKTsKKyAgICBleGVtcGxhclVTZXQucmVtb3ZlQWxsKHNjcmlwdFNldCk7CisgICAgZXhlbXBsYXJVU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKTsKKyAgfQorICBleGVtcGxhclVTZXQuY2xlYXIoKTsKKworICAvLyBhbHdheXMgYWRkIEFTQ0lJCisgIC8vZXhlbXBsYXJVU2V0LmFkZEFsbChVbmljb2RlU2V0KFVuaWNvZGVTdHJpbmcoIltcXHUwMDIwLVxcdTAwN2ZdIiwgIiIpLCBzdGF0dXMpKTsKKyAgZXhlbXBsYXJVU2V0LmFkZEFsbChVbmljb2RlU2V0KFVuaWNvZGVTdHJpbmcoIltcXHUwMDQxLVxcdTAwNWJdIiwgIiIpLCBzdGF0dXMpKTsKKyAgaWYoZ0V4ZW1wbGFyKSB7CisgICAgZXhlbXBsYXJVU2V0LmFwcGx5UGF0dGVybihleGVtcGxhclN0cmluZywgc3RhdHVzKTsKKyAgICBleGVtcGxhclVTZXQuY2xvc2VPdmVyKFVTRVRfQ0FTRSk7CisgICAgaWYoIWdRdWlldCkgeworICAgICAgdV9mcHJpbnRmKG91dCwgIklDVSBleGVtcGxhciBjaGFyYWN0ZXJzOlxuIik7CisgICAgICBlc2NhcGVTdHJpbmcoZXhlbXBsYXJTdHJpbmcuZ2V0QnVmZmVyKCksIGV4ZW1wbGFyU3RyaW5nLmxlbmd0aCgpLCBvdXQpOworICAgICAgdV9mcHJpbnRmKG91dCwgIlxuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJVc2luZyBzY3JpcHRzOlxuIik7CisgICAgfQorICAgIC8vIGFkZCBpbnRlcmVzdGluZyBzY3JpcHRzCisgICAgZm9yKGkgPSAwOyBpIDwgbnVtYmVyT2ZVc2VkU2NyaXB0czsgaSsrKSB7CisgICAgICBzcHJpbnRmKHNjcmlwdFNldFBhdHRlcm4sICJbOiVzOl0iLCB1c2VkU2NyaXB0TmFtZXNbaV0pOworICAgICAgZXhlbXBsYXJVU2V0LmFkZEFsbChVbmljb2RlU2V0KFVuaWNvZGVTdHJpbmcoc2NyaXB0U2V0UGF0dGVybiwgIiIpLCBzdGF0dXMpKTsKKyAgICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgICAgdV9mcHJpbnRmKG91dCwgIiVzXG4iLCBzY3JpcHRTZXRQYXR0ZXJuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIHJlbW92ZUlnbm9yYWJsZUNoYXJzKGV4ZW1wbGFyVVNldCwgY29tcGFyZXIsIHN0YXR1cyk7CisKKyAgYWRkVXRpbGl0eUNoYXJzKGV4ZW1wbGFyVVNldCwgc3RhdHVzKTsKKworLyoKKyAgLy8gdHJ5IHRvIGNoZWNrIHdoZXRoZXIgdGFpbG9yZWQgc2V0IGFuZCBleGVtcGxhciBjaGFyYWN0ZXJzIG1hdGNoLgorICBVU2V0ICp0YWlsb3JlZCA9IHVjb2xfZ2V0VGFpbG9yZWRTZXQoZ0NvbCwgJnN0YXR1cyk7CisgIFVCb29sIHRhaWxvcmVkQ29udGFpbmVkID0gZXhlbXBsYXJVU2V0LmNvbnRhaW5zQWxsKCooKFVuaWNvZGVTZXQgKil0YWlsb3JlZCkpOworICBpZighdGFpbG9yZWRDb250YWluZWQpIHsKKyAgICAoKFVuaWNvZGVTZXQgKil0YWlsb3JlZCktPnJlbW92ZUFsbChleGVtcGxhclVTZXQpOworICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKKyAgICAoKFVuaWNvZGVTZXQgKil0YWlsb3JlZCktPnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKTsKKyAgfQorICB1c2V0X2Nsb3NlKHRhaWxvcmVkKTsKKyovCisKKyAgLy9yZXR1cm4gZXhlbXBsYXJVU2V0OworfQorCit2b2lkIAorc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpuYW1lLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgaW50MzJfdCBpID0gMDsKKyAgY2hhciBmaWxlbmFtZVsyNTZdOworICBzdHJjcHkoZmlsZW5hbWUsIG5hbWUpOworICBmb3IoaSA9IDA7IGkgPCBnUGxhdGZvcm1ObzsgaSsrKSB7CisgICAgc3RyY2F0KGZpbGVuYW1lLCAiXyIpOworICAgIHN0cmNhdChmaWxlbmFtZSwgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbaV1dLm5hbWUpOworICB9CisgIGlmKGdFeGVtcGxhcikgeworICAgIHN0cmNhdChmaWxlbmFtZSwgIl9leGVtcGxhciIpOworICB9IGVsc2UgeworICAgIHN0cmNhdChmaWxlbmFtZSwgIl9zY3JpcHQiKTsKKyAgfQorICBzdHJjYXQoZmlsZW5hbWUsICIudXRmMTYudHh0Iik7CisgIG91dCA9IHVfZm9wZW4oZmlsZW5hbWUsICJ3YiIsICJlbiIsICJ1dGYtMTYiKTsKK30KKwordm9pZAorcHJvY2Vzc0NvbGxhdG9yKFVDb2xsYXRvciAqY29sLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgaW50MzJfdCBpID0gMDsKKyAgZ0NvbCA9IGNvbDsKKyAgVUNoYXIgcnVsZVN0cmluZ1sxNjM4NF07CisgIGludDMyX3QgcnVsZVN0cmluZ0xlbmd0aCA9IHVjb2xfZ2V0UnVsZXNFeChnQ29sLCBVQ09MX1RBSUxPUklOR19PTkxZLCBydWxlU3RyaW5nLCAxNjM4NCk7CisgIGlmKCFnUXVpZXQpIHsKKyAgICB1X2ZwcmludGYob3V0LCAiSUNVIHJ1bGVzOlxuIik7CisgICAgcHJpbnRSdWxlcyhydWxlU3RyaW5nLCBydWxlU3RyaW5nTGVuZ3RoLCBvdXQpOworICAgIHByaW50UnVsZXMocnVsZVN0cmluZywgcnVsZVN0cmluZ0xlbmd0aCwgbG9nKTsKKyAgICAvL2VzY2FwZVN0cmluZyhydWxlU3RyaW5nLCBydWxlU3RyaW5nTGVuZ3RoLCBvdXQpOworICAgIHVfZnByaW50ZihvdXQsICJcbiIpOworICB9CisgIGNvbnN0IGNoYXIgKmxvY2FsZSA9IHVjb2xfZ2V0TG9jYWxlKGdDb2wsIFVMT0NfUkVRVUVTVEVEX0xPQ0FMRSwgJnN0YXR1cyk7CisgIFVuaWNvZGVTZXQgZXhlbXBsYXJVU2V0OworICBpZihsb2NhbGUpIHsKKyAgICBnZXRFeGVtcGxhcnMobG9jYWxlLCBleGVtcGxhclVTZXQsIHN0YXR1cyk7CisgIH0gZWxzZSB7CisgICAgZXhlbXBsYXJVU2V0ID0gKigoVW5pY29kZVNldCAqKXVjb2xfZ2V0VGFpbG9yZWRTZXQoZ0NvbCwgJnN0YXR1cykpOworICB9CisKKworICBmb3IoaSA9IDA7IGkgPCBnUGxhdGZvcm1ObzsgaSsrKSB7CisgICAgdV9mcHJpbnRmKG91dCwgIlxuR2VuZXJhdGluZyBvcmRlciBmb3IgcGxhdGZvcm06ICVzXG4iLCBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1tpXV0ubmFtZSk7CisgICAgZ0NvbXBhcmVyID0gcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbaV1dLmNvbXBhcmVyOworCisgICAgcHJlcGFyZVN0YXJ0aW5nU2V0KGV4ZW1wbGFyVVNldCwgZ0NvbXBhcmVyLCBzdGF0dXMpOworICAgIGludDMyX3QgaXRlbUxlbiA9IDA7CisgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZSBzZXQgKGJvdGggY29kZXBvaW50cyBhbmQgc3RyaW5ncykKKyAgICBpbnQzMl90IGV4ZW1wbGFyU2V0U2l6ZSA9IGV4ZW1wbGFyVVNldC5zaXplKCk7CisgICAgVW5pY29kZVNldEl0ZXJhdG9yIGV4ZW1wbGFyVVNldEl0ZXIoZXhlbXBsYXJVU2V0KTsKKworICAgIC8vIGFsbG9jYXRlIElDVSBsaW5lcworICAgIGdJQ1VMaW5lcyA9IG5ldyBMaW5lKltleGVtcGxhclNldFNpemUqNV07IAorICAgIGludDMyX3QgaiA9IDA7CisgICAgaW50MzJfdCBsaW5lc0NvdW50ID0gMDsKKyAgICBMaW5lICpsaW5lcyA9IG5ldyBMaW5lW2V4ZW1wbGFyU2V0U2l6ZV07IAorCisgICAgaW50MzJfdCByZXZlcnNlZFNlY29uZGFyeSA9IGNoZWNrU2Vjb25kYXJ5T3JkZXJpbmcoKTsKKyAgICBpZihyZXZlcnNlZFNlY29uZGFyeSA9PSAwKSB7CisgICAgICB1X2ZwcmludGYob3V0LCAiU2Vjb25kYXJpZXMgZG8gbm90IHNlZW0gdG8gYmUgcmV2ZXJzZWRcbiIpOworICAgIH0gZWxzZSBpZihyZXZlcnNlZFNlY29uZGFyeSA9PSAxKSB7CisgICAgICB1X2ZwcmludGYob3V0LCAiU2Vjb25kYXJpZXMgYXJlIHJldmVyc2VkXG4iKTsKKyAgICAgIGlmKGdDb21wYXJlciA9PSBJQ1VzdHJjbXApIHsKKyAgICAgICAgdWNvbF9zZXRBdHRyaWJ1dGUoZ0NvbCwgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCBVQ09MX09GRiwgJnN0YXR1cyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJDYW5ub3QgY29uY2x1ZGUgaWYgc2Vjb25kYXJpZXMgYXJlIHJldmVyc2VkXG4iKTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJldmVyc2VkQ2FzZSA9IGNoZWNrQ2FzZU9yZGVyaW5nKCk7CisgICAgaWYocmV2ZXJzZWRDYXNlID09IDApIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJDYXNlIGRvZXMgbm90IHNlZW0gdG8gYmUgcmV2ZXJzZWRcbiIpOworICAgIH0gZWxzZSBpZihyZXZlcnNlZENhc2UgPT0gMSkgeworICAgICAgdV9mcHJpbnRmKG91dCwgIkNhc2UgaXMgcmV2ZXJzZWRcbiIpOworICAgICAgaWYoZ0NvbXBhcmVyID09IElDVXN0cmNtcCkgeworICAgICAgICB1Y29sX3NldEF0dHJpYnV0ZShnQ29sLCBVQ09MX0NBU0VfRklSU1QsIFVDT0xfT0ZGLCAmc3RhdHVzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdV9mcHJpbnRmKG91dCwgIkNhbm5vdCBjb25jbHVkZSBpZiBjYXNlIGlzIHJldmVyc2VkXG4iKTsKKyAgICB9CisgICAgICAKKyAgICBleGVtcGxhclVTZXRJdGVyLnJlc2V0KCk7CisgICAgZ0VsZW1lbnRzLnJlbW92ZUFsbCgpOworICAgIGdFeHBhbnNpb25zLnJlbW92ZUFsbCgpOworICAgIGxpbmVzQ291bnQgPSAwOworCisgICAgd2hpbGUoZXhlbXBsYXJVU2V0SXRlci5uZXh0KCkpIHsKKyAgICAgIExpbmUgKmN1cnJMaW5lID0gbGluZXMrbGluZXNDb3VudDsKKyAgICAgIGlmKGV4ZW1wbGFyVVNldEl0ZXIuaXNTdHJpbmcoKSkgeyAvLyBwcm9jZXNzIGEgc3RyaW5nCisgICAgICAgIHVfbWVtY3B5KGN1cnJMaW5lLT5uYW1lLCBleGVtcGxhclVTZXRJdGVyLmdldFN0cmluZygpLmdldEJ1ZmZlcigpLCBleGVtcGxhclVTZXRJdGVyLmdldFN0cmluZygpLmxlbmd0aCgpKTsKKyAgICAgICAgY3VyckxpbmUtPmxlbiA9IGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkubGVuZ3RoKCk7CisgICAgICB9IGVsc2UgeyAvLyBwcm9jZXNzIGNvZGUgcG9pbnQKKyAgICAgICAgVUJvb2wgaXNFcnJvciA9IEZBTFNFOworICAgICAgICBjdXJyTGluZS0+bGVuID0gMDsKKyAgICAgICAgVTE2X0FQUEVORChjdXJyTGluZS0+bmFtZSwgY3VyckxpbmUtPmxlbiwgMjUsIGV4ZW1wbGFyVVNldEl0ZXIuZ2V0Q29kZXBvaW50KCksIGlzRXJyb3IpOworICAgICAgfQorICAgICAgY3VyckxpbmUtPm5hbWVbY3VyckxpbmUtPmxlbl0gPSAwOyAvLyB6ZXJvIHRlcm1pbmF0ZSwgZm9yIG91ciBldmlsIHdheXMKKyAgICAgIGN1cnJMaW5lLT5pbmRleCA9IGxpbmVzQ291bnQ7CisgICAgICBsaW5lc0NvdW50Kys7CisgICAgICBub3RlRWxlbWVudChjdXJyTGluZSk7CisgICAgfQorICAgIGNvbnN0cnVjdEFuZEFuYWx5emUoZ0lDVUxpbmVzLCBsaW5lcywgZXhlbXBsYXJTZXRTaXplLCBnQ29tcGFyZXIpOworCisgICAgZGVsZXRlW10gbGluZXM7IAorICB9CisKKworICAvLyBjbGVhbnVwIGdsb2JhbHMKKyAgZGVsZXRlW10gZ0lDVUxpbmVzOyAKKyAgdV9mZmx1c2gob3V0KTsKKyAgdV9mY2xvc2Uob3V0KTsKKyAgdWNvbF9jbG9zZShnQ29sKTsKK30KKwordm9pZAorcHJvY2Vzc0xvY2FsZShjb25zdCBjaGFyICpsb2NhbGUsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICBnV2luTENJRCA9IHVsb2NfZ2V0TENJRChsb2NhbGUpOworCisgIFVDb2xsYXRvciAqY29sID0gdWNvbF9vcGVuKGxvY2FsZSwgJnN0YXR1cyk7CisKKyAgc2V0T3V0cHV0RmlsZShsb2NhbGUsIHN0YXR1cyk7CisKKyAgdV9mcHJpbnRmKG91dCwgIkxvY2FsZSAlcyAoTENJRDolMDZYKVxuIiwgbG9jYWxlLCBnV2luTENJRCk7CisKKyAgcHJvY2Vzc0NvbGxhdG9yKGNvbCwgc3RhdHVzKTsKK30KKworVUJvb2wgCitoYXNDb2xsYXRpb25FbGVtZW50cyhjb25zdCBjaGFyICpsb2NOYW1lKSB7CisKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIFVSZXNvdXJjZUJ1bmRsZSAqQ29sRWwgPSBOVUxMOworCisgIFVSZXNvdXJjZUJ1bmRsZSAqbG9jID0gdXJlc19vcGVuKE5VTEwsIGxvY05hbWUsICZzdGF0dXMpOzsKKworICBpZihVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBDb2xFbCA9IHVyZXNfZ2V0QnlLZXkobG9jLCAiQ29sbGF0aW9uRWxlbWVudHMiLCBDb2xFbCwgJnN0YXR1cyk7CisgICAgaWYoc3RhdHVzID09IFVfWkVST19FUlJPUikgeyAvKiBkbyB0aGUgdGVzdCAtIHRoZXJlIGFyZSByZWFsIGVsZW1lbnRzICovCisgICAgICB1cmVzX2Nsb3NlKENvbEVsKTsKKyAgICAgIHVyZXNfY2xvc2UobG9jKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICB1cmVzX2Nsb3NlKENvbEVsKTsKKyAgICB1cmVzX2Nsb3NlKGxvYyk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsCisgICAgIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIGVyciA9IHVfZmluaXQoc3RkZXJyLCAiZW4iLCAibGF0aW4tMSIpOworICBsb2cgPSB1X2Zpbml0KHN0ZG91dCwgImVuIiwgImxhdGluLTEiKTsKKworLyoKKyAgVVNldCAqd3NwID0gdXBydl9vcGVuUnVsZVdoaXRlU3BhY2VTZXQoJnN0YXR1cyk7CisgIHVzZXRfYWRkKHdzcCwgMHgwMDQxKTsKKyAgdXNldF9yZW1vdmUod3NwLCAweDAwNDEpOworICBVbmljb2RlU3RyaW5nIHBhdDsKKyAgKChVbmljb2RlU2V0ICopd3NwKS0+dG9QYXR0ZXJuKHBhdCwgVFJVRSk7CisgIHBhdC5zZXRDaGFyQXQocGF0Lmxlbmd0aCgpLCAwKTsKKyAgZXNjYXBlU3RyaW5nKHBhdC5nZXRCdWZmZXIoKSwgcGF0Lmxlbmd0aCgpLCBsb2cpOworICB1X2ZmbHVzaChsb2cpOworKi8KKworICBVVHJhbnNsaXRlcmF0b3IgKmFueUhleCA9IHV0cmFuc19vcGVuKCJbXlxcdTAwMGFcXHUwMDIwLVxcdTAwN2ZdIEFueS1IZXgvSmF2YSIsIFVUUkFOU19GT1JXQVJELCBOVUxMLCAwLCBOVUxMLCAmc3RhdHVzKTsKKyAgdV9mc2V0dHJhbnNsaXRlcmF0b3IobG9nLCBVX1dSSVRFLCBhbnlIZXgsICZzdGF0dXMpOworCisgIHByb2Nlc3NBcmdzKGFyZ2MsIGFyZ3YsIHN0YXR1cyk7CisgIGludDMyX3QgaSA9IDA7CisKKworICBnRWxlbWVudHMuc2V0VmFsdWVEZWxldGVyKGRlbGV0ZUxpbmVFbGVtZW50KTsKKworCisgIGlmKFVfRkFJTFVSRShzdGF0dXMpIHx8IGdQbGF0Zm9ybU5vID09IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBnVUNBID0gdWNvbF9vcGVuKCJyb290IiwgJnN0YXR1cyk7CisKKyAgaWYoZ1J1bGVzU3RkaW4pIHsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBVQ2hhciBydWxlQnVmZmVyWzE2Mzg0XTsKKyAgICBVQ2hhciAqcnVsZXMgPSBydWxlQnVmZmVyOworICAgIGludDMyX3QgbWF4UnVsZUxlbiA9IDE2Mzg0OworICAgIGludDMyX3QgckxlbiA9IDA7CisgICAgd2hpbGUoZ2V0cyhidWZmZXIpKSB7CisgICAgICBpZihidWZmZXJbMF0gIT0gJy8nICYmIGJ1ZmZlclsxXSAhPSAnLycpIHsKKyAgICAgICAgckxlbiA9IHVfdW5lc2NhcGUoYnVmZmVyLCBydWxlcywgbWF4UnVsZUxlbik7CisgICAgICAgIHJ1bGVzICs9IHJMZW47CisgICAgICAgIG1heFJ1bGVMZW4gLT0gckxlbjsKKyAgICAgIH0KKyAgICB9CisgICAgVVBhcnNlRXJyb3IgcGFyc2VFcnJvcjsKKyAgICAvL2VzY2FwZVN0cmluZyhydWxlQnVmZmVyLCBydWxlcy1ydWxlQnVmZmVyLCBsb2cpOy8vCisgICAgdV9mcHJpbnRmKGxvZywgIiVVXG4iLCBydWxlQnVmZmVyKTsKKworICAgIFVDb2xsYXRvciAqY29sID0gdWNvbF9vcGVuUnVsZXMocnVsZUJ1ZmZlciwgcnVsZXMtcnVsZUJ1ZmZlciwgVUNPTF9ERUZBVUxULCBVQ09MX0RFRkFVTFQsICZwYXJzZUVycm9yLCAmc3RhdHVzKTsKKyAgICBpZihVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgc2V0T3V0cHV0RmlsZSgic3RkaW5SdWxlcyIsIHN0YXR1cyk7CisgICAgICBwcm9jZXNzQ29sbGF0b3IoY29sLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICB1X2ZwcmludGYoZXJyLCAiRXJyb3IgJXNcbiIsIHVfZXJyb3JOYW1lKHN0YXR1cykpOworICAgIH0KKyAgfSBlbHNlIHsKKworICAgIGlmKGdMb2NhbGUpIHsKKyAgICAgIHByb2Nlc3NMb2NhbGUoZ0xvY2FsZSwgc3RhdHVzKTsKKyAgICB9IGVsc2UgaWYoZ0xvY2FsZU5vKSB7CisgICAgICBmb3IoaSA9IDA7IGkgPCBnTG9jYWxlTm87IGkrKykgeworICAgICAgICBwcm9jZXNzTG9jYWxlKGdMb2NhbGVzW2ldLCBzdGF0dXMpOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGRvIHRoZSBsb29wIHRocm91Z2ggYWxsIHRoZSBsb2NhbGVzCisgICAgICBpbnQzMl90IG5vT2ZMb2MgPSB1bG9jX2NvdW50QXZhaWxhYmxlKCk7CisgICAgICBjb25zdCBjaGFyICpsb2NOYW1lID0gTlVMTDsKKyAgICAgIGZvcihpID0gMDsgaTxub09mTG9jOyBpKyspIHsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBsb2NOYW1lID0gdWxvY19nZXRBdmFpbGFibGUoaSk7CisgICAgICAgIGlmKGhhc0NvbGxhdGlvbkVsZW1lbnRzKGxvY05hbWUpKSB7CisgICAgICAgICAgcHJvY2Vzc0xvY2FsZShsb2NOYW1lLCBzdGF0dXMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKworICB1Y29sX2Nsb3NlKGdVQ0EpOworCisgIHVfZmZsdXNoKGxvZyk7CisgIHVfZmNsb3NlKGxvZyk7CisgIHVfZmZsdXNoKGVycik7CisgIHVfZmNsb3NlKGVycik7CisKKyAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvY29scHJvYmUuZHNwIGIvY29scHJvYmUvY29scHJvYmUuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzRjODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9jb2xwcm9iZS5kc3AKQEAgLTAsMCArMSwxNDggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iY29scHJvYmUiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCisKK0NGRz1jb2xwcm9iZSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImNvbHByb2JlLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiY29scHJvYmUubWFrIiBDRkc9ImNvbHByb2JlIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiY29scHJvYmUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImNvbHByb2JlIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAiY29scHJvYmUgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0kgIi4uLy4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi90b29scy90b29sdXRpbCIgL0kgIi4uLy4uL2NvbW1vbiIgL0kgIi4uLy4uL2kxOG4iIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGljdWlvLmxpYiBpY3V1Yy5saWIgaWN1aW4ubGliIGljdXR1LmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLi8uLi8uLi9saWIiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJjb2xwcm9iZSAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uLy4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi90b29scy90b29sdXRpbCIgL0kgIi4uLy4uL2NvbW1vbiIgL0kgIi4uLy4uL2kxOG4iIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiBpY3Vpb2QubGliIGljdXVjZC5saWIgaWN1aW5kLmxpYiBpY3V0dWQubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQgL2xpYnBhdGg6Ii4uLy4uLy4uL2xpYiIKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImNvbHByb2JlIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAiY29scHJvYmUgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxjb2xwcm9iZU5ldy5jcHAKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGxpbmUuY3BwCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxzb3J0ZWRsaW5lcy5jcHAKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHN0cmVuZ3RocHJvYmUuY3BwCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx0YXJnZXRzZXRnZW5lcmF0b3IuY3BwCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx1cHJpbnRlci5jcHAKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGNvbHByb2JlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGxpbmUuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cc29ydGVkbGluZXMuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cc3RyZW5ndGhwcm9iZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx0YXJnZXRzZXRnZW5lcmF0b3IuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cdXByaW50ZXIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9jb2xwcm9iZS9jb2xwcm9iZS5oIGIvY29scHJvYmUvY29scHJvYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTEyYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvY29scHJvYmUuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIENPTFBST0JFX0gKKyNkZWZpbmUgQ09MUFJPQkVfSAorCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL25vcm1senIuaCIKKwordHlwZWRlZiBpbnQgKCpDb21wYXJlRm4pIChjb25zdCB2b2lkICplbGVtMSwgY29uc3Qgdm9pZCAqZWxlbTIpOwordHlwZWRlZiBpbnQgKCpHZXRTb3J0S2V5Rm4pIChjb25zdCBVQ2hhciAqc3RyaW5nLCBpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmZmVyLCBpbnQzMl90IGJ1ZmZDYXBhY2l0eSk7CisvL3R5cGVkZWYgaW50IChfX2NkZWNsICpDb21wYXJlRm4pKGNvbnN0IHZvaWQgKmVsZW0xLCBjb25zdCB2b2lkICplbGVtMik7Cit2b2lkIGdlbmVyYXRlUmVwZXJ0b2lyZShjb25zdCBjaGFyICpsb2NhbGUsIFVuaWNvZGVTZXQgJnJlcCwgVUJvb2wgJmhhbkFwcGVhcnMsIFVFcnJvckNvZGUgJnN0YXR1cyk7CitVbmljb2RlU2V0IGZsYXR0ZW4oY29uc3QgVW5pY29kZVNldCAmc291cmNlLCBVRXJyb3JDb2RlICZzdGF0dXMpOworCisvL1VuaWNvZGVTZXQgZ2VuZXJhdGVSZXBlcnRvaXJlKGNvbnN0IGNoYXIgKmxvY2FsZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29scHJvYmUvY29scHJvYmVOZXcuY3BwIGIvY29scHJvYmUvY29scHJvYmVOZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2ZjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9jb2xwcm9iZU5ldy5jcHAKQEAgLTAsMCArMSwxMDc4IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIGNvbHByb2JlLmNwcAorKgorKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKyoKKyogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorKiAgIDAzLzE4LzIwMDMgIHdlaXYgICAgICAgIENyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgInVvcHRpb25zLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y29sLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y29sZWl0ci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXJlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5pc2V0LmgiCisjaW5jbHVkZSAidW5pY29kZS91c2V0aXRlci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNoYXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzY3JpcHQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL2xvY2lkLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y252LmgiCisjaW5jbHVkZSAidXByb3BzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgInVjb2xfaW1wLmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VzdGRpby5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXRyYW5zLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8vIHVuaXggdG9sb3dlcgorI2luY2x1ZGUgPGN0eXBlLmg+CisvLyB1bml4IHNldGxvY2FsZQorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaW5jbHVkZSAiY29scHJvYmUuaCIKKworI2luY2x1ZGUgImxpbmUuaCIKKyNpbmNsdWRlICJzb3J0ZWRsaW5lcy5oIgorI2luY2x1ZGUgInN0cmVuZ3RocHJvYmUuaCIKKwordm9pZCB0ZXN0V2luKFN0cmVuZ3RoUHJvYmUgJnByb2JlLCBVRXJyb3JDb2RlICZzdGF0dXMpIDsKKworI2lmIGRlZmluZWQgV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorCitpbnQgY3JlYXRlRGlyKGNvbnN0IGNoYXIqIGRpck5hbWUpIHsKKyAgc3RydWN0IF9zdGF0IG15U3RhdDsKKyAgaW50IHJlc3VsdCA9IF9zdGF0KGRpck5hbWUsICZteVN0YXQpOworIAorICBpZihyZXN1bHQgPT0gLTEpIHsKKyAgICByZXN1bHQgPSBfbWtkaXIoZGlyTmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSBlbHNlIGlmKG15U3RhdC5zdF9tb2RlICYgX1NfSUZESVIpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvLyNlbGlmIGRlZmluZWQgUE9TSVgKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IGNyZWF0ZURpcihjb25zdCBjaGFyKiBkaXJOYW1lKSB7CisgIHN0cnVjdCBzdGF0IG15U3RhdDsKKyAgaW50IHJlc3VsdCA9IHN0YXQoZGlyTmFtZSwgJm15U3RhdCk7CisgCisgIGlmKHJlc3VsdCA9PSAtMSkgeworICAgIHJlc3VsdCA9IG1rZGlyKGRpck5hbWUsIFNfSVJVU1J8U19JV1VTUnxTX0lYVVNSfFNfSVJHUlB8U19JV0dSUHxTX0lYR1JQfFNfSVJPVEh8U19JV09USHxTX0lYT1RIKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9IGVsc2UgaWYoU19JU0RJUihteVN0YXQuc3RfbW9kZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorLy8KKy8vICBTdHVicyBmb3IgV2luZG93cyBBUEkgZnVuY3Rpb25zIHdoZW4gYnVpbGRpbmcgb24gVU5JWGVzLgorLy8KK3R5cGVkZWYgaW50IERXT1JEOworaW5saW5lIGludCBDb21wYXJlU3RyaW5nVyhEV09SRCwgRFdPUkQsIFVDaGFyICosIGludCwgVUNoYXIgKiwgaW50KSB7cmV0dXJuIDA7fTsKKy8vI2Vsc2UKKy8vI2Vycm9yICJOb3QgUE9TSVggb3IgV2luZG93cy4gV29uJ3Qgd29yay4iCisjZW5kaWYKKworI2luY2x1ZGUgImxpbmUuaCIKKworc3RhdGljIFVCb29sIGdWZXJib3NlID0gRkFMU0U7CitzdGF0aWMgVUJvb2wgZ0RlYnVnID0gRkFMU0U7CitzdGF0aWMgVUJvb2wgZ1F1aWV0ID0gRkFMU0U7CitzdGF0aWMgVUJvb2wgZ0V4ZW1wbGFyID0gRkFMU0U7CisKK0RXT1JEICAgICAgICAgIGdXaW5MQ0lEOworaW50ICAgICAgICAgICAgZ0NvdW50OworVUNvbGxhdG9yICAgICAqZ0NvbDsKK1VDb2xsYXRvciAgICAgKmdVQ0E7CitVQ29udmVydGVyICAgICp1dGY4Y252OworQ29tcGFyZUZuIGdDb21wYXJlcjsKK2ludCAgICAgICBnUmVmTnVtOworVW5pY29kZVNldCBnRXhjbHVkZVNldDsKK1VuaWNvZGVTZXQgZ1JlcGVydG9pcmU7CisKK2NvbnN0IFVDaGFyIHNlcGFyYXRvckNoYXIgPSAweDAwMzA7CisKK1VQcmludGVyICpsb2dnZXI7CitVUHJpbnRlciAqZGVidWc7CitVUHJpbnRlciAqdGFpbG9yaW5nQnVuZGxlOworVVByaW50ZXIgKnJlZmVyZW5jZUJ1bmRsZTsKK1VQcmludGVyICpidW5kbGU7CitGSUxFICAgICAqZlRhaWxvcmluZ0R1bXA7CitGSUxFICAgICAqZkRlZmF1bHREdW1wOworCitjb25zdCBjaGFyICpwcm9nTmFtZSA9ICJjb2xwcm9iZSI7CisKK2NvbnN0IGNoYXIgKmdMb2NhbGUgPSBOVUxMOworaW50MzJfdCBwbGF0Zm9ybUluZGV4ID0gLTE7CitpbnQzMl90IGdQbGF0Zm9ybU5vID0gMDsKK2ludDMyX3QgZ1BsYXRmb3JtSW5kZXhlc1sxMF07CitpbnQzMl90IGdMb2NhbGVObyA9IDA7Citjb25zdCBjaGFyKiBnTG9jYWxlc1sxMDBdOworVUJvb2wgZ1J1bGVzU3RkaW4gPSBGQUxTRTsKK2NvbnN0IGNoYXIgKm91dHB1dEZvcm1hdCA9ICJIVE1MIjsKK2NvbnN0IGNoYXIgKm91dEV4dGVuc2lvbiA9ICJodG1sIjsKKworZW51bSB7CisgIEhFTFAxLAorICAgIEhFTFAyLAorICAgIFZFUkJPU0UsCisgICAgUVVJRVQsCisgICAgVkVSU0lPTiwKKyAgICBJQ1VEQVRBRElSLAorICAgIENPUFlSSUdIVCwKKyAgICBMT0NBTEUsCisgICAgUExBVEZPUk0sCisgICAgREVCVUcsIAorICAgIEVYRU1QTEFSLAorICAgIFJVTEVTU1RESU4sCisgICAgUkVGRVJFTkNFLAorICAgIEVYQ0xVREVTRVQsCisgICAgUkVQRVJUT0lSRSwKKyAgSU5URVJBQ1RJVkUsCisgIFBSSU5UUkVGLAorICBESUZGLCAKKyAgT1VUUFVUCit9OworCitVT3B0aW9uIG9wdGlvbnNbXT17CisgIC8qMCovIFVPUFRJT05fSEVMUF9ILAorICAvKjEqLyBVT1BUSU9OX0hFTFBfUVVFU1RJT05fTUFSSywKKyAgLyoyKi8gVU9QVElPTl9WRVJCT1NFLAorICAvKjMqLyBVT1BUSU9OX1FVSUVULAorICAvKjQqLyBVT1BUSU9OX1ZFUlNJT04sCisgIC8qNSovIFVPUFRJT05fSUNVREFUQURJUiwKKyAgLyo2Ki8gVU9QVElPTl9DT1BZUklHSFQsCisgIC8qNyovIFVPUFRJT05fREVGKCJsb2NhbGUiLCAnbCcsIFVPUFRfUkVRVUlSRVNfQVJHKSwKKyAgLyo4Ki8gVU9QVElPTl9ERUYoInBsYXRmb3JtIiwgJ3AnLCBVT1BUX1JFUVVJUkVTX0FSRyksCisgIC8qOSovIFVPUFRJT05fREVGKCJkZWJ1ZyIsICdEJywgVU9QVF9OT19BUkcpLAorICAvKjEwKi8gVU9QVElPTl9ERUYoImV4ZW1wbGFyIiwgJ0UnLCBVT1BUX05PX0FSRyksCisgIC8qMTEqLyBVT1BUSU9OX0RFRigicnVsZXNzdGRpbiIsICdSJywgVU9QVF9OT19BUkcpLAorICAvKjEyKi8gVU9QVElPTl9ERUYoInJlZiIsICdjJywgVU9QVF9SRVFVSVJFU19BUkcpLAorICAvKjEzKi8gVU9QVElPTl9ERUYoImV4Y2x1ZGVzZXQiLCAneCcsIFVPUFRfUkVRVUlSRVNfQVJHKSwKKyAgLyoxNCovIFVPUFRJT05fREVGKCJyZXBlcnRvaXJlIiwgJ3QnLCBVT1BUX1JFUVVJUkVTX0FSRyksCisgIC8qMTUqLyBVT1BUSU9OX0RFRigiaW50ZXJhY3RpdmUiLCAnSScsIFVPUFRfTk9fQVJHKSwKKyAgLyoxNiovIFVPUFRJT05fREVGKCJwcmludHJlZiIsIDAsIFVPUFRfTk9fQVJHKSwKKyAgLyoxNyovIFVPUFRJT05fREVGKCJkaWZmIiwgMCwgVU9QVF9OT19BUkcpLAorICAvKjE4Ki8gVU9QVElPTl9ERUYoIm91dHB1dCIsIDAsIFVPUFRfUkVRVUlSRVNfQVJHKQorfTsKKworVUNoYXIgY29tcEFbMjU2XTsKK1VDaGFyIGNvbXBCWzI1Nl07CitpbnQzMl90IGNvbXBBTGVuID0gMDsKK2ludDMyX3QgY29tcEJMZW4gPSAwOworCitjaGFyIGNvbXBVVEY4QVsyNTZdOworY2hhciBjb21wVVRGOEJbMjU2XTsKK2ludDMyX3QgY29tcFVURjhBTGVuID0gMDsKK2ludDMyX3QgY29tcFVURjhCTGVuID0gMDsKKworaW50IFVOSVhzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBnQ291bnQrKzsKKyAgICBpbnQgdDsKKyAgICBjb21wQUxlbiA9IHVub3JtX25vcm1hbGl6ZSgoKihMaW5lICoqKWEpLT5uYW1lLCAoKihMaW5lICoqKWEpLT5sZW4sIFVOT1JNX05GQywgMCwgY29tcEEsIDI1NiwgJnN0YXR1cyk7CisgICAgY29tcEJMZW4gPSB1bm9ybV9ub3JtYWxpemUoKCooTGluZSAqKiliKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bGVuLCBVTk9STV9ORkMsIDAsIGNvbXBCLCAyNTYsICZzdGF0dXMpOworICAgIGNvbXBVVEY4QUxlbiA9IHVjbnZfZnJvbVVDaGFycyh1dGY4Y252LCBjb21wVVRGOEEsIDI1NiwgY29tcEEsIGNvbXBBTGVuLCAmc3RhdHVzKTsKKyAgICBjb21wVVRGOEFbY29tcFVURjhBTGVuXSA9IDA7CisgICAgY29tcFVURjhCTGVuID0gdWNudl9mcm9tVUNoYXJzKHV0ZjhjbnYsIGNvbXBVVEY4QiwgMjU2LCBjb21wQiwgY29tcEJMZW4sICZzdGF0dXMpOworICAgIGNvbXBVVEY4Qltjb21wVVRGOEJMZW5dID0gMDsKKyAgICB0ID0gc3RyY29sbChjb21wVVRGOEEsIGNvbXBVVEY4Qik7CisgICAgcmV0dXJuIHQ7Cit9CisKK2ludCBVTklYZ2V0U29ydEtleShjb25zdCBVQ2hhciAqc3RyaW5nLCBpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmZmVyLCBpbnQzMl90IGJ1ZmZDYXBhY2l0eSkgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgY29tcEFMZW4gPSB1bm9ybV9ub3JtYWxpemUoc3RyaW5nLCBsZW4sIFVOT1JNX05GQywgMCwgY29tcEEsIDI1NiwgJnN0YXR1cyk7CisgIGNvbXBVVEY4QUxlbiA9IHVjbnZfZnJvbVVDaGFycyh1dGY4Y252LCBjb21wVVRGOEEsIDI1NiwgY29tcEEsIGNvbXBBTGVuLCAmc3RhdHVzKTsKKyAgY29tcFVURjhBW2NvbXBVVEY4QUxlbl0gPSAwOworICByZXR1cm4gKHN0cnhmcm0oKGNoYXIgKilidWZmZXIsIGNvbXBVVEY4QSwgYnVmZkNhcGFjaXR5KSsxKTsKK30KKworI2lmZGVmIFdJTjMyCitpbnQgV2luc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgZ0NvdW50Kys7CisgICAgaW50IHQ7CisgICAgLy9jb21wQUxlbiA9IHVub3JtX2NvbXBvc2UoY29tcEEsIDI1NiwgKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCBGQUxTRSwgMCwgJnN0YXR1cyk7CisgICAgLy9jb21wQkxlbiA9IHVub3JtX2NvbXBvc2UoY29tcEIsIDI1NiwgKCooTGluZSAqKiliKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bGVuLCBGQUxTRSwgMCwgJnN0YXR1cyk7CisgICAgY29tcEFMZW4gPSB1bm9ybV9ub3JtYWxpemUoKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCBVTk9STV9ORkMsIDAsIGNvbXBBLCAyNTYsICZzdGF0dXMpOworICAgIGNvbXBCTGVuID0gdW5vcm1fbm9ybWFsaXplKCgqKExpbmUgKiopYiktPm5hbWUsICgqKExpbmUgKiopYiktPmxlbiwgVU5PUk1fTkZDLCAwLCBjb21wQiwgMjU2LCAmc3RhdHVzKTsKKyAgICB0ID0gQ29tcGFyZVN0cmluZ1coZ1dpbkxDSUQsICBTT1JUX1NUUklOR1NPUlQsIC8vMCwKKyAgICAgIGNvbXBBLCBjb21wQUxlbiwgCisgICAgICBjb21wQiwgY29tcEJMZW4pOworCisvKiAgICAKKyAgICB0ID0gQ29tcGFyZVN0cmluZ1coZ1dpbkxDSUQsIDAsIAorICAgICAgKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCAKKyAgICAgICgqKExpbmUgKiopYiktPm5hbWUsICgqKExpbmUgKiopYiktPmxlbik7CisqLworICAgIHJldHVybiB0LTI7Cit9CisKK2ludCBXaW5nZXRTb3J0S2V5KGNvbnN0IFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuLCB1aW50OF90ICpidWZmZXIsIGludDMyX3QgYnVmZkNhcGFjaXR5KSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBjb21wQUxlbiA9IHVub3JtX25vcm1hbGl6ZShzdHJpbmcsIGxlbiwgVU5PUk1fTkZDLCAwLCBjb21wQSwgMjU2LCAmc3RhdHVzKTsKKyAgcmV0dXJuIExDTWFwU3RyaW5nVyhnV2luTENJRCwgTENNQVBfU09SVEtFWSB8IFNPUlRfU1RSSU5HU09SVCwgY29tcEEsIGNvbXBBTGVuLCAodW5zaWduZWQgc2hvcnQgKilidWZmZXIsIGJ1ZmZDYXBhY2l0eSk7Cit9CisKKyNpZiAwCitpbnQgV2luc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIHVpbnQ4X3QgYjFbMjU2XSwgYjJbMjU2XTsKKyAgaW50MzJfdCBiMUxlbiwgYjJMZW47CisgIGIxTGVuID0gV2luZ2V0U29ydEtleSgoKihMaW5lICoqKWEpLT5uYW1lLCAoKihMaW5lICoqKWEpLT5sZW4sIGIxLCAyNTYpOworICBiMkxlbiA9IFdpbmdldFNvcnRLZXkoKCooTGluZSAqKiliKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bGVuLCBiMiwgMjU2KTsKKworICBiMVtiMUxlbl0gPSAwOworICBiMltiMkxlbl0gPSAwOworICAKKyAgcmV0dXJuIHN0cmNtcCgoY29uc3QgY2hhciAqKWIxLCAoY29uc3QgY2hhciAqKWIyKTsKK30KKyNlbmRpZgorCisjZWxzZQoraW50IFdpbnN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CisgIGlmKGEgPT0gYik7CisgIHJldHVybiAwOworfQoraW50IFdpbmdldFNvcnRLZXkoY29uc3QgVUNoYXIgKiwgaW50MzJfdCAsIHVpbnQ4X3QgKiwgaW50MzJfdCApIHsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IElDVXN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CisgICAgZ0NvdW50Kys7CisgICAgVUNvbGxhdGlvblJlc3VsdCB0OworICAgIHQgPSB1Y29sX3N0cmNvbGwoZ0NvbCwgCisgICAgICAoKihMaW5lICoqKWEpLT5uYW1lLCAoKihMaW5lICoqKWEpLT5sZW4sICAKKyAgICAgICgqKExpbmUgKiopYiktPm5hbWUsICgqKExpbmUgKiopYiktPmxlbik7CisgICAgaWYgKHQgPT0gVUNPTF9MRVNTKSByZXR1cm4gLTE7CisgICAgaWYgKHQgPT0gVUNPTF9HUkVBVEVSKSByZXR1cm4gKzE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBJQ1VnZXRTb3J0S2V5KGNvbnN0IFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuLCB1aW50OF90ICpidWZmZXIsIGludDMyX3QgYnVmZkNhcGFjaXR5KSB7CisgIHJldHVybiB1Y29sX2dldFNvcnRLZXkoZ0NvbCwgc3RyaW5nLCBsZW4sIGJ1ZmZlciwgYnVmZkNhcGFjaXR5KTsKK30KKworc3RydWN0IHsKKyAgY29uc3QgY2hhciogbmFtZTsKKyAgQ29tcGFyZUZuIGNvbXBhcmVyOworICBHZXRTb3J0S2V5Rm4gc2tnZXR0ZXI7Cit9IHBsYXRmb3Jtc1tdID0geworICB7ICJpY3UiLCBJQ1VzdHJjbXAsIElDVWdldFNvcnRLZXkgfSwKKyAgeyAidzJrIiwgV2luc3RyY21wLCBXaW5nZXRTb3J0S2V5fSwKKyAgeyAid2lueHAiLCBXaW5zdHJjbXAsIFdpbmdldFNvcnRLZXl9LAorICB7ICJhaXgiLCBVTklYc3RyY21wLCBVTklYZ2V0U29ydEtleX0sCisgIHsgImxpbnV4IiwgVU5JWHN0cmNtcCwgVU5JWGdldFNvcnRLZXl9Cit9OworCisKK3ZvaWQgc3RyaW5nVG9Mb3dlcihjaGFyICpzdHJpbmcpIHsKKyAgdWludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IHN0cmxlbihzdHJpbmcpOyBpKyspIHsKKyAgICBzdHJpbmdbaV0gPSB0b2xvd2VyKHN0cmluZ1tpXSk7CisgIH0KK30KKwordm9pZCB1c2FnZShjb25zdCBjaGFyICpuYW1lKSB7CisgIGxvZ2dlci0+bG9nKCJVc2FnZTogJXMgLS1sb2NhbGUgbG9jX25hbWUgLS1wbGF0Zm9ybSBwbGF0Zm9ybVxuIiwgbmFtZSk7Cit9CisKK3ZvaWQgbGlzdEtub3duUGxhdGZvcm1zKCkgeworICB1aW50MzJfdCBpID0gMDsKKyAgbG9nZ2VyLT5sb2coIktub3duIHBsYXRmb3JtczpcbiIpOworICBmb3IoaSA9IDA7IGkgPCBzaXplb2YocGxhdGZvcm1zKS9zaXplb2YocGxhdGZvcm1zWzBdKTsgaSsrKSB7CisgICAgbG9nZ2VyLT5sb2coIlx0JXNcbiIsIHBsYXRmb3Jtc1tpXSk7CisgIH0KK30KKwordm9pZCBhZGRQbGF0Zm9ybShjb25zdCBjaGFyICpwbGF0Zm9ybSkgeworICB1aW50MzJfdCBpOworICAvL3N0cmluZ1RvTG93ZXIocGxhdGZvcm0pOworICBpbnQzMl90IG9sZFBsYXRmb3JtTm8gPSBnUGxhdGZvcm1ObzsKKworICBmb3IoaSA9IDA7IGkgPCBzaXplb2YocGxhdGZvcm1zKS9zaXplb2YocGxhdGZvcm1zWzBdKTsgaSsrKSB7CisgICAgaWYoc3RyY21wKHBsYXRmb3JtLCBwbGF0Zm9ybXNbaV0ubmFtZSkgPT0gMCkgeworICAgICAgZ1BsYXRmb3JtSW5kZXhlc1tnUGxhdGZvcm1ObysrXSA9IGk7CisgICAgfQorICB9CisgIGlmKGdQbGF0Zm9ybU5vID09IG9sZFBsYXRmb3JtTm8pIHsKKyAgICBsb2dnZXItPmxvZygiVW5rbm93biBwbGF0Zm9ybSAlc1xuIiwgcGxhdGZvcm0pOworICAgIGxpc3RLbm93blBsYXRmb3JtcygpOworICB9Cit9CisKK3ZvaWQgcHJvY2Vzc0FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgVUVycm9yQ29kZSAmc3RhdHVzKQoreworICBpbnQzMl90IGkgPSAwOworICBVX01BSU5fSU5JVF9BUkdTKGFyZ2MsIGFyZ3YpOworCisgIGFyZ2MgPSB1X3BhcnNlQXJncyhhcmdjLCBhcmd2LCAoaW50MzJfdCkoc2l6ZW9mKG9wdGlvbnMpL3NpemVvZihvcHRpb25zWzBdKSksIG9wdGlvbnMpOworCisgIGlmKGFyZ2MgPCAwKSB7CisgICAgbG9nZ2VyLT5sb2coIlVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndlstYXJnY10pOworICAgIHVzYWdlKHByb2dOYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZihvcHRpb25zWzBdLmRvZXNPY2N1ciB8fCBvcHRpb25zWzFdLmRvZXNPY2N1cikgeworICAgIHVzYWdlKHByb2dOYW1lKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYob3B0aW9uc1tWRVJCT1NFXS5kb2VzT2NjdXIpIHsKKyAgICBnVmVyYm9zZSA9IFRSVUU7CisgIH0KKyAgaWYob3B0aW9uc1tERUJVR10uZG9lc09jY3VyKSB7CisgICAgZ0RlYnVnID0gVFJVRTsKKyAgICBnVmVyYm9zZSA9IFRSVUU7CisgIH0KKyAgaWYob3B0aW9uc1tFWEVNUExBUl0uZG9lc09jY3VyKSB7CisgICAgZ0V4ZW1wbGFyID0gVFJVRTsKKyAgfQorICBpZihvcHRpb25zW1FVSUVUXS5kb2VzT2NjdXIpIHsKKyAgICBnUXVpZXQgPSBUUlVFOworICB9CisKKyAgLy8gQVNDSUkgYmFzZWQgb3B0aW9ucyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorICAvLyB0aGlzIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3aWxsIGFsbG93IHRvIGxvYWQKKyAgLy8gdXAgSUNVIHJ1bGVzIGFuZCB0aGVuIHBva2UgdGhyb3VnaCB0aGVtLgorICAvLyBJbiB0aGF0IGNhc2UsIHdlIHRlc3Qgb25seSBJQ1UgYW5kIGRvbid0IG5lZWQgCisgIC8vIGEgbG9jYWxlLgorICBpZihvcHRpb25zW1JVTEVTU1RESU5dLmRvZXNPY2N1cikgeworICAgIGdSdWxlc1N0ZGluID0gVFJVRTsKKyAgICBhZGRQbGF0Zm9ybSgiaWN1Iik7CisgICAgcmV0dXJuOworICB9IAorCisgIGlmKG9wdGlvbnNbTE9DQUxFXS5kb2VzT2NjdXIpIHsKKyAgICBnTG9jYWxlID0gb3B0aW9uc1tMT0NBTEVdLnZhbHVlOworICB9IGVsc2UgeworICAgIGdMb2NhbGUgPSBhcmd2WzFdOworICAgIC8vZm9yKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgLy9nTG9jYWxlc1tnTG9jYWxlTm8rK10gPSBhcmd2W2ldOworICAgIC8vfQorICB9CisKKyAgaWYob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyKSB7CisgICAgYWRkUGxhdGZvcm0ob3B0aW9uc1tQTEFURk9STV0udmFsdWUpOworICB9IGVsc2UgeyAvLyB0aGVyZSBpcyBhIGxpc3Qgb2YgcGxhdGZvcm1zIAorICAgIGFkZFBsYXRmb3JtKCJpY3UiKTsKKyAgfQorCisgIGlmKG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHsKKyAgICBmb3IoaSA9IDA7IGkgPCAoaW50MzJfdCkoc2l6ZW9mKHBsYXRmb3Jtcykvc2l6ZW9mKHBsYXRmb3Jtc1swXSkpOyBpKyspIHsKKyAgICAgIGlmKHN0cmNtcChvcHRpb25zW1JFRkVSRU5DRV0udmFsdWUsIHBsYXRmb3Jtc1tpXS5uYW1lKSA9PSAwKSB7CisgICAgICAgIGdSZWZOdW0gPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoaSA9PSBzaXplb2YocGxhdGZvcm1zKS9zaXplb2YocGxhdGZvcm1zWzBdKSkgeworICAgICAgbG9nZ2VyLT5sb2coIlVua25vd24gcmVmZXJlbmNlICVzIVxuIiwgb3B0aW9uc1tSRUZFUkVOQ0VdLnZhbHVlKTsKKyAgICAgIHN0YXR1cyA9IFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ1JlZk51bSA9IDA7CisgIH0KKworICBpZihvcHRpb25zW0VYQ0xVREVTRVRdLmRvZXNPY2N1cikgeworICAgIGdFeGNsdWRlU2V0LmFwcGx5UGF0dGVybihVbmljb2RlU3RyaW5nKG9wdGlvbnNbRVhDTFVERVNFVF0udmFsdWUpLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICBsb2dnZXItPmxvZygiQ2Fubm90IGNvbnN0cnVjdCBleGNsdWRlIHNldCBmcm9tIGFyZ3VtZW50ICVzLiBFcnJvciAlc1xuIiwgb3B0aW9uc1tFWENMVURFU0VUXS52YWx1ZSwgdV9lcnJvck5hbWUoc3RhdHVzKSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKKyAgICAgIGxvZ2dlci0+bG9nKGdFeGNsdWRlU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisgICAgfQorICB9CisKKyAgaWYob3B0aW9uc1tSRVBFUlRPSVJFXS5kb2VzT2NjdXIpICB7CisgICAgZ1JlcGVydG9pcmUuYXBwbHlQYXR0ZXJuKFVuaWNvZGVTdHJpbmcob3B0aW9uc1tSRVBFUlRPSVJFXS52YWx1ZSksIHN0YXR1cyk7CisgICAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgIGxvZ2dlci0+bG9nKCJDYW5ub3QgY29uc3RydWN0IHJlcGVydG9pcmUgZnJvbSBhcmd1bWVudCAlcy4gRXJyb3IgJXNcbiIsIG9wdGlvbnNbUkVQRVJUT0lSRV0udmFsdWUsIHVfZXJyb3JOYW1lKHN0YXR1cykpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlmKG9wdGlvbnNbT1VUUFVUXS5kb2VzT2NjdXIpIHsKKyAgICBvdXRwdXRGb3JtYXQgPSBvcHRpb25zW09VVFBVVF0udmFsdWU7CisgICAgaWYoc3RyY21wKG91dHB1dEZvcm1hdCwgIkhUTUwiKSA9PSAwKSB7CisgICAgICBvdXRFeHRlbnNpb24gPSAiaHRtbCI7CisgICAgfSBlbHNlIGlmKHN0cmNtcChvdXRwdXRGb3JtYXQsICJYTUwiKSA9PSAwKSB7CisgICAgICBvdXRFeHRlbnNpb24gPSAieG1sIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0RXh0ZW5zaW9uID0gInR4dCI7CisgICAgfQorICB9CisKK30KKworLy8gQ2hlY2sgd2hldGhlciB1cHBlciBjYXNlIGNvbWVzIGJlZm9yZSBsb3dlciBjYXNlIG9yIHZpY2UtdmVyc2EKK2ludDMyX3QgCitjaGVja0Nhc2VPcmRlcmluZyh2b2lkKSB7CisgIFVDaGFyIHN0dWZmW11bM10gPSB7CisgICAgeyAweDAwNjEsIHNlcGFyYXRvckNoYXIsIDB4MDA2MX0sIC8vImFhIiwKKyAgICB7IDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDQxIH0sIC8vImFcXHUwMEUwIiwKKyAgICB7IDB4MDA0MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDYxIH0sIC8vIlxcdTAwRTBhIiwKKyAgICB7IDB4MDA0MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDQxIH0sIC8vIlxcdTAwRTBhIiwKKyAgICAvL3sgMHgwMEUwLCBzZXBhcmF0b3JDaGFyLCAweDAwRTAgfSAgLy8iXFx1MDBFMFxcdTAwRTAiCisgIH07CisgIGNvbnN0IGludDMyX3Qgc2l6ZSA9IHNpemVvZihzdHVmZikvc2l6ZW9mKHN0dWZmWzBdKTsKKworICBMaW5lICoqc29ydGVkTGluZXMgPSBuZXcgTGluZSpbc2l6ZV07CisgIExpbmUgbGluZXNbc2l6ZV07CisKKyAgaW50MzJfdCBpID0gMDsKKyAgaW50MzJfdCBvcmRlcmVkID0gMCwgcmV2ZXJzZWQgPSAwOworCisgIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGxpbmVzW2ldLnNldE5hbWUoc3R1ZmZbaV0sIDMpOworICB9CisgIC8vc2V0QXJyYXkoc29ydGVkTGluZXMsIGxpbmVzLCBzaXplKTsKKyAgcXNvcnQoc29ydGVkTGluZXMsIHNpemUsIHNpemVvZihMaW5lKiksIGdDb21wYXJlcik7CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbaV0pIHsKKyAgICAgIG9yZGVyZWQrKzsKKyAgICB9CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbc2l6ZS1pLTFdKSB7CisgICAgICByZXZlcnNlZCsrOworICAgIH0KKyAgfQorCisgIGRlbGV0ZVtdIHNvcnRlZExpbmVzOworICBpZihvcmRlcmVkID09IHNpemUpIHsKKyAgICByZXR1cm4gMDsgLy8gaW4gbm9ybWFsIG9yZGVyCisgIH0gZWxzZSBpZihyZXZlcnNlZCA9PSBzaXplKSB7CisgICAgcmV0dXJuIDE7IC8vIGluIHJldmVyc2VkIG9yZGVyCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOyAvLyB1bmtub3duIG9yZGVyCisgIH0KK30KKwordm9pZAorZ2V0RXhlbXBsYXJzKGNvbnN0IGNoYXIgKmxvY2FsZSwgVW5pY29kZVNldCAmZXhlbXBsYXJzLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgLy8gZmlyc3Qgd2UgZmlsbCBvdXQgc3RydWN0dXJlcyB3aXRoIGV4ZW1wbGFyIGNoYXJhY3RlcnMuCisgIFVSZXNvdXJjZUJ1bmRsZSAqcmVzID0gdXJlc19vcGVuKE5VTEwsIGxvY2FsZSwgJnN0YXR1cyk7CisgIFVuaWNvZGVTdHJpbmcgZXhlbXBsYXJTdHJpbmcgPSB1cmVzX2dldFVuaWNvZGVTdHJpbmdCeUtleShyZXMsICJFeGVtcGxhckNoYXJhY3RlcnMiLCAmc3RhdHVzKTsKKyAgZXhlbXBsYXJzLmNsZWFyKCk7CisgIGV4ZW1wbGFycy5hcHBseVBhdHRlcm4oZXhlbXBsYXJTdHJpbmcsIHN0YXR1cyk7CisgIHVyZXNfY2xvc2UocmVzKTsKK30KKworCit2b2lkCitnZXRGaWxlTmFtZXMoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdGFpbG9yaW5nTmFtZSwgY2hhciAqdGFpbG9yaW5nRHVtcE5hbWUsIGNoYXIgKmRlZmF1bHROYW1lLCBjaGFyICpkZWZhdWx0RHVtcE5hbWUsIGNoYXIgKmRpZmZOYW1lKSB7CisgIGlmKHRhaWxvcmluZ05hbWUpIHsKKyAgICBzdHJjcHkodGFpbG9yaW5nTmFtZSwgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLm5hbWUpOworICAgIHN0cmNhdCh0YWlsb3JpbmdOYW1lLCAiLyIpOworICAgIHN0cmNhdCh0YWlsb3JpbmdOYW1lLCBuYW1lKTsKKyAgICBzdHJjYXQodGFpbG9yaW5nTmFtZSwgIl9yYXcuIik7CisgICAgc3RyY2F0KHRhaWxvcmluZ05hbWUsIG91dEV4dGVuc2lvbik7CisgIH0KKyAgaWYodGFpbG9yaW5nRHVtcE5hbWUpIHsKKyAgICBzdHJjcHkodGFpbG9yaW5nRHVtcE5hbWUsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKTsKKyAgICBzdHJjYXQodGFpbG9yaW5nRHVtcE5hbWUsICIvIik7CisgICAgc3RyY2F0KHRhaWxvcmluZ0R1bXBOYW1lLCBuYW1lKTsKKyAgICBzdHJjYXQodGFpbG9yaW5nRHVtcE5hbWUsICIuZHVtcCIpOworICB9CisKKyAgaWYoZGlmZk5hbWUpIHsKKyAgICBzdHJjcHkoZGlmZk5hbWUsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKTsKKyAgICBzdHJjYXQoZGlmZk5hbWUsICIvIik7CisgICAgc3RyY2F0KGRpZmZOYW1lLCBuYW1lKTsKKyAgICBzdHJjYXQoZGlmZk5hbWUsICJfY29sbGF0aW9uLiIpOworICAgIHN0cmNhdChkaWZmTmFtZSwgb3V0RXh0ZW5zaW9uKTsKKyAgfQorCisgIGlmKGRlZmF1bHROYW1lKSB7CisgICAgc3RyY3B5KGRlZmF1bHROYW1lLCBwbGF0Zm9ybXNbZ1JlZk51bV0ubmFtZSk7CisgICAgc3RyY2F0KGRlZmF1bHROYW1lLCAiLyIpOworICAgIHN0cmNhdChkZWZhdWx0TmFtZSwgbmFtZSk7CisgICAgc3RyY2F0KGRlZmF1bHROYW1lLCAiX2RlZmF1bHRfcmF3LiIpOworICAgIHN0cmNhdChkZWZhdWx0TmFtZSwgb3V0RXh0ZW5zaW9uKTsKKyAgfQorCisgIGlmKGRlZmF1bHREdW1wTmFtZSkgeworICAgIHN0cmNweShkZWZhdWx0RHVtcE5hbWUsIHBsYXRmb3Jtc1tnUmVmTnVtXS5uYW1lKTsKKyAgICBzdHJjYXQoZGVmYXVsdER1bXBOYW1lLCAiLyIpOworICAgIHN0cmNhdChkZWZhdWx0RHVtcE5hbWUsIG5hbWUpOworICAgIHN0cmNhdChkZWZhdWx0RHVtcE5hbWUsICJfZGVmYXVsdC5kdW1wIik7CisgIH0KK30KKwordm9pZCAKK3NldEZpbGVzKGNvbnN0IGNoYXIgKm5hbWUsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICBpZihVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQzMl90IGkgPSAwOworICBjaGFyIHRhaWxvcmluZ05hbWVbMjU2XTsKKyAgY2hhciB0YWlsb3JpbmdEdW1wTmFtZVsyNTZdOworICBjaGFyIGRlZmF1bHROYW1lWzI1Nl07CisgIGNoYXIgZGVmYXVsdER1bXBOYW1lWzI1Nl07CisgIGNoYXIgZGlmZk5hbWVbMjU2XTsKKworICBnZXRGaWxlTmFtZXMobmFtZSwgdGFpbG9yaW5nTmFtZSwgdGFpbG9yaW5nRHVtcE5hbWUsIGRlZmF1bHROYW1lLCBkZWZhdWx0RHVtcE5hbWUsIGRpZmZOYW1lKTsKKyAgaWYob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyICYmICFvcHRpb25zW0RJRkZdLmRvZXNPY2N1cikgeyAgCisgICAgaWYoY3JlYXRlRGlyKHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKSA9PSAwKSB7CisgICAgICB0YWlsb3JpbmdCdW5kbGUgPSBuZXcgVVByaW50ZXIodGFpbG9yaW5nTmFtZSwgImVuIiwgInV0Zi04IiwgTlVMTCwgRkFMU0UpOworICAgICAgZlRhaWxvcmluZ0R1bXAgPSBmb3Blbih0YWlsb3JpbmdEdW1wTmFtZSwgIndiIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXR1cyA9IFVfRklMRV9BQ0NFU1NfRVJST1I7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaWYob3B0aW9uc1tSRUZFUkVOQ0VdLmRvZXNPY2N1ciAmJiAhb3B0aW9uc1tESUZGXS5kb2VzT2NjdXIpIHsKKyAgICBpZihjcmVhdGVEaXIocGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUpID09IDApIHsKKyAgICAgIHJlZmVyZW5jZUJ1bmRsZSA9IG5ldyBVUHJpbnRlcihkZWZhdWx0TmFtZSwgImVuIiwgInV0Zi04IiwgTlVMTCwgRkFMU0UpOworICAgICAgZkRlZmF1bHREdW1wID0gZm9wZW4oZGVmYXVsdER1bXBOYW1lLCAid2IiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdHVzID0gVV9GSUxFX0FDQ0VTU19FUlJPUjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpZigob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyICYmIG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHx8IG9wdGlvbnNbRElGRl0uZG9lc09jY3VyKSB7CisgICAgaWYoY3JlYXRlRGlyKHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKSA9PSAwKSB7CisgICAgICBidW5kbGUgPSBuZXcgVVByaW50ZXIoZGlmZk5hbWUsICJlbiIsICJ1dGYtOCIsIE5VTEwsIEZBTFNFKTsKKyAgICB9CisgIH0KKyAgaWYob3B0aW9uc1tESUZGXS5kb2VzT2NjdXIpIHsKKyAgICBmVGFpbG9yaW5nRHVtcCA9IGZvcGVuKHRhaWxvcmluZ0R1bXBOYW1lLCAicmIiKTsKKyAgICBmRGVmYXVsdER1bXAgPSBmb3BlbihkZWZhdWx0RHVtcE5hbWUsICJyYiIpOworICB9Cit9CisKKworVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CitzdGF0aWMgVW5pY29kZVNldCBVTkFTU0lHTkVEKFVuaWNvZGVTdHJpbmcoIls6Q246XSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgR0VORVJBTF9BQ0NFTlRTKFVuaWNvZGVTdHJpbmcoIltbOmJsb2NrPUNvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrczpdLVs6Q246XV0iKSwgc3RhdHVzKTsKKy8vc3RhdGljIFVuaWNvZGVTZXQgQVNDSUlfQkFTRShVbmljb2RlU3RyaW5nKCJbWzpBU0NJSTpdLVs6TDpdLVs6TjpdXSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgQVNDSUlfQkFTRShVbmljb2RlU3RyaW5nKCJbWzpBU0NJSTpdXSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgQUxQSEFCRVRJQyhVbmljb2RlU3RyaW5nKCJbOmFscGhhYmV0aWM6XSIpLCBzdGF0dXMpOworLy9zdGF0aWMgVW5pY29kZVNldCBDT05UUk9MKFVuaWNvZGVTdHJpbmcoIltbOmNvbnRyb2w6XVtcXHUwMDAwLVxcdTAwMkZdXSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgQk1QKFVuaWNvZGVTdHJpbmcoIltcXHUwMDAwLVxcdUZGRkZdIiksIHN0YXR1cyk7CisKK3N0YXRpYyBVbmljb2RlU2V0IENPTlRST0woVW5pY29kZVN0cmluZygiWzpjb250cm9sOl0iKSwgc3RhdHVzKTsKKworVUNvbGxhdG9yICoKK3NldExvY2FsZShjb25zdCBjaGFyKiBsb2NhbGUsIFVFcnJvckNvZGUgJnN0YXR1cykKK3sKKyAgZ1dpbkxDSUQgPSB1bG9jX2dldExDSUQobG9jYWxlKTsKKyAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxvY2FsZSk7CisKKyAgaWYoZ0NvbCkgeworICAgIHVjb2xfY2xvc2UoZ0NvbCk7CisgIH0KKyAgZ0NvbCA9IHVjb2xfb3Blbihsb2NhbGUsICZzdGF0dXMpOworICB1Y29sX3NldEF0dHJpYnV0ZShnQ29sLCBVQ09MX05PUk1BTElaQVRJT05fTU9ERSwgVUNPTF9PTiwgJnN0YXR1cyk7CisgIC8vdWNvbF9zZXRBdHRyaWJ1dGUoY29sLCBVQ09MX0FMVEVSTkFURV9IQU5ETElORywgVUNPTF9TSElGVEVELCAmc3RhdHVzKTsKKyAgLy91Y29sX3NldEF0dHJpYnV0ZShjb2wsIFVDT0xfU1RSRU5HVEgsIFVDT0xfUVVBVEVSTkFSWSwgJnN0YXR1cyk7CisKKyAgcmV0dXJuIGdDb2w7Cit9CisKKworCitVQ29sbGF0b3IgKgorc2V0UmVmZXJlbmNlKFVFcnJvckNvZGUgJnN0YXR1cykgCit7CisgIGdXaW5MQ0lEID0gdWxvY19nZXRMQ0lEKCJlbiIpOworICBzZXRsb2NhbGUoTENfQ09MTEFURSwgImVuX1VTLlVURi04Iik7CisgIGlmKGdDb2wpIHsKKyAgICB1Y29sX2Nsb3NlKGdDb2wpOworICB9CisgIGdDb2wgPSB1Y29sX29wZW4oInJvb3QiLCAmc3RhdHVzKTsKKyAgdWNvbF9zZXRBdHRyaWJ1dGUoZ0NvbCwgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUsIFVDT0xfT04sICZzdGF0dXMpOworICByZXR1cm4gZ0NvbDsKK30KKwordm9pZAorcHJvY2Vzc0ludGVyYWN0aXZlKCkgeworICBjaGFyIGNvbW1hbmRbMjU2XTsKKyAgd2hpbGUoZmdldHMoY29tbWFuZCwgMjU2LCBzdGRpbikpIHsKKworICB9Cit9CisKK1VDaGFyIHByb2JlQ2hhcnNbXVs0XSA9IHsKKyAgeyAweDAwNjEsIDB4MDA2MiwgMHgwMEUxLCAweDAwNDEgfSwgLy8gbGF0aW4gd2l0aCBhLWdyYXZlCisgIHsgMHgwMDQxLCAweDAwNDIsIDB4MDBDMSwgMHgwMDYxIH0sIC8vIHVwcGVyIGZpcnN0CisgIHsgMHgwMDZFLCAweDAwNkYsIDB4MDBGMSwgMHgwMDRFIH0sIC8vIGxhdGluIHdpdGggbi10aWxkYQorICB7IDB4MDA0RSwgMHgwMDRGLCAweDAwRDEsIDB4MDA2RSB9LCAvLyB1cHBlciBmaXJzdAorICB7IDB4MDQzMywgMHgwNDkzLCAweDA0OTEsIDB4MDQxMyB9LCAvLyBDeXJpbGxpYworICB7IDB4MDQxMywgMHgwNDkyLCAweDA0OTAsIDB4MDQzMyB9LCAvLyB1cHBlciBmaXJzdAorICB7IDB4MzA0NSwgMHgzMDQ3LCAweDMwOTQsIDB4MzA0NiB9ICAvLyBIaXJhZ2FuYS9LYXRha2FuYSAobGFzdCByZXNvcnQpCisKK307CisKK3ZvaWQKK3Byb2Nlc3NDb2xsYXRvcihVQ29sbGF0b3IgKmNvbCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIGludDMyX3QgaSA9IDA7CisgIHVpbnQzMl90IGogPSAwOworICBnQ29sID0gY29sOworICBVQ2hhciBydWxlU3RyaW5nWzE2Mzg0XTsKKyAgY2hhciBteUxvY1syNTZdOworCisgIGludDMyX3QgcnVsZVN0cmluZ0xlbmd0aCA9IHVjb2xfZ2V0UnVsZXNFeChnQ29sLCBVQ09MX1RBSUxPUklOR19PTkxZLCBydWxlU3RyaW5nLCAxNjM4NCk7CisgIGxvZ2dlci0+bG9nKFVuaWNvZGVTdHJpbmcocnVsZVN0cmluZywgcnVsZVN0cmluZ0xlbmd0aCksIFRSVUUpOworICBjb25zdCBjaGFyICpsb2NhbGUgPSB1Y29sX2dldExvY2FsZShnQ29sLCBVTE9DX1JFUVVFU1RFRF9MT0NBTEUsICZzdGF0dXMpOworICBpZihsb2NhbGUgPT0gTlVMTCkgeworICAgIGxvY2FsZSA9ICJlbiI7CisgIH0KKyAgc3RyY3B5KG15TG9jLCBsb2NhbGUpOworICBVbmljb2RlU2V0IGV4ZW1wbGFyVVNldDsKKyAgVW5pY29kZVNldCBSZWZSZXBlcnRvaXJlOworCisgIFVuaWNvZGVTZXQgdGFpbG9yZWQ7CisKKyAgdGFpbG9yZWQgPSAqKChVbmljb2RlU2V0ICopdWNvbF9nZXRUYWlsb3JlZFNldChnQ29sLCAmc3RhdHVzKSk7CisgIHRhaWxvcmVkLnJlbW92ZUFsbChDT05UUk9MKTsKKworCisgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKKyAgaW50IHNhbml0eVJlc3VsdDsKKworICBVbmljb2RlU2V0IGhhblNldDsKKyAgVUJvb2wgaGFuQXBwZWFycyA9IEZBTFNFOworCisgIGRlYnVnLT5sb2coIlxuR2VuZXJhdGluZyBvcmRlciBmb3IgcGxhdGZvcm06ICVzXG4iLCBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSk7CisgIGdDb21wYXJlciA9IHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5jb21wYXJlcjsKKworICBTdHJlbmd0aFByb2JlIHByb2JlKHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5jb21wYXJlciwgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLnNrZ2V0dGVyLCAweDAwMzAsIHByb2JlQ2hhcnNbMF1bMF0sIHByb2JlQ2hhcnNbMF1bMV0sIHByb2JlQ2hhcnNbMF1bMl0sIHByb2JlQ2hhcnNbMF1bM10pOworICBzYW5pdHlSZXN1bHQgPSBwcm9iZS5jaGVja1Nhbml0eSgpOworICBqID0gMDsKKyAgd2hpbGUoc2FuaXR5UmVzdWx0ICYmIGorMSA8IHNpemVvZihwcm9iZUNoYXJzKS9zaXplb2YocHJvYmVDaGFyc1swXSkpIHsKKyAgIGorKzsKKyAgIHNhbml0eVJlc3VsdCA9ICBwcm9iZS5zZXRQcm9iZUNoYXJzKHByb2JlQ2hhcnNbal1bMF0sIHByb2JlQ2hhcnNbal1bMV0sIHByb2JlQ2hhcnNbal1bMl0sIHByb2JlQ2hhcnNbal1bM10pOworICB9CisgIGlmKHNhbml0eVJlc3VsdCkgeworICAgIGxvZ2dlci0+bG9nKCJCYWQgY2hvaWNlIG9mIHByb2JlIGNoYXJhY3RlcnMhIFNhbml0eSByZXR1cm5lZCAlaS4gRXhpdGluZ1xuIiwgc2FuaXR5UmVzdWx0LCBzYW5pdHlSZXN1bHQpOworICAgIHJldHVybjsKKyAgfQorICBsb2dnZXItPmxvZygiUHJvYmUgY2hhcnM6ICVDLCAlQywgJUMsICVDXG4iLCBwcm9iZUNoYXJzW2pdWzBdLCBwcm9iZUNoYXJzW2pdWzFdLCBwcm9iZUNoYXJzW2pdWzJdLCBwcm9iZUNoYXJzW2pdWzNdKTsgCisKKyAgZGVidWctPm9mZigpOworCisgIGlmKGdSZXBlcnRvaXJlLnNpemUoKSkgeworICAgIGV4ZW1wbGFyVVNldCA9IGdSZXBlcnRvaXJlOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlUmVwZXJ0b2lyZShsb2NhbGUsIGV4ZW1wbGFyVVNldCwgaGFuQXBwZWFycywgc3RhdHVzKTsKKyAgfQorICBleGVtcGxhclVTZXQuYWRkQWxsKHRhaWxvcmVkKTsKKyAgaGFuU2V0LmFwcGx5SW50UHJvcGVydHlWYWx1ZShVQ0hBUl9TQ1JJUFQsIFVTQ1JJUFRfSEFOLCBzdGF0dXMpOworICBleGVtcGxhclVTZXQucmVtb3ZlQWxsKGhhblNldCk7CisgIAorICBsb2dnZXItPmxvZyhleGVtcGxhclVTZXQudG9QYXR0ZXJuKHBhdHRlcm4sIFRSVUUpLCBUUlVFKTsKKworICBleGVtcGxhclVTZXQgPSBmbGF0dGVuKGV4ZW1wbGFyVVNldCwgc3RhdHVzKTsKKyAgbG9nZ2VyLT5sb2coZXhlbXBsYXJVU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisKKyAgaWYoIW9wdGlvbnNbUFJJTlRSRUZdLmRvZXNPY2N1cikgeworCisgICAgbG9nZ2VyLT5sb2coIlxuKioqIERldGVjdGluZyBvcmRlcmluZyBmb3IgdGhlIGxvY2FsZVxuXG4iKTsKKworICAgIGRlYnVnLT5vbigpOworICAgIFNvcnRlZExpbmVzIGxpbmVzKGV4ZW1wbGFyVVNldCwgZ0V4Y2x1ZGVTZXQsIHByb2JlLCBsb2dnZXIsIGRlYnVnKTsKKyAgICBsaW5lcy5hbmFseXNlKHN0YXR1cyk7CisgICAgbGluZXMuY2FsY3VsYXRlU29ydEtleXMoKTsKKyAgICBkZWJ1Zy0+bG9nKCJcbioqKiBGaW5hbCBvcmRlclxuXG4iKTsKKyAgICBkZWJ1Zy0+bG9nKGxpbmVzLnRvUHJldHR5U3RyaW5nKFRSVUUsIFRSVUUpLCBUUlVFKTsKKyAgICBsaW5lcy50b0ZpbGUoZlRhaWxvcmluZ0R1bXAsIFRSVUUsIHN0YXR1cyk7CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2cobGluZXMudG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLm5hbWUsIE5VTEwsIFRSVUUsIFRSVUUsIGhhbkFwcGVhcnMpLCBUUlVFKTsKKyAgICAvL2RlYnVnLT5vZmYoKTsKKworICAgIGlmKG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHsKKyAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgIGxpbmVzLmdldFJlcGVydG9pcmUoUmVmUmVwZXJ0b2lyZSk7CisgICAgICBzZXRSZWZlcmVuY2Uoc3RhdHVzKTsKKworICAgICAgbG9nZ2VyLT5sb2coZXhlbXBsYXJVU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisgICAgICBsb2dnZXItPmxvZyhSZWZSZXBlcnRvaXJlLnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisKKyAgICAgIFN0cmVuZ3RoUHJvYmUgUmVmUHJvYmUocGxhdGZvcm1zW2dSZWZOdW1dLmNvbXBhcmVyLCBwbGF0Zm9ybXNbZ1JlZk51bV0uc2tnZXR0ZXIpOworICAgICAgbG9nZ2VyLT5sb2coIlxuKioqIERldGVjdGluZyBvcmRlcmluZyBmb3IgcmVmZXJlbmNlXG5cbiIpOworICAgICAgU29ydGVkTGluZXMgUmVmTGluZXMoZXhlbXBsYXJVU2V0LCBnRXhjbHVkZVNldCwgUmVmUHJvYmUsIGxvZ2dlciwgZGVidWcpOworICAgICAgUmVmTGluZXMuYW5hbHlzZShzdGF0dXMpOworICAgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coUmVmTGluZXMudG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUsIE5VTEwsIFRSVUUsIFRSVUUsIEZBTFNFKSwgVFJVRSk7CisgICAgICBSZWZMaW5lcy50b0ZpbGUoZkRlZmF1bHREdW1wLCBUUlVFLCBzdGF0dXMpOworCisgICAgICBsaW5lcy5yZWR1Y2VEaWZmZXJlbmNlKFJlZkxpbmVzKTsKKyAgICAgIGxvZ2dlci0+bG9nKCJcbioqKiBGaW5hbCBydWxlc1xuXG4iKTsKKyAgICAgIGxvZ2dlci0+bG9nKGxpbmVzLnRvUHJldHR5U3RyaW5nKFRSVUUpLCBUUlVFKTsKKyAgICAgIGJ1bmRsZS0+bG9nKGxpbmVzLnRvT3V0cHV0KG91dHB1dEZvcm1hdCwgbXlMb2MsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lLCBwbGF0Zm9ybXNbZ1JlZk51bV0ubmFtZSwgVFJVRSwgVFJVRSwgaGFuQXBwZWFycyksIFRSVUUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzZXRSZWZlcmVuY2Uoc3RhdHVzKTsKKyAgICBTdHJlbmd0aFByb2JlIFJlZlByb2JlKHBsYXRmb3Jtc1tnUmVmTnVtXS5jb21wYXJlciwgcGxhdGZvcm1zW2dSZWZOdW1dLnNrZ2V0dGVyKTsKKyAgICBsb2dnZXItPmxvZygiXG4qKiogRGV0ZWN0aW5nIG9yZGVyaW5nIGZvciByZWZlcmVuY2VcblxuIik7CisgICAgU29ydGVkTGluZXMgUmVmTGluZXMoZXhlbXBsYXJVU2V0LCBnRXhjbHVkZVNldCwgUmVmUHJvYmUsIGxvZ2dlciwgZGVidWcpOworICAgIFJlZkxpbmVzLmFuYWx5c2Uoc3RhdHVzKTsKKyAgICBsb2dnZXItPmxvZyhSZWZMaW5lcy50b1ByZXR0eVN0cmluZyhUUlVFKSwgVFJVRSk7CisgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coUmVmTGluZXMudG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUsIE5VTEwsIFRSVUUsIFRSVUUsIEZBTFNFKSwgVFJVRSk7CisgIH0KKyAgaWYoaGFuQXBwZWFycykgeworICAgIC8vIHRoZXJlIGFyZSBIYW4gY2hhcmFjdGVycy4gVGhpcyBpcyBhIGh1Z2UgYmxvY2suIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyB0byBqdXN0IHNvcnQgaXQsIGNvbXBhcmUgdG8gZW1wdHkKKyAgICAvLyBhbmQgc3BpdCBpdCBvdXQuIEFueXRoaW5nIGVsc2Ugd291bGQgYmUgYSBzdWljaWRlIChhY3R1YWxseSBpcyAtIGtlcm5lbCBqdXN0IGtpbGxzIHlvdSA6KQorICAgIGxvZ2dlci0+bG9nKCJcbioqKiBEZXRlY3Rpbmcgb3JkZXIgZm9yIEhhblxuIik7CisgICAgZGVidWctPm9mZigpOworICAgIHNldExvY2FsZShnTG9jYWxlLCBzdGF0dXMpOworICAgIGV4ZW1wbGFyVVNldC5jbGVhcigpOworICAgIGV4ZW1wbGFyVVNldC5hcHBseUludFByb3BlcnR5VmFsdWUoVUNIQVJfU0NSSVBULCBVU0NSSVBUX0hBTiwgc3RhdHVzKTsKKyAgICBleGVtcGxhclVTZXQgPSBmbGF0dGVuKGV4ZW1wbGFyVVNldCwgc3RhdHVzKTsKKyAgICBTb3J0ZWRMaW5lcyBoYW4oZXhlbXBsYXJVU2V0LCBnRXhjbHVkZVNldCwgcHJvYmUsIGxvZ2dlciwgZGVidWcpOworICAgIGhhbi5zb3J0KFRSVUUsIFRSVUUpOworICAgIGhhbi5jbGFzc2lmeVJlcGVydG9pcmUoKTsKKyAgICBoYW4uZ2V0Qm91bmRzKHN0YXR1cyk7CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2coIkhhbiBvcmRlcmluZzo8YnI+XG4iKTsKKyAgICB0YWlsb3JpbmdCdW5kbGUtPmxvZyhoYW4udG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLm5hbWUsIE5VTEwsIFRSVUUsIEZBTFNFLCBGQUxTRSksIFRSVUUpOworICAgIGJ1bmRsZS0+bG9nKGhhbi50b091dHB1dChvdXRwdXRGb3JtYXQsIG15TG9jLCBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSwgTlVMTCwgVFJVRSwgRkFMU0UsIEZBTFNFKSwgVFJVRSk7CisgIH0KKyAgdWNvbF9jbG9zZShnQ29sKTsKK30KKwordm9pZAorcHJvY2Vzc0xvY2FsZShjb25zdCBjaGFyICpsb2NhbGUsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICBzZXRMb2NhbGUobG9jYWxlLCBzdGF0dXMpOworICBzZXRGaWxlcyhsb2NhbGUsIHN0YXR1cyk7CisgIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZGVidWctPmxvZygiTG9jYWxlICVzIChMQ0lEOiUwNlgsIHVuaXg6JXMpXG4iLCBsb2NhbGUsIGdXaW5MQ0lELCBzZXRsb2NhbGUoTENfQ09MTEFURSwgTlVMTCkpOworICB0YWlsb3JpbmdCdW5kbGUtPmxvZygiLy8gT3JkZXJpbmcgZm9yIGxvY2FsZSAlcyAoTENJRDolMDZYLCB1bml4OiVzKSwgcGxhdGZvcm0gJXMgcmVmZXJlbmNlICVzPGJyPlxuIiwgCisgICAgbG9jYWxlLCBnV2luTENJRCwgc2V0bG9jYWxlKExDX0NPTExBVEUsIE5VTEwpLCAKKyAgICBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSwgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUpOworICBpZihvcHRpb25zW1JFRkVSRU5DRV0uZG9lc09jY3VyKSB7CisgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coIi8vIFJlZmVyZW5jZSBmb3IgbG9jYWxlICVzIChMQ0lEOiUwNlgsIHVuaXg6JXMpLCBwbGF0Zm9ybSAlcyByZWZlcmVuY2UgJXM8YnI+XG4iLCAKKyAgICAgIGxvY2FsZSwgZ1dpbkxDSUQsIHNldGxvY2FsZShMQ19DT0xMQVRFLCBOVUxMKSwgCisgICAgICBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSwgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUpOworICB9CisKKworICBwcm9jZXNzQ29sbGF0b3IoZ0NvbCwgc3RhdHVzKTsKK30KKworCisKK1VCb29sIAoraGFzQ29sbGF0aW9uRWxlbWVudHMoY29uc3QgY2hhciAqbG9jTmFtZSkgeworCisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVUmVzb3VyY2VCdW5kbGUgKkNvbEVsID0gTlVMTDsKKworICBVUmVzb3VyY2VCdW5kbGUgKmxvYyA9IHVyZXNfb3BlbihOVUxMLCBsb2NOYW1lLCAmc3RhdHVzKTs7CisKKyAgaWYoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgQ29sRWwgPSB1cmVzX2dldEJ5S2V5KGxvYywgIkNvbGxhdGlvbkVsZW1lbnRzIiwgQ29sRWwsICZzdGF0dXMpOworICAgIGlmKHN0YXR1cyA9PSBVX1pFUk9fRVJST1IpIHsgLyogZG8gdGhlIHRlc3QgLSB0aGVyZSBhcmUgcmVhbCBlbGVtZW50cyAqLworICAgICAgdXJlc19jbG9zZShDb2xFbCk7CisgICAgICB1cmVzX2Nsb3NlKGxvYyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgdXJlc19jbG9zZShDb2xFbCk7CisgICAgdXJlc19jbG9zZShsb2MpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworaW50CittYWluKGludCBhcmdjLAorICAgICBjaGFyKiBhcmd2W10pCit7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBsb2dnZXIgPSBuZXcgVVByaW50ZXIoc3Rkb3V0LCAiZW4iLCAibGF0aW4tMSIpOworICBkZWJ1ZyA9ICBuZXcgVVByaW50ZXIoc3RkZXJyLCAiZW4iLCAibGF0aW4tMSIpOworCisvKgorICBVU2V0ICp3c3AgPSB1cHJ2X29wZW5SdWxlV2hpdGVTcGFjZVNldCgmc3RhdHVzKTsKKyAgdXNldF9hZGQod3NwLCAweDAwNDEpOworICB1c2V0X3JlbW92ZSh3c3AsIDB4MDA0MSk7CisgIFVuaWNvZGVTdHJpbmcgcGF0OworICAoKFVuaWNvZGVTZXQgKil3c3ApLT50b1BhdHRlcm4ocGF0LCBUUlVFKTsKKyAgcGF0LnNldENoYXJBdChwYXQubGVuZ3RoKCksIDApOworICBlc2NhcGVTdHJpbmcocGF0LmdldEJ1ZmZlcigpLCBwYXQubGVuZ3RoKCksIGxvZyk7CisgIHVfZmZsdXNoKGxvZyk7CisqLworCisgIHByb2Nlc3NBcmdzKGFyZ2MsIGFyZ3YsIHN0YXR1cyk7CisgIGludDMyX3QgaSA9IDA7CisKKworCisgIGlmKFVfRkFJTFVSRShzdGF0dXMpIHx8IGdQbGF0Zm9ybU5vID09IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICB1dGY4Y252ID0gdWNudl9vcGVuKCJ1dGYtOCIsICZzdGF0dXMpOyAgICAvLyB3ZSBhcmUganVzdCBkb2luZyBVVEYtOCBsb2NhbGVzIGZvciBub3cuCisgIGdVQ0EgPSB1Y29sX29wZW4oInJvb3QiLCAmc3RhdHVzKTsKKworICBpZihvcHRpb25zW0lOVEVSQUNUSVZFXS5kb2VzT2NjdXIpIHsKKyAgICBwcm9jZXNzSW50ZXJhY3RpdmUoKTsKKyAgfSBlbHNlIHsKKyAgICBpZihnUnVsZXNTdGRpbikgeworICAgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgICBVQ2hhciBydWxlQnVmZmVyWzE2Mzg0XTsKKyAgICAgIFVDaGFyICpydWxlcyA9IHJ1bGVCdWZmZXI7CisgICAgICBpbnQzMl90IG1heFJ1bGVMZW4gPSAxNjM4NDsKKyAgICAgIGludDMyX3QgckxlbiA9IDA7CisgICAgICB3aGlsZShmZ2V0cyhidWZmZXIsIDEwMjQsIHN0ZGluKSkgeworICAgICAgICBpZihidWZmZXJbMF0gIT0gJy8nICYmIGJ1ZmZlclsxXSAhPSAnLycpIHsKKyAgICAgICAgICByTGVuID0gdV91bmVzY2FwZShidWZmZXIsIHJ1bGVzLCBtYXhSdWxlTGVuKTsKKyAgICAgICAgICBydWxlcyArPSByTGVuOworICAgICAgICAgIG1heFJ1bGVMZW4gLT0gckxlbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVVBhcnNlRXJyb3IgcGFyc2VFcnJvcjsKKyAgICAgIC8vZXNjYXBlU3RyaW5nKHJ1bGVCdWZmZXIsIHJ1bGVzLXJ1bGVCdWZmZXIsIGxvZyk7Ly8KKyAgICAgIGRlYnVnLT5sb2coIiVVXG4iLCBydWxlQnVmZmVyKTsKKworICAgICAgVUNvbGxhdG9yICpjb2wgPSB1Y29sX29wZW5SdWxlcyhydWxlQnVmZmVyLCBydWxlcy1ydWxlQnVmZmVyLCBVQ09MX0RFRkFVTFQsIFVDT0xfREVGQVVMVCwgJnBhcnNlRXJyb3IsICZzdGF0dXMpOworICAgICAgaWYoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgc2V0RmlsZXMoInN0ZGluUnVsZXMiLCBzdGF0dXMpOworICAgICAgICBwcm9jZXNzQ29sbGF0b3IoY29sLCBzdGF0dXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nZ2VyLT5sb2coIkVycm9yICVzXG4iLCB1X2Vycm9yTmFtZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYob3B0aW9uc1tESUZGXS5kb2VzT2NjdXIpIHsKKyAgICAgIGxvZ2dlci0+bG9nKCJEaWZmaW5nIHR3byBkdW1wc1xuIik7CisgICAgICAvLyBtdXN0IGhhdmUgbG9jYWxlLCBwbGF0Zm9ybSBhbmQgcmVmIGluIG9yZGVyIHRvIGJlIAorICAgICAgLy8gYWJsZSB0byBmaW5kIGR1bXAgZmlsZXMuCisgICAgICBzZXRGaWxlcyhnTG9jYWxlLCBzdGF0dXMpOworICAKKyAgICAgIGlmKGZUYWlsb3JpbmdEdW1wICYmIGZEZWZhdWx0RHVtcCkgeworCSAgICBTb3J0ZWRMaW5lcyB0YWlsb3JpbmcoZlRhaWxvcmluZ0R1bXAsIGxvZ2dlciwgZGVidWcsIHN0YXR1cyk7CisJICAgIGxvZ2dlci0+bG9nKHRhaWxvcmluZy50b1N0cmluZyhUUlVFKSwgVFJVRSk7CisJICAgIFNvcnRlZExpbmVzIHJlZmVyZW5jZShmRGVmYXVsdER1bXAsIGxvZ2dlciwgZGVidWcsIHN0YXR1cyk7CisJICAgIGxvZ2dlci0+bG9nKHJlZmVyZW5jZS50b1N0cmluZyhUUlVFKSwgVFJVRSk7CisJICAgIHRhaWxvcmluZy5yZWR1Y2VEaWZmZXJlbmNlKHJlZmVyZW5jZSk7CisJICAgIGxvZ2dlci0+bG9nKCJcbioqKiBGaW5hbCBydWxlc1xuXG4iKTsKKwkgICAgbG9nZ2VyLT5sb2codGFpbG9yaW5nLnRvUHJldHR5U3RyaW5nKFRSVUUpLCBUUlVFKTsKKwkgICAgLy9yZXN1bHQtPmxvZyhsaW5lcy50b1ByZXR0eVN0cmluZyhUUlVFKSwgVFJVRSk7CisJICAgIGJ1bmRsZS0+bG9nKHRhaWxvcmluZy50b091dHB1dChvdXRwdXRGb3JtYXQsIGdMb2NhbGUsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lLCBwbGF0Zm9ybXNbZ1JlZk51bV0ubmFtZSwgVFJVRSwgVFJVRSwgRkFMU0UpLCBUUlVFKTsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICBpZihnTG9jYWxlKSB7CisgICAgICAgIHByb2Nlc3NMb2NhbGUoZ0xvY2FsZSwgc3RhdHVzKTsKKyAgICAgIH0gZWxzZSBpZihnTG9jYWxlTm8pIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgZ0xvY2FsZU5vOyBpKyspIHsKKyAgICAgICAgICBwcm9jZXNzTG9jYWxlKGdMb2NhbGVzW2ldLCBzdGF0dXMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvLyBkbyB0aGUgbG9vcCB0aHJvdWdoIGFsbCB0aGUgbG9jYWxlcworICAgICAgICBpbnQzMl90IG5vT2ZMb2MgPSB1bG9jX2NvdW50QXZhaWxhYmxlKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxvY05hbWUgPSBOVUxMOworICAgICAgICBmb3IoaSA9IDA7IGk8bm9PZkxvYzsgaSsrKSB7CisgICAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAgIGxvY05hbWUgPSB1bG9jX2dldEF2YWlsYWJsZShpKTsKKyAgICAgICAgICBpZihoYXNDb2xsYXRpb25FbGVtZW50cyhsb2NOYW1lKSkgeworICAgICAgICAgICAgcHJvY2Vzc0xvY2FsZShsb2NOYW1lLCBzdGF0dXMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgdWNvbF9jbG9zZShnVUNBKTsKKyAgdWNudl9jbG9zZSh1dGY4Y252KTsKKworICBkZWxldGUgbG9nZ2VyOworICBkZWxldGUgZGVidWc7CisgIGlmKHRhaWxvcmluZ0J1bmRsZSkgeworICAgIGRlbGV0ZSB0YWlsb3JpbmdCdW5kbGU7CisgIH0KKyAgaWYocmVmZXJlbmNlQnVuZGxlKSB7CisgICAgZGVsZXRlIHJlZmVyZW5jZUJ1bmRsZTsKKyAgfQorICBpZihidW5kbGUpIHsKKyAgICBkZWxldGUgYnVuZGxlOworICB9CisgIGlmKGZUYWlsb3JpbmdEdW1wKSB7CisgICAgZmNsb3NlKGZUYWlsb3JpbmdEdW1wKTsKKyAgfQorICBpZihmRGVmYXVsdER1bXApIHsKKyAgICBmY2xvc2UoZkRlZmF1bHREdW1wKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCitVbmljb2RlU3RyaW5nIHByb3BlcnR5QW5kVmFsdWVOYW1lKFVQcm9wZXJ0eSBwcm9wLCBpbnQzMl90IGkpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5hcHBlbmQodV9nZXRQcm9wZXJ0eU5hbWUocHJvcCwgVV9MT05HX1BST1BFUlRZX05BTUUpKTsKKyAgcmVzdWx0LmFwcGVuZCgiPSIpOworICByZXN1bHQuYXBwZW5kKHVfZ2V0UHJvcGVydHlWYWx1ZU5hbWUocHJvcCwgaSwgVV9MT05HX1BST1BFUlRZX05BTUUpKTsKKworICAgIC8vKyAiKCIgKyBwcm9wICsgIiwiICsgaSArICIpICI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZCBnZW5lcmF0ZVJlcGVydG9pcmUoY29uc3QgY2hhciAqbG9jYWxlLCBVbmljb2RlU2V0ICZyZXAsIFVCb29sICZoYW5BcHBlYXJzLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgICBVbmljb2RlU3RyaW5nIGRpc3BOYW1lOworICAgIGRlYnVnLT5sb2coIkdldHRpbmcgcmVwZXJ0b2lyZSBmb3IgJXNcbiIsIGxvY2FsZSk7CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2coIi8vIFNjcmlwdHMgaW4gcmVwZXJ0b2lyZTogIik7CisgICAgaWYob3B0aW9uc1tSRUZFUkVOQ0VdLmRvZXNPY2N1cikgeworICAgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coIi8vIFNjcmlwdHMgaW4gcmVwZXJ0b2lyZTogIik7CisgICAgfQorCXJlcC5jbGVhcigpOworICAgIFVuaWNvZGVTZXQgZGVsdGE7CisgICAgCisgICAgVVNjcmlwdENvZGUgc2NyaXB0WzI1Nl07CisgICAgaW50MzJfdCBpID0gMDsKKyAgICAvLyBub3cgYWRkIHRoZSBzY3JpcHRzIGZvciB0aGUgbG9jYWxlCisgICAgVVByb3BlcnR5IHByb3AgPSBVQ0hBUl9TQ1JJUFQ7CisJaW50MzJfdCBzY3JpcHRMZW5ndGggPSB1c2NyaXB0X2dldENvZGUobG9jYWxlLCBzY3JpcHQsIDI1NiwgJnN0YXR1cyk7CisgICAgaWYoc2NyaXB0TGVuZ3RoKSB7CisJICBmb3IgKGkgPSAwOyBpIDwgc2NyaXB0TGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaWYoc2NyaXB0W2ldID09IFVTQ1JJUFRfSEFOKSB7CisgICAgICAgICAgaGFuQXBwZWFycyA9IFRSVUU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGVsdGEuYXBwbHlJbnRQcm9wZXJ0eVZhbHVlKHByb3AsIHNjcmlwdFtpXSwgc3RhdHVzKTsKKyAgICAgICAgZGVidWctPmxvZygiQWRkaW5nICIpOworICAgICAgICBkZWJ1Zy0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIHNjcmlwdFtpXSksIFRSVUUpOworICAgICAgICB0YWlsb3JpbmdCdW5kbGUtPmxvZygiLy8gIik7CisgICAgICAgIHRhaWxvcmluZ0J1bmRsZS0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIHNjcmlwdFtpXSksIFRSVUUpOworICAgICAgICBpZihvcHRpb25zW1JFRkVSRU5DRV0uZG9lc09jY3VyKSB7CisgICAgICAgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coIi8vICIpOworICAgICAgICAgIHJlZmVyZW5jZUJ1bmRsZS0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIHNjcmlwdFtpXSksIFRSVUUpOworICAgICAgICB9CisJCXJlcC5hZGRBbGwoZGVsdGEpOworCSAgfQorICAgIH0gZWxzZSB7CisgICAgICBkZWx0YS5hcHBseUludFByb3BlcnR5VmFsdWUoVUNIQVJfU0NSSVBULCBVU0NSSVBUX0xBVElOLCBzdGF0dXMpOworICAgICAgcmVwLmFkZEFsbChkZWx0YSk7CisgICAgfQorICAgIAorICAgIC8vIG5vdyBzZWUgd2hpY2ggYmxvY2tzIHRob3NlIG92ZXJsYXAsIGFuZCBhZGQKKyAgICBwcm9wID0gVUNIQVJfQkxPQ0s7CisgICAgaW50MzJfdCBtaW4gPSB1X2dldEludFByb3BlcnR5TWluVmFsdWUocHJvcCk7CisgICAgaW50MzJfdCBtYXggPSB1X2dldEludFByb3BlcnR5TWF4VmFsdWUocHJvcCk7CisgICAgVW5pY29kZVNldCBjaGVja0RlbHRhOworICAgIGZvciAoaSA9IG1pbjsgaSA8PSBtYXg7ICsraSkgeworICAgICAgICAvLyBza2lwIGNlcnRhaW4gYmxvY2tzCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB1X2dldFByb3BlcnR5VmFsdWVOYW1lKHByb3AsIGksIFVfTE9OR19QUk9QRVJUWV9OQU1FKTsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiU3VwZXJzY3JpcHRzX2FuZF9TdWJzY3JpcHRzIikgPT0gMAorICAgICAgICB8fCBzdHJjbXAobmFtZSwgIkxldHRlcmxpa2VfU3ltYm9scyIpID09IDAKKyAgICAgICAgfHwgc3RyY21wKG5hbWUsICJBbHBoYWJldGljX1ByZXNlbnRhdGlvbl9Gb3JtcyIpID09IDAKKyAgICAgICAgfHwgc3RyY21wKG5hbWUsICJIYWxmd2lkdGhfYW5kX0Z1bGx3aWR0aF9Gb3JtcyIpID09IDApIGNvbnRpbnVlOworCisgICAgICAgIGRlbHRhLmFwcGx5SW50UHJvcGVydHlWYWx1ZShwcm9wLCBpLCBzdGF0dXMpLnJlbW92ZUFsbChVTkFTU0lHTkVEKTsKKyAgICAgICAgaWYgKCFyZXAuY29udGFpbnNTb21lKGRlbHRhKSkgY29udGludWU7CisgICAgICAgIGlmIChyZXAuY29udGFpbnNBbGwoZGVsdGEpKSBjb250aW51ZTsgLy8ganVzdCB0byBzZWUgd2hhdCB3ZSBhcmUgYWRkaW5nCisgICAgICAgIGRlYnVnLT5sb2coIkFkZGluZyAiKTsKKyAgICAgICAgZGVidWctPmxvZyhwcm9wZXJ0eUFuZFZhbHVlTmFtZShwcm9wLCBpKSwgVFJVRSk7ICAgICAgICAgICAgICAgIAorICAgICAgICB0YWlsb3JpbmdCdW5kbGUtPmxvZygiLy8gIik7CisgICAgICAgIHRhaWxvcmluZ0J1bmRsZS0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIGkpLCBUUlVFKTsKKyAgICAgICAgaWYob3B0aW9uc1tSRUZFUkVOQ0VdLmRvZXNPY2N1cikgeworICAgICAgICAgIHJlZmVyZW5jZUJ1bmRsZS0+bG9nKCIvLyAiKTsKKyAgICAgICAgICByZWZlcmVuY2VCdW5kbGUtPmxvZyhwcm9wZXJ0eUFuZFZhbHVlTmFtZShwcm9wLCBpKSwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVwLmFkZEFsbChkZWx0YSk7CisgICAgfQorICAgIAorICAgIC8vIGFkZCBBU0NJSSBhbmQgZ2VuZXJhbCBhY2NlbnRzCisgICAgcmVwLmFkZEFsbChHRU5FUkFMX0FDQ0VOVFMpLmFkZEFsbChBU0NJSV9CQVNFKTsKKyAgICByZXAucmVtb3ZlQWxsKENPTlRST0wpOworICAgIC8vZGVsdGEuYXBwbHlJbnRQcm9wZXJ0eVZhbHVlKFVDSEFSX1NDUklQVCwgVVNDUklQVF9IQU4sIHN0YXR1cyk7CisgICAgLy9yZXAucmVtb3ZlQWxsKGRlbHRhKTsKKworICAgIC8vIG5vdyBhZGQgdGhlIGV4ZW1wbGFyIGNoYXJhY3RlcnMKKyAgICAvLyBjYW4ndCBnZXQgYXQgdGhlbSBmcm9tIEphdmEgcmlnaHQgbm93CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2coIjxicj5cbiIpOworICAgIGlmKG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHsKKyAgICAgIHJlZmVyZW5jZUJ1bmRsZS0+bG9nKCI8YnI+XG4iKTsKKyAgICB9Cit9CisKK1VuaWNvZGVTZXQgZmxhdHRlbihjb25zdCBVbmljb2RlU2V0ICZzb3VyY2UsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIFVuaWNvZGVTZXQgcmVzdWx0OworICAgIFVuaWNvZGVTZXRJdGVyYXRvciBpdChzb3VyY2UpOworICAgIFVuaWNvZGVTdHJpbmcgaXRlbSwgaXRlbU5GS0QsIHRvTm9ybWFsaXplOworICAgIHdoaWxlIChpdC5uZXh0KCkpIHsKKyAgICAgICAgLy8gd291bGQgYmUgbmljZXIgaWYgVW5pY29kZVNldEl0ZXJhdG9yIGhhZCBhIGdldFN0cmluZyBmdW5jdGlvbgorICAgICAgICBpZiAoaXQuaXNTdHJpbmcoKSkgeworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpdC5nZXRTdHJpbmcoKSwgVU5PUk1fTkZELCAwLCBpdGVtLCBzdGF0dXMpOworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpdC5nZXRTdHJpbmcoKSwgVU5PUk1fTkZLRCwgMCwgaXRlbU5GS0QsIHN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdG9Ob3JtYWxpemUuc2V0VG8oaXQuZ2V0Q29kZXBvaW50KCkpOworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSh0b05vcm1hbGl6ZSwgVU5PUk1fTkZELCAwLCBpdGVtLCBzdGF0dXMpOworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSh0b05vcm1hbGl6ZSwgVU5PUk1fTkZLRCwgMCwgaXRlbU5GS0QsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFkZEFsbChpdGVtKTsKKyAgICAgICAgcmVzdWx0LmFkZEFsbChpdGVtTkZLRCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZCB0ZXN0V2luKFN0cmVuZ3RoUHJvYmUgJnByb2JlLCBVRXJyb3JDb2RlICZzdGF0dXMpIAoreworICBVbmljb2RlU2V0IHRyYWlsaW5ncyhVbmljb2RlU3RyaW5nKCJbXFx1RkU3RFxcdUZFN0NcXHUzMEZEXFx1RkY3MFxcdTMwRkNcXHUzMDlEXFx1MzAzMlxcdTMwMzFcXHUzMDA1XFx1MDY1MV0iKSwgc3RhdHVzKTsKKyAgY2hhciBpbnRDaGFyW10gPSAiXFx1RkU3RFxcdUZFN0NcXHUzMEZEXFx1RkY3MFxcdTMwRkNcXHUzMDlEXFx1MzAzMlxcdTMwMzFcXHUzMDA1XFx1MDY1MSI7CisgIFVDaGFyIGludGVyZXN0aW5nWzI1Nl07CisgIGludDMyX3QgaW50TGVuID0gdV91bmVzY2FwZShpbnRDaGFyLCBpbnRlcmVzdGluZywgMjU2KTsKKyAgVUNoYXIgaSA9IDA7CisgIFVDaGFyIGogPSAwLCAgayA9IDA7CisgIGludDMyX3QgY291bnQ7CisgIExpbmUgbXlDaCwgY29tYm8sIHRyaWFsLCBpbnRlciwga0xpbmU7CisgIGZvcihpID0gMDsgaSA8IGludExlbjsgaSsrKSB7CisgICAgaW50ZXIuc2V0VG8oaW50ZXJlc3RpbmdbaV0pOworICAgIGxvZ2dlci0+bG9nKGludGVyLnRvU3RyaW5nKFRSVUUpLCBUUlVFKTsKKyAgICBsb2dnZXItPmxvZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgZm9yKGogPSAwOyBqIDwgMHhGRkZGOyBqKyspIHsKKyAgICAgIG15Q2guc2V0VG8oaik7CisgICAgICBpZihwcm9iZS5kaXN0YW5jZUZyb21FbXB0eVN0cmluZyhteUNoKSA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGxvZ2dlci0+bG9nKG15Q2gudG9TdHJpbmcoVFJVRSkpOworICAgICAgY29tYm8uc2V0VG8oaik7CisgICAgICBjb21iby5hcHBlbmQoaW50ZXJlc3RpbmdbaV0pOworICAgICAgY291bnQgPSAwOworICAgICAgZm9yKGsgPSAwOyBrIDwgMHhGRkZGOyBrKyspIHsKKyAgICAgICAga0xpbmUuc2V0VG8oayk7CisgICAgICAgIHRyaWFsLnNldFRvKGopOworICAgICAgICB0cmlhbC5hcHBlbmQoayk7CisgICAgICAgIGlmKHByb2JlLmNvbXBhcmUoa0xpbmUsIGludGVyKSA8IDApIHsKKyAgICAgICAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsLCBjb21ibykgPj0gMCkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxvZ2dlci0+bG9nKCIlaSAlaVxuIiwgY291bnQsIGNvdW50KTsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29scHJvYmUvY3JlYXRlQ29tcGFyaXNvblRhYmxlcy5wbCBiL2NvbHByb2JlL2NyZWF0ZUNvbXBhcmlzb25UYWJsZXMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMThmNmExNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2NyZWF0ZUNvbXBhcmlzb25UYWJsZXMucGwKQEAgLTAsMCArMSwxNjQgQEAKKyMhIC91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworCitteSAkbG9jYWxlID0gJEFSR1ZbMF07CisKKworbXkgJGxvbmdfbmFtZSA9IGAvaG9tZS93ZWl2L3NyYy9pY3Uvc291cmNlL2V4dHJhL2NvbHByb2JlL2xvbmduYW1lICRsb2NhbGVgOworbXkgJHBhZ2VUaXRsZSA9ICRsb2NhbGUuIl9jb2xsYXRpb24iOworbXkgJGZpbGVuYW1lID0gJHBhZ2VUaXRsZS4iLmh0bWwiOworCitvcGVuIFRBQkxFLCAiPiRmaWxlbmFtZSI7CisKKworcHJpbnQgVEFCTEUgPDwiRW5kT2ZUZW1wbGF0ZSI7Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8dGl0bGU+JHBhZ2VUaXRsZTwvdGl0bGU+Cis8c3R5bGU+CisgICAgICAgICA8IS0tCisgICAgICAgICB0YWJsZSAgICAgICAgeyBib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDEwMCU7IAorICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2sgfQordGQsIHRoICAgICAgIHsgd2lkdGg6IDEwJTsgYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGNvbG9yOiBibGFjazsgCisgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBib3JkZXI6IDFweCBzb2xpZCBibGFjayB9CistLT4KKyAgICAgPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+CisKKzxwPjxiPjxmb250IGNvbG9yPSIjRkYwMDAwIj5Db2xsYXRpb246PC9mb250PiAkbG9jYWxlICgkbG9uZ19uYW1lKSA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY2dpLWJpbi9pY3UvbHgvZW4vP189JGxvY2FsZSI+RGVtbzwvYT4sIAorCis8YSBocmVmPSIuLi9hbGxfZGlmZl94bWwvY29tcGFyaXNvbl9jaGFydHMuaHRtbCI+Q292ZXIgCitQYWdlPC9hPiwgPGEgaHJlZj0iLi4vYWxsX2RpZmZfeG1sL2luZGV4Lmh0bWwiPkluZGV4PC9hPjwvYj48L3A+Cis8dGFibGU+CisgIDx0cj4KK0VuZE9mVGVtcGxhdGUKKworbXkgJGRpckNvbW1vbiA9ICJjb21tb24iOworbXkgJHJlZkNvbW1vbiA9ICRkaXJDb21tb24uIi9VQ0FSdWxlcy50eHQiOworbXkgJG5hbWVDb21tb24gPSAkZGlyQ29tbW9uLiIvIi4kbG9jYWxlLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yQ29tbW9uID0gIiNBRDk4OUQiOworCitteSAkbG9jOworCitpZighKC1lICRuYW1lQ29tbW9uKSkgeworICAkbG9jYWxlID1+IC9fLzsKKyAgJGxvYyA9ICRgOworICAkbmFtZUNvbW1vbiA9ICIkZGlyQ29tbW9uLyRsb2MiLiJfY29sbGF0aW9uLmh0bWwiOworfQorcHJpbnQgVEFCTEUgIiAgICA8dGggYmdjb2xvcj1cIiRjb2xvckNvbW1vblwiPkNPTU1PTiAoPGEgaHJlZj1cIiRyZWZDb21tb25cIj5VQ0E8L2E+IDxhIGhyZWY9XCIuLi8kZGlyQ29tbW9uL3htbC8kbG9jYWxlLnhtbFwiPnhtbDwvYT4pPC90aD5cbiI7CisKK215ICRkaXJMaW51eCA9ICJsaW51eCI7CitteSAkcmVmTGludXggPSAkZGlyTGludXguIi8iLiRsb2NhbGUuIi51dGY4X2RlZmF1bHRfcmF3Lmh0bWwiOworbXkgJHJhd0xpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLiIudXRmOF9yYXcuaHRtbCI7CitteSAkZGVmTGludXggPSAkZGlyTGludXguIi8iLiRsb2NhbGU7CitteSAkbmFtZUxpbnV4ID0gIiRkaXJMaW51eC8kbG9jYWxlIi4iLnV0ZjhfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yTGludXggPSAiIzExOTFGMSI7CisKK3ByaW50IFRBQkxFICIgICAgPHRoIGJnY29sb3I9XCIkY29sb3JMaW51eFwiPkxJTlVYICgiOworaWYgKCEoLWUgJG5hbWVMaW51eCkpIHsKKyN0cnkgdGhlIHZhcmlhbnQgdGhhdCBoYXMgQGV1cm8gc3R1Y2sgaW4KKyAgJG5hbWVMaW51eCA9ICIkZGlyTGludXgvJGxvY2FsZSIuJy51dGY4QGV1cm9fY29sbGF0aW9uLmh0bWwnOworICBpZigtZSAkbmFtZUxpbnV4KSB7CisgICAgJHJlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLicudXRmOEBldXJvX2RlZmF1bHRfcmF3Lmh0bWwnOworICAgICRyYXdMaW51eCA9ICRkaXJMaW51eC4iLyIuJGxvY2FsZS4nLnV0ZjhAZXVyb19yYXcuaHRtbCc7CisgIH0KK30KK2lmICgtZSAkbmFtZUxpbnV4KSB7CisgICAgcHJpbnQgVEFCTEUgIjxhIGhyZWY9XCIkcmF3TGludXhcIj5PcmRlcmluZzwvYT4gPGEgaHJlZj1cIiRkZWZMaW51eFwiPkRlZmluaXRpb248L2E+IDxhIGhyZWY9XCIkcmVmTGludXhcIj5iYXNlPC9hPiI7Cit9IAorCitwcmludCBUQUJMRSAiIDxhIGhyZWY9XCIuLi8kZGlyTGludXgveG1sLyRsb2NhbGUueG1sXCI+eG1sPC9hPik8L3RoPlxuIjsKKworbXkgJGRpcldpbiA9ICJ3aW54cCI7CitteSAkcmVmV2luID0gJGRpcldpbi4iLyIuJGxvY2FsZS4iX2RlZmF1bHRfcmF3Lmh0bWwiOworbXkgJHJhd1dpbiA9ICRkaXJXaW4uIi8iLiRsb2NhbGUuIl9yYXcuaHRtbCI7CitteSAkbmFtZVdpbiA9ICIkZGlyV2luLyRsb2NhbGUiLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yV2luID0gIiM5OEZCOTgiOworCitwcmludCBUQUJMRSAiICAgIDx0aCBiZ2NvbG9yPVwiJGNvbG9yV2luXCI+V0lORE9XUyAoIjsgCitpZiAoLWUgJG5hbWVXaW4pIHsKKyAgIHByaW50IFRBQkxFICI8YSBocmVmPVwiJHJhd1dpblwiPk9yZGVyaW5nPC9hPiA8YSBocmVmPVwiJHJlZldpblwiPmJhc2U8L2E+ICI7Cit9IAorcHJpbnQgVEFCTEUgIjxhIGhyZWY9XCIuLi93aW5kb3dzL3htbC8kbG9jYWxlLnhtbFwiPnhtbDwvYT4pPC90aD5cbiI7CisKK3ByaW50IFRBQkxFICIgIDwvdHI+XG4gIDx0cj4iOworCisKK3JlYWRSdWxlcygkbmFtZUNvbW1vbiwgIiNBRDk4OUQiLCAiU2FtZSBhcyB0aGUgVUNBLiIpOworcmVhZFJ1bGVzKCRuYW1lTGludXgsICIjMTE5MUYxIiwgIk5vIGRhdGEgYXZhaWxhYmxlLiIpOyAgICAgIAorcmVhZFJ1bGVzKCRuYW1lV2luLCAiIzk4RkI5OCIsICJObyBkYXRhIGF2YWlsYWJsZS4iKTsKKworCitwcmludCBUQUJMRSA8PCJFbmRPZkZvb3RlciI7CisgIDwvdHI+Cis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CitFbmRPZkZvb3RlcgorCisKK3N1YiByZWFkUnVsZXMgeworICAjIHJlYWRSdWxlcygkZmlsZSwgJGNvbG9yKQorICBteSAkZmlsZW5hbWUgID0gc2hpZnQ7CisgIG15ICRjb2xvciA9IHNoaWZ0OworICBteSAkY29tbWVudCA9IHNoaWZ0OworICBteSAkbm9MaW5lcyA9IDA7CisgIG15ICRwcmludE91dCA9IDA7CisKKyAgbXkgJGZpbGU7CisKKyAgaWYoLWUgJGZpbGVuYW1lKSB7CisgICAgb3BlbigkZmlsZSwgIjwkZmlsZW5hbWUiKSB8fCBkaWUgInNvbWV0aGluZyB2ZXJ5IHN0cmFuZ2UgaGFwcGVuZWRcbiI7CisgICAgcHJpbnQgVEFCTEUgIjx0ZCBiZ2NvbG9yPVwiJGNvbG9yXCI+XG4iOworICAgIHdoaWxlICg8JGZpbGU+KSB7CisgICAgICBpZiAoL1x9XDxiclw+JC8pIHsKKyAgICAgICAgJHByaW50T3V0ID0gMDsKKworICAgICAgfQorICAgICAgaWYgKCRwcmludE91dCkgeworICAgICAgICBwcmludCBUQUJMRSAkXzsKKyAgICAgICAgJG5vTGluZXMrKzsKKyAgICAgIH0KKyAgICAgIGlmICgvU2VxdWVuY2UvKSB7CisgICAgICAgICRwcmludE91dCA9IDE7CisgICAgICAgIHByaW50ICJmb3VuZCBzZXF1ZW5jZVxuIjsKKyAgICAgICAgJG5vTGluZXMgPSAwOworICAgICAgfQorCisgICAgfQorICAgIGlmICghJG5vTGluZXMpIHsKKyAgICAgIHByaW50IFRBQkxFICJTYW1lIG9yZGVyaW5nIGFzIGJhc2VcbiI7CisgICAgfQorICAgIHByaW50IFRBQkxFICI8L3RkPlxuIjsKKyAgfSBlbHNlIHsKKyAgICBwcmludCBUQUJMRSAiPHRkIGJnY29sb3I9XCIkY29sb3JcIj5cbiRjb21tZW50PC90ZD5cbiI7CisgIH0gICAgCit9CisKKworIyBUYXN0aW5nIG9mIGZvb2QgcHJvZHVjdAorIyA2NTAtNTc0LTQ1NTEgJDUwIDEgaG91cgorCisKKyMgICAgIDx0ZCBiZ2NvbG9yPSIjQUQ5ODlEIj4xLjAtYWxwaGE8L3RkPgorIyAgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPjEuMDwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PHNwYW4gdGl0bGU9IjAwNkUge0xBVElOIFNNQUxMIExFVFRFUiBOfSI+JmFtcDtuPC9zcGFuPjxicj4KKyMgICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZsdDsmbmJzcDtueTwvc3Bhbj48YnI+CisKKyMgICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA2RSAwMDc5IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gU01BTEwgTEVUVEVSIFl9IC8gMDA2RSAwMDc5IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PSZuYnNwO25ueSZuYnNwOy8mbmJzcDtueTwvc3Bhbj48YnI+CisjICAgICAgIDxzcGFuIHRpdGxlPSIwMDZFIDAwNTkge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gQ0FQSVRBTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsmbHQ7Jmx0OyZuYnNwO25ZPC9zcGFuPjxicj4KKyMgICAgIDwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGRkYzMyI+MS4yPC90ZD4KKworIyAgICAgPHRkIGJnY29sb3I9IiM5OEZCOTgiPldpbmRvd3MgWFA8L3RkPgorIyAgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgorIyAgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgpkaWZmIC0tZ2l0IGEvY29scHJvYmUvZG9Db21wYXJpc29uVGFibGUucGwgYi9jb2xwcm9iZS9kb0NvbXBhcmlzb25UYWJsZS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YTAyZWYzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2RvQ29tcGFyaXNvblRhYmxlLnBsCkBAIC0wLDAgKzEsMjA5IEBACisjISAvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBzdHJpY3Q7Cit1c2UgSU86OkZpbGU7CisKKworbXkgJGxvY2FsZSA9ICRBUkdWWzBdOworCisKK215ICRsb25nX25hbWUgPSBgL2hvbWUvd2Vpdi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9sb25nbmFtZSAkbG9jYWxlYDsKK3ByaW50ICJMb25nIG5hbWUgaXMgJGxvbmdfbmFtZVxuIjsKK215ICRwYWdlVGl0bGUgPSAkbG9jYWxlLiIgY29sbGF0aW9uIjsKK215ICRmaWxlbmFtZSA9ICRsb2NhbGUuIi5odG1sIjsKKworb3BlbiBUQUJMRSwgIj4kZmlsZW5hbWUiOworCisKK3ByaW50IFRBQkxFIDw8IkVuZE9mVGVtcGxhdGUiOworPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgorPHRpdGxlPiRwYWdlVGl0bGU8L3RpdGxlPgorPHN0eWxlPgorICAgICAgICAgPCEtLQorICAgICAgICAgdGFibGUgICAgICAgIHsgYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlOyAKKyAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrIH0KK3RkLCB0aCAgICAgICB7IHdpZHRoOiAxMCU7IGJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBjb2xvcjogYmxhY2s7IAorICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2sgfQorLS0+CisgICAgIDwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorCis8cD48Yj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Q29sbGF0aW9uOjwvZm9udD4gJGxvY2FsZSAoJGxvbmdfbmFtZSkgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2NnaS1iaW4vaWN1L2x4L2VuLz9fPSRsb2NhbGUiPkRlbW88L2E+LCAKKworPGEgaHJlZj0iLi4vLi4vY29tcGFyaXNvbl9jaGFydHMuaHRtbCI+Q292ZXIgCitQYWdlPC9hPiwgPGEgaHJlZj0iLi4vbWFpbi9pbmRleC5odG1sIj5Mb2NhbGUgRGlmZnMgSW5kZXg8L2E+LCA8YSBocmVmPSJpbmRleC5odG1sIj5Db2xsYXRpb24gRGlmZnMgSW5kZXg8L2E+PC9iPjwvcD4KKzx0YWJsZT4KKyAgPHRyPgorRW5kT2ZUZW1wbGF0ZQorCitteSAkZGlyQ29tbW9uID0gImljdWNvbGxhdGlvbnMiOworbXkgJHJlZkNvbW1vbiA9ICRkaXJDb21tb24uIi9VQ0FSdWxlcy50eHQiOworbXkgJG5hbWVDb21tb24gPSAkZGlyQ29tbW9uLiIvIi4kbG9jYWxlLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yQ29tbW9uID0gIiNBRDk4OUQiOworCitteSAkbG9jID0gJGxvY2FsZTsKKworaWYoISgtZSAkbmFtZUNvbW1vbikpIHsKKyAgJGxvY2FsZSA9fiAvXy87CisgICRsb2MgPSAkYDsKKyAgJG5hbWVDb21tb24gPSAiJGRpckNvbW1vbi8kbG9jIi4iX2NvbGxhdGlvbi5odG1sIjsKK30KKworcHJpbnQgIkNvbW1vbiBpcyAkbmFtZUNvbW1vblxuIjsKKworcHJpbnQgVEFCTEUgIiAgICA8dGggYmdjb2xvcj1cIiRjb2xvckNvbW1vblwiPkNPTU1PTiAoIjsKK2lmKC1lICRuYW1lQ29tbW9uKSB7CisgIHByaW50IFRBQkxFICI8YSBocmVmPVwiLi4vLi4vY29tbW9uL2NvbGxhdGlvbi8kbG9jLnhtbFwiPnhtbDwvYT4gIjsKK30KK3ByaW50IFRBQkxFICI8YSBocmVmPVwiLi4vLi4vY29tbW9uL2NvbGxhdGlvbi9yb290LnhtbFwiPlVDQTwvYT4pPC90aD5cbiI7CisKK215ICRkaXJMaW51eCA9ICJsaW51eGNvbGxhdGlvbnMiOworbXkgJHJlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLiIudXRmOF9kZWZhdWx0X3Jhdy5odG1sIjsKK215ICRyYXdMaW51eCA9ICRkaXJMaW51eC4iLyIuJGxvY2FsZS4iLnV0ZjhfcmF3Lmh0bWwiOworbXkgJGRlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlOworbXkgJG5hbWVMaW51eCA9ICIkZGlyTGludXgvJGxvY2FsZSIuIl9jb2xsYXRpb24uaHRtbCI7CitteSAkY29sb3JMaW51eCA9ICIjMTE5MUYxIjsKKworcHJpbnQgVEFCTEUgIiAgICA8dGggYmdjb2xvcj1cIiRjb2xvckxpbnV4XCI+TElOVVgiOworaWYgKCEoLWUgJG5hbWVMaW51eCkpIHsKKyN0cnkgdGhlIHZhcmlhbnQgdGhhdCBoYXMgQGV1cm8gc3R1Y2sgaW4KKyAgJG5hbWVMaW51eCA9ICIkZGlyTGludXgvJGxvY2FsZSIuJy51dGY4QGV1cm9fY29sbGF0aW9uLmh0bWwnOworICBpZigtZSAkbmFtZUxpbnV4KSB7CisgICAgJHJlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLicudXRmOEBldXJvX2RlZmF1bHRfcmF3Lmh0bWwnOworICAgICRyYXdMaW51eCA9ICRkaXJMaW51eC4iLyIuJGxvY2FsZS4nLnV0ZjhAZXVyb19yYXcuaHRtbCc7CisgIH0KK30KK2lmICgtZSAkbmFtZUxpbnV4KSB7CisgIHByaW50IFRBQkxFICIgKDxhIGhyZWY9XCIuLi8uLi9saW51eC9jb2xsYXRpb24vJGxvY2FsZS54bWxcIj54bWw8L2E+IjsKKyAgbXkgJGxpbnV4QmFzZSA9ICZnZXRCYXNlTG9jYWxlKCIkZGlyTGludXgvYmFzZSIsICRsb2NhbGUpOworICBpZigkbGludXhCYXNlIG5lICIiKSB7CisgICAgcHJpbnQgVEFCTEUgIiA8YSBocmVmPVwiLi4vLi4vbGludXgvY29sbGF0aW9uLyRsaW51eEJhc2UueG1sXCI+QmFzZSAoJGxpbnV4QmFzZSk8L2E+IjsKKyAgfQorICBwcmludCBUQUJMRSAiKSI7Cit9IAorcHJpbnQgVEFCTEUgIjwvdGg+XG4iOworCisKK215ICRkaXJXaW4gPSAidzJrY29sbGF0aW9ucyI7CitteSAkcmVmV2luID0gJGRpcldpbi4iLyIuJGxvY2FsZS4iX2RlZmF1bHRfcmF3Lmh0bWwiOworbXkgJHJhd1dpbiA9ICRkaXJXaW4uIi8iLiRsb2NhbGUuIl9yYXcuaHRtbCI7CitteSAkbmFtZVdpbiA9ICIkZGlyV2luLyRsb2NhbGUiLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yV2luID0gIiM5OEZCOTgiOworJGxvYyA9ICRsb2NhbGU7CisjdHJ5IGZhbGxiYWNrIGZvciB3aW5kb3dzCitwcmludCBUQUJMRSAiICAgIDx0aCBiZ2NvbG9yPVwiJGNvbG9yV2luXCI+V0lORE9XUyI7IAoraWYoISgtZSAkbmFtZVdpbikpIHsKKyAgJGxvY2FsZSA9fiAvXy87CisgICRsb2MgPSAkYDsKKyAgJG5hbWVXaW4gPSAiJGRpcldpbi8kbG9jIi4iX2NvbGxhdGlvbi5odG1sIjsKK30KKworcHJpbnQgIldpbmRvd3MgbG9jIGlzICRsb2NcbiI7CisKK2lmICgtZSAkbmFtZVdpbikgeworICBwcmludCBUQUJMRSAiICg8YSBocmVmPVwiLi4vLi4vd2luZG93cy9jb2xsYXRpb24vJGxvYy54bWxcIj54bWw8L2E+IjsKKyAgbXkgJHdpbkJhc2UgPSAmZ2V0QmFzZUxvY2FsZSgiJGRpcldpbi9iYXNlIiwgJGxvY2FsZSk7CisgIGlmKCR3aW5CYXNlIG5lICIiKSB7CisgICAgcHJpbnQgVEFCTEUgIjxhIGhyZWY9XCIuLi8uLi93aW5kb3dzL2NvbGxhdGlvbi8kd2luQmFzZS54bWxcIj5iYXNlICgkd2luQmFzZSk8L2E+IjsKKyAgfQorICBwcmludCBUQUJMRSAiKSI7Cit9IAorcHJpbnQgVEFCTEUgIjwvdGg+XG4iOworcHJpbnQgVEFCTEUgIiAgPC90cj5cbiAgPHRyPiI7CisKKworcmVhZFJ1bGVzKCRuYW1lQ29tbW9uLCAiI0FEOTg5RCIsICJTYW1lIGFzIHRoZSBVQ0EuIik7CityZWFkUnVsZXMoJG5hbWVMaW51eCwgIiMxMTkxRjEiLCAiTm8gZGF0YSBhdmFpbGFibGUuIik7ICAgICAgCityZWFkUnVsZXMoJG5hbWVXaW4sICIjOThGQjk4IiwgIk5vIGRhdGEgYXZhaWxhYmxlLiIpOworCisKK3ByaW50IFRBQkxFIDw8IkVuZE9mRm9vdGVyIjsKKyAgPC90cj4KKzwvdGFibGU+CisKKzwvYm9keT4KKzwvaHRtbD4KK0VuZE9mRm9vdGVyCisKKworc3ViIHJlYWRSdWxlcyB7CisgICMgcmVhZFJ1bGVzKCRmaWxlLCAkY29sb3IpCisgIG15ICRmaWxlbmFtZSAgPSBzaGlmdDsKKyAgbXkgJGNvbG9yID0gc2hpZnQ7CisgIG15ICRjb21tZW50ID0gc2hpZnQ7CisgIG15ICRub0xpbmVzID0gMDsKKyAgbXkgJHByaW50T3V0ID0gMDsKKworICBteSAkZmlsZTsKKworICBpZigtZSAkZmlsZW5hbWUpIHsKKyAgICBvcGVuKCRmaWxlLCAiPCRmaWxlbmFtZSIpIHx8IGRpZSAic29tZXRoaW5nIHZlcnkgc3RyYW5nZSBoYXBwZW5lZFxuIjsKKyAgICBwcmludCBUQUJMRSAiPHRkIGJnY29sb3I9XCIkY29sb3JcIj5cbiI7CisgICAgd2hpbGUgKDwkZmlsZT4pIHsKKyAgICAgIGlmICgvXH1cPGJyXD4kLykgeworICAgICAgICAkcHJpbnRPdXQgPSAwOworCisgICAgICB9CisgICAgICBpZiAoJHByaW50T3V0KSB7CisgICAgICAgIGlmKCEvXiQvICYmICEvJm5ic3A7PGJyPiQvKSB7CisgICAgICAgICAgcHJpbnQgVEFCTEUgJF87CisgICAgICAgICAgJG5vTGluZXMrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKC9TZXF1ZW5jZS8pIHsKKyAgICAgICAgJHByaW50T3V0ID0gMTsKKyAgICAgICAgcHJpbnQgImZvdW5kIHNlcXVlbmNlXG4iOworICAgICAgICAkbm9MaW5lcyA9IDA7CisgICAgICB9CisKKyAgICB9CisgICAgaWYgKCEkbm9MaW5lcykgeworICAgICAgcHJpbnQgVEFCTEUgIlNhbWUgb3JkZXJpbmcgYXMgYmFzZVxuIjsKKyAgICB9CisgICAgcHJpbnQgVEFCTEUgIjwvdGQ+XG4iOworICB9IGVsc2UgeworICAgIHByaW50IFRBQkxFICI8dGQgYmdjb2xvcj1cIiRjb2xvclwiPlxuJGNvbW1lbnQ8L3RkPlxuIjsKKyAgfSAgICAKK30KKworc3ViIGdldEJhc2VMb2NhbGUoKXsKKyAgICBteSAkYmFzZWZpbGUgPSBzaGlmdDsKKyAgICBteSAkbG9jYWxlID0gc2hpZnQ7CisgICAgbXkgJGJhc2VGSCA9IElPOjpGaWxlLT5uZXcoJGJhc2VmaWxlLCJyIikKKyAgICAgICAgICAgIG9yIGRpZSAgImNvdWxkIG5vdCBvcGVuIHRoZSBmaWxlICRiYXNlZmlsZSBmb3IgcmVhZGluZzogJCEgXG4iOworICAgIG15ICRic2U7CisgICAgbXkgJGxvYzsKKyAgICB3aGlsZShkZWZpbmVkICggbXkgJGxpbmUgPSA8JGJhc2VGSD4pKXsKKyAgICAgICAgaWYoICRsaW5lID1+IC9cPCRsb2NhbGVcPi8peworICAgICAgICAgICAgKCRsb2MsJGJzZSkgPSBzcGxpdCAoL1w+LywgJGxpbmUpOworICAgICAgICAgICAgICRic2UgPX4gcy9eXHMrXDwvLzsKKyAgICAgICAgICAgICByZXR1cm4gJGJzZTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIFRhc3Rpbmcgb2YgZm9vZCBwcm9kdWN0CisjIDY1MC01NzQtNDU1MSAkNTAgMSBob3VyCisKKworIyAgICAgPHRkIGJnY29sb3I9IiNBRDk4OUQiPjEuMC1hbHBoYTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+MS4wPC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj49PC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj48c3BhbiB0aXRsZT0iMDA2RSB7TEFUSU4gU01BTEwgTEVUVEVSIE59Ij4mYW1wO248L3NwYW4+PGJyPgorIyAgICAgICA8c3BhbiB0aXRsZT0iMDA2RSAwMDc5IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jmx0OyZuYnNwO255PC9zcGFuPjxicj4KKworIyAgICAgICA8c3BhbiB0aXRsZT0iMDA2RSAwMDZFIDAwNzkge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0gLyAwMDZFIDAwNzkge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gU01BTEwgTEVUVEVSIFl9Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs9Jm5ic3A7bm55Jm5ic3A7LyZuYnNwO255PC9zcGFuPjxicj4KKyMgICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA1OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBDQVBJVEFMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0OyZsdDsmbHQ7Jm5ic3A7blk8L3NwYW4+PGJyPgorIyAgICAgPC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj49PC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkZGRjMzIj4xLjI8L3RkPgorCisjICAgICA8dGQgYmdjb2xvcj0iIzk4RkI5OCI+V2luZG93cyBYUDwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CmRpZmYgLS1naXQgYS9jb2xwcm9iZS9leHRyYWN0Q29sbGF0aW9uRGF0YS5wbCBiL2NvbHByb2JlL2V4dHJhY3RDb2xsYXRpb25EYXRhLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3MDc5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9leHRyYWN0Q29sbGF0aW9uRGF0YS5wbApAQCAtMCwwICsxLDI0NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2UgVW5pY29kZTo6VUNEICdjaGFyaW5mbyc7Cit1c2UgVW5pY29kZTo6Tm9ybWFsaXplOwordXNlIHV0Zjg7Cit1c2Ugb3BlbiAnOnV0ZjgnOworCitteSAkcHJpbnRvdXQgPSAwOworbXkgJGJyYWNlcyA9IDA7CitteSAkY29sbHMgPSAwOworbXkgJGFsaWFzZWQgPSAwOworbXkgJG5ld05hbWUgPSAiIjsKK215ICRmaWxlbmFtZTsKK215ICRzdWZmaXg7CitteSAkbG9jYWxlOworCitORVdfRklMRToKK2ZvcmVhY2ggbXkgJGFyZyAoQEFSR1YpIHsKKyAgaWYoJG5ld05hbWUgPX4gL14kLykgeworICAgICRsb2NhbGUgPSAkYXJnOworICAgICRsb2NhbGUgPX4gcyNeLiovIyNnOworICAgICRsb2NhbGUgPX4gcy9cLnR4dC8vOworICB9IGVsc2UgeworICAgICRuZXdOYW1lID0gIiI7CisgIH0KKyAgbXkgJGNvbW1hbmQgPSAiL2hvbWUvd2Vpdi9idWlsZC9jdXJyZW50L2Jpbi91Y29udiAteCBoZXgtYW55L0phdmEgLWYgdXRmOCAtdCB1dGY4ICRhcmciOworICBwcmludCAkY29tbWFuZC4iXG4iOworICBteSBAYnVuZGxlID0gYCRjb21tYW5kYDsKKyAgZm9yZWFjaCAkXyAoQGJ1bmRsZSkgeworICN3aGlsZSg8PikgeworICAgI3ByaW50ICRBUkdWIGlmIGVvZjsKKyAgIGlmKC9eXC9cLy8pIHsKKyAgICAgbmV4dDsKKyAgIH0KKyAgIGlmKC9jb2xsYXRpb25zLykgeworICAgICBwcmludCAiZm91bmQgQ29sbGF0aW9uc1xuIjsKKyAgICAgJGNvbGxzID0gMTsKKyAgICAgaWYoL2FsaWFzLykgeworICAgICAgIHByaW50ICJjb2xsYXRpb25zIGFyZSBhbGlhc2VkXG4iOworICAgICAgICRhbGlhc2VkID0gMTsKKyAgICAgfQorICAgfQorICAgaWYoJGFsaWFzZWQpIHsKKyAgICAgcHJpbnQgInByb2Nlc3NpbmcgYWxpYXNlZCBkYXRhOiAkX1xuIjsKKyAgICAgaWYoL1x7LykgeworICAgICAgIHByaW50ICJCcmFjZXMgb3BlbmVkXG4iOworICAgICAgICRicmFjZXMgPSAxOworICAgICB9CisgICAgIGlmKCRicmFjZXMgJiYgL1wiKC4qKVwiLykgeworICAgICAgICRuZXdOYW1lID0gJDE7CisgICAgICAgcHJpbnQgIkFsaWFzaW5nIHRvICRuZXdOYW1lXG4iOworICAgICB9CisgICAgIGlmKCRicmFjZXMgJiYgL1x9LykgeworICAgICAgICRicmFjZXMgPSAwOworICAgICAgIHByaW50ICJCcmFjZXMgY2xvc2VkXG4iOworICAgICAgICRhbGlhc2VkID0gMDsKKyAgICAgICBwcmludCAiU3dpdGNoaW5nIGZyb20gJGZpbGVuYW1lIHRvICRuZXdOYW1lXG4iOworICAgICAgICRhcmcgPX4gcy8kbG9jYWxlXC50eHQkLyRuZXdOYW1lXC50eHQvOworICAgICAgIHByaW50ICIkYXJnXG4iOworICAgICAgIHJlZG8gTkVXX0ZJTEU7CisgICAgIH0KKworICAgfQorICAgaWYoL3N0YW5kYXJkfHBob25lYm9va3x0cmFkaXRpb25hbHxwaW55aW58c3Ryb2tlfGRpcmVjdC8gJiYgJGNvbGxzKSB7CisgICAgIHByaW50ICJmb3VuZCAkJiBjb2xsYXRpb25cbiI7CisgICAgICRzdWZmaXggPSAiXyIudWMoJCYpOworICAgICBpZigvc3RhbmRhcmQvKSB7CisgICAgICAgJHN1ZmZpeCA9ICIiOworICAgICB9CisgICB9CisgICBpZigvU2VxdWVuY2UvICYmICRjb2xscykgeworICAgICAjYmlubW9kZSBBUkdWLCAiOnV0ZjgiOworICAgICAkcHJpbnRvdXQgPSAxOworICAgICAjJGZpbGVuYW1lID0gJEFSR1Y7CisgICAgICRmaWxlbmFtZSA9ICRsb2NhbGU7CisgICAgIGlmKCRzdWZmaXgpIHsKKyAgICAgICAkZmlsZW5hbWUgLj0gIl8iLiRzdWZmaXg7CisgICAgIH0KKyAgICAgJGZpbGVuYW1lIC49ICJfY29sbGF0aW9uLmh0bWwiOworICAgICBwcmludCAiZmlsZW5hbWUgaXMgJGZpbGVuYW1lXG4iOworICAgICAjb3BlbihPVVQsICI+OnV0ZjgiLCAiJGZpbGVuYW1lIik7CisgICAgIG9wZW4oT1VULCAiPiRmaWxlbmFtZSIpOworICAgICBwcmludEhlYWRpbmcoJGFyZyk7CisgICAgICNuZXh0OworICAgfQorICAgbXkgJGxpbmUgPSAkXzsKKyAgIGlmKCRsaW5lID1+IC9cey8gJiYgJHByaW50b3V0KSB7CisgICAgICRicmFjZXMrKzsKKyAgIH0KKyAgIGlmKCRwcmludG91dCkgeworICAgICBwcmludCBPVVQgcHJvY2Vzc0xpbmUoJGxpbmUpOworICAgICBwcmludCBPVVQgIlxuIjsKKyAgIH0KKyAgIGlmKCAkbGluZSA9fiAvXH0vICYmICRwcmludG91dCkgeworICAgICAkYnJhY2VzLS07CisgICAgIGlmKCRicmFjZXMgPT0gMCkgeworICAgICAgICRwcmludG91dCA9IDA7CisgICAgICAgcHJpbnRGb290aW5nKCk7CisgICAgICAgY2xvc2UoT1VUKTsKKyAgICAgfQorICAgfQorIH0gCit9CisKK3N1YiBwcm9jZXNzTGluZSB7CisgIG15ICRsaW5lID0gc2hpZnQ7CisgICRfID0gJGxpbmU7CisgIG15ICRpID0gMDsKKyAgbXkgJGogPSAwOworICBteSAkcmVzdWx0OworIyByZW1vdmUgY29tbWVudHMKKyAgcyMvLy4qJCMjZzsKKyMgcmVtb3ZlICJTZXF1ZW5jZSIgaWYgcHJlc2VudAorICBzL1NlcXVlbmNlXHMqLy87CisjIHJlbW92ZSBsZWFkaW5nIGJyYWNlIGlmIHByZXNlbnQKKyAgcy9eXHMqey8vOworIyByZW1vdmUgdHJhaWxpbmcgYnJhY2UgaWYgcHJlc2VudAorICBzL31ccyokLy87CisjIHJlbW92ZSB0cmFpbGluZyBxdW90ZQorICBzLyJccyokLy87CisjcmVtb3ZlIGxlYWQgcXVvdGUKKyAgcy9eXHMqIi8vOworI3NlcGFyYXRlIG9wdGlvbnMKKyAgcy8oXFsuKlxdKS9cblwxL2c7Cisjc2VwYXJhdGUgcmVzZXRzCisgIHMvXHMqXCZccyovXG5cJiAvZzsKKyNzZXBhcmF0ZSBzdHJlbmd0aHMgYW5kIGluc2VydCBzcGFjZXMKKyAgcy9ccyooPHsxLDR9KVxzKi9cblwxIC9nOworI3NlcGFyYXRlIGVxdWFscyBhbmQgaW5zZXJ0IHNwYWNlcworICBzL1xzKj1ccyovXG49IC9nOworCisjIGJyZWFrIGludG8gaW5kaXZpZHVhbCByZXNldC9zdHJlbmd0aC9zZXR0aW5nIGxpbmVzCisgIG15IEBsaW5lcyA9IHNwbGl0KC9cbi8pOworCisgIG15ICRsaW5lOworICBteSAkbmFtZTsKKyAgbXkgJHNwYW5FbmQgPSAiIjsKKyAgbXkgJHJlc3VsdCA9ICIiOworICBteSAkbmFtZXMgPSAiIjsKKyAgbXkgJGNvZGVzID0gIiI7CisgIG15ICRscm0gPSAiIjsKKworICBmb3JlYWNoICRsaW5lIChAbGluZXMpIHsKKyAgICAjIHNraXAgZW1wdHkgbGluZXMKKyAgICBpZigkbGluZSA9fiAvXiQvKSB7CisgICAgICBuZXh0OworICAgIH0KKyAgICAkc3BhbkVuZCA9ICIiOworICAgICRuYW1lID0gIiI7CisgICAgJGxybSA9ICIiOworICAgICRsaW5lID0gTkZDKCRsaW5lKTsKKyAgICAjIGZvciByZXNldHMgYW5kIHN0cmVuZ3RocyB3ZSB3aWxsIGdldCBuYW1lIGZvciBlbGVtZW50cworICAgIGlmKCRsaW5lID1+IC88ezEsNH0gfD0gfCYgXFsuKlxdfCYgLykgeworICAgICAgJG5hbWUgPSAiPHNwYW4gdGl0bGU9XCIiOworICAgICAgJG5hbWVzID0gIiI7CisgICAgICAkY29kZXMgPSAiIjsKKyAgICAgIG15ICRzdGFydCA9ICQmOworICAgICAgbXkgJHJlc3QgPSAkJzsKKyAgICAgIGZvciAoJGogPSAwOyAkaiA8IGxlbmd0aCgkcmVzdCk7ICRqKyspIHsKKwlteSAkY2hhciA9IHN1YnN0cigkcmVzdCwgJGosIDEpOworCW15ICRjaGFyVmFsID0gb3JkKCRjaGFyKTsKKwkjIHNvbWUgb2YgZWxlbWVudHMgYXJlIHBhcnQgb2YgdGhlIHN5bnRheCwgc28gdGhleSBhcmUKKwkjIGVudGVyZWQgd2l0aG91dCB0cmFuc2xhdGlvbiB0byB0aGUgbmFtZQorCWlmKCRjaGFyVmFsID09IDB4MDAyRiB8fCAkY2hhclZhbCA9PSAweDAwN0MpIHsKKwkgICRuYW1lIC49ICRjb2Rlcy4kbmFtZXMuIiAkY2hhciAiOworCSAgJGNvZGVzID0gIiI7CisJICAkbmFtZXMgPSAiIjsKKwl9IGVsc2lmKCRjaGFyVmFsID09IDB4MDAyNykgeyAjcXVvdGUgcmVxdWlyZXMgbW9yZSBwcm9jZXNzaW5nCisJICAjJG5hbWUgLj0gIiciOworCX0gZWxzZSB7CisJICBteSAkY2hhcmluZm8gPSBjaGFyaW5mbygkY2hhclZhbCk7CisJICAkY29kZXMgLj0gJGNoYXJpbmZvLT57J2NvZGUnfS4iICI7CisJICAkbmFtZXMgLj0gInsiLiRjaGFyaW5mby0+eyduYW1lJ30uIn0gIjsKKyAgICAgICAgICBpZigkY2hhcmluZm8tPnsnYmlkaSd9IGVxICJSIiB8fCAkY2hhcmluZm8tPnsnYmlkaSd9IGVxICJBTCIpIHsKKyAgICAgICAgICAgICRscm0gPSAiJmxybTsiOworICAgICAgICAgIH0KKwkgICMkbmFtZSAuPSAkY2hhcmluZm8tPnsnY29kZSd9LiIgeyIuJGNoYXJpbmZvLT57J25hbWUnfS4ifSAiOworCX0KKyAgICAgIH0KKyAgICAgICRuYW1lIC49ICRjb2Rlcy4kbmFtZXMuIlwiID4iOworICAgICAgJHNwYW5FbmQgPSAiPC9zcGFuPiI7CisgICAgfQorICAgICNwcmludCAkbmFtZS4iXG4iOworICAgIGlmKCRsaW5lID1+IC9ePDw8PC8pIHsKKyAgICAgICRsaW5lID0gIiAgICAkbGluZSI7CisgICAgfSBlbHNpZigkbGluZSA9fiAvXjw8PC8pIHsKKyAgICAgICRsaW5lID0gIiAgICRsaW5lIjsKKyAgICB9IGVsc2lmKCRsaW5lID1+IC9ePDwvKSB7CisgICAgICAkbGluZSA9ICIgICRsaW5lIjsKKyAgICB9IGVsc2lmKCRsaW5lID1+IC9ePC8pIHsKKyAgICAgICRsaW5lID0gIiAkbGluZSI7CisgICAgfSBlbHNpZigkbGluZSA9fiAvXj0vKSB7CisgICAgICAkbGluZSA9ICIgICAgJGxpbmUiOworICAgIH0KKyAgICAjIGluc2VydCBzcGFjZXMgYXJvdW5kIHZlcnRpY2FsIGJhcnMgKGZpeCBwcmVmaXhlcykKKworICAgICMgaW5zZXJ0IHNwYWNlcyBhcm91bmQgc2xhc2hlcyAoZml4IGV4cGFuc2lvbnMpCisgICAgJGxpbmUgPX4gcyMvIyAvICNnOworICAgICMgcmVwbGFjZSAmCisgICAgJGxpbmUgPX4gcy9cJi8mYW1wOy9nOworICAgICMgcmVwbGFjZSBzcGFjZXMKKyAgICAkbGluZSA9fiBzLyAvJm5ic3A7L2c7CisgICAgIyByZXBsYWNlIDwKKyAgICAkbGluZSA9fiBzLzwvJmx0Oy9nOworICAgICMgcmVwbGFjZSA+CisgICAgJGxpbmUgPX4gcy8+LyZndDsvZzsKKworICAgICMkbGluZXNbJGldID0gJG5hbWUuJGxybS4kbGluZS4iPC9zcGFuPjxicj4iOyAKKyAgICAjJGkrKzsKKyAgICAkcmVzdWx0IC49ICAkbmFtZS4kbHJtLiRsaW5lLiRzcGFuRW5kLiI8YnI+XG4iOworICB9CisKKyAgIyRfID0gam9pbigiXG4iLCBAbGluZXMpOworICByZXR1cm4gJHJlc3VsdDsKKworfQorIAorc3ViIHByaW50SGVhZGluZyB7CitteSAkZmlsZW5hbWUgPSBzaGlmdDsKKyRmaWxlbmFtZSA9fiBzL1wudHh0Ly87CitwcmludCBPVVQgPDwiRW5kT2ZIZWFkaW5nIjsKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8L2hlYWQ+CisjIENvbGxhdGlvbiBkYXRhIHJlc291cmNlIGJ1bmRsZSBnZW5lcmF0ZWQgZm9yIGxvY2FsZTogJGZpbGVuYW1lPGJyPgorIyBGb3IgcGxhdGZvcm0gaWN1IHJlZmVyZW5jZSBwbGF0Zm9ybSBVQ0E8YnI+PGJyPgorCisKKyRmaWxlbmFtZSZuYnNwO3s8YnI+CismbmJzcDsmbmJzcDtDb2xsYXRpb25FbGVtZW50cyZuYnNwO3s8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO3s8YnI+CitFbmRPZkhlYWRpbmcKK30KKworc3ViIHByaW50Rm9vdGluZyB7CitwcmludCBPVVQgPDwiRW5kT2ZGb290aW5nIjsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO308YnI+CismbmJzcDsmbmJzcDt9PGJyPgorfTxicj4KKworPC9wcmU+Cis8L2h0bWw+CitFbmRPZkZvb3RpbmcKK30KZGlmZiAtLWdpdCBhL2NvbHByb2JlL2djZDIucGwgYi9jb2xwcm9iZS9nY2QyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM4ZTVmODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9nY2QyLnBsCkBAIC0wLDAgKzEsMjQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OworCisjbXkgJGxvY2FsZU1pbnVzQSA9IGBsb2NhbGUgLWFgOworbXkgJGxvY2FsZU1pbnVzQSA9IGBjYXQgfi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9sb2NhbGUudHh0YDsKK215IEBsb2NhbGVzID0gc3BsaXQoL1xuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKK215ICRwbGF0Zm9ybSA9ICRBUkdWWzBdOworCitta2RpciAkcGxhdGZvcm0uImxvZ3MyIjsKK21rZGlyICRwbGF0Zm9ybTsKKworZm9yZWFjaCAkbG9jYWxlIChAbG9jYWxlcykgeworICAkY29tbWFuZCA9ICJ+L3NyYy9pY3Uvc291cmNlL2V4dHJhL2NvbHByb2JlL2NvbHByb2JlIC0tcGxhdGZvcm0gJHBsYXRmb3JtIC0tcmVmICRwbGF0Zm9ybSAtLWRpZmYgJGxvY2FsZSA+JHBsYXRmb3JtIi4ibG9nczIvJGxvY2FsZSIuIkxvZy50eHQgMj4mMSI7CisgICgkbG9jYWxlLCAkXykgPSBzcGxpdCgvXC4vLCAkbG9jYWxlKTsKKyAgJGNvbW1hbmQgLj0gIjsgY3AgL3Vzci9zaGFyZS9pMThuL2xvY2FsZXMvJGxvY2FsZSAkcGxhdGZvcm0vIjsKKyAgcHJpbnQgIiRjb21tYW5kXG4iOworICBgJGNvbW1hbmRgOworICAjY2hkaXIgIi4uIjsKKworfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvZ2VuQ29sbERhdGEucGwgYi9jb2xwcm9iZS9nZW5Db2xsRGF0YS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjQ2MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvZ2VuQ29sbERhdGEucGwKQEAgLTAsMCArMSwyMyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBzdHJpY3Q7CisKK215ICRsb2NhbGVNaW51c0EgPSBgbG9jYWxlIC1hYDsKK215IEBsb2NhbGVzID0gc3BsaXQoL1xuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKK215ICRwbGF0Zm9ybSA9ICRBUkdWWzBdOworCitta2RpciAkcGxhdGZvcm0uImxvZ3MiOworbWtkaXIgJHBsYXRmb3JtOworCitmb3JlYWNoICRsb2NhbGUgKEBsb2NhbGVzKSB7CisgICRjb21tYW5kID0gIn4vc3JjL2ljdS9zb3VyY2UvZXh0cmEvY29scHJvYmUvY29scHJvYmUgLS1vdXRwdXQgcmVzYiAtLXBsYXRmb3JtIGxpbnV4IC0tcmVmIGxpbnV4ICRsb2NhbGUgPiRwbGF0Zm9ybSIuImxvZ3MvJGxvY2FsZSIuIkxvZy50eHQgMj4mMSI7CisgICgkbG9jYWxlLCAkXykgPSBzcGxpdCgvXC4vLCAkbG9jYWxlKTsKKyAgJGNvbW1hbmQgLj0gIjsgY3AgL3Vzci9zaGFyZS9pMThuL2xvY2FsZXMvJGxvY2FsZSAkcGxhdGZvcm0vIjsKKyAgcHJpbnQgIiRjb21tYW5kXG4iOworICBgJGNvbW1hbmRgOworICAjY2hkaXIgIi4uIjsKKworfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvbGluZS5jcHAgYi9jb2xwcm9iZS9saW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgyOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvbGluZS5jcHAKQEAgLTAsMCArMSw3MDEgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgbGluZS5jcHAKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwMy8xOC8yMDAzICB3ZWl2ICAgICAgICBDcmVhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlICJsaW5lLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworVW5pY29kZVNldCAqIExpbmU6Om5lZWRzUXVvdGluZyA9IE5VTEw7CisKK3ZvaWQKK0xpbmU6OmluaXQoKQoreworICAgICAgICBsZW4gPSAwOworICAgICAgICBleHBMZW4gPSAwOworICAgICAgICBzdHJlbmd0aCA9IFVDT0xfT0ZGOworICAgICAgICBzdHJlbmd0aEZyb21FbXB0eSA9IFVDT0xfT0ZGOworICAgICAgICBjdW11bGF0aXZlU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgICAgICAgZXhwU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgICAgICAgcHJldmlvdXMgPSBOVUxMOworICAgICAgICBuZXh0ID0gTlVMTDsKKyAgICAgICAgbGVmdCA9IE5VTEw7CisgICAgICAgIHJpZ2h0ID0gTlVMTDsKKyAgICAgICAgaXNDb250cmFjdGlvbiA9IEZBTFNFOworICAgICAgICBpc0V4cGFuc2lvbiA9IEZBTFNFOworICAgICAgICBpc1JlbW92ZWQgPSBGQUxTRTsKKyAgICAgICAgaXNSZXNldCA9IEZBTFNFOworICAgICAgICBleHBJbmRleCA9IDA7CisgICAgICAgIGZpcnN0Q0MgPSAwOworICAgICAgICBsYXN0Q0MgPSAwOworICAgICAgICBzb3J0S2V5ID0gTlVMTDsKK30KKworTGluZTo6TGluZSgpCit7CisgIGluaXQoKTsKKyAgbWVtc2V0KG5hbWUsIDAsIDI1KnNpemVvZihVQ2hhcikpOworICBtZW1zZXQoZXhwYW5zaW9uU3RyaW5nLCAwLCAyNSpzaXplb2YoVUNoYXIpKTsKK30KKworTGluZTo6TGluZShjb25zdCBVQ2hhciogbmFtZSwgaW50MzJfdCBsZW4pCit7CisgIGluaXQoKTsKKyAgdGhpcy0+bGVuID0gbGVuOworICB1X21lbWNweSh0aGlzLT5uYW1lLCBuYW1lLCBsZW4pOworICBtZW1zZXQoZXhwYW5zaW9uU3RyaW5nLCAwLCAyNSpzaXplb2YoVUNoYXIpKTsKKyAgVUNoYXIzMiBjOworICBVMTZfR0VUKG5hbWUsIDAsIDAsIGxlbiwgYyk7CisgIGZpcnN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworICBVMTZfR0VUKG5hbWUsIDAsIGxlbi0xLCBsZW4sIGMpOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworfQorCitMaW5lOjpMaW5lKGNvbnN0IFVDaGFyIG5hbWUpCit7CisgICAgaW5pdCgpOworICAgIGxlbiA9IDE7CisgICAgdGhpcy0+bmFtZVswXSA9IG5hbWU7CisgICAgdGhpcy0+bmFtZVsxXSA9IDA7CisgIG1lbXNldChleHBhbnNpb25TdHJpbmcsIDAsIDI1KnNpemVvZihVQ2hhcikpOworICBmaXJzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhuYW1lKTsKKyAgbGFzdENDID0gZmlyc3RDQzsKK30KKworTGluZTo6TGluZShjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpCit7CisgIGluaXQoKTsKKyAgc2V0VG8oc3RyaW5nKTsKK30KKworTGluZTo6TGluZShjb25zdCBjaGFyICpidWZmLCBpbnQzMl90IGJ1ZmZMZW4sIFVFcnJvckNvZGUgJnN0YXR1cykgOgorcHJldmlvdXMoTlVMTCksCituZXh0KE5VTEwpLAorbGVmdChOVUxMKSwKK3JpZ2h0KE5VTEwpCit7CisgIGluaXRGcm9tU3RyaW5nKGJ1ZmYsIGJ1ZmZMZW4sIHN0YXR1cyk7Cit9CisKK0xpbmU6OkxpbmUoY29uc3QgTGluZSAmb3RoZXIpIDoKKyAgcHJldmlvdXMoTlVMTCksCisgIG5leHQoTlVMTCksCitsZWZ0KE5VTEwpLAorcmlnaHQoTlVMTCkKK3sKKyAgKnRoaXMgPSBvdGhlcjsKK30KKyAgICAgICAgIAorTGluZSAmCitMaW5lOjpvcGVyYXRvcj0oY29uc3QgTGluZSAmb3RoZXIpIHsKKyAgbGVuID0gb3RoZXIubGVuOworICBleHBMZW4gPSBvdGhlci5leHBMZW47CisgIHN0cmVuZ3RoID0gb3RoZXIuc3RyZW5ndGg7CisgIHN0cmVuZ3RoRnJvbUVtcHR5ID0gb3RoZXIuc3RyZW5ndGhGcm9tRW1wdHk7CisgIGN1bXVsYXRpdmVTdHJlbmd0aCA9IG90aGVyLmN1bXVsYXRpdmVTdHJlbmd0aDsKKyAgZXhwU3RyZW5ndGggPSBvdGhlci5leHBTdHJlbmd0aDsKKyAgaXNDb250cmFjdGlvbiA9IG90aGVyLmlzQ29udHJhY3Rpb247CisgIGlzRXhwYW5zaW9uID0gb3RoZXIuaXNFeHBhbnNpb247CisgIGlzUmVtb3ZlZCA9IG90aGVyLmlzUmVtb3ZlZDsKKyAgaXNSZXNldCA9IG90aGVyLmlzUmVzZXQ7CisgIGV4cEluZGV4ID0gb3RoZXIuZXhwSW5kZXg7CisgIGZpcnN0Q0MgPSBvdGhlci5maXJzdENDOworICBsYXN0Q0MgPSBvdGhlci5sYXN0Q0M7CisgIHVfc3RyY3B5KG5hbWUsIG90aGVyLm5hbWUpOworICB1X3N0cmNweShleHBhbnNpb25TdHJpbmcsIG90aGVyLmV4cGFuc2lvblN0cmluZyk7CisgIHNvcnRLZXkgPSBvdGhlci5zb3J0S2V5OworICBsZWZ0ID0gb3RoZXIubGVmdDsKKyAgcmlnaHQgPSBvdGhlci5yaWdodDsKKyAgcmV0dXJuICp0aGlzOworfQorCitVQm9vbCAKK0xpbmU6Om9wZXJhdG9yPT0oY29uc3QgTGluZSAmb3RoZXIpIGNvbnN0IHsKKyAgaWYodGhpcyA9PSAmb3RoZXIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZihsZW4gIT0gb3RoZXIubGVuKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmKHVfc3RyY21wKG5hbWUsIG90aGVyLm5hbWUpICE9IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK1VCb29sIAorTGluZTo6ZXF1YWxzKGNvbnN0IExpbmUgJm90aGVyKSBjb25zdCB7CisgIGlmKHRoaXMgPT0gJm90aGVyKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYobGVuICE9IG90aGVyLmxlbikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZih1X3N0cmNtcChuYW1lLCBvdGhlci5uYW1lKSAhPSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmKHN0cmVuZ3RoICE9IG90aGVyLnN0cmVuZ3RoKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmKGV4cExlbiAhPSBvdGhlci5leHBMZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYodV9zdHJjbXAoZXhwYW5zaW9uU3RyaW5nLCBvdGhlci5leHBhbnNpb25TdHJpbmcpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitVQm9vbAorTGluZTo6b3BlcmF0b3IhPShjb25zdCBMaW5lICZvdGhlcikgY29uc3QgeworICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Cit9CisKKworTGluZTo6fkxpbmUoKSB7Cit9CisKK3ZvaWQKK0xpbmU6OmNvcHlBcnJheShMaW5lICpkZXN0LCBjb25zdCBMaW5lICpzcmMsIGludDMyX3Qgc2l6ZSkgeworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBkZXN0W2ldID0gc3JjW2ldOworICB9Cit9CisKK3ZvaWQKK0xpbmU6OnNldE5hbWUoY29uc3QgVUNoYXIqIG5hbWUsIGludDMyX3QgbGVuKSB7CisgIHRoaXMtPmxlbiA9IGxlbjsKKyAgdV9tZW1jcHkodGhpcy0+bmFtZSwgbmFtZSwgbGVuKTsKKyAgVUNoYXIzMiBjOworICBVMTZfR0VUKG5hbWUsIDAsIDAsIGxlbiwgYyk7CisgIGZpcnN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworICBVMTZfR0VUKG5hbWUsIDAsIGxlbi0xLCBsZW4sIGMpOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworfQorCit2b2lkIAorTGluZTo6c2V0VG9Db25jYXQoY29uc3QgTGluZSAqZmlyc3QsIGNvbnN0IExpbmUgKnNlY29uZCkgeworICB1X3N0cmNweShuYW1lLCBmaXJzdC0+bmFtZSk7CisgIHVfc3RyY2F0KG5hbWUsIHNlY29uZC0+bmFtZSk7CisgIGxlbiA9IGZpcnN0LT5sZW4gKyBzZWNvbmQtPmxlbjsKKyAgZmlyc3RDQyA9IGZpcnN0LT5maXJzdENDOworICBsYXN0Q0MgPSBzZWNvbmQtPmxhc3RDQzsKK30KKworVW5pY29kZVN0cmluZworTGluZTo6c3RyaW5nVG9OYW1lKFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgaW50MzJfdCBpID0gMDsKKyAgVUNoYXIzMiBjOyAKKyAgd2hpbGUoaSA8IGxlbikgeworICAgIFUxNl9ORVhUKHN0cmluZywgaSwgbGVuLCBjKTsKKyAgICBpZihjIDwgMHgxMDAwMCkgeworICAgICAgc3ByaW50ZihidWZmZXIsICIlMDRYICIsIGMpOworICAgIH0gZWxzZSB7CisgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiUwNlggIiwgYyk7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgfQorICBpID0gMDsKKyAgd2hpbGUoaSA8IGxlbikgeworICAgIFUxNl9ORVhUKHN0cmluZywgaSwgbGVuLCBjKTsKKyAgICB1X2NoYXJOYW1lKGMsIFVfRVhURU5ERURfQ0hBUl9OQU1FLCBidWZmZXIsIDI1NiwgJnN0YXR1cyk7CisgICAgcmVzdWx0LmFwcGVuZCgieyIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kKCJ9ICIpOworICB9CisvKgorICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHNwcmludGYoYnVmZmVyLCAiJTA0WCAiLCBzdHJpbmdbaV0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgfQorICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHVfY2hhck5hbWUoc3RyaW5nW2ldLCBVX0VYVEVOREVEX0NIQVJfTkFNRSwgYnVmZmVyLCAyNTYsICZzdGF0dXMpOworICAgIHJlc3VsdC5hcHBlbmQoInsiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgcmVzdWx0LmFwcGVuZCgifSAiKTsKKyAgfQorKi8gIAorICByZXR1cm4gcmVzdWx0OworfQorCitVbmljb2RlU3RyaW5nCitMaW5lOjp0b0J1bmRsZVN0cmluZygpIAoreworCisgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgaWYoIW5lZWRzUXVvdGluZykgeworICAgIG5lZWRzUXVvdGluZyA9IG5ldyBVbmljb2RlU2V0KCJbWzp3aGl0ZXNwYWNlOl1bOmM6XVs6ejpdW1s6YXNjaWk6XS1bYS16QS1aMC05XV1dIiwgc3RhdHVzKTsKKyAgfQorICBVQ2hhciBORkNbNTBdOworICBpbnQzMl90IE5GQ0xlbiA9IHVub3JtX25vcm1hbGl6ZShuYW1lLCBsZW4sIFVOT1JNX05GQywgMCwgTkZDLCA1MCwgJnN0YXR1cyk7CisgIHJlc3VsdC5hcHBlbmQoIlwiIik7CisgIGlmKGlzUmVzZXQpIHsKKyAgICByZXN1bHQuYXBwZW5kKCImIik7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0LmFwcGVuZChzdHJlbmd0aFRvU3RyaW5nKHN0cmVuZ3RoLCBGQUxTRSwgRkFMU0UpKTsKKyAgfQorICBVQm9vbCBxdW90ZSA9IG5lZWRzUXVvdGluZy0+Y29udGFpbnNTb21lKG5hbWUpIHx8IG5lZWRzUXVvdGluZy0+Y29udGFpbnNTb21lKE5GQyk7CisgIGlmKHF1b3RlKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiJyIpOworICB9CisgIGlmKE5GQ1swXSA9PSAweDIyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiXFx1MDAyMiIpOworICB9IGVsc2UgeworICAgIHJlc3VsdC5hcHBlbmQoTkZDLCBORkNMZW4pOworICB9CisgIGlmKHF1b3RlICYmIE5GQ1swXSAhPSAweDAwMjcpIHsKKyAgICByZXN1bHQuYXBwZW5kKCInIik7CisgIH0KKyAgaWYoZXhwTGVuICYmICFpc1Jlc2V0KSB7CisgICAgcXVvdGUgPSBuZWVkc1F1b3RpbmctPmNvbnRhaW5zU29tZShleHBhbnNpb25TdHJpbmcpOworICAgIHJlc3VsdC5hcHBlbmQoIiAvICIpOworICAgIGlmKHF1b3RlKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCInIik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoZXhwYW5zaW9uU3RyaW5nKTsKKyAgICBpZihxdW90ZSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiJyIpOworICAgIH0KKyAgfQorICByZXN1bHQuYXBwZW5kKCJcIiAvLyIpOworCisgIHJlc3VsdC5hcHBlbmQoc3RyaW5nVG9OYW1lKE5GQywgTkZDTGVuKSk7CisgIGlmKGV4cExlbiAmJiAhaXNSZXNldCkgeworICAgIHJlc3VsdC5hcHBlbmQoIiAvICIpOworICAgIHJlc3VsdC5hcHBlbmQoc3RyaW5nVG9OYW1lKGV4cGFuc2lvblN0cmluZywgZXhwTGVuKSk7CisgIH0KKyAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVW5pY29kZVN0cmluZworTGluZTo6dG9IVE1MU3RyaW5nKCkgCit7CisgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgVUNoYXIgTkZDWzUwXTsKKyAgaW50MzJfdCBORkNMZW4gPSB1bm9ybV9ub3JtYWxpemUobmFtZSwgbGVuLCBVTk9STV9ORkMsIDAsIE5GQywgNTAsICZzdGF0dXMpOworICByZXN1bHQuYXBwZW5kKCI8c3BhbiB0aXRsZT1cIiIpOworICByZXN1bHQuYXBwZW5kKHN0cmluZ1RvTmFtZShORkMsIE5GQ0xlbikpOworICBpZihleHBMZW4gJiYgIWlzUmVzZXQpIHsKKyAgICByZXN1bHQuYXBwZW5kKCIgLyAiKTsKKyAgICByZXN1bHQuYXBwZW5kKHN0cmluZ1RvTmFtZShleHBhbnNpb25TdHJpbmcsIGV4cExlbikpOworICB9CisgIHJlc3VsdC5hcHBlbmQoIlwiPiIpOworICBpZihpc1Jlc2V0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiJmFtcDsiKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQuYXBwZW5kKHN0cmVuZ3RoVG9TdHJpbmcoc3RyZW5ndGgsIEZBTFNFLCBUUlVFKSk7CisgIH0KKyAgcmVzdWx0LmFwcGVuZChORkMsIE5GQ0xlbik7CisgIGlmKGV4cExlbiAmJiAhaXNSZXNldCkgeworICAgIHJlc3VsdC5hcHBlbmQoIiZuYnNwOy8mbmJzcDsiKTsKKyAgICByZXN1bHQuYXBwZW5kKGV4cGFuc2lvblN0cmluZyk7CisgIH0KKyAgcmVzdWx0LmFwcGVuZCgiPC9zcGFuPjxicj5cbiIpOworICByZXR1cm4gcmVzdWx0OworfQorCitVbmljb2RlU3RyaW5nCitMaW5lOjp0b1N0cmluZyhVQm9vbCBwcmV0dHkpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGlmKCFwcmV0dHkpIHsKKyAgICByZXN1bHQuc2V0VG8obmFtZSk7CisgICAgaWYoZXhwTGVuKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIvIik7CisgICAgICByZXN1bHQuYXBwZW5kKGV4cGFuc2lvblN0cmluZyk7CisgICAgfQorICB9IGVsc2UgeworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIFVDaGFyIE5GQ1s1MF07CisgICAgaW50MzJfdCBORkNMZW4gPSB1bm9ybV9ub3JtYWxpemUobmFtZSwgbGVuLCBVTk9STV9ORkMsIDAsIE5GQywgNTAsICZzdGF0dXMpOworICAgIHJlc3VsdC5zZXRUbyhORkMsIE5GQ0xlbik7CisgICAgaWYoZXhwTGVuKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIvIik7CisgICAgICByZXN1bHQuYXBwZW5kKGV4cGFuc2lvblN0cmluZyk7CisgICAgfQorICAgIC8qCisgICAgaWYoTkZDTGVuICE9IGxlbiB8fCB1X3N0cm5jbXAobmFtZSwgTkZDLCBsZW4pICE9IDApIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIihORkM6ICIpOworICAgICAgcmVzdWx0LmFwcGVuZChORkMsIE5GQ0xlbik7CisgICAgICByZXN1bHQuYXBwZW5kKHN0cmluZ1RvTmFtZShORkMsIE5GQ0xlbikpOworICAgICAgcmVzdWx0LmFwcGVuZCgiKSIpOworICAgIH0KKyAgICAqLworICAgIHJlc3VsdC5hcHBlbmQoIiAgICAjICIpOworICAgIHJlc3VsdC5hcHBlbmQoc3RyaW5nVG9OYW1lKE5GQywgTkZDTGVuKSk7CisgICAgaWYoZXhwTGVuKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIvICIpOworICAgICAgcmVzdWx0LmFwcGVuZChzdHJpbmdUb05hbWUoZXhwYW5zaW9uU3RyaW5nLCBleHBMZW4pKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkCitMaW5lOjpzZXRUbyhjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpIHsKKyAgaW50MzJfdCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7CisgIHVfc3RybmNweShuYW1lLCBzdHJpbmcuZ2V0QnVmZmVyKCksIGxlbik7CisgIG5hbWVbbGVuXSA9IDA7CisgIHRoaXMtPmxlbiA9IGxlbjsKKyAgVUNoYXIzMiBjOworICBVMTZfR0VUKG5hbWUsIDAsIDAsIGxlbiwgYyk7CisgIGZpcnN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworICBVMTZfR0VUKG5hbWUsIDAsIGxlbi0xLCBsZW4sIGMpOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworfQorCit2b2lkIAorTGluZTo6c2V0VG8oY29uc3QgVUNoYXIzMiBuKSB7CisgIFVCb29sIGlzRXJyb3IgPSBGQUxTRTsKKyAgbGVuID0gMDsgLy8gd2UgYXJlIHNldHRpbmcgdGhlIGxpbmUgdG8gY2hhciwgbm90IGFwcGVuZGluZworICBVMTZfQVBQRU5EKG5hbWUsIGxlbiwgMjUsIG4sIGlzRXJyb3IpOworICBuYW1lW2xlbl0gPSAwOworICBmaXJzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhuKTsKKyAgbGFzdENDID0gZmlyc3RDQzsKK30KKworCitVbmljb2RlU3RyaW5nCitMaW5lOjpzdHJlbmd0aEluZGVudChVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGgsIGludCBpbmRlbnRTaXplLCBVbmljb2RlU3RyaW5nICZyZXN1bHQpIAoreworICBpbnQgaTsKKyAgaW50IG51bUluZGVudHMgPSBzdHJlbmd0aCsxOworICBpZihzdHJlbmd0aCA+IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSBlbHNlIGlmKHN0cmVuZ3RoID09IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgbnVtSW5kZW50cyA9IDU7CisgIH0KKyAgZm9yKGkgPSAwOyBpIDwgbnVtSW5kZW50cyppbmRlbnRTaXplOyBpKyspIHsKKyAgICByZXN1bHQuYXBwZW5kKCIgIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVW5pY29kZVN0cmluZyAKK0xpbmU6OnN0cmVuZ3RoVG9TdHJpbmcoVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoLCBVQm9vbCBwcmV0dHksIFVCb29sIGh0bWwpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGlmKGh0bWwpIHsKKyAgICBzd2l0Y2goc3RyZW5ndGgpIHsKKyAgICBjYXNlIFVDT0xfSURFTlRJQ0FMOgorICAgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PSZuYnNwOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1FVQVRFUk5BUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Jmx0OyZsdDsmbHQ7Jm5ic3A7Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVDT0xfVEVSVElBUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Jmx0OyZsdDsmbmJzcDsiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVUNPTF9TRUNPTkRBUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Jmx0OyZuYnNwOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1BSSU1BUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbHQ7Jm5ic3A7Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVDT0xfT0ZGOgorICAgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jmd0Oz8mbmJzcDsiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDs/ISZuYnNwOyIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaChzdHJlbmd0aCkgeworICAgIGNhc2UgVUNPTF9JREVOVElDQUw6CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA9ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1FVQVRFUk5BUlk6CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA8PDw8ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1RFUlRJQVJZOgorICAgICAgLy91X2ZwcmludGYoZmlsZSwgIjwzIik7CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgIik7CisgICAgICB9CisgICAgICByZXN1bHQuYXBwZW5kKCIgPDw8ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1NFQ09OREFSWToKKyAgICAgIC8vdV9mcHJpbnRmKGZpbGUsICI8MiIpOworICAgICAgaWYocHJldHR5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA8PCAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVUNPTF9QUklNQVJZOgorICAgICAgLy91X2ZwcmludGYoZmlsZSwgIjwxIik7CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA8ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX09GRjoKKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA+PyAiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQuYXBwZW5kKCIgPyEgIik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworTGluZSAqCitMaW5lOjpuZXh0SW50ZXJlc3RpbmcoKSB7CisgIExpbmUgKnJlc3VsdCA9IHRoaXMtPm5leHQ7CisgIHdoaWxlKHJlc3VsdCAmJiByZXN1bHQtPnN0cmVuZ3RoICE9IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgcmVzdWx0ID0gcmVzdWx0LT5uZXh0OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK0xpbmU6OmFwcGVuZChjb25zdCBVQ2hhciogbiwgaW50MzJfdCBsZW5ndGgpIAoreworICB1X3N0cm5jYXQobmFtZSwgbiwgbGVuZ3RoKTsKKyAgbmFtZVtsZW4rbGVuZ3RoXSA9IDA7CisgIGxlbiArPSBsZW5ndGg7CisgIFVDaGFyMzIgZW5kOworICBVMTZfR0VUKG4sIDAsIGxlbmd0aC0xLCBsZW5ndGgsIGVuZCk7CisgIGxhc3RDQyA9IHVfZ2V0Q29tYmluaW5nQ2xhc3MoZW5kKTsKK30KKwordm9pZAorTGluZTo6YXBwZW5kKGNvbnN0IFVDaGFyIG4pIAoreworICBuYW1lW2xlbl0gPSBuOworICBuYW1lW2xlbisxXSA9IDA7CisgIGxlbisrOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKG4pOworfQorCit2b2lkCitMaW5lOjphcHBlbmQoY29uc3QgTGluZSAmbCkKK3sKKyAgYXBwZW5kKGwubmFtZSwgbC5sZW4pOworICBsYXN0Q0MgPSBsLmxhc3RDQzsKK30KKwordm9pZAorTGluZTo6Y2xlYXIoKQoreworICBuYW1lWzBdID0gMDsKKyAgbGVuID0gMDsKK30KKworaW50MzJfdAorTGluZTo6d3JpdGUoY2hhciAqYnVmZiwgaW50MzJfdCwgVUVycm9yQ29kZSAmKSAKK3sKKyAgLyoKKyAgICBVQ2hhciAgICAgbmFtZVsyNV07CisgICAgaW50MzJfdCAgIGxlbjsKKyAgICBVQ2hhciAgICAgZXhwYW5zaW9uU3RyaW5nWzI1XTsKKyAgICBpbnQzMl90ICAgZXhwTGVuOworCisgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoOworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aEZyb21FbXB0eTsKKyAgICBVQ29sQXR0cmlidXRlVmFsdWUgY3VtdWxhdGl2ZVN0cmVuZ3RoOworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBleHBTdHJlbmd0aDsKKworICAgIExpbmUgKnByZXZpb3VzOworICAgIExpbmUgKm5leHQ7CisKKyAgICBVQm9vbCAgIGlzQ29udHJhY3Rpb247CisgICAgVUJvb2wgICBpc0V4cGFuc2lvbjsKKyAgICBVQm9vbCAgIGlzUmVtb3ZlZDsKKyAgICBVQm9vbCAgIGlzUmVzZXQ7CisKKyAgICBpbnQzMl90IGV4cEluZGV4OworICAgIHVpbnQ4X3QgZmlyc3RDQzsKKyAgICB1aW50OF90IGxhc3RDQzsKKyovCisgIGludDMyX3QgcmVzTGVuID0gMDsKKyAgaW50MzJfdCBpID0gMDsKKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiUwNFgiLCBuYW1lWzBdKTsKKyAgcmVzTGVuICs9IDQ7CisgIGZvcihpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisgICAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiAlMDRYIiwgbmFtZVtpXSk7CisgICAgcmVzTGVuICs9IDU7CisgIH0KKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIi8iKTsKKyAgcmVzTGVuICs9IDE7CisKKyAgaSA9IDA7CisgIGlmKGV4cExlbikgeworICAgIHNwcmludGYoYnVmZityZXNMZW4sICIlMDRYIiwgZXhwYW5zaW9uU3RyaW5nWzBdKTsKKyAgICByZXNMZW4gKz0gNDsKKyAgICBmb3IoaSA9IDE7IGkgPCBleHBMZW47IGkrKykgeworICAgICAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiAlMDRYIiwgZXhwYW5zaW9uU3RyaW5nW2ldKTsKKyAgICAgIHJlc0xlbiArPSA1OworICAgIH0KKyAgfQorICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiOyAiKTsKKyAgcmVzTGVuICs9IDI7CisKKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiUwMmkgIiwgc3RyZW5ndGgpOworICByZXNMZW4gKz0gMzsKKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiUwMmkiLCBzdHJlbmd0aEZyb21FbXB0eSk7CisgIHJlc0xlbiArPSAyOworICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiJTAyaSIsIGN1bXVsYXRpdmVTdHJlbmd0aCk7CisgIHJlc0xlbiArPSAyOworICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiJTAyaSIsIGV4cFN0cmVuZ3RoKTsKKyAgcmVzTGVuICs9IDI7CisKKyAgLy8gVmFyaW91cyBmbGFncy4gVGhlIG9ubHkgaW50ZXJlc3Rpbmcgb25lcyBhcmUgaXNSZXNldCBhbmQgaXNSZW1vdmVkLiBXZSB3aWxsIG5vdCBvdXRwdXQgcmVtb3ZlZCBsaW5lcworICAvL3NwcmludGYoYnVmZityZXNMZW4sICIlMWklMWklMWklMWkgIiwgaXNDb250cmFjdGlvbiwgaXNFeHBhbnNpb24sIGlzUmVtb3ZlZCwgaXNSZXNldCk7CisgIC8vcmVzTGVuICs9IDU7CisgIHNwcmludGYoYnVmZityZXNMZW4sICIlMWklMWkgIiwgaXNSZW1vdmVkLCBpc1Jlc2V0KTsKKyAgcmVzTGVuICs9IDM7CisKKyAgLy8gZmlyc3QgYW5kIGxhc3QgQ0MKKyAgLy8gY2FuIGJlIGNhbGN1bGF0ZWQgb24gcmVhZGluZworICAvL3NwcmludGYoYnVmZityZXNMZW4sICIlMDNpICUwM2kgIiwgZmlyc3RDQywgbGFzdENDKTsKKyAgLy9yZXNMZW4gKz0gODsKKworICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiJTA4WCIsIGV4cEluZGV4KTsKKyAgcmVzTGVuICs9IDg7CisKKyAgYnVmZltyZXNMZW5dID0gMDsKKworICByZXR1cm4gcmVzTGVuOworfQorCit2b2lkCitMaW5lOjppbml0RnJvbVN0cmluZyhjb25zdCBjaGFyICpidWZmLCBpbnQzMl90LCBVRXJyb3JDb2RlICYpCit7CisgIGludDMyX3QgYnVmSW5kZXggPSAwOworICBpbnQzMl90IGkgPSAwOworCisgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTA0WCIsICZuYW1lW2ldKTsKKyAgaSsrOworICBidWZJbmRleCArPSA0OworICB3aGlsZShidWZmW2J1ZkluZGV4XSAhPSAnLycpIHsKKyAgICBzc2NhbmYoYnVmZitidWZJbmRleCwgIiAlMDRYIiwgJm5hbWVbaV0pOworICAgIGkrKzsKKyAgICBidWZJbmRleCArPSA1OworICB9CisgIGxlbiA9IGk7CisgIG5hbWVbbGVuXSA9IDA7CisgIGJ1ZkluZGV4Kys7CisKKyAgaWYoaSA+IDEpIHsKKyAgICBpc0NvbnRyYWN0aW9uID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBpc0NvbnRyYWN0aW9uID0gRkFMU0U7CisgIH0KKworICBpZihidWZmW2J1ZkluZGV4XSA9PSAnOycpIHsKKyAgICBpc0V4cGFuc2lvbiA9IEZBTFNFOworICAgIGJ1ZkluZGV4ICs9IDI7CisgICAgZXhwYW5zaW9uU3RyaW5nWzBdID0gMDsKKyAgICBleHBMZW4gPSAwOworICB9IGVsc2UgeworICAgIGkgPSAwOworICAgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTA0WCIsICZleHBhbnNpb25TdHJpbmdbaV0pOworICAgIGkrKzsKKyAgICBidWZJbmRleCArPSA0OworICAgIHdoaWxlKGJ1ZmZbYnVmSW5kZXhdICE9ICc7JykgeworICAgICAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIgJTA0WCIsICZleHBhbnNpb25TdHJpbmdbaV0pOworICAgICAgaSsrOworICAgICAgYnVmSW5kZXggKz0gNTsKKyAgICB9CisgICAgZXhwTGVuID0gaTsKKyAgICBleHBhbnNpb25TdHJpbmdbZXhwTGVuXSA9IDA7CisgICAgYnVmSW5kZXggKz0gMjsKKyAgfQorICBzc2NhbmYoYnVmZitidWZJbmRleCwgIiUwMmkgIiwgJnN0cmVuZ3RoKTsKKyAgYnVmSW5kZXggKz0gMzsKKyAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIlMDJpIiwgJnN0cmVuZ3RoRnJvbUVtcHR5KTsKKyAgYnVmSW5kZXggKz0gMjsKKyAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIlMDJpIiwgJmN1bXVsYXRpdmVTdHJlbmd0aCk7CisgIGJ1ZkluZGV4ICs9IDI7CisgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTAyaSIsICZleHBTdHJlbmd0aCk7CisgIGJ1ZkluZGV4ICs9IDI7CisKKyAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIlMWklMWkgIiwgJmlzUmVtb3ZlZCwgJmlzUmVzZXQpOworICBidWZJbmRleCArPSAzOworCisgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTA4WCIsICZleHBJbmRleCk7CisgIGJ1ZkluZGV4ICs9IDg7CisKKyAgLy8gY2FsY3VsYXRlIGZpcnN0IGFuZCBsYXN0IENDCisgIFVDaGFyMzIgYzsKKyAgVTE2X0dFVChuYW1lLCAwLCAwLCBsZW4sIGMpOworICBmaXJzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhjKTsKKyAgVTE2X0dFVChuYW1lLCAwLCBsZW4tMSwgbGVuLCBjKTsKKyAgbGFzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhjKTsKK30KKwordm9pZAorTGluZTo6c3dhcENhc2UoVUNoYXIgKnN0cmluZywgaW50MzJfdCAmc0xlbikKK3sKKyAgVUNoYXIzMiBjID0gMDsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDA7CisgIFVDaGFyIGJ1ZmZbMjU2XTsKKyAgVUJvb2wgaXNFcnJvciA9IEZBTFNFOworICB3aGlsZShpIDwgc0xlbikgeworICAgIFUxNl9ORVhUKHN0cmluZywgaSwgc0xlbiwgYyk7CisgICAgaWYodV9pc1VVcHBlcmNhc2UoYykpIHsKKyAgICAgIGMgPSB1X3RvbG93ZXIoYyk7CisgICAgfSBlbHNlIGlmKHVfaXNVTG93ZXJjYXNlKGMpKSB7CisgICAgICBjID0gdV90b3VwcGVyKGMpOworICAgIH0KKyAgICBVMTZfQVBQRU5EKGJ1ZmYsIGosIDI1NiwgYywgaXNFcnJvcik7CisgIH0KKyAgYnVmZltqXSA9IDA7CisgIHVfc3RyY3B5KHN0cmluZywgYnVmZik7CisgIHNMZW4gPSBqOworfQorCisKK3ZvaWQKK0xpbmU6OnN3YXBDYXNlKCkKK3sKKyAgc3dhcENhc2UobmFtZSwgbGVuKTsKKyAgc3dhcENhc2UoZXhwYW5zaW9uU3RyaW5nLCBleHBMZW4pOworfQorCitVbmljb2RlU3RyaW5nCitMaW5lOjpkdW1wU29ydGtleSgpIAoreworCisgIGNoYXIgYnVmZmVyWzI1Nl07CisgIGNoYXIgKmJ1ZmYgPSBidWZmZXI7CisgICpidWZmID0gMDsKKyAgdWludDhfdCAqa2V5ID0gc29ydEtleTsKKyAgaWYoc29ydEtleSkgeworICAgIHdoaWxlKCprZXkpIHsKKyAgICAgIHNwcmludGYoYnVmZiwgIiUwMlggIiwgKmtleSk7CisgICAgICBrZXkrKzsKKyAgICAgIGJ1ZmYgKz0gMzsKKyAgICAgIGlmKGJ1ZmYgLSBidWZmZXIgPiAyNTIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBVbmljb2RlU3RyaW5nKGJ1ZmZlcik7Cit9CisKZGlmZiAtLWdpdCBhL2NvbHByb2JlL2xpbmUuaCBiL2NvbHByb2JlL2xpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWNlMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvbGluZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIGxpbmUuaAorKgorKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKyoKKyogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorKiAgIDAzLzE4LzIwMDMgIHdlaXYgICAgICAgIENyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLy8KKy8vICAgY2xhc3MgTGluZQorLy8KKy8vICAgICAgRWFjaCBsaW5lIGZyb20gdGhlIHNvdXJjZSBmaWxlIChjb250YWluaW5nIGEgbmFtZSwgcHJlc3VtYWJseSkgZ2V0cworLy8gICAgICBvbmUgb2YgdGhlc2Ugc3RydWN0cy4KKy8vCisKKyNpZm5kZWYgQ09MUFJPQkVfTElORV9ICisjZGVmaW5lIENPTFBST0JFX0xJTkVfSAorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y29sLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBjb25zdCBpbnQgTUFYX0VYUEFOU0lPTl9QUkVGSVhFUyA9IDEwOworCitjbGFzcyAgTGluZSB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGNvcHlBcnJheShMaW5lICpkZXN0LCBjb25zdCBMaW5lICpzcmMsIGludDMyX3Qgc2l6ZSk7CisgIExpbmUoKTsKKyAgTGluZShjb25zdCBMaW5lICZvdGhlcik7CisgIExpbmUoY29uc3QgVUNoYXIqIG5hbWUsIGludDMyX3QgbGVuKTsKKyAgTGluZShjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpOworICBMaW5lKGNvbnN0IFVDaGFyIG5hbWUpOworICBMaW5lKGNvbnN0IGNoYXIgKmJ1ZmYsIGludDMyX3QgYnVmZkxlbiwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgfkxpbmUoKTsKKyAgTGluZSAmIG9wZXJhdG9yPShjb25zdCBMaW5lICZvdGhlcik7CisgIFVCb29sIG9wZXJhdG9yPT0oY29uc3QgTGluZSAmb3RoZXIpIGNvbnN0OworICBVQm9vbCBvcGVyYXRvciE9KGNvbnN0IExpbmUgJm90aGVyKSBjb25zdDsKKyAgdm9pZCBzZXRUb0NvbmNhdChjb25zdCBMaW5lICpmaXJzdCwgY29uc3QgTGluZSAqc2Vjb25kKTsKKyAgdm9pZCBzZXROYW1lKGNvbnN0IFVDaGFyKiBuYW1lLCBpbnQzMl90IGxlbik7CisgIFVuaWNvZGVTdHJpbmcgdG9TdHJpbmcoVUJvb2wgcHJldHR5ID0gRkFMU0UpOworICBVbmljb2RlU3RyaW5nIHRvQnVuZGxlU3RyaW5nKCk7CisgIFVuaWNvZGVTdHJpbmcgdG9IVE1MU3RyaW5nKCk7CisgIGludDMyX3Qgd3JpdGUoY2hhciAqYnVmZiwgaW50MzJfdCBidWZmTGVuLCBVRXJyb3JDb2RlICZzdGF0dXMpOworICB2b2lkIGluaXRGcm9tU3RyaW5nKGNvbnN0IGNoYXIgKmJ1ZmYsIGludDMyX3QgYnVmZkxlbiwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgCisKKyAgVW5pY29kZVN0cmluZyBzdHJlbmd0aEluZGVudChVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGgsIGludCBpbmRlbnRTaXplLCBVbmljb2RlU3RyaW5nICZyZXN1bHQpOworICBVbmljb2RlU3RyaW5nIHN0cmVuZ3RoVG9TdHJpbmcoVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoLCBVQm9vbCBwcmV0dHksIFVCb29sIGh0bWwgPSBGQUxTRSk7CisgIFVuaWNvZGVTdHJpbmcgc3RyaW5nVG9OYW1lKFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuKTsKKyAgdm9pZCBzZXRUbyhjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpOworICB2b2lkIHNldFRvKGNvbnN0IFVDaGFyMzIgbik7CisgIFVCb29sIGVxdWFscyhjb25zdCBMaW5lICZvdGhlcikgY29uc3Q7CisgIExpbmUgKm5leHRJbnRlcmVzdGluZygpOworICB2b2lkIGFwcGVuZChjb25zdCBVQ2hhciBuKTsKKyAgdm9pZCBhcHBlbmQoY29uc3QgVUNoYXIqIG4sIGludDMyX3QgbGVuZ3RoKTsKKyAgdm9pZCBhcHBlbmQoY29uc3QgTGluZSAmbCk7CisgIHZvaWQgY2xlYXIoKTsKKyAgdm9pZCBzd2FwQ2FzZSgpOworICB2b2lkIHN3YXBDYXNlKFVDaGFyICpzdHJpbmcsIGludDMyX3QgJnNMZW4pOworICBVbmljb2RlU3RyaW5nIGR1bXBTb3J0a2V5KCk7CisgIHZvaWQgaW5pdCgpOworCisgIAorcHVibGljOgorICAgIFVDaGFyICAgICBuYW1lWzI1XTsKKyAgICBpbnQzMl90ICAgbGVuOworICAgIFVDaGFyICAgICBleHBhbnNpb25TdHJpbmdbMjVdOworICAgIGludDMyX3QgICBleHBMZW47CisKKyAgICBVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGg7CisgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoRnJvbUVtcHR5OworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBjdW11bGF0aXZlU3RyZW5ndGg7CisgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIGV4cFN0cmVuZ3RoOworCisgICAgTGluZSAqcHJldmlvdXM7CisgICAgTGluZSAqbmV4dDsKKworICAgIC8vIEluIGNhc2UgdGhpcyBlbGVtZW50IGlzIGEgY29udHJhY3Rpb24KKyAgICAvLyB3ZSBrZWVwIGEgcG9pbnRlciBhdCB3aGljaCBsaW5lcyB3ZXJlIGNvbXBvbmVudHMKKyAgICBMaW5lICpsZWZ0OworICAgIExpbmUgKnJpZ2h0OworCisgICAgVUJvb2wgICBpc0NvbnRyYWN0aW9uOworICAgIFVCb29sICAgaXNFeHBhbnNpb247CisgICAgVUJvb2wgICBpc1JlbW92ZWQ7CisgICAgVUJvb2wgICBpc1Jlc2V0OworCisgICAgaW50MzJfdCBleHBJbmRleDsKKyAgICB1aW50OF90IGZpcnN0Q0M7CisgICAgdWludDhfdCBsYXN0Q0M7CisKKyAgICB1aW50OF90ICAgKnNvcnRLZXk7CitwdWJsaWM6CisgIHN0YXRpYyBVbmljb2RlU2V0ICpuZWVkc1F1b3Rpbmc7Cit9OworCisKKyNlbmRpZiAvL0NPTFBST0JFX0xJTkVfSApkaWZmIC0tZ2l0IGEvY29scHJvYmUvbG9jYWxlLnR4dCBiL2NvbHByb2JlL2xvY2FsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YWI1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2xvY2FsZS50eHQKQEAgLTAsMCArMSwyNDEgQEAKK2FmCithZl9aQQorYW0KK2FtX0VUCithcgorYXJfQUUKK2FyX0JICithcl9EWgorYXJfRUcKK2FyX0lOCithcl9JUQorYXJfSk8KK2FyX0tXCithcl9MQgorYXJfTFkKK2FyX01BCithcl9PTQorYXJfUUEKK2FyX1NBCithcl9TRAorYXJfU1kKK2FyX1ROCithcl9ZRQorYmUKK2JlX0JZCitiZworYmdfQkcKK2JuCitibl9JTgorY2EKK2NhX0VTCisjY2FfRVNfUFJFRVVSTworY3MKK2NzX0NaCitkYQorZGFfREsKK2RlCitkZV9BVAorI2RlX0FUX1BSRUVVUk8KK2RlX0JFCitkZV9DSAorZGVfREUKKyNkZV9ERV9QUkVFVVJPCitkZV9MVQorI2RlX0xVX1BSRUVVUk8KK2RlX19QSE9ORUJPT0sKK2VsCitlbF9HUgorI2VsX0dSX1BSRUVVUk8KK2VuCitlbl9BVQorZW5fQkUKKyNlbl9CRV9QUkVFVVJPCitlbl9CVworZW5fQ0EKK2VuX0dCCisjZW5fR0JfRVVSTworZW5fSEsKK2VuX0lFCisjZW5fSUVfUFJFRVVSTworZW5fSU4KK2VuX01UCitlbl9OWgorZW5fUEgKK2VuX1NHCitlbl9VUworZW5fVVNfUE9TSVgKK2VuX1ZJCitlbl9aQQorZW5fWlcKK2VvCitlcworZXNfQVIKK2VzX0JPCitlc19DTAorZXNfQ08KK2VzX0NSCitlc19ETworZXNfRUMKK2VzX0VTCisjZXNfRVNfUFJFRVVSTworZXNfR1QKK2VzX0hOCitlc19NWAorZXNfTkkKK2VzX1BBCitlc19QRQorZXNfUFIKK2VzX1BZCitlc19TVgorZXNfVVMKK2VzX1VZCitlc19WRQorZXNfX1RSQURJVElPTkFMCitldAorZXRfRUUKK2V1CitldV9FUworI2V1X0VTX1BSRUVVUk8KK2ZhCitmYV9BRgorZmFfSVIKK2ZpCitmaV9GSQorI2ZpX0ZJX1BSRUVVUk8KK2ZvCitmb19GTworZnIKK2ZyX0JFCisjZnJfQkVfUFJFRVVSTworZnJfQ0EKK2ZyX0NICitmcl9GUgorI2ZyX0ZSX1BSRUVVUk8KK2ZyX0xVCisjZnJfTFVfUFJFRVVSTworZ2EKK2dhX0lFCisjZ2FfSUVfUFJFRVVSTworZ2wKK2dsX0VTCisjZ2xfRVNfUFJFRVVSTworZ3UKK2d1X0lOCitndgorZ3ZfR0IKK2hlCitoZV9JTAoraGkKK2hpX0lOCitoaV9fRElSRUNUCitocgoraHJfSFIKK2h1CitodV9IVQoraHkKK2h5X0FNCitoeV9BTV9SRVZJU0VECitpZAoraWRfSUQKK2lzCitpc19JUworaXQKK2l0X0NICitpdF9JVAorI2l0X0lUX1BSRUVVUk8KK2phCitqYV9KUAorI2phX0pQX1RSQURJVElPTkFMCitra19LWgora2wKK2tsX0dMCitrbgora25fSU4KK2tvCitrb19LUgora29rCitrb2tfSU4KK2t3Citrd19HQgorbHQKK2x0X0xUCitsdgorbHZfTFYKK21rCitta19NSworbXIKK21yX0lOCittc19NWQorbXQKK210X01UCituYgorbmJfTk8KK25sCitubF9CRQorI25sX0JFX1BSRUVVUk8KK25sX05MCisjbmxfTkxfUFJFRVVSTworbm4KK25uX05PCitvbQorb21fRVQKK29tX0tFCitwbAorcGxfUEwKK3BzCitwc19BRgorcHQKK3B0X0JSCitwdF9QVAorI3B0X1BUX1BSRUVVUk8KK3JvCityb19STworcnUKK3J1X1JVCitydV9VQQorc2gKK3NoX1lVCitzaworc2tfU0sKK3NsCitzbF9TSQorc28KK3NvX0RKCitzb19FVAorc29fS0UKK3NvX1NPCitzcQorc3FfQUwKK3NyCitzcl9ZVQorc3YKK3N2X0ZJCitzdl9TRQorc3cKK3N3X0tFCitzd19UWgordGEKK3RhX0lOCit0ZQordGVfSU4KK3RoCit0aF9USAorI3RoX1RIX1RSQURJVElPTkFMCit0aQordGlfRVIKK3RpX0VUCit0cgordHJfVFIKK3VrCit1a19VQQordmkKK3ZpX1ZOCit6aAoremhfQ04KK3poX0hLCit6aF9NTworemhfU0cKK3poX1RXCit6aF9UV19TVFJPS0UKK3poX19QSU5ZSU4KZGlmZiAtLWdpdCBhL2NvbHByb2JlL2xvbmduYW1lLmNwcCBiL2NvbHByb2JlL2xvbmduYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJhNDVkCi0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvbG9uZ25hbWUuY3BwCkBAIC0wLDAgKzEsNDggQEAKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgorI2luY2x1ZGUgInVuaWNvZGUvbG9jaWQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywKKyAgICAgY2hhciogYXJndltdKQoreworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgY29uc3QgY2hhciAqbG9jID0gYXJndlsxXTsKKyAgaW50MzJfdCBoYXNDb3VudHJ5OworICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKCJ1dGY4IiwgJnN0YXR1cyk7CisKKyAgCisgIFVDaGFyIFVCdWZmZXJbMjU2XTsKKyAgaW50MzJfdCB1QnVmTGVuID0gMDsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgaW50MzJfdCBidWZMZW4gPSAwOworCisgIHVCdWZMZW4gPSB1bG9jX2dldERpc3BsYXlMYW5ndWFnZShsb2MsICJlbiIsIFVCdWZmZXIsIDI1NiwgJnN0YXR1cyk7CisgIGJ1ZkxlbiA9IHVjbnZfZnJvbVVDaGFycyhjb252LCBidWZmZXIsIDI1NiwgVUJ1ZmZlciwgdUJ1ZkxlbiwgJnN0YXR1cyk7CisgIC8vdV9VQ2hhcnNUb0NoYXJzKFVCdWZmZXIsICBidWZmZXIsIHVCdWZMZW4pOworICBidWZmZXJbYnVmTGVuXSA9IDA7CisgIHByaW50ZigiJXMiLCBidWZmZXIpOworCisgIGlmKGhhc0NvdW50cnkgPSB1bG9jX2dldENvdW50cnkobG9jLCBidWZmZXIsIDI1NiwgJnN0YXR1cykpIHsKKyAgICB1QnVmTGVuID0gdWxvY19nZXREaXNwbGF5Q291bnRyeShsb2MsICJlbiIsIFVCdWZmZXIsIDI1NiwgJnN0YXR1cyk7CisgICAgYnVmTGVuID0gdWNudl9mcm9tVUNoYXJzKGNvbnYsIGJ1ZmZlciwgMjU2LCBVQnVmZmVyLCB1QnVmTGVuLCAmc3RhdHVzKTsKKyAgICAvL3VfVUNoYXJzVG9DaGFycyhVQnVmZmVyLCAgYnVmZmVyLCB1QnVmTGVuKTsKKyAgICBidWZmZXJbYnVmTGVuXSA9IDA7CisgICAgcHJpbnRmKCJfJXMiLCBidWZmZXIpOworICB9CisKKyAgaWYodWxvY19nZXRWYXJpYW50KGxvYywgYnVmZmVyLCAyNTYsICZzdGF0dXMpKSB7CisgICAgdUJ1ZkxlbiA9IHVsb2NfZ2V0RGlzcGxheVZhcmlhbnQobG9jLCAiZW4iLCBVQnVmZmVyLCAyNTYsICZzdGF0dXMpOworICAgIGJ1ZkxlbiA9IHVjbnZfZnJvbVVDaGFycyhjb252LCBidWZmZXIsIDI1NiwgVUJ1ZmZlciwgdUJ1ZkxlbiwgJnN0YXR1cyk7CisgICAgLy91X1VDaGFyc1RvQ2hhcnMoVUJ1ZmZlciwgIGJ1ZmZlciwgdUJ1Zkxlbik7CisgICAgYnVmZmVyW2J1Zkxlbl0gPSAwOworICAgIGlmKCFoYXNDb3VudHJ5KSB7CisgICAgICBwcmludGYoIl8iKTsKKyAgICB9CisgICAgcHJpbnRmKCJfJXMiLCBidWZmZXIpOworICB9CisgIHByaW50ZigiXG4iKTsKKworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvcmVhZG1lLnR4dCBiL2NvbHByb2JlL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyOTE0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3JlYWRtZS50eHQKQEAgLTAsMCArMSw0IEBACitUaGVyZSBhcmUgc2V2ZXJhbCB0b29scyBpbiB0aGlzIGRpcmVjdG9yeSB0aGF0IHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBnZW5lcmF0ZSBjb2xsYXRpb24gZGF0YToKK2V4dHJhY3RDb2xsYXRpb25EYXRhLnBsIC0gcGVybCBzY3JpcHQgdGhhdCByZWFkcyBJQ1UgcmVzb3VyY2UgYnVuZGxlIGZpbGVzIGFuZCBvdXRwdXRzIGEgbG9jYWxlX2NvbGxhdGlvbi5odG1sIGZpbGUgaWYgY29sbGF0aW9uIGVsZW1lbnRzIGFyZSBwcmVzZW50IGluIHRoZSBsb2NhbGUuIEFyZ3VtZW50cyBhcmUgdGhlIGxpc3Qgb2YgbG9jYWxlIHNvdXJjZSBmaWxlcyAoKi50eHQpIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQuCitjcmVhdGVDb21wYXJpc29uVGFibGVzLnBsIC0gdGFrZXMgYSBsb2NhbGUgbmFtZS4gTG9va3MgaW4gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgY29udGFpbiB0aGUgaHRtbCBkYXRhIHByb2R1Y2VkIGJ5IGNvbHByb2JlIG9yIGV4dHJhY3RDb2xsYXRpb25EYXRhLgordGFibGVTdGFydGVyLnBsIC0gaW52b2tlcyBjcmVhdGVDb21wYXJpc29uVGFibGVzLnBsIHdpdGggYSBsaXN0IG9mIGxvY2FsZXMuIApkaWZmIC0tZ2l0IGEvY29scHJvYmUvc29ydGVkbGluZXMuY3BwIGIvY29scHJvYmUvc29ydGVkbGluZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjNkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9zb3J0ZWRsaW5lcy5jcHAKQEAgLTAsMCArMSwyMDY3IEBACisjaW5jbHVkZSAic29ydGVkbGluZXMuaCIKKworc3RhdGljIGludCBjb2RlUG9pbnRDbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICByZXR1cm4gdV9zdHJjbXAoKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bmFtZSk7Cit9CisKK1NvcnRlZExpbmVzOjpTb3J0ZWRMaW5lcyhjb25zdCBVbmljb2RlU2V0ICZzZXQsIGNvbnN0IFVuaWNvZGVTZXQgJmV4Y2x1ZGVCb3VuZHMsIGNvbnN0IFN0cmVuZ3RoUHJvYmUgJnByb2JlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBVUHJpbnRlciAqbG9nZ2VyLCBVUHJpbnRlciAqZGVidWcpIDoKK3RvU29ydChOVUxMKSwKK3RvU29ydENhcGFjaXR5KDApLAorbGluZXMoTlVMTCksCitzaXplKDApLAorY2FwYWNpdHkoMCksCityZXBlcnRvaXJlKHNldCksCitleGNsdWRlQm91bmRzKGV4Y2x1ZGVCb3VuZHMpLAorcHJvYmUocHJvYmUpLAorZmlyc3QoTlVMTCksCitsYXN0KE5VTEwpLAorbG9nZ2VyKGxvZ2dlciksCitkZWJ1ZyhkZWJ1ZyksCitjb250cmFjdGlvbnNUYWJsZShOVUxMKSwKK2R1cGxpY2F0b3JzKE5VTEwpLAorbWF4RXhwYW5zaW9uUHJlZml4U2l6ZSgwKSwKK3dvcmRTb3J0KEZBTFNFKSwKK2ZyZW5jaFNlY29uZGFyeShGQUxTRSksCit1cHBlckZpcnN0KEZBTFNFKSwKK3NvcnRrZXlzKE5VTEwpLAorc29ydGtleU9mZnNldCgwKQoreworICBtZW1zZXQoVUIsIDAsIHNpemVvZihVQikpOworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBVQ09MX09GRjsgaSsrKSB7CisgICAgVUJbaV0gPSAmZW1wdHk7CisgIH0KKyAgaW5pdCgpOworfQorCitTb3J0ZWRMaW5lczo6flNvcnRlZExpbmVzKCkKK3sKKyAgZGVsZXRlW10gbGluZXM7CisgIGlmKHNvcnRrZXlzKSB7CisgICAgZGVsZXRlW10gc29ydGtleXM7CisgIH0KKyAgaWYodG9Tb3J0KSB7CisgICAgZGVsZXRlW10gdG9Tb3J0OworICB9CisgIGlmKGNvbnRyYWN0aW9uc1RhYmxlKSB7CisgICAgZGVsZXRlIGNvbnRyYWN0aW9uc1RhYmxlOworICB9CisgIGlmKGR1cGxpY2F0b3JzKSB7CisgICAgZGVsZXRlIGR1cGxpY2F0b3JzOworICB9Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpnZXRCb3VuZHMoVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIC8vIGZpcnN0IHNvcnQgdGhyb3VnaCB0aGUgc2V0CisgIGRlYnVnLT5sb2codG9TdHJpbmcoKSwgVFJVRSk7CisgIGludDMyX3QgaSA9IDAsIGogPSAwOworICBVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGggPSBVQ09MX09GRjsKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYodG9Tb3J0W2ldLT5zdHJlbmd0aEZyb21FbXB0eSA8IHN0cmVuZ3RoKSB7CisgICAgICBpZihpICYmIHN0cmVuZ3RoIDwgVUNPTF9PRkYpIHsKKyAgICAgICAgLy91X3N0cmNweShVQltzdHJlbmd0aF0sIHRvU29ydFtpLTFdLT5uYW1lKTsKKyAgICAgICAgaiA9IDE7CisgICAgICAgIHdoaWxlKGV4Y2x1ZGVCb3VuZHMuY29udGFpbnMoVW5pY29kZVN0cmluZyh0b1NvcnRbaS1qXS0+bmFtZSwgdG9Tb3J0W2ktal0tPmxlbikpKSB7CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIFVCW3N0cmVuZ3RoXSA9IHRvU29ydFtpLWpdOworICAgICAgfQorICAgICAgc3RyZW5ndGggPSB0b1NvcnRbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5OworICAgICAgaWYoc3RyZW5ndGggPT0gVUNPTF9QUklNQVJZKSB7CisgICAgICAgIHByb2JlLlNFID0gdG9Tb3J0W2ldLT5uYW1lWzBdOworICAgICAgfQorICAgIH0KKyAgfQorICAvL3Vfc3RyY3B5KFVCW3N0cmVuZ3RoXSwgdG9Tb3J0W3NpemUtMV0tPm5hbWUpOworICAvLyBhIGRpZmZlcmVudCBzb2x1dGlvbiBmb3IgYm91bmRzOiBnbyBmcm9tIGVuZCBhbmQgc2VlIGlmIHRoZSBndXlzIG9uIHRoZSB0b3AKKyAgLy8gY2F1c2UgZHVwbGljYXRpb24gZm9yIHRoaW5ncworICBVQ2hhciBkdXBjaFtdID0geyAweDAwMjAsIDB4MDAzMCwgMHgwMDQyLCAweDAwNTEsIDB4MDA2MiwgMHgwMDcxLCAweDAzOTEsIDB4MDM5NiwgMHgwM2IxLCAweDAzYjYgfTsKKyAgaiA9IDE7CisgIExpbmUgZHVwOworICBMaW5lIGJvdW5kOworICBpbnQzMl90IGR1cHMgPSAwOworICB3aGlsZShqIDwgc2l6ZSkgeworICAgIGR1cHMgPSAwOworICAgIGZvcihpID0gMDsgaSA8IHNpemVvZihkdXBjaCkvc2l6ZW9mKGR1cGNoWzBdKTsgaSsrKSB7CisgICAgICBkdXAuc2V0VG8oZHVwY2hbaV0pOworICAgICAgZHVwLmFwcGVuZChkdXBjaFtpXSk7CisgICAgICBib3VuZC5zZXRUbyhkdXBjaFtpXSk7CisgICAgICBib3VuZC5hcHBlbmQodG9Tb3J0W3NpemUtal0tPm5hbWUsIHRvU29ydFtzaXplLWpdLT5sZW4pOworICAgICAgaWYocHJvYmUuZ2V0U3RyZW5ndGgoZHVwLCBib3VuZCkgPj0gVUNPTF9JREVOVElDQUwpIHsKKyAgICAgICAgZHVwcysrOworICAgICAgfQorICAgIH0KKyAgICBpZihkdXBzID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBpZighZHVwbGljYXRvcnMpIHsKKyAgICAgICAgZHVwbGljYXRvcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICB9CisgICAgICBkdXBsaWNhdG9ycy0+cHV0KFVuaWNvZGVTdHJpbmcodG9Tb3J0W3NpemUtal0tPm5hbWUsIHRvU29ydFtzaXplLWpdLT5sZW4pLCAmdG9Tb3J0W3NpemUtal0sIHN0YXR1cyk7CisgICAgICBkZWJ1Zy0+bG9nKHRvU29ydFtzaXplLWpdLT50b1N0cmluZygpKTsKKyAgICAgIGRlYnVnLT5sb2coIiBpcyBub3QgZ29vZCBlbm91Z2ggdG8gYmUgYW4gdXBwZXIgYm91bmRcbiIpOworICAgICAgaisrOworICAgIH0KKyAgfQorICBpZihqID09IHNpemUpIHsKKyAgICBkZWJ1Zy0+bG9nKCJPaSEgSSdtIGhhbGx1Y2luYXRpbmcuIFdpbGwgdXNlIHRoZSBmaXJzdCB1cHBlciBib3VuZCIpOworICAgIGRlbGV0ZSBkdXBsaWNhdG9yczsKKyAgICBkdXBsaWNhdG9ycyA9IE5VTEw7CisgICAgaiA9IDE7CisgIH0KKy8qCisgIGogPSAxOworICB3aGlsZShleGNsdWRlQm91bmRzLmNvbnRhaW5zKFVuaWNvZGVTdHJpbmcodG9Tb3J0W3NpemUtal0tPm5hbWUsIHRvU29ydFtzaXplLWpdLT5sZW4pKSkgeworICAgIGorKzsKKyAgfQorKi8KKyAgVUJbc3RyZW5ndGhdID0gdG9Tb3J0W3NpemUtal07CisgIGZvcihpID0gMDsgaSA8IFVDT0xfT0ZGOyBpKyspIHsKKyAgICBpZihVQltpXSkgeworICAgICAgLy9kZWJ1Zy0+bG9nKFVCW2ldLCBUUlVFKTsKKyAgICAgIGRlYnVnLT5sb2coVUJbaV0tPnRvU3RyaW5nKFRSVUUpLCBUUlVFKTsKKyAgICB9CisgIH0KK30KKworLy8gY2xhc3NpZmllcyByZXBlcnRvaXJlIGFjY29yZGluZyB0byB0aGUgc3RyZW5ndGggb2YgdGhlaXIgZGlmZmVyZW5jZQorLy8gZnJvbSB0aGUgZW1wdHkgc3RyaW5nCit2b2lkCitTb3J0ZWRMaW5lczo6Y2xhc3NpZnlSZXBlcnRvaXJlKCkgeworICBVQ29sQXR0cmlidXRlVmFsdWUgc3Ryb25nZXN0U3RyZW5ndGhGcm9tRW1wdHkgPSBVQ09MX09GRjsKKyAgaW50MzJfdCBsYXN0Q2hhbmdlID0gMDsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDA7CisgIHdoaWxlKGkgPCBzaXplKSAvLyAmJiBwcm9iZS5kaXN0YW5jZUZyb21FbXB0eVN0cmluZygqdG9Tb3J0W2ldKSA+IFVDT0xfUFJJTUFSWSkgCisgIHsKKyAgICB0b1NvcnRbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID0gcHJvYmUuZGlzdGFuY2VGcm9tRW1wdHlTdHJpbmcoKnRvU29ydFtpXSk7CisgICAgaWYodG9Tb3J0W2ldLT5zdHJlbmd0aEZyb21FbXB0eSA8IHN0cm9uZ2VzdFN0cmVuZ3RoRnJvbUVtcHR5KSB7CisgICAgICBzdHJvbmdlc3RTdHJlbmd0aEZyb21FbXB0eSA9IHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHk7CisgICAgICBsYXN0Q2hhbmdlID0gaTsKKyAgICB9IGVsc2UgaWYgKHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHkgPiBzdHJvbmdlc3RTdHJlbmd0aEZyb21FbXB0eSkgeyAKKyAgICAgIC8vIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiBkZXRlY3Rpb24uIE1vc3QgcHJvYmFibHkgYSBxdWF0ZXJuYXJ5LgorICAgICAgLy8gd2h5IGRvbid0IHdlIHRyeSB0byBpbnRlcnBvbGF0ZQorICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIG5leHRTdHJlbmd0aCA9IFVDT0xfT0ZGOworICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHByZXZTdHJlbmd0aCA9IFVDT0xfT0ZGOworICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0ID0gVUNPTF9PRkY7CisKKyAgICAgIGxvZ2dlci0+bG9nKCJJbnRlcnBvbGF0aW5nIHRvIGdldCB0aGUgZGlzdGFuY2UgZnJvbSBlbXB0eSBmb3IgTGluZSAiKTsKKyAgICAgIGxvZ2dlci0+bG9nKHRvU29ydFtpXS0+dG9TdHJpbmcoVFJVRSksIFRSVUUpOworCisgICAgICBpZihpKSB7CisgICAgICAgIHN0ID0gcHJvYmUuZ2V0U3RyZW5ndGgoKnRvU29ydFtpLTFdLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgaWYoc3QgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBsb2dnZXItPmxvZygiQ2Fubm90IGRlZHVjZSBkaXN0YW5jZSBmcm9tIGVtcHR5IHVzaW5nIHByZXZpb3VzIGVsZW1lbnQuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nISBMaW5lOiIpOworICAgICAgICAgIGxvZ2dlci0+bG9nKHRvU29ydFtpXS0+dG9TdHJpbmcoVFJVRSksIFRSVUUpOworICAgICAgICB9IGVsc2UgaWYoc3QgPT0gVUNPTF9JREVOVElDQUwgfHwgc3QgPj0gdG9Tb3J0W2ktMV0tPnN0cmVuZ3RoRnJvbUVtcHR5KSB7CisgICAgICAgICAgcHJldlN0cmVuZ3RoICA9IHRvU29ydFtpLTFdLT5zdHJlbmd0aEZyb21FbXB0eTsKKyAgICAgICAgfSBlbHNlIGlmKHN0IDwgdG9Tb3J0W2ktMV0tPnN0cmVuZ3RoRnJvbUVtcHR5KSB7IAorICAgICAgICAgIHByZXZTdHJlbmd0aCA9IHN0OworICAgICAgICB9CisgICAgICAgIHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHkgPSBwcmV2U3RyZW5ndGg7CisgICAgICB9CisgICAgICBpZihpIDwgc2l6ZS0yKSB7CisgICAgICAgIHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eSA9IHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKCp0b1NvcnRbaSsxXSk7CisgICAgICAgIHN0ID0gcHJvYmUuZ2V0U3RyZW5ndGgoKnRvU29ydFtpKzFdLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgaWYoc3QgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBsb2dnZXItPmxvZygiQ2Fubm90IGRlZHVjZSBkaXN0YW5jZSBmcm9tIGVtcHR5IHVzaW5nIG5leHQgZWxlbWVudC4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmchIExpbmU6Iik7CisgICAgICAgICAgbG9nZ2VyLT5sb2codG9Tb3J0W2ldLT50b1N0cmluZyhUUlVFKSwgVFJVRSk7CisgICAgICAgIH0gZWxzZSBpZihzdCA9PSBVQ09MX0lERU5USUNBTCB8fCBzdCA8IHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eSkgeworICAgICAgICAgIG5leHRTdHJlbmd0aCA9IHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eTsKKyAgICAgICAgfSBlbHNlIGlmKHN0ID49IHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eSkgeyAKKyAgICAgICAgICBuZXh0U3RyZW5ndGggPSBzdDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGlmKGkpIHsKKyAgICAgICAgICBpZihwcmV2U3RyZW5ndGggIT0gbmV4dFN0cmVuZ3RoKSB7CisgICAgICAgICAgICBsb2dnZXItPmxvZygiSW5jb25zaXN0ZW50IHJlc3VsdHMgZnJvbSBpbnRlcnBvbGF0aW9uISBSZXN1bHRzIHdpbGwgbW9zdCBsaWtlbHkgYmUgd3JvbmdcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b1NvcnRbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID0gbmV4dFN0cmVuZ3RoOworICAgICAgfQorICAgICAgLyoKKyAgICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBwcm9ibGVtU3RyZW5ndGggPSBVQ09MX1BSSU1BUlk7CisgICAgICBmb3IoaiA9IGxhc3RDaGFuZ2U7IGogPCBpIDsgaisrKSB7CisgICAgICAgIGlmKHRvU29ydFtqXS0+c3RyZW5ndGggPiBwcm9ibGVtU3RyZW5ndGgpIHsKKyAgICAgICAgICBwcm9ibGVtU3RyZW5ndGggPSB0b1NvcnRbal0tPnN0cmVuZ3RoOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IoaiA9IGxhc3RDaGFuZ2U7IGogPCBpIDsgaisrKSB7CisgICAgICAgIHRvU29ydFtqXS0+c3RyZW5ndGhGcm9tRW1wdHkgPSBwcm9ibGVtU3RyZW5ndGg7CisgICAgICB9CisgICAgICBzdHJvbmdlc3RTdHJlbmd0aEZyb21FbXB0eSA9IHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHk7CisgICAgICBsYXN0Q2hhbmdlID0gaTsKKyAgICAgIGRlYnVnLT5sb2coIlByb2JsZW0gZGV0ZWN0ZWQgaW4gZGlzdGFuY2VzIGZyb20gZW1wdHkuIE1vc3QgcHJvYmFibHkgd29yZCBzb3J0IGlzIG9uXG4iKTsKKyAgICAgICovCisgICAgICB3b3JkU29ydCA9IFRSVUU7CisgICAgfQorICAgIGkrKzsKKyAgfQorICBkZWJ1Zy0+bG9nKCJEaXN0YW5jZXMgZnJvbSBlbXB0eSBzdHJpbmdcbiIpOworICBkZWJ1Zy0+bG9nKHRvU3RyaW5nRnJvbUVtcHR5KCksIFRSVUUpOworfQorCit2b2lkCitTb3J0ZWRMaW5lczo6YW5hbHlzZShVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgZnJlbmNoU2Vjb25kYXJ5ID0gcHJvYmUuaXNGcmVuY2hTZWNvbmRhcnkoc3RhdHVzKTsKKyAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICBsb2dnZXItPmxvZygiVGVzdCBmb3IgRnJlbmNoIHNlY29uZGFyeSBmYWlsZWQuIEJhaWxpbmcgb3V0IVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGxvZ2dlci0+bG9nKCJGcmVuY2ggc2Vjb25kYXJ5IHZhbHVlIGlzICVpXG4iLCBmcmVuY2hTZWNvbmRhcnksIGZyZW5jaFNlY29uZGFyeSk7CisgIHVwcGVyRmlyc3QgPSBwcm9iZS5pc1VwcGVyRmlyc3Qoc3RhdHVzKTsKKyAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICBsb2dnZXItPmxvZygiVGVzdCBmb3IgdXBwZXIgZmlyc3QgZmFpbGVkLiBCYWlsaW5nIG91dCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICBsb2dnZXItPmxvZygidXBwZXIgZmlyc3QgdmFsdWUgaXMgJWlcbiIsIHVwcGVyRmlyc3QsIHVwcGVyRmlyc3QpOworICBzb3J0KFRSVUUsIFRSVUUpOworICBjbGFzc2lmeVJlcGVydG9pcmUoKTsKKyAgZ2V0Qm91bmRzKHN0YXR1cyk7CisgIC8vc29ydChUUlVFLCBUUlVFKTsKKyAgYWRkQ29udHJhY3Rpb25zVG9SZXBlcnRvaXJlKHN0YXR1cyk7CisgIC8vc29ydChUUlVFLCBUUlVFKTsKKyAgZGVidWctPmxvZygiXG4qKiogT3JkZXIgYWZ0ZXIgZGV0ZWN0aW5nIGNvbnRyYWN0aW9uc1xuXG4iKTsKKyAgY2FsY3VsYXRlU29ydEtleXMoKTsKKyAgZGVidWctPmxvZyh0b1ByZXR0eVN0cmluZyhGQUxTRSwgVFJVRSksIFRSVUUpOworICBkZXRlY3RFeHBhbnNpb25zKCk7Cit9CisKK3ZvaWQgU29ydGVkTGluZXM6OmluaXQoKSAKK3sKKyAgc2l6ZSA9IHJlcGVydG9pcmUuc2l6ZSgpOworICBjYXBhY2l0eSA9IDUqc2l6ZTsKKyAgbGluZXMgPSBuZXcgTGluZVtjYXBhY2l0eV07CisgIGluaXQocmVwZXJ0b2lyZSwgbGluZXMpOworfQorCit2b2lkIFNvcnRlZExpbmVzOjppbml0KFVuaWNvZGVTZXQgJnJlcCwgTGluZSAqbGluKQoreworCisgIFVuaWNvZGVTZXRJdGVyYXRvciBleGVtcGxhclVTZXRJdGVyKHJlcCk7CisgIGludDMyX3Qgc2l6ZSA9IDA7CisKKyAgd2hpbGUoZXhlbXBsYXJVU2V0SXRlci5uZXh0KCkpIHsKKyAgICBMaW5lICpjdXJyTGluZSA9IGxpbitzaXplOworICAgIGlmKGV4ZW1wbGFyVVNldEl0ZXIuaXNTdHJpbmcoKSkgeyAvLyBwcm9jZXNzIGEgc3RyaW5nCisgICAgICBjdXJyTGluZS0+c2V0VG8oZXhlbXBsYXJVU2V0SXRlci5nZXRTdHJpbmcoKSk7CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBjdXJyTGluZS0+c2V0VG8oZXhlbXBsYXJVU2V0SXRlci5nZXRDb2RlcG9pbnQoKSk7CisgICAgfQorICAgIGN1cnJMaW5lLT5uYW1lW2N1cnJMaW5lLT5sZW5dID0gMDsgLy8gemVybyB0ZXJtaW5hdGUsIGZvciBvdXIgZXZpbCB3YXlzCisgICAgLy9jdXJyTGluZS0+aW5kZXggPSBzaXplOworICAgIHNpemUrKzsKKyAgfQorfQorCit2b2lkIAorU29ydGVkTGluZXM6OnNldFNvcnRpbmdBcnJheShMaW5lICoqc29ydGluZ0FycmF5LCBMaW5lICplbGVtZW50cywgaW50MzJfdCBzaXplVG9Tb3J0KSB7CisgIGludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IHNpemVUb1NvcnQ7IGkrKykgeworICAgIHNvcnRpbmdBcnJheVtpXSA9ICZlbGVtZW50c1tpXTsKKyAgfQorfQorCitpbnQzMl90CitTb3J0ZWRMaW5lczo6c2V0U29ydGluZ0FycmF5KExpbmUgKipzb3J0aW5nQXJyYXksIEhhc2h0YWJsZSAqdGFibGUpIHsKKyAgaW50MzJfdCBzaXplID0gdGFibGUtPmNvdW50KCk7CisgIGludDMyX3QgaGFzaEluZGV4ID0gLTE7CisgIGNvbnN0IFVIYXNoRWxlbWVudCAqaGFzaEVsZW1lbnQgPSBOVUxMOworICBpbnQzMl90IGNvdW50ID0gMDsKKyAgd2hpbGUoKGhhc2hFbGVtZW50ID0gdGFibGUtPm5leHRFbGVtZW50KGhhc2hJbmRleCkpICE9IE5VTEwpIHsKKyAgICBzb3J0aW5nQXJyYXlbY291bnQrK10gPSAoTGluZSAqKWhhc2hFbGVtZW50LT52YWx1ZS5wb2ludGVyOworICB9CisgIHJldHVybiBzaXplOworfQorCit2b2lkCitTb3J0ZWRMaW5lczo6c29ydChMaW5lICoqc29ydGluZ0FycmF5LCBpbnQzMl90IHNpemVUb1NvcnQsIFVCb29sIHNldFN0cmVuZ3RocywgVUJvb2wgbGluaykgeworICBpbnQzMl90IGkgPSAwOworICBpbnQzMl90IGVxdWFsU3RhcnQgPSAwOworICBVQ29sQXR0cmlidXRlVmFsdWUgZXF1YWxTdHJlbmd0aCA9IFVDT0xfT0ZGOworCisgIHFzb3J0KHNvcnRpbmdBcnJheSwgc2l6ZVRvU29ydCwgc2l6ZW9mKExpbmUgKiksIHByb2JlLmNvbXBhcmVyKTsKKworICBpZihzZXRTdHJlbmd0aHMpIHsgLy8gYW5hbHl6ZSBzdHJlbmd0aHMKKyAgICBmb3IoaSA9IDE7IGkgPCBzaXplVG9Tb3J0OyBpKyspIHsKKyAgICAgIHNvcnRpbmdBcnJheVtpXS0+c3RyZW5ndGggPSBwcm9iZS5nZXRTdHJlbmd0aCgqc29ydGluZ0FycmF5W2ktMV0sICpzb3J0aW5nQXJyYXlbaV0pOworICAgIH0KKyAgICAvLyBmb3IgZXF1YWwgZ3V5cywgZG8gdGhlIGNvZGUgcG9pbnQgb3JkZXJpbmcKKyAgICAKKyAgICBpID0gMTsKKyAgICB3aGlsZShpIDwgc2l6ZVRvU29ydCkgCisgICAgeworICAgICAgaWYoc29ydGluZ0FycmF5W2ldLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICBlcXVhbFN0YXJ0ID0gaSAtIDE7CisgICAgICAgIGVxdWFsU3RyZW5ndGggPSBzb3J0aW5nQXJyYXlbZXF1YWxTdGFydF0tPnN0cmVuZ3RoOworICAgICAgICBzb3J0aW5nQXJyYXlbZXF1YWxTdGFydF0tPnN0cmVuZ3RoID0gVUNPTF9JREVOVElDQUw7CisgICAgICAgIHdoaWxlKGkgPCBzaXplVG9Tb3J0ICYmIHNvcnRpbmdBcnJheVtpXS0+c3RyZW5ndGggPT0gVUNPTF9JREVOVElDQUwpIHsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcXNvcnQoc29ydGluZ0FycmF5K2VxdWFsU3RhcnQsIGktZXF1YWxTdGFydCwgc2l6ZW9mKExpbmUgKiksIGNvZGVQb2ludENtcCk7CisgICAgICAgIHNvcnRpbmdBcnJheVtlcXVhbFN0YXJ0XS0+c3RyZW5ndGggPSBlcXVhbFN0cmVuZ3RoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorCisKKworICBpZihsaW5rKSB7IC8vIGRvIHRoZSBsaW5raW5nCisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZVRvU29ydCAtIDE7IGkrKykgeworICAgICAgTGluZSAqY3VyciA9ICooc29ydGluZ0FycmF5K2kpOworICAgICAgY3Vyci0+bmV4dCA9ICooc29ydGluZ0FycmF5K2krMSk7CisgICAgICAoKihzb3J0aW5nQXJyYXkraSsxKSktPnByZXZpb3VzID0gY3VycjsKKyAgICB9CisgIH0KK30KKwordm9pZAorU29ydGVkTGluZXM6OnNvcnQoVUJvb2wgc2V0U3RyZW5ndGhzLCBVQm9vbCBsaW5rKSB7CisgIGlmKHRvU29ydENhcGFjaXR5IDwgc2l6ZSB8fCAhdG9Tb3J0KSB7CisgICAgaWYodG9Tb3J0KSB7CisgICAgICBkZWxldGVbXSB0b1NvcnQ7CisgICAgfQorICAgIHRvU29ydCA9IG5ldyBMaW5lKltzaXplKjJdOworICAgIHRvU29ydENhcGFjaXR5ID0gc2l6ZSoyOworICB9CisKKyAgc2V0U29ydGluZ0FycmF5KHRvU29ydCwgbGluZXMsIHNpemUpOworICBzb3J0KHRvU29ydCwgc2l6ZSwgc2V0U3RyZW5ndGhzLCBsaW5rKTsKKworICBmaXJzdCA9IGxhc3QgPSBOVUxMOworCisgIGlmKGxpbmspIHsgLy8gZG8gdGhlIGxpbmtpbmcKKyAgICBmaXJzdCA9ICp0b1NvcnQ7CisgICAgbGFzdCA9ICoodG9Tb3J0K3NpemUtMSk7CisgIH0KK30KKwordm9pZAorU29ydGVkTGluZXM6OnVwZGF0ZUJvdW5kcyhVbmljb2RlU2V0ICZzZXQpIHsKKyAgTGluZSBsaW5lOworICBVbmljb2RlU3RyaW5nIHMxOworICBVbmljb2RlU2V0SXRlcmF0b3IgaXQxKHNldCk7IAorICB3aGlsZShpdDEubmV4dCgpKSB7CisgICAgaWYoIWRlYnVnLT5pc09uKCkpIHsKKyAgICAgIGxvZ2dlci0+bG9nKCIuIik7CisgICAgfQorICAgIGlmKGl0MS5pc1N0cmluZygpKSB7IC8vIHByb2Nlc3MgYSBzdHJpbmcKKyAgICAgIHMxLnNldFRvKGl0MS5nZXRTdHJpbmcoKSk7CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBzMS5zZXRUbyhpdDEuZ2V0Q29kZXBvaW50KCkpOworICAgIH0KKyAgICAvL2xpbmUuc2V0VG8oczEpOworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCA9IHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKHMxKTsKKyAgICBpZihwcm9iZS5jb21wYXJlKFVuaWNvZGVTdHJpbmcoVUJbc3RyZW5ndGhdLT5uYW1lKSwgczEpIDwgMCkgeworICAgICAgLy8gVE9ETzogbGVhayBoZXJlIC0gZml4aXQhCisgICAgICBVQltzdHJlbmd0aF0gPSBuZXcgTGluZShzMSk7CisgICAgICAvL3Vfc3RyY3B5KFVCW3N0cmVuZ3RoXSwgczEuZ2V0VGVybWluYXRlZEJ1ZmZlcigpKTsKKyAgICB9CisgIH0KKworCisKK30KKwordm9pZCBTb3J0ZWRMaW5lczo6YWRkQWxsKExpbmUqIHRvQWRkLCBpbnQzMl90IHRvQWRkU2l6ZSkgCit7CisgIGlmKHNpemUrdG9BZGRTaXplID4gY2FwYWNpdHkpIHsKKyAgICBpbnQzMl90IGRvR3Jvd2luZ0JyZWFrcG9pbnQgPSAwOworICAgIC8vIHdlIG5lZWQgdG8gZG8gZ3Jvd2luZyBoZXJlCisgIH0KKyAgaW50MzJfdCBpID0gMDsKKworICBmb3IoaSA9IDA7IGkgPCB0b0FkZFNpemU7IGkrKykgeworICAgIGxpbmVzW3NpemUraV0gPSB0b0FkZFtpXTsKKyAgfQorICBzaXplICs9IHRvQWRkU2l6ZTsKK30KKwordm9pZCBTb3J0ZWRMaW5lczo6c2V0RGlzdGFuY2VzRnJvbUVtcHR5KExpbmUqIGFycmF5LCBpbnQzMl90IGFycmF5U2l6ZSkKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgYXJyYXlTaXplOyBpKyspIHsKKyAgICBhcnJheVtpXS5zdHJlbmd0aEZyb21FbXB0eSA9IHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGFycmF5W2ldKTsKKyAgfQorfQorCisKKy8vIGFkZHMgY29udHJhY3Rpb25zIGluIHRvIHJlcGVydG9pcmUKK2ludDMyX3QgU29ydGVkTGluZXM6OmFkZENvbnRyYWN0aW9uc1RvUmVwZXJ0b2lyZShVRXJyb3JDb2RlICZzdGF0dXMpIAoreworICBsb2dnZXItPmxvZygiXG4qKiogRGV0ZWN0aW5nIGNvbnRyYWN0aW9uc1xuXG4iKTsKKyAgY29udHJhY3Rpb25zVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7CisgIGludDMyX3Qgbm9Db250cyA9IDA7CisgIGludDMyX3QgYWxsb2NhdGVTaXplID0gNTAqc2l6ZTsKKyAgLy8gZmlyc3QgY2hlY2sgZm9yIHNpbXBsZSBjb250cmFjdGlvbnMKKyAgTGluZSogZGVsdGEgPSBuZXcgTGluZVthbGxvY2F0ZVNpemVdOworICBMaW5lKiogZGVsdGFTb3J0ZWQgPSBuZXcgTGluZSpbYWxsb2NhdGVTaXplXTsKKyAgTGluZSogbGVzc2VyVG9BZGRUbyA9IG5ldyBMaW5lW2FsbG9jYXRlU2l6ZV07CisgIExpbmUqIG5ld0RlbHRhID0gbmV3IExpbmVbYWxsb2NhdGVTaXplXTsKKyAgTGluZSoqIG5ld0RlbHRhU29ydGVkID0gbmV3IExpbmUqW2FsbG9jYXRlU2l6ZV07CisgIExpbmUqIGRlbHRhUCA9IGRlbHRhOyAKKyAgTGluZSoqIGRlbHRhUFAgPSBkZWx0YVNvcnRlZDsKKyAgTGluZSogbmV3RGVsdGFQID0gbmV3RGVsdGE7CisgIGludDMyX3QgZGVsdGFTaXplID0gMCwgbGVzc2VyVG9BZGRUb1NpemUgPSAwLCBuZXdEZWx0YVNpemUgPSAwOworICBsb2dnZXItPmxvZygiKysgQ29udHJhY3Rpb24gZGV0ZWN0aW9uIGdlbmVyYXRpb24gMFxuIik7CisgIG5vQ29udHMgPSBkZXRlY3RDb250cmFjdGlvbnModG9Tb3J0LCBzaXplLCB0b1NvcnQsIHNpemUsIAorCQkJICAgICAgIGRlbHRhLCBkZWx0YVNpemUsIGxlc3NlclRvQWRkVG8sIGxlc3NlclRvQWRkVG9TaXplLCAzKnNpemUsIHN0YXR1cyk7CisgIHNldFNvcnRpbmdBcnJheShkZWx0YVNvcnRlZCwgZGVsdGEsIGRlbHRhU2l6ZSk7CisgIHNvcnQoZGVsdGFTb3J0ZWQsIGRlbHRhU2l6ZSwgVFJVRSk7CisKKyAgc2V0RGlzdGFuY2VzRnJvbUVtcHR5KGRlbHRhLCBkZWx0YVNpemUpOworICBpbnQzMl90IGRlbHRhUFNpemUgPSBkZWx0YVNpemU7CisgIC8vdXBkYXRlQm91bmRzKGRlbHRhKTsKKworICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAvLyBpZiB3ZSBmb3VuZCBhbnksIHdlIGhhdmUgdG8gdHJ5IG11bHRpcGxlIGNvbnRyYWN0aW9ucworICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIHByZXZlbnQgdGhlIGNvbnRyYWN0aW9ucyBleHBsb3Npb24KKyAgLy8gaWYgdGhlIG51bWJlciBvZiBzaW1wbGUgY29udHJhY3Rpb25zIGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgLy8gc3RhcnRpbmcgc2l6ZSwgY2hhbmNlcyBhcmUgdGhhdCB3ZSBlaXRoZXIgaGF2ZSBhbiBhbGdvcml0aG1pYworICAvLyBjb250cmFjdGlvbiAobGlrZSBpdGVyYXRpb24gbWFya3Mgb24gdzJrKSBvciBzb21ldGhpbmcKKyAgLy8gaXMgc2VyaW9zbHkgd3JvbmcuCisgIGlmKGRlbHRhUFNpemUgPCBzaXplLzIpIHsKKyAgICB3aGlsZSAoZGVsdGFQU2l6ZSAmJiBnZW5lcmF0aW9uIDwgMSkgeworICAgICAgZ2VuZXJhdGlvbisrOworICAgICAgbG9nZ2VyLT5sb2coIlxuKysgQ29udHJhY3Rpb24gZGV0ZWN0aW9uIGdlbmVyYXRpb24gJWlcbiIsIGdlbmVyYXRpb24sIGdlbmVyYXRpb24pOworICAgICAgLy8gZmluZCBtb3JlLCBidXQgYXZvaWQgdGVzdGluZyB0aGUgY29tYmluYXRpb25zIHdlIGFscmVhZHkgaGF2ZQorICAgICAgbm9Db250cyArPSBkZXRlY3RDb250cmFjdGlvbnModG9Tb3J0LCBzaXplLCBkZWx0YVBQLCBkZWx0YVBTaXplLAorCQkJCSAgICBuZXdEZWx0YVAsIG5ld0RlbHRhU2l6ZSwgbGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUsIDMqc2l6ZSwgc3RhdHVzKTsKKyAgICAgIG5vQ29udHMgKz0gZGV0ZWN0Q29udHJhY3Rpb25zKGRlbHRhUFAsIGRlbHRhUFNpemUsIHRvU29ydCwgc2l6ZSwgCisJCQkJICAgIG5ld0RlbHRhUCwgbmV3RGVsdGFTaXplLCBsZXNzZXJUb0FkZFRvLCBsZXNzZXJUb0FkZFRvU2l6ZSwgMypzaXplLCBzdGF0dXMpOworICAgICAgY2FsY3VsYXRlU29ydEtleXMoKTsKKworICAgICAgYWRkQWxsKGRlbHRhUCwgZGVsdGFQU2l6ZSk7CisgICAgICBzZXRTb3J0aW5nQXJyYXkodG9Tb3J0LCBsaW5lcywgc2l6ZSk7CisgICAgICBzb3J0KFRSVUUsIFRSVUUpOworICAgICAgc2V0U29ydGluZ0FycmF5KG5ld0RlbHRhU29ydGVkLCBuZXdEZWx0YVAsIG5ld0RlbHRhU2l6ZSk7CisgICAgICBzb3J0KG5ld0RlbHRhU29ydGVkLCBuZXdEZWx0YVNpemUsIFRSVUUpOworCSAgCisgICAgICAvLyBpZiBubyBuZXcgb25lcywgYmFpbAorICAgICAgLy9pZiAobmV3RGVsdGFTaXplID09IDApIGJyZWFrOworCisgICAgICBkZWx0YVBTaXplID0gbmV3RGVsdGFTaXplOworICAgICAgbmV3RGVsdGFTaXplID0gMDsKKyAgICAgIGlmKGRlbHRhUCA9PSBkZWx0YSkgeworICAgICAgICBkZWx0YVAgPSBuZXdEZWx0YTsKKyAgICAgICAgZGVsdGFQUCA9IG5ld0RlbHRhU29ydGVkOworICAgICAgICBuZXdEZWx0YVAgPSBkZWx0YTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlbHRhUCA9IGRlbHRhOworICAgICAgICBkZWx0YVBQID0gZGVsdGFTb3J0ZWQ7CisgICAgICAgIG5ld0RlbHRhUCA9IG5ld0RlbHRhOworICAgICAgfQorICAgICAgc2V0RGlzdGFuY2VzRnJvbUVtcHR5KGRlbHRhUCwgZGVsdGFQU2l6ZSk7CisgICAgfQorICB9CisgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgLy8gYWRkIHN0dWZmIGZyb20gdGhlIGxhc3QgYmF0Y2gKKyAgYWRkQWxsKGRlbHRhUCwgZGVsdGFQU2l6ZSk7CisKKyAgLy8gd2FybmluZzogd2UgZG9uJ3QgYWRkIHRoZSBsZXNzZXIgb25lcyBpbiByZWN1cnNpdmVseSwgc2luY2UgdGhleSB3aWxsCisgIC8vIGluZmluaXRlbHkgbG9vcAorICBzZXREaXN0YW5jZXNGcm9tRW1wdHkobGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUpOworICBhZGRBbGwobGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUpOworICBzZXRTb3J0aW5nQXJyYXkodG9Tb3J0LCBsaW5lcywgc2l6ZSk7CisgIHNvcnQoVFJVRSwgVFJVRSk7CisKKyAgZGVsZXRlW10gZGVsdGFTb3J0ZWQ7CisgIGRlbGV0ZVtdIGRlbHRhOworICBkZWxldGVbXSBsZXNzZXJUb0FkZFRvOworICBkZWxldGVbXSBuZXdEZWx0YVNvcnRlZDsKKyAgZGVsZXRlW10gbmV3RGVsdGE7CisgIHJldHVybiBub0NvbnRzOworfQorCisKK2ludDMyX3QgU29ydGVkTGluZXM6OmRldGVjdENvbnRyYWN0aW9ucyhMaW5lICoqZmlyc3RSZXAsIGludDMyX3QgZmlyc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmUgKipzZWNvbmRSZXAsIGludDMyX3Qgc2Vjb25kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lICp0b0FkZFRvLCBpbnQzMl90ICZ0b0FkZFRvU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZSAqbGVzc2VyVG9BZGRUbywgaW50MzJfdCAmbGVzc2VyVG9BZGRUb1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSwgVUVycm9yQ29kZSAmc3RhdHVzKSAKK3sKKyAgaW50MzJfdCBub0NvbnRzID0gMDsKKyAgaW50IGkgPSAwLCBqID0gMCwgayA9IDA7CisgIExpbmUgbG93ZXIsIHVwcGVyLCB0cmlhbCwgdG9BZGQsIGhlbHBlcjsKKyAgVUNoYXIzMiBmaXJzdFN0YXJ0LCBmaXJzdEVuZCwgc2Vjb25kU3RhcnQ7CisgIFVDaGFyIE5GQ1RyaWFsWzI1Nl07CisgIGludDMyX3QgTkZDVHJpYWxMZW4gPSAwOworICBVQm9vbCB0aGFpOworICBpID0gLTE7CisgIHdoaWxlKGkgPCBmaXJzdFNpemUtMSAmJiBVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgIGkrKzsKKyAgICBpZighZGVidWctPmlzT24oKSkgeworICAgICAgbG9nZ2VyLT5sb2coIlxyVGVzdGluZyAlMDVpLyUwNWkuIEZvdW5kICUwNWkgY29udHMuIiwgaSwgZmlyc3RTaXplLCBub0NvbnRzKTsKKyAgICB9CisgICAgVTE2X0dFVChmaXJzdFJlcFtpXS0+bmFtZSwgMCwgMCwgZmlyc3RSZXBbaV0tPmxlbiwgZmlyc3RTdGFydCk7CisgICAgaWYodXNjcmlwdF9nZXRTY3JpcHQoZmlyc3RTdGFydCwgJnN0YXR1cykgPT0gVVNDUklQVF9IQU4gfHwgZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID4gVUNPTF9QUklNQVJZKSAvL1VDT0xfVEVSVElBUlkpIAorICAgICAgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICBsb3dlciA9ICpmaXJzdFJlcFtpXTsKKyAgICBmb3IoaiA9IDA7IGogPCBzZWNvbmRTaXplOyBqKyspIHsKKyAgICAgIGlmKG5vQ29udHMgPT0gY2FwYWNpdHkpIHsKKyAgICAgICAgcmV0dXJuIG5vQ29udHM7CisgICAgICB9CisgICAgICBVMTZfR0VUKHNlY29uZFJlcFtqXS0+bmFtZSwgMCwgMCwgc2Vjb25kUmVwW2pdLT5sZW4sIHNlY29uZFN0YXJ0KTsKKyAgICAgIGlmKGZpcnN0U3RhcnQgPT0gMHg0MSAmJiBzZWNvbmRTdGFydCA9PSAweDMwOCkgeworICAgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgICAgfQorICAgICAgaWYodXNjcmlwdF9nZXRTY3JpcHQoc2Vjb25kU3RhcnQsICZzdGF0dXMpID09IFVTQ1JJUFRfSEFOKSAvLyB8fCBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5ID4gVUNPTF9URVJUSUFSWSkgCisJeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAJaWYoZHVwbGljYXRvcnMgJiYgZHVwbGljYXRvcnMtPmdldChVbmljb2RlU3RyaW5nKHNlY29uZFJlcFtqXS0+bmFtZSwgc2Vjb25kUmVwW2pdLT5sZW4pKSAhPSBOVUxMKSB7CisgICAgICAgICAgZGVidWctPmxvZygiU2tpcHBpbmcgZHVwbGljYXRvciAiKTsKKyAgICAgICAgICBkZWJ1Zy0+bG9nKHNlY29uZFJlcFtqXS0+dG9TdHJpbmcoKSwgVFJVRSk7CisJCSAgY29udGludWU7CisJCX0KKworICAgICAgaWYoZmlyc3RSZXBbaV0tPm5hbWVbMF0gPT0gMHg2MSAmJiBzZWNvbmRSZXBbal0tPm5hbWVbMF0gPT0gMHgzMDgpIHsKKwkgICAgaW50MzJfdCBwdXRCcmVha3BvaW50aGVyZSA9IDA7CisgICAgICB9CisgICAgICB1cHBlci5zZXRUb0NvbmNhdChmaXJzdFJlcFtpXSwgVUJbVUNPTF9QUklNQVJZXSk7CisgICAgICAvL3VwcGVyLnNldFRvQ29uY2F0KGZpcnN0UmVwW2ldLCBVQltzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5XSk7CisgICAgICB0b0FkZC5zZXRUb0NvbmNhdChmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdKTsgICAgICAgICAgCisgICAgICBVMTZfR0VUKGZpcnN0UmVwW2ldLT5uYW1lLCAwLCBmaXJzdFJlcFtpXS0+bGVuLTEsIGZpcnN0UmVwW2ldLT5sZW4sIGZpcnN0RW5kKTsKKyAgICAgIGlmKCh0aGFpID0gdV9oYXNCaW5hcnlQcm9wZXJ0eShmaXJzdEVuZCwgVUNIQVJfTE9HSUNBTF9PUkRFUl9FWENFUFRJT04pKSkgeworCS8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgbG93ZXIgaXMgc2luZ2xlIHJlb3JkZXJpbmcgY2hhcmFjdGVyCisJLy8gaWYgd2UgZG8gdGhlIGxvd2VyIHRlc3Qgd2l0aG91dCB0YWtpbmcgdGhpcyBpbnRvIGFjY291bnQsCisJLy8gd2UnbGwgY29tcGFyaW5nIHRoZSBzZWNvbmRSZXAgZGlyZWN0bHkgdG8gVGhhaS4gV2UgYWRkIFVCW1VDT0xfUFJJTUFSWV0gdG8KKwkvLyBlbmQgb2YgbG93ZXIgYW5kIGluIHRoZSBtaWRkbGUgb2YgdHJpYWwsIHNvIHdlIHdpbGwgaGF2ZSAKKwkvLyBsb3dlciA9IFRoYWkgKyBVQiwgdHJpYWwgVGhhaSArIFVCICsgeCwgcmVzb2x2aW5nIHRvCisJLy8gVUIgKyBUaGFpIHZzIFVCICsgVGhhaSArIHguCisJLy8gZm9yIHVwcGVyIGJvdW5kLCB3ZSBkbyB0aGUgc2ltaWxhciwgc28gd2UgaGF2ZQorCS8vIHVwcGVyID0gVGhhaSArIFVCICsgVUIsIHRyaWFsID0gVGhhaSArIFVCICsgeCwKKwkvLyByZXNvbHZpbmcgdG8gVUIgKyBUaGFpICsgVUIgdnMgVUIgKyBUaGFpICsgeAorCWlmKHNlY29uZFJlcFtqXS0+Zmlyc3RDQykgeworCSAgVUNoYXIzMiBVQkNoYXI7CisJICBVMTZfR0VUKFVCW1VDT0xfU0VDT05EQVJZXS0+bmFtZSwgMCwgMCwgVUJbVUNPTF9TRUNPTkRBUlldLT5sZW4sIFVCQ2hhcik7CisJICBpZihzZWNvbmRSZXBbal0tPmZpcnN0Q0MgPiB1X2dldENvbWJpbmluZ0NsYXNzKFVCQ2hhcikpIHsKKwkgICAgY29udGludWU7CisJICB9CisJfSAKKwl1cHBlciA9ICpmaXJzdFJlcFtpXTsKKwl1cHBlci5hcHBlbmQoKlVCW1VDT0xfUFJJTUFSWV0pOworCS8vdXBwZXIuYXBwZW5kKCpVQltzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5XSk7CisJdXBwZXIuYXBwZW5kKCpVQltVQ09MX1BSSU1BUlldKTsKKwlsb3dlci5hcHBlbmQoKlVCW1VDT0xfUFJJTUFSWV0pOworCXRyaWFsID0gKmZpcnN0UmVwW2ldOworCXRyaWFsLmFwcGVuZCgqVUJbVUNPTF9QUklNQVJZXSk7CisJdHJpYWwuYXBwZW5kKCpzZWNvbmRSZXBbal0pOworICAgICAgfSBlbHNlIGlmKChmaXJzdFJlcFtpXS0+bGFzdENDID4gc2Vjb25kUmVwW2pdLT5maXJzdENDICYmIHNlY29uZFJlcFtqXS0+Zmlyc3RDQyAmJiAhZnJlbmNoU2Vjb25kYXJ5KSAKKwkJfHwgKGZpcnN0UmVwW2ldLT5maXJzdENDIDwgc2Vjb25kUmVwW2pdLT5sYXN0Q0MgJiYgZmlyc3RSZXBbaV0tPmZpcnN0Q0MgJiYgZnJlbmNoU2Vjb25kYXJ5KSkgeworCS8vIFNraXAgYmVjYXVzZSBub3JtYWxpemF0aW9uIHdpbGwgcmVvcmRlcgorCS8vIHRoZXJlIHdpbGwgYmUgYSBjaGFuY2UgdG8gY2hlY2sgdGhpcyBhZ2Fpbiwgc2luY2UgaWYgd2UKKwkvLyB0cnkgYStiLCB3ZSB3aWxsIGFsc28gdHJ5IGIrYQorCSAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZihmcmVuY2hTZWNvbmRhcnkgJiYgKGZpcnN0UmVwW2ldLT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSAmJiBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5ID4gVUNPTF9QUklNQVJZKSkgeworCSAgICBjb250aW51ZTsKKyAgICAgIH1lbHNlIGlmKGZpcnN0UmVwW2ldLT5sYXN0Q0MgJiYgc2Vjb25kUmVwW2pdLT5maXJzdENDICYmIGZyZW5jaFNlY29uZGFyeSkgeworCSAgICB0cmlhbC5zZXRUb0NvbmNhdChzZWNvbmRSZXBbal0sIGZpcnN0UmVwW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgCXRyaWFsLnNldFRvQ29uY2F0KGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0pOyAgICAgICAgICAKKyAgICAgIH0KKyAgICAgIC8vIE5vdyBsZXQncyBjaGVjayB0aGUgdHJpYWwuIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiB5b3UgY29tYmluZSBjaGFyYWN0ZXJzLCAKKyAgICAgIC8vIHlvdSBjYW4gZW5kIHVwIHdpdGggY29uY2F0ZW5hdGlvbiB0aGF0IGlzIHVua25vd24gZm9yIHRoZSBleGFtaW5lZCBBUEkuCisgICAgICBORkNUcmlhbExlbiA9IHVub3JtX25vcm1hbGl6ZSh0cmlhbC5uYW1lLCB0cmlhbC5sZW4sIFVOT1JNX05GQywgMCwgTkZDVHJpYWwsIDI1NiwgJnN0YXR1cyk7CisgICAgICBpZigodV9zdHJjbXAodHJpYWwubmFtZSwgTkZDVHJpYWwpID09IDApIHx8IHVfc3RyRmluZExhc3QoTkZDVHJpYWwsIE5GQ1RyaWFsTGVuLCBzZWNvbmRSZXBbal0tPm5hbWUsIHNlY29uZFJlcFtqXS0+bGVuKSkgeworCSAgIGlmKHNlY29uZFJlcFtqXS0+c3RyZW5ndGhGcm9tRW1wdHkgPiBVQ09MX1RFUlRJQVJZKSB7CisJICAgICBjb250aW51ZTsKKwkgICB9CisJIH0KKyAgICAgIFVDaGFyMzIgYzsKKyAgICAgIFUxNl9HRVQoTkZDVHJpYWwsIDAsIDAsIE5GQ1RyaWFsTGVuLCBjKTsKKyAgICAgIGhlbHBlci5zZXRUbyhjKTsKKyAgICAgIGlmKHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGhlbHBlcikgPiBVQ09MX1RFUlRJQVJZKSB7CisJICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoTkZDVHJpYWxMZW4gPiAxKSB7CisJICAgIFUxNl9HRVQoTkZDVHJpYWwsIDAsIE5GQ1RyaWFsTGVuLTEsIE5GQ1RyaWFsTGVuLCBjKTsKKwkgICAgaGVscGVyLnNldFRvKGMpOworICAgICAgICBpZihwcm9iZS5kaXN0YW5jZUZyb21FbXB0eVN0cmluZyhoZWxwZXIpID4gVUNPTF9URVJUSUFSWSkgeworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwcm9iZS5jb21wYXJlKGxvd2VyLCB0cmlhbCkgPj0gMCkgeyAvLyBpZiBsb3dlciBpcyBiaWdnZXIgdGhhbiB0cmlhbAorICAgICAgICAvLyB0aGlzIG1pZ2h0IGJlIG9rLCBidXQgSSdtIGhhdmluZyBkb3VidHMuIEhlcmUgaXMgYW4gYWRkaXRpb25hbCBjaGVjazoKKyAgICAgICAgaWYoZmlyc3RSZXBbaV0tPmxlbiA9PSAxIHx8IHNlY29uZFJlcFtqXS0+c3RyZW5ndGhGcm9tRW1wdHkgPT0gVUNPTF9QUklNQVJZKSB7CisgICAgICAgICAgLy8gSSdtIGJhc2ljYWxseSBzYXlpbmcgdGhhdCBJJ2xsIGFkZCB0aGlzIGtpbmQgb2YgY29udHJhY3Rpb24gZm9yIGNhc2VzIHdoZXJlIEkgY29tYmluZQorICAgICAgICAgIC8vIG9uZSBsZXR0ZXIgd2l0aCBhbiBhY2NlbnQgT1Igd2hlbiBJJ20gY29tYmluaW5nIG1vcmUgdGhhbiBvbmUgc3ltYm9sIHdpdGggYSBsZXR0ZXIuCisgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCJMIiwgbGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUsIGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgIH0gCisgICAgICBlbHNlIGlmIChwcm9iZS5jb21wYXJlKHRyaWFsLCB1cHBlcikgPiAwKSB7IC8vIHRyaWFsIGlzIGJpZ2dlciB0aGFuIHVwcGVyPz8KKyAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCJVIiwgdG9BZGRUbywgdG9BZGRUb1NpemUsIGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICB9IAorI2lmIDAKKyAgICAgIGVsc2UgaWYoZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSkKKyAgICAgIHsKKyAgICAgICAgTGluZSBleHBhbnNpb25MaW5lOworICAgICAgICBpZihnZXRFeHBhbnNpb25MaW5lKHRyaWFsLCAqZmlyc3RSZXBbaV0sICpzZWNvbmRSZXBbal0sIGV4cGFuc2lvbkxpbmUpICYmCisgICAgICAgIGV4cGFuc2lvbkxpbmUubGVuICYmICEoZXhwYW5zaW9uTGluZSA9PSAqc2Vjb25kUmVwW2pdKSkgeworICAgICAgICAgIG5vdGVDb250cmFjdGlvbigiRCIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UgaWYoZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSAmJiBwcm9iZS5nZXRTdHJlbmd0aChsb3dlciwgdHJpYWwpIDwgc2Vjb25kUmVwW2pdLT5zdHJlbmd0aEZyb21FbXB0eSkgeworICAgICAgICBub3RlQ29udHJhY3Rpb24oIkQxIiwgdG9BZGRUbywgdG9BZGRUb1NpemUsIGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICB9IAorICAgICAgZWxzZSBpZiAoZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSAmJiBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSkgCisgICAgICB7CisgICAgICAgIC8vIEkgaGF2ZSBhZGRlZCBhbiBhZGRpdGlvbmFsIGNoZWNrLiBUaGUgY2hlY2tzIHZlcnN1cyB1cHBlciBhbmQgbG93ZXIgYm91bmQgc2hvdWxkIGJlIHN1ZmZpY2llbnQKKyAgICAgICAgLy8gd2hlbiB0aGUgcmlnaHQgc2lkZSBpcyBhIGNvbWJpbmluZyBtYXJrLiBUaGVyZSBtaWdodCBiZSBhIHJlb3JkZXJpbmcgb2YgY29tYmluaW5nIG1hcmtzLCBidXQKKyAgICAgICAgLy8gdGhhdCBzaG91bGQgYmUgYWxyZWFkeSB2aXNpYmxlIGluIHRoZWlyIG9yZGVyLgorCS8vIGNvbXBhcmUgdGhlIHNlcXVlbmNlIAorCS8vIFktIDw/IFkgPD8gWSsKKwkvLyBhbmQgCisJLy8gWFktIDw/IFhZIDw/IFhZKworCUxpbmUgeHltLCB4eXAsIHh5OworCVVCb29sIHh5bUlzQ29udHJhY3Rpb24gPSBGQUxTRSwgdG9BZGRJc0NvbnRyYWN0aW9uID0gRkFMU0U7CisgICAgaWYoaikgeworCSAgaWYoKCghc2Vjb25kUmVwW2otMV0tPmZpcnN0Q0MgfHwgZmlyc3RSZXBbaV0tPmxhc3RDQyA8IHNlY29uZFJlcFtqLTFdLT5maXJzdENDKSAmJiAhZnJlbmNoU2Vjb25kYXJ5KSAKKyAgICAgICAgICAgICB8fCgoIWZpcnN0UmVwW2ldLT5maXJzdENDIHx8IGZpcnN0UmVwW2ldLT5maXJzdENDID4gc2Vjb25kUmVwW2otMV0tPmxhc3RDQykgJiYgZnJlbmNoU2Vjb25kYXJ5KSkgeworCSAgICB4eW0uc2V0VG9Db25jYXQoZmlyc3RSZXBbaV0sIHNlY29uZFJlcFtqLTFdKTsKKwkgICAgdG9BZGQuc3RyZW5ndGggPSBwcm9iZS5nZXRTdHJlbmd0aCh4eW0sIHRvQWRkKTsKKwkgICAgaWYoc2Vjb25kUmVwW2pdLT5zdHJlbmd0aCAhPSB0b0FkZC5zdHJlbmd0aCkgeworCSAgICAgIC8vIHRoZXJlIGlzIHBvc3NpYmlsaXR5IHRoYXQgZWl0aGVyIHh5bSBvciB4eSBhcmUgY29udHJhY3Rpb25zCisJICAgICAgLy8gVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zOgorCSAgICAgIC8vIHh5bSA+IHh5IG9yIHh5bSA8biB4eSBhbmQgeW0gPGsgeSBidXQgbiAhPSBrCisJICAgICAgLy8gaWYgdGhleSBhcmUgcmVvcmRlcmVkLCB3ZSBhcmUgZ29pbmcgdG8gc2VlIGlmIGVhY2ggb2YgdGhlbSAKKwkgICAgICAvLyBpcyBmdXJ0aGVyIHJlb3JkZXJlZAorCSAgICAgIGlmKHRvQWRkLnN0cmVuZ3RoID09IFVDT0xfT0ZGKSB7CisJCS8vIGNoZWNrIHdoZXRoZXIgdG9BZGQgc2hpZnRlZCBtb3JlIGRvd24KKwkJayA9IGogLSAyOworCQl3aGlsZShrPj0wICYmIHNlY29uZFJlcFtrXS0+c3RyZW5ndGggPiBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoKSB7CisJCSAgay0tOworCQl9CisJCXdoaWxlKCF0b0FkZElzQ29udHJhY3Rpb24gJiYgaz49MCkgeworCQkgIHh5cC5zZXRUb0NvbmNhdChmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2tdKTsKKwkJICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcoeHlwLm5hbWUsIHh5cC5sZW4pKSAhPSBOVUxMKSB7CisJCSAgICBrLS07CisJCSAgICBjb250aW51ZTsKKwkJICB9CisJCSAgaWYocHJvYmUuY29tcGFyZSh4eXAsIHh5bSkgPj0gMCkgeworCQkgICAgLy8geHlwIGxvb2tzIGxpa2UgYSBjb250cmFjdGlvbgorCQkgICAgbm90ZUNvbnRyYWN0aW9uKCIhMSIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworCQkgICAgdG9BZGRJc0NvbnRyYWN0aW9uID0gVFJVRTsKKwkJICB9IGVsc2UgeworCQkgICAgYnJlYWs7CisJCSAgfQorCQl9CisgICAgICAgICAgLy8gZmlyc3QgbGV0J3Mgc2VlIGlmIHh5bSBoYXMgbW92ZWQgYmV5b25kCisgICAgICAgICAgaWYoY29udHJhY3Rpb25zVGFibGUtPmdldChVbmljb2RlU3RyaW5nKHh5bS5uYW1lLCB4eW0ubGVuKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgayA9IGorMTsKKyAgICAgICAgICAgIC8vIGlnbm9yZSB3ZWFrZXIgc3RyZW5ndGhzCisgICAgICAgICAgICB3aGlsZShrIDwgc2Vjb25kU2l6ZSAmJiBzZWNvbmRSZXBba10tPnN0cmVuZ3RoID4gc2Vjb25kUmVwW2pdLT5zdHJlbmd0aCkgeworICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBza2lwcGVkIHRoZSBmb2xsb3dpbmcgZ3V5CisgICAgICAgICAgICBpZihrIDwgc2Vjb25kU2l6ZSkgeworICAgICAgICAgICAgICB4eXAuc2V0VG9Db25jYXQoZmlyc3RSZXBbaV0sIHNlY29uZFJlcFtrXSk7CisgICAgICAgICAgICAgIGlmKHByb2JlLmNvbXBhcmUoeHlwLCB4eW0pIDw9IDApIHsKKwkgICAgICAgICAgICAvLyB4eXAgbG9va3MgbGlrZSBhIGNvbnRyYWN0aW9uCisJICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhMiIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2otMV0sIG5vQ29udHMsIHN0YXR1cyk7CisJICAgICAgICAgICAgeHltSXNDb250cmFjdGlvbiA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeHltSXNDb250cmFjdGlvbiA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGlmIHRoZXkgaGF2ZSByZW9yZGVyZWQsIGJ1dCBub25lIGhhcyBtb3ZlZCwgdGhlbiB3ZSBhZGQgdGhlbSBib3RoCisgICAgICAgICAgLy8gYW5kIGhvcGUgZm9yIHRoZSBiZXN0CisgICAgICAgICAgaWYoIXh5bUlzQ29udHJhY3Rpb24gJiYgIXRvQWRkSXNDb250cmFjdGlvbikgeworICAgICAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzIGFuIE5GQyB2ZXJzaW9uIHZlcnNpb24gb2Ygb25lIG9mIHRoZSAKKyAgICAgICAgICAgICAgLy8gc3RyaW5ncy4gSWYgd2UgaGF2ZSBYWSA+IFhaLCBidXQgTkZDKFhaKSA9IFcgYW5kIFggPCBXLCB3ZSBtaWdodCBoYXZlCisgICAgICAgICAgICAgIC8vIGhhdmUgYSBmYWxzZSBjb250cmFjdGlvbi4KKyAgICAgICAgICAgICAgdHJpYWwubGVuID0gdW5vcm1fbm9ybWFsaXplKHRvQWRkLm5hbWUsIHRvQWRkLmxlbiwgVU5PUk1fTkZDLCAwLCB0cmlhbC5uYW1lLCAyNSwgJnN0YXR1cyk7CisgICAgICAgICAgICAgIC8vVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoID0gcHJvYmUuZ2V0U3RyZW5ndGgoKmZpcnN0UmVwW2ldLCB0cmlhbCk7CisgICAgICAgICAgICAgIGlmKHRyaWFsID09IHRvQWRkKSB7CisgICAgICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhMyIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2otMV0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhMyIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGVDb250cmFjdGlvbigiITQiLCB0b0FkZFRvLCB0b0FkZFRvU2l6ZSwgZmlyc3RSZXBbaV0sIHNlY29uZFJlcFtqXSwgbm9Db250cywgc3RhdHVzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCSAgICAgIH0gZWxzZSB7IC8vIG9ubHkgdGhlIHN0cmVuZ3RoIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBwcmV2aW91cyBpcyBjb250cmFjdGlvbiBhbmQgaWYgbm90LCBhZGQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgIGlmKGNvbnRyYWN0aW9uc1RhYmxlLT5nZXQoVW5pY29kZVN0cmluZyh4eW0ubmFtZSwgeHltLmxlbikpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhNSIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgIAorCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKHRoYWkpIHsgLy8gcmVzdG9yZSBsb3dlcgorICAgICAgICBsb3dlciA9ICpmaXJzdFJlcFtpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG5vQ29udHM7Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpub3RlQ29udHJhY3Rpb24oY29uc3QgY2hhciogbXNnLCBMaW5lICp0b0FkZFRvLCBpbnQzMl90ICZ0b0FkZFRvU2l6ZSwgTGluZSAqbGVmdCwgTGluZSAqcmlnaHQsIGludDMyX3QgJm5vQ29udHMsIFVFcnJvckNvZGUgJnN0YXR1cykgCit7CisgIExpbmUgdG9BZGQ7CisgIHRvQWRkLnNldFRvQ29uY2F0KGxlZnQsIHJpZ2h0KTsKKyAgdG9BZGQubGVmdCA9IGxlZnQ7CisgIHRvQWRkLnJpZ2h0ID0gcmlnaHQ7CisgIC8vIGlmIHdlJ3JlIGFkZGluZyBhbiBhY2NlbnQgdG8gYW4gZXhpc3RpbmcgY29udHJhY3Rpb24sIHdlIHdhbnQgdG8gY2hlY2sKKyNpZiAwCisgIExpbmUgdGVzdCwgdHJpYWwxLCB0cmlhbDI7CisgIGlmKHJpZ2h0LT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSkgeworICAgIGlmKGxlZnQtPnJpZ2h0ICYmIGxlZnQtPnJpZ2h0LT5wcmV2aW91cyAmJiBsZWZ0LT5yaWdodC0+bmV4dCkgeworICAgICAgdGVzdC5zZXRUb0NvbmNhdChsZWZ0LT5sZWZ0LCBsZWZ0LT5yaWdodC0+cHJldmlvdXMpOworICAgICAgdHJpYWwxLnNldFRvQ29uY2F0KCZ0ZXN0LCByaWdodCk7CisKKyAgICAgIHRlc3Quc2V0VG9Db25jYXQobGVmdC0+bGVmdCwgbGVmdC0+cmlnaHQtPm5leHQpOworICAgICAgdHJpYWwyLnNldFRvQ29uY2F0KCZ0ZXN0LCByaWdodCk7CisgICAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsMSwgdG9BZGQpIDwgMCAmJiBwcm9iZS5jb21wYXJlKHRvQWRkLCB0cmlhbDIpIDwgMCkgeworICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRyYWN0aW9uIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgbmV3bHkgYWRkZWQgYWNjZW50CisgICAgICAgIC8vIHNvIHdoaWxlICdjaCcgaXMgY29udHJhY3Rpb24sICdjaCcrZG90X2Fib3ZlIHNvcnRzIGJldHdlZW4gJ2NnJytkb3RfYWJvdmUgYW5kICdjaScrZG90X2Fib3ZlCisgICAgICAgIGRlYnVnLT5sb2coIkNvbiAtIik7CisgICAgICAgIGRlYnVnLT5sb2cobXNnKTsKKyAgICAgICAgZGVidWctPmxvZyh0b0FkZC50b1N0cmluZyhGQUxTRSksIFRSVUUpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmKHJpZ2h0LT5wcmV2aW91cyAmJiByaWdodC0+bmV4dCkgeworICAgICAgICB0cmlhbDEuc2V0VG9Db25jYXQobGVmdCwgcmlnaHQtPnByZXZpb3VzKTsKKyAgICAgICAgdHJpYWwyLnNldFRvQ29uY2F0KGxlZnQsIHJpZ2h0LT5uZXh0KTsKKyAgICAgICAgaWYocHJvYmUuY29tcGFyZSh0cmlhbDEsIHRvQWRkKSA8IDAgJiYgcHJvYmUuY29tcGFyZSh0b0FkZCwgdHJpYWwyKSA8IDApIHsKKyAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRyYWN0aW9uIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgbmV3bHkgYWRkZWQgYWNjZW50CisgICAgICAgICAgLy8gc28gd2hpbGUgJ2NoJyBpcyBjb250cmFjdGlvbiwgJ2NoJytkb3RfYWJvdmUgc29ydHMgYmV0d2VlbiAnY2cnK2RvdF9hYm92ZSBhbmQgJ2NpJytkb3RfYWJvdmUKKyAgICAgICAgICBkZWJ1Zy0+bG9nKCJDb24gLSIpOworICAgICAgICAgIGRlYnVnLT5sb2cobXNnKTsKKyAgICAgICAgICBkZWJ1Zy0+bG9nKHRvQWRkLnRvU3RyaW5nKEZBTFNFKSwgVFJVRSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZihsZWZ0LT5wcmV2aW91cyAmJiBsZWZ0LT5uZXh0KSB7CisgICAgICAgIHRyaWFsMS5zZXRUb0NvbmNhdChsZWZ0LT5wcmV2aW91cywgcmlnaHQpOworICAgICAgICB0cmlhbDIuc2V0VG9Db25jYXQobGVmdC0+bmV4dCwgcmlnaHQpOworICAgICAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsMSwgdG9BZGQpIDwgMCAmJiBwcm9iZS5jb21wYXJlKHRvQWRkLCB0cmlhbDIpIDwgMCkgeworICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgY29udHJhY3Rpb24gaGFzIGJlZW4gYnJva2VuIGJ5IHRoZSBuZXdseSBhZGRlZCBhY2NlbnQKKyAgICAgICAgICAvLyBzbyB3aGlsZSAnY2gnIGlzIGNvbnRyYWN0aW9uLCAnY2gnK2RvdF9hYm92ZSBzb3J0cyBiZXR3ZWVuICdjZycrZG90X2Fib3ZlIGFuZCAnY2knK2RvdF9hYm92ZQorICAgICAgICAgIGRlYnVnLT5sb2coIkNvbiAtIik7CisgICAgICAgICAgZGVidWctPmxvZyhtc2cpOworICAgICAgICAgIGRlYnVnLT5sb2codG9BZGQudG9TdHJpbmcoRkFMU0UpLCBUUlVFKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKyAgfQorICBpZihyaWdodC0+cmlnaHQgJiYgcmlnaHQtPnJpZ2h0LT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSAmJiByaWdodC0+bGVmdC0+cHJldmlvdXMgJiYgcmlnaHQtPmxlZnQtPm5leHQpIHsgLy8gbWF5YmUgd2UgYWxyZWFkeSBoYWQgYSBjb250cmFjdGlvbiB3aXRoIGFuIGFjY2VudAorICAgIHRlc3Quc2V0VG9Db25jYXQocmlnaHQtPmxlZnQtPnByZXZpb3VzLCByaWdodC0+cmlnaHQpOworICAgIHRyaWFsMS5zZXRUb0NvbmNhdChsZWZ0LCAmdGVzdCk7CisgICAgdGVzdC5zZXRUb0NvbmNhdChyaWdodC0+bGVmdC0+bmV4dCwgcmlnaHQtPnJpZ2h0KTsKKyAgICB0cmlhbDIuc2V0VG9Db25jYXQobGVmdCwgJnRlc3QpOworICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwxLCB0b0FkZCkgPCAwICYmIHByb2JlLmNvbXBhcmUodG9BZGQsIHRyaWFsMikgPCAwKSB7CisgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRyYWN0aW9uIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgbmV3bHkgYWRkZWQgYWNjZW50CisgICAgICAvLyBzbyB3aGlsZSAnY2gnIGlzIGNvbnRyYWN0aW9uLCAnY2gnK2RvdF9hYm92ZSBzb3J0cyBiZXR3ZWVuICdjZycrZG90X2Fib3ZlIGFuZCAnY2knK2RvdF9hYm92ZQorICAgICAgZGVidWctPmxvZygiQ29uIC0iKTsKKyAgICAgIGRlYnVnLT5sb2cobXNnKTsKKyAgICAgIGRlYnVnLT5sb2codG9BZGQudG9TdHJpbmcoRkFMU0UpLCBUUlVFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcodG9BZGQubmFtZSwgdG9BZGQubGVuKSkgPT0gTlVMTCkgeworICAgIGlmKHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKHRvQWRkKSA8PSBVQ09MX1RFUlRJQVJZKSB7CisgICAgICB0b0FkZFRvW3RvQWRkVG9TaXplKytdID0gdG9BZGQ7CisgICAgICBjb250cmFjdGlvbnNUYWJsZS0+cHV0KFVuaWNvZGVTdHJpbmcodG9BZGQubmFtZSwgdG9BZGQubGVuKSwgJnRvQWRkLCBzdGF0dXMpOworICAgICAgbm9Db250cysrOworICAgICAgZGVidWctPmxvZyhtc2cpOworICAgICAgZGVidWctPmxvZygiIENvbiArICIpOworICAgICAgZGVidWctPmxvZyh0b0FkZC50b1N0cmluZyhGQUxTRSksIFRSVUUpOworCisgICAgICBpZighbGVmdC0+c29ydEtleSkgeworICAgICAgICBjYWxjdWxhdGVTb3J0S2V5KCpsZWZ0KTsKKyAgICAgIH0KKyAgICAgIGRlYnVnLT5sb2cobGVmdC0+ZHVtcFNvcnRrZXkoKSk7CisgICAgICBkZWJ1Zy0+bG9nKCIgKyAiKTsKKworICAgICAgaWYoIXJpZ2h0LT5zb3J0S2V5KSB7CisgICAgICAgIGNhbGN1bGF0ZVNvcnRLZXkoKnJpZ2h0KTsKKyAgICAgIH0KKyAgICAgIGRlYnVnLT5sb2cocmlnaHQtPmR1bXBTb3J0a2V5KCkpOworICAgICAgZGVidWctPmxvZygiID0gIik7CisKKyAgICAgIGNhbGN1bGF0ZVNvcnRLZXkodG9BZGQpOworICAgICAgZGVidWctPmxvZyh0b0FkZC5kdW1wU29ydGtleSgpLCBUUlVFKTsKKyAgICAgIGlmKG5vQ29udHMgPiBzaXplLzIpIHsKKyAgICAgICAgc3RhdHVzID0gVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworVUJvb2wKK1NvcnRlZExpbmVzOjpnZXRFeHBhbnNpb25MaW5lKGNvbnN0IExpbmUgJmV4cGFuc2lvbiwgY29uc3QgTGluZSAmcHJldmlvdXMsIGNvbnN0IExpbmUgJmV4cCwgTGluZSAmZXhwYW5zaW9uTGluZSkgCit7CisgIGludCBleHBJbmRleFNpemUgPSAwOworICBVQ29sQXR0cmlidXRlVmFsdWUgZXhwU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgaW50MzJfdCBjb21wYXJpc29uUmVzdWx0ID0gMDsKKyAgaW50MzJfdCBpID0gMCwgayA9IDAsIHByZXZLID0gMDsKKyAgTGluZSB0cmlhbDsKKyAgVUJvb2wgc2VxdWVuY2VDb21wbGV0ZWQgPSBGQUxTRTsKKyAgaW50MzJfdCBleHBJbmRleGVzWzI1Nl07CisgIGludDMyX3QgZXhwSW5kZXhlc1NpemUgPSAwOworCisgIGlmKCFzZXF1ZW5jZUNvbXBsZXRlZCkgeworICAgIGV4cEluZGV4U2l6ZSA9IDA7CisgICAgZXhwYW5zaW9uTGluZS5jbGVhcigpOworCisgICAgLy8gd2Ugd2lsbCBzdGFydCBmcm9tIHN0cmVuZ3RoIGJldHdlZW4gdGhlIGV4cGFuc2lvbgorICAgIC8vIGFuZCB0aGUgdGFyZ2V0ICh0b1NvcnRbaV0gYW5kIHRvU29ydFtqXS4gRmlyc3Qgd2UKKyAgICAvLyB3aWxsIGFkZCBhcyBtYW55IHByaW1hcmllcyBhcyBwb3NzaWJsZS4gVGhlbiB3ZSB3aWxsCisgICAgLy8gdHJ5IHRvIGFkZCBzZWNvbmRhcnkgcGllY2VzIGFuZCB0aGVuIHRlcnRpYXJ5LiAKKyAgICAvLyBmb3VuZCBhbiBleHBhbnNpb24gLSB3aGF0IGlzIHRoZSBleHBhbmRpbmcgc2VxdWVuY2U/CisgIAorICAgIGV4cFN0cmVuZ3RoID0gVUNPTF9QUklNQVJZOworICAgIHdoaWxlKCFzZXF1ZW5jZUNvbXBsZXRlZCkgeworICAgICAgayA9IDA7CisgICAgICBwcmV2SyA9IDA7CisgICAgICB3aGlsZShrIDwgc2l6ZSkgeworICAgICAgICBpZihleHBhbnNpb25MaW5lLmxlbiA+IDE1KSB7CisgICAgICAgICAgc2VxdWVuY2VDb21wbGV0ZWQgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHdoaWxlKGsgPCBzaXplICYmIHRvU29ydFtrXS0+c3RyZW5ndGggIT0gVUNPTF9QUklNQVJZKSAKKyAgICAgICAgeworICAgICAgICAgIGsrKzsKKyAgICAgICAgfQorICAgICAgICAvLyBub3RoaW5nIGZvdW5kCisgICAgICAgIGlmKGsgPT0gc2l6ZSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBvdmVyIHJlb3JkZXJpbmcgdGhpbmdzLiBJZiB0aGV5IHdlcmUgd29ydGh5LCB0aGV5IHdvdWxkCisgICAgICAgIC8vIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLgorICAgICAgICAvL2lmKGV4cGFuc2lvbkxpbmUubGFzdENDICYmIHRvU29ydFtrXS0+Zmlyc3RDQyAmJiBleHBhbnNpb25MaW5lLmxhc3RDQyA+IHRvU29ydFtrXS0+Zmlyc3RDQykgeworICAgICAgICAgIC8vaysrOworICAgICAgICAgIC8vY29udGludWU7CisgICAgICAgIC8vfQorICAgICAgICB0cmlhbCA9IHByZXZpb3VzOworICAgICAgICB0cmlhbC5hcHBlbmQoZXhwYW5zaW9uTGluZSk7CisgICAgICAgIHRyaWFsLmFwcGVuZCgqdG9Tb3J0W2tdKTsgICAgICAgIAorICAgICAgICBpZih0b1NvcnRba10tPm5hbWVbMF0gPT0gMHgwMDY3KSB7CisgICAgICAgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY29tcGFyaXNvblJlc3VsdCA9IHByb2JlLmNvbXBhcmUodHJpYWwsIGV4cGFuc2lvbik7CisgICAgICAgIGlmKGNvbXBhcmlzb25SZXN1bHQgPT0gMCkgeworICAgICAgICAgIGV4cGFuc2lvbkxpbmUgPSAqdG9Tb3J0W2tdOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb25SZXN1bHQgPiAwKSB7CisgICAgICAgICAgaWYocHJldkspIHsKKyAgICAgICAgICAgIGlmKGV4cCA9PSAqdG9Tb3J0W3ByZXZLXSkgeworICAgICAgICAgICAgICBleHBhbnNpb25MaW5lID0gZXhwOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSBwcmV2SzsKKyAgICAgICAgICAgIHdoaWxlKGkgPCBrLTEpIHsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBpZih0b1NvcnRbaV0tPnN0cmVuZ3RoID4gZXhwLnN0cmVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdHJpYWwgPSBwcmV2aW91czsKKyAgICAgICAgICAgICAgdHJpYWwuYXBwZW5kKGV4cGFuc2lvbkxpbmUpOworICAgICAgICAgICAgICB0cmlhbC5hcHBlbmQoKnRvU29ydFtpXSk7CisgICAgICAgICAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsIGV4cGFuc2lvbikgPiAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlIGdvdCBpbnRvIHNpdHVhdGlvbiB3aGVyZSB3ZSBoYXZlIGNoID4gY2grZG90LWJlbG93CisgICAgICAgICAgICAvLyBob3dldmVyLCBjaCBpcyBhIGNvbnRyYWN0aW9uIGFuZCB0aGVyZWZvcmUgd2UgY2Fubm90IHVzZQorICAgICAgICAgICAgLy8gaXQgcHJvcGVybHkuIElmIHdlIGhhdmUgaGl0IG9uIGEgY29udHJhY3Rpb24sIHdlJ2xsIGp1c3QgdHJ5CisgICAgICAgICAgICAvLyB0byBjb250aW51ZS4gUHJvYmFibHkgbmVlZCBtb3JlIGxvZ2ljIGhlcmUuCisgICAgICAgICAgICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcodHJpYWwubmFtZSwgdHJpYWwubGVuKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICBleHBhbnNpb25MaW5lLmFwcGVuZCgqdG9Tb3J0W2ktMV0pOworICAgICAgICAgICAgICBleHBJbmRleGVzW2V4cEluZGV4U2l6ZSsrXSA9IGktMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrUG9pbnRIZXJlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VxdWVuY2VDb21wbGV0ZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8vYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJldksgPSBrOworICAgICAgICBrKys7CisgICAgICB9CisgICAgICBpZighcHJldksgfHwgayA9PSBzaXplKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZXhwSW5kZXhTaXplID4gMDsKK30KKworaW50MzJfdAorU29ydGVkTGluZXM6Omdvb3NlVXAoaW50MzJfdCByZXNldEluZGV4LCBpbnQzMl90IGV4cGFuc2lvbkluZGV4LCBMaW5lICZleHBMaW5lLCBpbnQzMl90ICpleHBJbmRleGVzLCBpbnQzMl90ICZleHBJbmRleFNpemUsIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCkgCit7CisgIGludDMyX3QgaSA9IGV4cGFuc2lvbkluZGV4LCBrID0gcmVzZXRJbmRleCsxLCBuID0gMCwgbSA9IDAsIHN0YXJ0ID0gMDsKKyAgVUJvb2wgaGF2ZUNoYW5nZXMgPSBGQUxTRTsKKyAgTGluZSB0cmlhbCwgcHJlZml4LCBzdWZmaXg7CisgIC8vIHdlIHdpbGwgZmlyc3QgdHJ5IGdvb3NpbmcgdXAgdGhlIHJlc2V0IGluZGV4CisgIC8vd2hpbGUodG9Tb3J0W2tdLT5zdHJlbmd0aCA+PSBzdHJlbmd0aCkKKyAgZm9yKCA7IHRvU29ydFtrXS0+c3RyZW5ndGggPT0gc3RyZW5ndGg7IGsrKykgCisgIHsKKyAgICAvL2lmKHRvU29ydFtrXS0+c3RyZW5ndGggPiBzdHJlbmd0aCkgeworICAgICAgLy9jb250aW51ZTsKKyAgICAvL30KKyAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRba10sICZleHBMaW5lKTsKKyAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsLCAqdG9Tb3J0W2ldKSA+IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXNldEluZGV4ID0gay0xOworCisgIC8vIGdvb3NlIHVwIGluZGl2aWR1YWwgY2hhcmFjdGVycworICBwcmVmaXggPSAqdG9Tb3J0W3Jlc2V0SW5kZXhdOworICBmb3IobiA9IDA7IG4gPCBleHBJbmRleFNpemU7IG4rKykgeworICAgIHN1ZmZpeC5jbGVhcigpOworICAgIGZvcihtID0gbisxOyBtIDwgZXhwSW5kZXhTaXplOyBtKyspIHsKKyAgICAgIHN1ZmZpeC5hcHBlbmQoKnRvU29ydFtleHBJbmRleGVzW21dXSk7CisgICAgfQorICAgIGsgPSBleHBJbmRleGVzW25dKzE7CisgICAgLy93aGlsZSh0b1NvcnRba10tPnN0cmVuZ3RoID49IHN0cmVuZ3RoKQorICAgIGZvciggOyB0b1NvcnRba10tPnN0cmVuZ3RoID09IHN0cmVuZ3RoOyBrKyspIAorICAgIHsKKyAgICAgIC8vaWYodG9Tb3J0W2tdLT5zdHJlbmd0aCA+IHN0cmVuZ3RoKSB7CisgICAgICAgIC8vY29udGludWU7CisgICAgICAvL30KKyAgICAgIHRyaWFsLnNldFRvQ29uY2F0KCZwcmVmaXgsIHRvU29ydFtrXSk7CisgICAgICB0cmlhbC5hcHBlbmQoc3VmZml4KTsKKyAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsICp0b1NvcnRbaV0pID4gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoayA+IGV4cEluZGV4ZXNbbl0rMSkgeworICAgICAgaGF2ZUNoYW5nZXMgPSBUUlVFOworICAgICAgZXhwSW5kZXhlc1tuXSA9IGstMTsKKyAgICB9CisgICAgcHJlZml4LmFwcGVuZCgqdG9Tb3J0W2V4cEluZGV4ZXNbbl1dKTsKKyAgfQorCisgIC8vIHRyeSBpbnNlcnRpbmcgaW5nb3JhYmxlcworICBVQ29sQXR0cmlidXRlVmFsdWUgbGFzdFN0ciA9IFVDT0xfT0ZGOworICBrID0gMDsKKyAgd2hpbGUodG9Tb3J0W2tdLT5zdHJlbmd0aEZyb21FbXB0eSA+IHN0cmVuZ3RoKSB7CisgICAgaysrOworICB9CisgIGlmKHRvU29ydFtrXS0+c3RyZW5ndGhGcm9tRW1wdHkgPT0gc3RyZW5ndGgpIHsKKyAgICBzdGFydCA9IGs7CisgICAgcHJlZml4ID0gKnRvU29ydFtyZXNldEluZGV4XTsKKyAgICBuID0gMDsKKyAgICB3aGlsZShuIDw9IGV4cEluZGV4U2l6ZSkgeworICAgICAgc3VmZml4LmNsZWFyKCk7CisgICAgICBmb3IobSA9IG47IG0gPCBleHBJbmRleFNpemU7IG0rKykgeworICAgICAgICBzdWZmaXguYXBwZW5kKCp0b1NvcnRbZXhwSW5kZXhlc1ttXV0pOworICAgICAgfQorICAgICAgayA9IHN0YXJ0OworICAgICAgd2hpbGUodG9Tb3J0W2tdLT5zdHJlbmd0aEZyb21FbXB0eSA9PSBzdHJlbmd0aCkgeworICAgICAgICB0cmlhbC5zZXRUb0NvbmNhdCgmcHJlZml4LCB0b1NvcnRba10pOworICAgICAgICB0cmlhbC5hcHBlbmQoc3VmZml4KTsKKyAgICAgICAgbGFzdFN0ciA9IHByb2JlLmdldFN0cmVuZ3RoKHRyaWFsLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgaWYobGFzdFN0ciA9PSBVQ09MX09GRikgeyAvLyBzaG90IG92ZXIgLSB3ZSB3b24ndCBmaW5kIGFueXRoaW5nIGhlcmUKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmKGxhc3RTdHIgPiBzdHJlbmd0aCkgeworICAgICAgICAgIGZvcihtID0gZXhwSW5kZXhTaXplOyBtID4gbjsgbS0tKSB7CisgICAgICAgICAgICBleHBJbmRleGVzW21dID0gZXhwSW5kZXhlc1ttLTFdOworICAgICAgICAgIH0KKyAgICAgICAgICBleHBJbmRleGVzW25dID0gazsKKyAgICAgICAgICBleHBJbmRleFNpemUrKzsKKyAgICAgICAgICBoYXZlQ2hhbmdlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZiAwCisgICAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsICp0b1NvcnRbaV0pID4gMCkgeworICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCBvbmUgc2tpcHMsIHRoYXQgbWVhbnMgdGhhdAorICAgICAgICAgIC8vIHRoaXMgcG9zaXRpb24gZG9lc24ndCB3b3JrCisgICAgICAgICAgaWYoayA+IHN0YXJ0KSB7CisgICAgICAgICAgICAvLyBpbnNlcnQgYW4gaWdub3JhYmxlIG9uIHBvc2l0aW9uIG4KKyAgICAgICAgICAgIGZvcihtID0gZXhwSW5kZXhTaXplOyBtID4gbjsgbS0tKSB7CisgICAgICAgICAgICAgIGV4cEluZGV4ZXNbbV0gPSBleHBJbmRleGVzW20tMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHBJbmRleGVzW25dID0gay0xOworICAgICAgICAgICAgZXhwSW5kZXhTaXplKys7CisgICAgICAgICAgICBoYXZlQ2hhbmdlcyA9IFRSVUU7CisgICAgICAgICAgICBpZihuID09IGV4cEluZGV4U2l6ZS0xKSB7IC8vIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICAgICAgICBVQ29sQXR0cmlidXRlVmFsdWUgc3RyID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsICp0b1NvcnRbaV0pOworICAgICAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrSGVyZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxhc3RTdHIgPSBwcm9iZS5nZXRTdHJlbmd0aCh0cmlhbCwgKnRvU29ydFtpXSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBrKys7CisgICAgICB9CisgICAgICBwcmVmaXguYXBwZW5kKCp0b1NvcnRbZXhwSW5kZXhlc1tuXV0pOworICAgICAgbisrOworICAgIH0KKyAgfQorCisgIGlmKGhhdmVDaGFuZ2VzKSB7CisgICAgZXhwTGluZS5jbGVhcigpOworICAgIGZvcihtID0gMDsgbSA8IGV4cEluZGV4U2l6ZTsgbSsrKSB7CisgICAgICBleHBMaW5lLmFwcGVuZCgqdG9Tb3J0W2V4cEluZGV4ZXNbbV1dKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc2V0SW5kZXg7Cit9CisKK2ludDMyX3QgCitTb3J0ZWRMaW5lczo6ZGV0ZWN0RXhwYW5zaW9ucygpIAoreworICBsb2dnZXItPmxvZygiXG4qKiogRGV0ZWN0aW5nIGV4cGFuc2lvbnNcblxuIik7CisgIGludDMyX3QgZXhDb3VudCA9IDA7CisgIGludDMyX3QgaSA9IDAsIGogPSAwLCBrID0gMCwgcHJldksgPSAwOworICBMaW5lICpwcmV2aW91cywgdHJpYWwsIGV4cGFuc2lvbkxpbmU7CisgIFVCb29sIGZvdW5kRXhwID0gRkFMU0UsIHNlcXVlbmNlQ29tcGxldGVkID0gRkFMU0U7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCA9IFVDT0xfT0ZGOworICBVQ29sQXR0cmlidXRlVmFsdWUgbWF4U3RyZW5ndGggPSBVQ09MX0lERU5USUNBTDsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIGV4cFN0cmVuZ3RoID0gVUNPTF9PRkY7CisgIGludDMyX3QgZXhwSW5kZXhlc1syNTZdOworICBpbnQzMl90IGV4cEluZGV4U2l6ZSA9IDA7CisgIG1lbXNldChleHBJbmRleGVzLCAwLCBzaXplb2YoZXhwSW5kZXhlcykpOworCisgIC8vIGZvciBlYWNoIGVsZW1lbnQsIHdlIGxvb2sgYmFjayB0byBmaW5kIHdoZXRoZXIgdGhlcmUgaXMgc3VjaCBhIHEgZm9yIHdoaWNoCisgIC8vIHEgPG4geCA8IHFVQm4uIFRoZXNlIGFyZSBwb3NzaWJsZSBleHBhbnNpb25zLiBXaGVuIGdvaW5nIGJhY2t3YXJkcyB3ZSBza2lwIAorICAvLyBvdmVyIGFscmVhZHkgZGV0ZWN0ZWQgZXhwYW5zaW9ucy4KKyAgaSA9IDA7CisgIC8vIGl0IHR1cm5zIG91dCB0aGF0IGxvb2tpbmcgYXQgYWNjZW50cyBhcyBwb3NzaWJsZSBleHBhbnNpb25zIGlzCisgIC8vIHF1aXRlIGEgc3R1cGlkIHRoaW5nIHRvIGRvLCBlc3BlY2lhbGx5IG9uIG5vbiBJQ1UgcGxhdGZvcm1zLgorICAvLyBQcmV2aW91c2x5IHRoaXMgbGluZSBza2lwcGVkIG92ZXIgaWRlbnRpY2FscyBvbmx5LCBidXQgCisgIC8vIG5vdyB3ZSBhcmUgZ29pbmcgdG8gc2tpcCBhbGwgdGhlIHdheSB0byBub24taWdub3JhYmxlcy4KKyAgd2hpbGUodG9Tb3J0W2ldLT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSkgeworICAgIGkrKzsKKyAgfQorICBpKys7CisgIGZvciggOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYodG9Tb3J0W2ldLT5uYW1lWzBdPT0weDAwNjMgJiYgdG9Tb3J0W2ldLT5uYW1lWzFdID09IDB4NjgpIC8vICYmIHRvU29ydFtpXS0+bmFtZVsxXSA9PSAweDMwOCkwMDQzIDAwNDMgMDIxOQorICAgIHsgCisgICAgICBpbnQzMl90IHB1dEJyZWFrcG9pbnRoZXJlID0gMDsKKyAgICB9CisgICAgZm91bmRFeHAgPSBGQUxTRTsKKyAgICBzZXF1ZW5jZUNvbXBsZXRlZCA9IEZBTFNFOworICAgIHN0cmVuZ3RoID0gdG9Tb3J0W2ldLT5zdHJlbmd0aDsKKyAgICBpZihzdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCAmJiB0b1NvcnRbaS0xXS0+aXNFeHBhbnNpb24gPT0gVFJVRSkgeworICAgICAgdV9zdHJjcHkodG9Tb3J0W2ldLT5leHBhbnNpb25TdHJpbmcsIHRvU29ydFtpLTFdLT5leHBhbnNpb25TdHJpbmcpOworICAgICAgdG9Tb3J0W2ldLT5leHBMZW4gPSB0b1NvcnRbaS0xXS0+ZXhwTGVuOworICAgICAgdG9Tb3J0W2ldLT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgICB0b1NvcnRbaV0tPmV4cEluZGV4ID0gdG9Tb3J0W2ktMV0tPmV4cEluZGV4OworICAgICAgdG9Tb3J0W2ldLT5leHBTdHJlbmd0aCA9IFVDT0xfSURFTlRJQ0FMOworICAgICAgLy90b1NvcnRbaV0tPmV4cFN0cmVuZ3RoID0gdG9Tb3J0W2ktMV0tPmV4cFN0cmVuZ3RoOworICAgICAgZm91bmRFeHAgPSBUUlVFOworICAgICAgc2VxdWVuY2VDb21wbGV0ZWQgPSBUUlVFOworICAgIH0KKyAgICAvL2xvZ2dlci0+bG9nKCIlaSAlaVxuIiwgaSwgaik7CisgICAgd2hpbGUoIWZvdW5kRXhwICYmIHN0cmVuZ3RoIDw9IG1heFN0cmVuZ3RoKSB7CisgICAgICBqID0gaS0xOworICAgICAgd2hpbGUoaiAmJiAodG9Tb3J0W2pdLT5pc0V4cGFuc2lvbiA9PSBUUlVFIHx8IHRvU29ydFtqXS0+aXNSZW1vdmVkID09IFRSVUUpKSB7CisgICAgICAgIC8vaWYodG9Tb3J0W2pdLT5zdHJlbmd0aCA8IHN0cmVuZ3RoKSB7CisgICAgICAgICAgLy9zdHJlbmd0aCA9IHRvU29ydFtqXS0+c3RyZW5ndGg7CisgICAgICAgIC8vfQorICAgICAgICBqLS07CisgICAgICB9CisKKyAgICAgIC8vd2hpbGUoaiAmJiB0b1NvcnRbal0tPnN0cmVuZ3RoID4gc3RyZW5ndGgpCisgICAgICB3aGlsZShqICYmIHRvU29ydFtqXS0+c3RyZW5ndGggPiBwcm9iZS5nZXRTdHJlbmd0aCgqdG9Tb3J0W2pdLCAqdG9Tb3J0W2ldKSkKKyAgICAgIHsKKyAgICAgICAgai0tOworICAgICAgfQorICAgICAgLy9pZih0b1NvcnRbal0tPnN0cmVuZ3RoID09IHN0cmVuZ3RoKSB7CisgICAgICAgIHByZXZpb3VzID0gdG9Tb3J0W2pdOworICAgICAgICBpZihwcmV2aW91cy0+c3RyZW5ndGhGcm9tRW1wdHkgPj0gVUNPTF9JREVOVElDQUwgfHwKKyAgICAgICAgICAocHJldmlvdXMtPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfU0VDT05EQVJZCisgICAgICAgICAgJiYgc3RyZW5ndGggPT0gVUNPTF9TRUNPTkRBUlkKKyAgICAgICAgICAmJiBwcmV2aW91cy0+bGFzdENDID4gVUJbc3RyZW5ndGhdLT5maXJzdENDKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIC8vY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy90cmlhbC5zZXRUb0NvbmNhdChwcmV2aW91cywgVUJbc3RyZW5ndGhdKTsKKyAgICAgICAgdHJpYWwuc2V0VG9Db25jYXQocHJldmlvdXMsIFVCW3Byb2JlLmdldFN0cmVuZ3RoKCp0b1NvcnRbal0sICp0b1NvcnRbaV0pXSk7CisgICAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsICp0b1NvcnRbaV0pID4gMCkgeworICAgICAgICAgIGZvdW5kRXhwID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgLy99CisgICAgICBpZihzdHJlbmd0aCA9PSBVQ09MX1FVQVRFUk5BUlkpIHsKKyAgICAgICAgc3RyZW5ndGggPSBVQ09MX0lERU5USUNBTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVuZ3RoID0gKFVDb2xBdHRyaWJ1dGVWYWx1ZSkoc3RyZW5ndGggKyAxKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gY2FsY3VsYXRlIHRoZSBleHBhbmRpbmcgc2VxdWVuY2UKKyAgICBpZihmb3VuZEV4cCAmJiAhc2VxdWVuY2VDb21wbGV0ZWQpIHsKKyAgICAgIGV4cEluZGV4U2l6ZSA9IDA7CisgICAgICBleHBhbnNpb25MaW5lLmNsZWFyKCk7CisgICAgICBleENvdW50Kys7CisgICAgICAvLyB3ZSB3aWxsIHN0YXJ0IGZyb20gc3RyZW5ndGggYmV0d2VlbiB0aGUgZXhwYW5zaW9uCisgICAgICAvLyBhbmQgdGhlIHRhcmdldCAodG9Tb3J0W2ldIGFuZCB0b1NvcnRbal0uIEZpcnN0IHdlCisgICAgICAvLyB3aWxsIGFkZCBhcyBtYW55IHByaW1hcmllcyBhcyBwb3NzaWJsZS4gVGhlbiB3ZSB3aWxsCisgICAgICAvLyB0cnkgdG8gYWRkIHNlY29uZGFyeSBwaWVjZXMgYW5kIHRoZW4gdGVydGlhcnkuIAorICAgICAgLy8gZm91bmQgYW4gZXhwYW5zaW9uIC0gd2hhdCBpcyB0aGUgZXhwYW5kaW5nIHNlcXVlbmNlPworICAgICAgCisgICAgICBleHBTdHJlbmd0aCA9IFVDT0xfUFJJTUFSWTsKKyAgICAgIHdoaWxlKCFzZXF1ZW5jZUNvbXBsZXRlZCkgeworICAgICAgICBrID0gMDsKKyAgICAgICAgcHJldksgPSAwOworICAgICAgICB3aGlsZShrIDwgc2l6ZSkgeworICAgICAgICAgIGlmKGV4cGFuc2lvbkxpbmUubGVuID4gMTUpIHsKKyAgICAgICAgICAgIHNlcXVlbmNlQ29tcGxldGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZShrIDwgc2l6ZSAmJiB0b1NvcnRba10tPnN0cmVuZ3RoICE9IFVDT0xfUFJJTUFSWSkgeworICAgICAgICAgICAgaysrOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBub3RoaW5nIGZvdW5kCisgICAgICAgICAgaWYoayA9PSBzaXplKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gd2UgbmVlZCB0byBza2lwIG92ZXIgcmVvcmRlcmluZyB0aGluZ3MuIElmIHRoZXkgd2VyZSB3b3J0aHksIHRoZXkgd291bGQKKyAgICAgICAgICAvLyBoYXZlIGJlZW4gZGV0ZWN0ZWQgaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbi4KKyAgICAgICAgICAvL2lmKGV4cGFuc2lvbkxpbmUubGFzdENDICYmIHRvU29ydFtrXS0+Zmlyc3RDQyAmJiBleHBhbnNpb25MaW5lLmxhc3RDQyA+IHRvU29ydFtrXS0+Zmlyc3RDQykgeworICAgICAgICAgICAgLy9rKys7CisgICAgICAgICAgICAvL2NvbnRpbnVlOworICAgICAgICAgIC8vfQorICAgICAgICAgIHRyaWFsID0gKnByZXZpb3VzOworICAgICAgICAgIHRyaWFsLmFwcGVuZChleHBhbnNpb25MaW5lKTsKKyAgICAgICAgICB0cmlhbC5hcHBlbmQoKnRvU29ydFtrXSk7ICAgICAgICAKKyAgICAgICAgICBpZih0b1NvcnRba10tPm5hbWVbMF0gPT0gMHgwMDY3KSB7CisgICAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrUG9pbnRIZXJlID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYocHJvYmUuY29tcGFyZSh0cmlhbCwgKnRvU29ydFtpXSkgPiAwKSB7CisgICAgICAgICAgICBpZihwcmV2SykgeworICAgICAgICAgICAgICAvLyB3ZSBnb3QgaW50byBzaXR1YXRpb24gd2hlcmUgd2UgaGF2ZSBjaCA+IGNoK2RvdC1iZWxvdworICAgICAgICAgICAgICAvLyBob3dldmVyLCBjaCBpcyBhIGNvbnRyYWN0aW9uIGFuZCB0aGVyZWZvcmUgd2UgY2Fubm90IHVzZQorICAgICAgICAgICAgICAvLyBpdCBwcm9wZXJseS4gSWYgd2UgaGF2ZSBoaXQgb24gYSBjb250cmFjdGlvbiwgd2UnbGwganVzdCB0cnkKKyAgICAgICAgICAgICAgLy8gdG8gY29udGludWUuIFByb2JhYmx5IG5lZWQgbW9yZSBsb2dpYyBoZXJlLgorICAgICAgICAgICAgICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcodHJpYWwubmFtZSwgdHJpYWwubGVuKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGV4cGFuc2lvbkxpbmUuYXBwZW5kKCp0b1NvcnRbcHJldktdKTsKKyAgICAgICAgICAgICAgICBleHBJbmRleGVzW2V4cEluZGV4U2l6ZSsrXSA9IHByZXZLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDMyX3QgcHV0QnJlYWtQb2ludEhlcmUgPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzZXF1ZW5jZUNvbXBsZXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9icmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJldksgPSBrOworICAgICAgICAgIGsrKzsKKyAgICAgICAgfQorICAgICAgICBpZighcHJldksgfHwgayA9PSBzaXplKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIGFmdGVyIHRoaXMgd2UgaGF2ZSBwcmltYXJpZXMgbGluZWQgdXAuCisgICAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gZ29vc2UgdXAgd2l0aCBzZWNvbmRhcmllcyBhbmQgCisgICAgICAvLyB0ZXJ0aWFyaWVzCisgICAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRbal0sICZleHBhbnNpb25MaW5lKTsKKyAgICAgIGV4cFN0cmVuZ3RoID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsICp0b1NvcnRbaV0pOworICAgICAgaWYoZXhwU3RyZW5ndGggPiBVQ09MX1BSSU1BUlkpIHsKKyAgICAgICAgaWYoZXhwU3RyZW5ndGggPT0gVUNPTF9TRUNPTkRBUlkgfHwgZXhwU3RyZW5ndGggPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBqID0gZ29vc2VVcChqLCBpLCBleHBhbnNpb25MaW5lLCBleHBJbmRleGVzLCBleHBJbmRleFNpemUsIFVDT0xfU0VDT05EQVJZKTsKKyAgICAgICAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRbal0sICZleHBhbnNpb25MaW5lKTsKKyAgICAgICAgICBleHBTdHJlbmd0aCA9IHByb2JlLmdldFN0cmVuZ3RoKHRyaWFsLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgICBpZihleHBTdHJlbmd0aCA9PSBVQ09MX1RFUlRJQVJZKSB7CisgICAgICAgICAgICBqID0gZ29vc2VVcChqLCBpLCBleHBhbnNpb25MaW5lLCBleHBJbmRleGVzLCBleHBJbmRleFNpemUsIFVDT0xfVEVSVElBUlkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmKGV4cFN0cmVuZ3RoID09IFVDT0xfVEVSVElBUlkpIHsKKyAgICAgICAgICBqID0gZ29vc2VVcChqLCBpLCBleHBhbnNpb25MaW5lLCBleHBJbmRleGVzLCBleHBJbmRleFNpemUsIFVDT0xfVEVSVElBUlkpOworICAgICAgICB9CisgICAgICB9CisgICAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRbal0sICZleHBhbnNpb25MaW5lKTsKKyAgICAgIGV4cFN0cmVuZ3RoID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsICp0b1NvcnRbaV0pOworICAgICAgaWYoZXhwYW5zaW9uTGluZS5sZW4pIHsKKyAgICAgICAgaWYoZXhwYW5zaW9uTGluZS5uYW1lWzBdID09IDB4NzMgJiYgZXhwYW5zaW9uTGluZS5uYW1lWzFdID09IDB4N2EpIHsKKyAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrcG9pbnRoZXJlID0gMDsKKyAgICAgICAgfQorICAgICAgICBVQm9vbCBpc0V4cGFuc2lvbkxpbmVBQ29udHJhY3Rpb24gPSAoY29udHJhY3Rpb25zVGFibGUtPmdldChVbmljb2RlU3RyaW5nKGV4cGFuc2lvbkxpbmUubmFtZSwgZXhwYW5zaW9uTGluZS5sZW4pKSAhPSBOVUxMKTsKKyAgICAgICAgLy8gd2UgaGF2ZSBhbiBleHBhbnNpb24gbGluZSBhbmQgYW4gZXhwYW5zaW9uLiBUaGVyZSBjb3VsZCBiZSBzb21lIGV4cGFuc2lvbnMgd2hlcmUgCisgICAgICAgIC8vIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZXhwYW5zaW9uIGxpbmUgYW5kIHRoZSBlbmQgb2YgZXhwYW5zaW9uIHNlcXVlbmNlIGlzIGxlc3Mgb3IgCisgICAgICAgIC8vIGVxdWFsIHRoYW4gdGhlIGV4cGFuc2lvbiBzdHJlbmd0aC4gVGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQuCisgICAgICAgIGludDMyX3QgZGlmZkxlbiA9IHRvU29ydFtpXS0+bGVuIC0gZXhwYW5zaW9uTGluZS5sZW47CisgICAgICAgIGlmKGRpZmZMZW4gPiAwKSB7CisgICAgICAgICAgdHJpYWwuc2V0VG8oVW5pY29kZVN0cmluZyh0b1NvcnRbaV0tPm5hbWUgKyBkaWZmTGVuLCB0b1NvcnRbaV0tPmxlbiAtIGRpZmZMZW4pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmlhbCA9ICp0b1NvcnRbaV07CisgICAgICAgIH0KKyAgICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHMxID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsIGV4cGFuc2lvbkxpbmUpOworICAgICAgICBpZihzMSA9PSBVQ09MX09GRikgeworICAgICAgICAgIHMxID0gcHJvYmUuZ2V0U3RyZW5ndGgoZXhwYW5zaW9uTGluZSwgdHJpYWwpOworICAgICAgICB9CisgICAgICAgIGlmKCghaXNFeHBhbnNpb25MaW5lQUNvbnRyYWN0aW9uICYmIHMxID49IGV4cFN0cmVuZ3RoKSB8fCAoZGlmZkxlbiA8PSAwICYmIHMxID09IFVDT0xfSURFTlRJQ0FMKSkgeworICAgICAgICAgIGNvbnRyYWN0aW9uc1RhYmxlLT5yZW1vdmUoVW5pY29kZVN0cmluZyh0b1NvcnRbaV0tPm5hbWUsIHRvU29ydFtpXS0+bGVuKSk7CisgICAgICAgICAgdG9Tb3J0W2ldLT5pc1JlbW92ZWQgPSBUUlVFOworICAgICAgICAgIGlmKHRvU29ydFtpXS0+bmV4dCAmJiB0b1NvcnRbaV0tPnByZXZpb3VzKSB7CisgICAgICAgICAgICB0b1NvcnRbaV0tPnByZXZpb3VzLT5uZXh0ID0gdG9Tb3J0W2ldLT5uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZih0b1NvcnRbaV0tPnByZXZpb3VzICYmIHRvU29ydFtpXS0+bmV4dCkgeworICAgICAgICAgICAgdG9Tb3J0W2ldLT5uZXh0LT5wcmV2aW91cyA9IHRvU29ydFtpXS0+cHJldmlvdXM7CisgICAgICAgICAgfQorCSAgICAgIGRlYnVnLT5sb2coIkV4cCAtTjogIik7CisJICAgICAgZGVidWctPmxvZyh0b1NvcnRbaV0tPnRvU3RyaW5nKEZBTFNFKSk7CisJICAgICAgZGVidWctPmxvZygiIC8gIik7CisJICAgICAgZGVidWctPmxvZyhleHBhbnNpb25MaW5lLnRvU3RyaW5nKEZBTFNFKSwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgCisgICAgICAgICAgdV9zdHJuY2F0KHRvU29ydFtpXS0+ZXhwYW5zaW9uU3RyaW5nLCBleHBhbnNpb25MaW5lLm5hbWUsIGV4cGFuc2lvbkxpbmUubGVuKTsKKyAgICAgICAgICB0b1NvcnRbaV0tPmlzRXhwYW5zaW9uID0gVFJVRTsKKyAgICAgICAgICB0b1NvcnRbaV0tPmV4cFN0cmVuZ3RoID0gZXhwU3RyZW5ndGg7CisgICAgICAgICAgdG9Tb3J0W2ldLT5leHBMZW4gPSBleHBhbnNpb25MaW5lLmxlbjsKKyAgICAgICAgICB0b1NvcnRbaV0tPmV4cGFuc2lvblN0cmluZ1t0b1NvcnRbaV0tPmV4cExlbl0gPSAwOworICAgICAgICAgIHRvU29ydFtpXS0+ZXhwSW5kZXggPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmKHRvU29ydFtpXS0+aXNFeHBhbnNpb24gPT0gVFJVRSkgeworICAgICAgaWYoZGVidWctPmlzT24oKSkgeworICAgICAgICBkZWJ1Zy0+bG9nKCJFeHAgKyA6ICYiKTsKKyAgICAgICAgZGVidWctPmxvZyh0b1NvcnRbal0tPnRvU3RyaW5nKEZBTFNFKSk7CisgICAgICAgIGRlYnVnLT5sb2codG9Tb3J0W2ldLT5zdHJlbmd0aFRvU3RyaW5nKHRvU29ydFtpXS0+ZXhwU3RyZW5ndGgsIFRSVUUpKTsKKyAgICAgICAgZGVidWctPmxvZyh0b1NvcnRbaV0tPnRvU3RyaW5nKEZBTFNFKSk7CisgICAgICAgIGRlYnVnLT5sb2coIiAiKTsKKyAgICAgICAgaWYoIXRvU29ydFtqXS0+c29ydEtleSkgeworICAgICAgICAgIGNhbGN1bGF0ZVNvcnRLZXkoKnRvU29ydFtqXSk7CisgICAgICAgIH0KKyAgICAgICAgZGVidWctPmxvZyh0b1NvcnRbal0tPmR1bXBTb3J0a2V5KCkpOworICAgICAgICBkZWJ1Zy0+bG9nKCIgLi4uICIpOworICAgICAgICBpZighdG9Tb3J0W2ldLT5zb3J0S2V5KSB7CisgICAgICAgICAgY2FsY3VsYXRlU29ydEtleSgqdG9Tb3J0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1Zy0+bG9nKHRvU29ydFtpXS0+ZHVtcFNvcnRrZXkoKSk7CisgICAgICAgIGNhbGN1bGF0ZVNvcnRLZXkoZXhwYW5zaW9uTGluZSk7CisgICAgICAgIGRlYnVnLT5sb2coIi8iKTsKKyAgICAgICAgZGVidWctPmxvZyhleHBhbnNpb25MaW5lLmR1bXBTb3J0a2V5KCksIFRSVUUpOworICAgICAgfQorICAgICAgCisgICAgfQorICB9CisgIC8vIGFmdGVyIGRldGVjdGluZyBleHBhbnNpb25zLCB3ZSB3YW50IHRvIHBvc2l0aW9uIHRoZW0uIAorICAvLyBpdCBpcyBiZXR0ZXIgdG8gcG9zaXRpb24gZXhwYW5zaW9ucyBhZnRlciBhbGwgaGF2ZSBiZWVuIGRldGVjdGVkLAorICAvLyBzaW5jZSBvdGhlcndpc2Ugd2Ugd2lsbCBjaGFuZ2UgdGhlIG9yZGVyaW5nLgorICBmb3IoaSA9IHNpemUtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZih0b1NvcnRbaV0tPmlzRXhwYW5zaW9uKSB7CisgICAgICBpZih0b1NvcnRbaV0tPm5hbWVbMF0gPT0gMHgyQTMpIHsKKyAgICAgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgICAgICB9CisgICAgICBpZihpKSB7CisgICAgICAgIGlmKHRvU29ydFtpXS0+cHJldmlvdXMpIHsKKyAgICAgICAgICB0b1NvcnRbaV0tPnByZXZpb3VzLT5uZXh0ID0gdG9Tb3J0W2ldLT5uZXh0OworICAgICAgICB9CisgICAgICB9CisgICAgICBpZihpIDwgc2l6ZS0xKSB7CisgICAgICAgIGlmKHRvU29ydFtpXS0+bmV4dCkgeworICAgICAgICAgIHRvU29ydFtpXS0+bmV4dC0+cHJldmlvdXMgPSB0b1NvcnRbaV0tPnByZXZpb3VzOworICAgICAgICB9CisgICAgICB9CisgICAgICBqID0gdG9Tb3J0W2ldLT5leHBJbmRleDsKKyAgICAgIHRvU29ydFtpXS0+bmV4dCA9IHRvU29ydFtqXS0+bmV4dDsKKyAgICAgIHRvU29ydFtpXS0+cHJldmlvdXMgPSB0b1NvcnRbal07CisgICAgICB0b1NvcnRbal0tPm5leHQgPSB0b1NvcnRbaV07CisgICAgICBpZih0b1NvcnRbaV0tPm5leHQpIHsKKyAgICAgICAgdG9Tb3J0W2ldLT5uZXh0LT5wcmV2aW91cyA9IHRvU29ydFtpXTsKKyAgICAgIH0KKyAgICAgIHRvU29ydFtpXS0+c3RyZW5ndGggPSB0b1NvcnRbaV0tPmV4cFN0cmVuZ3RoOworICAgIH0KKyAgfQorICByZXR1cm4gZXhDb3VudDsKK30KKworCitMaW5lICoKK1NvcnRlZExpbmVzOjpnZXRGaXJzdCgpIHsKKyAgY3VycmVudCA9IGZpcnN0OworICByZXR1cm4gY3VycmVudDsKK30KKworTGluZSAqCitTb3J0ZWRMaW5lczo6Z2V0TGFzdCgpIHsKKyAgY3VycmVudCA9IGxhc3Q7CisgIHJldHVybiBjdXJyZW50OworfQorCit2b2lkIAorU29ydGVkTGluZXM6OmFkZChMaW5lICpsaW5lLCBVQm9vbCBsaW5rSW4pIHsKKyAgaWYoc2l6ZSsrID09IGNhcGFjaXR5KSB7CisgICAgLy8gZ3JvdworICB9CisgIGxpbmVzW3NpemVdID0gKmxpbmU7CisgIExpbmUgKnRvQWRkID0gJmxpbmVzW3NpemVdOworICBpZihsaW5rSW4gJiYgZmlyc3QpIHsKKyAgICBMaW5lICpjdXJyZW50ID0gZmlyc3Q7CisgICAgd2hpbGUoY3VycmVudCAhPSBOVUxMICYmIHByb2JlLmNvbXBhcmVyKCZjdXJyZW50LCAmdG9BZGQpIDwgMCkgeworICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorICAgIGlmKGN1cnJlbnQgPT0gTlVMTCkgeworICAgICAgdG9BZGQtPnByZXZpb3VzID0gbGFzdDsKKyAgICAgIHRvQWRkLT5uZXh0ID0gTlVMTDsKKyAgICAgIGlmKGxhc3QgIT0gTlVMTCkgeworICAgICAgICBsYXN0LT5uZXh0ID0gdG9BZGQ7CisgICAgICB9CisgICAgICBsYXN0ID0gdG9BZGQ7CisgICAgICBpZihmaXJzdCA9PSBOVUxMKSB7CisgICAgICAgIGZpcnN0ID0gdG9BZGQ7CisgICAgICB9CisgICAgfSBlbHNlIHsgLy8gY3VycmVudCAhPSBOVUxMCisgICAgICB0b0FkZC0+bmV4dCA9IGN1cnJlbnQ7CisgICAgICB0b0FkZC0+cHJldmlvdXMgPSBjdXJyZW50LT5wcmV2aW91czsKKyAgICAgIGlmKGN1cnJlbnQtPnByZXZpb3VzKSB7CisgICAgICAgIGN1cnJlbnQtPnByZXZpb3VzLT5uZXh0ID0gdG9BZGQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaXJzdCA9IHRvQWRkOworICAgICAgfQorICAgICAgY3VycmVudC0+cHJldmlvdXMgPSB0b0FkZDsKKyAgICB9CisgIH0KK30KKworCitMaW5lICoKK1NvcnRlZExpbmVzOjpnZXROZXh0KCkKK3sKKyAgaWYoY3VycmVudCAhPSBOVUxMKSB7CisgICAgY3VycmVudD1jdXJyZW50LT5uZXh0OworICB9CisgIHJldHVybiBjdXJyZW50OworfQorCitMaW5lICoKK1NvcnRlZExpbmVzOjpnZXRQcmV2aW91cygpCit7CisgIGlmKGN1cnJlbnQgIT0gTlVMTCkgeworICAgIGN1cnJlbnQ9Y3VycmVudC0+cHJldmlvdXM7CisgIH0KKyAgcmV0dXJuIGN1cnJlbnQ7Cit9CisKK0xpbmUgKgorU29ydGVkTGluZXM6Om9wZXJhdG9yW10oaW50MzJfdCBpbmRleCkKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgTGluZSAqYyA9IGZpcnN0OworICBmb3IoaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisgICAgaWYoYyAhPSBOVUxMKSB7CisgICAgICBjID0gYy0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK1VuaWNvZGVTdHJpbmcKK1NvcnRlZExpbmVzOjphcnJheVRvU3RyaW5nKExpbmUqKiBzb3J0ZWRMaW5lcywgaW50MzJfdCBsaW5lc1NpemUsIFVCb29sIHByZXR0eSwgVUJvb2wgdXNlTGlua3MsIFVCb29sIHByaW50U29ydEtleXMpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGludDMyX3QgaSA9IDA7CisKKyAgTGluZSAqbGluZSA9IE5VTEw7CisgIExpbmUgKnByZXZpb3VzID0gc29ydGVkTGluZXNbMF07CisgIGlmKHByaW50U29ydEtleXMgJiYgIXNvcnRrZXlzKSB7CisgICAgcHJpbnRTb3J0S2V5cyA9IEZBTFNFOworICB9CisgIGlmKHByZXZpb3VzLT5pc1Jlc2V0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiICYgIik7CisgICAgcmVzdWx0LmFwcGVuZChwcmV2aW91cy0+bmFtZSwgcHJldmlvdXMtPmxlbik7CisgICAgaWYocHJldHR5KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIgICAgICAgICMgIik7CisgICAgICByZXN1bHQuYXBwZW5kKHByZXZpb3VzLT5zdHJpbmdUb05hbWUocHJldmlvdXMtPm5hbWUsIHByZXZpb3VzLT5sZW4pKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorICB9IGVsc2UgaWYoIXByZXZpb3VzLT5pc1JlbW92ZWQpIHsKKyAgICByZXN1bHQuYXBwZW5kKHByZXZpb3VzLT50b1N0cmluZyhwcmV0dHkpKTsKKyAgICBpZihwcmV0dHkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorICB9CisgIGkgPSAxOworICB3aGlsZSgoaSA8IGxpbmVzU2l6ZSAmJiAhdXNlTGlua3MpIHx8IChwcmV2aW91cy0+bmV4dCAmJiB1c2VMaW5rcykpIHsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IHByZXZpb3VzLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gc29ydGVkTGluZXNbaV07CisgICAgfQorICAgIGlmKGxpbmUtPmlzUmVzZXQpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIiAmIik7CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPm5hbWUsIGxpbmUtPmxlbik7CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICAjICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnN0cmluZ1RvTmFtZShsaW5lLT5uYW1lLCBsaW5lLT5sZW4pKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYoIWxpbmUtPmlzUmVtb3ZlZCkgeworICAgICAgaWYoaSA+IDApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT5zdHJlbmd0aFRvU3RyaW5nKGxpbmUtPnN0cmVuZ3RoLCBwcmV0dHkpKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQobGluZS0+dG9TdHJpbmcocHJldHR5KSk7CisgICAgICBpZihwcmludFNvcnRLZXlzKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZS0+ZHVtcFNvcnRrZXkoKSk7CisgICAgICB9CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJldmlvdXMgPSBsaW5lOworICAgIGkrKzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitTb3J0ZWRMaW5lczo6U29ydGVkTGluZXMoRklMRSAqZmlsZSwgVVByaW50ZXIgKmxvZ2dlciwgVVByaW50ZXIgKmRlYnVnLCBVRXJyb3JDb2RlICZzdGF0dXMpIDoKK3RvU29ydChOVUxMKSwKK3RvU29ydENhcGFjaXR5KDApLAorbGluZXMoTlVMTCksCitzaXplKDApLAorY2FwYWNpdHkoMCksCitmaXJzdChOVUxMKSwKK2xhc3QoTlVMTCksCitsb2dnZXIobG9nZ2VyKSwKK2RlYnVnKGRlYnVnKSwKK2NvbnRyYWN0aW9uc1RhYmxlKE5VTEwpLAorZHVwbGljYXRvcnMoTlVMTCksCittYXhFeHBhbnNpb25QcmVmaXhTaXplKDApLAord29yZFNvcnQoRkFMU0UpLAorZnJlbmNoU2Vjb25kYXJ5KEZBTFNFKSwKK3VwcGVyRmlyc3QoRkFMU0UpLAorc29ydGtleXMoTlVMTCksCitzb3J0a2V5T2Zmc2V0KDApCit7CisgIGRlYnVnLT5sb2coIioqKiBsb2FkaW5nIGEgZHVtcFxuIik7CisgIG1lbXNldChVQiwgMCwgc2l6ZW9mKFVCKSk7CisgIGludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IFVDT0xfT0ZGOyBpKyspIHsKKyAgICBVQltpXSA9ICZlbXB0eTsKKyAgfQorCisgIGludDMyX3QgbmV3RnJlbmNoLCBuZXdVcHBlckZpcnN0OworICBmc2NhbmYoZmlsZSwgIiVpLCVpLCVpXG4iLCAmc2l6ZSwgJm5ld0ZyZW5jaCwgJm5ld1VwcGVyRmlyc3QpOworICBkZWJ1Zy0+bG9nKCJSZWFkIHNpemUgJWksIGZyZW5jaFNlY29uZGFyeSAlaSBhbmQgdXBwZXJGaXJzdCAlaVxuIiwgc2l6ZSwgbmV3RnJlbmNoLCBuZXdVcHBlckZpcnN0KTsKKyAgZnJlbmNoU2Vjb25kYXJ5ID0gKFVCb29sKW5ld0ZyZW5jaDsKKyAgdXBwZXJGaXJzdCA9IChVQm9vbCluZXdVcHBlckZpcnN0OworICBjYXBhY2l0eSA9IHNpemU7CisgIGxpbmVzID0gbmV3IExpbmVbY2FwYWNpdHldOworICBpID0gMDsKKworICBjaGFyIGJ1ZmZbMjU2XTsKKworICB3aGlsZShmZ2V0cyhidWZmLCAyNTYsIGZpbGUpKSB7CisgICAgaWYoaSAlIDIwID09IDApIHsKKyAgICAgIGxvZ2dlci0+bG9nKCJcckxpbmU6ICUwNGkiLCBpLCBidWZmKTsKKyAgICB9CisgICAgbGluZXNbaV0uaW5pdEZyb21TdHJpbmcoYnVmZiwgMjU2LCBzdGF0dXMpOworICAgIGlmKGkpIHsKKyAgICAgIGxpbmVzW2ldLnByZXZpb3VzID0gJmxpbmVzW2ktMV07CisgICAgICBsaW5lc1tpLTFdLm5leHQgPSAmbGluZXNbaV07CisgICAgfQorICAgIGkrKzsKKyAgfQorICBzaXplID0gaTsKKyAgdG9Tb3J0ID0gbmV3IExpbmUqW3NpemVdOworICBzZXRTb3J0aW5nQXJyYXkodG9Tb3J0LCBsaW5lcywgc2l6ZSk7CisgIGZpcnN0ID0gJmxpbmVzWzBdOworICBsYXN0ID0gJmxpbmVzW3NpemUtMV07Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjp0b0ZpbGUoRklMRSAqZmlsZSwgVUJvb2wgdXNlTGlua3MsIFVFcnJvckNvZGUgJnN0YXR1cykgCit7CisgIGZwcmludGYoZmlsZSwgIiVpLCVpLCVpXG4iLCBzaXplLCBmcmVuY2hTZWNvbmRhcnksIHVwcGVyRmlyc3QpOworICBpbnQzMl90IGkgPSAxOworICBMaW5lICpwcmV2aW91cyA9IHRvU29ydFswXTsKKyAgTGluZSAqbGluZSA9IE5VTEw7CisgIGNoYXIgYnVmZlsyNTZdOworICBwcmV2aW91cy0+d3JpdGUoYnVmZiwgMjU2LCBzdGF0dXMpOworICBmcHJpbnRmKGZpbGUsICIlc1xuIiwgYnVmZik7CisgIGZmbHVzaChmaWxlKTsKKyAgd2hpbGUocHJldmlvdXMtPm5leHQpIHsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IHByZXZpb3VzLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gdG9Tb3J0W2ldOworICAgIH0KKyAgICBsaW5lLT53cml0ZShidWZmLCAyNTYsIHN0YXR1cyk7CisgICAgZnByaW50ZihmaWxlLCAiJXNcbiIsIGJ1ZmYpOworICAgIGkrKzsKKyAgICBwcmV2aW91cyA9IGxpbmU7CisgIH0KK30KKworCisKK1VuaWNvZGVTdHJpbmcgCitTb3J0ZWRMaW5lczo6dG9TdHJpbmdGcm9tRW1wdHkoKSB7CisgIFVCb29sIHVzZUxpbmtzID0gRkFMU0U7CisgIFVCb29sIHByZXR0eSA9IEZBTFNFOworICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKKyAgaW50MzJfdCBpID0gMDsKKworICBMaW5lICpsaW5lID0gTlVMTDsKKyAgTGluZSAqcHJldmlvdXMgPSB0b1NvcnRbMF07CisgIGlmKHByZXZpb3VzLT5pc1Jlc2V0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiICYgIik7CisgICAgaWYocHJldHR5KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKHByZXZpb3VzLT5uYW1lLCBwcmV2aW91cy0+bGVuKTsKKyAgfSBlbHNlIGlmKCFwcmV2aW91cy0+aXNSZW1vdmVkKSB7CisgICAgcmVzdWx0LmFwcGVuZChwcmV2aW91cy0+dG9TdHJpbmcocHJldHR5KSk7CisgICAgaWYocHJldHR5KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgfQorICBpID0gMTsKKyAgd2hpbGUoaSA8IHNpemUgfHwgcHJldmlvdXMtPm5leHQpIHsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IHByZXZpb3VzLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gdG9Tb3J0W2ldOworICAgIH0KKyAgICBpZihsaW5lLT5pc1Jlc2V0KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIgJiIpOworICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT5uYW1lLCBsaW5lLT5sZW4pOworICAgICAgaWYocHJldHR5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAgICAgIyAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT5zdHJpbmdUb05hbWUobGluZS0+bmFtZSwgbGluZS0+bGVuKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmKCFsaW5lLT5pc1JlbW92ZWQpIHsKKyAgICAgIGlmKGkgPiAwKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZS0+c3RyZW5ndGhUb1N0cmluZyhsaW5lLT5zdHJlbmd0aEZyb21FbXB0eSwgcHJldHR5KSk7CisgICAgICB9CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnRvU3RyaW5nKHByZXR0eSkpOworICAgICAgaWYocHJldHR5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICB9CisgICAgfQorICAgIHByZXZpb3VzID0gbGluZTsKKyAgICBpKys7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVW5pY29kZVN0cmluZyAKK1NvcnRlZExpbmVzOjp0b1N0cmluZyhVQm9vbCB1c2VMaW5rcykgCit7CisgIHJldHVybiBhcnJheVRvU3RyaW5nKHRvU29ydCwgc2l6ZSwgRkFMU0UsIHVzZUxpbmtzLCBGQUxTRSk7Cit9CisKKworVW5pY29kZVN0cmluZyAKK1NvcnRlZExpbmVzOjp0b1ByZXR0eVN0cmluZyhVQm9vbCB1c2VMaW5rcywgVUJvb2wgcHJpbnRTb3J0S2V5cykgCit7CisgIHJldHVybiBhcnJheVRvU3RyaW5nKHRvU29ydCwgc2l6ZSwgVFJVRSwgdXNlTGlua3MsIHByaW50U29ydEtleXMpOworfQorCitVbmljb2RlU3RyaW5nIAorU29ydGVkTGluZXM6OnRvT3V0cHV0KGNvbnN0IGNoYXIgKmZvcm1hdCwgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIHVzZUxpbmtzLCBVQm9vbCBpbml0aWFsaXplLCBVQm9vbCBtb3JlVG9Db21lKSB7CisgIGlmKHN0cmNtcChmb3JtYXQsICJIVE1MIikgPT0gMCkgeworICAgIHJldHVybiB0b0hUTUwobG9jYWxlLCBwbGF0Zm9ybSwgcmVmZXJlbmNlLCB1c2VMaW5rcywgaW5pdGlhbGl6ZSwgbW9yZVRvQ29tZSk7CisgIH0gZWxzZSBpZihzdHJjbXAoZm9ybWF0LCAiWE1MIikgPT0gMCkgeworICAgIHJldHVybiB0b1hNTChsb2NhbGUsIHBsYXRmb3JtLCByZWZlcmVuY2UsIHVzZUxpbmtzLCBpbml0aWFsaXplLCBtb3JlVG9Db21lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdG9CdW5kbGUobG9jYWxlLCBwbGF0Zm9ybSwgcmVmZXJlbmNlLCB1c2VMaW5rcywgaW5pdGlhbGl6ZSwgbW9yZVRvQ29tZSk7CisgIH0KK30KKworCitVbmljb2RlU3RyaW5nIAorU29ydGVkTGluZXM6OnRvSFRNTChjb25zdCBjaGFyICpsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF0Zm9ybSwgY29uc3QgY2hhciAqcmVmZXJlbmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpCit7CisgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OworICBpbnQzMl90IGkgPSAwOworICBpZihpbml0aWFsaXplKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9XCJjb250ZW50LXR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCI+XG48L2hlYWQ+XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIjIENvbGxhdGlvbiBkYXRhIHJlc291cmNlIGJ1bmRsZSBnZW5lcmF0ZWQgZm9yIGxvY2FsZTogIik7CisgICAgcmVzdWx0LmFwcGVuZChsb2NhbGUpOworICAgIHJlc3VsdC5hcHBlbmQoIjxicj5cbiMgRm9yIHBsYXRmb3JtICIpOworICAgIHJlc3VsdC5hcHBlbmQocGxhdGZvcm0pOworICAgIHJlc3VsdC5hcHBlbmQoIiByZWZlcmVuY2UgcGxhdGZvcm0gIik7CisgICAgcmVzdWx0LmFwcGVuZChyZWZlcmVuY2UpOworICAgIHJlc3VsdC5hcHBlbmQoIjxicj48YnI+XG5cblxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgaWYocGxhdGZvcm0pIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIl8iKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQocGxhdGZvcm0pOworICAgIH0KKyAgICBpZihyZWZlcmVuY2UpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIl92c18iKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQocmVmZXJlbmNlKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7ezxicj5cbiIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jm5ic3A7Y29sbGF0aW9ucyZuYnNwO3s8YnI+XG4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzdGFuZGFyZCZuYnNwO3s8YnI+XG4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO3s8YnI+XG4iKTsKKyAgfQorCisgIGlmKGZyZW5jaFNlY29uZGFyeSkgeworICAgIHJlc3VsdC5hcHBlbmQoIltiYWNrd2FyZHMgMl08YnI+XG4iKTsKKyAgfQorICBpZih1cHBlckZpcnN0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiW2Nhc2VmaXJzdCB1cHBlcl08YnI+XG4iKTsKKyAgfQorCisgIExpbmUgKmxpbmUgPSB0b1NvcnRbMF07CisKKyAgaSA9IDA7CisgIHdoaWxlKChpIDwgc2l6ZSAmJiAhdXNlTGlua3MpIHx8IChsaW5lLT5uZXh0ICYmIHVzZUxpbmtzKSkgeworICAgIGlmKGxpbmUtPmlzUmVzZXQgfHwgIWxpbmUtPmlzUmVtb3ZlZCkgeworICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT50b0hUTUxTdHJpbmcoKSk7CisgICAgfQorICAgIGkrKzsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IGxpbmUtPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUgPSB0b1NvcnRbaV07CisgICAgfQorICB9CisgIGlmKCFtb3JlVG9Db21lKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fTxicj5cbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO308YnI+XG4mbmJzcDsmbmJzcDt9PGJyPlxufTxicj5cbiIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiPC9odG1sPlxuIik7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitVbmljb2RlU3RyaW5nIAorU29ydGVkTGluZXM6OnRvWE1MKGNvbnN0IGNoYXIgKmxvY2FsZSwgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtLCBjb25zdCBjaGFyICpyZWZlcmVuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCB1c2VMaW5rcywgVUJvb2wgaW5pdGlhbGl6ZSwgVUJvb2wgbW9yZVRvQ29tZSkKK3sKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGludDMyX3QgaSA9IDA7CisgIGlmKGluaXRpYWxpemUpIHsKKyAgICByZXN1bHQuYXBwZW5kKCI8aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj1cImNvbnRlbnQtdHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIj5cbjwvaGVhZD5cbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiMgQ29sbGF0aW9uIGRhdGEgcmVzb3VyY2UgYnVuZGxlIGdlbmVyYXRlZCBmb3IgbG9jYWxlOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiPGJyPlxuIyBGb3IgcGxhdGZvcm0gIik7CisgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgcmVzdWx0LmFwcGVuZCgiIHJlZmVyZW5jZSBwbGF0Zm9ybSAiKTsKKyAgICByZXN1bHQuYXBwZW5kKHJlZmVyZW5jZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiPGJyPjxicj5cblxuXG4iKTsKKworICAgIHJlc3VsdC5hcHBlbmQobG9jYWxlKTsKKyAgICBpZihwbGF0Zm9ybSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgfQorICAgIGlmKHJlZmVyZW5jZSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiX3ZzXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChyZWZlcmVuY2UpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCImbmJzcDt7PGJyPlxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDtjb2xsYXRpb25zJm5ic3A7ezxicj5cbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0YW5kYXJkJm5ic3A7ezxicj5cbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NlcXVlbmNlJm5ic3A7ezxicj5cbiIpOworICB9CisKKyAgaWYoZnJlbmNoU2Vjb25kYXJ5KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiW2JhY2t3YXJkcyAyXTxicj5cbiIpOworICB9CisgIGlmKHVwcGVyRmlyc3QpIHsKKyAgICByZXN1bHQuYXBwZW5kKCJbY2FzZWZpcnN0IHVwcGVyXTxicj5cbiIpOworICB9CisKKyAgTGluZSAqbGluZSA9IHRvU29ydFswXTsKKworICBpID0gMDsKKyAgd2hpbGUoKGkgPCBzaXplICYmICF1c2VMaW5rcykgfHwgKGxpbmUtPm5leHQgJiYgdXNlTGlua3MpKSB7CisgICAgaWYobGluZS0+aXNSZXNldCB8fCAhbGluZS0+aXNSZW1vdmVkKSB7CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnRvSFRNTFN0cmluZygpKTsKKyAgICB9CisgICAgaSsrOworICAgIGlmKHVzZUxpbmtzKSB7CisgICAgICBsaW5lID0gbGluZS0+bmV4dDsKKyAgICB9IGVsc2UgeworICAgICAgbGluZSA9IHRvU29ydFtpXTsKKyAgICB9CisgIH0KKyAgaWYoIW1vcmVUb0NvbWUpIHsKKyAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9PGJyPlxuJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fTxicj5cbiZuYnNwOyZuYnNwO308YnI+XG59PGJyPlxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKCI8L2h0bWw+XG4iKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK1VuaWNvZGVTdHJpbmcgCitTb3J0ZWRMaW5lczo6dG9CdW5kbGUoY29uc3QgY2hhciAqbG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIHVzZUxpbmtzLCBVQm9vbCBpbml0aWFsaXplLCBVQm9vbCBtb3JlVG9Db21lKQoreworICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKKyAgaW50MzJfdCBpID0gMDsKKworICBpZihpbml0aWFsaXplKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiLy8gQ29sbGF0aW9uIGRhdGEgcmVzb3VyY2UgYnVuZGxlIGdlbmVyYXRlZCBmb3IgbG9jYWxlOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXG4vLyBGb3IgcGxhdGZvcm0gIik7CisgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgcmVzdWx0LmFwcGVuZCgiIHJlZmVyZW5jZSBwbGF0Zm9ybSAiKTsKKyAgICByZXN1bHQuYXBwZW5kKHJlZmVyZW5jZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXG5cblxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgLyoKKyAgICBpZihwbGF0Zm9ybSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgfQorICAgIGlmKHJlZmVyZW5jZSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiX3ZzXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChyZWZlcmVuY2UpOworICAgIH0KKyAgICAqLworICAgIHJlc3VsdC5hcHBlbmQoIiB7XG4iKTsKKworICAgIHJlc3VsdC5hcHBlbmQoIiAgY29sbGF0aW9ucyB7XG4gICBzdGFuZGFyZCB7XG4gICAgU2VxdWVuY2Uge1xuIik7CisgIH0KKworICBpZihmcmVuY2hTZWNvbmRhcnkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCJbYmFja3dhcmRzIDJdXG4iKTsKKyAgfQorICBpZih1cHBlckZpcnN0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiW2Nhc2VmaXJzdCB1cHBlcl1cbiIpOworICB9CisKKyAgTGluZSAqbGluZSA9IHRvU29ydFswXTsKKworICBpID0gMDsKKyAgd2hpbGUoKGkgPCBzaXplICYmICF1c2VMaW5rcykgfHwgKGxpbmUtPm5leHQgJiYgdXNlTGlua3MpKSB7CisgICAgaWYobGluZS0+aXNSZXNldCB8fCAhbGluZS0+aXNSZW1vdmVkKSB7CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnRvQnVuZGxlU3RyaW5nKCkpOworICAgIH0KKyAgICBpKys7CisgICAgaWYodXNlTGlua3MpIHsKKyAgICAgIGxpbmUgPSBsaW5lLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gdG9Tb3J0W2ldOworICAgIH0KKyAgfQorCisgIGlmKCFtb3JlVG9Db21lKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgIH1cbiAgIH1cbiAgfVxufVxuIik7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKK2ludDMyX3QgCitTb3J0ZWRMaW5lczo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlcGVydG9pcmUuc2l6ZSgpOworfQorCit2b2lkCitTb3J0ZWRMaW5lczo6cmVkdWNlRGlmZmVyZW5jZShTb3J0ZWRMaW5lcyYgcmVmZXJlbmNlKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBpZih1cHBlckZpcnN0KSB7CisgICAgc3dhcENhc2UoKTsKKyAgfQorICAvLyBib3RoIHNvcnRlZCBsaW5lcyBzdHJ1Y3R1cmVzIG5lZWQgdG8gaGF2ZSBlc3RhYmxpc2hlZCBsaW5rcyBhbmQgc3RyZW5ndGhzCisgIC8vIFdlIHdhbGsgZG93biBib3RoIHN0cnVjdHVyZXMgYW5kIG5vdGUgZGlmZmVyZW5jZXMuIFRoZXNlCisgIC8vIGRpZmZlcmVuY2VzIHdpbGwgbW9kaWZ5IHRoaXMgYnkgcmVtb3ZuZyBlbGVtZW50cywgc2V0dGluZyByZXNldHMKKyAgLy8gZXRjLi4uCisgIC8vIHdlIHdpbGwgcHJlZmVyIGluc2VydGlvbnMgZnJvbSB0YWlsb3JpbmcgdG8gcmVmZXJlbmNlLCB0aGVuIGRlbGV0aW9ucworICAvLyB0aGVyZSBhcmUgdHdvIHRhYmxlcyB0aGF0IGtlZXAgc2VlbiBlbGVtZW50cy4KKyAgSGFzaHRhYmxlICpzZWVuVGhpcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgSGFzaHRhYmxlICpzZWVuUmVmZXJlbmNlID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgVUJvb2wgZm91bmQgPSBGQUxTRTsKKyAgVUJvb2wgZmluaXNoZWQgPSBGQUxTRTsKKyAgY29uc3QgaW50MzJfdCBsb29rRm9yd2FyZCA9IDIwOworICBpbnQzMl90IHRhaWxvcmluZ01vdmUgPSAwOworICAvL2ludDMyX3QgcmVmZXJlbmNlU2l6ZSA9IHJlZmVyZW5jZS5nZXRTaXplKCk7CisgIExpbmUgKnJlZkxpbmUgPSByZWZlcmVuY2UuZ2V0Rmlyc3QoKTsKKyAgTGluZSAqcmVmTGF0ZXN0RXF1YWwgPSByZWZMaW5lOworICByZWZMaW5lID0gcmVmTGluZS0+bmV4dDsKKyAgTGluZSAqbXlMaW5lID0gZ2V0Rmlyc3QoKTsKKyAgTGluZSAqbXlMYXRlc3RFcXVhbCA9IG15TGluZTsKKyAgbXlMYXRlc3RFcXVhbC0+aXNSZW1vdmVkID0gVFJVRTsKKyAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICB3aGlsZShteUxpbmUgJiYgcmVmTGluZSkgeworICAgIGZvdW5kID0gRkFMU0U7CisgICAgd2hpbGUobXlMaW5lICYmIHJlZkxpbmUgJiYgbXlMaW5lLT5lcXVhbHMoKnJlZkxpbmUpKSB7CisgICAgICBteUxhdGVzdEVxdWFsID0gbXlMaW5lOworICAgICAgbXlMYXRlc3RFcXVhbC0+aXNSZW1vdmVkID0gVFJVRTsKKyAgICAgIG15TGluZSA9IG15TGluZS0+bmV4dDsKKyAgICAgIHJlZkxhdGVzdEVxdWFsID0gcmVmTGluZTsKKyAgICAgIHJlZkxpbmUgPSByZWZMaW5lLT5uZXh0OworICAgICAgaWYocmVmTGluZSA9PSBOVUxMICYmIG15TGluZSA9PSBOVUxMKSB7CisgICAgICAgIGZpbmlzaGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYobXlMaW5lKSB7CisgICAgICBteUxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCA9IG15TGluZS0+c3RyZW5ndGg7ICAKKyAgICB9CisgICAgaWYocmVmTGluZSkgeworICAgICAgcmVmTGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoID0gcmVmTGluZS0+c3RyZW5ndGg7CisgICAgfQorIAorICAgIC8vIGhlcmUgaXMgdGhlIGRpZmZlcmVuY2UKKyAgICB3aGlsZSghZm91bmQgJiYgIWZpbmlzaGVkKSB7CisgICAgICB0YWlsb3JpbmdNb3ZlID0gMDsKKyAgICAgIGlmKG15TGluZSAmJiByZWZMaW5lKSB7CisgICAgICAgIGlmKG15TGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoID4gcmVmTGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoKSB7IAorICAgICAgICAgIC8vIHRhaWxvcmluZyB6IDw8PCB4LCBVQ0EgeiA8IHkKKyAgICAgICAgICB3aGlsZShteUxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCA+IHJlZkxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCkgeworICAgICAgICAgICAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICAgICAgICAgICAgaWYobXlMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKG15TGluZS0+cHJldmlvdXMsIG15TGluZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihteUxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCA8IHJlZkxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCkgeyAgCisgICAgICAgICAgLy8gdGFpbG9yaW5nIHogPCB4LCBVQ0EgeiA8PDwgeQorICAgICAgICAgIHdoaWxlKG15TGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoIDwgcmVmTGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoKSB7CisgICAgICAgICAgICBzZWVuUmVmZXJlbmNlLT5wdXQoVW5pY29kZVN0cmluZyhyZWZMaW5lLT5uYW1lLCByZWZMaW5lLT5sZW4pLCByZWZMaW5lLCBzdGF0dXMpOworICAgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgICBpZihyZWZMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKHJlZkxpbmUtPnByZXZpb3VzLCByZWZMaW5lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0aGlzIGlzIHRoZSBpbnRlcmVzdGluZyBwb2ludC4gTm93IHdlIHNlYXJjaCBmb3IgY2hhcmFjdGVyIG1hdGNoCisgICAgICAgIHdoaWxlKG15TGluZSAmJiByZWZMaW5lICYmICghbXlMaW5lLT5lcXVhbHMoKnJlZkxpbmUpIHx8IG15TGluZS0+c3RyZW5ndGggPT0gVUNPTF9JREVOVElDQUwpCisgICAgICAgICAgJiYgdGFpbG9yaW5nTW92ZSA8IGxvb2tGb3J3YXJkKSB7CisgICAgICAgICAgaWYoc2VlblRoaXMtPmdldChVbmljb2RlU3RyaW5nKHJlZkxpbmUtPm5hbWUsIHJlZkxpbmUtPmxlbikpKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gc3R1ZmYgZnJvbSB0aGUgcmVmZXJlbmNlIHRoYXQgaXMgYWxyZWFkeSBhY2NvdW50ZWQKKyAgICAgICAgICAgIC8vIGZvciBpbiB0aGUgdGFpbG9yaW5nLgorICAgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgICBpZihyZWZMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKHJlZkxpbmUtPnByZXZpb3VzLCByZWZMaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICAgICAgICAgICAgaWYobXlMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKG15TGluZS0+cHJldmlvdXMsIG15TGluZSk7CisgICAgICAgICAgICAgIGlmKCFzZWVuUmVmZXJlbmNlLT5nZXQoVW5pY29kZVN0cmluZyhteUxpbmUtPm5hbWUsIG15TGluZS0+bGVuKSkpIHsKKyAgICAgICAgICAgICAgICB0YWlsb3JpbmdNb3ZlKys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmKHJlZkxpbmUgPT0gTlVMTCkgeyAvLyByYW4gb3V0IG9mIHJlZmVyZW5jZQorICAgICAgICAvLyB0aGlzIGlzIHRoZSB0YWlsIG9mIHRhaWxvcmluZyAtIHRoZSBsYXN0IGluc2VydGlvbgorICAgICAgICBteUxpbmUgID0gTlVMTDsKKyAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgfSBlbHNlIGlmKHRhaWxvcmluZ01vdmUgPT0gbG9va0ZvcndhcmQgfHwgbXlMaW5lID09IE5VTEwpIHsgLy8gcnVuIG92ZXIgdHJlc2hvbGQgb3Igb3V0IG9mIHRhaWxvcmluZworICAgICAgICB0YWlsb3JpbmdNb3ZlID0gMDsKKyAgICAgICAgLy8gd2UgZGlkbid0IGZpbmQgaW5zZXJ0aW9uIGFmdGVyIGFsbAorICAgICAgICAvLyB3ZSB3aWxsIHRyeSBzdWJzdGl0dXRpb24gbmV4dAorICAgICAgICAvLyByZXNldCB0aGUgdGFpbG9yaW5nIHBvaW50ZXIKKyAgICAgICAgbXlMaW5lID0gbXlMYXRlc3RFcXVhbC0+bmV4dDsKKyAgICAgICAgLy8gbW92ZSB0aGUgcmVmZXJlbmNlCisgICAgICAgIHJlZkxpbmUgPSByZWZMaW5lLT5uZXh0OworICAgICAgICBpZihyZWZMaW5lKSB7CisgICAgICAgICAgdHJhbnNmZXJDdW11bGF0aXZlU3RyZW5ndGgocmVmTGluZS0+cHJldmlvdXMsIHJlZkxpbmUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvLyB3ZSBmb3VuZCBhbiBpbnNlcnRpb24KKyAgICAgICAgdGFpbG9yaW5nTW92ZSA9IDA7CisgICAgICAgIGlmKG15TGluZS0+c3RyZW5ndGggIT0gcmVmTGluZS0+c3RyZW5ndGgpIHsKKyAgICAgICAgICB3aGlsZShteUxpbmUgJiYgcmVmTGluZSAmJiAqbXlMaW5lID09ICpyZWZMaW5lIAorICAgICAgICAgICAgJiYgKG15TGluZS0+c3RyZW5ndGggIT0gcmVmTGluZS0+c3RyZW5ndGggCisgICAgICAgICAgICB8fCBteUxpbmUtPnN0cmVuZ3RoID09IFVDT0xfSURFTlRJQ0FMKSkgeworICAgICAgICAgICAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICAgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCpteUxpbmUgIT0gKnJlZkxpbmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihteUxpbmUgJiYgcmVmTGluZSAmJiBteUxpbmUtPnByZXZpb3VzLT5zdHJlbmd0aCA8IG15TGluZS0+c3RyZW5ndGgpIHsKKyAgICAgICAgICBteUxpbmUgPSBteUxpbmUtPm5leHQ7CisgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgaWYoKm15TGluZSAhPSAqcmVmTGluZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmKGZvdW5kKSB7CisgICAgICAgIGlmKG15TGF0ZXN0RXF1YWwtPm5leHQgIT0gbXlMaW5lIHx8IHJlZkxpbmUgPT0gTlVMTCkgeworICAgICAgICAgIExpbmUgKm15U3RhcnQgPSBOVUxMOworICAgICAgICAgIC8vIHRoaXMgaXMgYSByZXNldCBhbmQgYSBzZXF1ZW5jZQorICAgICAgICAgIC8vIG15TGF0ZXN0RXF1YWwgcG9pbnRzIGF0IHRoZSBsYXN0IHBvaW50IHRoYXQgd2FzIHRoZSBzYW1lCisgICAgICAgICAgLy8gVGhpcyBwb2ludCB3aWxsIGJlIGEgcmVzZXQKKyAgICAgICAgICBpZihteUxpbmUgJiYgcmVmTGluZSkgeyAvLyBpZiB0aGVyZSBpcyBhbnl0aGluZyBtb3JlIHRvIGRvIC0gaXQgbWlnaHQgYmUgd29ydGggc2F2aW5nIGl0CisgICAgICAgICAgICBteVN0YXJ0ID0gbXlMYXRlc3RFcXVhbDsKKyAgICAgICAgICAgIHdoaWxlKG15U3RhcnQgIT0gbXlMaW5lKSB7CisgICAgICAgICAgICAgIHNlZW5UaGlzLT5wdXQoVW5pY29kZVN0cmluZyhteVN0YXJ0LT5uYW1lLCBteVN0YXJ0LT5sZW4pLCBteVN0YXJ0LCBzdGF0dXMpOworICAgICAgICAgICAgICBteVN0YXJ0ID0gbXlTdGFydC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLy8gVHJ5IHRvIHdlZWQgb3V0IHN0dWZmIHRoYXQgaXMgbm90IGFmZmVjdGVkLCBsaWtlOgorICAgICAgICAgIC8vIFRhaWxvcmluZzoKKyAgICAgICAgICAvLyA8PDxTPDxcdTAxN0Y8XHUwMTYxPDw8XHUwMTYwPHQKKyAgICAgICAgICAvLyBVQ0E6CisgICAgICAgICAgLy8gPDw8Uzw8XHUwMTYxPDw8XHUwMTYwPDxcdTAxN0Y8dAorICAgICAgICAgIC8vIFJlc3VsdDoKKyAgICAgICAgICAvLyAmUzw8XHUwMTdGPFx1MDE2MTw8PFx1MDE2MAorICAgICAgICAgIC8vIHdlIGhhdmUgYSBzZXF1ZW5jZSB0aGF0IHNwYW5zIGZyb20gbXlMYXRlc3RFcXVhbCB0byBteUxpbmUgKHRoYXQgb25lIGNvdWxkIGJlIE5VTEwsIAorICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gZ28gZG93biBmcm9tIG15TGF0ZXN0RXF1YWwuIAorICAgICAgICAgIC8vIEJhc2ljYWxseSwgZm9yIGV2ZXJ5IGVsZW1lbnQsIHdlIHdhbnQgdG8gc2VlIHRoZSBzdHJvbmdlc3QgY3VtdWxhdGl2ZSBkaWZmZXJlbmNlIAorICAgICAgICAgIC8vIGZyb20gdGhlIHJlc2V0IHBvaW50LiBJZiB0aGUgY3VtdWxhdGl2ZSBkaWZmZXJlbmNlIGlzIHRoZSBzYW1lIGluIGJvdGggdGhlIHJlZmVyZW5jZSBhbmQKKyAgICAgICAgICAvLyB0YWlsb3JpbmcsIHRoYXQgZWxlbWVudCBjb3VsZCBiZSByZW1vdmVkLgorICAgICAgICAgIGNhbGN1bGF0ZUN1bXVsYXRpdmVTdHJlbmd0aHMobXlMYXRlc3RFcXVhbCwgbXlMaW5lKTsKKyAgICAgICAgICBjYWxjdWxhdGVDdW11bGF0aXZlU3RyZW5ndGhzKHJlZkxhdGVzdEVxdWFsLCByZWZMaW5lKTsKKyAgICAgICAgICBteVN0YXJ0ID0gbXlMYXRlc3RFcXVhbDsKKyAgICAgICAgICBpbnQzMl90IHJlbW92ZWQgPSAwOworICAgICAgICAgIGludDMyX3QgdHJhdmVyc2VkID0gMDsKKyAgICAgICAgICB3aGlsZShteVN0YXJ0ICYmIG15U3RhcnQgIT0gbXlMaW5lKSB7CisgICAgICAgICAgICBMaW5lICpyZWZTdGFydCA9IHJlZkxhdGVzdEVxdWFsOworICAgICAgICAgICAgd2hpbGUocmVmU3RhcnQgJiYgcmVmU3RhcnQgIT0gcmVmTGluZSkgeworICAgICAgICAgICAgICBpZigqbXlTdGFydCA9PSAqcmVmU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZihteVN0YXJ0LT5jdW11bGF0aXZlU3RyZW5ndGggPT0gcmVmU3RhcnQtPmN1bXVsYXRpdmVTdHJlbmd0aCkgeworICAgICAgICAgICAgICAgICAgbXlTdGFydC0+aXNSZW1vdmVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIHJlbW92ZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmVmU3RhcnQgPSByZWZTdGFydC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG15U3RhcnQgPSBteVN0YXJ0LT5uZXh0OworICAgICAgICAgICAgdHJhdmVyc2VkKys7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKHJlbW92ZWQgPCB0cmF2ZXJzZWQpIHsKKyAgICAgICAgICAgIG15TGF0ZXN0RXF1YWwtPmlzUmVzZXQgPSBUUlVFOworICAgICAgICAgICAgbXlMYXRlc3RFcXVhbC0+aXNSZW1vdmVkID0gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgICAgbXlMYXRlc3RFcXVhbCA9IG15TGluZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmKHVwcGVyRmlyc3QpIHsKKyAgICAvL3N3YXBDYXNlKCk7CisgIH0KKworICBkZWxldGUgc2VlblRoaXM7CisgIGRlbGV0ZSBzZWVuUmVmZXJlbmNlOworCit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjp0cmFuc2ZlckN1bXVsYXRpdmVTdHJlbmd0aChMaW5lICpwcmV2aW91cywgTGluZSAqdGhhdCkgeworICBpZih0aGF0LT5zdHJlbmd0aCA+IHByZXZpb3VzLT5jdW11bGF0aXZlU3RyZW5ndGgpIHsKKyAgICB0aGF0LT5jdW11bGF0aXZlU3RyZW5ndGggPSBwcmV2aW91cy0+Y3VtdWxhdGl2ZVN0cmVuZ3RoOworICB9IGVsc2UgeworICAgIHRoYXQtPmN1bXVsYXRpdmVTdHJlbmd0aCA9IHRoYXQtPnN0cmVuZ3RoOworICB9Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpjYWxjdWxhdGVDdW11bGF0aXZlU3RyZW5ndGhzKExpbmUgKnN0YXJ0LCBMaW5lICplbmQpIHsKKyAgLy8gc3RhcnQgaXMgYSByZXNldCAtIGVuZCBtYXkgYmUgTlVMTAorICBzdGFydCA9IHN0YXJ0LT5uZXh0OworICBVQ29sQXR0cmlidXRlVmFsdWUgY3VtdWxhdGl2ZVN0cmVuZ3RoID0gVUNPTF9PRkY7CisgIHdoaWxlKHN0YXJ0ICYmIHN0YXJ0ICE9IGVuZCkgeworICAgIGlmKHN0YXJ0LT5zdHJlbmd0aCA8IGN1bXVsYXRpdmVTdHJlbmd0aCkgeworICAgICAgY3VtdWxhdGl2ZVN0cmVuZ3RoID0gc3RhcnQtPnN0cmVuZ3RoOworICAgIH0KKyAgICBzdGFydC0+Y3VtdWxhdGl2ZVN0cmVuZ3RoID0gY3VtdWxhdGl2ZVN0cmVuZ3RoOworICAgIHN0YXJ0ID0gc3RhcnQtPm5leHQ7CisgIH0KK30KKworCit2b2lkIAorU29ydGVkTGluZXM6OmdldFJlcGVydG9pcmUoVW5pY29kZVNldCAmZmlsbEluKSB7CisgIGZpbGxJbi5jbGVhcigpOworICBmaWxsSW4uYWRkQWxsKHJlcGVydG9pcmUpOworfQorCisKK3ZvaWQKK1NvcnRlZExpbmVzOjpyZW1vdmVEZWNvbXBvc2l0aW9uc0Zyb21SZXBlcnRvaXJlKCkgeworICBVbmljb2RlU2V0SXRlcmF0b3IgcmVwZXJ0b2lyZUl0ZXIocmVwZXJ0b2lyZSk7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVQ2hhciBzdHJpbmdbMjU2XTsKKyAgVUNoYXIgY29tcG9zZWRbMjU2XTsKKyAgaW50MzJfdCBsZW4gPSAwLCBjb21wTGVuID0gMDsKKyAgVW5pY29kZVN0cmluZyBjb21wU3RyaW5nOworICBVbmljb2RlU2V0IHRvUmVtb3ZlOworCisgIHdoaWxlKHJlcGVydG9pcmVJdGVyLm5leHQoKSkgeworICAgIGxlbiA9IDA7CisgICAgaWYocmVwZXJ0b2lyZUl0ZXIuaXNTdHJpbmcoKSkgeyAvLyBwcm9jZXNzIGEgc3RyaW5nCisgICAgICBsZW4gPSByZXBlcnRvaXJlSXRlci5nZXRTdHJpbmcoKS5sZW5ndGgoKTsKKyAgICAgIHVfbWVtY3B5KHN0cmluZywgcmVwZXJ0b2lyZUl0ZXIuZ2V0U3RyaW5nKCkuZ2V0QnVmZmVyKCksIGxlbik7CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBVQm9vbCBpc0Vycm9yID0gRkFMU0U7CisgICAgICBVMTZfQVBQRU5EKHN0cmluZywgbGVuLCAyNSwgcmVwZXJ0b2lyZUl0ZXIuZ2V0Q29kZXBvaW50KCksIGlzRXJyb3IpOworICAgIH0KKyAgICBzdHJpbmdbbGVuXSA9IDA7IC8vIHplcm8gdGVybWluYXRlLCBmb3Igb3VyIGV2aWwgd2F5cworICAgIGNvbXBMZW4gPSB1bm9ybV9ub3JtYWxpemUoc3RyaW5nLCBsZW4sIFVOT1JNX05GQywgMCwgY29tcG9zZWQsIDI1NiwgJnN0YXR1cyk7CisgICAgaWYoY29tcExlbiAhPSBsZW4gfHwgdV9zdHJjbXAoc3RyaW5nLCBjb21wb3NlZCkgIT0gMCkgeworICAgICAgY29tcFN0cmluZy5zZXRUbyhjb21wb3NlZCwgY29tcExlbik7CisgICAgICBpZihyZXBlcnRvaXJlLmNvbnRhaW5zKGNvbXBTdHJpbmcpKSB7CisgICAgICAgIHRvUmVtb3ZlLmFkZChVbmljb2RlU3RyaW5nKHN0cmluZywgbGVuKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGRlYnVnLT5sb2coIlxuUmVtb3ZpbmdcbiIpOworICBkZWJ1Zy0+bG9nKHRvUmVtb3ZlLnRvUGF0dGVybihjb21wU3RyaW5nLCBUUlVFKSwgVFJVRSk7CisgIHJlcGVydG9pcmUucmVtb3ZlQWxsKHRvUmVtb3ZlKTsKK30KKworCit2b2lkCitTb3J0ZWRMaW5lczo6c3dhcENhc2UoKSAKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgdG9Tb3J0W2ldLT5zd2FwQ2FzZSgpOworICB9Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpjYWxjdWxhdGVTb3J0S2V5KExpbmUgJmxpbmUpIAoreworICBpZighc29ydGtleXMpIHsKKyAgICBzb3J0a2V5cyA9IG5ldyB1aW50OF90W3NpemUqMTAyNF07CisgICAgbWVtc2V0KHNvcnRrZXlzLCAwLCBzaXplKjEwMjQpOworICB9CisgIGxpbmUuc29ydEtleSA9IHNvcnRrZXlzK3NvcnRrZXlPZmZzZXQ7CisgIHNvcnRrZXlPZmZzZXQgKz0gcHJvYmUuZ2V0U29ydEtleShsaW5lLCBzb3J0a2V5cytzb3J0a2V5T2Zmc2V0LCBzaXplKjI1Ni1zb3J0a2V5T2Zmc2V0KTsKK30KKworCit2b2lkIAorU29ydGVkTGluZXM6OmNhbGN1bGF0ZVNvcnRLZXlzKCkKK3sKKyAgaWYoc29ydGtleXMpIHsKKyAgICBkZWxldGVbXSBzb3J0a2V5czsKKyAgfQorICBzb3J0a2V5T2Zmc2V0ID0gMDsKKyAgc29ydGtleXMgPSBuZXcgdWludDhfdFtzaXplKjI1Nl07CisgIG1lbXNldChzb3J0a2V5cywgMCwgc2l6ZSoyNTYpOworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBjYWxjdWxhdGVTb3J0S2V5KCp0b1NvcnRbaV0pOworICB9Cit9CmRpZmYgLS1naXQgYS9jb2xwcm9iZS9zb3J0ZWRsaW5lcy5oIGIvY29scHJvYmUvc29ydGVkbGluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjM3MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvc29ydGVkbGluZXMuaApAQCAtMCwwICsxLDEyMCBAQAorI2lmbmRlZiBDT0xQUk9CRV9TT1JURURMSU5FU19ICisjZGVmaW5lIENPTFBST0JFX1NPUlRFRExJTkVTX0gKKworLy8gY29scHJvYmUgaW5jbHVkZXMKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorI2luY2x1ZGUgImxpbmUuaCIKKyNpbmNsdWRlICJ1cHJpbnRlci5oIgorI2luY2x1ZGUgInN0cmVuZ3RocHJvYmUuaCIKKworCisvLyBJQ1UgaW5jbHVkZXMKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXNldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldGl0ZXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzY3JpcHQuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisKK2NsYXNzIFNvcnRlZExpbmVzIHsKKyAgTGluZSBlbXB0eTsKKyAgTGluZSAqVUJbVUNPTF9PRkZdOworICBVbmljb2RlU2V0IGlnbm9yYWJsZXNbVUNPTF9PRkZdOworCisgIExpbmUgKip0b1NvcnQ7CisgIGludDMyX3QgdG9Tb3J0Q2FwYWNpdHk7CisgIExpbmUgKmxpbmVzOworICBpbnQzMl90IHNpemU7CisgIGludDMyX3QgY2FwYWNpdHk7CisKKyAgVW5pY29kZVNldCByZXBlcnRvaXJlOworICBVbmljb2RlU2V0IGV4Y2x1ZGVCb3VuZHM7CisKKyAgU3RyZW5ndGhQcm9iZSBwcm9iZTsKKworICBMaW5lICpmaXJzdDsKKyAgTGluZSAqbGFzdDsKKyAgTGluZSAqY3VycmVudDsKKyAgU29ydGVkTGluZXMoKSB7fTsKKworICBVUHJpbnRlciAqbG9nZ2VyOworICBVUHJpbnRlciAqZGVidWc7CisKKyAgSGFzaHRhYmxlICpjb250cmFjdGlvbnNUYWJsZTsKKyAgSGFzaHRhYmxlICpkdXBsaWNhdG9yczsgLy8gZWxlbWVudHMgdGhhdCBkdXBsaWNhdGUgcHJlY2VkaW5nIGNoYXJhY3RlcnMKKyAgaW50MzJfdCBtYXhFeHBhbnNpb25QcmVmaXhTaXplOworCisgIC8vIFByb3BlcnRpZXMgb2YgdGhlIHNvcnQKKyAgVUJvb2wgd29yZFNvcnQ7CisgIFVCb29sIGZyZW5jaFNlY29uZGFyeTsKKyAgVUJvb2wgdXBwZXJGaXJzdDsKKworICB1aW50OF90ICpzb3J0a2V5czsKKyAgaW50MzJfdCBzb3J0a2V5T2Zmc2V0OworcHVibGljOgorICBTb3J0ZWRMaW5lcyhjb25zdCBVbmljb2RlU2V0ICZzZXQsIGNvbnN0IFVuaWNvZGVTZXQgJmV4Y2x1ZGVCb3VuZHMsIGNvbnN0IFN0cmVuZ3RoUHJvYmUgJnByb2JlLCBVUHJpbnRlciAqbG9nZ2VyLCBVUHJpbnRlciAqZGVidWcpOworICBTb3J0ZWRMaW5lcyhGSUxFICpmaWxlLCBVUHJpbnRlciAqbG9nZ2VyLCBVUHJpbnRlciAqZGVidWcsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIH5Tb3J0ZWRMaW5lcygpOworICB2b2lkIGFuYWx5c2UoVUVycm9yQ29kZSAmc3RhdHVzKTsKKworICB2b2lkIHNvcnQoVUJvb2wgc2V0U3RyZW5ndGhzID0gVFJVRSwgVUJvb2wgbGluayA9IEZBTFNFKTsKKyAgdm9pZCBzb3J0KExpbmUgKipzb3J0aW5nQXJyYXksIGludDMyX3Qgc2l6ZVRvU29ydCwgVUJvb2wgc2V0U3RyZW5ndGhzID0gVFJVRSwgVUJvb2wgbGluayA9IEZBTFNFKTsKKworICBMaW5lICpnZXRGaXJzdCgpOworICBMaW5lICpnZXRMYXN0KCk7CisgIHZvaWQgYWRkKExpbmUgKmxpbmUsIFVCb29sIGxpbmtJbiA9IEZBTFNFKTsKKyAgdm9pZCBpbnNlcnQoTGluZSAqbGluZSwgaW50MzJfdCBpbmRleCk7CisgIExpbmUgKmdldE5leHQoKTsKKyAgTGluZSAqZ2V0UHJldmlvdXMoKTsKKyAgTGluZSAqb3BlcmF0b3JbXShpbnQzMl90IGluZGV4KTsKKyAgaW50MzJfdCBhZGRDb250cmFjdGlvbnNUb1JlcGVydG9pcmUoVUVycm9yQ29kZSAmc3RhdHVzKTsKKworICBpbnQzMl90IGdldFNpemUoKSBjb25zdDsKKworICBpbnQzMl90IGRldGVjdEV4cGFuc2lvbnMoKTsKKyAgCisgIFVuaWNvZGVTdHJpbmcgdG9TdHJpbmcoVUJvb2wgdXNlTGlua3MgPSBGQUxTRSk7CisgIFVuaWNvZGVTdHJpbmcgdG9TdHJpbmdGcm9tRW1wdHkoKTsKKyAgVW5pY29kZVN0cmluZyB0b1ByZXR0eVN0cmluZyhVQm9vbCB1c2VMaW5rcywgVUJvb2wgcHJpbnRTb3J0S2V5cyA9IEZBTFNFKTsKKyAgVW5pY29kZVN0cmluZyB0b091dHB1dChjb25zdCBjaGFyICpmb3JtYXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpOworICBVbmljb2RlU3RyaW5nIHRvQnVuZGxlKGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpOworICBVbmljb2RlU3RyaW5nIHRvSFRNTChjb25zdCBjaGFyICpsb2NhbGUsIGNvbnN0IGNoYXIgKnBsYXRmb3JtLCBjb25zdCBjaGFyICpyZWZlcmVuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCB1c2VMaW5rcywgVUJvb2wgaW5pdGlhbGl6ZSwgVUJvb2wgbW9yZVRvQ29tZSk7CisgIFVuaWNvZGVTdHJpbmcgdG9YTUwoY29uc3QgY2hhciAqbG9jYWxlLCBjb25zdCBjaGFyICpwbGF0Zm9ybSwgY29uc3QgY2hhciAqcmVmZXJlbmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpOworICBVbmljb2RlU3RyaW5nIGFycmF5VG9TdHJpbmcoTGluZSoqIHNvcnRlZExpbmVzLCBpbnQzMl90IGxpbmVzU2l6ZSwgVUJvb2wgcHJldHR5LCBVQm9vbCB1c2VMaW5rcywgVUJvb2wgcHJpbnRTb3J0S2V5cyk7CisgIHZvaWQgc2V0U29ydGluZ0FycmF5KExpbmUgKipzb3J0aW5nQXJyYXksIExpbmUgKmVsZW1lbnRzLCBpbnQzMl90IHNpemVUb1NvcnQpOworICBpbnQzMl90IHNldFNvcnRpbmdBcnJheShMaW5lICoqc29ydGluZ0FycmF5LCBIYXNodGFibGUgKnRhYmxlKTsKKworICB2b2lkIHJlZHVjZURpZmZlcmVuY2UoU29ydGVkTGluZXMmIHJlZmVyZW5jZSk7CisgIHZvaWQgZ2V0UmVwZXJ0b2lyZShVbmljb2RlU2V0ICZmaWxsSW4pOworICB2b2lkIHJlbW92ZURlY29tcG9zaXRpb25zRnJvbVJlcGVydG9pcmUoKTsKKyAgdm9pZCBnZXRCb3VuZHMoVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgdm9pZCBjbGFzc2lmeVJlcGVydG9pcmUoKTsKKyAgdm9pZCB0b0ZpbGUoRklMRSAqZmlsZSwgVUJvb2wgdXNlTGlua3MsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIHZvaWQgc3dhcENhc2UoKTsKKyAgdm9pZCBjYWxjdWxhdGVTb3J0S2V5cygpOworICB2b2lkIGNhbGN1bGF0ZVNvcnRLZXkoTGluZSAmbGluZSk7Citwcml2YXRlOgorICB2b2lkIGluaXQoKTsKKyAgdm9pZCBpbml0KFVuaWNvZGVTZXQgJnJlcCwgTGluZSAqbGluKTsKKyAgaW50MzJfdCBkZXRlY3RDb250cmFjdGlvbnMoTGluZSAqKmZpcnN0UmVwLCBpbnQzMl90IGZpcnN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lICoqc2Vjb25kUmVwLCBpbnQzMl90IHNlY29uZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZSAqdG9BZGRUbywgaW50MzJfdCAmdG9BZGRUb1NpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmUgKmxlc3NlclRvQWRkVG8sIGludDMyX3QgJmxlc3NlclRvQWRkVG9TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWNpdHksIFVFcnJvckNvZGUgJnN0YXR1cyk7CisKKyAgdm9pZCBjYWxjdWxhdGVDdW11bGF0aXZlU3RyZW5ndGhzKExpbmUgKnN0YXJ0LCBMaW5lICplbmQpOworICB2b2lkIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKExpbmUgKnByZXZpb3VzLCBMaW5lICp0aGF0KTsKKyAgdm9pZCB1cGRhdGVCb3VuZHMoVW5pY29kZVNldCAmc2V0KTsKKyAgdm9pZCBhZGRBbGwoTGluZSogdG9BZGQsIGludDMyX3QgdG9BZGRTaXplKTsKKyAgdm9pZCBzZXREaXN0YW5jZXNGcm9tRW1wdHkoTGluZSogYXJyYXksIGludDMyX3QgYXJyYXlTaXplKTsKKyAgdm9pZCBub3RlQ29udHJhY3Rpb24oY29uc3QgY2hhciogbXNnLCBMaW5lICp0b0FkZFRvLCBpbnQzMl90ICZ0b0FkZFRvU2l6ZSwgTGluZSAqbGVmdCwgTGluZSAqcmlnaHQsIGludDMyX3QgJm5vQ29udHMsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIGludDMyX3QgZ29vc2VVcChpbnQzMl90IHJlc2V0SW5kZXgsIGludDMyX3QgZXhwYW5zaW9uSW5kZXgsIExpbmUgJmV4cExpbmUsIGludDMyX3QgKmV4cEluZGV4ZXMsIGludDMyX3QgJmV4cEluZGV4U2l6ZSwgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoKTsKKyAgVUJvb2wgZ2V0RXhwYW5zaW9uTGluZShjb25zdCBMaW5lICZleHBhbnNpb24sIGNvbnN0IExpbmUgJnByZXZpb3VzLCBjb25zdCBMaW5lICZleHAsIExpbmUgJmV4cGFuc2lvbkxpbmUpOworCisKK307CisKKyNlbmRpZiAgLy8gI2lmbmRlZiBDT0xQUk9CRV9TT1JURURMSU5FU19ICmRpZmYgLS1naXQgYS9jb2xwcm9iZS9zdHJlbmd0aHByb2JlLmNwcCBiL2NvbHByb2JlL3N0cmVuZ3RocHJvYmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTk0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9zdHJlbmd0aHByb2JlLmNwcApAQCAtMCwwICsxLDQwMiBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDMsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRmlsZSBsaW5lLmgKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwNy8wNy8yMDAzICB3ZWl2ICAgICAgICBDcmVhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8vCisvLyAgIGNsYXNzIExpbmUKKy8vCisvLyAgICAgIEVhY2ggbGluZSBmcm9tIHRoZSBzb3VyY2UgZmlsZSAoY29udGFpbmluZyBhIG5hbWUsIHByZXN1bWFibHkpIGdldHMKKy8vICAgICAgb25lIG9mIHRoZXNlIHN0cnVjdHMuCisvLworCisjaW5jbHVkZSAic3RyZW5ndGhwcm9iZS5oIgorCitTdHJlbmd0aFByb2JlOjpTdHJlbmd0aFByb2JlKENvbXBhcmVGbiBjb21wYXJlciwgR2V0U29ydEtleUZuIGdldHRlciwgVUNoYXIgU0UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBCMCwgVUNoYXIgQjEsIFVDaGFyIEIyLCBVQ2hhciBCMykgOgorU0UoU0UpLAorQjAoQjApLCBCMShCMSksIEIyKEIyKSwgQjMoQjMpLAordXRpbEZpcnN0UCgmdXRpbEZpcnN0KSwgdXRpbFNlY29uZFAoJnV0aWxTZWNvbmQpLAorZnJlbmNoU2Vjb25kYXJ5KEZBTFNFKSwKK2NvbXBhcmVyKGNvbXBhcmVyKSwgc2tnZXR0ZXIoZ2V0dGVyKQoreworfQorCitpbnQKK1N0cmVuZ3RoUHJvYmU6OnNldFByb2JlQ2hhcnMoVUNoYXIgQjAsIFVDaGFyIEIxLCBVQ2hhciBCMiwgVUNoYXIgQjMpCit7CisgIHRoaXMtPkIwID0gQjA7CisgIHRoaXMtPkIxID0gQjE7CisgIHRoaXMtPkIyID0gQjI7CisgIHRoaXMtPgorQjMgPSBCMzsKKyAgcmV0dXJuIGNoZWNrU2FuaXR5KCk7Cit9CisKK2ludAorU3RyZW5ndGhQcm9iZTo6Y2hlY2tTYW5pdHkoKSAKK3sKKyAgaW50IHNhbml0eVJlczsKKyAgdXRpbEZpcnN0LnNldFRvKEIwKTsKKyAgdXRpbFNlY29uZC5zZXRUbyhCMyk7CisgIGlmKChzYW5pdHlSZXMgPSBjb21wYXJlcigmdXRpbEZpcnN0UCwgJnV0aWxTZWNvbmRQKSkgPj0gMCkgeworICAgIHJldHVybiBzYW5pdHlSZXMqMTAgKyAzOworICB9CisgIHV0aWxTZWNvbmQuc2V0VG8oQjIpOworICBpZigoc2FuaXR5UmVzID0gY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkpID49IDApIHsKKyAgICByZXR1cm4gc2FuaXR5UmVzKjEwICsgMjsKKyAgfQorICB1dGlsU2Vjb25kLnNldFRvKEIxKTsKKyAgaWYoKHNhbml0eVJlcyA9IGNvbXBhcmVyKCZ1dGlsRmlyc3RQLCAmdXRpbFNlY29uZFApKSA+PSAwKSB7CisgICAgcmV0dXJuIHNhbml0eVJlcyoxMCArIDE7CisgIH0KKyAgdXRpbEZpcnN0LnNldFRvKEIzKTsKKyAgdXRpbFNlY29uZC5zZXRUbyhCMik7CisgIGlmKChzYW5pdHlSZXMgPSBjb21wYXJlcigmdXRpbEZpcnN0UCwgJnV0aWxTZWNvbmRQKSkgPj0gMCkgeworICAgIHJldHVybiBzYW5pdHlSZXMqMTAgKyA1OworICB9CisgIHV0aWxTZWNvbmQuc2V0VG8oQjEpOworICBpZigoc2FuaXR5UmVzID0gY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkpID49IDApIHsKKyAgICByZXR1cm4gc2FuaXR5UmVzKjEwICsgNDsKKyAgfQorICB1dGlsRmlyc3Quc2V0VG8oQjIpOworICBpZigoc2FuaXR5UmVzID0gY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkpID49IDApIHsKKyAgICByZXR1cm4gc2FuaXR5UmVzKjEwICsgNjsKKyAgfQorICB1dGlsRmlyc3Quc2V0VG8oQjApOworICBpZihkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh1dGlsRmlyc3QpID4gVUNPTF9QUklNQVJZKSB7CisgICAgcmV0dXJuIDEwMDA7CisgIH0KKyAgdXRpbEZpcnN0LnNldFRvKEIxKTsKKyAgaWYoZGlzdGFuY2VGcm9tRW1wdHlTdHJpbmcodXRpbEZpcnN0KSA+IFVDT0xfUFJJTUFSWSkgeworICAgIHJldHVybiAxMDAxOworICB9CisgIHV0aWxGaXJzdC5zZXRUbyhCMik7CisgIGlmKGRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKHV0aWxGaXJzdCkgPiBVQ09MX1BSSU1BUlkpIHsKKyAgICByZXR1cm4gMTAwMjsKKyAgfQorICB1dGlsRmlyc3Quc2V0VG8oQjMpOworICBpZihkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh1dGlsRmlyc3QpID4gVUNPTF9QUklNQVJZKSB7CisgICAgcmV0dXJuIDEwMDM7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK1VCb29sIAorU3RyZW5ndGhQcm9iZTo6cHJvYmVQcmVmaXgoY29uc3QgTGluZSAmeCwgY29uc3QgTGluZSAmeSwgVUNoYXIgZmlyc3QsIFVDaGFyIHNlY29uZCkgeworICB1dGlsRmlyc3QubmFtZVswXSA9IGZpcnN0OworICB1dGlsRmlyc3QubmFtZVsxXSA9IFNFOworICB1X3N0cmNweSh1dGlsRmlyc3QubmFtZSsyLCB4Lm5hbWUpOworICB1dGlsRmlyc3QubmFtZVt4LmxlbisyXSA9IDA7CisgIHV0aWxGaXJzdC5sZW4gPSB4LmxlbisyOworCisgIHV0aWxTZWNvbmQubmFtZVswXSA9IHNlY29uZDsKKyAgdXRpbFNlY29uZC5uYW1lWzFdID0gU0U7CisgIHVfc3RyY3B5KHV0aWxTZWNvbmQubmFtZSsyLCB5Lm5hbWUpOworICB1dGlsU2Vjb25kLm5hbWVbeS5sZW4rMl0gPSAwOworICB1dGlsU2Vjb25kLmxlbiA9IHkubGVuKzI7CisKKyAgaWYoY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VCb29sIAorU3RyZW5ndGhQcm9iZTo6cHJvYmVTdWZmaXgoY29uc3QgTGluZSAmeCwgY29uc3QgTGluZSAmeSwgVUNoYXIgZmlyc3QsIFVDaGFyIHNlY29uZCkgeworICB1X3N0cmNweSh1dGlsRmlyc3QubmFtZSwgeC5uYW1lKTsKKyAgdXRpbEZpcnN0Lm5hbWVbeC5sZW5dID0gU0U7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuKzFdID0gZmlyc3Q7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuKzJdID0gMDsKKyAgdXRpbEZpcnN0LmxlbiA9IHgubGVuICsgMjsKKyAgdV9zdHJjcHkodXRpbFNlY29uZC5uYW1lLCB5Lm5hbWUpOworICB1dGlsU2Vjb25kLm5hbWVbeS5sZW5dID0gU0U7CisgIHV0aWxTZWNvbmQubmFtZVt5LmxlbisxXSA9IHNlY29uZDsKKyAgdXRpbFNlY29uZC5uYW1lW3kubGVuKzJdID0gMDsKKyAgdXRpbFNlY29uZC5sZW4gPSB5LmxlbiArIDI7CisKKyAgaWYoY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VCb29sIAorU3RyZW5ndGhQcm9iZTo6cHJvYmVQcmVmaXhOb1NlcChjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5LCBVQ2hhciBmaXJzdCwgVUNoYXIgc2Vjb25kKSB7CisgIHV0aWxGaXJzdC5uYW1lWzBdID0gZmlyc3Q7CisgIHVfc3RyY3B5KHV0aWxGaXJzdC5uYW1lKzEsIHgubmFtZSk7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuKzFdID0gMDsKKyAgdXRpbEZpcnN0LmxlbiA9IHgubGVuICsgMTsKKworICB1dGlsU2Vjb25kLm5hbWVbMF0gPSBzZWNvbmQ7CisgIHVfc3RyY3B5KHV0aWxTZWNvbmQubmFtZSsxLCB5Lm5hbWUpOworICB1dGlsU2Vjb25kLm5hbWVbeS5sZW4rMV0gPSAwOworICB1dGlsU2Vjb25kLmxlbiA9IHkubGVuICsgMTsKKworICBpZihjb21wYXJlcigmdXRpbEZpcnN0UCwgJnV0aWxTZWNvbmRQKSA8IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworVUJvb2wgCitTdHJlbmd0aFByb2JlOjpwcm9iZVN1ZmZpeE5vU2VwKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpIHsKKyAgdV9zdHJjcHkodXRpbEZpcnN0Lm5hbWUsIHgubmFtZSk7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuXSA9IGZpcnN0OworICB1dGlsRmlyc3QubmFtZVt4LmxlbisxXSA9IDA7CisgIHV0aWxGaXJzdC5sZW4gPSB4LmxlbiArIDE7CisgIHVfc3RyY3B5KHV0aWxTZWNvbmQubmFtZSwgeS5uYW1lKTsKKyAgdXRpbFNlY29uZC5uYW1lW3kubGVuXSA9IHNlY29uZDsKKyAgdXRpbFNlY29uZC5uYW1lW3kubGVuKzFdID0gMDsKKyAgdXRpbFNlY29uZC5sZW4gPSB5LmxlbiArIDE7CisKKyAgaWYoY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK1N0cmVuZ3RoUHJvYmU6OmdldFN0cmVuZ3RoKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnkpIHsKKyAgY29uc3QgTGluZSAqeHAgPSAmeDsKKyAgY29uc3QgTGluZSAqeXAgPSAmeTsKKworICBMaW5lIGVtcHR5OworICBMaW5lICplbXB0eVAgPSAmZW1wdHk7CisgIGlmKGNvbXBhcmVyKCZlbXB0eVAsICZ4cCkgPT0gMCkgeworICAgIHJldHVybiBkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh5KTsKKyAgfQorCisgIGludDMyX3QgcmVzdWx0ID0gY29tcGFyZXIoJnhwLCAmeXApOworCisgIGlmKHJlc3VsdCA9PSAwKSB7CisgICAgcmV0dXJuIFVDT0xfSURFTlRJQ0FMOworICB9IGVsc2UgaWYocmVzdWx0ID4gMCkgeworICAgIHJldHVybiBVQ09MX09GRjsgLy8gYmFkIHNpdHVhdGlvbgorICB9IGVsc2UgeyAvLyB3ZSBuZWVkIHRvIHByb2JlIHN0cmVuZ3RoCisgICAgaWYocHJvYmVTdWZmaXgoeCwgeSwgQjEsIEIwKSkgeworICAgIC8vaWYocHJvYmVQcmVmaXgoeCwgeSwgQjIsIEIwKSkgeyAvLyBzd2FtcHMgc2Vjb25kYXJ5IGRpZmZlcmVuY2UKKyAgICAgIHJldHVybiBVQ09MX1BSSU1BUlk7CisgICAgfSBlbHNlIGlmKHByb2JlUHJlZml4KHgsIHksIEIzLCBCMCkpIHsgLy8gc3dhbXBzIHRlcnRpYXJ5IGRpZmZlcmVuY2UKKyAgICAgIHJldHVybiBVQ09MX1NFQ09OREFSWTsKKyAgICB9IGVsc2UgaWYocHJvYmVTdWZmaXgoeCwgeSwgQjMsIEIwKSkgeyAvLyBzd2FtcGVkIGJ5IHRlcnRpYXJ5IGRpZmZlcmVuY2UKKyAgICAgIHJldHVybiBVQ09MX1RFUlRJQVJZOworICAgIH0gZWxzZSBpZighcHJvYmVQcmVmaXgoeCwgeSwgQjMsIEIwKSkgeworICAgICAgcmV0dXJuIFVDT0xfUVVBVEVSTkFSWTsKKyAgICB9CisgICAgLyoKKyAgICAvL2lmKHByb2JlU3VmZml4KHgsIHksIEIxLCBCMCkpIHsKKyAgICBpZihwcm9iZVByZWZpeCh4LCB5LCBCMiwgQjApKSB7IC8vIHN3YW1wcyBzZWNvbmRhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfUFJJTUFSWTsKKyAgICB9IGVsc2UgaWYocHJvYmVQcmVmaXgoeCwgeSwgQjMsIEIwKSkgeyAvLyBzd2FtcHMgdGVydGlhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfU0VDT05EQVJZOworICAgIH0gZWxzZSBpZihwcm9iZVN1ZmZpeCh4LCB5LCBCMywgQjApKSB7IC8vIHN3YW1wZWQgYnkgdGVydGlhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfVEVSVElBUlk7CisgICAgfSBlbHNlIGlmKCFwcm9iZVByZWZpeCh4LCB5LCBCMywgQjApKSB7CisgICAgICByZXR1cm4gVUNPTF9RVUFURVJOQVJZOworICAgIH0KKyAgICAqLworICB9CisgIHJldHVybiBVQ09MX09GRjsgLy8gYmFkCit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK1N0cmVuZ3RoUHJvYmU6OmdldFN0cmVuZ3RoKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnN4LCBjb25zdCBVbmljb2RlU3RyaW5nICZzeSkgeworICBMaW5lIHgoc3gpOworICBMaW5lIHkoc3kpOworICByZXR1cm4gZ2V0U3RyZW5ndGgoeCwgeSk7Cit9CisKK2ludDMyX3QgCitTdHJlbmd0aFByb2JlOjpjb21wYXJlKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnN4LCBjb25zdCBVbmljb2RlU3RyaW5nICZzeSkgeworICBMaW5lIHgoc3gpOworICBMaW5lIHkoc3kpOworICBjb25zdCBMaW5lICp4cCA9ICZ4OworICBjb25zdCBMaW5lICp5cCA9ICZ5OworICByZXR1cm4gY29tcGFyZXIoJnhwLCAmeXApOworfQorCitpbnQzMl90IAorU3RyZW5ndGhQcm9iZTo6Y29tcGFyZShjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5KSB7CisgIGNvbnN0IExpbmUgKnhwID0gJng7CisgIGNvbnN0IExpbmUgKnlwID0gJnk7CisgIHJldHVybiBjb21wYXJlcigmeHAsICZ5cCk7Cit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK1N0cmVuZ3RoUHJvYmU6OmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGNvbnN0IExpbmUgJngpIHsKKyAgaWYoeC5uYW1lWzBdID09IDB4MzBEKSB7CisgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgIH0KKyAgTGluZSBlbXB0eTsKKyAgTGluZSAqZW1wdHlQID0gJmVtcHR5OworICB1aW50OF90IGJ1ZmZbMjU2XTsKKyAgZ2V0U29ydEtleShlbXB0eS5uYW1lLCBlbXB0eS5sZW4sIGJ1ZmYsIDI1Nik7CisgIExpbmUgQjBMaW5lKEIwKTsKKyAgTGluZSAqQjBMaW5lUCA9ICZCMExpbmU7CisgIGNvbnN0IExpbmUgKnhwID0gJng7CisgIGludDMyX3QgcmVzdWx0ID0gY29tcGFyZXIoJmVtcHR5UCwgJnhwKTsKKyAgaWYocmVzdWx0ID09IDApIHsKKyAgICByZXR1cm4gVUNPTF9JREVOVElDQUw7CisgIH0gZWxzZSBpZihyZXN1bHQgPiAwKSB7CisgICAgcmV0dXJuIFVDT0xfT0ZGOworICB9CisgIHJlc3VsdCA9IGNvbXBhcmVyKCZCMExpbmVQLCAmeHApOworICBpZihyZXN1bHQgPD0gMCkgeworICAgIHJldHVybiBVQ09MX1BSSU1BUlk7CisgIH0KKyAgTGluZSBzZXhiMChTRSk7CisgIHNleGIwLmFwcGVuZCh4Lm5hbWUsIHgubGVuKTsKKyAgc2V4YjAuYXBwZW5kKEIwKTsKKworICBMaW5lIHNlYjAoU0UpOworICBzZWIwLmFwcGVuZChCMCk7CisgIHVpbnQ4X3Qgc2ViMEtbMjU2XTsKKyAgdWludDhfdCBzZXhiMEtbMjU2XTsKKyAgdWludDhfdCBzZWIyS1syNTZdOworICB1aW50OF90IHNlYjNLWzI1Nl07CisgIG1lbXNldChzZWIwSywgMCwgMjU2KTsKKyAgbWVtc2V0KHNleGIwSywgMCwgMjU2KTsKKyAgbWVtc2V0KHNlYjJLLCAwLCAyNTYpOworICBtZW1zZXQoc2ViM0ssIDAsIDI1Nik7CisKKyAgZ2V0U29ydEtleShzZWIwLCBzZWIwSywgMjU2KTsKKyAgZ2V0U29ydEtleShzZXhiMCwgc2V4YjBLLCAyNTYpOworCisgIGlmKGNvbXBhcmUoc2ViMCwgc2V4YjApIDw9IDApIHsKKyAgICBMaW5lIHNlYjIoU0UpOworICAgIHNlYjIuYXBwZW5kKEIyKTsKKyAgICBnZXRTb3J0S2V5KHNlYjIsIHNlYjJLLCAyNTYpOworICAgIHJlc3VsdCA9IGNvbXBhcmUoc2ViMiwgc2V4YjApOworICAgIGlmKChyZXN1bHQgPD0gMCAmJiAhZnJlbmNoU2Vjb25kYXJ5KSB8fCAocmVzdWx0ID49IDAgJiYgZnJlbmNoU2Vjb25kYXJ5KSkgeyAvLyBzd2FtcHMgdGVydGlhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfU0VDT05EQVJZOworICAgIH0KKyAgICBMaW5lIHNlYjMoU0UpOworICAgIHNlYjMuYXBwZW5kKEIzKTsKKyAgICBnZXRTb3J0S2V5KHNlYjMsIHNlYjNLLCAyNTYpOworICAgIGlmKGNvbXBhcmUoc2ViMywgc2V4YjApIDwgMCkgeworICAgICAgcmV0dXJuIFVDT0xfVEVSVElBUlk7CisgICAgfQorICAgIHJldHVybiBVQ09MX1FVQVRFUk5BUlk7CisgIH0gZWxzZSB7CisgICAgLy8gaWYgdGhpcyB3YXMgVUNBLCB3ZSB3b3VsZCBoYXZlIGEgcHJpbWFyeSBkaWZmZXJlbmNlLgorICAgIC8vIGhvd2V2ZXIsIHRoaXMgbWlnaHQgbm90IGJlIHNvLCBzaW5jZSBub3QgZXZlcnlib2R5IAorICAgIC8vIG1ha2VzIHdlbGwgZm9ybWVkIENFcy4KKyAgICAvLyBpbiBjc19DWiBvbiBsaW51eCwgc3BhY2UgaXMgdGVydGlhcnkgaWdub3JhYmxlLCBidXQKKyAgICAvLyBpdHMgcXVhdGVybmFyeSBsZXZlbCBzdHJlbmd0aCBpcyBsb3dlciB0aGFuIHF1YWQgCisgICAgLy8gc3RyZW5ndGhzIGZvciBub24taWdub3JhYmxlcy4gb2ggd2VsbCwgbW9yZSB0ZXN0aW5nCisgICAgLy8gcmVxdWlyZWQKKyAgICAvLyBJIHRoaW5rIHRoYXQgd2UgY2FuIG9ubHkgaGF2ZSBxdWF0ZXJuYXJ5IGRpZmZlcmVuY2UKKyAgICAvLyBoZXJlIChpbiBhZGRpdGlvbiB0byBwcmltYXJ5IGRpZmZlcmVuY2UpLgorICAgIC8vaWYoIXByb2JlUHJlZml4KHgsIGVtcHR5LCBCMywgQjApKSB7CisgICAgICAvL3JldHVybiBVQ09MX1FVQVRFUk5BUlk7CisgICAgLy99IGVsc2UgeworICAgICAgcmV0dXJuIFVDT0xfUFJJTUFSWTsKKyAgICAvL30KKyAgfQorfQorCitVQ29sQXR0cmlidXRlVmFsdWUgCitTdHJlbmd0aFByb2JlOjpkaXN0YW5jZUZyb21FbXB0eVN0cmluZyhjb25zdCBVbmljb2RlU3RyaW5nICZ4KSB7CisgIGNvbnN0IExpbmUgeHAoeCk7CisgIHJldHVybiBkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh4cCk7Cit9CisKKworVUNvbEF0dHJpYnV0ZVZhbHVlIAorU3RyZW5ndGhQcm9iZTo6Z2V0UHJlZml4ZWRTdHJlbmd0aChjb25zdCBMaW5lICZwcmVmaXgsIGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnkpIHsKKyAgY29udHJhY3Rpb25VdGlsRmlyc3Quc2V0VG9Db25jYXQoJnByZWZpeCwgJngpOworICBjb250cmFjdGlvblV0aWxTZWNvbmQuc2V0VG9Db25jYXQoJnByZWZpeCwgJnkpOworICByZXR1cm4gZ2V0U3RyZW5ndGgoY29udHJhY3Rpb25VdGlsRmlyc3QsIGNvbnRyYWN0aW9uVXRpbFNlY29uZCk7Cit9CisKKworU3RyZW5ndGhQcm9iZTo6U3RyZW5ndGhQcm9iZShjb25zdCBTdHJlbmd0aFByb2JlICZ0aGF0KSB7CisgICp0aGlzID0gdGhhdDsKK30KKworU3RyZW5ndGhQcm9iZSAmCitTdHJlbmd0aFByb2JlOjpvcGVyYXRvcj0oY29uc3QgU3RyZW5ndGhQcm9iZSAmdGhhdCkgeworICBpZih0aGlzICE9ICZ0aGF0KSB7CisgICAgQjAgPSB0aGF0LkIwOworICAgIEIxID0gdGhhdC5CMTsKKyAgICBCMiA9IHRoYXQuQjI7CisgICAgQjMgPSB0aGF0LkIzOworICAgIFNFID0gdGhhdC5TRTsKKyAgICBmcmVuY2hTZWNvbmRhcnkgPSB0aGF0LmZyZW5jaFNlY29uZGFyeTsKKyAgICBjb21wYXJlciA9IHRoYXQuY29tcGFyZXI7CisgICAgc2tnZXR0ZXIgPSB0aGF0LnNrZ2V0dGVyOworCisgICAgdXRpbEZpcnN0UCA9ICZ1dGlsRmlyc3Q7CisgICAgdXRpbFNlY29uZFAgPSAmdXRpbFNlY29uZDsKKyAgfQorCisgIHJldHVybiAqdGhpczsKK30KKworVUJvb2wKK1N0cmVuZ3RoUHJvYmU6OmlzRnJlbmNoU2Vjb25kYXJ5KFVFcnJvckNvZGUgJnN0YXR1cykgeworICB1dGlsRmlyc3Quc2V0VG8oQjApOworICB1dGlsRmlyc3QuYXBwZW5kKFNFKTsKKyAgdXRpbEZpcnN0LmFwcGVuZChCMik7CisgIHV0aWxTZWNvbmQuc2V0VG8oQjIpOworICB1dGlsU2Vjb25kLmFwcGVuZChTRSk7CisgIHV0aWxTZWNvbmQuYXBwZW5kKEIwKTsKKworICBpbnQzMl90IHJlc3VsdCA9IGNvbXBhcmUodXRpbEZpcnN0LCB1dGlsU2Vjb25kKTsKKworICBpZihyZXN1bHQgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgaWYocmVzdWx0ID4gMCkgeworICAgIGZyZW5jaFNlY29uZGFyeSA9IFRSVUU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgc3RhdHVzID0gVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitVQm9vbAorU3RyZW5ndGhQcm9iZTo6aXNVcHBlckZpcnN0KFVFcnJvckNvZGUgJnN0YXR1cykgeworICBVQ2hhciBpID0gMDsKKyAgaW50MzJfdCByZXN1bHQgPSAwOworICBpbnQzMl90IHVwcGVyID0gMCwgbG93ZXIgPSAwLCBlcXVhbCA9IDA7CisgIGZvcihpID0gMHg0MTsgaSA8IDB4NUI7IGkrKykgeworICAgIHV0aWxGaXJzdC5zZXRUbyhpKTsKKyAgICB1dGlsU2Vjb25kLnNldFRvKGkrMHgyMCk7CisgICAgcmVzdWx0ID0gY29tcGFyZSh1dGlsRmlyc3QsIHV0aWxTZWNvbmQpOworICAgIGlmKHJlc3VsdCA8IDApIHsKKyAgICAgIHVwcGVyKys7CisgICAgfSBlbHNlIGlmKHJlc3VsdCA+IDApIHsKKyAgICAgIGxvd2VyKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGVxdWFsKys7CisgICAgfQorICB9CisgIAorICBpZihsb3dlciA9PSAwICYmIGVxdWFsID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZih1cHBlciA9PSAwICYmIGVxdWFsID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgc3RhdHVzID0gVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SOworICByZXR1cm4gRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2NvbHByb2JlL3N0cmVuZ3RocHJvYmUuaCBiL2NvbHByb2JlL3N0cmVuZ3RocHJvYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzkyNWIyCi0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvc3RyZW5ndGhwcm9iZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgbGluZS5oCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDcvMDcvMjAwMyAgd2VpdiAgICAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLworLy8gICBjbGFzcyBMaW5lCisvLworLy8gICAgICBFYWNoIGxpbmUgZnJvbSB0aGUgc291cmNlIGZpbGUgKGNvbnRhaW5pbmcgYSBuYW1lLCBwcmVzdW1hYmx5KSBnZXRzCisvLyAgICAgIG9uZSBvZiB0aGVzZSBzdHJ1Y3RzLgorLy8KKworI2lmbmRlZiBDT0xQUk9CRV9TVFJFTkdUSFBST0JFX0gKKyNkZWZpbmUgQ09MUFJPQkVfU1RSRU5HVEhQUk9CRV9ICisKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorI2luY2x1ZGUgImxpbmUuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXNldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldGl0ZXIuaCIKKworY2xhc3MgU3RyZW5ndGhQcm9iZSB7CitwdWJsaWM6CisgIFVDaGFyIFNFOworICBVQ2hhciBCMDsKKyAgVUNoYXIgQjE7CisgIFVDaGFyIEIyOworICBVQ2hhciBCMzsKK3ByaXZhdGU6CisgIExpbmUgdXRpbEZpcnN0OworICBMaW5lIHV0aWxTZWNvbmQ7CisgIExpbmUgKnV0aWxGaXJzdFA7CisgIExpbmUgKnV0aWxTZWNvbmRQOworICBMaW5lIGNvbnRyYWN0aW9uVXRpbEZpcnN0OworICBMaW5lIGNvbnRyYWN0aW9uVXRpbFNlY29uZDsKKyAgVUJvb2wgcHJvYmVQcmVmaXgoY29uc3QgTGluZSAmeCwgY29uc3QgTGluZSAmeSwgVUNoYXIgZmlyc3QsIFVDaGFyIHNlY29uZCk7CisgIFVCb29sIHByb2JlU3VmZml4KGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpOworICBVQm9vbCBwcm9iZVByZWZpeE5vU2VwKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpOworICBVQm9vbCBwcm9iZVN1ZmZpeE5vU2VwKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpOworCisgIFVCb29sIGZyZW5jaFNlY29uZGFyeTsKKworcHVibGljOgorICBDb21wYXJlRm4gY29tcGFyZXI7CisgIEdldFNvcnRLZXlGbiBza2dldHRlcjsKKyAgCisgIFN0cmVuZ3RoUHJvYmUoKSB7fTsKKyAgU3RyZW5ndGhQcm9iZShDb21wYXJlRm4gY29tcGFyZXIsIEdldFNvcnRLZXlGbiBnZXR0ZXIsIFVDaGFyIFNFID0gMHgwMDMwLCBVQ2hhciBCMCA9IDB4MDA2MSwgVUNoYXIgQjEgPSAweDAwNjIsIFVDaGFyIEIyID0gMHgwMEUxLCBVQ2hhciBCMyA9IDB4MDA0MSk7IC8vLCBVQ2hhciBMQiA9IDB4MDAzOSwgVUNoYXIgVUIgPSAweGZhMjkpOworICBpbnQgc2V0UHJvYmVDaGFycyhVQ2hhciBCMCwgVUNoYXIgQjEsIFVDaGFyIEIyLCBVQ2hhciBCMyk7CisgIGludCBjaGVja1Nhbml0eSgpOworICBTdHJlbmd0aFByb2JlKGNvbnN0IFN0cmVuZ3RoUHJvYmUgJnRoYXQpOworICBTdHJlbmd0aFByb2JlICZvcGVyYXRvcj0oY29uc3QgU3RyZW5ndGhQcm9iZSAmdGhhdCk7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBnZXRTdHJlbmd0aChjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5KTsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIGdldFN0cmVuZ3RoKGNvbnN0IFVuaWNvZGVTdHJpbmcgJngsIGNvbnN0IFVuaWNvZGVTdHJpbmcgJnkpOworICBVQ29sQXR0cmlidXRlVmFsdWUgZ2V0UHJlZml4ZWRTdHJlbmd0aChjb25zdCBMaW5lICZwcmVmaXgsIGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnkpOworICBpbnQzMl90IGNvbXBhcmUoY29uc3QgVW5pY29kZVN0cmluZyAmeCwgY29uc3QgVW5pY29kZVN0cmluZyAmeSk7CisgIGludDMyX3QgY29tcGFyZShjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5KTsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIGRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGNvbnN0IExpbmUgJngpOworICBVQ29sQXR0cmlidXRlVmFsdWUgZGlzdGFuY2VGcm9tRW1wdHlTdHJpbmcoY29uc3QgVW5pY29kZVN0cmluZyAmeCk7CisgIFVCb29sIGlzRnJlbmNoU2Vjb25kYXJ5KFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIFVCb29sIGlzVXBwZXJGaXJzdChVRXJyb3JDb2RlICZzdGF0dXMpOworICBpbnQgZ2V0U29ydEtleShjb25zdCBMaW5lICZsLCB1aW50OF90ICpidWZmZXIsIGludDMyX3QgYnVmZkNhcCkgeworICAgIHJldHVybiBza2dldHRlcihsLm5hbWUsIGwubGVuLCBidWZmZXIsIGJ1ZmZDYXApOworICB9OworCisgIGludCBnZXRTb3J0S2V5KFVDaGFyICpzdHJpbmcsIGludDMyX3Qgc0xlbiwgdWludDhfdCAqYnVmZmVyLCBpbnQzMl90IGJ1ZmZDYXApIHsKKyAgICByZXR1cm4gc2tnZXR0ZXIoc3RyaW5nLCBzTGVuLCBidWZmZXIsIGJ1ZmZDYXApOworICB9OworIAorfTsKKworCisjZW5kaWYgLy8jaWZuZGVmIENPTFBST0JFX1NUUkVOR1RIUFJPQkVfSAorCmRpZmYgLS1naXQgYS9jb2xwcm9iZS90YWJsZVN0YXJ0ZXIucGwgYi9jb2xwcm9iZS90YWJsZVN0YXJ0ZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDFiN2ZiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3RhYmxlU3RhcnRlci5wbApAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworbXkgJGxvY2FsZU1pbnVzQSA9IGBjYXQgL2hvbWUvd2Vpdi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9sb2NhbGUudHh0YDsKK215IEBsb2NhbGVzID0gc3BsaXQoL1xuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKK2ZvcmVhY2ggJGxvY2FsZSAoQGxvY2FsZXMpIHsKKyAgaWYoJGxvY2FsZSA9fiAvXy8gJiYgISgkbG9jYWxlID1+IC9eIy8pKSB7CisgICAgJGNvbW1hbmQgPSAiL2hvbWUvd2Vpdi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9kb0NvbXBhcmlzb25UYWJsZS5wbCAkbG9jYWxlIjsKKyAgICBwcmludCAiJGNvbW1hbmRcbiI7CisgICAgYCRjb21tYW5kYDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvdGFyZ2V0c2V0Z2VuZXJhdG9yLmNwcCBiL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkY2JlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5jcHAKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSAidGFyZ2V0c2V0Z2VuZXJhdG9yLmgiCisKK1RhcmdldFNldEdlbmVyYXRvcjo6VGFyZ2V0U2V0R2VuZXJhdG9yKFVuaWNvZGVTZXQgJnN0YXJ0aW5nU2V0LCBDb21wYXJlRm4gY29tcGFyZXIpIDoKKyBjb21wYXJlcihjb21wYXJlciksCisgc2V0KHN0YXJ0aW5nU2V0KQoreworICAgYWRkQWxsKHN0YXJ0aW5nU2V0KTsKK30KZGlmZiAtLWdpdCBhL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5oIGIvY29scHJvYmUvdGFyZ2V0c2V0Z2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4OTczNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgVEFSR0VUU0VUR0VORVJBVE9SX0gKKyNkZWZpbmUgVEFSR0VUU0VUR0VORVJBVE9SX0gKKworI2luY2x1ZGUgImNvbHByb2JlLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKworY2xhc3MgVGFyZ2V0U2V0R2VuZXJhdG9yIDogcHVibGljIFVuaWNvZGVTZXQgeworcHVibGljOgorICBUYXJnZXRTZXRHZW5lcmF0b3IoVW5pY29kZVNldCAmc3RhcnRpbmdTZXQsIENvbXBhcmVGbiBjb21wYXJlcik7Citwcml2YXRlOgorICBDb21wYXJlRm4gY29tcGFyZXI7CisgIFVuaWNvZGVTZXQgc2V0OworfTsKKworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvdGVtcGxhdGUgYi9jb2xwcm9iZS90ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTFhYTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvdGVtcGxhdGUKQEAgLTAsMCArMSw0OCBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgorPHRpdGxlPiRsb2NhbGU8L3RpdGxlPgorPHN0eWxlPgorICAgICAgICAgPCEtLQorICAgICAgICAgdGFibGUgICAgICAgIHsgYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlOyAKKyAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrIH0KK3RkLCB0aCAgICAgICB7IHdpZHRoOiAxMCU7IGJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBjb2xvcjogYmxhY2s7IAorICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2sgfQorLS0+CisgICAgIDwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorCis8cD48Yj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Q29sbGF0aW9uOjwvZm9udD4gJGxvY2FsZSA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY2dpLWJpbi9pY3UvbHgvZW4vP189JGxvY2FsZSI+RGVtbzwvYT4sIAorCis8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2xvY2FsZS9hbGxfZGlmZl94bWwvY29tcGFyaXNvbl9jaGFydHMuaHRtbCI+Q292ZXIgCitQYWdlPC9hPiwgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2N2cy9pY3UvfmNoZWNrb3V0fi9sb2NhbGUvYWxsX2RpZmZfeG1sL2luZGV4Lmh0bWwiPkluZGV4PC9hPjwvYj48L3A+Cis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggYmdjb2xvcj0iI0FEOTg5RCI+Q09NTU9OICg8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2xvY2FsZS9jb21tb24veG1sLyRsb2NhbGUueG1sIj54bWw8L2E+KTwvdGg+CisgICAgPHRoIGJnY29sb3I9IiMxMTkxRjEiPkxJTlVYICg8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2xvY2FsZS9saW51eC94bWwvJGxvY2FsZS54bWwiPnhtbDwvYT4pPC90aD4KKyAgICA8dGggYmdjb2xvcj0iIzk4RkI5OCI+V0lORE9XUyAoPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2N2cy9pY3UvfmNoZWNrb3V0fi9sb2NhbGUvd2luZG93cy94bWwvJGxvY2FsZS54bWwiPnhtbDwvYT4pPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkIGJnY29sb3I9IiNBRDk4OUQiPjEuMC1hbHBoYTwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPjEuMDwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj48c3BhbiB0aXRsZT0iMDA2RSB7TEFUSU4gU01BTEwgTEVUVEVSIE59Ij4mYW1wO248L3NwYW4+PGJyPgorICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZsdDsmbmJzcDtueTwvc3Bhbj48YnI+CisKKyAgICAgIDxzcGFuIHRpdGxlPSIwMDZFIDAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBZfSAvIDAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOz0mbmJzcDtubnkmbmJzcDsvJm5ic3A7bnk8L3NwYW4+PGJyPgorICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA1OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBDQVBJVEFMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0OyZsdDsmbHQ7Jm5ic3A7blk8L3NwYW4+PGJyPgorICAgIDwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjRkZGRjMzIj4xLjI8L3RkPgorCisgICAgPHRkIGJnY29sb3I9IiM5OEZCOTgiPldpbmRvd3MgWFA8L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj49PC90ZD4KKyAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb2xwcm9iZS91bmlxdWVGaWxlcy5wbCBiL2NvbHByb2JlL3VuaXF1ZUZpbGVzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3ZGE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS91bmlxdWVGaWxlcy5wbApAQCAtMCwwICsxLDQ5IEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIHN0cmljdDsKKworbXkgJGZpbGU7CitteSAkc2Vjb25kZmlsZTsKK215ICVzZWNvbmRmaWxlbGlzdDsKK215IEBzYW1lOworbXkgJWxpc3Q7CitteSAkc2FtZWZpbGU7CisKK2ZvcmVhY2ggJHNlY29uZGZpbGUgKEBBUkdWKSB7CisgICRzZWNvbmRmaWxlbGlzdHskc2Vjb25kZmlsZX0gPSAiIjsKK30KKworZm9yZWFjaCAkZmlsZSAoc29ydCBrZXlzKCVzZWNvbmRmaWxlbGlzdCkpIHsKKyAgaWYoZXhpc3RzICRzZWNvbmRmaWxlbGlzdHskZmlsZX0pIHsKKyAgICBkZWxldGUgJHNlY29uZGZpbGVsaXN0eyRmaWxlfTsKKyAgICBmb3JlYWNoICRzZWNvbmRmaWxlIChzb3J0KGtleXMgJXNlY29uZGZpbGVsaXN0KSkgeworICAgICAgI3ByaW50ICJkaWZmaW5nOiAkZmlsZSBhbmQgJHNlY29uZGZpbGVcbiI7CisgICAgICBpZiAoIWBkaWZmICRmaWxlICRzZWNvbmRmaWxlYCkgeworICAgICAgICAjcHJpbnQgIiRmaWxlIGFuZCAkc2Vjb25kZmlsZSBhcmUgdGhlIHNhbWVcbiI7CisgICAgICAgIHB1c2ggQHNhbWUsICRzZWNvbmRmaWxlOworICAgICAgfQorICAgIH0KKyMgICAgaWYgKCQjc2FtZSA+IC0xKSB7CisgICAgICBwcmludCAiQWRkaW5nIEBzYW1lIHRvICRmaWxlXG4iOworICAgICAgJGxpc3R7JGZpbGV9ID0gIFtAc2FtZV0gOworICAgICAgZm9yZWFjaCAkc2FtZWZpbGUgKEBzYW1lKSB7CisgICAgICAgIGRlbGV0ZSAkc2Vjb25kZmlsZWxpc3R7JHNhbWVmaWxlfTsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBAc2FtZVswLi4kI3NhbWVdOworIyAgICB9CisgIH0KK30KKworCitteSAkaSA9IDA7CitteSAkaiA9IDA7CisgZm9yZWFjaCAkZmlsZSAoc29ydCgga2V5cyAlbGlzdCkpIHsKKyAgICNwcmludCAiJGZpbGUgLT4gIjsgI0B7bGlzdHskZmlsZX19XG4iOworICAgcHJpbnQgIjwkZmlsZT4gPCRqPlxuIjsKKyAgIGZvcmVhY2ggJGkgKCAwIC4uICQjeyAkbGlzdHskZmlsZX0gfSApIHsKKyAgICAgI3ByaW50ICIkbGlzdHskZmlsZX1bJGldICI7CisgICAgIHByaW50ICI8JGxpc3R7JGZpbGV9WyRpXT4gPCRqPlxuICI7CisgICB9CisgICAkaisrOworIH0KKwpkaWZmIC0tZ2l0IGEvY29scHJvYmUvdXByaW50ZXIuY3BwIGIvY29scHJvYmUvdXByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOWFiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS91cHJpbnRlci5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgdXByaW50ZXIuY3BwCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDMvMTgvMjAwMyAgd2VpdiAgICAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAidXByaW50ZXIuaCIKKworVVByaW50ZXI6OlVQcmludGVyKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIFVCb29sIHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgX29uID0gVFJVRTsKKyAgb3V0ID0gdV9maW5pdChmaWxlLCBsb2NhbGUsIGVuY29kaW5nKTsKKyAgc3RyY3B5KF9sb2NhbGUsIGxvY2FsZSk7CisgIGlmKHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBVVHJhbnNsaXRlcmF0b3IgKmFueUhleCA9IHV0cmFuc19vcGVuKCJbXlxcdTAwMGRcXHUwMDBhXFx1MDAwOVxcdTAwMjAtXFx1MDA3Zl0gQW55LUhleC9KYXZhIiwgVVRSQU5TX0ZPUldBUkQsIE5VTEwsIDAsIE5VTEwsICZzdGF0dXMpOworICAgIHVfZnNldHRyYW5zbGl0ZXJhdG9yKG91dCwgVV9XUklURSwgYW55SGV4LCAmc3RhdHVzKTsKKyAgfQorfTsKKworVVByaW50ZXI6OlVQcmludGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIFVUcmFuc2xpdGVyYXRvciAqdHJhbnMsIFVCb29sIHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgX29uID0gVFJVRTsKKyAgb3V0ID0gdV9mb3BlbihuYW1lLCAid2IiLCBsb2NhbGUsIGVuY29kaW5nKTsKKyAgdV9mcHV0YygweEZFRkYsIG91dCk7IC8vIGVtaXQgYSBCT00KKyAgc3RyY3B5KF9sb2NhbGUsIGxvY2FsZSk7CisgIGlmKHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBpZih0cmFucyA9PSBOVUxMKSB7CisgICAgICBVVHJhbnNsaXRlcmF0b3IgKmFueUhleCA9IHV0cmFuc19vcGVuKCJbXlxcdTAwMGRcXHUwMDBhXFx1MDAwOVxcdTAwMjAtXFx1MDA3Zl0gQW55LUhleC9KYXZhIiwgVVRSQU5TX0ZPUldBUkQsIE5VTEwsIDAsIE5VTEwsICZzdGF0dXMpOworICAgICAgdV9mc2V0dHJhbnNsaXRlcmF0b3Iob3V0LCBVX1dSSVRFLCBhbnlIZXgsICZzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICB1X2ZzZXR0cmFuc2xpdGVyYXRvcihvdXQsIFVfV1JJVEUsIHRyYW5zLCAmc3RhdHVzKTsKKyAgICB9CisgIH0KK307CisKK1VQcmludGVyOjp+VVByaW50ZXIoKSB7CisgIHVfZmNsb3NlKG91dCk7Cit9CisKK3ZvaWQgCitVUHJpbnRlcjo6bG9nKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnN0cmluZywgVUJvb2wgbmwpIHsKKyAgaWYoX29uKSB7CisgICAgbG9nKCgoVW5pY29kZVN0cmluZylzdHJpbmcpLmdldFRlcm1pbmF0ZWRCdWZmZXIoKSwgbmwpOworICB9Cit9CisKK3ZvaWQgCitVUHJpbnRlcjo6bG9nKGNvbnN0IFVDaGFyICpzdHJpbmcsIFVCb29sIG5sKSB7CisgIGlmKF9vbikgeworICAgIHVfZnByaW50ZihvdXQsICIlUyIsIHN0cmluZyk7CisgICAgaWYobmwpIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJcbiIpOworICAgIH0KKyAgICB1X2ZmbHVzaChvdXQpOworICB9Cit9CisvKgordm9pZCAKK1VQcmludGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nLCBVQm9vbCBubCkgeworICBpZihfb24pIHsKKyAgICB1X2ZwcmludGYob3V0LCAiJXMiLCBzdHJpbmcpOworICAgIGlmKG5sKSB7CisgICAgICB1X2ZwcmludGYob3V0LCAiXG4iKTsKKyAgICB9CisgIH0KK30KKyovCit2b2lkIAorVVByaW50ZXI6OmxvZyhjb25zdCBMaW5lICpsaW5lLCBVQm9vbCBubCkgeworICBpZihfb24pIHsKKyAgICBsb2cobGluZS0+bmFtZSk7CisgICAgaWYobGluZS0+ZXhwTGVuKSB7CisgICAgICBsb2coIi8iKTsKKyAgICAgIGxvZyhsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICAgIH0KKyAgICBpZihubCkgeworICAgICAgdV9mcHJpbnRmKG91dCwgIlxuIik7CisgICAgICB1X2ZmbHVzaChvdXQpOworICAgIH0KKyAgfQorfQorCit2b2lkIFVQcmludGVyOjpsb2coY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgVUNoYXIgYnVmZmVyWzQwMDBdOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICAvKiBzcHJpbnRmIGl0IGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGluZm9ybWF0aW9uIGlzIHZhbGlkICovCisgICAgdV92c3ByaW50ZihidWZmZXIsIF9sb2NhbGUsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgaWYoIF9vbiApIHsKKyAgICAgICAgbG9nKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkCitVUHJpbnRlcjo6b24odm9pZCkgeworICBfb24gPSBUUlVFOworfQorCit2b2lkCitVUHJpbnRlcjo6b2ZmKHZvaWQpIHsKKyAgX29uID0gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9jb2xwcm9iZS91cHJpbnRlci5oIGIvY29scHJvYmUvdXByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQyMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvdXByaW50ZXIuaApAQCAtMCwwICsxLDUxIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIHVwcmludGVyLmgKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwMy8xOC8yMDAzICB3ZWl2ICAgICAgICBDcmVhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgQ09MUFJPQkVfVVBSSU5URVJfSAorI2RlZmluZSBDT0xQUk9CRV9VUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsaW5lLmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VzdGRpby5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKKworY2xhc3MgVVByaW50ZXIgeworICBVRklMRSAqb3V0OworICBVQ2hhciBidWZmZXJbMjU2XTsKKyAgVUJvb2wgX29uOworICBjaGFyIF9sb2NhbGVbMjU2XTsKK3B1YmxpYzoKKyAgVVByaW50ZXIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqbG9jYWxlLCBjb25zdCBjaGFyICplbmNvZGluZywgVUJvb2wgdHJhbnNsaXRlcmF0ZU5vblByaW50YWJsZT1UUlVFKTsKKyAgVVByaW50ZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbG9jYWxlLCBjb25zdCBjaGFyICplbmNvZGluZywgVVRyYW5zbGl0ZXJhdG9yICp0cmFucywgVUJvb2wgdHJhbnNsaXRlcmF0ZU5vblByaW50YWJsZSk7CisgIH5VUHJpbnRlcigpOworICB2b2lkIGxvZyhjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcsIFVCb29sIG5sID0gRkFMU0UpOworICB2b2lkIGxvZyhjb25zdCBVQ2hhciAqc3RyaW5nLCBVQm9vbCBubCA9IEZBTFNFKTsKKyAgLy92b2lkIGxvZyhjb25zdCBjaGFyICpzdHJpbmcsIFVCb29sIG5sID0gRkFMU0UpOworICB2b2lkIGxvZyhjb25zdCBMaW5lICpsaW5lLCBVQm9vbCBubCA9IEZBTFNFKTsKKyAgdm9pZCBsb2coY29uc3QgY2hhciAqZm10LCAuLi4pOworICB2b2lkIG9mZih2b2lkKTsKKyAgdm9pZCBvbih2b2lkKTsKKyAgVUJvb2wgaXNPbih2b2lkKSB7CisgICAgcmV0dXJuIF9vbjsKKyAgfTsKK307CisKKworCisjZW5kaWYgLy8gI2lmbmRlZiBDT0xQUk9CRV9VUFJJTlRFUl9ICmRpZmYgLS1naXQgYS9jb2xwcm9iZS93aW5HZW5Db2xsRGF0YS5wbCBiL2NvbHByb2JlL3dpbkdlbkNvbGxEYXRhLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3NzQ2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS93aW5HZW5Db2xsRGF0YS5wbApAQCAtMCwwICsxLDMwIEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworI215ICRsb2NhbGVNaW51c0EgPSBgbG9jYWxlIC1hYDsKK215ICRsb2NhbGVNaW51c0EgPSBgY2F0IGxvY2FsZS50eHRgOworCitteSBAbG9jYWxlcyA9IHNwbGl0KC9cclxuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKKyNteSAkY29tbWFuZFBhdGggPSAifi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS8iOworbXkgJGNvbW1hbmRQYXRoID0gImM6L2Rldi8wX2ljdS9zb3VyY2UvZXh0cmEvY29scHJvYmUvcmVsZWFzZS8iOworCisKK215ICRwbGF0Zm9ybSA9ICRBUkdWWzBdOworCitta2RpciAkcGxhdGZvcm0uImxvZ3MiOworbWtkaXIgJHBsYXRmb3JtOworCitmb3JlYWNoICRsb2NhbGUgKEBsb2NhbGVzKSB7CisgICRfID0gJGxvY2FsZTsKKyAgY2hvbXA7CisgIGlmKCEvXlwjLykgeyAjICYmIC9cXy8pIHsKKyAgICAkY29tbWFuZCA9ICRjb21tYW5kUGF0aC4iY29scHJvYmUgLS1wbGF0Zm9ybSAkcGxhdGZvcm0gLS1yZWYgJHBsYXRmb3JtIC0tb3V0cHV0IHJlc2IgJGxvY2FsZSA+JHBsYXRmb3JtIi4ibG9ncy8kbG9jYWxlIi4iX2xvZy50eHQgMj4mMSI7CisgCisgICAgcHJpbnQgIiRjb21tYW5kXG4iOworICAgIGAkY29tbWFuZGA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2N1cnJlbmN5Ly5jbGFzc3BhdGggYi9jdXJyZW5jeS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDc0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW5jeS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9Im91dC9iaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9jdXJyZW5jeS8ucHJvamVjdCBiL2N1cnJlbmN5Ly5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODBhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW5jeS8ucHJvamVjdApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPmN1cnJlbmN5LW51bWVyaWM8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvY3VycmVuY3kvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvY3VycmVuY3kvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDFjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW5jeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSwzIEBACisjRnJpIEphbiAyMCAwMDowOTo1MyBFU1QgMjAxMg0KK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorZW5jb2RpbmcvPHByb2plY3Q+PVVURi04DQpkaWZmIC0tZ2l0IGEvY3VycmVuY3kvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY3VycmVuY3kvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzdlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW5jeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwzNDcgQEAKKyNUaHUgSmFuIDE5IDEwOjIwOjQwIEVTVCAyMDEyDQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZw0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbj0wDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTANCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTENCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTANCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTENCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTENCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTIwDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cz1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTINCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2xpbmVfY29tbWVudF9zdGFydGluZ19vbl9maXJzdF9jb2x1bW49dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZD1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGU9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fbGluZXNfaW5fY29tbWVudHM9dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5qb2luX3dyYXBwZWRfbGluZXM9dHJ1ZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTEyMA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTANCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTENCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlDQpkaWZmIC0tZ2l0IGEvY3VycmVuY3kvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2N1cnJlbmN5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmZWY0MAotLS0gL2Rldi9udWxsCisrKyBiL2N1cnJlbmN5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSwxMCBAQAorI1RodSBKYW4gMTkgMTA6MjA6MzkgRVNUIDIwMTINCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK2Zvcm1hdHRlcl9wcm9maWxlPV9JQ1U0SiBTdGFuZGFyZA0KK2Zvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyDQorb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUNCitvcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9amF2YTtqYXZheDtvcmc7Y29tOw0KK29yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPXRydWUNCitvcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9OTkNCitvcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9OTkNCitvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcclxuICogQHJldHVybiB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXHJcbiAqIEBwYXJhbSAke3BhcmFtfSB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0iZmFsc2UiIGNvbnRleHRcPSJmaWxlY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBKYXZhIGZpbGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpbGVjb21tZW50IiBuYW1lXD0iZmlsZWNvbW1lbnQiPi8qXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIENvcHlyaWdodCAoQykgJHt5ZWFyfSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgICAgICAqXHJcbiAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXHJcbiAqIEBhdXRob3IgJHt1c2VyfVxyXG4gKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcclxuICogXHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcclxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJkZWxlZ2F0ZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGRlbGVnYXRlIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZGVsZWdhdGVjb21tZW50IiBuYW1lXD0iZGVsZWdhdGVjb21tZW50Ij4vKipcclxuICogJHt0YWdzfVxyXG4gKiAke3NlZV90b190YXJnZXR9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cclxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxyXG5cclxuJHt0eXBlY29tbWVudH1cclxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2F0Y2hibG9ja19jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2F0Y2ggYmxvY2tzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmNhdGNoYmxvY2siIG5hbWVcPSJjYXRjaGJsb2NrIj4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrXHJcbiR7ZXhjZXB0aW9uX3Zhcn0ucHJpbnRTdGFja1RyYWNlKCk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXHJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XHJcbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjwvdGVtcGxhdGVzPg0KZGlmZiAtLWdpdCBhL2N1cnJlbmN5L2J1aWxkLnhtbCBiL2N1cnJlbmN5L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMxNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvY3VycmVuY3kvYnVpbGQueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzwhLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAyMDEyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAgICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy0tPgorPHByb2plY3QgbmFtZT0iY3VycmVuY3ktbnVtZXJpYyIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9vdXQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtvdXQuZGlyfS9iaW4iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVzLmRpciIgdmFsdWU9IiR7b3V0LmRpcn0vcmVzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InhtbC5kaXIiIHZhbHVlPSIke291dC5kaXJ9L3htbCIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImJhc2UudXJsIiB2YWx1ZT0iaHR0cDovL3d3dy5jdXJyZW5jeS1pc28ub3JnLyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50LnhtbCIgdmFsdWU9ImRsX2lzb190YWJsZV9hMS54bWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGlzdG9yaWMueG1sIiB2YWx1ZT0iZGxfaXNvX3RhYmxlc19hMy54bWwiLz4KKworPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iY2hlY2ssIHJlc291cmNlIiBkZXNjcmlwdGlvbj0iVmVyaWZ5IElDVSdzIGxvY2FsIGRhdGEgYW5kIGdlbmVyYXRlIElTTyA0MjE3IGFscGhhLW51bWVyaWMgY29kZSBtYXBwaW5nIGRhdGEgcmVzb3VyY2UiLz4KKworPHRhcmdldCBuYW1lPSJjbGFzc2VzIiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIEphdmEgdG9vbCI+CisgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKKyAgICAgICAgICAgIHRhcmdldD0iMS42IiBlbmNvZGluZz0iVVRGLTgiIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSIvPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iX2NoZWNrTG9jYWxYbWwiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzTG9jYWxYbWwiPgorICAgICAgICA8YW5kPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2VkaXJ9LyR7Y3VycmVudC54bWx9Ii8+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZWRpcn0vJHtoaXN0b3JpYy54bWx9Ii8+CisgICAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iX2xvY2FsWG1sIiBkZXBlbmRzPSJfY2hlY2tMb2NhbFhtbCIgaWY9ImlzTG9jYWxYbWwiPgorICAgIDxlY2hvIG1lc3NhZ2U9IlVzaW5nIGxvY2FsIElTTyA0MjE3IFhNTCBkYXRhIGZpbGVzIi8+CisgICAgPGNvcHkgZmlsZT0iJHtjdXJyZW50LnhtbH0iIHRvZGlyPSIke3htbC5kaXJ9Ii8+CisgICAgPGNvcHkgZmlsZT0iJHtoaXN0b3JpYy54bWx9IiB0b2Rpcj0iJHt4bWwuZGlyfSIvPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iX2Rvd25sb2FkWG1sIiB1bmxlc3M9ImlzTG9jYWxYbWwiPgorICAgIDxlY2hvIG1lc3NhZ2U9IkRvd25sb2FkaW5nIElTTyA0MjE3IFhNTCBkYXRhIGZpbGVzIi8+CisgICAgPG1rZGlyIGRpcj0iJHt4bWwuZGlyfSIvPgorICAgIDxnZXQgc3JjPSIke2Jhc2UudXJsfSR7Y3VycmVudC54bWx9IiBkZXN0PSIke3htbC5kaXJ9Ii8+CisgICAgPGdldCBzcmM9IiR7YmFzZS51cmx9JHtoaXN0b3JpYy54bWx9IiBkZXN0PSIke3htbC5kaXJ9Ii8+Cis8L3RhcmdldD4KKworPHRhcmdldCBuYW1lPSJ4bWxEYXRhIiBkZXBlbmRzPSJfbG9jYWxYbWwsIF9kb3dubG9hZFhtbCIgZGVzY3JpcHRpb249IlByZXBhcmUgbmVjZXNzYXJ5IElTTyA0MjE3IFhNTCBkYXRhIGZpbGVzIj4KKzwvdGFyZ2V0PgorCis8dGFyZ2V0IG5hbWU9ImNoZWNrIiBkZXBlbmRzPSJjbGFzc2VzLCB4bWxEYXRhIiBkZXNjcmlwdGlvbj0iVmVyaWZ5IGlmIElDVSdzIGxvY2FsIG1hcHBpbmcgZGF0YSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgWE1MIGRhdGEiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLmlibS5pY3UuZGV2LnRvb2wuY3VycmVuY3kuTWFpbiIKKyAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtjbGFzc2VzLmRpcn0iCisgICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgIDxhcmcgdmFsdWU9ImNoZWNrIi8+CisgICAgICAgIDxhcmcgdmFsdWU9IiR7eG1sLmRpcn0vJHtjdXJyZW50LnhtbH0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iJHt4bWwuZGlyfS8ke2hpc3RvcmljLnhtbH0iLz4KKyAgICA8L2phdmE+Cis8L3RhcmdldD4KKworPHRhcmdldCBuYW1lPSJyZXNvdXJjZSIgZGVwZW5kcz0iY2xhc3NlcyIgZGVzY3JpcHRpb249IkJ1aWxkIElTTyA0MjE3IGFscGhhLW51bWVyaWMgY29kZSBtYXBwaW5nIGRhdGEgcmVzb3VyY2UiPgorICAgIDxta2RpciBkaXI9IiR7cmVzLmRpcn0iLz4KKyAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5pYm0uaWN1LmRldi50b29sLmN1cnJlbmN5Lk1haW4iCisgICAgICAgICAgICBjbGFzc3BhdGg9IiR7Y2xhc3Nlcy5kaXJ9IgorICAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8YXJnIHZhbHVlPSJidWlsZCIvPgorICAgICAgICA8YXJnIHZhbHVlPSIke3Jlcy5kaXJ9Ii8+CisgICAgPC9qYXZhPgorICAgIDxlY2hvIG1lc3NhZ2U9IklTTyA0MjE3IG51bWVyaWMgY29kZSBtYXBwaW5nIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGluICR7cmVzLmRpcn0iLz4KKzwvdGFyZ2V0PgorCis8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iRGVsZXRlIGJ1aWxkIG91dHB1dHMiPgorICAgIDxkZWxldGUgZGlyPSIke291dC5kaXJ9Ii8+Cis8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2N1cnJlbmN5L3JlYWRtZS50eHQgYi9jdXJyZW5jeS9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDAxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW5jeS9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTE3IEBACisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgICAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1tPdmVydmlld10KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSB0b29sIHVzZWQgZm9yIG1haW50YWluaW5nIElDVSdzIElTTyA0MjE3IGN1cnJlbmN5Citjb2RlIG1hcHBpbmcgZGF0YS4gSUNVIHVzZXMgYSByZXNvdXJjZSBnZW5lcmF0ZWQgYnkgdGhpcyB0b29sIGZvciBtYXBwaW5nCitJU08gNDIxNyBjdXJyZW5jeSBhbHBoYSBjb2RlcyB0byBudW1lcmljIGNvZGVzLgorCisKK1tGaWxlc10KKworcGFja2FnZSBjb20uaWJtLmljdS5kZXYudG9vbC5jdXJyZW5jeQorCitNYWluLmphdmEgLSBUaGUgdG9vbCdzIGVudHJ5IHBvaW50CitOdW1lcmljQ29kZURhdGEuamF2YSAtIFRoZSBtYXBwaW5nIGRhdGEgdXNlZCBieSBJQ1UKK0N1cnJlbmN5RGF0YVBhcnNlci5qYXZhIC0gSVNPIDQyMTcgWE1MIGRhdGEgcGFyc2VyCitDdXJyZW5jeURhdGFFbnRyeS5qYXZhIC0gSVNPIDQyMTcgWE1MIGRhdGEgZW50cnkKKworCitbRGV0YWlsc10KKworY29tLmlibS5pY3UuZGV2LnRvb2wuTnVtZXJpY0NvZGVEYXRhIGhhcyBTdHJpbmdbXVtdIENPREVfTUFQX0RBVEEuCitUaGlzIGFycmF5IHJlcHJlc2VudHMgbWFwcGluZ3MgYmV0d2VlbiBJU08gNDIxNyBhbHBoYSBjb2RlcyBhbmQKK251bWVyaWMgY29kZXMuIElDVSdzIHJlc291cmNlIGJ1bmRsZSBjdXJyZW5jeU51bWVyaWNDb2RlcyBpcyBnZW5lcmF0ZWQKK2Zyb20gdGhlIHRhYmxlLgorCitJU08gNDIxNyBtYWludGVuYW5jZSBhZ2VuY3kgLSBTSVggSW50ZXJiYW5rIENsZWFyaW5nIGRpc3RyaWJ1dGVzCitJU08gNDIxNyBjb2RlIGRhdGEgaW4gWE1MIGZvcm1hdC4gVGhlc2UgZmlsZXMgYXJlIGZvdW5kIGluCitodHRwOi8vd3d3LmN1cnJlbmN5LWlzby5vcmcvaXNvX2luZGV4L2lzb190YWJsZXMuaHRtLiBUaGVyZSBhcmUgdHdvCitmaWxlcyB0aGF0IHdlJ3JlIGludGVyZXN0ZWQgaW4uCisKKyAtIGh0dHA6Ly93d3cuY3VycmVuY3ktaXNvLm9yZy9kbF9pc29fdGFibGVfYTEueG1sCisgLSBodHRwOi8vd3d3LmN1cnJlbmN5LWlzby5vcmcvZGxfaXNvX3RhYmxlc19hMy54bWwKKworVGFibGUgQS4xIGNvbnRhaW5zIGN1cnJlbnQgY3VycmVuY2llcyBhbmQgZnVuZHMgYW5kIFRhYmxlIEEuMyBjb250YWlucworaGlzdG9yaWMgZGVub21pbmF0aW9ucy4KKworVGhlIHRvb2wgc3VwcG9ydHMgMyBjb21tYW5kcyAtIGNoZWNrIC8gcHJpbnQgLyBidWlsZC4KKworMSkgY2hlY2sKKworVGhpcyBjb21tYW5kIGNvbXBhcmVzIHRoZSBoYXJkY29kZWQgbWFwcGluZyBkYXRhIGluIE51bWVyaWNDb2RlRGF0YS5qYXZhCit3aXRoIHRoZSBJU08gNDIxNyBYTUwgZGF0YSBmaWxlcyBzaWRlIGJ5IHNpZGUgYW5kIGNoZWNrIGRpZmZlcmVuY2VzLgorCisyKSBwcmludAorCitUaGlzIGNvbW1hbmQgcHJpbnRzIG91dCBib2R5IG9mIFN0cmluZ1tdW10gQ09ERV9NQVBfREFUQSBmcm9tIHRoZSBJU08KKzQyMTcgWE1MIGRhdGEgZmlsZXMuCisKKzMpIGJ1aWxkCisKK1RoaXMgY29tbWFuZCB3cml0ZXMgb3V0IHRoZSBoYXJkY29kZWQgbWFwcGluZyBkYXRhIGluIE51bWVyaWNDb2RlRGF0YS5qYXZhCitpbiBJQ1UgcmVzb3VyY2UgYnVuZGxlIHNvdXJjZSBmb3JtYXQgLSBjdXJyZW5jeU51bWVyaWNDb2Rlcy50eHQuCisKKworW1JlbGVhc2UgVGFza3NdCisKK0ZvciBlYWNoIElDVSByZWxlYXNlLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIG1hcHBpbmcgZGF0YSBpcyB1cCB0byBkYXRlLgorCitQcmVyZXF1aXNpdGVzOiBKYXZhIDYrLCBhbnQKKworRmlyc3QsIHJ1biB0aGUgYW50IHRhcmdldCAiY2hlY2siLiBUaGlzIGFudCB0YXJnZXQgZG93bmxvYWQgWE1MIGZpbGVzIGZyb20KK3RoZSBTSVggSW50ZXJiYW5rIENsZWFyaW5nIHNpdGUgYW5kIGludm9rZSB0aGUgdG9vbCBjb21tYW5kICJjaGVjayIuCisKK1doZW4gdGhlIHRhcmdldCBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIHlvdSBzaG91bGQgc2VlIHRoZSBsb2cgbGlrZSBiZWxvdzoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0M6XGRldnRsc1x0cnVua1xjdXJyZW5jeT5hbnQgY2hlY2sKK0J1aWxkZmlsZTogQzpcZGV2dGxzXHRydW5rXGN1cnJlbmN5XGJ1aWxkLnhtbAorCitjbGFzc2VzOgorCitfY2hlY2tMb2NhbFhtbDoKKworX2xvY2FsWG1sOgorCitfZG93bmxvYWRYbWw6CisgICAgIFtlY2hvXSBEb3dubG9hZGluZyBJU08gNDIxNyBYTUwgZGF0YSBmaWxlcworICAgICAgW2dldF0gR2V0dGluZzogaHR0cDovL3d3dy5jdXJyZW5jeS1pc28ub3JnL2RsX2lzb190YWJsZV9hMS54bWwKKyAgICAgIFtnZXRdIFRvOiBDOlxkZXZ0bHNcdHJ1bmtcY3VycmVuY3lcb3V0XHhtbFxkbF9pc29fdGFibGVfYTEueG1sCisgICAgICBbZ2V0XSBHZXR0aW5nOiBodHRwOi8vd3d3LmN1cnJlbmN5LWlzby5vcmcvZGxfaXNvX3RhYmxlc19hMy54bWwKKyAgICAgIFtnZXRdIFRvOiBDOlxkZXZ0bHNcdHJ1bmtcY3VycmVuY3lcb3V0XHhtbFxkbF9pc29fdGFibGVzX2EzLnhtbAorCit4bWxEYXRhOgorCitjaGVjazoKKyAgICAgW2phdmFdIFtPS10gSUNVIGRhdGEgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIHJlZmVyZW5jZSBkYXRhCisKK0JVSUxEIFNVQ0NFU1NGVUwKK1RvdGFsIHRpbWU6IDIgc2Vjb25kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW4gdGhpcyBjYXNlLCBvdXIgZGF0YSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbGF0ZXN0IFhNTCBkYXRhIGFuZCB5b3UncmUgZG9uZS4KKworCitJZiB0aGUgZGF0YSBpcyBvdXQgb2Ygc3luYywgeW91IHNob3VsZCBzZWUgbWVzc2FnZSBsaWtlIGJlbG93OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hlY2s6CisgICAgIFtqYXZhXSBNaXNzaW5nIGFscGhhIGNvZGUgaW4gSUNVIG1hcCBbWldSXQorICAgICBbamF2YV0gQ29kZXMgbm90IGZvdW5kIGluIHRoZSByZWZlcmVuY2UgZGF0YTogWlpaCisKK0JVSUxEIEZBSUxFRAorQzpcZGV2dGxzXHRydW5rXGN1cnJlbmN5XGJ1aWxkLnhtbDo1NDogSmF2YSByZXR1cm5lZDogMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW4gdGhpcyBjYXNlLCB5b3UgaGF2ZSB0byB1cGRhdGUgdGhlIGhhcmRjb2RlZCBkYXRhIGluIE51bWVyaWNDb2RlRGF0YS4KK1lvdSBjYW4gZWl0aGVyIGVkaXQgdGhlIHRhYmxlIGluIE51bWVyaWNDb2RlRGF0YSBtYW51YWxseSwgb3IgcnVuIHRoZSB0b29sCitjb21tYW5kICJwcmludCIgYW5kIGNvcHkgdGhlIG91dHB1dCBhbmQgcGFzdGUgaXQgdG8gdGhlIHRhYmxlLgorCitPbmNlIHlvdSBtYWtlIHN1cmUgImFudCBjaGVjayIgcmV0dXJucyBubyBlcnJvcnMsIHJ1biAiYW50IGJ1aWxkIi4gVGhpcwordGFyZ2V0IGdlbmVyYXRlIG91dC9yZXMvY3VycmVuY3lOdW1lcmljQ29kZXMudHh0LiBUaGUgZmlsZSBzaG91bGQgZ28gdG8KKzxpY3U0Yz4vc291cmNlL2RhdGEvbWlzYyBkaXJlY3RvcnkuCisKK05vdGU6IFRoZSBkZWZhdWx0IGFudCB0YXJnZXQgZG9lcyBib3RoIG9wZXJhdGlvbi4gQWx0aG91Z2ggaXQgY3JlYXRlcyB0aGUKK0lDVSByZXNvdXJjZSBmaWxlLCB5b3UgZG8gbm90IG5lZWQgdG8gcmVwbGFjZSB0aGUgb25lIGluIElDVTRDIHBhY2thZ2Ugd2l0aAordGhlIG5ld2x5IGdlbmVyYXRlZCBvbmUgaWYgImNoZWNrIiBzdWNjZXNzZnVsbHkgZmluaXNoZWQuCisKZGlmZiAtLWdpdCBhL2N1cnJlbmN5L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbC9jdXJyZW5jeS9DdXJyZW5jeURhdGFFbnRyeS5qYXZhIGIvY3VycmVuY3kvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29sL2N1cnJlbmN5L0N1cnJlbmN5RGF0YUVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkZmM0MAotLS0gL2Rldi9udWxsCisrKyBiL2N1cnJlbmN5L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbC9jdXJyZW5jeS9DdXJyZW5jeURhdGFFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgICAgICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLmljdS5kZXYudG9vbC5jdXJyZW5jeTsKKworLyoqCisgKiBDdXJyZW5jeSBkYXRhIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFhNTCBkYXRhIGRpc3RyaWJ1dGVkIGJ5IFNJWCBJbnRlcmJhbmsgQ2xlYXJpbmcKKyAqIChUaGUgSVNPIDQyMTcgbWFpbnRlbmFuY2UgYWdlbmN5KS4KKyAqLworcHVibGljIGNsYXNzIEN1cnJlbmN5RGF0YUVudHJ5IHsKKyAgICBwcml2YXRlIFN0cmluZyBlbnRpdHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVuY3k7CisgICAgcHJpdmF0ZSBTdHJpbmcgYWxwaGFiZXRpY0NvZGU7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIG51bWVyaWNDb2RlOworICAgIHByaXZhdGUgSW50ZWdlciBtaW5vclVuaXQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgd2l0aGRyYXdhbERhdGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtYXJrOworICAgIHByaXZhdGUgYm9vbGVhbiBoaXN0b3JpYzsKKworICAgIHByaXZhdGUgQ3VycmVuY3lEYXRhRW50cnkoU3RyaW5nIGVudGl0eSwgU3RyaW5nIGN1cnJlbmN5LCBTdHJpbmcgYWxwaGFiZXRpY0NvZGUsIEludGVnZXIgbnVtZXJpY0NvZGUsIEludGVnZXIgbWlub3JVbml0LCBTdHJpbmcgd2l0aGRyYXdhbERhdGUsIFN0cmluZyByZW1hcmssIGJvb2xlYW4gaGlzdG9yaWMpIHsKKyAgICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7CisgICAgICAgIHRoaXMuY3VycmVuY3kgPSBjdXJyZW5jeTsKKyAgICAgICAgdGhpcy5hbHBoYWJldGljQ29kZSA9IGFscGhhYmV0aWNDb2RlOworICAgICAgICB0aGlzLm51bWVyaWNDb2RlID0gbnVtZXJpY0NvZGU7CisgICAgICAgIHRoaXMubWlub3JVbml0ID0gbWlub3JVbml0OworICAgICAgICB0aGlzLndpdGhkcmF3YWxEYXRlID0gd2l0aGRyYXdhbERhdGU7CisgICAgICAgIHRoaXMucmVtYXJrID0gcmVtYXJrOworICAgICAgICB0aGlzLmhpc3RvcmljID0gaGlzdG9yaWM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBlbnRpdHkoKSB7CisgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBjdXJyZW5jeSgpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbmN5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgYWxwaGFiZXRpY0NvZGUoKSB7CisgICAgICAgIHJldHVybiBhbHBoYWJldGljQ29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBudW1lcmljQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bWVyaWNDb2RlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIG1pbm9yVW5pdCgpIHsKKyAgICAgICAgcmV0dXJuIG1pbm9yVW5pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHdpdGhkcmF3YWxEYXRlKCkgeworICAgICAgICByZXR1cm4gd2l0aGRyYXdhbERhdGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyByZW1hcmsoKSB7CisgICAgICAgIHJldHVybiByZW1hcms7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlzdG9yaWMoKSB7CisgICAgICAgIHJldHVybiBoaXN0b3JpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIFN0cmluZyBlbnRpdHlfOworICAgICAgICBwcml2YXRlIFN0cmluZyBjdXJyZW5jeV87CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGFscGhhYmV0aWNDb2RlXzsKKyAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIG51bWVyaWNDb2RlXzsKKyAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIG1pbm9yVW5pdF87CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgd2l0aGRyYXdhbERhdGVfOworICAgICAgICBwcml2YXRlIFN0cmluZyByZW1hcmtfOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGlzdG9yaWNfID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RW50aXR5KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIGVudGl0eV8gPSBlbnRpdHk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEN1cnJlbmN5KFN0cmluZyBjdXJyZW5jeSkgeworICAgICAgICAgICAgY3VycmVuY3lfID0gY3VycmVuY3k7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEFscGhhYmV0aWNDb2RlKFN0cmluZyBhbHBoYWJldGljQ29kZSkgeworICAgICAgICAgICAgYWxwaGFiZXRpY0NvZGVfID0gYWxwaGFiZXRpY0NvZGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE51bWVyaWNDb2RlKFN0cmluZyBudW1lcmljQ29kZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBudW1lcmljQ29kZV8gPSBJbnRlZ2VyLnBhcnNlSW50KG51bWVyaWNDb2RlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1pbm9yVW5pdChTdHJpbmcgbWlub3JVbml0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1pbm9yVW5pdF8gPSBJbnRlZ2VyLnBhcnNlSW50KG1pbm9yVW5pdCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRXaXRoZHJhd2FsRGF0ZShTdHJpbmcgd2l0aGRyYXdhbERhdGUpIHsKKyAgICAgICAgICAgIHdpdGhkcmF3YWxEYXRlXyA9IHdpdGhkcmF3YWxEYXRlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRSZW1hcmsoU3RyaW5nIHJlbWFyaykgeworICAgICAgICAgICAgcmVtYXJrXyA9IHJlbWFyazsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SGlzdG9yaWMoKSB7CisgICAgICAgICAgICBoaXN0b3JpY18gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ3VycmVuY3lEYXRhRW50cnkgYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnJlbmN5RGF0YUVudHJ5KGVudGl0eV8sIGN1cnJlbmN5XywgYWxwaGFiZXRpY0NvZGVfLCBudW1lcmljQ29kZV8sIG1pbm9yVW5pdF8sIHdpdGhkcmF3YWxEYXRlXywgcmVtYXJrXywgaGlzdG9yaWNfKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlc2V0KCkgeworICAgICAgICAgICAgZW50aXR5XyA9IG51bGw7CisgICAgICAgICAgICBjdXJyZW5jeV8gPSBudWxsOworICAgICAgICAgICAgYWxwaGFiZXRpY0NvZGVfID0gbnVsbDsKKyAgICAgICAgICAgIG51bWVyaWNDb2RlXyA9IG51bGw7CisgICAgICAgICAgICBtaW5vclVuaXRfID0gbnVsbDsKKyAgICAgICAgICAgIHdpdGhkcmF3YWxEYXRlXyA9IG51bGw7CisgICAgICAgICAgICByZW1hcmtfID0gbnVsbDsKKyAgICAgICAgICAgIGhpc3RvcmljXyA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jdXJyZW5jeS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2wvY3VycmVuY3kvQ3VycmVuY3lEYXRhUGFyc2VyLmphdmEgYi9jdXJyZW5jeS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2wvY3VycmVuY3kvQ3VycmVuY3lEYXRhUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3M2QwMAotLS0gL2Rldi9udWxsCisrKyBiL2N1cnJlbmN5L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbC9jdXJyZW5jeS9DdXJyZW5jeURhdGFQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICAgICAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5pY3UuZGV2LnRvb2wuY3VycmVuY3k7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworCitpbXBvcnQgY29tLmlibS5pY3UuZGV2LnRvb2wuY3VycmVuY3kuQ3VycmVuY3lEYXRhRW50cnkuQnVpbGRlcjsKKworLyoqCisgKiBQYXJzZXIgZm9yIElTTyA0MjE3IGRhdGEgZmlsZSBpbiBYTUwgZm9ybWF0IGRpc3RyaWJ1dGVkIGJ5IFNJWCBJbnRlcmJhbmsgQ2xlYXJpbmcKKyAqIChUaGUgSVNPIDQyMTcgbWFpbnRlbmFuY2UgYWdlbmN5KS4KKyAqLworcHVibGljIGNsYXNzIEN1cnJlbmN5RGF0YVBhcnNlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248Q3VycmVuY3lEYXRhRW50cnk+IHBhcnNlKEZpbGUgZGF0YUZpbGUsIGJvb2xlYW4gaGlzdG9yaWMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbGxlY3Rpb248Q3VycmVuY3lEYXRhRW50cnk+IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyOworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKyAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBIYW5kbGVyKGhpc3RvcmljKTsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgRmlsZUlucHV0U3RyZWFtKGRhdGFGaWxlKSwgaGFuZGxlcik7CisgICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyLmdldFBhcnNlZElTT0N1cnJlbmNpZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBlbnVtIEVsZW1lbnRUeXBlIHsKKyAgICAgICAgICAgIEVOVElUWSwKKyAgICAgICAgICAgIENVUlJFTkNZLAorICAgICAgICAgICAgQUxQSEFCRVRJQ19DT0RFLAorICAgICAgICAgICAgTlVNRVJJQ19DT0RFLAorICAgICAgICAgICAgTUlOT1JfVU5JVCwKKyAgICAgICAgICAgIFdJVEhEUkFXQUxfREFURSwKKyAgICAgICAgICAgIFJFTUFSSywKKyAgICAgICAgICAgIE9USEVSCisgICAgICAgIH07CisKKyAgICAgICAgQ29sbGVjdGlvbjxDdXJyZW5jeURhdGFFbnRyeT4gaXNvQ3VycmVuY2llcyA9IG5ldyBMaW5rZWRMaXN0PEN1cnJlbmN5RGF0YUVudHJ5PigpOworICAgICAgICBFbGVtZW50VHlwZSBlbGVtID0gRWxlbWVudFR5cGUuT1RIRVI7CisgICAgICAgIEJ1aWxkZXIgY3VyckJsZCA9IG5ldyBCdWlsZGVyKCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhpc3RvcmljOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjdXJyRWxlbU5hbWU7CisKKyAgICAgICAgcHVibGljIEhhbmRsZXIoYm9vbGVhbiBoaXN0b3JpYykgeworICAgICAgICAgICAgdGhpcy5oaXN0b3JpYyA9IGhpc3RvcmljOworICAgICAgICAgICAgY3VyckVsZW1OYW1lID0gaGlzdG9yaWMgPyAiSVNPX0NVUlJFTkNZX0hJU1RPUklDIiA6ICJJU09fQ1VSUkVOQ1kiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248Q3VycmVuY3lEYXRhRW50cnk+IGdldFBhcnNlZElTT0N1cnJlbmNpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gaXNvQ3VycmVuY2llczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICAgICAgaWYgKHFOYW1lLmVxdWFscyhjdXJyRWxlbU5hbWUpKSB7CisgICAgICAgICAgICAgICAgY3VyckJsZC5yZXNldCgpOworICAgICAgICAgICAgICAgIGVsZW0gPSBFbGVtZW50VHlwZS5PVEhFUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbSA9IEVsZW1lbnRUeXBlLnZhbHVlT2YocU5hbWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBFbGVtZW50VHlwZS5PVEhFUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgeworICAgICAgICAgICAgLy8gZW1pdCBhIGN1cnJlbmN5IGRhdGEKKyAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMoY3VyckVsZW1OYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChoaXN0b3JpYykgeworICAgICAgICAgICAgICAgICAgICBjdXJyQmxkLnNldEhpc3RvcmljKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzb0N1cnJlbmNpZXMuYWRkKGN1cnJCbGQuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgY3VyckJsZC5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbSA9IEVsZW1lbnRUeXBlLk9USEVSOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICAgICAgc3dpdGNoIChlbGVtKSB7CisgICAgICAgICAgICBjYXNlIEVOVElUWToKKyAgICAgICAgICAgICAgICBjdXJyQmxkLnNldEVudGl0eShuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKS50cmltKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDVVJSRU5DWToKKyAgICAgICAgICAgICAgICBjdXJyQmxkLnNldEN1cnJlbmN5KG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMUEhBQkVUSUNfQ09ERToKKyAgICAgICAgICAgICAgICBjdXJyQmxkLnNldEFscGhhYmV0aWNDb2RlKG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5VTUVSSUNfQ09ERToKKyAgICAgICAgICAgICAgICBjdXJyQmxkLnNldE51bWVyaWNDb2RlKG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JTk9SX1VOSVQ6CisgICAgICAgICAgICAgICAgY3VyckJsZC5zZXRNaW5vclVuaXQobmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCkudHJpbSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0lUSERSQVdBTF9EQVRFOgorICAgICAgICAgICAgICAgIGN1cnJCbGQuc2V0V2l0aGRyYXdhbERhdGUobmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCkudHJpbSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkVNQVJLOgorICAgICAgICAgICAgICAgIGN1cnJCbGQuc2V0UmVtYXJrKG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIE5PT1AKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2N1cnJlbmN5L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbC9jdXJyZW5jeS9NYWluLmphdmEgYi9jdXJyZW5jeS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2wvY3VycmVuY3kvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmMxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW5jeS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2wvY3VycmVuY3kvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgICAgICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLmljdS5kZXYudG9vbC5jdXJyZW5jeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworLyoqCisgKiBUaGUgdG9vbCB1c2VkIGZvciBJU08gNDIxNyBhbHBoYTMtbnVtZXJpYzMgY29kZSBtYXBwaW5nIGRhdGEgbWFpbnRlbmFuY2UuCisgKiBUaGlzIGNvZGUgaXMgdXNlZCBmb3Igc3luY2hyb25pemluZyBJQ1UgYWxwaGEzLW51bWVyaWMzIG1hcHBpbmcgZGF0YSB3aXRoCisgKiB0aGUgZGF0YSBkaXN0cmlidXRlZCBieSBTSVggSW50ZXJiYW5rIENsZWFyaW5nLgorICovCitwdWJsaWMgY2xhc3MgTWFpbiB7CisgICAgcHJpdmF0ZSBlbnVtIENvbW1hbmQgeworICAgICAgICBDSEVDSywKKyAgICAgICAgUFJJTlQsCisgICAgICAgIEJVSUxELAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTkFNRSA9ICJjdXJyZW5jeU51bWVyaWNDb2RlcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcuLi4gYXJncykgeworICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBDb21tYW5kIGNtZCA9IG51bGw7CisKKyAgICAgICAgLy8gMXN0IGFyZ3VtZW50IG11c3QgYmUgY29tbWFuZAorICAgICAgICBpZiAoYXJnc1swXS5lcXVhbHNJZ25vcmVDYXNlKENvbW1hbmQuQ0hFQ0submFtZSgpKSkgeworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDMpIHsKKyAgICAgICAgICAgICAgICBjbWQgPSBDb21tYW5kLkNIRUNLOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbMF0uZXF1YWxzSWdub3JlQ2FzZShDb21tYW5kLlBSSU5ULm5hbWUoKSkpIHsKKyAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAzKSB7CisgICAgICAgICAgICAgICAgY21kID0gQ29tbWFuZC5QUklOVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhcmdzWzBdLmVxdWFsc0lnbm9yZUNhc2UoQ29tbWFuZC5CVUlMRC5uYW1lKCkpKSB7CisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgIGNtZCA9IENvbW1hbmQuQlVJTEQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY21kID09IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgCisgICAgICAgIGludCBzdGF0dXMgPSAwOworCisgICAgICAgIGlmIChjbWQgPT0gQ29tbWFuZC5CVUlMRCkgeworICAgICAgICAgICAgRmlsZSBvdXRmaWxlID0gbmV3IEZpbGUoYXJnc1sxXSwgUkVTTkFNRSArICIudHh0Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dGZpbGUpLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICBOdW1lcmljQ29kZURhdGEuZ2V0RGVmYXVsdEluc3RhbmNlKCkud3JpdGVSZXNvdXJjZShvc3csIFJFU05BTUUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIDJuZCBhcmd1bWVudCBpcyBjdXJyZW50IGRhdGEgeG1sIGZpbGUKKyAgICAgICAgICAgIC8vIDNyZCBhcmd1bWVudCBpcyBoaXN0b3JpYyBkYXRhIHhtbCBmaWxlCisgICAgICAgICAgICBGaWxlIGN1cnJlbnRYbWwgPSBuZXcgRmlsZShhcmdzWzFdKTsKKyAgICAgICAgICAgIEZpbGUgaGlzdG9yaWNYbWwgPSBuZXcgRmlsZShhcmdzWzJdKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb248Q3VycmVuY3lEYXRhRW50cnk+IGN1cnJlbnREYXRhRW50cmllcyA9IG51bGw7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEN1cnJlbmN5RGF0YUVudHJ5PiBoaXN0b3JpY0RhdGFFbnRyaWVzID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RGF0YUVudHJpZXMgPSBDdXJyZW5jeURhdGFQYXJzZXIucGFyc2UoY3VycmVudFhtbCwgZmFsc2UpOworICAgICAgICAgICAgICAgIGhpc3RvcmljRGF0YUVudHJpZXMgPSBDdXJyZW5jeURhdGFQYXJzZXIucGFyc2UoaGlzdG9yaWNYbWwsIHRydWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgTnVtZXJpY0NvZGVEYXRhIG51bUNvZGVEYXRhID0gTnVtZXJpY0NvZGVEYXRhLmNyZWF0ZUluc3RhbmNlKGN1cnJlbnREYXRhRW50cmllcyk7CisgICAgICAgICAgICAgICAgbnVtQ29kZURhdGEubWVyZ2UoTnVtZXJpY0NvZGVEYXRhLmNyZWF0ZUluc3RhbmNlKGhpc3RvcmljRGF0YUVudHJpZXMpKTsKKworICAgICAgICAgICAgICAgIGlmIChjbWQgPT0gQ29tbWFuZC5QUklOVCkgeworICAgICAgICAgICAgICAgICAgICBudW1Db2RlRGF0YS5wcmludEFycmF5KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNtZCA9PSBDb21tYW5kLkNIRUNLKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc09LID0gY2hlY2tEYXRhKG51bUNvZGVEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW09LXSBJQ1UgZGF0YSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcmVmZXJlbmNlIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uZXhpdChzdGF0dXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbVXNhZ2VdIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAxKSBqYXZhIGNvbS5pYm0uaWN1LmRldi50b29sLmN1cnJlbmN5Lk1haW4gY2hlY2sgPGN1cnJlbnRYTUw+IDxoaXN0b3JpY1hNTD4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFZlcmlmaWVzIHRoZSBJQ1UgZGF0YSAodGFibGUgaW4gTnVtZXJpY0NvZGVEYXRhKSB3aXRoIHRoZSByZWZlcmVuY2UgZGF0YS4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIEFyZ3VtZW50KHMpOiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICA8Y3VycmVudFhNTD4gIC0gQ3VycmVudCBjdXJyZW5jaWVzICYgZnVuZHMgZGF0YSAoVGFibGUgQS4xKSBpbiBYTUwgZm9ybWF0Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIDxoaXN0b3JpY1hNTD4gLSBIaXN0b3JpYyBkZW5vbWluYXRpb25zIGRhdGEgKFRhYmxlIEEuMykgaW4gWE1MIGZvcm1hdCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgMikgamF2YSBjb20uaWJtLmljdS5kZXYudG9vbC5jdXJyZW5jeS5NYWluIHByaW50IDxjdXJyZW50WE1MPiA8aGlzdG9yaWNYTUw+Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBQcmludHMgb3V0IHRoZSBhbHBoYS1udW1lcmljIGNvZGUgbWFwcGluZyBpbXBvcnRlZCBmcm9tIHRoZSByZWZlcmVuY2UgZGF0YS4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIEFyZ3VtZW50KHMpOiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICA8Y3VycmVudFhNTD4gIC0gQ3VycmVudCBjdXJyZW5jaWVzICYgZnVuZHMgZGF0YSAoVGFibGUgQS4xKSBpbiBYTUwgZm9ybWF0Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIDxoaXN0b3JpY1hNTD4gLSBIaXN0b3JpYyBkZW5vbWluYXRpb25zIGRhdGEgKFRhYmxlIEEuMykgaW4gWE1MIGZvcm1hdCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgMykgamF2YSBjb20uaWJtLmljdS5kZXYudG9vbC5jdXJyZW5jeS5NYWluIGJ1aWxkIDxvdXR0eHQ+Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBXcml0ZXMgb3V0IHRoZSBhbHBoYS1udW1lcmljIGluIE51bWVyaWNDb2RlRGF0YSBpbnRvIElDVSByZXNvdXJjZSBidW5kbGUgc291cmNlIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAoLnR4dCkgZm9ybWF0LiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgQXJndW1lbnQocyk6Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIDxvdXRkaXI+ICAgICAgLSBPdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBJQ1UgcmVzb3VyY2UgYnVuZGxlIHNvdXJjZSAoLnR4dCkgZm9ybWF0Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW05vdGVdIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBSZWZlcmVuY2UgWE1MIGZpbGVzIGFyZSBkaXN0cmlidXRlZCBieSB0aGUgSVNPIDQyMTcgbWFpbnRlbmFuY2UgYWdlbmN5IGF0Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBbaHR0cDovL3d3dy5jdXJyZW5jeS1pc28ub3JnL2lzb19pbmRleC9pc29fdGFibGVzLmh0bV0uIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0RhdGEoTnVtZXJpY0NvZGVEYXRhIHJlZkRhdGEpIHsKKyAgICAgICAgYm9vbGVhbiBpc09LID0gdHJ1ZTsKKworICAgICAgICBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGljdU1hcCA9IE51bWVyaWNDb2RlRGF0YS5nZXREZWZhdWx0SW5zdGFuY2UoKS5nZXRBbHBoYU51bWVyaWNDb2RlTWFwKCk7CisgICAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gcmVmTWFwID0gcmVmRGF0YS5nZXRBbHBoYU51bWVyaWNDb2RlTWFwKCk7CisKKyAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gcmVmRW50cnkgOiByZWZNYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHJlZkFscGhhID0gcmVmRW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBTdHJpbmcgcmVmTnVtZXJpYyA9IHJlZkVudHJ5LmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgIFN0cmluZyBpY3VOdW1lcmljID0gaWN1TWFwLmdldChyZWZBbHBoYSk7CisgICAgICAgICAgICBpZiAoaWN1TnVtZXJpYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaXNzaW5nIGFscGhhIGNvZGUgaW4gSUNVIG1hcCBbIiArIHJlZkFscGhhICsgIl0iKTsKKyAgICAgICAgICAgICAgICBpc09LID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpY3VOdW1lcmljLmVxdWFscyhyZWZOdW1lcmljKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtZXJpYyBjb2RlIG1pc21hdGNoIFsiICsgcmVmQWxwaGEgKyAiXSBJQ1U9IiArIGljdU51bWVyaWMgKyAiIC0gUmVmZXJlbmNlPSIgKyByZWZOdW1lcmljKTsKKyAgICAgICAgICAgICAgICBpc09LID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTZXQ8U3RyaW5nPiBpY3VLZXlTZXQgPSBpY3VNYXAua2V5U2V0KCk7CisgICAgICAgIFNldDxTdHJpbmc+IHJlZktleVNldCA9IHJlZk1hcC5rZXlTZXQoKTsKKyAgICAgICAgaWYgKCFyZWZLZXlTZXQuY29udGFpbnNBbGwoaWN1S2V5U2V0KSkgeworICAgICAgICAgICAgaXNPSyA9IGZhbHNlOworICAgICAgICAgICAgU2V0PFN0cmluZz4gdG1wID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihpY3VLZXlTZXQpOworICAgICAgICAgICAgdG1wLnJlbW92ZUFsbChyZWZLZXlTZXQpOworCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBhbHBoYSA6IHRtcCkgeworICAgICAgICAgICAgICAgIGlmIChidWYubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGFscGhhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb2RlcyBub3QgZm91bmQgaW4gdGhlIHJlZmVyZW5jZSBkYXRhOiAiICsgYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpc09LOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2N1cnJlbmN5L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbC9jdXJyZW5jeS9OdW1lcmljQ29kZURhdGEuamF2YSBiL2N1cnJlbmN5L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbC9jdXJyZW5jeS9OdW1lcmljQ29kZURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRkYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY3VycmVuY3kvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29sL2N1cnJlbmN5L051bWVyaWNDb2RlRGF0YS5qYXZhCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgICAgICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLmljdS5kZXYudG9vbC5jdXJyZW5jeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogQ29udGFpbmVyIG9mIElTTyA0MjE3IGFscGhhMyAtIG51bWVyaWMzIGNvZGUgbWFwcGluZyBkYXRhCisgKi8KK3B1YmxpYyBjbGFzcyBOdW1lcmljQ29kZURhdGEgeworICAgIHByaXZhdGUgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBfY29kZU1hcDsKKworICAgIHByaXZhdGUgTnVtZXJpY0NvZGVEYXRhKFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gY29kZU1hcCkgeworICAgICAgICBfY29kZU1hcCA9IGNvZGVNYXA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOdW1lcmljQ29kZURhdGEgZ2V0RGVmYXVsdEluc3RhbmNlKCkgeworICAgICAgICBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBmb3IgKFN0cmluZ1tdIGRhdGFFbnRyeSA6IENPREVfTUFQX0RBVEEpIHsKKyAgICAgICAgICAgIG1hcC5wdXQoZGF0YUVudHJ5WzBdLCBkYXRhRW50cnlbMV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTnVtZXJpY0NvZGVEYXRhKG1hcCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOdW1lcmljQ29kZURhdGEgY3JlYXRlSW5zdGFuY2UoQ29sbGVjdGlvbjxDdXJyZW5jeURhdGFFbnRyeT4gZGF0YUVudHJpZXMpIHsKKyAgICAgICAgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChDdXJyZW5jeURhdGFFbnRyeSBkYXRhRW50cnkgOiBkYXRhRW50cmllcykgeworICAgICAgICAgICAgU3RyaW5nIGFscGhhQ29kZSA9IGRhdGFFbnRyeS5hbHBoYWJldGljQ29kZSgpOworICAgICAgICAgICAgSW50ZWdlciBudW1Db2RlID0gZGF0YUVudHJ5Lm51bWVyaWNDb2RlKCk7CisgICAgICAgICAgICBpZiAoYWxwaGFDb2RlID09IG51bGwgfHwgbnVtQ29kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXAucHV0KGFscGhhQ29kZSwgU3RyaW5nLmZvcm1hdCgiJTAzZCIsIG51bUNvZGUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE51bWVyaWNDb2RlRGF0YShtYXApOworICAgIH0KKworICAgIHB1YmxpYyBOdW1lcmljQ29kZURhdGEgbWVyZ2UoTnVtZXJpY0NvZGVEYXRhIGFub3RoZXJEYXRhKSB7CisgICAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gY29kZU1hcCA9IGFub3RoZXJEYXRhLmdldEFscGhhTnVtZXJpY0NvZGVNYXAoKTsKKyAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gY29kZU1hcEVudHJ5IDogY29kZU1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgYWxwaGFDb2RlID0gY29kZU1hcEVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgU3RyaW5nIG51bUNvZGUgPSBjb2RlTWFwRW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghX2NvZGVNYXAuY29udGFpbnNLZXkoYWxwaGFDb2RlKSkgeworICAgICAgICAgICAgICAgIF9jb2RlTWFwLnB1dChhbHBoYUNvZGUsIG51bUNvZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXhpc3RpbmdWYWx1ZSA9IF9jb2RlTWFwLmdldChhbHBoYUNvZGUpOworICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdWYWx1ZS5lcXVhbHMobnVtQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkR1cGxpY2F0ZWQgZGVmaW5pdGlvbiBmb3IgIiArIGFscGhhQ29kZSArICI6IHZhbHVlPSIgKyBleGlzdGluZ1ZhbHVlICsgIi9hbm90aGVyIHZhbHVlPSIgKyBudW1Db2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QWxwaGFOdW1lcmljQ29kZU1hcCgpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZE1hcChfY29kZU1hcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRBcnJheSgpIHsKKyAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBnZXRBbHBoYU51bWVyaWNDb2RlTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIHtcIiIgKyBlbnRyeS5nZXRLZXkoKSArICJcIiwgXCIiICsgZW50cnkuZ2V0VmFsdWUoKSArICJcIn0sIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVJlc291cmNlKE91dHB1dFN0cmVhbVdyaXRlciBvc3csIFN0cmluZyByZXNOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKKworICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihvc3csIHRydWUpOworCisgICAgICAgIC8vIEhlYWRlcgorICAgICAgICBwdy5wcmludGxuKCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICBwdy5wcmludGxuKFN0cmluZy5mb3JtYXQoIi8vIENvcHlyaWdodCAoQykgJTEkdFksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMiLCBjYWwpKTsKKyAgICAgICAgcHcucHJpbnRsbigiLy8gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIik7CisgICAgICAgIHB3LnByaW50bG4oIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIHB3LnByaW50bG4oIi8vIEJ1aWxkIHRvb2w6IGNvbS5pYm0uaWN1LmRldi50b29sLmN1cnJlbmN5Lk51bWVyaWNDb2RlRGF0YSIpOworICAgICAgICBwdy5wcmludGxuKFN0cmluZy5mb3JtYXQoIi8vIEJ1aWxkIGRhdGU6ICUxJHRGVCUxJHRUWiIsIGNhbCkpOworICAgICAgICBwdy5wcmludGxuKCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICBwdy5wcmludGxuKCIvLyA+PiAhISEgPj4gICBUSElTIElTIEEgTUFDSElORS1HRU5FUkFURUQgRklMRSAgIDw8ICEhISA8PCIpOworICAgICAgICBwdy5wcmludGxuKCIvLyA+PiAhISEgPj4+ICAgICAgICAgICAgRE8gTk9UIEVESVQgICAgICAgICAgICAgPDw8ICEhISA8PCIpOworICAgICAgICBwdy5wcmludGxuKCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICBwdy5wcmludGxuKCIiKTsKKworICAgICAgICAvLyBSZXNvdXJjZSByb290CisgICAgICAgIHB3LnByaW50bG4ocmVzTmFtZSArICI6dGFibGUobm9mYWxsYmFjayl7Iik7CisKKyAgICAgICAgLy8gTWFwIGRhdGEKKyAgICAgICAgcHcucHJpbnRsbigiICAgIGNvZGVNYXB7Iik7CisKKyAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gbWFwRW50cnkgOiBfY29kZU1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgYWxwaGFDb2RlID0gbWFwRW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpbnQgbnVtZXJpY0NvZGVWYWwgPSBJbnRlZ2VyLnBhcnNlSW50KG1hcEVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgcHcucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIgICAgICAgICUxJHM6aW50eyUyJGR9IiwgYWxwaGFDb2RlLCBudW1lcmljQ29kZVZhbCkpOworICAgICAgICB9CisKKyAgICAgICAgcHcucHJpbnRsbigiICAgIH0iKTsKKworICAgICAgICBwdy5wcmludGxuKCJ9Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBDT0RFX01BUF9EQVRBID0geworICAgICAgICB7IkFEUCIsICIwMjAifSwKKyAgICAgICAgeyJBRUQiLCAiNzg0In0sCisgICAgICAgIHsiQUZBIiwgIjAwNCJ9LAorICAgICAgICB7IkFGTiIsICI5NzEifSwKKyAgICAgICAgeyJBTEwiLCAiMDA4In0sCisgICAgICAgIHsiQU1EIiwgIjA1MSJ9LAorICAgICAgICB7IkFORyIsICI1MzIifSwKKyAgICAgICAgeyJBT0EiLCAiOTczIn0sCisgICAgICAgIHsiQU9OIiwgIjAyNCJ9LAorICAgICAgICB7IkFPUiIsICI5ODIifSwKKyAgICAgICAgeyJBUkEiLCAiMDMyIn0sCisgICAgICAgIHsiQVJQIiwgIjAzMiJ9LAorICAgICAgICB7IkFSUyIsICIwMzIifSwKKyAgICAgICAgeyJBVFMiLCAiMDQwIn0sCisgICAgICAgIHsiQVVEIiwgIjAzNiJ9LAorICAgICAgICB7IkFXRyIsICI1MzMifSwKKyAgICAgICAgeyJBWU0iLCAiOTQ1In0sCisgICAgICAgIHsiQVpNIiwgIjAzMSJ9LAorICAgICAgICB7IkFaTiIsICI5NDQifSwKKyAgICAgICAgeyJCQUQiLCAiMDcwIn0sCisgICAgICAgIHsiQkFNIiwgIjk3NyJ9LAorICAgICAgICB7IkJCRCIsICIwNTIifSwKKyAgICAgICAgeyJCRFQiLCAiMDUwIn0sCisgICAgICAgIHsiQkVDIiwgIjk5MyJ9LAorICAgICAgICB7IkJFRiIsICIwNTYifSwKKyAgICAgICAgeyJCRUwiLCAiOTkyIn0sCisgICAgICAgIHsiQkdMIiwgIjEwMCJ9LAorICAgICAgICB7IkJHTiIsICI5NzUifSwKKyAgICAgICAgeyJCSEQiLCAiMDQ4In0sCisgICAgICAgIHsiQklGIiwgIjEwOCJ9LAorICAgICAgICB7IkJNRCIsICIwNjAifSwKKyAgICAgICAgeyJCTkQiLCAiMDk2In0sCisgICAgICAgIHsiQk9CIiwgIjA2OCJ9LAorICAgICAgICB7IkJPViIsICI5ODQifSwKKyAgICAgICAgeyJCUkMiLCAiMDc2In0sCisgICAgICAgIHsiQlJFIiwgIjA3NiJ9LAorICAgICAgICB7IkJSTCIsICI5ODYifSwKKyAgICAgICAgeyJCUk4iLCAiMDc2In0sCisgICAgICAgIHsiQlJSIiwgIjk4NyJ9LAorICAgICAgICB7IkJTRCIsICIwNDQifSwKKyAgICAgICAgeyJCVE4iLCAiMDY0In0sCisgICAgICAgIHsiQldQIiwgIjA3MiJ9LAorICAgICAgICB7IkJZQiIsICIxMTIifSwKKyAgICAgICAgeyJCWVIiLCAiOTc0In0sCisgICAgICAgIHsiQlpEIiwgIjA4NCJ9LAorICAgICAgICB7IkNBRCIsICIxMjQifSwKKyAgICAgICAgeyJDREYiLCAiOTc2In0sCisgICAgICAgIHsiQ0hDIiwgIjk0OCJ9LAorICAgICAgICB7IkNIRSIsICI5NDcifSwKKyAgICAgICAgeyJDSEYiLCAiNzU2In0sCisgICAgICAgIHsiQ0hXIiwgIjk0OCJ9LAorICAgICAgICB7IkNMRiIsICI5OTAifSwKKyAgICAgICAgeyJDTFAiLCAiMTUyIn0sCisgICAgICAgIHsiQ05ZIiwgIjE1NiJ9LAorICAgICAgICB7IkNPUCIsICIxNzAifSwKKyAgICAgICAgeyJDT1UiLCAiOTcwIn0sCisgICAgICAgIHsiQ1JDIiwgIjE4OCJ9LAorICAgICAgICB7IkNTRCIsICI4OTEifSwKKyAgICAgICAgeyJDU0siLCAiMjAwIn0sCisgICAgICAgIHsiQ1VDIiwgIjkzMSJ9LAorICAgICAgICB7IkNVUCIsICIxOTIifSwKKyAgICAgICAgeyJDVkUiLCAiMTMyIn0sCisgICAgICAgIHsiQ1lQIiwgIjE5NiJ9LAorICAgICAgICB7IkNaSyIsICIyMDMifSwKKyAgICAgICAgeyJERE0iLCAiMjc4In0sCisgICAgICAgIHsiREVNIiwgIjI3NiJ9LAorICAgICAgICB7IkRKRiIsICIyNjIifSwKKyAgICAgICAgeyJES0siLCAiMjA4In0sCisgICAgICAgIHsiRE9QIiwgIjIxNCJ9LAorICAgICAgICB7IkRaRCIsICIwMTIifSwKKyAgICAgICAgeyJFQ1MiLCAiMjE4In0sCisgICAgICAgIHsiRUNWIiwgIjk4MyJ9LAorICAgICAgICB7IkVFSyIsICIyMzMifSwKKyAgICAgICAgeyJFR1AiLCAiODE4In0sCisgICAgICAgIHsiRVJOIiwgIjIzMiJ9LAorICAgICAgICB7IkVTQSIsICI5OTYifSwKKyAgICAgICAgeyJFU0IiLCAiOTk1In0sCisgICAgICAgIHsiRVNQIiwgIjcyNCJ9LAorICAgICAgICB7IkVUQiIsICIyMzAifSwKKyAgICAgICAgeyJFVVIiLCAiOTc4In0sCisgICAgICAgIHsiRklNIiwgIjI0NiJ9LAorICAgICAgICB7IkZKRCIsICIyNDIifSwKKyAgICAgICAgeyJGS1AiLCAiMjM4In0sCisgICAgICAgIHsiRlJGIiwgIjI1MCJ9LAorICAgICAgICB7IkdCUCIsICI4MjYifSwKKyAgICAgICAgeyJHRUsiLCAiMjY4In0sCisgICAgICAgIHsiR0VMIiwgIjk4MSJ9LAorICAgICAgICB7IkdIQyIsICIyODgifSwKKyAgICAgICAgeyJHSFAiLCAiOTM5In0sCisgICAgICAgIHsiR0hTIiwgIjkzNiJ9LAorICAgICAgICB7IkdJUCIsICIyOTIifSwKKyAgICAgICAgeyJHTUQiLCAiMjcwIn0sCisgICAgICAgIHsiR05GIiwgIjMyNCJ9LAorICAgICAgICB7IkdRRSIsICIyMjYifSwKKyAgICAgICAgeyJHUkQiLCAiMzAwIn0sCisgICAgICAgIHsiR1RRIiwgIjMyMCJ9LAorICAgICAgICB7IkdXUCIsICI2MjQifSwKKyAgICAgICAgeyJHWUQiLCAiMzI4In0sCisgICAgICAgIHsiSEtEIiwgIjM0NCJ9LAorICAgICAgICB7IkhOTCIsICIzNDAifSwKKyAgICAgICAgeyJIUkQiLCAiMTkxIn0sCisgICAgICAgIHsiSFJLIiwgIjE5MSJ9LAorICAgICAgICB7IkhURyIsICIzMzIifSwKKyAgICAgICAgeyJIVUYiLCAiMzQ4In0sCisgICAgICAgIHsiSURSIiwgIjM2MCJ9LAorICAgICAgICB7IklFUCIsICIzNzIifSwKKyAgICAgICAgeyJJTFMiLCAiMzc2In0sCisgICAgICAgIHsiSU5SIiwgIjM1NiJ9LAorICAgICAgICB7IklRRCIsICIzNjgifSwKKyAgICAgICAgeyJJUlIiLCAiMzY0In0sCisgICAgICAgIHsiSVNLIiwgIjM1MiJ9LAorICAgICAgICB7IklUTCIsICIzODAifSwKKyAgICAgICAgeyJKTUQiLCAiMzg4In0sCisgICAgICAgIHsiSk9EIiwgIjQwMCJ9LAorICAgICAgICB7IkpQWSIsICIzOTIifSwKKyAgICAgICAgeyJLRVMiLCAiNDA0In0sCisgICAgICAgIHsiS0dTIiwgIjQxNyJ9LAorICAgICAgICB7IktIUiIsICIxMTYifSwKKyAgICAgICAgeyJLTUYiLCAiMTc0In0sCisgICAgICAgIHsiS1BXIiwgIjQwOCJ9LAorICAgICAgICB7IktSVyIsICI0MTAifSwKKyAgICAgICAgeyJLV0QiLCAiNDE0In0sCisgICAgICAgIHsiS1lEIiwgIjEzNiJ9LAorICAgICAgICB7IktaVCIsICIzOTgifSwKKyAgICAgICAgeyJMQUsiLCAiNDE4In0sCisgICAgICAgIHsiTEJQIiwgIjQyMiJ9LAorICAgICAgICB7IkxLUiIsICIxNDQifSwKKyAgICAgICAgeyJMUkQiLCAiNDMwIn0sCisgICAgICAgIHsiTFNMIiwgIjQyNiJ9LAorICAgICAgICB7IkxUTCIsICI0NDAifSwKKyAgICAgICAgeyJMVFQiLCAiNDQwIn0sCisgICAgICAgIHsiTFVDIiwgIjk4OSJ9LAorICAgICAgICB7IkxVRiIsICI0NDIifSwKKyAgICAgICAgeyJMVUwiLCAiOTg4In0sCisgICAgICAgIHsiTFZMIiwgIjQyOCJ9LAorICAgICAgICB7IkxWUiIsICI0MjgifSwKKyAgICAgICAgeyJMWUQiLCAiNDM0In0sCisgICAgICAgIHsiTUFEIiwgIjUwNCJ9LAorICAgICAgICB7Ik1ETCIsICI0OTgifSwKKyAgICAgICAgeyJNR0EiLCAiOTY5In0sCisgICAgICAgIHsiTUdGIiwgIjQ1MCJ9LAorICAgICAgICB7Ik1LRCIsICI4MDcifSwKKyAgICAgICAgeyJNTEYiLCAiNDY2In0sCisgICAgICAgIHsiTU1LIiwgIjEwNCJ9LAorICAgICAgICB7Ik1OVCIsICI0OTYifSwKKyAgICAgICAgeyJNT1AiLCAiNDQ2In0sCisgICAgICAgIHsiTVJPIiwgIjQ3OCJ9LAorICAgICAgICB7Ik1UTCIsICI0NzAifSwKKyAgICAgICAgeyJNVVIiLCAiNDgwIn0sCisgICAgICAgIHsiTVZSIiwgIjQ2MiJ9LAorICAgICAgICB7Ik1XSyIsICI0NTQifSwKKyAgICAgICAgeyJNWE4iLCAiNDg0In0sCisgICAgICAgIHsiTVhWIiwgIjk3OSJ9LAorICAgICAgICB7Ik1ZUiIsICI0NTgifSwKKyAgICAgICAgeyJNWk0iLCAiNTA4In0sCisgICAgICAgIHsiTVpOIiwgIjk0MyJ9LAorICAgICAgICB7Ik5BRCIsICI1MTYifSwKKyAgICAgICAgeyJOR04iLCAiNTY2In0sCisgICAgICAgIHsiTklPIiwgIjU1OCJ9LAorICAgICAgICB7Ik5MRyIsICI1MjgifSwKKyAgICAgICAgeyJOT0siLCAiNTc4In0sCisgICAgICAgIHsiTlBSIiwgIjUyNCJ9LAorICAgICAgICB7Ik5aRCIsICI1NTQifSwKKyAgICAgICAgeyJPTVIiLCAiNTEyIn0sCisgICAgICAgIHsiUEFCIiwgIjU5MCJ9LAorICAgICAgICB7IlBFSSIsICI2MDQifSwKKyAgICAgICAgeyJQRU4iLCAiNjA0In0sCisgICAgICAgIHsiUEVTIiwgIjYwNCJ9LAorICAgICAgICB7IlBHSyIsICI1OTgifSwKKyAgICAgICAgeyJQSFAiLCAiNjA4In0sCisgICAgICAgIHsiUEtSIiwgIjU4NiJ9LAorICAgICAgICB7IlBMTiIsICI5ODUifSwKKyAgICAgICAgeyJQTFoiLCAiNjE2In0sCisgICAgICAgIHsiUFRFIiwgIjYyMCJ9LAorICAgICAgICB7IlBZRyIsICI2MDAifSwKKyAgICAgICAgeyJRQVIiLCAiNjM0In0sCisgICAgICAgIHsiUk9MIiwgIjY0MiJ9LAorICAgICAgICB7IlJPTiIsICI5NDYifSwKKyAgICAgICAgeyJSU0QiLCAiOTQxIn0sCisgICAgICAgIHsiUlVCIiwgIjY0MyJ9LAorICAgICAgICB7IlJVUiIsICI4MTAifSwKKyAgICAgICAgeyJSV0YiLCAiNjQ2In0sCisgICAgICAgIHsiU0FSIiwgIjY4MiJ9LAorICAgICAgICB7IlNCRCIsICIwOTAifSwKKyAgICAgICAgeyJTQ1IiLCAiNjkwIn0sCisgICAgICAgIHsiU0REIiwgIjczNiJ9LAorICAgICAgICB7IlNERyIsICI5MzgifSwKKyAgICAgICAgeyJTRUsiLCAiNzUyIn0sCisgICAgICAgIHsiU0dEIiwgIjcwMiJ9LAorICAgICAgICB7IlNIUCIsICI2NTQifSwKKyAgICAgICAgeyJTSVQiLCAiNzA1In0sCisgICAgICAgIHsiU0tLIiwgIjcwMyJ9LAorICAgICAgICB7IlNMTCIsICI2OTQifSwKKyAgICAgICAgeyJTT1MiLCAiNzA2In0sCisgICAgICAgIHsiU1JEIiwgIjk2OCJ9LAorICAgICAgICB7IlNSRyIsICI3NDAifSwKKyAgICAgICAgeyJTU1AiLCAiNzI4In0sCisgICAgICAgIHsiU1REIiwgIjY3OCJ9LAorICAgICAgICB7IlNWQyIsICIyMjIifSwKKyAgICAgICAgeyJTWVAiLCAiNzYwIn0sCisgICAgICAgIHsiU1pMIiwgIjc0OCJ9LAorICAgICAgICB7IlRIQiIsICI3NjQifSwKKyAgICAgICAgeyJUSlIiLCAiNzYyIn0sCisgICAgICAgIHsiVEpTIiwgIjk3MiJ9LAorICAgICAgICB7IlRNTSIsICI3OTUifSwKKyAgICAgICAgeyJUTVQiLCAiOTM0In0sCisgICAgICAgIHsiVE5EIiwgIjc4OCJ9LAorICAgICAgICB7IlRPUCIsICI3NzYifSwKKyAgICAgICAgeyJUUEUiLCAiNjI2In0sCisgICAgICAgIHsiVFJMIiwgIjc5MiJ9LAorICAgICAgICB7IlRSWSIsICI5NDkifSwKKyAgICAgICAgeyJUVEQiLCAiNzgwIn0sCisgICAgICAgIHsiVFdEIiwgIjkwMSJ9LAorICAgICAgICB7IlRaUyIsICI4MzQifSwKKyAgICAgICAgeyJVQUgiLCAiOTgwIn0sCisgICAgICAgIHsiVUFLIiwgIjgwNCJ9LAorICAgICAgICB7IlVHWCIsICI4MDAifSwKKyAgICAgICAgeyJVU0QiLCAiODQwIn0sCisgICAgICAgIHsiVVNOIiwgIjk5NyJ9LAorICAgICAgICB7IlVTUyIsICI5OTgifSwKKyAgICAgICAgeyJVWUkiLCAiOTQwIn0sCisgICAgICAgIHsiVVlVIiwgIjg1OCJ9LAorICAgICAgICB7IlVaUyIsICI4NjAifSwKKyAgICAgICAgeyJWRUIiLCAiODYyIn0sCisgICAgICAgIHsiVkVGIiwgIjkzNyJ9LAorICAgICAgICB7IlZORCIsICI3MDQifSwKKyAgICAgICAgeyJWVVYiLCAiNTQ4In0sCisgICAgICAgIHsiV1NUIiwgIjg4MiJ9LAorICAgICAgICB7IlhBRiIsICI5NTAifSwKKyAgICAgICAgeyJYQUciLCAiOTYxIn0sCisgICAgICAgIHsiWEFVIiwgIjk1OSJ9LAorICAgICAgICB7IlhCQSIsICI5NTUifSwKKyAgICAgICAgeyJYQkIiLCAiOTU2In0sCisgICAgICAgIHsiWEJDIiwgIjk1NyJ9LAorICAgICAgICB7IlhCRCIsICI5NTgifSwKKyAgICAgICAgeyJYQ0QiLCAiOTUxIn0sCisgICAgICAgIHsiWERSIiwgIjk2MCJ9LAorICAgICAgICB7IlhFVSIsICI5NTQifSwKKyAgICAgICAgeyJYT0YiLCAiOTUyIn0sCisgICAgICAgIHsiWFBEIiwgIjk2NCJ9LAorICAgICAgICB7IlhQRiIsICI5NTMifSwKKyAgICAgICAgeyJYUFQiLCAiOTYyIn0sCisgICAgICAgIHsiWFNVIiwgIjk5NCJ9LAorICAgICAgICB7IlhUUyIsICI5NjMifSwKKyAgICAgICAgeyJYVUEiLCAiOTY1In0sCisgICAgICAgIHsiWFhYIiwgIjk5OSJ9LAorICAgICAgICB7IllERCIsICI3MjAifSwKKyAgICAgICAgeyJZRVIiLCAiODg2In0sCisgICAgICAgIHsiWVVNIiwgIjg5MSJ9LAorICAgICAgICB7IllVTiIsICI4OTAifSwKKyAgICAgICAgeyJaQUwiLCAiOTkxIn0sCisgICAgICAgIHsiWkFSIiwgIjcxMCJ9LAorICAgICAgICB7IlpNSyIsICI4OTQifSwKKyAgICAgICAgeyJaUk4iLCAiMTgwIn0sCisgICAgICAgIHsiWlJaIiwgIjE4MCJ9LAorICAgICAgICB7IlpXRCIsICI3MTYifSwKKyAgICAgICAgeyJaV0wiLCAiOTMyIn0sCisgICAgICAgIHsiWldOIiwgIjk0MiJ9LAorICAgICAgICB7IlpXUiIsICI5MzUifSwKKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvbXVsdGkvTWFrZWZpbGUgYi9tdWx0aS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdkYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACisjIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IElCTSBDb3JwLiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCitjbGVhbjoKKwktcm0gLXJmIC4vdG1wCmRpZmYgLS1naXQgYS9tdWx0aS9jL01ha2VmaWxlIGIvbXVsdGkvYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFlOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvYy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwMiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyBtdWx0aWN1L2MgbWFrZWZpbGUKKworYWxsOgorCUBlY2hvIFRvIGJ1aWxkIGFsbCBJQ1VzOiAgJChNQUtFKSBhbGwtaWN1cworCUBlY2hvICJVc2luZyB0aGUgLWsgb3B0aW9uIG1heSBiZSBhIGdvb2QgaWRlYSBpZiBzb21lIGFyZSBub3QgYnVpbGRpbmcgcHJvcGVybHkuIgorCUBlY2hvIElDVVZFUlM6ICQoSUNVVkVSUykKKworaW5mbzoKKworI0lDVUNPTkY9c2ggLi9jb25maWd1cmUKK0lDVUNPTkY9JChNVUxUSUNVX1JPT1QpL2Mvc3VwZXJjb25mLnNoCitET1Q9JChzaGVsbCBwd2QpCitNVUxUSUNVX1JPT1Q9JChET1QpLy4uCitpbmNsdWRlICQoTVVMVElDVV9ST09UKS9jb21tb24vTWFrZWZpbGUtbXVsdGkuaW5jCistaW5jbHVkZSBNYWtlZmlsZS5sb2NhbAorCitJQ1VWRVJTOj0kKHNoZWxsIGNkICQoSUNVUyk7IGxzIGljdTRjKi50Z3ogfCBjdXQgLWQtIC1mMiB8IHNvcnQgfCB1bmlxIHwgZmdyZXAgLXYgLWYgJChNVUxUSUNVX1JPT1QpL2Mvb2xkLWljdS50eHQpCitJQ1U0SlZFUlM6PSQoc2hlbGwgY2QgJChJQ1VTKTsgbHMgaWN1NGoqLmphciB8IGN1dCAtZC0gLWYyIHwgY3V0IC1kLiAtZjEgfCAgc29ydCB8IHVuaXEgfCBmZ3JlcCAtdiAtZiAkKE1VTFRJQ1VfUk9PVCkvai9vbGQtaWN1NGoudHh0KQorCitCTEQ9JChDX0JMRCkKK0lOUz0kKENfSU5TKQorU1JDPSQoQ19TUkMpCisKK0FMTElDVVM9JChJQ1VWRVJTOiU9JChCTEQpLyUvJChTX0JMRCkpICQoSUNVVkVSUzolPSQoQkxEKS9yJS8kKFNfQkxEKSkKK1JJQ1VTPSQoSUNVVkVSUzolPSQoSU5TKS9yJS8kKFNfSU5TKSkKK0lJQ1VTPSQoSUNVVkVSUzolPSQoSU5TKS8lLyQoU19JTlMpKSAkKFJJQ1VTKQorCisKK0FQUkVDSU9VUz0kKElDVVZFUlM6JT0kKEJMRCkvJS8kKFNfU1JDKSkgJChJQ1VWRVJTOiU9JChCTEQpL3IlLyQoU19TUkMpKSAkKElDVVZFUlM6JT0kKEJMRCkvJS8kKFNfQkxEKSkgJChJQ1VWRVJTOiU9JChJTlMpLyUvJChTX0lOUykpICQoSUNVVkVSUzolPSQoQkxEKS9yJS8kKFNfQkxEKSkgJChJQ1VWRVJTOiU9JChJTlMpL3IlLyQoU19JTlMpKQorCisuUFJFQ0lPVVM6ICQoQVBSRUNJT1VTKQorCit0ZWhwcmVjaW91czoKKwllY2hvICQoQVBSRUNJT1VTKQorCiskKE1fVE1QKSAkKEJMRCkgJChJTlMpOgorCW1rZGlyICQoTV9UTVApCisJbWtkaXIgJChCTEQpICQoU1JDKSAgJChJTlMpCisKKyQoSU5TKS8lLyQoU19JTlMpOiAkKEJMRCkvJS8kKFNfQkxEKQorCUBpZiBbIC1mICQoQkxEKS8kKi9idWlsZC5lcnIgXTsgdGhlbiBlY2hvICcjIyMnIEVycm9yIGZvciAkKiBzdG9yZWQgaW4gJChCTEQpLyQqL2J1aWxkLmVyciAtIHJlbW92ZSBpZiB5b3Ugd2FudCBtZSB0byByZXRyeTsgZmFsc2U7ICBmaQorCSggbWFrZSAkKE1BS0VfT1BUUykgLUMgJChCTEQpLyQqL2ljdS9zb3VyY2UgMj4mMSBhbGwgaW5zdGFsbCB8IHRlZSAkKEJMRCkvJCovYnVpbGQubG9nICkgfHwgKCBtdiAkKEJMRCkvJCovYnVpbGQubG9nICQoQkxEKS8kKi9idWlsZC5lcnIgOyBmYWxzZSApCisJdG91Y2ggLWMgJEAKKworJChJTlMpL3IlLyQoU19JTlMpOiAkKEJMRCkvciUvJChTX0JMRCkKKwlAaWYgWyAtZiAkKEJMRCkvciQqL2J1aWxkLmVyciBdOyB0aGVuIGVjaG8gJyMjIycgRXJyb3IgZm9yICQqIHN0b3JlZCBpbiAkKEJMRCkvciQqL2J1aWxkLmVyciAtIHJlbW92ZSBpZiB5b3Ugd2FudCBtZSB0byByZXRyeTsgZmFsc2U7ICBmaQorCSggbWFrZSAkKE1BS0VfT1BUUykgLUMgJChCTEQpL3IkKi9pY3Uvc291cmNlIDI+JjEgYWxsIGluc3RhbGwgfCB0ZWUgJChCTEQpL3IkKi9idWlsZC5sb2cgKSB8fCAoIG12ICQoQkxEKS9yJCovYnVpbGQubG9nICQoQkxEKS9yJCovYnVpbGQuZXJyIDsgZmFsc2UgKQorCXRvdWNoIC1jICRACisKKyQoQkxEKS9yJS8kKFNfU1JDKTogJChJQ1VTKS9pY3U0Yy0lLXNyYy50Z3oKKwktbXYgJChCTEQpL3IkKiAkKEJMRCkvciQqLm9sZAorCS0oIHJtIC1yZiAuLyQoQkxEKS9yJCoub2xkJiApCisJbWtkaXIgLXAgJChCTEQpL3IkKgorCSggY2QgJChCTEQpL3IkKiA7IGd1bnppcCAtZCA8ICReIHwgdGFyIHhmcCAtICkKKwkoWyAtZiAkKERPVCkvcGF0Y2gvJCogXSAmJiBwYXRjaCAtZCAkKEJMRCkvciQqIC1wMSA8ICQoRE9UKS9wYXRjaC8kKikgfHwgdHJ1ZQorCXRvdWNoIC1jICRACisKKyQoQkxEKS8lLyQoU19TUkMpOiAkKElDVVMpL2ljdTRjLSUtc3JjLnRnegorCS1tdiAkKEJMRCkvJCogJChCTEQpLyQqLm9sZAorCS0oIHJtIC1yZiAuLyQoQkxEKS8kKi5vbGQmICkKKwlta2RpciAtcCAkKEJMRCkvJCoKKwkoIGNkICQoQkxEKS8kKiA7IGd1bnppcCAtZCA8ICReIHwgdGFyIHhmcCAtICkKKwkoWyAtZiAkKERPVCkvcGF0Y2gvJCogXSAmJiBwYXRjaCAtZCAkKEJMRCkvJCogLXAxIDwgJChET1QpL3BhdGNoLyQqKSB8fCB0cnVlCisJdG91Y2ggLWMgJEAKKworCiskKEJMRCkvciUvJChTX0JMRCk6ICQoQkxEKS9yJS8kKFNfU1JDKQorCS1ta2RpciAtcCAkKElOUykKKwktY2htb2QgYStyeCAkKEJMRCkvciQqL2ljdS9zb3VyY2UvY29uZmlndXJlICQoQkxEKS9yJCovaWN1L3NvdXJjZS9ydW5Db25maWd1cmVJQ1UKKwkoIGNkICQoQkxEKS9yJCovaWN1L3NvdXJjZSA7IGAkKElDVUNPTkYpICIkKEJMRCkvciQqL2ljdS9zb3VyY2UiICIkKiJgIC0tZW5hYmxlLXJlbmFtaW5nIC0tZW5hYmxlLXNoYXJlZCAtLWRpc2FibGUtc3RhdGljIC0tZW5hYmxlLXJlbGVhc2UgLS1kaXNhYmxlLWRlYnVnIC0tcHJlZml4PSQoSU5TKS9yJCogKQorCXRvdWNoIC1jICRACisKKyQoQkxEKS8lLyQoU19CTEQpOiAkKEJMRCkvJS8kKFNfU1JDKQorCS1ta2RpciAtcCAkKElOUykKKwktY2htb2QgYStyeCAkKEJMRCkvJCovaWN1L3NvdXJjZS9jb25maWd1cmUgJChCTEQpLyQqL2ljdS9zb3VyY2UvcnVuQ29uZmlndXJlSUNVCisJKCBjZCAkKEJMRCkvJCovaWN1L3NvdXJjZSA7IGAkKElDVUNPTkYpICIkKEJMRCkvJCovaWN1L3NvdXJjZSIgIiQqImAgLS1kaXNhYmxlLXJlbmFtaW5nIC0tZW5hYmxlLXNoYXJlZCAtLWRpc2FibGUtc3RhdGljIC0tZW5hYmxlLXJlbGVhc2UgLS1kaXNhYmxlLWRlYnVnIC0tcHJlZml4PSQoSU5TKS8kKiApCisJdG91Y2ggLWMgJEAKKworCiskKElOUykvJS9iaW4vJChUQVJHRVQpOiAkKElOUykvJS8kKFNfSU5TKSAkKFNSQ1MpCisJLXJtIC1yZiAuLyQoQkxEKS8kKi90bXAKKwlta2RpciAuLyQoQkxEKS8kKi90bXAKKwlAZm9yIGZpbGUgaW4gJChPQkpFQ1RTKTsgXAorCWRvIFwKKwkJd2hhdD1gYmFzZW5hbWUgJCRmaWxlIC5vYCA7IFwKKwkJZWNobyBjb21waWxpbmcgJCovJCR3aGF0IDsgXAorCQkkKENYWCkgLWMgLW8gLi8kKEJMRCkvJCovdG1wLyQkd2hhdC5vICQkd2hhdC5jcHAgLUkgJChJTlMpLyQqL2luY2x1ZGUgLUkgJChCTEQpLyQqL2ljdS9zb3VyY2UvdG9vbHMvdG9vbHV0aWwgOyBcCisJZG9uZQorCSQoQ1hYKSAtbyAkQCAkKE9CSkVDVFM6JS5vPS4vJChCTEQpLyQqL3RtcC8lLm8pICAtbGljdWRhdGEgLWxpY3V1YyAtbGljdXR1IC1saWN1aTE4biAtTCQoSU5TKS8kKi9saWIgCisKK2ZvbzoKKwllY2hvICQoQUxMSUNVUykKKworYWxsaWN1czogJChCTEQpICQoQUxMSUNVUykKKworCithbGwtaWN1czogaWljdXMKKworaWljdXM6ICQoQkxEKSAkKElJQ1VTKQorCityaWN1czogJChSSUNVUykKZGlmZiAtLWdpdCBhL211bHRpL2MvTWFrZWZpbGUtYy5pbmMgYi9tdWx0aS9jL01ha2VmaWxlLWMuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjliMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9jL01ha2VmaWxlLWMuaW5jCkBAIC0wLDAgKzEsNDYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTIgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworaW5jbHVkZSAkKE1VTFRJQ1VfUk9PVCkvY29tbW9uL01ha2VmaWxlLW11bHRpLmluYworCitDX0dPT0Q6PSQoc2hlbGwgWyAtZCAkKENfSU5TKSBdICYmIChjZCAkKENfSU5TKSA7IGxzIC1kICovJChTX0lOUykgMj4vZGV2L251bGwgfCBjdXQgLWQvIC1mMSkpCitDX1JFTDo9JChzaGVsbCBbIC1kICQoQ19JTlMpIF0gJiYgKGNkICQoQ19JTlMpIDsgbHMgLWQgciovJChTX0lOUykgMj4vZGV2L251bGwgfCBjdXQgLWQvIC1mMSkpCisKK0NfQ0xFQU5fVEFSR0VUPSQoQ19HT09EOiU9JChDX0lOUykvJS9iaW4vJChUQVJHRVQpKQorCitTT1VSQ0VTPSQoQ19TT1VSQ0VTKSAkKENYWF9TT1VSQ0VTKQorQ19PQkpFQ1RTPSQoQ19TT1VSQ0VTOiUuYz0lLm8pCitDWFhfT0JKRUNUUz0kKENYWF9TT1VSQ0VTOiUuY3BwPSUubykKK09CSkVDVFM9JChDX09CSkVDVFMpICQoQ1hYX09CSkVDVFMpCisjREVCVUdPUFQ9LWcKKworIyBsaXN0IG9mIElDVXMgdG8gYmUgYnVpbHQJCitJQ1VfVEFSQkFMTFM9JChzaGVsbCBjZCAkKElDVVMpIDsgbHMgaWN1NGMtKi1zcmMudGd6KQorIyBsaXN0IG9mIHZlcnNpb25zICggZm9ybSAiM184ICA0XzAiIGV0Yy4gKQorSUNVX1RBUkJBTExTX1ZFUlM9JChJQ1VfVEFSQkFMTFM6aWN1NGMtJS1zcmMudGd6PSUpCisKKworJChDX0lOUykvJS9iaW4vJChUQVJHRVQpOgkkKFNPVVJDRVMpICQoSEVBREVSUykKKwktcm0gLXJmICQoQ19JTlMpLyQqL3RtcAorCW1rZGlyICQoQ19JTlMpLyQqL3RtcAoraWZuZXEgKCwkKENYWF9PQkpFQ1RTKSkKKwlAZm9yIGZpbGUgaW4gJChDWFhfT0JKRUNUUyk7IFwKKwlkbyBcCisJCXdoYXQ9YGJhc2VuYW1lICQkZmlsZSAub2AgOyBcCisJCWVjaG8gY29tcGlsaW5nICcoQysrKScgJCovJCR3aGF0IDsgXAorCQlgJChDX0lOUykvJCovYmluL2ljdS1jb25maWcgLS1jeHhgIGAkKENfSU5TKS8kKi9iaW4vaWN1LWNvbmZpZyAtLWN4eGZsYWdzYCAkKERFQlVHT1BUKSAgLWMgLW8gJChDX0lOUykvJCovdG1wLyQkd2hhdC5vICQkd2hhdC5jcHAgLUkgJChDX0lOUykvJCovaW5jbHVkZSAtSSAkKENfQkxEKS8kKi9pY3Uvc291cmNlL3Rvb2xzL3Rvb2x1dGlsICB8fCBcCisJCSQoQ1hYKSAkKERFQlVHT1BUKSAtYyAtbyAkKENfSU5TKS8kKi90bXAvJCR3aGF0Lm8gJCR7d2hhdH0uY3BwIC1JICQoQ19JTlMpLyQqL2luY2x1ZGUgLUkgJChDX0JMRCkvJCovaWN1L3NvdXJjZS90b29scy90b29sdXRpbCA7IFwKKwlkb25lCitlbmRpZgoraWZuZXEgKCwkKENfT0JKRUNUUykpCisJQGZvciBmaWxlIGluICQoQ19PQkpFQ1RTKTsgXAorCWRvIFwKKwkJd2hhdD1gYmFzZW5hbWUgJCRmaWxlIC5vYCA7IFwKKwkJZWNobyBjb21waWxpbmcgJyhDICApJyAkKi8kJHdoYXQgOyBcCisJCSQoQ0MpICQoREVCVUdPUFQpIC1jIC1vICQoQ19JTlMpLyQqL3RtcC8kJHdoYXQubyAkJHt3aGF0fS5jIC1JICQoQ19JTlMpLyQqL2luY2x1ZGUgLUkgJChDX0JMRCkvJCovaWN1L3NvdXJjZS90b29scy90b29sdXRpbCA7IFwKKwlkb25lCitlbmRpZgorCUBlY2hvIGxpbmtpbmcgJCovJCR3aGF0CisJQGAkKENfSU5TKS8kKi9iaW4vaWN1LWNvbmZpZyAtLWN4eGAgYCQoQ19JTlMpLyQqL2Jpbi9pY3UtY29uZmlnIC0tbGRmbGFncyBgICAkKERFQlVHT1BUKSAtbyAkQCAkKE9CSkVDVFM6JS5vPSQoQ19JTlMpLyQqL3RtcC8lLm8pICAtbGljdWRhdGEgLWxpY3V1YyAtbGljdXR1IC1saWN1aTE4biAtbGljdWlvIC1MJChDX0lOUykvJCovbGliIHx8IFwKKwkgJChDWFgpICQoREVCVUdPUFQpIC1vICRAICQoT0JKRUNUUzolLm89JChDX0lOUykvJCovdG1wLyUubykgIC1saWN1ZGF0YSAtbGljdXVjIC1saWN1dHUgLWxpY3VpMThuIC1saWN1aW8gLUwkKENfSU5TKS8kKi9saWIgCisKKwpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9vbGQtaWN1LnR4dCBiL211bHRpL2Mvb2xkLWljdS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2N2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL2Mvb2xkLWljdS50eHQKQEAgLTAsMCArMSwyIEBACisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyBhIGxpc3Qgb2YgSUNVNENzIHRvbyBvbGQgdG8gYnVpbGQgd2l0aCB0aGUgY3VycmVudCBwYXRjaHNldC4KZGlmZiAtLWdpdCBhL211bHRpL2MvcGF0Y2gvM18wIGIvbXVsdGkvYy9wYXRjaC8zXzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzMzgwMQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL2MvcGF0Y2gvM18wCkBAIC0wLDAgKzEsMTI3NzUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKK09ubHkgaW4gM18wL2ljdS9zb3VyY2U6IGJpbgorT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25mZGVmcy5oCitkaWZmIC1ydSAzXzAub3JpZy9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4gM18wL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgorLS0tIDNfMC5vcmlnL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgkyMDA4LTEwLTIwIDE0OjU3OjUyLjAwMDAwMDAwMCAtMDcwMAorKysrIDNfMC9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4JMjAwOC0xMC0yMCAxNTo1NzoyOC4wMDAwMDAwMDAgLTA3MDAKK0BAIC0xNSw2ICsxNSw4IEBACisgIyMgQ29tbWFuZHMgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlcworIEdFTl9ERVBTLmM9CSQoQ0MpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKyBHRU5fREVQUy5jYz0JJChDWFgpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKytHRU5fREVQUy5jPQllY2hvCisrR0VOX0RFUFMuY2M9CWVjaG8KKyAKKyAjIyBDb21tYW5kcyB0byBjb21waWxlCisgQ09NUElMRS5jPQkkKENDKSAkKERFRlMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtZm5vLWNvbW1vbiAtYworT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25maWcuY2FjaGUKK09ubHkgaW4gM18wLm9yaWcvaWN1L3NvdXJjZTogY29uZmlnLmxvZworZGlmZiAtcnUgM18wLm9yaWcvaWN1L3NvdXJjZS9jb25maWd1cmUgM18wL2ljdS9zb3VyY2UvY29uZmlndXJlCistLS0gM18wLm9yaWcvaWN1L3NvdXJjZS9jb25maWd1cmUJMjAwOC0xMC0yMCAxNDo1ODoxMC4wMDAwMDAwMDAgLTA3MDAKKysrKyAzXzAvaWN1L3NvdXJjZS9jb25maWd1cmUJMjAwOC0xMC0yMCAxNTo1NDo0Ni4wMDAwMDAwMDAgLTA3MDAKK0BAIC0xLDY1ICsxLDgyMiBAQAorICMhIC9iaW4vc2gKKy0KKyAjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCistIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCistIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLgorICMKKysjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKysjIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIworKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworKworKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKytpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGVtdWxhdGUgc2gKKysgIE5VTExDTUQ9OgorKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisrICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisrICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorK2Vsc2UKKysgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgorKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7CisrZXNhYworKworK2ZpCisrCisrCisrCisrCisrIyBQQVRIIG5lZWRzIENSCisrIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKKythc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKysKKythc19ubD0nCisrJworK2V4cG9ydCBhc19ubAorKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCisrYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKythc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKythc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworK2lmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisrICBhc19lY2hvPSdwcmludGYgJXNcbicKKysgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworK2Vsc2UKKysgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisrICBlbHNlCisrICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisrICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisrICAgICAgYXJnPSQxOworKyAgICAgIGNhc2UgJGFyZyBpbgorKyAgICAgICoiJGFzX25sIiopCisrCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworKyAgICAgIGVzYWM7CisrICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorKyAgICAnCisrICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworKyAgZmkKKysgIGV4cG9ydCBhc19lY2hvX2JvZHkKKysgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKKytmaQorKworKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgorK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisrICBQQVRIX1NFUEFSQVRPUj06CisrICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisrICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisrICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisrICB9CisrZmkKKysKKysjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KKytpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFzX3Vuc2V0PXVuc2V0CisrZWxzZQorKyAgYXNfdW5zZXQ9ZmFsc2UKKytmaQorKworKworKyMgSUZTCisrIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKysjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKysjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKysjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCisrSUZTPSIgIiIJJGFzX25sIgorKworKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCisrY2FzZSAkMCBpbgorKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKysgICAgIDs7CisrZXNhYworKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKysjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKytpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisrICBhc19teXNlbGY9JDAKKytmaQorK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKysgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisrICB7IChleGl0IDEpOyBleGl0IDE7IH0KKytmaQorKworKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorK2ZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKKytkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorK2RvbmUKKytQUzE9JyQgJworK1BTMj0nPiAnCisrUFM0PScrICcKKysKKysjIE5MUyBudWlzYW5jZXMuCisrTENfQUxMPUMKKytleHBvcnQgTENfQUxMCisrTEFOR1VBR0U9QworK2V4cG9ydCBMQU5HVUFHRQorKworKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgorK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisrICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKysgIGFzX2V4cHI9ZXhwcgorK2Vsc2UKKysgIGFzX2V4cHI9ZmFsc2UKKytmaQorKworK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKysgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCisrZWxzZQorKyAgYXNfYmFzZW5hbWU9ZmFsc2UKKytmaQorKworKworKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KKythc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKysJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorKyRhc19lY2hvIFgvIiQwIiB8CisrICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIC9eWFwvXChcL1wvXCkkL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcL1woXC9cKS4qL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICBzLy4qLy4vOyBxJ2AKKysKKysjIENEUEFUSC4KKyskYXNfdW5zZXQgQ0RQQVRICisrCisrCisraWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgorKyAgaWYgKGV2YWwgIjoiKSAyPi9kZXYvbnVsbDsgdGhlbgorKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKytlbHNlCisrICBhc19oYXZlX3JlcXVpcmVkPW5vCisrZmkKKysKKysgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSB5ZXMgJiYJIChldmFsICI6CisrKGFzX2Z1bmNfcmV0dXJuICgpIHsKKysgIChleGl0IFwkMSkKKyt9CisrYXNfZnVuY19zdWNjZXNzICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDAKKyt9CisrYXNfZnVuY19mYWlsdXJlICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDEKKyt9CisrYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisrICByZXR1cm4gMAorK30KKythc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKysgIHJldHVybiAxCisrfQorKworK2V4aXRjb2RlPTAKKytpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCisrZmkKKysKKytpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKysgIGV4aXRjb2RlPTEKKysgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorK2ZpCisrCisraWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KKytmaQorKworK3Rlc3QgXCRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorKworKygKKysgIGFzX2xpbmVub18xPVwkTElORU5PCisrICBhc19saW5lbm9fMj1cJExJTkVOTworKyAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCisrICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yXCIpIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorKyIpIDI+IC9kZXYvbnVsbDsgdGhlbgorKyAgOgorK2Vsc2UKKysgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9CisrICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBjYXNlICRhc19kaXIgaW4KKysJIC8qKQorKwkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisrCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKKysJICAgZG9uZTs7CisrICAgICAgIGVzYWMKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworKworKyAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCisrCSAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCisrCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKKysJCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCisraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBlbXVsYXRlIHNoCisrICBOVUxMQ01EPToKKysgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKysgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKytlbHNlCisrICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKysgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworK2VzYWMKKysKKytmaQorKworKworKzoKKytfQVNFT0YKKyt9OyB0aGVuCisrICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsCisrCSAgICAgICBhc19oYXZlX3JlcXVpcmVkPXllcworKwkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCisraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBlbXVsYXRlIHNoCisrICBOVUxMQ01EPToKKysgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKysgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKytlbHNlCisrICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKysgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworK2VzYWMKKysKKytmaQorKworKworKzoKKysoYXNfZnVuY19yZXR1cm4gKCkgeworKyAgKGV4aXQgJDEpCisrfQorK2FzX2Z1bmNfc3VjY2VzcyAoKSB7CisrICBhc19mdW5jX3JldHVybiAwCisrfQorK2FzX2Z1bmNfZmFpbHVyZSAoKSB7CisrICBhc19mdW5jX3JldHVybiAxCisrfQorK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworKyAgcmV0dXJuIDAKKyt9CisrYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7CisrICByZXR1cm4gMQorK30KKysKKytleGl0Y29kZT0wCisraWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCisrICA6CisrZWxzZQorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorK2ZpCisrCisraWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCisrZmkKKysKKytpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCisrICA6CisrZWxzZQorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KKytmaQorKworK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKysgIGV4aXRjb2RlPTEKKysgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCisrZmkKKysKKytpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCisrICA6CisrZWxzZQorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCisrZmkKKysKKyt0ZXN0ICRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorKworKygKKysgIGFzX2xpbmVub18xPSRMSU5FTk8KKysgIGFzX2xpbmVub18yPSRMSU5FTk8KKysgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisrCisrX0FTRU9GCisrfTsgdGhlbgorKyAgYnJlYWsKKytmaQorKworK2ZpCisrCisrICAgICAgZG9uZQorKworKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCisrICBmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOVgorKwlkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorKwlkb25lCisrCWV4cG9ydCBDT05GSUdfU0hFTEwKKysJZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQorK2ZpCisrCisrCisrICAgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSBubzsgdGhlbgorKyAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQorKyAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKKysgICAgICBlY2hvIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuIHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhCisrICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCisrICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisrZmkKKysKKysKKytmaQorKworK2ZpCisrCisrCisrCisrKGV2YWwgImFzX2Z1bmNfcmV0dXJuICgpIHsKKysgIChleGl0IFwkMSkKKyt9CisrYXNfZnVuY19zdWNjZXNzICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDAKKyt9CisrYXNfZnVuY19mYWlsdXJlICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDEKKyt9CisrYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisrICByZXR1cm4gMAorK30KKythc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKysgIHJldHVybiAxCisrfQorKworK2V4aXRjb2RlPTAKKytpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCisrZmkKKysKKytpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKysgIGV4aXRjb2RlPTEKKysgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorK2ZpCisrCisraWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KKytmaQorKworK3Rlc3QgXCRleGl0Y29kZSA9IDAiKSB8fCB7CisrICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgorKyAgZWNobyBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKKysgIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMgbWVzc2FnZS4KKysgIGVjaG8gVGhpcyBjYW4gaGVscCB1cyBpbXByb3ZlIGZ1dHVyZSBhdXRvY29uZiB2ZXJzaW9ucy4KKysgIGVjaG8gQ29uZmlndXJhdGlvbiB3aWxsIG5vdyBwcm9jZWVkIHdpdGhvdXQgc2hlbGwgZnVuY3Rpb25zLgorK30KKysKKysKKysKKysgIGFzX2xpbmVub18xPSRMSU5FTk8KKysgIGFzX2xpbmVub18yPSRMSU5FTk8KKysgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7CisrCisrICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCisrICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisrICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKKysgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCisrICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCisrICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCisrICAjIGNhc2UgYXQgbGluZSBlbmQuCisrICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKysgICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQorKyAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKysgIHNlZCAtbiAnCisrICAgIHAKKysgICAgL1skXUxJTkVOTy89CisrICAnIDwkYXNfbXlzZWxmIHwKKysgICAgc2VkICcKKysgICAgICBzL1skXUxJTkVOTy4qLyYtLworKyAgICAgIHQgbGluZW5vCisrICAgICAgYgorKyAgICAgIDpsaW5lbm8KKysgICAgICBOCisrICAgICAgOmxvb3AKKysgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKysgICAgICB0IGxvb3AKKysgICAgICBzLy1cbi4qLy8KKysgICAgJyA+JGFzX21lLmxpbmVubyAmJgorKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysKKysgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisrICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKysgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisrICAuICIuLyRhc19tZS5saW5lbm8iCisrICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKysgIGV4aXQKKyt9CisrCisrCisraWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBhc19kaXJuYW1lPWRpcm5hbWUKKytlbHNlCisrICBhc19kaXJuYW1lPWZhbHNlCisrZmkKKysKKytFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorK2Nhc2UgYGVjaG8gLW4geGAgaW4KKystbiopCisrICBjYXNlIGBlY2hvICd4XGMnYCBpbgorKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisrICAqKSAgIEVDSE9fQz0nXGMnOzsKKysgIGVzYWM7OworKyopCisrICBFQ0hPX049Jy1uJzs7CisrZXNhYworK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisrICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKysgIGFzX2V4cHI9ZXhwcgorK2Vsc2UKKysgIGFzX2V4cHI9ZmFsc2UKKytmaQorKworK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisrICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCisrZWxzZQorKyAgcm0gLWYgY29uZiQkLmRpcgorKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorK2ZpCisraWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisrICAgIGFzX2xuX3M9J2xuIC1zJworKyAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKysgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKysgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorKyAgICAgIGFzX2xuX3M9J2NwIC1wJworKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKysgICAgYXNfbG5fcz1sbgorKyAgZWxzZQorKyAgICBhc19sbl9zPSdjcCAtcCcKKysgIGZpCisrZWxzZQorKyAgYXNfbG5fcz0nY3AgLXAnCisrZmkKKytybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCisrcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorKworK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKysgIGFzX21rZGlyX3A9OgorK2Vsc2UKKysgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisrICBhc19ta2Rpcl9wPWZhbHNlCisrZmkKKyAKKy0jIERlZmF1bHRzOgorLWFjX2hlbHA9CisraWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorKyAgYXNfdGVzdF94PSd0ZXN0IC14JworK2Vsc2UKKysgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorKyAgICBhc19sc19MX29wdGlvbj1MCisrICBlbHNlCisrICAgIGFzX2xzX0xfb3B0aW9uPQorKyAgZmkKKysgIGFzX3Rlc3RfeD0nCisrICAgIGV2YWwgc2ggLWMgJ1wnJworKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorKwl0ZXN0IC1kICIkMS8uIjsKKysgICAgICBlbHNlCisrCWNhc2UgJDEgaW4KKysJLSopc2V0ICIuLyQxIjs7CisrCWVzYWM7CisrCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCisrCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKysgICAgJ1wnJyBzaAorKyAgJworK2ZpCisrYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKysKKysjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCisrYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKysKKysjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KKythc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorKworKworKworK2V4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKKysKKysjIE5hbWUgb2YgdGhlIGhvc3QuCisrIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKysjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KKythY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKysKKysjCisrIyBJbml0aWFsaXphdGlvbnMuCisrIworIGFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKy0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CistYWNfaGVscD0iJGFjX2hlbHAKKy0gIC0tZW5hYmxlLXN0cmljdCAgICAgICAgIGNvbXBpbGUgd2l0aCBzdHJpY3QgY29tcGlsZXIgb3B0aW9ucyBbZGVmYXVsdD1ub10iCistYWNfaGVscD0iJGFjX2hlbHAKKy0gIC0tZW5hYmxlLTY0Yml0LWxpYnMgICAgIGJ1aWxkIDY0LWJpdCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS1zdGF0aWMgICAgICAgICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtZGVidWcgICAgICAgICAgYnVpbGQgZGVidWcgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtcmVsZWFzZSAgICAgICAgYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtcmVuYW1pbmcgICAgICAgYWRkIGEgdmVyc2lvbiBzdWZmaXggdG8gc3ltYm9scyBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS10cmFjaW5nICAgICAgICBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS1ycGF0aCAgICAgICAgICB1c2UgcnBhdGggd2hlbiBsaW5raW5nIFtkZWZhdWx0IGlzIG9ubHkgaWYgbmVjZXNzYXJ5XSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtdGhyZWFkcyAgICAgICAgYnVpbGQgSUNVIHdpdGggdGhyZWFkIHNhZmV0eSBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLXdpdGgtaW9zdHJlYW09dmVyc2lvbiBzcGVjaWZ5IHRoZSB2ZXJzaW9uIG9mIGlvc3RyZWFtIHRvIHVzZSAobm9uZSwgb2xkLCBzdGQsIGF1dG8pIFtkZWZhdWx0PWF1dG9dIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS1leHRyYXMgICAgICAgICBidWlsZCBJQ1UgZXh0cmFzIFtkZWZhdWx0PXllc10iCistYWNfaGVscD0iJGFjX2hlbHAKKy0gIC0tZW5hYmxlLWljdWlvICAgICAgICAgIGJ1aWxkIElDVSdzIGljdWlvIGxpYnJhcnkgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtbGF5b3V0ICAgICAgICAgYnVpbGQgSUNVJ3MgbGF5b3V0IGxpYnJhcnkgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS13aXRoLWRhdGEtcGFja2FnaW5nPXR5cGUgc3BlY2lmeSBob3cgdG8gcGFja2FnZSBJQ1UgZGF0YSAoZmlsZXMsIGFyY2hpdmUsIGxpYnJhcnksIGF1dG8pIFtkZWZhdWx0PWF1dG9dIgorLWFjX2hlbHA9IiRhY19oZWxwCistIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLXdpdGgtbGlicmFyeS1zdWZmaXg9c3VmZml4ICAgIHRhZyBhIHN1ZmZpeCB0byB0aGUgbGlicmFyeSBuYW1lcyBbZGVmYXVsdD1dIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS10ZXN0cyAgICAgICAgICBidWlsZCBJQ1UgdGVzdHMgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtc2FtcGxlcyAgICAgICAgYnVpbGQgSUNVIHNhbXBsZXMgW2RlZmF1bHQ9eWVzXSAgCistQWRkaXRpb25hbGx5LCB0aGUgdmFyaWFibGUgRk9SQ0VfTElCUyBtYXkgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGNvbmZpZ3VyZS4gSWYgc2V0LCBpdCB3aWxsIFJFUExBQ0UgYW55IGF1dG9tYXRpYyBsaXN0IG9mIGxpYnJhcmllcy4iCisrYWNfY2xlYW5fZmlsZXM9CisrYWNfY29uZmlnX2xpYm9ial9kaXI9LgorK0xJQk9CSlM9CisrY3Jvc3NfY29tcGlsaW5nPW5vCisrc3ViZGlycz0KKytNRkxBR1M9CisrTUFLRUZMQUdTPQorK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisrCisrIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCisrUEFDS0FHRV9OQU1FPQorK1BBQ0tBR0VfVEFSTkFNRT0KKytQQUNLQUdFX1ZFUlNJT049CisrUEFDS0FHRV9TVFJJTkc9CisrUEFDS0FHRV9CVUdSRVBPUlQ9CisrCisrYWNfdW5pcXVlX2ZpbGU9ImNvbW1vbi91bmljb2RlL3V0eXBlcy5oIgorKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KKythY19pbmNsdWRlc19kZWZhdWx0PSJcCisrI2luY2x1ZGUgPHN0ZGlvLmg+CisrI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKysjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKysjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisrI2VuZGlmCisrI2lmZGVmIFNURENfSEVBREVSUworKyMgaW5jbHVkZSA8c3RkbGliLmg+CisrIyBpbmNsdWRlIDxzdGRkZWYuaD4KKysjZWxzZQorKyMgaWZkZWYgSEFWRV9TVERMSUJfSAorKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorKyMgZW5kaWYKKysjZW5kaWYKKysjaWZkZWYgSEFWRV9TVFJJTkdfSAorKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorKyMgZW5kaWYKKysjIGluY2x1ZGUgPHN0cmluZy5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKysjIGluY2x1ZGUgPGludHR5cGVzLmg+CisrI2VuZGlmCisrI2lmZGVmIEhBVkVfU1RESU5UX0gKKysjIGluY2x1ZGUgPHN0ZGludC5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX1VOSVNURF9ICisrIyBpbmNsdWRlIDx1bmlzdGQuaD4KKysjZW5kaWYiCisrCisrYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpTCisrTElCT0JKUworK0FJWF9TSExJQgorK2xkX3JwYXRoX3N1ZgorK3BsYXRmb3JtX21ha2VfZnJhZ21lbnQKKytwbGF0Zm9ybV9tYWtlX2ZyYWdtZW50X25hbWUKKytwbGF0Zm9ybQorK0lDVURBVEFfQ0hBUgorK1NBTVBMRVNfVFJVRQorK1RFU1RTX1RSVUUKKytJQ1VMSUJTVUZGSVhDTkFNRQorK1VfSEFWRV9MSUJfU1VGRklYCisrSUNVTElCU1VGRklYCisrREFUQV9QQUNLQUdJTkdfTU9ERQorK0RBVEFfUEFDS0FHSU5HX0NQUEZMQUdTCisrdGhlcGtnaWN1ZGF0YWRpcgorK3BrZ2ljdWRhdGFkaXIKKyt0aGVsaWJkaXIKKyt0aGVkYXRhZGlyCisrdGhlc3lzY29uZmRpcgorK0xBWU9VVF9UUlVFCisrSUNVSU9fVFJVRQorK0VYVFJBU19UUlVFCisrVV9TSVpFT0ZfV0NIQVJfVAorK1VfSEFWRV9XQ1NDUFkKKytVX0hBVkVfV0NIQVJfSAorK0hBVkVfVUlOVDY0X1QKKytIQVZFX0lOVDY0X1QKKytIQVZFX1VJTlQzMl9UCisrSEFWRV9JTlQzMl9UCisrSEFWRV9VSU5UMTZfVAorK0hBVkVfSU5UMTZfVAorK0hBVkVfVUlOVDhfVAorK0hBVkVfSU5UOF9UCisrVV9USU1FWk9ORQorK1VfSEFWRV9USU1FWk9ORQorK1VfVFpOQU1FCisrVV9UWlNFVAorK1VfSEFWRV9QT1BFTgorK1VfSEFWRV9QTEFDRU1FTlRfTkVXCisrVV9PVkVSUklERV9DWFhfQUxMT0NBVElPTgorK1VfSEFWRV9OQU1FU1BBQ0UKKytVX05MX0xBTkdJTkZPX0NPREVTRVQKKytVX0hBVkVfTkxfTEFOR0lORk9fQ09ERVNFVAorK1VfSEFWRV9OTF9MQU5HSU5GTworK1VfSVNfQklHX0VORElBTgorK1VfSU9TVFJFQU1fU09VUkNFCisrQ1hYQ1BQCisrVV9IQVZFX0lOVFRZUEVTX0gKKytFR1JFUAorK0dSRVAKKytDUFAKKytHRU5DQ09ERV9BU1NFTUJMWQorK0hBVkVfTU1BUAorK0lDVV9VU0VfVEhSRUFEUworK1RIUkVBRFNfVFJVRQorK1VfSU5MSU5FCisrRU5BQkxFX1JQQVRICisrVV9FTkFCTEVfVFJBQ0lORworK1VfRElTQUJMRV9SRU5BTUlORworK0FSCisrUkFOTElCCisrRU5BQkxFX1JFTEVBU0UKKytFTkFCTEVfREVCVUcKKytFTkFCTEVfU1RBVElDCisrRU5BQkxFX1NIQVJFRAorK0xJQl9NCisrQ09NUElMRV9MSU5LX0VOVlZBUgorK0FSRkxBR1MKKytob3N0X29zCisraG9zdF92ZW5kb3IKKytob3N0X2NwdQorK2hvc3QKKytidWlsZF9vcworK2J1aWxkX3ZlbmRvcgorK2J1aWxkX2NwdQorK2J1aWxkCisrRE9YWUdFTgorK1VfTUFLRQorK1NUUklQCisrSU5TVEFMTF9EQVRBCisrSU5TVEFMTF9TQ1JJUFQKKytJTlNUQUxMX1BST0dSQU0KKythY19jdF9DWFgKKytDWFhGTEFHUworK0NYWAorK09CSkVYVAorK0VYRUVYVAorK2FjX2N0X0NDCisrTERGTEFHUworK0NGTEFHUworK0NDCisrQ1BQRkxBR1MKKytVTklDT0RFX1ZFUlNJT04KKytMSUJfVkVSU0lPTl9NQUpPUgorK0xJQl9WRVJTSU9OCisrVkVSU0lPTgorK1BBQ0tBR0UKKyt0YXJnZXRfYWxpYXMKKytob3N0X2FsaWFzCisrYnVpbGRfYWxpYXMKKytMSUJTCisrRUNIT19UCisrRUNIT19OCisrRUNIT19DCisrREVGUworK21hbmRpcgorK2xvY2FsZWRpcgorK2xpYmRpcgorK3BzZGlyCisrcGRmZGlyCisrZHZpZGlyCisraHRtbGRpcgorK2luZm9kaXIKKytkb2NkaXIKKytvbGRpbmNsdWRlZGlyCisraW5jbHVkZWRpcgorK2xvY2Fsc3RhdGVkaXIKKytzaGFyZWRzdGF0ZWRpcgorK3N5c2NvbmZkaXIKKytkYXRhZGlyCisrZGF0YXJvb3RkaXIKKytsaWJleGVjZGlyCisrc2JpbmRpcgorK2JpbmRpcgorK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKKytwcmVmaXgKKytleGVjX3ByZWZpeAorK1BBQ0tBR0VfQlVHUkVQT1JUCisrUEFDS0FHRV9TVFJJTkcKKytQQUNLQUdFX1ZFUlNJT04KKytQQUNLQUdFX1RBUk5BTUUKKytQQUNLQUdFX05BTUUKKytQQVRIX1NFUEFSQVRPUgorK1NIRUxMJworK2FjX3N1YnN0X2ZpbGVzPScnCisrYWNfdXNlcl9vcHRzPScKKytlbmFibGVfb3B0aW9uX2NoZWNraW5nCisrZW5hYmxlX3N0cmljdAorK2VuYWJsZV82NGJpdF9saWJzCisrZW5hYmxlX3NoYXJlZAorK2VuYWJsZV9zdGF0aWMKKytlbmFibGVfZGVidWcKKytlbmFibGVfcmVsZWFzZQorK2VuYWJsZV9yZW5hbWluZworK2VuYWJsZV90cmFjaW5nCisrZW5hYmxlX3JwYXRoCisrZW5hYmxlX3RocmVhZHMKKyt3aXRoX2lvc3RyZWFtCisrZW5hYmxlX2V4dHJhcworK2VuYWJsZV9sYXlvdXQKKyt3aXRoX2RhdGFfcGFja2FnaW5nCisrZW5hYmxlX21hcHBlZAorK3dpdGhfbGlicmFyeV9zdWZmaXgKKytlbmFibGVfdGVzdHMKKytlbmFibGVfc2FtcGxlcworKycKKysgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcworK2hvc3RfYWxpYXMKKyt0YXJnZXRfYWxpYXMKKytDQworK0NGTEFHUworK0xERkxBR1MKKytMSUJTCisrQ1BQRkxBR1MKKytDWFgKKytDWFhGTEFHUworK0NDQworK0NQUAorK0NYWENQUCcKKysKKyAKKyAjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisrYWNfaW5pdF9oZWxwPQorK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorK2FjX3VucmVjb2duaXplZF9vcHRzPQorK2FjX3VucmVjb2duaXplZF9zZXA9CisgIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyAjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCistYnVpbGQ9Tk9ORQorLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKKytjYWNoZV9maWxlPS9kZXYvbnVsbAorIGV4ZWNfcHJlZml4PU5PTkUKKy1ob3N0PU5PTkUKKyBub19jcmVhdGU9Cistbm9ub3B0PU5PTkUKKyBub19yZWN1cnNpb249CisgcHJlZml4PU5PTkUKKyBwcm9ncmFtX3ByZWZpeD1OT05FCitAQCAtNjgsOTQgKzgyNSwxMzMgQEAKKyBzaWxlbnQ9Cisgc2l0ZT0KKyBzcmNkaXI9CistdGFyZ2V0PU5PTkUKKyB2ZXJib3NlPQorIHhfaW5jbHVkZXM9Tk9ORQorIHhfbGlicmFyaWVzPU5PTkUKKysKKysjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKysjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKysjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKysjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorKyMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKKyBiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKKyBzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworIGxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCistZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCisrZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCisgc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKKyBzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKKyBsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworIGluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworIG9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKKy1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKKy1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCistCistIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorLXN1YmRpcnM9CistTUZMQUdTPSBNQUtFRkxBR1M9CistU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKy0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCistYWNfbWF4X2hlcmVfbGluZXM9MTIKKytkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0V9JworK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCisraHRtbGRpcj0nJHtkb2NkaXJ9JworK2R2aWRpcj0nJHtkb2NkaXJ9JworK3BkZmRpcj0nJHtkb2NkaXJ9JworK3BzZGlyPScke2RvY2Rpcn0nCisrbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCisrbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCisrbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCisgCisgYWNfcHJldj0KKythY19kYXNoZGFzaD0KKyBmb3IgYWNfb3B0aW9uCisgZG8KKy0KKyAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCistICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisgICAgIGFjX3ByZXY9CisgICAgIGNvbnRpbnVlCisgICBmaQorIAorLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKy0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworLSAgKikgYWNfb3B0YXJnPSA7OworKyAgY2FzZSAkYWNfb3B0aW9uIGluCisrICAqPSopCWFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisrICAqKQlhY19vcHRhcmc9eWVzIDs7CisgICBlc2FjCisgCisgICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorIAorLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKysgIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgorKyAgLS0pCisrICAgIGFjX2Rhc2hkYXNoPXllcyA7OworIAorICAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCistICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCistICAgIGFjX3ByZXY9YnVpbGQgOzsKKysgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCistICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisgCisgICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCistICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisrICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworIAorLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisrICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworKworKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgIGFjX3ByZXY9ZGF0YWRpciA7OworLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCistICB8IC0tZGE9KikKKy0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKysgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisrICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworKworKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisrICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKysgICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OworKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisrICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKy0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCistICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKy0gICAgZmkKKy0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKy0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisrICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisrICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKysgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisrICAgICAgKiIKKysiZW5hYmxlXyRhY191c2Vyb3B0IgorKyIqKSA7OworKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZGlzYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKysgICAgZXNhYworKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1ubyA7OworKworKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKysgICAgYWNfcHJldj1kb2NkaXIgOzsKKysgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworKworKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKysgICAgYWNfcHJldj1kdmlkaXIgOzsKKysgIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCisrICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisrICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKy0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CistICAgIGZpCistICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCistICAgIGNhc2UgIiRhY19vcHRpb24iIGluCistICAgICAgKj0qKSA7OworLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKysgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKysgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKysgICAgICAqIgorKyJlbmFibGVfJGFjX3VzZXJvcHQiCisrIiopIDs7CisrICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKysJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgIGVzYWMKKy0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworIAorICAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorQEAgLTE2NCwxMTYgKzk2MCw3NyBAQAorICAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCistICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisgCisgICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICAgd2l0aF9nYXM9eWVzIDs7CisgCistICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKy0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCistICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKy0gICAgY2F0IDw8IEVPRgorLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCistQ29uZmlndXJhdGlvbjoKKy0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCistICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKy0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCistICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKy0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKKy1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CistICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKy0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCistICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKy0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKy0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCistICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCistICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCistICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCistICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCistICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKy0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKy0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKy0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKy0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCistICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKy1FT0YKKy0gICAgY2F0IDw8IEVPRgorLUhvc3QgdHlwZToKKy0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCistICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCistICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCistRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCistICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCistICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKKy1FT0YKKy0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCistICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCistICAgIGZpCistICAgIGV4aXQgMCA7OworKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKysgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKysgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKysgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKyAKKyAgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorLSAgICBhY19wcmV2PWhvc3QgOzsKKysgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKysKKysgIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQorKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKysgIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAorKyAgfCAtLWh0PSopCisrICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworIAorICAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKy0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgICBhY19wcmV2PWxpYmRpciA7OworICAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisrICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCistICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisrICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworKworKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorKyAgICBhY19wcmV2PWxvY2FsZWRpciA7OworKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKysgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKy0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKy0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKy0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCisrICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworIAorICAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKy0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworIAorICAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICAgd2l0aF9mcD1ubyA7OworIAorICAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKy0gIHwgLS1uby1jciB8IC0tbm8tYykKKysgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgICBub19jcmVhdGU9eWVzIDs7CisgCisgICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKK0BAIC0yODcsMjYgKzEwNDQsMjYgQEAKKyAgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKy0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgICBhY19wcmV2PXByZWZpeCA7OworICAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisrICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisgCisgICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKysgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworIAorICAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKy0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisrICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKyAKKyAgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKK0BAIC0zMjMsNyArMTA4MCwxNyBAQAorICAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKy0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKysgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisrCisrICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorKyAgICBhY19wcmV2PXBkZmRpciA7OworKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKysgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKysKKysgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisrICAgIGFjX3ByZXY9cHNkaXIgOzsKKysgIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQorKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCitAQCAtMzMzLDcgKzExMDAsNyBAQAorICAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgICB8IC0tc2JpPSogfCAtLXNiPSopCistICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisrICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworIAorICAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKK0BAIC0zNDQsNTggKzExMTEsNjkgQEAKKyAgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgIHwgLS1zaGE9KiB8IC0tc2g9KikKKy0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisrICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgIGFjX3ByZXY9c2l0ZSA7OworICAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKy0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKysgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CisgCisgICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgICBhY19wcmV2PXNyY2RpciA7OworICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKy0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworIAorICAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKy0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorLSAgICBhY19wcmV2PXRhcmdldCA7OworKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisrICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CisgCisgICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgICB2ZXJib3NlPXllcyA7OworIAorLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCistICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorLSAgICBleGl0IDAgOzsKKysgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisrICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisgCisgICAtd2l0aC0qIHwgLS13aXRoLSopCistICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisrICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKy0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCistICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorLSAgICBmaQorLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorLSAgICAgICo9KikgOzsKKy0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisrICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisrICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKysgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisrICAgICAgKiIKKysid2l0aF8kYWNfdXNlcm9wdCIKKysiKikgOzsKKysgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGgtJGFjX3VzZXJvcHRfb3JpZyIKKysJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgIGVzYWMKKy0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKysgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisgCisgICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCistICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKysgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKy0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CistICAgIGZpCistICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCistICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKysgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKysgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKysgICAgICAqIgorKyJ3aXRoXyRhY191c2Vyb3B0IgorKyIqKSA7OworKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKysgICAgZXNhYworKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKyAKKyAgIC0teCkKKyAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorQEAgLTQwNiwxNjcgKzExODQsNzM1IEBACisgICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKy0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKysgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisgCisgICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKysgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworIAorLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisrICAtKikgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICAgOzsKKyAKKysgICo9KikKKysgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisrICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhcmlhYmxlIG5hbWU6ICRhY19lbnZ2YXIiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKKysgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKysKKyAgICopCistICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCistICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorLSAgICBmaQorLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKy0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKy0gICAgZmkKKy0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisrICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisrICAgIDogJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0KKyAgICAgOzsKKyAKKyAgIGVzYWMKKyBkb25lCisgCisgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCistICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KKysgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKysgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgZmkKKyAKKy10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorLQorLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorLSMgMCBzdGFuZGFyZCBpbnB1dAorLSMgMSBmaWxlIGNyZWF0aW9uCistIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKy0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CistIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKy0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCistICBleGVjIDY+L2Rldi9udWxsCistZWxzZQorLSAgZXhlYyA2PiYxCisraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgorKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorKyAgICBubykgOzsKKysgICAgZmF0YWwpIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisrICBlc2FjCisgZmkKKy1leGVjIDU+Li9jb25maWcubG9nCistCistZWNobyAiXAorLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCistcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKy0iIDE+JjUKKyAKKy0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKy0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKy1hY19jb25maWd1cmVfYXJncz0KKy1mb3IgYWNfYXJnCisrIyBDaGVjayBhbGwgZGlyZWN0b3J5IGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kuCisrZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisrCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKysJCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKKysJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCisgZG8KKy0gIGNhc2UgIiRhY19hcmciIGluCistICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCistICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKy0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCistICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKy0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKysgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKysgIGNhc2UgJGFjX3ZhbCBpbgorKyAgICAqLyApCisrICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisrICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKKyAgIGVzYWMKKysgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KKysgIGNhc2UgJGFjX3ZhbCBpbgorKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisrICBlc2FjCisrICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyBkb25lCisgCistIyBOTFMgbnVpc2FuY2VzLgorLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKy0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKy0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKy0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCistaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCistaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCistaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCistaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisrIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KKytidWlsZD0kYnVpbGRfYWxpYXMKKytob3N0PSRob3N0X2FsaWFzCisrdGFyZ2V0PSR0YXJnZXRfYWxpYXMKKysKKysjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCisraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisrICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKysgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisrICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisrICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisrICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisrICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKysgIGZpCisrZmkKKysKKythY190b29sX3ByZWZpeD0KKyt0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisrCisrdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorKworKworK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKKythY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKKysgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyt0ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKKysgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgCistIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KKy1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKy0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KKy1lY2hvID4gY29uZmRlZnMuaAorLQorLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKy0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorLWFjX3VuaXF1ZV9maWxlPWNvbW1vbi91bmljb2RlL3V0eXBlcy5oCisgCisgIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgorIGlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCistICBhY19wcm9nPSQwCistICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKy0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKysgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKysgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfbXlzZWxmIiB8fAorKyRhc19leHByIFgiJGFzX215c2VsZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKysJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKysJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKSQnIFx8IFwKKysJIFgiJGFzX215c2VsZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CisrJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisrICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wvXClbXi9dLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIC9eWFwoXC9cL1wpJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wpLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIHMvLiovLi87IHEnYAorICAgc3JjZGlyPSRhY19jb25mZGlyCistICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKysgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgIHNyY2Rpcj0uLgorICAgZmkKKyBlbHNlCisgICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCisgZmkKKy1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKy0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKy0gIGVsc2UKKy0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKy0gIGZpCistZmkKKy1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKy0KKy0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgorLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKy0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKy0gIGVsc2UKKy0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorLSAgZmkKKy1maQorLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKy0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorLSAgICAuICIkYWNfc2l0ZV9maWxlIgorLSAgZmkKKytpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCisrICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorK2ZpCisrYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgorK2FjX2Fic19jb25mZGlyPWAoCisrCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrCXB3ZClgCisrIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KKytpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisrICBzcmNkaXI9LgorK2ZpCisrIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKysjIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KKysjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KKytjYXNlICRzcmNkaXIgaW4KKysqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKKytlc2FjCisrZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKysgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKysgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CisgZG9uZQorIAorLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKy0gIC4gJGNhY2hlX2ZpbGUKKy1lbHNlCistICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKy0gID4gJGNhY2hlX2ZpbGUKKysjCisrIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorKyMKKytpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisrICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisrICBjYXQgPDxfQUNFT0YKKytcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorKworK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorKworK1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKKytWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorKworK0RlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgorKworK0NvbmZpZ3VyYXRpb246CisrICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisrICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKysgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorKyAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKKysgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisrICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKysKKytJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisrICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKysgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisrICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKysKKytCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KKytcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCisrZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKysKKytGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKysKKytGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisrICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKysgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKysgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKysgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKysgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisrICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisrICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorKyAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQorKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKysgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKysgIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQorKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKysgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL1BBQ0tBR0VdCisrICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKysgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCisrICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorK19BQ0VPRgorKworKyAgY2F0IDw8XF9BQ0VPRgorKworK1N5c3RlbSB0eXBlczoKKysgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisrICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKytfQUNFT0YKKyBmaQorIAorLWFjX2V4dD1jCistIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKy0KKy1hY19leGVleHQ9CistYWNfb2JqZXh0PW8KKy1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCistICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorLSAgICBhY19uPSBhY19jPScKKy0nIGFjX3Q9JwknCistICBlbHNlCistICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKytpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorKworKyAgY2F0IDw8XF9BQ0VPRgorKworK09wdGlvbmFsIEZlYXR1cmVzOgorKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorKyAgLS1lbmFibGUtc3RyaWN0ICAgICAgICAgY29tcGlsZSB3aXRoIHN0cmljdCBjb21waWxlciBvcHRpb25zIGRlZmF1bHQ9bm8KKysgIC0tZW5hYmxlLTY0Yml0LWxpYnMgICAgIGJ1aWxkIDY0LWJpdCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKysgIC0tZW5hYmxlLXNoYXJlZCAgICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKysgIC0tZW5hYmxlLXN0YXRpYyAgICAgICAgIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZGVmYXVsdD1ubworKyAgLS1lbmFibGUtZGVidWcgICAgICAgICAgYnVpbGQgZGVidWcgbGlicmFyaWVzIGRlZmF1bHQ9bm8KKysgIC0tZW5hYmxlLXJlbGVhc2UgICAgICAgIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1yZW5hbWluZyAgICAgICBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCB0byBzeW1ib2xzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS10cmFjaW5nICAgICAgICBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyBkZWZhdWx0PXllcworKyAgLS1lbmFibGUtcnBhdGggICAgICAgICAgdXNlIHJwYXRoIHdoZW4gbGlua2luZyBkZWZhdWx0IGlzIG9ubHkgaWYgbmVjZXNzYXJ5CisrICAtLWVuYWJsZS10aHJlYWRzICAgICAgICBidWlsZCBJQ1Ugd2l0aCB0aHJlYWQgc2FmZXR5IGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1leHRyYXMgICAgICAgICBidWlsZCBJQ1UgZXh0cmFzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1pY3VpbyAgICAgICAgICBidWlsZCBJQ1UncyBpY3VpbyBsaWJyYXJ5IGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1sYXlvdXQgICAgICAgICBidWlsZCBJQ1UncyBsYXlvdXQgbGlicmFyeSBkZWZhdWx0PXllcworKworKyAgLS1lbmFibGUtdGVzdHMgICAgICAgICAgYnVpbGQgSUNVIHRlc3RzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1zYW1wbGVzICAgICAgICBidWlsZCBJQ1Ugc2FtcGxlcyBkZWZhdWx0PXllcworK0FkZGl0aW9uYWxseSwgdGhlIHZhcmlhYmxlIEZPUkNFX0xJQlMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyBjb25maWd1cmUuIElmIHNldCwgaXQgd2lsbCBSRVBMQUNFIGFueSBhdXRvbWF0aWMgbGlzdCBvZiBsaWJyYXJpZXMuCisrCisrT3B0aW9uYWwgUGFja2FnZXM6CisrICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKysgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKysgIC0td2l0aC1pb3N0cmVhbT12ZXJzaW9uIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgaW9zdHJlYW0gdG8gdXNlIChub25lLCBvbGQsIHN0ZCwgYXV0bykgZGVmYXVsdD1hdXRvCisrICAtLXdpdGgtZGF0YS1wYWNrYWdpbmc9dHlwZSBzcGVjaWZ5IGhvdyB0byBwYWNrYWdlIElDVSBkYXRhIChmaWxlcywgYXJjaGl2ZSwgbGlicmFyeSwgYXV0bykgZGVmYXVsdD1hdXRvCisrICAtLXdpdGgtbGlicmFyeS1zdWZmaXg9c3VmZml4ICAgIHRhZyBhIHN1ZmZpeCB0byB0aGUgbGlicmFyeSBuYW1lcyBkZWZhdWx0PQorKworK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorKyAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCisrICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisrICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKysgICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KKysgIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KKysgIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKysgICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorKyAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKKysgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworKyAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKKysgIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKKysKKytVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAorK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKysKKytfQUNFT0YKKythY19zdGF0dXM9JD8KKytmaQorKworK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKysgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisrICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQorKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorKyAgICAgIGNvbnRpbnVlCisrICAgIGFjX2J1aWxkZGlyPS4KKysKKytjYXNlICIkYWNfZGlyIiBpbgorKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKyopCisrICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisrICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisrICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisrICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKysgIGVzYWMgOzsKKytlc2FjCisrYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCisrYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisrYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisrCisrY2FzZSAkc3JjZGlyIGluCisrICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisrICAgIGFjX3NyY2Rpcj0uCisrICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7CisrZXNhYworK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysKKysgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZS4KKysgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorKyAgICAgIGVjaG8gJiYKKysgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSIgLS1oZWxwPXJlY3Vyc2l2ZQorKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorKyAgICAgIGVjaG8gJiYKKysgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlIiAtLWhlbHA9cmVjdXJzaXZlCisrICAgIGVsc2UKKysgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorKyAgICBmaSB8fCBhY19zdGF0dXM9JD8KKysgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorKyAgZG9uZQorK2ZpCisrCisrdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCisraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorKyAgY2F0IDw8XF9BQ0VPRgorK2NvbmZpZ3VyZQorK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MworKworK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKysyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisrZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorK19BQ0VPRgorKyAgZXhpdAorK2ZpCisrY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCisrVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKKytydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorKworK0l0IHdhcyBjcmVhdGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCisrZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisrCisrICAkICQwICRACisrCisrX0FDRU9GCisrZXhlYyA1Pj5jb25maWcubG9nCisreworK2NhdCA8PF9BU1VOQU1FCisrIyMgLS0tLS0tLS0tICMjCisrIyMgUGxhdGZvcm0uICMjCisrIyMgLS0tLS0tLS0tICMjCisrCisraG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKyt1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKyt1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKyt1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKyt1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKysKKysvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKysvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKysKKysvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisrL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKysvdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCisrL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKysvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisrCisrX0FTVU5BTUUKKysKKythc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrZm9yIGFzX2RpciBpbiAkUEFUSAorK2RvCisrICBJRlM9JGFzX3NhdmVfSUZTCisrICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorKyAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKyt9ID4mNQorKworK2NhdCA+JjUgPDxfQUNFT0YKKysKKysKKysjIyAtLS0tLS0tLS0tLSAjIworKyMjIENvcmUgdGVzdHMuICMjCisrIyMgLS0tLS0tLS0tLS0gIyMKKysKKytfQUNFT0YKKysKKysKKysjIEtlZXAgYSB0cmFjZSBvZiB0aGUgY29tbWFuZCBsaW5lLgorKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGEtY2hhcmFjdGVycy4KKysjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KKythY19jb25maWd1cmVfYXJncz0KKythY19jb25maWd1cmVfYXJnczA9CisrYWNfY29uZmlndXJlX2FyZ3MxPQorK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCisrZm9yIGFjX3Bhc3MgaW4gMSAyCisrZG8KKysgIGZvciBhY19hcmcKKysgIGRvCisrICAgIGNhc2UgJGFjX2FyZyBpbgorKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisrICAgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisrICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorKyAgICAgIGNvbnRpbnVlIDs7CisrICAgICpcJyopCisrICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKysgICAgZXNhYworKyAgICBjYXNlICRhY19wYXNzIGluCisrICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7CisrICAgIDIpCisrICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKKysgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKysJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorKyAgICAgIGVsc2UKKysJY2FzZSAkYWNfYXJnIGluCisrCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisrCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAorKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKysJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKysJICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgorKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworKwkgICAgZXNhYworKwkgICAgOzsKKysJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKysJZXNhYworKyAgICAgIGZpCisrICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCisrICAgICAgOzsKKysgICAgZXNhYworKyAgZG9uZQorK2RvbmUKKyskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KKyskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KKysKKysjIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCisrIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKysjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKysjIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KKysjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCisrdHJhcCAnZXhpdF9zdGF0dXM9JD8KKysgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorKyAgeworKyAgICBlY2hvCisrCisrICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisrIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgZWNobworKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKygKKysgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KKysgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisrICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorKyAgICAqJHthc19ubH0qKQorKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKysgICAgICBlc2FjCisrICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisrICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisrICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKysgICAgICBlc2FjIDs7CisrICAgIGVzYWMKKysgIGRvbmUKKysgIChzZXQpIDI+JjEgfAorKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9J1wnJyAnXCcnOyBzZXQpIDI+JjFgIGluICMoCisrICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKysgICAgICBzZWQgLW4gXAorKwkicy8nXCcnLydcJydcXFxcJ1wnJydcJycvZzsKKysJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisrICAgICAgOzsgIygKKysgICAgKikKKysgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorKyAgICAgIDs7CisrICAgIGVzYWMgfAorKyAgICBzb3J0CisrKQorKyAgICBlY2hvCisrCisrICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisrIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgZWNobworKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisrICAgIGRvCisrICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisrICAgICAgY2FzZSAkYWNfdmFsIGluCisrICAgICAgKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworKyAgICAgIGVzYWMKKysgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisrICAgIGRvbmUgfCBzb3J0CisrICAgIGVjaG8KKysKKysgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorKyAgICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisrIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgICBlY2hvCisrICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKysgICAgICBkbworKwlldmFsIGFjX3ZhbD1cJCRhY192YXIKKysJY2FzZSAkYWNfdmFsIGluCisrCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKysJZXNhYworKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisrICAgICAgZG9uZSB8IHNvcnQKKysgICAgICBlY2hvCisrICAgIGZpCisrCisrICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgorKyAgICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLSAjIworKyMjIGNvbmZkZWZzLmguICMjCisrIyMgLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgICBlY2hvCisrICAgICAgY2F0IGNvbmZkZWZzLmgKKysgICAgICBlY2hvCisrICAgIGZpCisrICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKysgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisrICAgICRhc19lY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorKyAgfSA+JjUKKysgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorKyAgICBybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCisrICAgIGV4aXQgJGV4aXRfc3RhdHVzCisrJyAwCisrZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisrICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKKytkb25lCisrYWNfc2lnbmFsPTAKKysKKysjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorK3JtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisrCisrIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorKyNkZWZpbmUgUEFDS0FHRV9OQU1FICIkUEFDS0FHRV9OQU1FIgorK19BQ0VPRgorKworKworK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKKytfQUNFT0YKKysKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCisrX0FDRU9GCisrCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiRQQUNLQUdFX1NUUklORyIKKytfQUNFT0YKKysKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorK19BQ0VPRgorKworKworKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCisrYWNfc2l0ZV9maWxlMT1OT05FCisrYWNfc2l0ZV9maWxlMj1OT05FCisraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorKyAgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEUKKytlbGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisrICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCisrZWxzZQorKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKysgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorK2ZpCisrZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKKytkbworKyAgdGVzdCAieCRhY19zaXRlX2ZpbGUiID0geE5PTkUgJiYgY29udGludWUKKysgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKysgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisrICAgIC4gIiRhY19zaXRlX2ZpbGUiCisrICBmaQorK2RvbmUKKysKKytpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKysgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsCisrICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKysgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKysgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKKysgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisrICAgIGVzYWMKKyAgIGZpCisgZWxzZQorLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorKyAgPiRjYWNoZV9maWxlCisrZmkKKysKKysjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisrIyB2YWx1ZS4KKythY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKKytmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKysgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisrICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisrICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCisrICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisrICAgIHNldCwpCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisrICAgICxzZXQpCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisrICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKysgICAgLCk7OworKyAgICAqKQorKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKysJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisrCWFjX29sZF92YWxfdz1gZWNobyB4ICRhY19vbGRfdmFsYAorKwlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKysJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisrCSAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKysJICBhY19jYWNoZV9jb3JydXB0ZWQ9OgorKwllbHNlCisrCSAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKysJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCisrCWZpCisrCXsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjI7fQorKwl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KKysgICAgICBmaTs7CisrICBlc2FjCisrICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisrICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKysgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworKyAgICBlc2FjCisrICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworKyAgICBlc2FjCisrICBmaQorK2RvbmUKKytpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKysgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyBmaQorIAorIAorIAorIAorKworKworKworKworKworKworKworKworKworKworKworKworKworK2FjX2V4dD1jCisrYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisrCisrCisrYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb21tb24vaWN1Y2ZnLmgiCisrCisgUEFDS0FHRT0iaWN1IgorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6NTcwOiBjaGVja2luZyBmb3IgSUNVIHZlcnNpb24gbnVtYmVycyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgSUNVIHZlcnNpb24gbnVtYmVycy4uLiAiID4mNjsgfQorIAorIGdldGljdXZlcnNpb24oKSB7CisgICAgIHNlZCAtbiAncy9eWyAJXSojWyAJXSpkZWZpbmVbIAldKlVfSUNVX1ZFUlNJT05bIAldKiJcKFteIl0qXCkiLiovXDEvcCcgIiRAIgorQEAgLTU3NSw3ICsxOTIxLDkgQEAKKyBpZiB0ZXN0IHgiJFZFUlNJT04iID0geDsgdGhlbgorICAgICBWRVJTSU9OPWBnZXRpY3V2ZXJzaW9uICRzcmNkaXIvY29tbW9uL3VuaWNvZGUvKi5oYAorICAgICBpZiB0ZXN0IHgiJFZFUlNJT04iID0geDsgdGhlbgorLSAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBDYW5ub3QgZGV0ZXJtaW5lIElDVSB2ZXJzaW9uIG51bWJlciBmcm9tIGhlYWRlciBmaWxlcyIgMT4mMjsgZXhpdCAxOyB9CisrICAgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2Fubm90IGRldGVybWluZSBJQ1UgdmVyc2lvbiBudW1iZXIgZnJvbSBoZWFkZXIgZmlsZXMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDYW5ub3QgZGV0ZXJtaW5lIElDVSB2ZXJzaW9uIG51bWJlciBmcm9tIGhlYWRlciBmaWxlcyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICAgZmkKKyBmaQorIExJQl9WRVJTSU9OPWBlY2hvICRWRVJTSU9OIHwgc2VkIC1lICdzL1wuLy8nIC1lICdzL15cKFteLl0qXCkkL1wxLjAvJ2AKK0BAIC01ODMsNyArMTkzMSw4IEBACisgCisgCisgCistZWNobyAiJGFjX3QiInJlbGVhc2UgJFZFUlNJT04sIGxpYnJhcnkgJExJQl9WRVJTSU9OIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogcmVsZWFzZSAkVkVSU0lPTiwgbGlicmFyeSAkTElCX1ZFUlNJT04iID4mNQorKyRhc19lY2hvICJyZWxlYXNlICRWRVJTSU9OLCBsaWJyYXJ5ICRMSUJfVkVSU0lPTiIgPiY2OyB9CisgCisgVU5JQ09ERV9WRVJTSU9OPSI0LjAuMSIKKyAKK0BAIC01OTEsMjE0ICsxOTQwLDgwNCBAQAorIAorICNBQ19TVUJTVChDSU5UTFRTVF9DUFBGTEFHUykKKyAKKy0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrYWNfZXh0PWMKKythY19jcHA9JyRDUFAgJENQUEZMQUdTJworK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKytpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisrICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKytzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKysgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKysgICAgYnJlYWsgMgorKyAgZmkKKytkb25lCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKytmaQorK2ZpCisrQ0M9JGFjX2N2X3Byb2dfQ0MKKytpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorKyRhc19lY2hvICIkQ0MiID4mNjsgfQorK2Vsc2UKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorK2ZpCisrCisrCisrZmkKKytpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKysgIGFjX2N0X0NDPSRDQworKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo1OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisrZmkKKytmaQorK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCisraWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KKytlbHNlCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKytmaQorKworKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisrICAgIENDPSIiCisrICBlbHNlCisrICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KKyt5ZXM6KQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KKythY190b29sX3dhcm5lZD15ZXMgOzsKKytlc2FjCisrICAgIENDPSRhY19jdF9DQworKyAgZmkKKytlbHNlCisrICBDQz0iJGFjX2N2X3Byb2dfQ0MiCisrZmkKKysKKytpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisrICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKysgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKytzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorLSAgICAgIGJyZWFrCistICAgIGZpCistICBkb25lCistICBJRlM9IiRhY19zYXZlX2lmcyIKKythc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrZm9yIGFzX2RpciBpbiAkUEFUSAorK2RvCisrICBJRlM9JGFzX3NhdmVfSUZTCisrICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisrICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisrICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisgZmkKKyBmaQorLUNDPSIkYWNfY3ZfcHJvZ19DQyIKKytDQz0kYWNfY3ZfcHJvZ19DQworIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CisrJGFzX2VjaG8gIiRDQyIgPiY2OyB9CisgZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyBmaQorIAorKworKyAgZmkKKytmaQorIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorIHNldCBkdW1teSBjYzsgYWNfd29yZD0kMgorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjYyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgICBhY19wcm9nX3JlamVjdGVkPW5vCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCistICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworLQljb250aW51ZQorLSAgICAgIGZpCistICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCistICAgICAgYnJlYWsKKy0gICAgZmkKKy0gIGRvbmUKKy0gIElGUz0iJGFjX3NhdmVfaWZzIgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisrICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisrICAgICAgIGNvbnRpbnVlCisrICAgICBmaQorKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKysgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKysgICAgYnJlYWsgMgorKyAgZmkKKytkb25lCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKyBpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgIHNoaWZ0CistICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisrICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgIHNoaWZ0CistICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorLSAgICBzaGlmdAorLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKKysgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgICBmaQorIGZpCisgZmkKKyBmaQorLUNDPSIkYWNfY3ZfcHJvZ19DQyIKKytDQz0kYWNfY3ZfcHJvZ19DQworIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CisrJGFzX2VjaG8gIiRDQyIgPiY2OyB9CisgZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyBmaQorIAorLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorLSAgICAqd2luMzIqIHwgKldJTjMyKikKKy0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo2Nzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysKKytmaQorK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKysgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKysgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorKyAgZG8KKysgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKyAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgZWxzZQorLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKy0gIGFjX2R1bW15PSIkUEFUSCIKKy0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKy0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKy0gICAgICBicmVhaworLSAgICBmaQorLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKysgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKysgICAgYnJlYWsgMgorKyAgZmkKKytkb25lCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKyBmaQorIGZpCistQ0M9IiRhY19jdl9wcm9nX0NDIgorK0NDPSRhY19jdl9wcm9nX0NDCisgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKyskYXNfZWNobyAiJENDIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCistIDs7CistICAgIGVzYWMKKysKKysKKysgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworKyAgZG9uZQorK2ZpCisraWYgdGVzdCAteiAiJENDIjsgdGhlbgorKyAgYWNfY3RfQ0M9JENDCisrICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKytkbworKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKysgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisrZWxzZQorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKyAgIGZpCistICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworK2ZpCisrZmkKKythY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CisrJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CisrZWxzZQorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorKyRhc19lY2hvICJubyIgPiY2OyB9CisgZmkKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo3MTE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisgCistYWNfZXh0PWMKKy0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCistYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworLQorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCistCistI2xpbmUgNzIyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistCistbWFpbigpe3JldHVybigwKTt9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKy0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKy0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisrICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCisrZG9uZQorKworKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisrICAgIENDPSIiCisgICBlbHNlCistICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisrICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KKyt5ZXM6KQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KKythY190b29sX3dhcm5lZD15ZXMgOzsKKytlc2FjCisrICAgIENDPSRhY19jdF9DQworICAgZmkKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCisgZmkKKy1ybSAtZnIgY29uZnRlc3QqCistYWNfZXh0PWMKKy0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCistYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKyBmaQorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6NzUzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2CistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo3NTg6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCistI2lmZGVmIF9fR05VQ19fCistICB5ZXM7CistI2VuZGlmCistRU9GCistaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc2NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCistICBhY19jdl9wcm9nX2djYz15ZXMKKysKKyt0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorK3sgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisrCisrIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorKyRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Cisrc2V0IFggJGFjX2NvbXBpbGUKKythY19jb21waWxlcj0kMgorK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisrCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCisrYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKysjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCisrIyBvZiBleGVleHQuCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9CisrYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKysKKysjIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CisrYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKysKKythY19ybWZpbGVzPQorK2ZvciBhY19maWxlIGluICRhY19maWxlcworK2RvCisrICBjYXNlICRhY19maWxlIGluCisrICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKysgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisrICBlc2FjCisrZG9uZQorK3JtIC1mICRhY19ybWZpbGVzCisrCisraWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisrICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KKysjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisrIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KKysjIEF1dG9jb25mLgorK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworK2RvCisrICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKysgIGNhc2UgJGFjX2ZpbGUgaW4KKysgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQorKwk7OworKyAgICBbYWJdLm91dCApCisrCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisrCSMgY2VydGFpbmx5IHJpZ2h0LgorKwlicmVhazs7CisrICAgICouKiApCisrICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKysJdGhlbiA6OyBlbHNlCisrCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorKwlmaQorKwkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKysJIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCisrCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorKwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKKysJIyBhY3R1YWxseSB3b3JraW5nLgorKwlicmVhazs7CisrICAgICogKQorKwlicmVhazs7CisrICBlc2FjCisrZG9uZQorK3Rlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQorKworIGVsc2UKKy0gIGFjX2N2X3Byb2dfZ2NjPW5vCisrICBhY19maWxlPScnCisgZmkKKysKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KKytpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyt7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKyt7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKysgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfTsgfQorK2ZpCisrCisrYWNfZXhlZXh0PSRhY19jdl9leGVleHQKKysKKysjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorKyMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKKysjIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgorK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorKyAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorKyAgICBjcm9zc19jb21waWxpbmc9bm8KKysgIGVsc2UKKysgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorKwljcm9zc19jb21waWxpbmc9eWVzCisrICAgIGVsc2UKKysJeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KKytJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KKytJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKysgICAgZmkKKysgIGZpCisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorKworK3JtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CisrYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKysjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyskYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisrIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisrIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKysjIGBybScuCisrZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisrICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKysgIGNhc2UgJGFjX2ZpbGUgaW4KKysgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKysJICBicmVhazs7CisrICAgICogKSBicmVhazs7CisrICBlc2FjCisrZG9uZQorK2Vsc2UKKysgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorK3sgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisrZmkKKysKKytybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9CisrCisrcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CisrYWNfZXhlZXh0PSRFWEVFWFQKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKysKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisrICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbworKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworKyAgY2FzZSAkYWNfZmlsZSBpbgorKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gKSA7OworKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKysgICAgICAgYnJlYWs7OworKyAgZXNhYworK2RvbmUKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CisrT0JKRVhUPSRhY19jdl9vYmpleHQKKythY19vYmpleHQ9JE9CSkVYVAorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAKKy1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorK2ludAorK21haW4gKCkKKyt7CisrI2lmbmRlZiBfX0dOVUNfXworKyAgICAgICBjaG9rZSBtZQorKyNlbmRpZgorKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfY29tcGlsZXJfZ251PXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY29tcGlsZXJfZ251PW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKythY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisrCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQorK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICAgR0NDPXllcworIGVsc2UKKyAgIEdDQz0KKyBmaQorK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KKythY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKysgICBhY19jX3dlcnJvcl9mbGFnPXllcworKyAgIGFjX2N2X3Byb2dfY2NfZz1ubworKyAgIENGTEFHUz0iLWciCisrICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfY3ZfcHJvZ19jY19nPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAKKy1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKKy1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKy1DRkxBR1M9CistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysJQ0ZMQUdTPSIiCisrICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgOgorIGVsc2UKKy0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKysJIENGTEFHUz0iLWciCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworK2ludAorK21haW4gKCkKKyt7CisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICBhY19jdl9wcm9nX2NjX2c9eWVzCisgZWxzZQorLSAgYWNfY3ZfcHJvZ19jY19nPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorIAorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKysgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KKyBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCistICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKysgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKKyBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgQ0ZMQUdTPSItZyAtTzIiCitAQCAtODEyLDEzNiArMjc1MSw0ODEgQEAKKyAgICAgQ0ZMQUdTPQorICAgZmkKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCisrYWNfc2F2ZV9DQz0kQ0MKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxzdGRhcmcuaD4KKysjaW5jbHVkZSA8c3RkaW8uaD4KKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisrLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKKytGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworK3N0YXRpYyBjaGFyICplIChwLCBpKQorKyAgICAgY2hhciAqKnA7CisrICAgICBpbnQgaTsKKyt7CisrICByZXR1cm4gcFtpXTsKKyt9Cisrc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQorK3sKKysgIGNoYXIgKnM7CisrICB2YV9saXN0IHY7CisrICB2YV9zdGFydCAodixwKTsKKysgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisrICB2YV9lbmQgKHYpOworKyAgcmV0dXJuIHM7CisrfQorIAorLWZvciBhY19wcm9nIGluICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKysgY2wKKysvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKysgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKysgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CisrICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KKytpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworKworKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKysjZGVmaW5lIEZPTyh4KSAneCcKKytpbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKKysKKytpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKKytzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKKytzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKKytpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKKytpbnQgYXJnYzsKKytjaGFyICoqYXJndjsKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisrCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCisgZG8KKy0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo4MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1hYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKysgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysKKytmaQorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKysgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCisrZG9uZQorK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKKytDQz0kYWNfc2F2ZV9DQworKworK2ZpCisrIyBBQ19DQUNIRV9WQUwKKytjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorKyAgeCkKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisrICB4bm8pCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyskYXNfZWNobyAidW5zdXBwb3J0ZWQiID4mNjsgfSA7OworKyAgKikKKysgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7CisrZXNhYworKworKworK2FjX2V4dD1jCisrYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisrYWNfZXh0PWNwcAorK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCisrYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCisrYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKysgIGlmIHRlc3QgLW4gIiRDQ0MiOyB0aGVuCisrICAgIENYWD0kQ0NDCisrICBlbHNlCisrICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKysgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCisrICBkbworKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKytzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1hYK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKyAgIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgZWxzZQorLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKy0gIGFjX2R1bW15PSIkUEFUSCIKKy0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKy0gICAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Byb2ciCistICAgICAgYnJlYWsKKy0gICAgZmkKKy0gIGRvbmUKKy0gIElGUz0iJGFjX3NhdmVfaWZzIgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworIGZpCisgZmkKKy1DWFg9IiRhY19jdl9wcm9nX0NYWCIKKytDWFg9JGFjX2N2X3Byb2dfQ1hYCisgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkQ1hYIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKKyskYXNfZWNobyAiJENYWCIgPiY2OyB9CisgZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyBmaQorIAorLXRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCisrCisrICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCisrICBkb25lCisrZmkKKytpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorKyAgYWNfY3RfQ1hYPSRDWFgKKysgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCisrZG8KKysgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKysgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorIGRvbmUKKy10ZXN0IC1uICIkQ1hYIiB8fCBDWFg9ImdjYyIKKytJRlM9JGFzX3NhdmVfSUZTCisrCisrZmkKKytmaQorK2FjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKKytpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdF9DWFgiID4mNjsgfQorK2Vsc2UKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorK2ZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQysrIGNvbXBpbGVyICgkQ1hYICRDWFhGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo4NTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKysgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCisrZG9uZQorIAorLWFjX2V4dD1DCistIyBDWFhGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCistYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworLWFjX2xpbms9JyR7Q1hYLWcrK30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworLQorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCistCistI2xpbmUgODY1ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistCistaW50IG1haW4oKXtyZXR1cm4oMCk7fQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIGFjX2N2X3Byb2dfY3h4X3dvcmtzPXllcworLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCistICAgIGFjX2N2X3Byb2dfY3h4X2Nyb3NzPW5vCisrICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCisrICAgIENYWD0iZysrIgorICAgZWxzZQorLSAgICBhY19jdl9wcm9nX2N4eF9jcm9zcz15ZXMKKysgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgorK3llczopCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorK2FjX3Rvb2xfd2FybmVkPXllcyA7OworK2VzYWMKKysgICAgQ1hYPSRhY19jdF9DWFgKKyAgIGZpCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgYWNfY3ZfcHJvZ19jeHhfd29ya3M9bm8KKyBmaQorLXJtIC1mciBjb25mdGVzdCoKKy1hY19leHQ9YworLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKy1hY19jcHA9JyRDUFAgJENQUEZMQUdTJworLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKy1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2N4eF93b3JrcyIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X3dvcmtzID0gbm87IHRoZW4KKy0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKysgIGZpCisgZmkKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6ODk2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X2Nyb3NzIiAxPiY2CistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyskYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1Cisrc2V0IFggJGFjX2NvbXBpbGUKKythY19jb21waWxlcj0kMgorK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlci4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDKysiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo5MDE6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDKysiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2d4eCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LkMgPDxFT0YKKy0jaWZkZWYgX19HTlVDX18KKy0gIHllczsKKytpbnQKKyttYWluICgpCisreworKyNpZm5kZWYgX19HTlVDX18KKysgICAgICAgY2hva2UgbWUKKyAjZW5kaWYKKy1FT0YKKy1pZiB7IGFjX3RyeT0nJHtDWFgtZysrfSAtRSBjb25mdGVzdC5DJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorLSAgYWNfY3ZfcHJvZ19neHg9eWVzCistZWxzZQorLSAgYWNfY3ZfcHJvZ19neHg9bm8KKy1maQorLWZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2d4eCIgMT4mNgorLQorLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ3h4ID0geWVzOyB0aGVuCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGFjX2NvbXBpbGVyX2dudT15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2NvbXBpbGVyX2dudT1ubworK2ZpCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisrCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjY7IH0KKytpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgIEdYWD15ZXMKKyBlbHNlCisgICBHWFg9CisgZmkKKythY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorK2FjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jeHhfZytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBhY19zYXZlX2N4eF93ZXJyb3JfZmxhZz0kYWNfY3h4X3dlcnJvcl9mbGFnCisrICAgYWNfY3h4X3dlcnJvcl9mbGFnPXllcworKyAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKysgICBDWFhGTEFHUz0iLWciCisrICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBhY19jdl9wcm9nX2N4eF9nPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJQ1hYRkxBR1M9IiIKKysgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworK2ludAorK21haW4gKCkKKyt7CisgCistYWNfdGVzdF9DWFhGTEFHUz0iJHtDWFhGTEFHUytzZXR9IgorLWFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKy1DWFhGTEFHUz0KKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q1hYLWcrK30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjkyOTogY2hlY2tpbmcgd2hldGhlciAke0NYWC1nKyt9IGFjY2VwdHMgLWciID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2N4eF9nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKyBlbHNlCistICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmNjCistaWYgdGVzdCAteiAiYCR7Q1hYLWcrK30gLWcgLWMgY29uZnRlc3QuY2MgMj4mMWAiOyB0aGVuCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKKysJIENYWEZMQUdTPSItZyIKKysJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisraW50CisrbWFpbiAoKQorK3sKKysKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKKyBlbHNlCistICBhY19jdl9wcm9nX2N4eF9nPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorIAorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2N4eF9nIiAxPiY2Cisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY3h4X2ciID4mNQorKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jeHhfZyIgPiY2OyB9CisgaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCistICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCisrICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUworIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfZyA9IHllczsgdGhlbgorICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKK0BAIC05NTUsNzYgKzMyMzksNDIgQEAKKyAgICAgQ1hYRkxBR1M9CisgICBmaQorIGZpCistCistZm9yIGFjX2RlY2xhcmF0aW9uIGluIFwKKy0gICAnJ1wKKy0gICAnI2luY2x1ZGUgPHN0ZGxpYi5oPicgXAorLSAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpIHRocm93ICgpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCistICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKy0gICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCkgdGhyb3cgKCk7JyBcCistICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOycgXAorLSAgICd2b2lkIGV4aXQgKGludCk7JworLWRvCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgOTcwICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSRhY19kZWNsYXJhdGlvbgorLWludCBtYWluKCkgeworLWV4aXQgKDQyKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Nzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKy0gIDoKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBjb250aW51ZQorLWZpCistcm0gLWYgY29uZnRlc3QqCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgOTg4ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistJGFjX2RlY2xhcmF0aW9uCistaW50IG1haW4oKSB7CistZXhpdCAoNDIpOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYnJlYWsKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1kb25lCistaWYgdGVzdCAtbiAiJGFjX2RlY2xhcmF0aW9uIjsgdGhlbgorLSAgZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKKy0gIGVjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCistICBlY2hvICcjZW5kaWYnICAgICAgICAgICAgID4+Y29uZmRlZnMuaAorLWZpCistCisrYWNfZXh0PWMKKythY19jcHA9JyRDUFAgJENQUEZMQUdTJworK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKyAKKyBhY19hdXhfZGlyPQorLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCistICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorK2ZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCisrICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCisgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgICBicmVhaworLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgICBicmVhaworKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KKysgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisrICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorKyAgICBicmVhaworICAgZmkKKyBkb25lCisgaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCistICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyBmaQorLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKKy1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKKy1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKysKKysjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKysjIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCisrIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisrIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKythY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKythY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCisrCisgCisgIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisgIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCitAQCAtMTAzMyw2MCArMzI4Myw4OSBAQAorICMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorICMgSVJJWCAvc2Jpbi9pbnN0YWxsCisgIyBBSVggL2Jpbi9pbnN0YWxsCisrIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCisgIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyAjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisrIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisgIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjEwNDI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQorKyMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQorIGlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKytpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCistICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKy0gICAgY2FzZSAiJGFjX2Rpci8iIGluCistICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworLSAgICAqKQorLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCistICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CistICAgICAgIyBieSBkZWZhdWx0LgorLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKy0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorK2Nhc2UgJGFzX2Rpci8gaW4KKysgIC4vIHwgLi8vIHwgL2NDLyogfCBcCisrICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKysgID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAorKyAgL3Vzci91Y2IvKiApIDs7CisrICAqKQorKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorKyAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKysgICAgIyBieSBkZWZhdWx0LgorKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisrICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisrCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisgCSAgICA6CisrCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisrCSAgICA6CisgCSAgZWxzZQorLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorLQkgICAgYnJlYWsgMgorKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisrCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorKwkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKysJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKysJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKysJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisrCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworKwkgICAgdGhlbgorKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisrCSAgICAgIGJyZWFrIDMKKysJICAgIGZpCisgCSAgZmkKKyAJZmkKKyAgICAgICBkb25lCistICAgICAgOzsKKy0gICAgZXNhYworLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCisrICAgIGRvbmUKKysgICAgOzsKKytlc2FjCisrCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKytybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKyAKKyBmaQorICAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKysgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgICBlbHNlCistICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKy0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisrICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKysgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKysgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgICBmaQorIGZpCistZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQorKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisgCisgIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorICMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCisgdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworIAorLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKyt0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworIAorIHRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisgCitAQCAtMTEwMiw3MyArMzM4MSw4NiBAQAorICNBQ19DSEVDS19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgYXV0b2NvbmYsIHRydWUpCisgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisgc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTEwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19TVFJJUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgYWNfY3ZfcHJvZ19TVFJJUD0ic3RyaXAiCistICAgICAgYnJlYWsKKy0gICAgZmkKKy0gIGRvbmUKKy0gIElGUz0iJGFjX3NhdmVfaWZzIgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19TVFJJUD0ic3RyaXAiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisgICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCIgJiYgYWNfY3ZfcHJvZ19TVFJJUD0idHJ1ZSIKKyBmaQorIGZpCistU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCisgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRTVFJJUCIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFNUUklQIiA+JjUKKyskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCisgCisrCisgZm9yIGFjX3Byb2cgaW4gZ21ha2UgZ251bWFrZQorIGRvCistIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKyBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxMTQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1VfTUFLRScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9VX01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgY2FzZSAiJFVfTUFLRSIgaW4KKy0gIC8qKQorKyAgY2FzZSAkVV9NQUtFIGluCisrICBbXFwvXSogfCA/OltcXC9dKikKKyAgIGFjX2N2X3BhdGhfVV9NQUtFPSIkVV9NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgIDs7CistICA/Oi8qKQkJCSAKKy0gIGFjX2N2X3BhdGhfVV9NQUtFPSIkVV9NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCistICA7OworICAgKikKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCistICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCistICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorLSAgICAgIGFjX2N2X3BhdGhfVV9NQUtFPSIkYWNfZGlyLyRhY193b3JkIgorLSAgICAgIGJyZWFrCistICAgIGZpCistICBkb25lCistICBJRlM9IiRhY19zYXZlX2lmcyIKKysgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcGF0aF9VX01BS0U9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisgICA7OworIGVzYWMKKyBmaQorLVVfTUFLRT0iJGFjX2N2X3BhdGhfVV9NQUtFIgorK1VfTUFLRT0kYWNfY3ZfcGF0aF9VX01BS0UKKyBpZiB0ZXN0IC1uICIkVV9NQUtFIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRVX01BS0UiIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRVX01BS0UiID4mNQorKyRhc19lY2hvICIkVV9NQUtFIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCistdGVzdCAtbiAiJFVfTUFLRSIgJiYgYnJlYWsKKysKKysgIHRlc3QgLW4gIiRVX01BS0UiICYmIGJyZWFrCisgZG9uZQorIHRlc3QgLW4gIiRVX01BS0UiIHx8IFVfTUFLRT0ibWFrZSIKKyAKK0BAIC0xMTc2LDE4MiArMzQ2OCwxNTAgQEAKKyAKKyAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRveHlnZW4iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorIHNldCBkdW1teSBkb3h5Z2VuOyBhY193b3JkPSQyCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTE4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9ET1hZR0VOJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0RPWFlHRU4rc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgY2FzZSAiJERPWFlHRU4iIGluCistICAvKikKKysgIGNhc2UgJERPWFlHRU4gaW4KKysgIFtcXC9dKiB8ID86W1xcL10qKQorICAgYWNfY3ZfcGF0aF9ET1hZR0VOPSIkRE9YWUdFTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgICA7OworLSAgPzovKikJCQkgCistICBhY19jdl9wYXRoX0RPWFlHRU49IiRET1hZR0VOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCistICA7OworICAgKikKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEg6L3Vzci9sb2NhbC9iaW46L3Vzci9iaW4iCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCistICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCistICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorLSAgICAgIGFjX2N2X3BhdGhfRE9YWUdFTj0iJGFjX2Rpci8kYWNfd29yZCIKKy0gICAgICBicmVhaworLSAgICBmaQorLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCisrICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrYXNfZHVtbXk9IiRQQVRIOi91c3IvbG9jYWwvYmluOi91c3IvYmluIgorK2ZvciBhc19kaXIgaW4gJGFzX2R1bW15CisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcGF0aF9ET1hZR0VOPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworICAgOzsKKyBlc2FjCisgZmkKKy1ET1hZR0VOPSIkYWNfY3ZfcGF0aF9ET1hZR0VOIgorK0RPWFlHRU49JGFjX2N2X3BhdGhfRE9YWUdFTgorIGlmIHRlc3QgLW4gIiRET1hZR0VOIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRET1hZR0VOIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRE9YWUdFTiIgPiY1CisrJGFzX2VjaG8gIiRET1hZR0VOIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCisgCisgCisgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKy1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorLWZpCistCistZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjEyMjE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorLQorLWhvc3RfYWxpYXM9JGhvc3QKKy1jYXNlICIkaG9zdF9hbGlhcyIgaW4KKy1OT05FKQorLSAgY2FzZSAkbm9ub3B0IGluCistICBOT05FKQorLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CistICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorLSAgICBmaSA7OworLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CistICBlc2FjIDs7CisrJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKKyt0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKysgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KKytjYXNlICRhY19jdl9idWlsZCBpbgorKyotKi0qKSA7OworKyopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgZXNhYworLQorLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAorLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKKy1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCistaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCistZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CistCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjEyNDI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTI0NyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLQorLWludCBtYWluKCkgeworLQorLSNpZm5kZWYgX19DWUdXSU5fXworLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KKy0jZW5kaWYKKy1yZXR1cm4gX19DWUdXSU5fXzsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjU4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9jeWd3aW49eWVzCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfY3lnd2luPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1ybSAtZiBjb25mdGVzdCoKKytidWlsZD0kYWNfY3ZfYnVpbGQKKythY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCisrc2V0IHggJGFjX2N2X2J1aWxkCisrc2hpZnQKKytidWlsZF9jcHU9JDEKKytidWlsZF92ZW5kb3I9JDIKKytzaGlmdDsgc2hpZnQKKysjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKysjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CisrYnVpbGRfb3M9JCoKKytJRlM9JGFjX3NhdmVfSUZTCisrY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKysKKysKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKKytlbHNlCisrICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKKy1DWUdXSU49CistdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcworLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTI3NTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDEyODAgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0KKy1pbnQgbWFpbigpIHsKKy1yZXR1cm4gX19NSU5HVzMyX187CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI4NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfbWluZ3czMj15ZXMKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9taW5ndzMyPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1ybSAtZiBjb25mdGVzdCoKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorK2Nhc2UgJGFjX2N2X2hvc3QgaW4KKysqLSotKikgOzsKKysqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKytlc2FjCisraG9zdD0kYWNfY3ZfaG9zdAorK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKKytzZXQgeCAkYWNfY3ZfaG9zdAorK3NoaWZ0CisraG9zdF9jcHU9JDEKKytob3N0X3ZlbmRvcj0kMgorK3NoaWZ0OyBzaGlmdAorKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKKytob3N0X29zPSQqCisrSUZTPSRhY19zYXZlX0lGUworK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2CistTUlOR1czMj0KKy10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKKy0KKy0KKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxMzA2OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KKy0gIGFjX2N2X2V4ZWV4dD0uZXhlCistZWxzZQorLSAgcm0gLWYgY29uZnRlc3QqCistICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKKy0gIGFjX2N2X2V4ZWV4dD0KKy0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgorLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbworLSAgICAgIGNhc2UgJGZpbGUgaW4KKy0gICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKKy0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OworLSAgICAgIGVzYWMKKy0gICAgZG9uZQorLSAgZWxzZQorLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKy0gIGZpCistICBybSAtZiBjb25mdGVzdCoKKy0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KKy1maQorLWZpCisgCistRVhFRVhUPSIiCistdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KKy1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2CistYWNfZXhlZXh0PSRFWEVFWFQKKyAKKyAKKyAKKy0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpY3QgY29tcGlsaW5nIGlzIG9uIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTMzOTogY2hlY2tpbmcgd2hldGhlciBzdHJpY3QgY29tcGlsaW5nIGlzIG9uIiA+JjUKKy0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cmljdCBvciAtLWRpc2FibGUtc3RyaWN0IHdhcyBnaXZlbi4KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbiIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpY3QgY29tcGlsaW5nIGlzIG9uLi4uICIgPiY2OyB9CisrICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdHJpY3Qgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3N0cmljdCtzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0cmljdCIKKy0gIAorKyAgZW5hYmxldmFsPSRlbmFibGVfc3RyaWN0OworICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSBubworICAgICAgICAgdGhlbgorICAgICAgICAgICAgIGFjX3VzZV9zdHJpY3Rfb3B0aW9ucz1ubworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGFjX3VzZV9zdHJpY3Rfb3B0aW9ucz15ZXMKKyAgICAgICAgIGZpCistICAgICAgCisrCisgZWxzZQorICAgYWNfdXNlX3N0cmljdF9vcHRpb25zPW5vCisgZmkKKyAKKy0gICAgZWNobyAiJGFjX3QiIiRhY191c2Vfc3RyaWN0X29wdGlvbnMiIDE+JjYKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3VzZV9zdHJpY3Rfb3B0aW9ucyIgPiY1CisrJGFzX2VjaG8gIiRhY191c2Vfc3RyaWN0X29wdGlvbnMiID4mNjsgfQorIAorICAgICBpZiB0ZXN0ICIkYWNfdXNlX3N0cmljdF9vcHRpb25zIiA9IHllcworICAgICB0aGVuCitAQCAtMTM5MSwxNyArMzY1MSwxNyBAQAorIAorIAorIAorLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjRiaXQtbGlicyBvciAtLWRpc2FibGUtNjRiaXQtbGlicyB3YXMgZ2l2ZW4uCisrCisrICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS02NGJpdC1saWJzIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke2VuYWJsZV82NGJpdF9saWJzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfNjRiaXRfbGlicyIKKy0gIEVOQUJMRV82NEJJVF9MSUJTPSR7ZW5hYmxldmFsfQorKyAgZW5hYmxldmFsPSRlbmFibGVfNjRiaXRfbGliczsgRU5BQkxFXzY0QklUX0xJQlM9JHtlbmFibGV2YWx9CisgZWxzZQorICAgRU5BQkxFXzY0QklUX0xJQlM9eWVzCistICAgIAorKworIGZpCisgCistICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE0MDU6IGNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IiA+JjUKKysgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIDY0LWJpdCBleGVjdXRhYmxlIHN1cHBvcnQuLi4gIiA+JjY7IH0KKyAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICBjYXNlICIke2hvc3R9IiBpbgorICAgICAgICAgKi0qLWhwdXgqKQorQEAgLTE0NjUsNyArMzcyNSw3IEBACisgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICA7OworICAgICAgICAgKi0qLWFpeCopCistICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCisrICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICMgTm90ZTogSGF2ZSBub3QgdGVzdGVkIDY0LWJpdG5lc3Mgd2l0aCBnY2MuCisgICAgICAgICAgICAgICAgICMgTWF5YmUgdGhlIGZsYWcgIi1tYWl4NjQiIGNvdWxkIGJlIHVzZWQgd2l0aCBnY2M/CisgICAgICAgICAgICAgICAgIE9MRF9DRkxBR1M9IiR7Q0ZMQUdTfSIKK0BAIC0xNDc3LDIzICszNzM3LDUwIEBACisgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz1ubworIGVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAxNDgyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworIGludCBtYWluKHZvaWQpIHtyZXR1cm4gMDt9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCistdGhlbgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKysgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtZnIgY29uZnRlc3QqCistICBFTkFCTEVfNjRCSVRfTElCUz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKytFTkFCTEVfNjRCSVRfTElCUz1ubworIGZpCistcm0gLWZyIGNvbmZ0ZXN0KgorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyAKKysKKyAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICBDRkxBR1M9IiR7T0xEX0NGTEFHU30iCisgICAgICAgICAgICAgICAgICAgICBDWFhGTEFHUz0iJHtPTERfQ1hYRkxBR1N9IgorQEAgLTE1MDQsNyArMzc5MSw3IEBACisgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICA7OworICAgICAgICAgKi0qLWhwdXgqKQorLSAgICAgICAgICAgICAgICAgICAgICAgIAorKworICAgICAgICAgICAgIE9MRF9DRkxBR1M9IiR7Q0ZMQUdTfSIKKyAgICAgICAgICAgICBPTERfQ1hYRkxBR1M9IiR7Q1hYRkxBR1N9IgorICAgICAgICAgICAgIENGTEFHUz0iJHtDRkxBR1N9ICtERDY0IgorQEAgLTE1MTIsMjMgKzM3OTksNTAgQEAKKyAgICAgICAgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgRU5BQkxFXzY0QklUX0xJQlM9bm8KKyBlbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTUxNyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyBpbnQgbWFpbih2b2lkKSB7cmV0dXJuIDA7fQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorLXRoZW4KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAgRU5BQkxFXzY0QklUX0xJQlM9eWVzCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLWZyIGNvbmZ0ZXN0KgorLSAgRU5BQkxFXzY0QklUX0xJQlM9bm8KKysgICRhc19lY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysoIGV4aXQgJGFjX3N0YXR1cyApCisrRU5BQkxFXzY0QklUX0xJQlM9bm8KKyBmaQorLXJtIC1mciBjb25mdGVzdCoKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCisrCisgICAgICAgICAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgIENGTEFHUz0iJHtPTERfQ0ZMQUdTfSIKKyAgICAgICAgICAgICAgICAgQ1hYRkxBR1M9IiR7T0xEX0NYWEZMQUdTfSIKK0BAIC0xNTM3LDIzICszODUxLDUwIEBACisgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz1ubworIGVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAxNTQyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworIGludCBtYWluKHZvaWQpIHtyZXR1cm4gMDt9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQ2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCistdGhlbgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKysgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtZnIgY29uZnRlc3QqCistICBFTkFCTEVfNjRCSVRfTElCUz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKytFTkFCTEVfNjRCSVRfTElCUz1ubworIGZpCistcm0gLWZyIGNvbmZ0ZXN0KgorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyAKKysKKyAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICBDRkxBR1M9IiR7T0xEX0NGTEFHU30iCisgICAgICAgICAgICAgICAgICAgICBDWFhGTEFHUz0iJHtPTERfQ1hYRkxBR1N9IgorQEAgLTE1NjUsMzQgKzM5MDYsMzUgQEAKKyAgICAgICAgICAgICA7OworICAgICAgICAgZXNhYworICAgICBmaQorLSAgICAgICAgZWNobyAiJGFjX3QiIiRFTkFCTEVfNjRCSVRfTElCUyIgMT4mNgorKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEVOQUJMRV82NEJJVF9MSUJTIiA+JjUKKyskYXNfZWNobyAiJEVOQUJMRV82NEJJVF9MSUJTIiA+JjY7IH0KKyAKKyAKKyAKKyAKKyAKKy0JZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTU3NjogY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snaWN1X2N2X2hvc3RfZnJhZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKwl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGljaCBNYWtlZmlsZSBmcmFnbWVudCB0byB1c2UuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2ljdV9jdl9ob3N0X2ZyYWcrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgCisrCisgY2FzZSAiJHtob3N0fSIgaW4KKyAqLSotc29sYXJpcyopCistCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCQorLQkJaWN1X2N2X2hvc3RfZnJhZz1taC1zb2xhcmlzLWdjYyAKKysJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKysJCWljdV9jdl9ob3N0X2ZyYWc9bWgtc29sYXJpcy1nY2MKKyAJZWxzZQorIAkJaWN1X2N2X2hvc3RfZnJhZz1taC1zb2xhcmlzCisgCWZpIDs7CisgYWxwaGEqLSotbGludXgtZ251KQorIAlpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorIAkJaWN1X2N2X2hvc3RfZnJhZz1taC1hbHBoYS1saW51eC1nY2MKKy0JZWxzZSAgCisrCWVsc2UKKyAJCWljdV9jdl9ob3N0X2ZyYWc9bWgtYWxwaGEtbGludXgtY2MKKyAJZmkgOzsKKyAqLSotbGludXgqKSBpY3VfY3ZfaG9zdF9mcmFnPW1oLWxpbnV4IDs7CisgKi0qLWN5Z3dpbikKKy0JaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgorKwlpZiB0ZXN0ICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID0geWVzOyB0aGVuCisgCSAgCWljdV9jdl9ob3N0X2ZyYWc9bWgtY3lnd2luCisgCWVsc2UKKyAJICAJaWN1X2N2X2hvc3RfZnJhZz1taC1jeWd3aW4tbXN2YworQEAgLTE2MjksMTEzICszOTcxLDE2OSBAQAorICotc2VxdWVudC0qKSAJaWN1X2N2X2hvc3RfZnJhZz1taC1wdHggOzsKKyAqKSAJCWljdV9jdl9ob3N0X2ZyYWc9bWgtdW5rbm93biA7OworIGVzYWMKKy0JCQorLQkKKy1maQorIAorLWVjaG8gIiRhY190IiIkaWN1X2N2X2hvc3RfZnJhZyIgMT4mNgorKworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGljdV9jdl9ob3N0X2ZyYWciID4mNQorKyRhc19lY2hvICIkaWN1X2N2X2hvc3RfZnJhZyIgPiY2OyB9CisgCisgCisgY2FzZSAiJHtob3N0fSIgaW4KKy0JKi0qLWhwdXgqKSAJZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE2NDI6IGNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iID4mNQorLWFjX2xpYl92YXI9YGVjaG8gbSdfJ2Zsb29yIHwgc2VkICd5JS4vKy0lX19wXyUnYAorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysJKi0qLWhwdXgqKSAJeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0uLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2xpYl9tX2Zsb29yK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGFjX3NhdmVfTElCUz0iJExJQlMiCisrICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCisgTElCUz0iLWxtICAkTElCUyIKKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTY1MCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgZmxvb3IoKTsKKy0KKy1pbnQgbWFpbigpIHsKKy1mbG9vcigpCistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorLUxJQlM9IiRhY19zYXZlX0xJQlMiCistCistZmkKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBmbG9vciAoKTsKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBmbG9vciAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2xpYl9tX2Zsb29yPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfbGliX21fZmxvb3I9bm8KKytmaQorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfbV9mbG9vciIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9saWJfbV9mbG9vciIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl9saWJfbV9mbG9vciIgPSB4IiJ5ZXM7IHRoZW4KKyAgIExJQl9NPSItbG0iCistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgZmkKKyAgOzsKKy0JCistCSopIAkJZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE2ODM6IGNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iID4mNQorLWFjX2xpYl92YXI9YGVjaG8gbSdfJ2Zsb29yIHwgc2VkICd5JS4vKy0lX19wXyUnYAorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysKKysJKikKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbS4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfbGliX21fZmxvb3Irc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKysgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKKyBMSUJTPSItbG0gICRMSUJTIgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAxNjkxICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBmbG9vcigpOworLQorLWludCBtYWluKCkgeworLWZsb29yKCkKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistTElCUz0iJGFjX3NhdmVfTElCUyIKKy0KKy1maQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG0gfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKy0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCistI2RlZmluZSAkYWNfdHJfbGliIDEKKy1FT0YKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgZmxvb3IgKCk7CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gZmxvb3IgKCk7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisrICBhY19jdl9saWJfbV9mbG9vcj15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2xpYl9tX2Zsb29yPW5vCisrZmkKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX21fZmxvb3IiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfbGliX21fZmxvb3IiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfbGliX21fZmxvb3IiID0geCIieWVzOyB0aGVuCisrICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBIQVZFX0xJQk0gMQorK19BQ0VPRgorIAorICAgTElCUz0iLWxtICRMSUJTIgorIAorLWVsc2UKKy0gIGVjaG8gIiRhY190IiJubyIgMT4mNgorIGZpCistIAorKworIAkJCUxJQl9NPSIiIDs7CisgZXNhYworIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE3MzQ6IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgZW5hYmxlZD1ubworLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3NoYXJlZDsgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJICAgICB5ZXN8IiIpIGVuYWJsZWQ9eWVzOyBFTkFCTEVfU0hBUkVEPVlFUyA7OworIAkgICAgIG5vKTs7CisgCSAgICAgKikgOzsKK0BAIC0xNzQ1LDE2MiArNDE0MywyMzAgQEAKKyAKKyBmaQorIAorLWVjaG8gIiRhY190IiIkZW5hYmxlZCIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVkIiA+JjUKKyskYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE3NTM6IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgZW5hYmxlZD1ubworLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3N0YXRpYzsgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJICAgICB5ZXN8IiIpIGVuYWJsZWQ9eWVzOyBFTkFCTEVfU1RBVElDPVlFUyA7OworIAkgICAgIG5vKSA7OworIAkgICAgICopIDs7CisgICAgIGVzYWMKKyBmaQorIAorLWVjaG8gIiRhY190IiIkZW5hYmxlZCIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVkIiA+JjUKKyskYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgZGVidWcgbGlicmFyaWVzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTc2OTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMiID4mNQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGRlYnVnIGxpYnJhcmllcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyBlbmFibGVkPW5vCisgRU5BQkxFX0RFQlVHPTAKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgb3IgLS1kaXNhYmxlLWRlYnVnIHdhcyBnaXZlbi4KKysjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfZGVidWciCistICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfZGVidWc7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgICAgICAgICAgeWVzfCIiKSBlbmFibGVkPXllczsgRU5BQkxFX0RFQlVHPTEgOzsKKyAgICAgICAgICAqKSA7OworICAgICBlc2FjCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGVuYWJsZWQiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlZCIgPiY1CisrJGFzX2VjaG8gIiRlbmFibGVkIiA+JjY7IH0KKyAKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTc4NTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCByZWxlYXNlIGxpYnJhcmllcyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyBlbmFibGVkPXllcworIEVOQUJMRV9SRUxFQVNFPTEKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVsZWFzZSBvciAtLWRpc2FibGUtcmVsZWFzZSB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXJlbGVhc2Ugd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3JlbGVhc2Urc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIGVuYWJsZXZhbD0iJGVuYWJsZV9yZWxlYXNlIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3JlbGVhc2U7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgICAgICAgICAgbm8pIGVuYWJsZWQ9bm87IEVOQUJMRV9SRUxFQVNFPTAgOzsKKyAgICAgICAgICAqKSA7OworICAgICBlc2FjCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGVuYWJsZWQiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlZCIgPiY1CisrJGFzX2VjaG8gIiRlbmFibGVkIiA+JjY7IH0KKyAKKyAKKy0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCistc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE4MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKy0gICAgICBicmVhaworLSAgICBmaQorLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCistICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworIGZpCisgZmkKKy1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKKytSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCisgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKKyskYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9CisrZWxzZQorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorKyRhc19lY2hvICJubyIgPiY2OyB9CisrZmkKKysKKysKKytmaQorK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKysgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisrICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKysgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworK2ZpCisrZmkKKythY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCisraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorKyRhc19lY2hvICIkYWNfY3RfUkFOTElCIiA+JjY7IH0KKytlbHNlCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKytmaQorKworKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorKyAgICBSQU5MSUI9IjoiCisrICBlbHNlCisrICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KKyt5ZXM6KQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KKythY190b29sX3dhcm5lZD15ZXMgOzsKKytlc2FjCisrICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisrICBmaQorIGVsc2UKKy0gIGVjaG8gIiRhY190IiJubyIgMT4mNgorKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCisgZmkKKyAKKyAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKyBzZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxODMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0FSK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGNhc2UgIiRBUiIgaW4KKy0gIC8qKQorKyAgY2FzZSAkQVIgaW4KKysgIFtcXC9dKiB8ID86W1xcL10qKQorICAgYWNfY3ZfcGF0aF9BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgIDs7CistICA/Oi8qKQkJCSAKKy0gIGFjX2N2X3BhdGhfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorLSAgOzsKKyAgICopCistICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorLSAgYWNfZHVtbXk9IiRQQVRIOi9iaW46L3Vzci9iaW46L3Vzci9jY3MvYmluIgorLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKy0gICAgICBhY19jdl9wYXRoX0FSPSIkYWNfZGlyLyRhY193b3JkIgorLSAgICAgIGJyZWFrCistICAgIGZpCistICBkb25lCistICBJRlM9IiRhY19zYXZlX2lmcyIKKysgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKythc19kdW1teT0iJFBBVEg6L2JpbjovdXNyL2JpbjovdXNyL2Njcy9iaW4iCisrZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wYXRoX0FSPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQVIiICYmIGFjX2N2X3BhdGhfQVI9ImVjaG8gYXJjaGl2ZXIgYXIgbm90IGZvdW5kIHJlLXJ1biBjb25maWd1cmUgOyBmYWxzZSIKKyAgIDs7CisgZXNhYworIGZpCistQVI9IiRhY19jdl9wYXRoX0FSIgorK0FSPSRhY19jdl9wYXRoX0FSCisgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFSIiA+JjUKKyskYXNfZWNobyAiJEFSIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgcmVuYW1pbmcgb2Ygc3ltYm9scyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlbmFtaW5nIG9mIHN5bWJvbHMiID4mNQorKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSByZW5hbWluZyBvZiBzeW1ib2xzIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSByZW5hbWluZyBvZiBzeW1ib2xzLi4uICIgPiY2OyB9CisgZW5hYmxlZD15ZXMKKyBVX0RJU0FCTEVfUkVOQU1JTkc9MAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yZW5hbWluZyBvciAtLWRpc2FibGUtcmVuYW1pbmcgd2FzIGdpdmVuLgorKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yZW5hbWluZyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfcmVuYW1pbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIGVuYWJsZXZhbD0iJGVuYWJsZV9yZW5hbWluZyIKKy0gICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisrICBlbmFibGV2YWw9JGVuYWJsZV9yZW5hbWluZzsgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJICAgICB5ZXN8IiIpIGVuYWJsZWQ9eWVzIDs7CisgCSAgICAgbm8pIGVuYWJsZWQ9bm87IFVfRElTQUJMRV9SRU5BTUlORz0xIDs7CisgCSAgICAgKikgOzsKKyAgICAgZXNhYworIGZpCisgCistZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorKyRhc19lY2hvICIkZW5hYmxlZCIgPiY2OyB9CisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE4ODU6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGZ1bmN0aW9uIGFuZCBkYXRhIHRyYWNpbmciID4mNQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nLi4uICIgPiY2OyB9CisgZW5hYmxlZD15ZXMKKyBVX0VOQUJMRV9UUkFDSU5HPTEKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdHJhY2luZyBvciAtLWRpc2FibGUtdHJhY2luZyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRyYWNpbmcgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3RyYWNpbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIGVuYWJsZXZhbD0iJGVuYWJsZV90cmFjaW5nIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3RyYWNpbmc7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCSAgICAgeWVzfCIiKSBlbmFibGVkPXllcyA7OworIAkgICAgIG5vKSBlbmFibGVkPW5vOyBVX0VOQUJMRV9UUkFDSU5HPTAgOzsKKyAJICAgICAqKSA7OworICAgICBlc2FjCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGVuYWJsZWQiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlZCIgPiY1CisrJGFzX2VjaG8gIiRlbmFibGVkIiA+JjY7IH0KKyAKKyAKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcnBhdGggb3IgLS1kaXNhYmxlLXJwYXRoIHdhcyBnaXZlbi4KKysjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcnBhdGggd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3JwYXRoK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfcnBhdGgiCistICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfcnBhdGg7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCSAgICAgeWVzfCIiKSBFTkFCTEVfUlBBVEg9WUVTIDs7CisgCSAgICAgbm8pIDs7CisgCSAgICAgKikgOzsKK0BAIC0xOTEzLDM0ICs0Mzc5LDYwIEBACisgCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRlZmluaXRpb24gb2YgVV9JTkxJTkUgZm9yIEMiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxOTE4OiBjaGVja2luZyBmb3IgZGVmaW5pdGlvbiBvZiBVX0lOTElORSBmb3IgQyIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmaW5pdGlvbiBvZiBVX0lOTElORSBmb3IgQy4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfY19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorICAgYWNfY3ZfY19pbmxpbmU9bm8KKyBmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTkyNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAKKy1pbnQgbWFpbigpIHsKKytpbnQKKyttYWluICgpCisreworIH0gJGFjX2t3IGZvbygpIHsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworIGZpCistcm0gLWYgY29uZnRlc3QqCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBkb25lCistICAKKy1maQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9jX2lubGluZSIgPiY2OyB9CisgY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICAgICAgIHllcykgICAgICAgVV9JTkxJTkU9ICJpbmxpbmUiIDs7CisgCSAgbm8gKSAgICAgICBVX0lOTElORT0gOzsKK0BAIC0xOTUwLDEzICs0NDQyLDE0IEBACisgCisgdGhyZWFkcz10cnVlCisgCistIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRocmVhZHMgb3IgLS1kaXNhYmxlLXRocmVhZHMgd2FzIGdpdmVuLgorKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10aHJlYWRzIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke2VuYWJsZV90aHJlYWRzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfdGhyZWFkcyIKKy0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3RocmVhZHM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJCXllcykgdGhyZWFkcz10cnVlIDs7CisgCQlubykgIHRocmVhZHM9ZmFsc2UgOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGhyZWFkcyIgMT4mMjsgZXhpdCAxOyB9IDs7CisrCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGhyZWFkcyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRocmVhZHMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgdGhyZWFkcz10cnVlCitAQCAtMTk3MiwxNzEgKzQ0NjUsMjk1IEBACisgSUNVX1VTRV9USFJFQURTPTAKKyAKKyBpZiB0ZXN0ICR0aHJlYWRzID0gdHJ1ZTsgdGhlbgorLSAgICAgICAgICAgCistICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTk3ODogY2hlY2tpbmcgZm9yIHB0aHJlYWRfYXR0cl9pbml0IGluIC1scHRocmVhZCIgPiY1CistYWNfbGliX3Zhcj1gZWNobyBwdGhyZWFkJ18ncHRocmVhZF9hdHRyX2luaXQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKworKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICBhY19zYXZlX0xJQlM9IiRMSUJTIgorKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworIExJQlM9Ii1scHRocmVhZCAgJExJQlMiCistY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDE5ODYgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKy0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKy1jaGFyIHB0aHJlYWRfYXR0cl9pbml0KCk7CistCistaW50IG1haW4oKSB7CistcHRocmVhZF9hdHRyX2luaXQoKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1MSUJTPSIkYWNfc2F2ZV9MSUJTIgorLQorLWZpCistaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKy0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gcHRocmVhZCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKy0jZGVmaW5lICRhY190cl9saWIgMQorLUVPRgorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBwdGhyZWFkX2F0dHJfaW5pdCAoKTsKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBwdGhyZWFkX2F0dHJfaW5pdCAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0PXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQ9bm8KKytmaQorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCisrX0FDRU9GCisgCisgICBMSUJTPSItbHB0aHJlYWQgJExJQlMiCisgCistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgZmkKKyAKKyAgIGlmIHRlc3QgJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0ID0geWVzOyB0aGVuCisgICAgSUNVX1VTRV9USFJFQURTPTEKKyAgIGVsc2UKKy0gICAgICAgICAgICAgICAKKy0gICAKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKworKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBwdGhyZWFkX211dGV4X2Rlc3Ryb3kuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3krc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorICAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSIkTElCUyIKKyBhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95PSJubyIKKyBmb3IgaSBpbiBwdGhyZWFkIHB0aHJlYWRzIGNfciA7IGRvCisgTElCUz0iLWwkaSAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjAzOSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95KCk7CistCistaW50IG1haW4oKSB7CistcHRocmVhZF9tdXRleF9kZXN0cm95KCkKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworK2ludAorK21haW4gKCkKKyt7CisrcmV0dXJuIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3k9Ii1sJGkiCisgYnJlYWsKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBkb25lCisgaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiID0gIm5vIjsgdGhlbgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyMDYyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBwdGhyZWFkX211dGV4X2Rlc3Ryb3koKTsKKy0KKy1pbnQgbWFpbigpIHsKKy1wdGhyZWFkX211dGV4X2Rlc3Ryb3koKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCk7CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorICAgYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveT0ibm9uZSByZXF1aXJlZCIKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorIExJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgZmkKKy0KKy1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjY7IH0KKyBpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSIgIT0gIm5vIjsgdGhlbgorICAgdGVzdCAiJGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95ICRMSUJTIgorLSAgCisrCisgZWxzZSA6CistICAKKysKKyBmaQorIAorICAgIGlmIHRlc3QgIiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiAhPSBubzsgdGhlbgorICAgICBJQ1VfVVNFX1RIUkVBRFM9MQorICAgIGVsc2UKKy0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2luaXQgaW4gLWxwdGhyZWFkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjA5NzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBpbiAtbHB0aHJlYWQiID4mNQorLWFjX2xpYl92YXI9YGVjaG8gcHRocmVhZCdfJ3B0aHJlYWRfbXV0ZXhfaW5pdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2luaXQgaW4gLWxwdGhyZWFkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9pbml0IGluIC1scHRocmVhZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGFjX3NhdmVfTElCUz0iJExJQlMiCisrICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCisgTElCUz0iLWxwdGhyZWFkICAkTElCUyIKKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjEwNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgcHRocmVhZF9tdXRleF9pbml0KCk7CistCistaW50IG1haW4oKSB7CistcHRocmVhZF9tdXRleF9pbml0KCkKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistTElCUz0iJGFjX3NhdmVfTElCUyIKKy0KKy1maQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHB0aHJlYWQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKy0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCistI2RlZmluZSAkYWNfdHJfbGliIDEKKy1FT0YKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgcHRocmVhZF9tdXRleF9pbml0ICgpOworK2ludAorK21haW4gKCkKKyt7CisrcmV0dXJuIHB0aHJlYWRfbXV0ZXhfaW5pdCAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdD15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdD1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisrTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0IiA9IHgiInllczsgdGhlbgorKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorKyNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKKytfQUNFT0YKKyAKKyAgIExJQlM9Ii1scHRocmVhZCAkTElCUyIKKyAKKy1lbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyBmaQorIAorICAgICBpZiB0ZXN0ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQgPSB5ZXM7IHRoZW4KK0BAIC0yMTQ0LDUzICs0NzYxLDkxIEBACisgICAgIGZpCisgICAgZmkKKyAKKy0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9sb2NrIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjE0OTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDIxNTQgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jay4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysvKiBEZWZpbmUgcHRocmVhZF9tdXRleF9sb2NrIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcHRocmVhZF9tdXRleF9sb2NrLgorKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworKyNkZWZpbmUgcHRocmVhZF9tdXRleF9sb2NrIGlubm9jdW91c19wdGhyZWFkX211dGV4X2xvY2sKKysKKyAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCistICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcHRocmVhZF9tdXRleF9sb2NrKCk7IGJlbG93LiAgKi8KKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBwdGhyZWFkX211dGV4X2xvY2soKTsKKysgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwdGhyZWFkX211dGV4X2xvY2sgKCk7IGJlbG93LgorKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisrICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisrCisrI2lmZGVmIF9fU1REQ19fCisrIyBpbmNsdWRlIDxsaW1pdHMuaD4KKysjZWxzZQorKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisrI2VuZGlmCisgCistaW50IG1haW4oKSB7CisrI3VuZGVmIHB0aHJlYWRfbXV0ZXhfbG9jaworIAorKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOworIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCistI2lmIGRlZmluZWQgKF9fc3R1Yl9wdGhyZWFkX211dGV4X2xvY2spIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3B0aHJlYWRfbXV0ZXhfbG9jaykKKysjaWYgZGVmaW5lZCBfX3N0dWJfcHRocmVhZF9tdXRleF9sb2NrIHx8IGRlZmluZWQgX19zdHViX19fcHRocmVhZF9tdXRleF9sb2NrCisgY2hva2UgbWUKKy0jZWxzZQorLXB0aHJlYWRfbXV0ZXhfbG9jaygpOworICNlbmRpZgorIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistZmkKKy0KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydwdGhyZWFkX211dGV4X2xvY2tgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaz1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2siID4mNQorKyRhc19lY2hvICIkYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2siID4mNjsgfQorIAorIAorICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrID0geWVzOyB0aGVuCitAQCAtMjE5OCw3ICs0ODUzLDcgQEAKKyAgICBmaQorICAgICAgIGNhc2UgIiR7aG9zdH0iIGluCisgICAgKi1wYy1jeWd3aW4qfCotcGMtbWluZ3cqKQorLSAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCisrICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgIElDVV9VU0VfVEhSRUFEUz0xCisgICAgICBmaSA7OworICAgICotKi1ocHV4KikKK0BAIC0yMjIyLDM3ICs0ODc3LDY3IEBACisgIyBUaGUgQUNfRlVOQ19NTUFQIG1hY3JvIGRvZXNuJ3Qgd29yayBwcm9wZXJseS4gIEl0IHNlZW1zIHRvIGJlIHRvbyBzcGVjaWZpYy4KKyAjIERvIHRoaXMgY2hlY2sgaW5zdGVhZC4KKyBIQVZFX01NQVA9MAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjIyNzogY2hlY2tpbmcgZm9yIG1tYXAiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjIzMiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSAgICAKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1tYXAiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBtbWFwLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfb2src2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKyAjaW5jbHVkZSA8dW5pc3RkLmg+CisgI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisgI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisgI2luY2x1ZGUgPGZjbnRsLmg+CistICAgIAorLWludCBtYWluKCkgeworKworK2ludAorK21haW4gKCkKKyt7CisgICAgIG1tYXAoKHZvaWQgKikwLCAwLCBQUk9UX1JFQUQsIDAsIDAsIDApOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorICAgYWNfY3ZfZnVuY19tbWFwX29rPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2Z1bmNfbW1hcF9vaz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX21tYXBfb2s9bm8KKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KiAKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX29rIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfbW1hcF9vayIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9mdW5jX21tYXBfb2siID4mNjsgfQorIGlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9vayA9IHllcworIHRoZW4KKyAgICAgSEFWRV9NTUFQPTEKK0BAIC0yMjY5LDEyNCArNDk1NCw3NzIgQEAKKyAKKyAKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjIyNzQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKythY19leHQ9YworK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCisrYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCisrYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KKyAjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgorIGlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgICBDUFA9CisgZmkKKyBpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisrICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisrICAgIGRvCisrICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisrICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9OyB0aGVuCisrICA6CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorK2NvbnRpbnVlCisrZmkKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorKworKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKysgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorK19BQ0VPRgorK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH07IHRoZW4KKysgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCisrY29udGludWUKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrICAjIFBhc3NlcyBib3RoIHRlc3RzLgorK2FjX3ByZXByb2Nfb2s9OgorK2JyZWFrCisrZmkKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorKworK2RvbmUKKysjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisrICBicmVhaworK2ZpCisrCisrICAgIGRvbmUKKysgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorKworK2ZpCisrICBDUFA9JGFjX2N2X3Byb2dfQ1BQCisgZWxzZQorLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKy0gIENQUD0iJHtDQy1jY30gLUUiCisrICBhY19jdl9wcm9nX0NQUD0kQ1BQCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1BQIiA+JjUKKyskYXNfZWNobyAiJENQUCIgPiY2OyB9CisrYWNfcHJlcHJvY19vaz1mYWxzZQorK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyMjg5ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPGFzc2VydC5oPgorLVN5bnRheCBFcnJvcgorLUVPRgorLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCisteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjk1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKy1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9OyB0aGVuCisgICA6CisgZWxzZQorLSAgZWNobyAiJGFjX2VyciIgPiY1CistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjMwNiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxhc3NlcnQuaD4KKy1TeW50YXggRXJyb3IKKy1FT0YKKy1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKy1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCistaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KKytjb250aW51ZQorK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKysgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisrICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9OyB0aGVuCisrICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorK2NvbnRpbnVlCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KKythY19wcmVwcm9jX29rPToKKyticmVhaworK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKytkb25lCisrIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKytpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDIzMjMgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistU3ludGF4IEVycm9yCistRU9GCistYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKy17IChldmFsIGVjaG8gY29uZmlndXJlOjIzMjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CistYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisrICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKyt7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKytmaQorKworK2FjX2V4dD1jCisrYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisrICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKKysgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisrICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisrICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKysgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisrIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKKytjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisrKkdOVSopCisrICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKysqKQorKyAgYWNfY291bnQ9MAorKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisrICB3aGlsZSA6CisrICBkbworKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisrICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorKyAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisrICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCisrICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKysgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKysgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisrICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKysgICAgZmkKKysgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKysgIGRvbmUKKysgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworK2VzYWMKKysKKysgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKysgICAgZG9uZQorKyAgZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgorKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrICBmaQorK2Vsc2UKKysgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorK2ZpCisrCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisrIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCisrCisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCisrICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKysgICBlbHNlCisrICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCisrICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisrICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKysgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisrICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKysgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKysjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCisrY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKysqR05VKikKKysgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OworKyopCisrICBhY19jb3VudD0wCisrICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKysgIHdoaWxlIDoKKysgIGRvCisrICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisrICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKysgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisrICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorKyAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKysgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworKyAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAorKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorKyAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorKyAgICBmaQorKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisrICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworKyAgZG9uZQorKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7CisrZXNhYworKworKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKysgICAgZG9uZQorKyAgZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKysgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrICBmaQorK2Vsc2UKKysgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCisrZmkKKysKKysgICBmaQorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9CisrIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKysKKysKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxzdGRsaWIuaD4KKysjaW5jbHVkZSA8c3RkYXJnLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorKyNpbmNsdWRlIDxmbG9hdC5oPgorKworK2ludAorK21haW4gKCkKKyt7CisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2hlYWRlcl9zdGRjPW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKysKKytpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8c3RyaW5nLmg+CisrCisrX0FDRU9GCisraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgQ1BQPS9saWIvY3BwCisrICBhY19jdl9oZWFkZXJfc3RkYz1ubworIGZpCisgcm0gLWYgY29uZnRlc3QqCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8c3RkbGliLmg+CisrCisrX0FDRU9GCisraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIDoKKytlbHNlCisrICBhY19jdl9oZWFkZXJfc3RkYz1ubworIGZpCisgcm0gLWYgY29uZnRlc3QqCistICBhY19jdl9wcm9nX0NQUD0iJENQUCIKKysKKyBmaQorLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCisrCisraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKysgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKysgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisrICA6CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8Y3R5cGUuaD4KKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKysjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisrI2Vsc2UKKysjIGRlZmluZSBJU0xPV0VSKGMpIFwKKysJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisrCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKysJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisrIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKysjZW5kaWYKKysKKysjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQorK2ludAorK21haW4gKCkKKyt7CisrICBpbnQgaTsKKysgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKysgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorKwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKysgICAgICByZXR1cm4gMjsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorKyAgOgorIGVsc2UKKy0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKythY19jdl9oZWFkZXJfc3RkYz1ubworK2ZpCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorKworKworK2ZpCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQorK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKysjZGVmaW5lIFNURENfSEVBREVSUyAxCisrX0FDRU9GCisrCisgZmkKKy1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgorIAorLWZvciBhY19oZHIgaW4gaW50dHlwZXMuaAorKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCisrCisrCisrCisrCisrCisrCisrCisrCisrCisrZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCisrCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKKyBkbworLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjM1NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjM2MiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDwkYWNfaGRyPgorLUVPRgorLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCisteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzY3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKy1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKKy1lbHNlCistICBlY2hvICIkYWNfZXJyIiA+JjUKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorK2FzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICIgPiY2OyB9CisraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisrCisrI2luY2x1ZGUgPCRhY19oZWFkZXI+CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK2FjX3Jlcz1gZXZhbCAnYXNfdmFsPSR7JyRhc19hY19IZWFkZXInfQorKwkJICRhc19lY2hvICIkYXNfdmFsIidgCisrCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisrYXNfdmFsPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9CisrCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKysgICBpZiB0ZXN0ICJ4JGFzX3ZhbCIgPSB4IiJ5ZXM7IHRoZW4KKysgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKKytfQUNFT0YKKysKKyBmaQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCistI2RlZmluZSAkYWNfdHJfaGRyIDEKKy1FT0YKKy0gCistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrCisrZG9uZQorKworKworKworK2ZvciBhY19oZWFkZXIgaW4gaW50dHlwZXMuaAorK2RvCisrYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gIiA+JjY7IH0KKytpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2ZpCisrYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9CisrCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKysJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKytlbHNlCisrICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICIgPiY2OyB9CisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyskYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisrCisrIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorK19BQ0VPRgorK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH07IHRoZW4KKysgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCisrZmkKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CisrJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisrCisrIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CisrY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorKyAgeWVzOm5vOiApCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKysgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisrICAgIDs7CisrICBubzp5ZXM6KiApCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKysKKysgICAgOzsKKytlc2FjCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAiID4mNjsgfQorK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorK2ZpCisrYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9CisrCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKysJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKysKKytmaQorK2FzX3ZhbD1gZXZhbCAnYXNfdmFsPSR7JyRhc19hY19IZWFkZXInfQorKwkJICRhc19lY2hvICIkYXNfdmFsIidgCisrICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuCisrICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCisrX0FDRU9GCisrCisgZmkKKysKKyBkb25lCisgCisgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSBubzsgdGhlbgorQEAgLTIzOTUsNyArNTcyOCw4IEBACisgIFVfSEFWRV9JTlRUWVBFU19IPTEKKyBmaQorIGlmIHRlc3QgIiRDQyIgPSBjY2M7IHRoZW4KKy0gZWNobyAiJGFjX3QiIiJDIGNvbXBpbGVyIHNldCB0byBDQ0MgJHtDQ30iICIgMT4mNgorKyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBcIkMgY29tcGlsZXIgc2V0IHRvIENDQyAke0NDfVwiICIgPiY1CisrJGFzX2VjaG8gIlwiQyBjb21waWxlciBzZXQgdG8gQ0NDICR7Q0N9XCIgIiA+JjY7IH0KKyAgY2FzZSAiJHtob3N0fSIgaW4KKyAgICAgICAgIGFscGhhKi0qLSopIFVfSEFWRV9JTlRUWVBFU19IPTA7CisgIGVzYWMKK0BAIC0yNDAzLDE1ICs1NzM3LDE3IEBACisgCisgCisgCistIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pb3N0cmVhbSBvciAtLXdpdGhvdXQtaW9zdHJlYW0gd2FzIGdpdmVuLgorKworKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW9zdHJlYW0gd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7d2l0aF9pb3N0cmVhbStzZXR9IiA9IHNldDsgdGhlbgorLSAgd2l0aHZhbD0iJHdpdGhfaW9zdHJlYW0iCistICBjYXNlICIke3dpdGh2YWx9IiBpbgorKyAgd2l0aHZhbD0kd2l0aF9pb3N0cmVhbTsgY2FzZSAiJHt3aXRodmFsfSIgaW4KKyAJCW5vbmUpIHN0cmVhbXM9bm9uZSA7OworIAkJb2xkKSBzdHJlYW1zPTE5ODUwNiA7OworIAkJc3RkKSBzdHJlYW1zPTE5OTcxMSA7OworIAkJYXV0bykgc3RyZWFtcz0gOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIC0td2l0aC1pb3N0cmVhbSIgMT4mMjsgZXhpdCAxOyB9IDs7CisrCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIC0td2l0aC1pb3N0cmVhbSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtaW9zdHJlYW0iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgc3RyZWFtcz0KK0BAIC0yNDIxLDEzICs1NzU3LDEyIEBACisgVV9JT1NUUkVBTV9TT1VSQ0U9MAorIGlmIHRlc3QgeCRzdHJlYW1zICE9IHhub25lCisgdGhlbgorLSAgICAKKy0gICAgYWNfZXh0PUMKKy0jIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKysKKysgICAgYWNfZXh0PWNwcAorIGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKy1hY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jeHhfY3Jvc3MKKythY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKyAKKyAgICAgT0xEX0NYWEZMQUdTPSIke0NYWEZMQUdTfSIKKyAgICAgY2FzZSAiJHtpY3VfY3ZfaG9zdF9mcmFnfSIgaW4KK0BAIC0yNDM1LDEzOSArNTc3MCw0ODEgQEAKKyAgICAgICAgICAgICBDWFhGTEFHUz0iJHtDWFhGTEFHU30gLUFBIgorICAgICAgICAgOzsKKyAgICAgZXNhYworLSAgICBlY2hvICRhY19uICJjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNDQwOiBjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkiID4mNQorLSAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjQ0MiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaW9zdHJlYW0gdXNhYmlsaXR5IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KKysKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxpb3N0cmVhbT4KKy1pbnQgbWFpbigpIHsKKytpbnQKKyttYWluICgpCisreworIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICAgYWNfY3ZfaGVhZGVyX2lvc3RyZWFtPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2hlYWRlcl9pb3N0cmVhbT1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9oZWFkZXJfaW9zdHJlYW09bm8KKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICBpZiB0ZXN0ICRpY3VfY3ZfaG9zdF9mcmFnID0gbWgtY3lnd2luLW1zdmMKKyAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNfY3ZfaGVhZGVyX2lvc3RyZWFtPXllcworICAgICBmaQorLSAgICBlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSIgMT4mNgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSIgPiY2OyB9CisgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSA9IHllcworICAgICB0aGVuCisgICAgICAgICBVX0lPU1RSRUFNX1NPVVJDRT0xOTk3MTEKKyAgICAgZWxzZQorICAgICAgICAgQ1hYRkxBR1M9IiR7T0xEX0NYWEZMQUdTfSIKKy0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNDcwOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKKysgICAgICAgIGFjX2V4dD1jcHAKKythY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CisgaWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DWFhDUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFhDUFArc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgYWNfZXh0PUMKKy0jIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKy1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworLWFjX2NvbXBpbGU9JyR7Q1hYLWcrK30gLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCistICBDWFhDUFA9IiR7Q1hYLWcrK30gLUUiCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjQ4MyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzdGRsaWIuaD4KKy1FT0YKKy1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKy1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCistaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKysgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKysgICAgZm9yIENYWENQUCBpbiAiJENYWCAtRSIgIi9saWIvY3BwIgorKyAgICBkbworKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKKytmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisrICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgQ1hYQ1BQPS9saWIvY3BwCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCisrY29udGludWUKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfcHJvZ19DWFhDUFA9IiRDWFhDUFAiCistYWNfZXh0PUMKKy0jIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKy1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworLWFjX2NvbXBpbGU9JyR7Q1hYLWcrK30gLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCistZmkKKy1maQorLUNYWENQUD0iJGFjX2N2X3Byb2dfQ1hYQ1BQIgorLWVjaG8gIiRhY190IiIkQ1hYQ1BQIiAxPiY2CistCistYWNfc2FmZT1gZWNobyAiaW9zdHJlYW0uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmgiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNTE0OiBjaGVja2luZyBmb3IgaW9zdHJlYW0uaCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNTE5ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPGlvc3RyZWFtLmg+CistRU9GCistYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKy17IChldmFsIGVjaG8gY29uZmlndXJlOjI1MjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CistYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorLWVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorKworK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisrCisrICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CisrX0FDRU9GCisraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH07IHRoZW4KKysgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCisrY29udGludWUKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrICAjIFBhc3NlcyBib3RoIHRlc3RzLgorK2FjX3ByZXByb2Nfb2s9OgorK2JyZWFrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorKworK2RvbmUKKysjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisrICBicmVhaworK2ZpCisrCisrICAgIGRvbmUKKysgICAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorKworK2ZpCisrICBDWFhDUFA9JGFjX2N2X3Byb2dfQ1hYQ1BQCisrZWxzZQorKyAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWENQUCIgPiY1CisrJGFzX2VjaG8gIiRDWFhDUFAiID4mNjsgfQorK2FjX3ByZXByb2Nfb2s9ZmFsc2UKKytmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisrICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgOgorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KKytjb250aW51ZQorK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKysgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisrICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KKytjb250aW51ZQorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgICMgUGFzc2VzIGJvdGggdGVzdHMuCisrYWNfcHJlcHJvY19vaz06CisrYnJlYWsKKyBmaQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKytkb25lCisrIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKytpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY190IiJubyIgMT4mNgorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDKysgcHJlcHJvY2Vzc29yIFwiJENYWENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorK2ZpCisrCisrYWNfZXh0PWNwcAorK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCisrYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCisrYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisrCisrCisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfaW9zdHJlYW1faCtzZXR9IiA9IHNldDsgdGhlbgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW9zdHJlYW0uaC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2grc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNQorKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNjsgfQorK2Vsc2UKKysgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHVzYWJpbGl0eSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgaW9zdHJlYW0uaCB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisrI2luY2x1ZGUgPGlvc3RyZWFtLmg+CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2hlYWRlcl9jb21waWxlcj1ubworK2ZpCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CisrJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorKworKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHByZXNlbmNlIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBpb3N0cmVhbS5oIHByZXNlbmNlLi4uICIgPiY2OyB9CisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8aW9zdHJlYW0uaD4KKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KKytmaQorKworK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyskYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKysKKysjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KKytjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4KKysgIHllczpubzogKQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW9zdHJlYW0uaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisrICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworKyAgICA7OworKyAgbm86eWVzOiogKQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisrCisrICAgIDs7CisrZXNhYworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW9zdHJlYW0uaCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmguLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9pb3N0cmVhbV9oK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oPSRhY19oZWFkZXJfcHJlcHJvYworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oIiA+JjY7IH0KKysKKyBmaQorIAorKworICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2ggPSB5ZXM7IHRoZW4KKy0gICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG9zdHJlYW0gaXMgcmVhbGx5IGRlZmluZWQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNTQ3OiBjaGVja2luZyB3aGV0aGVyIG9zdHJlYW0gaXMgcmVhbGx5IGRlZmluZWQiID4mNQorLSAgICAgICAgICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9pb3N0cmVhbV9vaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNTUyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBvc3RyZWFtIGlzIHJlYWxseSBkZWZpbmVkLi4uICIgPiY2OyB9CisrICAgICAgICAgICAgaWYgdGVzdCAiJHthY19jdl9pb3N0cmVhbV9vaytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxpb3N0cmVhbS5oPgorLWludCBtYWluKCkgeworK2ludAorK21haW4gKCkKKyt7Cisgb3N0cmVhbSAmdGVzdG91dCA9IGNvdXQ7IHRlc3RvdXQgPDwgInRlc3QiIDw8IGVuZGw7CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X2lvc3RyZWFtX29rPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2lvc3RyZWFtX29rPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2lvc3RyZWFtX29rPW5vCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorIAorLSAgICAgICAgICAgIGVjaG8gIiRhY190IiIkYWNfY3ZfaW9zdHJlYW1fb2siIDE+JjYKKysgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaW9zdHJlYW1fb2siID4mNQorKyRhc19lY2hvICIkYWNfY3ZfaW9zdHJlYW1fb2siID4mNjsgfQorICAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2lvc3RyZWFtX29rID0geWVzCisgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICBVX0lPU1RSRUFNX1NPVVJDRT0xOTg1MDYKK0BAIC0yNTg3LDEwOCArNjI2NCw0MjUgQEAKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICBlc2FjCisgICAgICAgICBlbHNlCistICAgICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiIDE+JjI7IGV4aXQgMTsgfQorKyAgICAgICAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgICAgICBmaQorICAgICBmaQorIGZpCisgCisgYWNfZXh0PWMKKy0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCisgYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKysKKyAKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjYwNTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9jX2JpZ2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCistIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjYxMiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgICAjIFNlZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB1bml2ZXJzYWwgY29tcGlsZXIuCisrICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2lmbmRlZiBfX0FQUExFX0NDX18KKysJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisrCSAgICAgI2VuZGlmCisrCSAgICAgdHlwZWRlZiBpbnQgZHVtbXk7CisrCisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrCisrCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCisrCSMgdGhlcmUgYXJlIHNvbWUgLWFyY2ggZmxhZ3MuICBOb3RlIHRoYXQgKnBwYyogYWxzbyBtYXRjaGVzCisrCSMgcHBjNjQuICBUaGlzIGNoZWNrIGlzIGFsc28gcmF0aGVyIGxlc3MgdGhhbiBpZGVhbC4KKysJY2FzZSAiJHtDQ30gJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30iIGluICAjKAorKwkgICotYXJjaCpwcGMqfCotYXJjaCppMzg2KnwqLWFyY2gqeDg2XzY0KikgYWNfY3ZfY19iaWdlbmRpYW49dW5pdmVyc2FsOzsKKysJZXNhYworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysKKytmaQorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKysgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKy1pbnQgbWFpbigpIHsKKysJICAgICAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgCistI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCistIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKy0jZW5kaWYKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjIzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisraW50CisrbWFpbiAoKQorK3sKKysjaWYgISAoZGVmaW5lZCBCWVRFX09SREVSICYmIGRlZmluZWQgQklHX0VORElBTiBcCisrCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAorKwkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQorKwkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCisrCSAgICAgI2VuZGlmCisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNjI3ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+CistaW50IG1haW4oKSB7CisrCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgCisraW50CisrbWFpbiAoKQorK3sKKyAjaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCistIG5vdCBiaWcgZW5kaWFuCistI2VuZGlmCistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYzODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKwkJIG5vdCBiaWcgZW5kaWFuCisrCQkjZW5kaWYKKysKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKy1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmciIDE+JjI7IGV4aXQgMTsgfQorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNjU4ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistbWFpbiAoKSB7CistICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCistICB1bmlvbgorLSAgeworLSAgICBsb25nIGw7CistICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKKy0gIH0gdTsKKy0gIHUubCA9IDE7CistICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOworKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorKyAgICBmaQorKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKysgICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgorKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2luY2x1ZGUgPGxpbWl0cy5oPgorKworK2ludAorK21haW4gKCkKKyt7CisrI2lmICEgKGRlZmluZWQgX0xJVFRMRV9FTkRJQU4gfHwgZGVmaW5lZCBfQklHX0VORElBTikKKysJICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcworKwkgICAgICNlbmRpZgorKworKyAgOworKyAgcmV0dXJuIDA7CisgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorLXRoZW4KKy0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLWZyIGNvbmZ0ZXN0KgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxsaW1pdHMuaD4KKysKKytpbnQKKyttYWluICgpCisreworKyNpZm5kZWYgX0JJR19FTkRJQU4KKysJCSBub3QgYmlnIGVuZGlhbgorKwkJI2VuZGlmCisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZnIgY29uZnRlc3QqCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrICAgIGZpCisrICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorKyAgICAgICMgQ29tcGlsZSBhIHRlc3QgcHJvZ3JhbS4KKysgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorKyAgIyBUcnkgdG8gZ3Vlc3MgYnkgZ3JlcHBpbmcgdmFsdWVzIGZyb20gYW4gb2JqZWN0IGZpbGUuCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworK3Nob3J0IGludCBhc2NpaV9tbVtdID0KKysJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisrCQlzaG9ydCBpbnQgYXNjaWlfaWlbXSA9CisrCQkgIHsgMHg2OTRDLCAweDU0NTQsIDB4NjU2QywgMHg2RTQ1LCAweDY5NDQsIDB4NkU2MSwgMCB9OworKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKysJCSAgcmV0dXJuIGFzY2lpX21tW2ldICsgYXNjaWlfaWlbaV07CisrCQl9CisrCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorKwkJICB7IDB4ODlEMywgMHhFM0UzLCAweDg1OTMsIDB4OTVDNSwgMHg4OUM0LCAweDk1ODEsIDAgfTsKKysJCXNob3J0IGludCBlYmNkaWNfbW1bXSA9CisrCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworKwkJaW50IHVzZV9lYmNkaWMgKGludCBpKSB7CisrCQkgIHJldHVybiBlYmNkaWNfbW1baV0gKyBlYmNkaWNfaWlbaV07CisrCQl9CisrCQlleHRlcm4gaW50IGZvbzsKKysKKytpbnQKKyttYWluICgpCisreworK3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGlmIGdyZXAgQklHZW5EaWFuU3lTIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbDsgdGhlbgorKwkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKysJICAgIGZpCisrCSAgICBpZiBncmVwIExpVFRsZUVuRGlhbiBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGwgOyB0aGVuCisrCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCisrCQlhY19jdl9jX2JpZ2VuZGlhbj1ubworKwkgICAgICBlbHNlCisrCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KKysJCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKysJICAgICAgZmkKKysJICAgIGZpCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworIGZpCisgCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisrCisrCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworKwkgICAgIHVuaW9uCisrCSAgICAgeworKwkgICAgICAgbG9uZyBpbnQgbDsKKysJICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07CisrCSAgICAgfSB1OworKwkgICAgIHUubCA9IDE7CisrCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7CisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorKyAgYWNfc3RhdHVzPSQ/CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfdHJ5IikgMj4mNQorKyAgYWNfc3RhdHVzPSQ/CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKysgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKythY19jdl9jX2JpZ2VuZGlhbj15ZXMKKyBmaQorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorLSNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKy1FT0YKKyAKKysgICAgZmkKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9jX2JpZ2VuZGlhbiIgPiY2OyB9CisrIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCisrICAgeWVzKQorKyAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKysjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisrX0FDRU9GCisrOzsgIygKKysgICBubykKKysgICAgICA7OyAjKAorKyAgIHVuaXZlcnNhbCkKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorKyNkZWZpbmUgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEIDEKKytfQUNFT0YKKysKKysgICAgIDs7ICMoCisrICAgKikKKysgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1bmtub3duIGVuZGlhbm5lc3MKKysgcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiB1bmtub3duIGVuZGlhbm5lc3MKKysgcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisrIGVzYWMKKyAKKyBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IG5vOyB0aGVuCisgVV9JU19CSUdfRU5ESUFOPTAKK0BAIC0yNzAxLDg0ICs2Njk1LDE1NyBAQAorIAorIFVfSEFWRV9OTF9MQU5HSU5GT19DT0RFU0VUPTAKKyBVX05MX0xBTkdJTkZPX0NPREVTRVQ9LTEKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8iIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNzA2OiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8iID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX25sX2xhbmdpbmZvJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDI3MTEgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8uLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfbmxfbGFuZ2luZm8rc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysvKiBEZWZpbmUgbmxfbGFuZ2luZm8gdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBubF9sYW5naW5mby4KKysgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKysjZGVmaW5lIG5sX2xhbmdpbmZvIGlubm9jdW91c19ubF9sYW5naW5mbworKworIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKy0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBubF9sYW5naW5mbygpOyBiZWxvdy4gICovCistI2luY2x1ZGUgPGFzc2VydC5oPgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgbmxfbGFuZ2luZm8oKTsKKysgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBubF9sYW5naW5mbyAoKTsgYmVsb3cuCisrICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKysgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKyAKKy1pbnQgbWFpbigpIHsKKysjaWZkZWYgX19TVERDX18KKysjIGluY2x1ZGUgPGxpbWl0cy5oPgorKyNlbHNlCisrIyBpbmNsdWRlIDxhc3NlcnQuaD4KKysjZW5kaWYKKyAKKysjdW5kZWYgbmxfbGFuZ2luZm8KKysKKysvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKysgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKysgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworKyNpZmRlZiBfX2NwbHVzcGx1cworK2V4dGVybiAiQyIKKysjZW5kaWYKKytjaGFyIG5sX2xhbmdpbmZvICgpOworIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCistI2lmIGRlZmluZWQgKF9fc3R1Yl9ubF9sYW5naW5mbykgfHwgZGVmaW5lZCAoX19zdHViX19fbmxfbGFuZ2luZm8pCisrI2lmIGRlZmluZWQgX19zdHViX25sX2xhbmdpbmZvIHx8IGRlZmluZWQgX19zdHViX19fbmxfbGFuZ2luZm8KKyBjaG9rZSBtZQorLSNlbHNlCistbmxfbGFuZ2luZm8oKTsKKyAjZW5kaWYKKyAKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89bm8iCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1maQorLQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ25sX2xhbmdpbmZvYFwiID0geWVzIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorK2ludAorK21haW4gKCkKKyt7CisrcmV0dXJuIG5sX2xhbmdpbmZvICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3ZfZnVuY19ubF9sYW5naW5mbz15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89bm8KKytmaQorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfbmxfbGFuZ2luZm8iID4mNQorKyRhc19lY2hvICIkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl9mdW5jX25sX2xhbmdpbmZvIiA9IHgiInllczsgdGhlbgorICAgVV9IQVZFX05MX0xBTkdJTkZPPTEKKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy1VX0hBVkVfTkxfTEFOR0lORk89MAorKyAgVV9IQVZFX05MX0xBTkdJTkZPPTAKKyBmaQorIAorIAorIGlmIHRlc3QgJFVfSEFWRV9OTF9MQU5HSU5GTyAtZXEgMTsgdGhlbgorLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvJ3MgYXJndW1lbnQgdG8gb2J0YWluIHRoZSBjb2Rlc2V0IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6Mjc1NzogY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvJ3MgYXJndW1lbnQgdG8gb2J0YWluIHRoZSBjb2Rlc2V0IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBubF9sYW5naW5mbydzIGFyZ3VtZW50IHRvIG9idGFpbiB0aGUgY29kZXNldCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvJ3MgYXJndW1lbnQgdG8gb2J0YWluIHRoZSBjb2Rlc2V0Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKyAgIGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQ9InVua25vd24iCisgICBmb3IgYSBpbiBDT0RFU0VUIF9OTF9DVFlQRV9DT0RFU0VUX05BTUU7IGRvCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjc2NCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8bGFuZ2luZm8uaD4KKy1pbnQgbWFpbigpIHsKKytpbnQKKyttYWluICgpCisreworIG5sX2xhbmdpbmZvKCRhKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQ9IiRhIjsgYnJlYWsKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGRvbmUKKyBmaQorLQorLWVjaG8gIiRhY190IiIkYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQiID4mNjsgfQorICAgaWYgdGVzdCB4JGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQgIT0geHVua25vd24KKyAgIHRoZW4KKyAgICAgICBVX0hBVkVfTkxfTEFOR0lORk9fQ09ERVNFVD0xCitAQCAtMjc4OCw0MiArNjg1NSw3MSBAQAorIAorIAorIAorLWFjX2V4dD1DCistIyBDWFhGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCisrYWNfZXh0PWNwcAorIGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKy1hY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jeHhfY3Jvc3MKKy0KKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyODAwOiBjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9uYW1lc3BhY2Vfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjgwNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBuYW1lc3BhY2Ugc3VwcG9ydC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfbmFtZXNwYWNlX29rK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgIG5hbWVzcGFjZSB4X3ZlcnNpb24ge3ZvaWQgZigpe319OworICAgICBuYW1lc3BhY2UgeCA9IHhfdmVyc2lvbjsKKyAgICAgdXNpbmcgbmFtZXNwYWNlIHhfdmVyc2lvbjsKKy0gICAgCistaW50IG1haW4oKSB7CisrCisraW50CisrbWFpbiAoKQorK3sKKyAgICAgZigpOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl9uYW1lc3BhY2Vfb2s9eWVzCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfbmFtZXNwYWNlX29rPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X25hbWVzcGFjZV9vaz1ubworIGZpCistcm0gLWYgY29uZnRlc3QqIAorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9uYW1lc3BhY2Vfb2siIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbmFtZXNwYWNlX29rIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X25hbWVzcGFjZV9vayIgPiY2OyB9CisgVV9IQVZFX05BTUVTUEFDRT0xCisgaWYgdGVzdCAkYWNfY3ZfbmFtZXNwYWNlX29rID0gbm8KKyB0aGVuCitAQCAtMjgzMSwxNiArNjkyNywxOSBAQAorIGZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByb3Blcmx5IG92ZXJyaWRpbmcgbmV3IGFuZCBkZWxldGUiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyODM2OiBjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZSIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcm9wZXJseSBvdmVycmlkaW5nIG5ldyBhbmQgZGVsZXRlIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZS4uLiAiID4mNjsgfQorIFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT049MAorIFVfSEFWRV9QTEFDRU1FTlRfTkVXPTAKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKytpZiB0ZXN0ICIke2FjX2N2X292ZXJyaWRlX2N4eF9hbGxvY2F0aW9uX29rK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyODQzICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgIGNsYXNzIFVPYmplY3QgeworICAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpIHtyZXR1cm4gbWFsbG9jKHNpemUpO30KK0BAIC0yODQ4LDM1ICs2OTQ3LDY1IEBACisgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnApIHtmcmVlKHApO30KKyAgICAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwKSB7ZnJlZShwKTt9CisgICAgIH07CistICAgIAorLWludCBtYWluKCkgeworLSAgICAKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworIGZpCistcm0gLWYgY29uZnRlc3QqIAorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgPiY2OyB9CisgaWYgdGVzdCAkYWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2sgPSB5ZXMKKyB0aGVuCisgICAgIFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT049MQorLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcGxhY2VtZW50IG5ldyBhbmQgZGVsZXRlIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6Mjg3NDogY2hlY2tpbmcgZm9yIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSIgPiY1CistICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDI4NzkgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUuLi4gIiA+JjY7IH0KKysgICAgaWYgdGVzdCAiJHthY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICBjbGFzcyBVT2JqZWN0IHsKKyAgICAgICAgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSkge3JldHVybiBtYWxsb2Moc2l6ZSk7fQorQEAgLTI4ODYsMjQgKzcwMTUsNTEgQEAKKyAgICAgICAgIHZvaWQgKiBvcGVyYXRvciBuZXcoc2l6ZV90LCB2b2lkICpwdHIpIHsgcmV0dXJuIHB0cjsgfQorICAgICAgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCB2b2lkICopIHt9CisgICAgICAgICB9OworLSAgICAgICAgCistaW50IG1haW4oKSB7CistICAgICAgICAKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2s9bm8KKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vaz1ubworIGZpCistcm0gLWYgY29uZnRlc3QqIAorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistICAgIGVjaG8gIiRhY190IiIkYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vayIgMT4mNgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vayIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rIiA+JjY7IH0KKyAgICAgaWYgdGVzdCAkYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vayA9IHllcworICAgICB0aGVuCisgICAgICAgICBVX0hBVkVfUExBQ0VNRU5UX05FVz0xCitAQCAtMjkxMyw1OSArNzA2OSw5NiBAQAorIAorIAorIGFjX2V4dD1jCistIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorIGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKy0KKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgcG9wZW4iIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyOTI0OiBjaGVja2luZyBmb3IgcG9wZW4iID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3BvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDI5MjkgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwb3BlbiIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBvcGVuLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9mdW5jX3BvcGVuK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrLyogRGVmaW5lIHBvcGVuIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcG9wZW4uCisrICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisrI2RlZmluZSBwb3BlbiBpbm5vY3VvdXNfcG9wZW4KKysKKyAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCistICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcG9wZW4oKTsgYmVsb3cuICAqLworLSNpbmNsdWRlIDxhc3NlcnQuaD4KKy0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKy0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKy1jaGFyIHBvcGVuKCk7CisrICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcG9wZW4gKCk7IGJlbG93LgorKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisrICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisrCisrI2lmZGVmIF9fU1REQ19fCisrIyBpbmNsdWRlIDxsaW1pdHMuaD4KKysjZWxzZQorKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisrI2VuZGlmCisgCistaW50IG1haW4oKSB7CisrI3VuZGVmIHBvcGVuCisgCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBwb3BlbiAoKTsKKyAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworLSNpZiBkZWZpbmVkIChfX3N0dWJfcG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3BvcGVuKQorKyNpZiBkZWZpbmVkIF9fc3R1Yl9wb3BlbiB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BvcGVuCisgY2hva2UgbWUKKy0jZWxzZQorLXBvcGVuKCk7CisgI2VuZGlmCisgCistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9mdW5jX3BvcGVuPXllcyIKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9mdW5jX3BvcGVuPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistZmkKKy0KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydwb3BlbmBcIiA9IHllcyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKy0gIDoKKy1lbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBwb3BlbiAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2Z1bmNfcG9wZW49eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX3BvcGVuPW5vCisrZmkKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3BvcGVuIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2Z1bmNfcG9wZW4iID4mNjsgfQorIAorIGlmIHRlc3QgeCRhY19jdl9mdW5jX3BvcGVuID0geHllcworIHRoZW4KK0BAIC0yOTc1LDEwNSArNzE2OCwxODEgQEAKKyBmaQorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0enNldCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjI5ODA6IGNoZWNraW5nIGZvciB0enNldCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjk4NSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdHpzZXQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB0enNldC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY190enNldCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKy8qIERlZmluZSB0enNldCB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIHR6c2V0LgorKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworKyNkZWZpbmUgdHpzZXQgaW5ub2N1b3VzX3R6c2V0CisrCisgLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHR6c2V0KCk7IGJlbG93LiAgKi8KKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciB0enNldCgpOworKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHR6c2V0ICgpOyBiZWxvdy4KKysgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworIAorLWludCBtYWluKCkgeworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorIAorKyN1bmRlZiB0enNldAorKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgdHpzZXQgKCk7CisgLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKy0jaWYgZGVmaW5lZCAoX19zdHViX3R6c2V0KSB8fCBkZWZpbmVkIChfX3N0dWJfX190enNldCkKKysjaWYgZGVmaW5lZCBfX3N0dWJfdHpzZXQgfHwgZGVmaW5lZCBfX3N0dWJfX190enNldAorIGNob2tlIG1lCistI2Vsc2UKKy10enNldCgpOworICNlbmRpZgorIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY190enNldD15ZXMiCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY190enNldD1ubyIKKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorLWZpCistCistaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ndHpzZXRgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gdHpzZXQgKCk7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisrICBhY19jdl9mdW5jX3R6c2V0PXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfZnVuY190enNldD1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY190enNldCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9mdW5jX3R6c2V0IiA+JjY7IH0KKyAKKyBpZiB0ZXN0IHgkYWNfY3ZfZnVuY190enNldCA9IHh5ZXMKKyB0aGVuCisgICAgIFVfVFpTRVQ9dHpzZXQKKyBlbHNlCistICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfdHpzZXQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMDMyOiBjaGVja2luZyBmb3IgX3R6c2V0IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19fdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzAzNyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF90enNldCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90enNldC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19fdHpzZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysvKiBEZWZpbmUgX3R6c2V0IHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgX3R6c2V0LgorKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworKyNkZWZpbmUgX3R6c2V0IGlubm9jdW91c19fdHpzZXQKKysKKyAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCistICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgX3R6c2V0KCk7IGJlbG93LiAgKi8KKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBfdHpzZXQoKTsKKysgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBfdHpzZXQgKCk7IGJlbG93LgorKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisrICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisrCisrI2lmZGVmIF9fU1REQ19fCisrIyBpbmNsdWRlIDxsaW1pdHMuaD4KKysjZWxzZQorKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisrI2VuZGlmCisgCistaW50IG1haW4oKSB7CisrI3VuZGVmIF90enNldAorIAorKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgX3R6c2V0ICgpOworIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCistI2lmIGRlZmluZWQgKF9fc3R1Yl9fdHpzZXQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX190enNldCkKKysjaWYgZGVmaW5lZCBfX3N0dWJfX3R6c2V0IHx8IGRlZmluZWQgX19zdHViX19fX3R6c2V0CisgY2hva2UgbWUKKy0jZWxzZQorLV90enNldCgpOworICNlbmRpZgorIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY19fdHpzZXQ9eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfX3R6c2V0PW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistZmkKKy0KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydfdHpzZXRgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gX3R6c2V0ICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3ZfZnVuY19fdHpzZXQ9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX190enNldD1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19fdHpzZXQiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfZnVuY19fdHpzZXQiID4mNjsgfQorIAorICAgICBpZiB0ZXN0IHgkYWNfY3ZfZnVuY19fdHpzZXQgPSB4eWVzCisgICAgIHRoZW4KK0BAIC0zMDgxLDE0ICs3MzUwLDE3IEBACisgICAgIGZpCisgZmkKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdHpuYW1lIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzA4NjogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl90em5hbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzA5MSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdHpuYW1lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgdHpuYW1lLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl92YXJfdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2lmbmRlZiBfX1VTRV9QT1NJWAorICNkZWZpbmUgX19VU0VfUE9TSVgKKyAjZW5kaWYKK0BAIC0zMDk2LDY4ICs3MzY4LDEyNiBAQAorICNpZm5kZWYgdHpuYW1lIC8qIEZvciBTR0kuICAqLworIGV4dGVybiBjaGFyICp0em5hbWVbXTsgLyogUlM2MDAwIGFuZCBvdGhlcnMgcmVqZWN0IGNoYXIgKip0em5hbWUuICAqLworICNlbmRpZgorLWludCBtYWluKCkgeworK2ludAorK21haW4gKCkKKyt7CisgYXRvaSgqdHpuYW1lKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X3Zhcl90em5hbWU9eWVzCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfdmFyX3R6bmFtZT1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3Zhcl90em5hbWU9bm8KKyBmaQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfdmFyX3R6bmFtZSIgMT4mNgorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Zhcl90em5hbWUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdmFyX3R6bmFtZSIgPiY2OyB9CisgaWYgdGVzdCAkYWNfY3ZfdmFyX3R6bmFtZSA9IHllczsgdGhlbgorICAgVV9UWk5BTUU9dHpuYW1lCisgZWxzZQorLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF90em5hbWUiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMTIxOiBjaGVja2luZyBmb3IgX3R6bmFtZSIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl9fdHpuYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDMxMjYgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3R6bmFtZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90em5hbWUuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Zhcl9fdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAjaW5jbHVkZSA8dGltZS5oPgorICAgZXh0ZXJuIGNoYXIgKl90em5hbWVbXTsKKy0gIAorLWludCBtYWluKCkgeworKworK2ludAorK21haW4gKCkKKyt7CisgICBhdG9pKCpfdHpuYW1lKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X3Zhcl9fdHpuYW1lPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3Zhcl9fdHpuYW1lPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfdmFyX190em5hbWU9bm8KKyBmaQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfdmFyX190em5hbWUiIDE+JjYKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX3R6bmFtZSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl92YXJfX3R6bmFtZSIgPiY2OyB9CisgICAgIGlmIHRlc3QgJGFjX2N2X3Zhcl9fdHpuYW1lID0geWVzOyB0aGVuCisgICAgICAgVV9UWk5BTUU9X3R6bmFtZQorICAgICBmaQorIGZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRpbWV6b25lIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzE1NTogY2hlY2tpbmcgZm9yIHRpbWV6b25lIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX3RpbWV6b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDMxNjAgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRpbWV6b25lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgdGltZXpvbmUuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Zhcl90aW1lem9uZStzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpZm5kZWYgX19VU0VfUE9TSVgKKyAjZGVmaW5lIF9fVVNFX1BPU0lYCisgI2VuZGlmCitAQCAtMzE2Niw4NiArNzQ5NiwxNzAgQEAKKyAjZW5kaWYKKyAjaW5jbHVkZSA8dGltZS5oPgorIAorLWludCBtYWluKCkgeworK2ludAorK21haW4gKCkKKyt7CisgdGltZXpvbmUgPSAxOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorICAgYWNfY3ZfdmFyX3RpbWV6b25lPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3Zhcl90aW1lem9uZT1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3Zhcl90aW1lem9uZT1ubworIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl92YXJfdGltZXpvbmUiIDE+JjYKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfdGltZXpvbmUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdmFyX3RpbWV6b25lIiA+JjY7IH0KKyBVX0hBVkVfVElNRVpPTkU9MAorIGlmIHRlc3QgJGFjX2N2X3Zhcl90aW1lem9uZSA9IHllczsgdGhlbgorICAgVV9USU1FWk9ORT10aW1lem9uZQorICAgVV9IQVZFX1RJTUVaT05FPTEKKyBlbHNlCistICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgX190aW1lem9uZSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjMxOTM6IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX19fdGltZXpvbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzE5OCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgX190aW1lem9uZS4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdmFyX19fdGltZXpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAgICNpbmNsdWRlIDx0aW1lLmg+CistICAKKy1pbnQgbWFpbigpIHsKKysKKytpbnQKKyttYWluICgpCisreworICAgX190aW1lem9uZSA9IDE7CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl92YXJfX190aW1lem9uZT15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl92YXJfX190aW1lem9uZT1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3Zhcl9fX3RpbWV6b25lPW5vCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl9fX3RpbWV6b25lIiAxPiY2Cisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX19fdGltZXpvbmUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdmFyX19fdGltZXpvbmUiID4mNjsgfQorICAgaWYgdGVzdCAkYWNfY3ZfdmFyX19fdGltZXpvbmUgPSB5ZXM7IHRoZW4KKyAgICAgVV9USU1FWk9ORT1fX3RpbWV6b25lCisgICAgIFVfSEFWRV9USU1FWk9ORT0xCisgICBlbHNlCistICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfdGltZXpvbmUiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMjI0OiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX190aW1lem9uZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzMjI5ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgX3RpbWV6b25lLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl92YXJfX3RpbWV6b25lK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgICNpbmNsdWRlIDx0aW1lLmg+CistICAgIAorLWludCBtYWluKCkgeworKworK2ludAorK21haW4gKCkKKyt7CisgICAgIF90aW1lem9uZSA9IDE7CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIzNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl92YXJfX3RpbWV6b25lPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3Zhcl9fdGltZXpvbmU9bm8KKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl92YXJfX3RpbWV6b25lPW5vCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl9fdGltZXpvbmUiIDE+JjYKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX3RpbWV6b25lIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3Zhcl9fdGltZXpvbmUiID4mNjsgfQorICAgICBpZiB0ZXN0ICRhY19jdl92YXJfX3RpbWV6b25lID0geWVzOyB0aGVuCisgICAgICAgVV9USU1FWk9ORT1fdGltZXpvbmUKKyAgICAgICBVX0hBVkVfVElNRVpPTkU9MQorQEAgLTMyNTUsMzcxICs3NjY5LDgzNSBAQAorIAorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzI2MDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzMjY1ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRhcmcuaD4KKy0jaW5jbHVkZSA8c3RyaW5nLmg+CistI2luY2x1ZGUgPGZsb2F0Lmg+CistRU9GCistYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKy17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CistYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDhfdCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludDhfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9pbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgZWNobyAiJGFjX2VyciIgPiY1CistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9oZWFkZXJfc3RkYz1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCistCistaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKy0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzI5MCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzdHJpbmcuaD4KKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFjX2N2X3R5cGVfaW50OF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoaW50OF90KSkKKysgICAgICAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisraW50CisrbWFpbiAoKQorK3sKKytpZiAoc2l6ZW9mICgoaW50OF90KSkpCisrCSAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICA6CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorIAorKwlhY19jdl90eXBlX2ludDhfdD15ZXMKKyBmaQorIAorLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCistICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCistY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDMzMDggImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistRU9GCistaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorLSAgOgorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyAKKyBmaQorIAorLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCistICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCistaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDhfdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl90eXBlX2ludDhfdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl90eXBlX2ludDhfdCIgPSB4IiJ5ZXM7IHRoZW4KKyAgIDoKKyBlbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzMyOSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxjdHlwZS5oPgorLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCistaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CistZXhpdCAoMCk7IH0KKyAKKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKKy10aGVuCistICA6CistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLWZyIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKy1maQorLXJtIC1mciBjb25mdGVzdCoKKy1maQorK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorK19BQ0VPRgorIAorIGZpCistZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKKy1FT0YKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQ4X3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1aW50OF90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgYWNfY3ZfdHlwZV91aW50OF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAodWludDhfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKHVpbnQ4X3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgCisrCWFjX2N2X3R5cGVfdWludDhfdD15ZXMKKyBmaQorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQ4X3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMzY0OiBjaGVja2luZyBmb3IgaW50OF90IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9pbnQ4X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzM2OSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaWYgU1REQ19IRUFERVJTCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRkZWYuaD4KKy0jZW5kaWYKKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlpbnQ4X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50OF90PXllcworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50OF90PW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAKKy1maQorLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQ4X3QiIDE+JjYKKy1pZiB0ZXN0ICRhY19jdl90eXBlX2ludDhfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0jZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorLUVPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHVpbnQ4X3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMzk3OiBjaGVja2luZyBmb3IgdWludDhfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDhfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNDAyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXVpbnQ4X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfdWludDhfdD15ZXMKKy1lbHNlCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl90eXBlX3VpbnQ4X3Q9bm8KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQ4X3QiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdHlwZV91aW50OF90IiA+JjY7IH0KKytpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDhfdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIDoKKytlbHNlCisgCistZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfdWludDhfdCIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3R5cGVfdWludDhfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisgI2RlZmluZSB1aW50OF90IHVuc2lnbmVkIGNoYXIKKy1FT0YKKytfQUNFT0YKKyAKKyBmaQorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQxNl90IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzQzMDogY2hlY2tpbmcgZm9yIGludDE2X3QiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX2ludDE2X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzQzNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaWYgU1REQ19IRUFERVJTCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRkZWYuaD4KKy0jZW5kaWYKKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlpbnQxNl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl90eXBlX2ludDE2X3Q9eWVzCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQxNl90IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50MTZfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9pbnQxNl90K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKyAgIGFjX2N2X3R5cGVfaW50MTZfdD1ubworK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKGludDE2X3QpKQorKyAgICAgICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKChpbnQxNl90KSkpCisrCSAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICA6CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl90eXBlX2ludDE2X3Q9eWVzCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisgCisgZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfaW50MTZfdCIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3R5cGVfaW50MTZfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDE2X3QiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdHlwZV9pbnQxNl90IiA+JjY7IH0KKytpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50MTZfdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIDoKKytlbHNlCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorICNkZWZpbmUgaW50MTZfdCBzaWduZWQgc2hvcnQKKy1FT0YKKytfQUNFT0YKKyAKKyBmaQorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50MTZfdCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjM0NjM6IGNoZWNraW5nIGZvciB1aW50MTZfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDE2X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzQ2OCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaWYgU1REQ19IRUFERVJTCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRkZWYuaD4KKy0jZW5kaWYKKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50MTZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfdHlwZV91aW50MTZfdD15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQxNl90IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludDE2X3QuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3R5cGVfdWludDE2X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgYWNfY3ZfdHlwZV91aW50MTZfdD1ubworK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKHVpbnQxNl90KSkKKysgICAgICAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisraW50CisrbWFpbiAoKQorK3sKKytpZiAoc2l6ZW9mICgodWludDE2X3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3R5cGVfdWludDE2X3Q9eWVzCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisgCisgZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfdWludDE2X3QiIDE+JjYKKy1pZiB0ZXN0ICRhY19jdl90eXBlX3VpbnQxNl90ID0gbm87IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdWludDE2X3QiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdHlwZV91aW50MTZfdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQxNl90IiA9IHgiInllczsgdGhlbgorKyAgOgorK2Vsc2UKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisgI2RlZmluZSB1aW50MTZfdCB1bnNpZ25lZCBzaG9ydAorLUVPRgorK19BQ0VPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGludDMyX3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNDk2OiBjaGVja2luZyBmb3IgaW50MzJfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfaW50MzJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNTAxICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKWludDMyX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50MzJfdD15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDMyX3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQzMl90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgYWNfY3ZfdHlwZV9pbnQzMl90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoaW50MzJfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKGludDMyX3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3R5cGVfaW50MzJfdD15ZXMKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyAKKyBmaQorLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQzMl90IiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQzMl90ID0gbm87IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MzJfdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl90eXBlX2ludDMyX3QiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQzMl90IiA9IHgiInllczsgdGhlbgorKyAgOgorK2Vsc2UKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisgI2RlZmluZSBpbnQzMl90IHNpZ25lZCBsb25nCistRU9GCisrX0FDRU9GCisgCisgZmkKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdWludDMyX3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNTI5OiBjaGVja2luZyBmb3IgdWludDMyX3QiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3VpbnQzMl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDM1MzQgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CistI2lmIFNURENfSEVBREVSUworLSNpbmNsdWRlIDxzdGRsaWIuaD4KKy0jaW5jbHVkZSA8c3RkZGVmLmg+CistI2VuZGlmCistRU9GCistaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pdWludDMyX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfdWludDMyX3Q9eWVzCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1aW50MzJfdCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQzMl90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQzMl90K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKyAgIGFjX2N2X3R5cGVfdWludDMyX3Q9bm8KKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisraW50CisrbWFpbiAoKQorK3sKKytpZiAoc2l6ZW9mICh1aW50MzJfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKHVpbnQzMl90KSkpCisrCSAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICA6CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl90eXBlX3VpbnQzMl90PXllcworIGZpCistcm0gLWYgY29uZnRlc3QqCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworIAorIGZpCistZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3VpbnQzMl90IiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfdHlwZV91aW50MzJfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQzMl90IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3R5cGVfdWludDMyX3QiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIDoKKytlbHNlCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorICNkZWZpbmUgdWludDMyX3QgdW5zaWduZWQgbG9uZworLUVPRgorK19BQ0VPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGludDY0X3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNTYyOiBjaGVja2luZyBmb3IgaW50NjRfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfaW50NjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNTY3ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKWludDY0X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50NjRfdD15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDY0X3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQ2NF90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDY0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgYWNfY3ZfdHlwZV9pbnQ2NF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoaW50NjRfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKGludDY0X3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3R5cGVfaW50NjRfdD15ZXMKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorIAorLWZpCistZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX2ludDY0X3QiIDE+JjYKKy1pZiB0ZXN0ICRhY19jdl90eXBlX2ludDY0X3QgPSBubzsgdGhlbgorLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworK2ZpCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9pbnQ2NF90IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3R5cGVfaW50NjRfdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl90eXBlX2ludDY0X3QiID0geCIieWVzOyB0aGVuCisrICA6CisrZWxzZQorKworK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyAjZGVmaW5lIGludDY0X3Qgc2lnbmVkIGxvbmcgbG9uZworLUVPRgorK19BQ0VPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHVpbnQ2NF90IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzU5NTogY2hlY2tpbmcgZm9yIHVpbnQ2NF90IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aW50NjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNjAwICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXVpbnQ2NF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl90eXBlX3VpbnQ2NF90PXllcworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdWludDY0X3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1aW50NjRfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV91aW50NjRfdCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICBybSAtcmYgY29uZnRlc3QqCisgICBhY19jdl90eXBlX3VpbnQ2NF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAodWludDY0X3QpKQorKyAgICAgICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKCh1aW50NjRfdCkpKQorKwkgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgOgorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfdHlwZV91aW50NjRfdD15ZXMKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyAKKyBmaQorLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aW50NjRfdCIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3R5cGVfdWludDY0X3QgPSBubzsgdGhlbgorLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aW50NjRfdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjY7IH0KKytpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDY0X3QiID0geCIieWVzOyB0aGVuCisrICA6CisrZWxzZQorKworK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyAjZGVmaW5lIHVpbnQ2NF90IHVuc2lnbmVkIGxvbmcgbG9uZworLUVPRgorK19BQ0VPRgorIAorIGZpCisgCitAQCAtMzY4MCwxMTEgKzg1NTgsMjMyIEBACisgZmkKKyAKKyAKKy1hY19zYWZlPWBlY2hvICJ3Y2hhci5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd2NoYXIuaCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjM2ODY6IGNoZWNraW5nIGZvciB3Y2hhci5oIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDM2OTEgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKytpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3Y2hhci5oLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfd2NoYXJfaCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY2OyB9CisrZWxzZQorKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdjaGFyLmggdXNhYmlsaXR5IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3Y2hhci5oIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAjaW5jbHVkZSA8d2NoYXIuaD4KKy1FT0YKKy1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKy1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCistaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCistZWxzZQorLSAgZWNobyAiJGFjX2VyciIgPiY1CistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1maQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KKytmaQorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKysKKysjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2NoYXIuaCBwcmVzZW5jZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2NoYXIuaCBwcmVzZW5jZS4uLiAiID4mNjsgfQorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2luY2x1ZGUgPHdjaGFyLmg+CisrX0FDRU9GCisraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KKytmaQorKworK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyskYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKysKKysjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KKytjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCisrICB5ZXM6bm86ICkKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKysgICAgOzsKKysgIG5vOnllczoqICkKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorKworKyAgICA7OworK2VzYWMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3Y2hhci5oLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfd2NoYXJfaCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIGFjX2N2X2hlYWRlcl93Y2hhcl9oPSRhY19oZWFkZXJfcHJlcHJvYworIGZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjY7IH0KKysKKytmaQorKworIAorIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPSBubworIHRoZW4KKyAgICAgVV9IQVZFX1dDSEFSX0g9MAorICAgICBVX0hBVkVfV0NTQ1BZPTAKKyBlbHNlCistICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorICNkZWZpbmUgSEFWRV9XQ0hBUl9IIDEKKy1FT0YKKytfQUNFT0YKKyAKKyAgICAgVV9IQVZFX1dDSEFSX0g9MQorLSAgICAgICAgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNzI5OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHdjc2NweSIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NlYXJjaF93Y3NjcHknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9IiRMSUJTIgorLWFjX2N2X3NlYXJjaF93Y3NjcHk9Im5vIgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNzM2ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciB3Y3NjcHkoKTsKKy0KKy1pbnQgbWFpbigpIHsKKy13Y3NjcHkoKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3Zfc2VhcmNoX3djc2NweT0ibm9uZSByZXF1aXJlZCIKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgd2NzY3B5Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfd2NzY3B5K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciB3Y3NjcHkgKCk7CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gd2NzY3B5ICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK2ZvciBhY19saWIgaW4gJycgd2NzIHc7IGRvCisrICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisrICBlbHNlCisrICAgIGFjX3Jlcz0tbCRhY19saWIKKysgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorKyAgZmkKKysgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3Zfc2VhcmNoX3djc2NweT0kYWNfcmVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworIGZpCistcm0gLWYgY29uZnRlc3QqCistdGVzdCAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID0gIm5vIiAmJiBmb3IgaSBpbiB3Y3MgdzsgZG8KKy1MSUJTPSItbCRpICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNzU4ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciB3Y3NjcHkoKTsKKy0KKy1pbnQgbWFpbigpIHsKKy13Y3NjcHkoKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3Zfc2VhcmNoX3djc2NweT0iLWwkaSIKKy1icmVhaworLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisrICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF93Y3NjcHkrc2V0fSIgPSBzZXQ7IHRoZW4KKysgIGJyZWFrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKyBkb25lCistTElCUz0iJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKytpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF93Y3NjcHkrc2V0fSIgPSBzZXQ7IHRoZW4KKysgIDoKKytlbHNlCisrICBhY19jdl9zZWFyY2hfd2NzY3B5PW5vCisgZmkKKytybSBjb25mdGVzdC4kYWNfZXh0CisrTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3djc2NweSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfd2NzY3B5IiA+JjY7IH0KKythY19yZXM9JGFjX2N2X3NlYXJjaF93Y3NjcHkKKytpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbgorKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF93Y3NjcHkiIDE+JjYKKy1pZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3djc2NweSIgIT0gIm5vIjsgdGhlbgorLSAgdGVzdCAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfd2NzY3B5ICRMSUJTIgorLSAgCistZWxzZSA6CistICAKKyBmaQorKworICAgICBpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3djc2NweSIgIT0gbm87IHRoZW4KKyAgICAgICBVX0hBVkVfV0NTQ1BZPTEKKyAgICAgZWxzZQorQEAgLTM3OTUsMTcgKzg3OTQsMjAgQEAKKyAKKyAKKyBhY19kZWZhdWx0X3NpemVvZl93Y2hhcl90PTQKKy1lY2hvICRhY19uICJjaGVja2luZyBzaXplIG9mIHdjaGFyX3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozODAwOiBjaGVja2luZyBzaXplIG9mIHdjaGFyX3QiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zaXplb2Zfd2NoYXJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIHdjaGFyX3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygd2NoYXJfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3djaGFyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIGFjX2N2X3NpemVvZl93Y2hhcl90PSRhY19kZWZhdWx0X3NpemVvZl93Y2hhcl90CisgZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDM4MDggImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2lmIFNURENfSEVBREVSUworICNpbmNsdWRlIDxzdGRkZWYuaD4KKyAjZW5kaWYKK0BAIC0zODIxLDMwICs4ODIzLDU3IEBACisgICBmcHJpbnRmKGYsICIlZFxuIiwgc2l6ZW9mKHdjaGFyX3QpKTsKKyAgIGV4aXQoMCk7CisgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorLXRoZW4KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAgYWNfY3Zfc2l6ZW9mX3djaGFyX3Q9YGNhdCBjb25mdGVzdHZhbGAKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtZnIgY29uZnRlc3QqCistICBhY19jdl9zaXplb2Zfd2NoYXJfdD0wCisrICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrKCBleGl0ICRhY19zdGF0dXMgKQorK2FjX2N2X3NpemVvZl93Y2hhcl90PTAKKyBmaQorLXJtIC1mciBjb25mdGVzdCoKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCisrCisgZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3NpemVvZl93Y2hhcl90IiAxPiY2CistY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3djaGFyX3QiID4mNQorKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3djaGFyX3QiID4mNjsgfQorK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyAjZGVmaW5lIFNJWkVPRl9XQ0hBUl9UICRhY19jdl9zaXplb2Zfd2NoYXJfdAorLUVPRgorK19BQ0VPRgorIAorIAorIFVfU0laRU9GX1dDSEFSX1Q9JGFjX2N2X3NpemVvZl93Y2hhcl90CisgaWYgdGVzdCAkVV9TSVpFT0ZfV0NIQVJfVCA9IDA7IHRoZW4KKyAJaWYgdGVzdCAkVV9IQVZFX1dDSEFSX0g9MTsgdGhlbgorLQkgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFRoZXJlIGlzIHdjaGFyLmggYnV0IHRoZSBzaXplIG9mIHdjaGFyX3QgaXMgMCIgMT4mMjsgZXhpdCAxOyB9CisrCSAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBUaGVyZSBpcyB3Y2hhci5oIGJ1dCB0aGUgc2l6ZSBvZiB3Y2hhcl90IGlzIDAiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBUaGVyZSBpcyB3Y2hhci5oIGJ1dCB0aGUgc2l6ZSBvZiB3Y2hhcl90IGlzIDAiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgCWZpCisgZmkKKyAKK0BAIC0zODU1LDEzICs4ODg0LDE0IEBACisgI0FDX1NVQlNUKEVDSE9fTikKKyAjQUNfU1VCU1QoRUNIT19DKQorIAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1leHRyYXMgb3IgLS1kaXNhYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfZXh0cmFzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfZXh0cmFzIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfZXh0cmFzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCQl5ZXMpIGV4dHJhcz10cnVlIDs7CisgCQlubykgIGV4dHJhcz1mYWxzZSA7OworLQkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1leHRyYXMiIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWV4dHJhcyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWV4dHJhcyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAJCWVzYWMKKyBlbHNlCisgICBleHRyYXM9dHJ1ZQorQEAgLTM4NzMsMTMgKzg5MDMsMTQgQEAKKyBlbHNlCisgICBFWFRSQVNfVFJVRT0nIycKKyBmaQorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1leHRyYXMgb3IgLS1kaXNhYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfZXh0cmFzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfZXh0cmFzIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfZXh0cmFzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCQl5ZXMpIGljdWlvPXRydWUgOzsKKyAJCW5vKSAgaWN1aW89ZmFsc2UgOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtaWN1aW8iIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWljdWlvIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtaWN1aW8iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgaWN1aW89dHJ1ZQorQEAgLTM4OTIsMTMgKzg5MjMsMTQgQEAKKyAgIElDVUlPX1RSVUU9JyMnCisgZmkKKyAKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGF5b3V0IG9yIC0tZGlzYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX2xheW91dCtzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xheW91dCIKKy0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX2xheW91dDsgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorIAkJeWVzKSBsYXlvdXQ9dHJ1ZSA7OworIAkJbm8pICBsYXlvdXQ9ZmFsc2UgOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtbGF5b3V0IiAxPiYyOyBleGl0IDE7IH0gOzsKKysJCSopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1sYXlvdXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1sYXlvdXQiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgbGF5b3V0PXRydWUKK0BAIC0zOTExLDE2ICs4OTQzLDE4IEBACisgICBMQVlPVVRfVFJVRT0nIycKKyBmaQorIAorLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgb3IgLS13aXRob3V0LWRhdGEtcGFja2FnaW5nIHdhcyBnaXZlbi4KKysKKysjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRhdGEtcGFja2FnaW5nIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke3dpdGhfZGF0YV9wYWNrYWdpbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIHdpdGh2YWw9IiR3aXRoX2RhdGFfcGFja2FnaW5nIgorLSAgY2FzZSAiJHt3aXRodmFsfSIgaW4KKysgIHdpdGh2YWw9JHdpdGhfZGF0YV9wYWNrYWdpbmc7IGNhc2UgIiR7d2l0aHZhbH0iIGluCisgICAgICAgICAgICAgICAgIGZpbGVzfGFyY2hpdmV8bGlicmFyeSkgZGF0YXBhY2thZ2luZz0kd2l0aHZhbCA7OworIAkJYXV0bykgZGF0YXBhY2thZ2luZz0kd2l0aHZhbCA7OworIAkJY29tbW9uKSBkYXRhcGFja2FnaW5nPWFyY2hpdmUgOzsKKyAJCWRsbCkgZGF0YXBhY2thZ2luZz1saWJyYXJ5IDs7CisgCQlzdGF0aWMpIGRhdGFwYWNrYWdpbmc9c3RhdGljIDs7CistCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmciIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmciID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgLS13aXRoLWRhdGEtcGFja2FnaW5nIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworIAkJZXNhYworIGVsc2UKKyAgIGRhdGFwYWNrYWdpbmc9CitAQCAtMzkzOSwxMyArODk3MywxNCBAQAorIAorIAorIAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYXBwZWQgb3IgLS1kaXNhYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfbWFwcGVkIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfbWFwcGVkOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgICAgICAgICAgICAgICAgeWVzKSBtYXBwZWQ9YXJjaGl2ZSA7OworICAgICAgICAgICAgICAgIG5vKSAgbWFwcGVkPWxpYnJhcnkgOzsKKy0gICAgICAgICAgICAgICAqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLW1hcHBlZDsgdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZyBub3ciIDE+JjI7IGV4aXQgMTsgfSA7OworKyAgICAgICAgICAgICAgICopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1tYXBwZWQ7IHVzZSAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgbm93IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtbWFwcGVkOyB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nIG5vdyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAJZXNhYworIGVsc2UKKyAgIG1hcHBlZD0KK0BAIC0zOTU1LDE0ICs4OTkwLDE4IEBACisgaWYgdGVzdCB4IiRtYXBwZWQiICE9IHg7IHRoZW4KKyAgICAgY2FzZSAkbWFwcGVkIGluCisgCWFyY2hpdmUpCistICAgIAkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUgaW5zdGVhZCBvZiAtLWVuYWJsZS1tYXBwZWQiIDE+JjIKKysgICAgCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1hcmNoaXZlIGluc3RlYWQgb2YgLS1lbmFibGUtbWFwcGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUgaW5zdGVhZCBvZiAtLWVuYWJsZS1tYXBwZWQiID4mMjt9CisgCSAgICA7OworIAlsaWJyYXJ5KQorLSAgICAJICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1saWJyYXJ5IGluc3RlYWQgb2YgLS1kaXNhYmxlLW1hcHBlZCIgMT4mMgorKyAgICAJICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiA+JjI7fQorIAkgICAgOzsKKyAgICAgZXNhYworICAgICBpZiB0ZXN0IHgiJGRhdGFwYWNrYWdpbmciICE9IHggLWEgeCIkbWFwcGVkIiAhPSB4IiRkYXRhcGFja2FnaW5nIjsgdGhlbgorLQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNvbmZsaWN0aW5nIHZhbHVlcyB1c2VkIGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgYW5kIGRlcHJlY2F0ZWQgLS1lbmFibGUtbWFwcGVkIiAxPiYyOyBleGl0IDE7IH0KKysJeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmZsaWN0aW5nIHZhbHVlcyB1c2VkIGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgYW5kIGRlcHJlY2F0ZWQgLS1lbmFibGUtbWFwcGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgIGZpCisgICAgIGRhdGFwYWNrYWdpbmc9JG1hcHBlZAorIGZpCitAQCAtMzk4OCwxMiArOTAyNywxMiBAQAorIAorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIGxpYnJhcnkgc3VmZml4IHRvIHVzZSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjM5OTM6IGNoZWNraW5nIGZvciBhIGxpYnJhcnkgc3VmZml4IHRvIHVzZSIgPiY1CistIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJyYXJ5LXN1ZmZpeCBvciAtLXdpdGhvdXQtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIGxpYnJhcnkgc3VmZml4IHRvIHVzZS4uLiAiID4mNjsgfQorKworKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7d2l0aF9saWJyYXJ5X3N1ZmZpeCtzZXR9IiA9IHNldDsgdGhlbgorLSAgd2l0aHZhbD0iJHdpdGhfbGlicmFyeV9zdWZmaXgiCistICBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCisrICB3aXRodmFsPSR3aXRoX2xpYnJhcnlfc3VmZml4OyBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCisgZWxzZQorICAgSUNVTElCU1VGRklYPQorIGZpCitAQCAtNDAwMiw3ICs5MDQxLDggQEAKKyBpZiB0ZXN0ICIkbXNnIiA9ICIiOyB0aGVuCisgICAgIG1zZz1ub25lCisgZmkKKy1lY2hvICIkYWNfdCIiJG1zZyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRtc2ciID4mNQorKyRhc19lY2hvICIkbXNnIiA+JjY7IH0KKyAKKyBpZiB0ZXN0ICIkSUNVTElCU1VGRklYIiAhPSAiIgorIHRoZW4KK0BAIC00MDE0LDEzICs5MDU0LDE0IEBACisgCisgCisgCistIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIG9yIC0tZGlzYWJsZS10ZXN0cyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke2VuYWJsZV90ZXN0cytzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX3Rlc3RzIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfdGVzdHM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJCXllcykgdGVzdHM9dHJ1ZSA7OworIAkJbm8pICB0ZXN0cz1mYWxzZSA7OworLQkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10ZXN0cyIgMT4mMjsgZXhpdCAxOyB9IDs7CisrCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGVzdHMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10ZXN0cyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAJCWVzYWMKKyBlbHNlCisgICB0ZXN0cz10cnVlCitAQCAtNDAzMywxMyArOTA3NCwxNCBAQAorICAgVEVTVFNfVFJVRT0nIycKKyBmaQorIAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zYW1wbGVzIG9yIC0tZGlzYWJsZS1zYW1wbGVzIHdhcyBnaXZlbi4KKysjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2FtcGxlcyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfc2FtcGxlcytzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NhbXBsZXMiCistICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisrICBlbmFibGV2YWw9JGVuYWJsZV9zYW1wbGVzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCQl5ZXMpIHNhbXBsZXM9dHJ1ZSA7OworIAkJbm8pICBzYW1wbGVzPWZhbHNlIDs7CistCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXNhbXBsZXMiIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXNhbXBsZXMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1zYW1wbGVzIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworIAkJZXNhYworIGVsc2UKKyAgIHNhbXBsZXM9dHJ1ZQorQEAgLTQwOTYsNyArOTEzOCw3IEBACisgCisgCisgY2FzZSAiJHtob3N0fSIgaW4KKy0JKi0qLWhwdXgqKSAJCisrCSotKi1ocHV4KikKKyAJCWlmIHRlc3QgIiR7aWN1X2N2X2hvc3RfZnJhZ30iID0gIm1oLWhwdXgtY2MiOyB0aGVuCisgCQkJZm9yIGZpbGUgaW4gc2FtcGxlcy9kYXRlL2RhdGUgXAorIAkJCSAgc2FtcGxlcy9jYWwvY2FsIHRlc3QvY2ludGx0c3QvY2ludGx0c3QgXAorQEAgLTQxNDEsNTE3ICs5MTgzLDEyOTkgQEAKKyAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyBcJChUSFJFQURTQ1hYRkxBR1MpIgorIGZpCisgCistdHJhcCAnJyAxIDIgMTUKKy1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCisrYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIGljdWRlZnMubWsgTWFrZWZpbGUgZGF0YS9NYWtlZmlsZSBkYXRhL2ljdXBrZy5pbmMgY29tbW9uL01ha2VmaWxlIGNvbmZpZy9NYWtlZmlsZS5pbmMgaTE4bi9NYWtlZmlsZSBsYXlvdXQvTWFrZWZpbGUgbGF5b3V0ZXgvTWFrZWZpbGUgaW8vTWFrZWZpbGUgZXh0cmEvTWFrZWZpbGUgZXh0cmEvdWNvbnYvTWFrZWZpbGUgZXh0cmEvc2NycHRydW4vTWFrZWZpbGUgc3R1YmRhdGEvTWFrZWZpbGUgdG9vbHMvTWFrZWZpbGUgdG9vbHMvY3Rlc3Rmdy9NYWtlZmlsZSB0b29scy9tYWtlY29udi9NYWtlZmlsZSB0b29scy9nZW5yYi9NYWtlZmlsZSB0b29scy9nZW51Y2EvTWFrZWZpbGUgdG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUgdG9vbHMvZ2VuY21uL01ha2VmaWxlIHRvb2xzL2dlbmNudmFsL01ha2VmaWxlIHRvb2xzL2dlbm5hbWVzL01ha2VmaWxlIHRvb2xzL2dlbnRlc3QvTWFrZWZpbGUgdG9vbHMvZ2Vubm9ybS9NYWtlZmlsZSB0b29scy9nZW5wcm9wcy9NYWtlZmlsZSB0b29scy9nZW5wbmFtZS9NYWtlZmlsZSB0b29scy9nZW5icmsvTWFrZWZpbGUgdG9vbHMvZ2Vuc3ByZXAvTWFrZWZpbGUgdG9vbHMvaWN1c3dhcC9NYWtlZmlsZSB0b29scy9wa2dkYXRhL01ha2VmaWxlIHRvb2xzL3Rvb2x1dGlsL01ha2VmaWxlIHRvb2xzL2R1bXBjZS9NYWtlZmlsZSB0ZXN0L01ha2VmaWxlIHRlc3QvdGVzdGRhdGEvTWFrZWZpbGUgdGVzdC9oZHJ0c3QvTWFrZWZpbGUgdGVzdC9pbnRsdGVzdC9NYWtlZmlsZSB0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIHRlc3QvaW90ZXN0L01ha2VmaWxlIHRlc3QvdGhhaXRlc3QvTWFrZWZpbGUgdGVzdC90ZXN0bWFwL01ha2VmaWxlIHRlc3QvbGV0ZXN0L01ha2VmaWxlIHRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSBzYW1wbGVzL01ha2VmaWxlIHNhbXBsZXMvZGF0ZS9NYWtlZmlsZSBzYW1wbGVzL2NhbC9NYWtlZmlsZSBzYW1wbGVzL2xheW91dC9NYWtlZmlsZSBjb21tb24vdW5pY29kZS9wbGF0Zm9ybS5oIgorKworK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorICMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorICMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCistIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisrIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKysjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisrIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisgIworLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCistIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCistIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCistIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKy0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKy0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisrIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisgIworLUVPRgorKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKysjIGZvbGxvd2luZyB2YWx1ZXMuCisrCisrX0FDRU9GCisrCisgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyAjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKysjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorICMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorICMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCistKHNldCkgMj4mMSB8CistICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorLSAgKmFjX3NwYWNlPVwgKikKKy0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKy0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKy0gICAgc2VkIC1uIFwKKy0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKy0gICAgOzsKKy0gICopCistICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCistICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKy0gICAgOzsKKy0gIGVzYWMgPj4gY29uZmNhY2hlCistaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorLSAgOgorLWVsc2UKKy0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKy0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCistICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorKygKKysgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKysgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisrICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorKyAgICAqJHthc19ubH0qKQorKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKysgICAgICBlc2FjCisrICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisrICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisrICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKysgICAgICBlc2FjIDs7CisrICAgIGVzYWMKKysgIGRvbmUKKysKKysgIChzZXQpIDI+JjEgfAorKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCisrICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKysgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisrICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisrICAgICAgc2VkIC1uIFwKKysJInMvJy8nXFxcXCcnL2c7CisrCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorKyAgICAgIDs7ICMoCisrICAgICopCisrICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKysgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorKyAgICAgIDs7CisrICAgIGVzYWMgfAorKyAgICBzb3J0CisrKSB8CisrICBzZWQgJworKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCisrICAgICB0IGNsZWFyCisrICAgICA6Y2xlYXIKKysgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKysgICAgIHQgZW5kCisrICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKysgICAgIDplbmQnID4+Y29uZmNhY2hlCisraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorKyAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCisrICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKysgICAgY2F0IGNvbmZjYWNoZSA+JGNhY2hlX2ZpbGUKKyAgIGVsc2UKKy0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICBmaQorIGZpCisgcm0gLWYgY29uZmNhY2hlCisgCistdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKy0KKyB0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisgIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCisgdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworIAorLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgorLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCistICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCistZmkKKytERUZTPS1ESEFWRV9DT05GSUdfSAorIAorLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKythY19saWJvYmpzPQorK2FjX2x0bGlib2Jqcz0KKytmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKysgICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KKysgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisrICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCisrICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKysgIGFjX2xpYm9ianM9IiRhY19saWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorKyAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCisrZG9uZQorK0xJQk9CSlM9JGFjX2xpYm9ianMKKyAKKy1ERUZTPS1ESEFWRV9DT05GSUdfSAorK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisgCistIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCistOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorIAorLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKKy1ybSAtZiAkQ09ORklHX1NUQVRVUworLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCistIyEgL2Jpbi9zaAorLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorKworKworKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKythY193cml0ZV9mYWlsPTAKKythY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KKytjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorKyMhICRTSEVMTAorKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyAjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKy0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCistIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKy0jCistIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKy0jCisgIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKyAKKy1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorLWZvciBhY19vcHRpb24KKytkZWJ1Zz1mYWxzZQorK2FjX2NzX3JlY2hlY2s9ZmFsc2UKKythY19jc19zaWxlbnQ9ZmFsc2UKKytTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorK19BQ0VPRgorKworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKysjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKysjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKysKKysjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKKytEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBlbXVsYXRlIHNoCisrICBOVUxMQ01EPToKKysgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKysgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKytlbHNlCisrICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKysgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworK2VzYWMKKysKKytmaQorKworKworKworKworKyMgUEFUSCBuZWVkcyBDUgorKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KKythc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKythc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKKythc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKKythc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCisrYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisrCisrYXNfbmw9JworKycKKytleHBvcnQgYXNfbmwKKysjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCisrYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisrYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKytpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisrICBhc19lY2hvX249J3ByaW50ZiAlcycKKytlbHNlCisrICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKysgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKysgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworKyAgZWxzZQorKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorKyAgICAgIGFyZz0kMTsKKysgICAgICBjYXNlICRhcmcgaW4KKysgICAgICAqIiRhc19ubCIqKQorKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKysJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKysgICAgICBlc2FjOworKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKysgICAgJworKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKysgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKysgIGZpCisrICBleHBvcnQgYXNfZWNob19ib2R5CisrICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCisrZmkKKysKKysjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KKytpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorKyAgUEFUSF9TRVBBUkFUT1I9OgorKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworKyAgfQorK2ZpCisrCisrIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCisraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBhc191bnNldD11bnNldAorK2Vsc2UKKysgIGFzX3Vuc2V0PWZhbHNlCisrZmkKKysKKysKKysjIElGUworKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisrIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisrIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisrIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorK0lGUz0iICIiCSRhc19ubCIKKysKKysjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorK2Nhc2UgJDAgaW4KKysgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKysgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisgZG8KKy0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCistICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKy0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CistICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKy0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKy0gICAgZXhpdCAwIDs7CistICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKy0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworLSAgZXNhYworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKyAKKy1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgorLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorKyAgICAgOzsKKytlc2FjCisrIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKysgIGFzX215c2VsZj0kMAorK2ZpCisraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKysgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorK2ZpCisgCistdHJhcCAncm0gLWZyIGBlY2hvICJpY3VkZWZzLm1rIFwKKy0JCU1ha2VmaWxlIFwKKy0JCWRhdGEvTWFrZWZpbGUgZGF0YS9pY3Vwa2cuaW5jIFwKKy0JCWNvbW1vbi9NYWtlZmlsZSBjb25maWcvTWFrZWZpbGUuaW5jIGkxOG4vTWFrZWZpbGUgXAorLQkJbGF5b3V0L01ha2VmaWxlIFwKKy0JCWxheW91dGV4L01ha2VmaWxlIFwKKy0JCWlvL01ha2VmaWxlIFwKKy0JCWV4dHJhL01ha2VmaWxlIFwKKy0JCWV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlCistCQlzdHViZGF0YS9NYWtlZmlsZSBcCistCQl0b29scy9NYWtlZmlsZSB0b29scy9jdGVzdGZ3L01ha2VmaWxlIHRvb2xzL21ha2Vjb252L01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnJiL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnVjYS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jY29kZS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jbW4vTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VuY252YWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VudGVzdC9NYWtlZmlsZSBcCistCQl0b29scy9nZW5ub3JtL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnByb3BzL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbmJyay9NYWtlZmlsZSBcCistCQl0b29scy9nZW5zcHJlcC9NYWtlZmlsZSBcCistCQl0b29scy9pY3Vzd2FwL01ha2VmaWxlIFwKKy0JCXRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUgXAorLQkJdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZHVtcGNlL01ha2VmaWxlIFwKKy0JCXRlc3QvTWFrZWZpbGUgdGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSBcCistCQl0ZXN0L2hkcnRzdC9NYWtlZmlsZSBcCistCQl0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIFwKKy0JCXRlc3QvY2ludGx0c3QvTWFrZWZpbGUgXAorLQkJdGVzdC9pb3Rlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aGFpdGVzdC9NYWtlZmlsZSBcCistCQl0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUgXAorLQkJdGVzdC9sZXRlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvTWFrZWZpbGUgc2FtcGxlcy9kYXRlL01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIFwKKy0JCWNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmggY29tbW9uL2ljdWNmZy5oIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CistRU9GCistY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCistCistIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKy1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorLSRhY192cHN1YgorLSRleHRyYXN1YgorLXMlQFNIRUxMQCUkU0hFTEwlZworLXMlQENGTEFHU0AlJENGTEFHUyVnCistcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCistcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCistcyVARkZMQUdTQCUkRkZMQUdTJWcKKy1zJUBERUZTQCUkREVGUyVnCistcyVATERGTEFHU0AlJExERkxBR1MlZworLXMlQExJQlNAJSRMSUJTJWcKKy1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKKy1zJUBwcmVmaXhAJSRwcmVmaXglZworLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKKy1zJUBiaW5kaXJAJSRiaW5kaXIlZworLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKKy1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCistcyVAZGF0YWRpckAlJGRhdGFkaXIlZworLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKKy1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKKy1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCistcyVAbGliZGlyQCUkbGliZGlyJWcKKy1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCistcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKKy1zJUBtYW5kaXJAJSRtYW5kaXIlZworLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKKy1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCistcyVATElCX1ZFUlNJT05AJSRMSUJfVkVSU0lPTiVnCistcyVATElCX1ZFUlNJT05fTUFKT1JAJSRMSUJfVkVSU0lPTl9NQUpPUiVnCistcyVAVU5JQ09ERV9WRVJTSU9OQCUkVU5JQ09ERV9WRVJTSU9OJWcKKy1zJUBDQ0AlJENDJWcKKy1zJUBDWFhAJSRDWFglZworLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCistcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCistcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKKy1zJUBTVFJJUEAlJFNUUklQJWcKKy1zJUBVX01BS0VAJSRVX01BS0UlZworLXMlQERPWFlHRU5AJSRET1hZR0VOJWcKKy1zJUBob3N0QCUkaG9zdCVnCistcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKKy1zJUBFWEVFWFRAJSRFWEVFWFQlZworLXMlQEFSRkxBR1NAJSRBUkZMQUdTJWcKKy1zJUBDT01QSUxFX0xJTktfRU5WVkFSQCUkQ09NUElMRV9MSU5LX0VOVlZBUiVnCistcyVATElCX01AJSRMSUJfTSVnCistcyVARU5BQkxFX1NIQVJFREAlJEVOQUJMRV9TSEFSRUQlZworLXMlQEVOQUJMRV9TVEFUSUNAJSRFTkFCTEVfU1RBVElDJWcKKy1zJUBFTkFCTEVfREVCVUdAJSRFTkFCTEVfREVCVUclZworLXMlQEVOQUJMRV9SRUxFQVNFQCUkRU5BQkxFX1JFTEVBU0UlZworLXMlQFJBTkxJQkAlJFJBTkxJQiVnCistcyVAQVJAJSRBUiVnCistcyVAVV9ESVNBQkxFX1JFTkFNSU5HQCUkVV9ESVNBQkxFX1JFTkFNSU5HJWcKKy1zJUBVX0VOQUJMRV9UUkFDSU5HQCUkVV9FTkFCTEVfVFJBQ0lORyVnCistcyVARU5BQkxFX1JQQVRIQCUkRU5BQkxFX1JQQVRIJWcKKy1zJUBVX0lOTElORUAlJFVfSU5MSU5FJWcKKy1zJUBUSFJFQURTX1RSVUVAJSRUSFJFQURTX1RSVUUlZworLXMlQElDVV9VU0VfVEhSRUFEU0AlJElDVV9VU0VfVEhSRUFEUyVnCistcyVASEFWRV9NTUFQQCUkSEFWRV9NTUFQJWcKKy1zJUBHRU5DQ09ERV9BU1NFTUJMWUAlJEdFTkNDT0RFX0FTU0VNQkxZJWcKKy1zJUBDUFBAJSRDUFAlZworLXMlQFVfSEFWRV9JTlRUWVBFU19IQCUkVV9IQVZFX0lOVFRZUEVTX0glZworLXMlQENYWENQUEAlJENYWENQUCVnCistcyVAVV9JT1NUUkVBTV9TT1VSQ0VAJSRVX0lPU1RSRUFNX1NPVVJDRSVnCistcyVAVV9JU19CSUdfRU5ESUFOQCUkVV9JU19CSUdfRU5ESUFOJWcKKy1zJUBVX0hBVkVfTkxfTEFOR0lORk9AJSRVX0hBVkVfTkxfTEFOR0lORk8lZworLXMlQFVfSEFWRV9OTF9MQU5HSU5GT19DT0RFU0VUQCUkVV9IQVZFX05MX0xBTkdJTkZPX0NPREVTRVQlZworLXMlQFVfTkxfTEFOR0lORk9fQ09ERVNFVEAlJFVfTkxfTEFOR0lORk9fQ09ERVNFVCVnCistcyVAVV9IQVZFX05BTUVTUEFDRUAlJFVfSEFWRV9OQU1FU1BBQ0UlZworLXMlQFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT05AJSRVX09WRVJSSURFX0NYWF9BTExPQ0FUSU9OJWcKKy1zJUBVX0hBVkVfUExBQ0VNRU5UX05FV0AlJFVfSEFWRV9QTEFDRU1FTlRfTkVXJWcKKy1zJUBVX0hBVkVfUE9QRU5AJSRVX0hBVkVfUE9QRU4lZworLXMlQFVfVFpTRVRAJSRVX1RaU0VUJWcKKy1zJUBVX1RaTkFNRUAlJFVfVFpOQU1FJWcKKy1zJUBVX0hBVkVfVElNRVpPTkVAJSRVX0hBVkVfVElNRVpPTkUlZworLXMlQFVfVElNRVpPTkVAJSRVX1RJTUVaT05FJWcKKy1zJUBIQVZFX0lOVDhfVEAlJEhBVkVfSU5UOF9UJWcKKy1zJUBIQVZFX1VJTlQ4X1RAJSRIQVZFX1VJTlQ4X1QlZworLXMlQEhBVkVfSU5UMTZfVEAlJEhBVkVfSU5UMTZfVCVnCistcyVASEFWRV9VSU5UMTZfVEAlJEhBVkVfVUlOVDE2X1QlZworLXMlQEhBVkVfSU5UMzJfVEAlJEhBVkVfSU5UMzJfVCVnCistcyVASEFWRV9VSU5UMzJfVEAlJEhBVkVfVUlOVDMyX1QlZworLXMlQEhBVkVfSU5UNjRfVEAlJEhBVkVfSU5UNjRfVCVnCistcyVASEFWRV9VSU5UNjRfVEAlJEhBVkVfVUlOVDY0X1QlZworLXMlQFVfSEFWRV9XQ0hBUl9IQCUkVV9IQVZFX1dDSEFSX0glZworLXMlQFVfSEFWRV9XQ1NDUFlAJSRVX0hBVkVfV0NTQ1BZJWcKKy1zJUBVX1NJWkVPRl9XQ0hBUl9UQCUkVV9TSVpFT0ZfV0NIQVJfVCVnCistcyVARVhUUkFTX1RSVUVAJSRFWFRSQVNfVFJVRSVnCistcyVASUNVSU9fVFJVRUAlJElDVUlPX1RSVUUlZworLXMlQExBWU9VVF9UUlVFQCUkTEFZT1VUX1RSVUUlZworLXMlQHRoZXN5c2NvbmZkaXJAJSR0aGVzeXNjb25mZGlyJWcKKy1zJUB0aGVkYXRhZGlyQCUkdGhlZGF0YWRpciVnCistcyVAdGhlbGliZGlyQCUkdGhlbGliZGlyJWcKKy1zJUBwa2dpY3VkYXRhZGlyQCUkcGtnaWN1ZGF0YWRpciVnCistcyVAdGhlcGtnaWN1ZGF0YWRpckAlJHRoZXBrZ2ljdWRhdGFkaXIlZworLXMlQERBVEFfUEFDS0FHSU5HX0NQUEZMQUdTQCUkREFUQV9QQUNLQUdJTkdfQ1BQRkxBR1MlZworLXMlQERBVEFfUEFDS0FHSU5HX01PREVAJSREQVRBX1BBQ0tBR0lOR19NT0RFJWcKKy1zJUBJQ1VMSUJTVUZGSVhAJSRJQ1VMSUJTVUZGSVglZworLXMlQFVfSEFWRV9MSUJfU1VGRklYQCUkVV9IQVZFX0xJQl9TVUZGSVglZworLXMlQElDVUxJQlNVRkZJWENOQU1FQCUkSUNVTElCU1VGRklYQ05BTUUlZworLXMlQFRFU1RTX1RSVUVAJSRURVNUU19UUlVFJWcKKy1zJUBTQU1QTEVTX1RSVUVAJSRTQU1QTEVTX1RSVUUlZworLXMlQElDVURBVEFfQ0hBUkAlJElDVURBVEFfQ0hBUiVnCistcyVAcGxhdGZvcm1AJSRwbGF0Zm9ybSVnCistcyVAcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lQCUkcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lJWcKKy1zJUBwbGF0Zm9ybV9tYWtlX2ZyYWdtZW50QCUkcGxhdGZvcm1fbWFrZV9mcmFnbWVudCVnCistcyVAbGRfcnBhdGhfc3VmQCUkbGRfcnBhdGhfc3VmJWcKKy1zJUBBSVhfU0hMSUJAJSRBSVhfU0hMSUIlZworLQorLUNFT0YKKy1FT0YKKy0KKy1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCistCistIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKy0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KKy1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCistYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCistYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorLWFjX21vcmVfbGluZXM9OgorLWFjX3NlZF9jbWRzPSIiCistd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCistICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKy0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKysjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KKytmb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICisrZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKKytkb25lCisrUFMxPSckICcKKytQUzI9Jz4gJworK1BTND0nKyAnCisrCisrIyBOTFMgbnVpc2FuY2VzLgorK0xDX0FMTD1DCisrZXhwb3J0IExDX0FMTAorK0xBTkdVQUdFPUMKKytleHBvcnQgTEFOR1VBR0UKKysKKysjIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KKytpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisrICBhc19leHByPWV4cHIKKytlbHNlCisrICBhc19leHByPWZhbHNlCisrZmkKKysKKytpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisrICBhc19iYXNlbmFtZT1iYXNlbmFtZQorK2Vsc2UKKysgIGFzX2Jhc2VuYW1lPWZhbHNlCisrZmkKKysKKysKKysjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCisrYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CisrJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKysJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisrCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyskYXNfZWNobyBYLyIkMCIgfAorKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcL1woXC9cL1wpJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXC9cKFwvXCkuKi97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgcy8uKi8uLzsgcSdgCisrCisrIyBDRFBBVEguCisrJGFzX3Vuc2V0IENEUEFUSAorKworKworKworKyAgYXNfbGluZW5vXzE9JExJTkVOTworKyAgYXNfbGluZW5vXzI9JExJTkVOTworKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisrICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKKysKKysgICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KKysgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKKysgICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJworKyAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKKysgICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKKysgICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKKysgICMgY2FzZSBhdCBsaW5lIGVuZC4KKysgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorKyAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCisrICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQorKyAgc2VkIC1uICcKKysgICAgcAorKyAgICAvWyRdTElORU5PLz0KKysgICcgPCRhc19teXNlbGYgfAorKyAgICBzZWQgJworKyAgICAgIHMvWyRdTElORU5PLiovJi0vCisrICAgICAgdCBsaW5lbm8KKysgICAgICBiCisrICAgICAgOmxpbmVubworKyAgICAgIE4KKysgICAgICA6bG9vcAorKyAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLworKyAgICAgIHQgbG9vcAorKyAgICAgIHMvLVxuLiovLworKyAgICAnID4kYXNfbWUubGluZW5vICYmCisrICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKysgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKysgIC4gIi4vJGFzX21lLmxpbmVubyIKKysgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorKyAgZXhpdAorK30KKysKKysKKytpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFzX2Rpcm5hbWU9ZGlybmFtZQorK2Vsc2UKKysgIGFzX2Rpcm5hbWU9ZmFsc2UKKytmaQorKworK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CisrY2FzZSBgZWNobyAtbiB4YCBpbgorKy1uKikKKysgIGNhc2UgYGVjaG8gJ3hcYydgIGluCisrICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKysgICopICAgRUNIT19DPSdcYyc7OworKyAgZXNhYzs7CisrKikKKysgIEVDSE9fTj0nLW4nOzsKKytlc2FjCisraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKysgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorKyAgYXNfZXhwcj1leHByCisrZWxzZQorKyAgYXNfZXhwcj1mYWxzZQorK2ZpCisrCisrcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKytpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKysgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKKytlbHNlCisrICBybSAtZiBjb25mJCQuZGlyCisrICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisrZmkKKytpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisrICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKysgICAgYXNfbG5fcz0nbG4gLXMnCisrICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisrICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisrICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisrICAgICAgYXNfbG5fcz0nY3AgLXAnCisrICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorKyAgICBhc19sbl9zPWxuCisgICBlbHNlCistICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgIGZpCistICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCistICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKy0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCistICBlbHNlCistICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKy0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKy0gICAgZWxzZQorLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorLSAgICBmaQorLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKy0gICAgYWNfYmVnPSRhY19lbmQKKy0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorLSAgZmkKKy1kb25lCistaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorLSAgYWNfc2VkX2NtZHM9Y2F0CistZmkKKy1FT0YKKy0KKy1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKy0KKy1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJpY3VkZWZzLm1rIFwKKy0JCU1ha2VmaWxlIFwKKy0JCWRhdGEvTWFrZWZpbGUgZGF0YS9pY3Vwa2cuaW5jIFwKKy0JCWNvbW1vbi9NYWtlZmlsZSBjb25maWcvTWFrZWZpbGUuaW5jIGkxOG4vTWFrZWZpbGUgXAorLQkJbGF5b3V0L01ha2VmaWxlIFwKKy0JCWxheW91dGV4L01ha2VmaWxlIFwKKy0JCWlvL01ha2VmaWxlIFwKKy0JCWV4dHJhL01ha2VmaWxlIFwKKy0JCWV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlCistCQlzdHViZGF0YS9NYWtlZmlsZSBcCistCQl0b29scy9NYWtlZmlsZSB0b29scy9jdGVzdGZ3L01ha2VmaWxlIHRvb2xzL21ha2Vjb252L01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnJiL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnVjYS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jY29kZS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jbW4vTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VuY252YWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VudGVzdC9NYWtlZmlsZSBcCistCQl0b29scy9nZW5ub3JtL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnByb3BzL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbmJyay9NYWtlZmlsZSBcCistCQl0b29scy9nZW5zcHJlcC9NYWtlZmlsZSBcCistCQl0b29scy9pY3Vzd2FwL01ha2VmaWxlIFwKKy0JCXRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUgXAorLQkJdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZHVtcGNlL01ha2VmaWxlIFwKKy0JCXRlc3QvTWFrZWZpbGUgdGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSBcCistCQl0ZXN0L2hkcnRzdC9NYWtlZmlsZSBcCistCQl0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIFwKKy0JCXRlc3QvY2ludGx0c3QvTWFrZWZpbGUgXAorLQkJdGVzdC9pb3Rlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aGFpdGVzdC9NYWtlZmlsZSBcCistCQl0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUgXAorLQkJdGVzdC9sZXRlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvTWFrZWZpbGUgc2FtcGxlcy9kYXRlL01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIFwKKy0JCWNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmgifQorLUVPRgorLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKy1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorLSAgY2FzZSAiJGFjX2ZpbGUiIGluCistICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKy0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CistICBlc2FjCisrZWxzZQorKyAgYXNfbG5fcz0nY3AgLXAnCisrZmkKKytybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCisrcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorIAorLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKytpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisrICBhc19ta2Rpcl9wPToKKytlbHNlCisrICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorKyAgYXNfbWtkaXJfcD1mYWxzZQorK2ZpCisgCistICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKy0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCistICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKy0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKy0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKy0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFzX3Rlc3RfeD0ndGVzdCAteCcKKytlbHNlCisrICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgICAgYXNfbHNfTF9vcHRpb249TAorICAgZWxzZQorLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorKyAgICBhc19sc19MX29wdGlvbj0KKyAgIGZpCisrICBhc190ZXN0X3g9JworKyAgICBldmFsIHNoIC1jICdcJycKKysgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKysJdGVzdCAtZCAiJDEvLiI7CisrICAgICAgZWxzZQorKwljYXNlICQxIGluCisrCS0qKXNldCAiLi8kMSI7OworKwllc2FjOworKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgorKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisrICAgICdcJycgc2gKKysgICcKKytmaQorK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisrCisrIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisrCisrIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCisrYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKysKKysKKytleGVjIDY+JjEKKysKKysjIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgorKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCisrYWNfbG9nPSIKKytUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCisrZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisrCisrICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisrICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKysgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKysgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKysgICQgJDAgJEAKKyAKKy0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCistICAuKSAgc3JjZGlyPS4KKy0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCistICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CistICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgorLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CistICBlc2FjCisrb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisrIgorKworK19BQ0VPRgorKworK2Nhc2UgJGFjX2NvbmZpZ19maWxlcyBpbiAqIgorKyIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKKytlc2FjCisrCisrY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKysiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworK2VzYWMKKyAKKy0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKy0gIGVzYWMKKyAKKy0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorLSAgcm0gLWYgIiRhY19maWxlIgorLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCistICBjYXNlICIkYWNfZmlsZSIgaW4KKy0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKy0gICopIGFjX2NvbXN1Yj0gOzsKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCisrY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorK2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCisrCisrX0FDRU9GCisrCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2FjX2NzX3VzYWdlPSJcCisrXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCisrY3VycmVudCBjb25maWd1cmF0aW9uLgorKworK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbRklMRV0uLi4KKysKKysgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKysgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50CisrICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisrICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisrICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKysgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKysgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKysKKytDb25maWd1cmF0aW9uIGZpbGVzOgorKyRjb25maWdfZmlsZXMKKysKKytDb25maWd1cmF0aW9uIGhlYWRlcnM6CisrJGNvbmZpZ19oZWFkZXJzCisrCisrUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCisrCisrX0FDRU9GCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisrYWNfY3NfdmVyc2lvbj0iXFwKKytjb25maWcuc3RhdHVzCisrY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLAorKyAgd2l0aCBvcHRpb25zIFxcImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCisrCisrQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCisrCisrYWNfcHdkPSckYWNfcHdkJworK3NyY2Rpcj0nJHNyY2RpcicKKytJTlNUQUxMPSckSU5TVEFMTCcKKyt0ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3aworK19BQ0VPRgorKworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysjIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCisrYWNfbmVlZF9kZWZhdWx0cz06Cisrd2hpbGUgdGVzdCAkIyAhPSAwCisrZG8KKysgIGNhc2UgJDEgaW4KKysgIC0tKj0qKQorKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCisrICAgIGFjX3NoaWZ0PToKKysgICAgOzsKKysgICopCisrICAgIGFjX29wdGlvbj0kMQorKyAgICBhY19vcHRhcmc9JDIKKysgICAgYWNfc2hpZnQ9c2hpZnQKKysgICAgOzsKKyAgIGVzYWMKKyAKKy0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCistICBzZWQgLWUgIiRhY19jb21zdWIKKy1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworLXMlQHNyY2RpckAlJHNyY2RpciVnCistcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKKy0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCistZmk7IGRvbmUKKy1ybSAtZiBjb25mdGVzdC5zKgorKyAgY2FzZSAkYWNfb3B0aW9uIGluCisrICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisrICAgIGFjX2NzX3JlY2hlY2s9OiA7OworKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisrICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQorKyAgICBkZWJ1Zz06IDs7CisrICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorKyAgICAkYWNfc2hpZnQKKysgICAgY2FzZSAkYWNfb3B0YXJnIGluCisrICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisrICAgIGVzYWMKKysgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICckYWNfb3B0YXJnJyIKKysgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisrICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisrICAgICRhY19zaGlmdAorKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKysgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKysgICAgZXNhYworKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICckYWNfb3B0YXJnJyIKKysgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisrICAtLWhlIHwgLS1oKQorKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisrICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisrICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorKyAgICBhY19jc19zaWxlbnQ9OiA7OworKworKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorKyAgLSopIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCisrVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworKworKyAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKKysgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKyAKKy0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKy0jCistIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworLWFjX2RDPSdcMycKKy1hY19kRD0nJWcnCistIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KKy1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKKy1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKKy1hY191Qz0nICcKKy1hY191RD0nXDQlZycKKy0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCistYWNfZUM9JyAnCistYWNfZUQ9JyVnJworLQorLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCistRU9GCistY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCistICBDT05GSUdfSEVBREVSUz0iY29tbW9uL2ljdWNmZy5oIgorLUVPRgorLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKy1maQorLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKy0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKy0gIGNhc2UgIiRhY19maWxlIiBpbgorLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKy0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CistICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICAgZXNhYworKyAgc2hpZnQKKytkb25lCisrCisrYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisgCistICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisraWYgJGFjX2NzX3NpbGVudDsgdGhlbgorKyAgZXhlYyA2Pi9kZXYvbnVsbAorKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKKytmaQorKworK19BQ0VPRgorK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorKyAgc2V0IFggJyRTSEVMTCcgJyQwJyAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorKyAgc2hpZnQKKysgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisrICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKKysgIGV4cG9ydCBDT05GSUdfU0hFTEwKKysgIGV4ZWMgIlwkQCIKKytmaQorIAorLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKy0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCistICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKy0KKy1FT0YKKy0KKy0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCistIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKKy1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCistcy9bXFwmJV0vXFwmL2cKKy1zJVtcXCRgXSVcXCYlZworLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCistcyVhY19kJWFjX3UlZ3AKKy1zJWFjX3UlYWNfZSVncAorLUVPRgorLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKKy1ybSAtZiBjb25mdGVzdC5oZHIKKy0KKy0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCistIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCistRU9GCisrX0FDRU9GCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2V4ZWMgNT4+Y29uZmlnLmxvZworK3sKKysgIGVjaG8KKysgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisrIyMgUnVubmluZyAkYXNfbWUuICMjCisrX0FTQk9YCisrICAkYXNfZWNobyAiJGFjX2xvZyIKKyt9ID4mNQorKworK19BQ0VPRgorK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK19BQ0VPRgorIAorLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIAorLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKKy13aGlsZSA6CisrIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCisrZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCisgZG8KKy0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKy0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKy0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKy0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKy0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworLSAgZWNobyAnQ0VPRgorLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKy0gIHJtIC1mIGNvbmZ0ZXN0LmluCistICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKy0nID4+ICRDT05GSUdfU1RBVFVTCistICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKy0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKy0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworLWRvbmUKKy1ybSAtZiBjb25mdGVzdC52YWxzCistCistY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCistICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKy0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCistICBybSAtZiBjb25mdGVzdC5pbgorLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKy0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorLSAgICBybSAtZiBjb25mdGVzdC5oCisrICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisrICAgICJjb21tb24vaWN1Y2ZnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbW1vbi9pY3VjZmcuaCIgOzsKKysgICAgImljdWRlZnMubWsiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaWN1ZGVmcy5tayIgOzsKKysgICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworKyAgICAiZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYXRhL01ha2VmaWxlIiA7OworKyAgICAiZGF0YS9pY3Vwa2cuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRhdGEvaWN1cGtnLmluYyIgOzsKKysgICAgImNvbW1vbi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb21tb24vTWFrZWZpbGUiIDs7CisrICAgICJjb25maWcvTWFrZWZpbGUuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNvbmZpZy9NYWtlZmlsZS5pbmMiIDs7CisrICAgICJpMThuL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGkxOG4vTWFrZWZpbGUiIDs7CisrICAgICJsYXlvdXQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGF5b3V0L01ha2VmaWxlIiA7OworKyAgICAibGF5b3V0ZXgvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGF5b3V0ZXgvTWFrZWZpbGUiIDs7CisrICAgICJpby9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpby9NYWtlZmlsZSIgOzsKKysgICAgImV4dHJhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGV4dHJhL01ha2VmaWxlIiA7OworKyAgICAiZXh0cmEvdWNvbnYvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvdWNvbnYvTWFrZWZpbGUiIDs7CisrICAgICJleHRyYS9zY3JwdHJ1bi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleHRyYS9zY3JwdHJ1bi9NYWtlZmlsZSIgOzsKKysgICAgInN0dWJkYXRhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHN0dWJkYXRhL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9jdGVzdGZ3L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2N0ZXN0ZncvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9tYWtlY29udi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9tYWtlY29udi9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbnJiL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnJiL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VudWNhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnVjYS9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VuY21uL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNtbi9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbmNudmFsL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNudmFsL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9nZW50ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnRlc3QvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9nZW5ub3JtL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbm5vcm0vTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9nZW5wcm9wcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5wcm9wcy9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VuYnJrL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmJyay9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvaWN1c3dhcC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9pY3Vzd2FwL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvcGtnZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9wa2dkYXRhL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9kdW1wY2UvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZHVtcGNlL01ha2VmaWxlIiA7OworKyAgICAidGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L01ha2VmaWxlIiA7OworKyAgICAidGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3Rlc3RkYXRhL01ha2VmaWxlIiA7OworKyAgICAidGVzdC9oZHJ0c3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9oZHJ0c3QvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvaW50bHRlc3QvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvY2ludGx0c3QvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2lvdGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2lvdGVzdC9NYWtlZmlsZSIgOzsKKysgICAgInRlc3QvdGhhaXRlc3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90aGFpdGVzdC9NYWtlZmlsZSIgOzsKKysgICAgInRlc3QvdGVzdG1hcC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2xldGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2xldGVzdC9NYWtlZmlsZSIgOzsKKysgICAgInRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3RocmVhZHRlc3QvTWFrZWZpbGUiIDs7CisrICAgICJzYW1wbGVzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNhbXBsZXMvTWFrZWZpbGUiIDs7CisrICAgICJzYW1wbGVzL2RhdGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9kYXRlL01ha2VmaWxlIiA7OworKyAgICAic2FtcGxlcy9jYWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9jYWwvTWFrZWZpbGUiIDs7CisrICAgICJzYW1wbGVzL2xheW91dC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzYW1wbGVzL2xheW91dC9NYWtlZmlsZSIgOzsKKysgICAgImNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmgiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgY29tbW9uL3VuaWNvZGUvcGxhdGZvcm0uaCIgOzsKKysKKysgICopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisrICBlc2FjCisrZG9uZQorKworKworKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKysjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKysjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisrIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KKytpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKysgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisrZmkKKysKKysjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKysjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisrIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKysjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6CisrIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCisrJGRlYnVnIHx8CisreworKyAgdG1wPQorKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KKysgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisrJyAwCisrICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorK30KKysjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKysKKyt7CisrICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKKysgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCisrfSAgfHwKKyt7CisrICB0bXA9Li9jb25mJCQtJFJBTkRPTQorKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCisrfSB8fAorK3sKKysgICAkYXNfZWNobyAiJGFzX21lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH0KKyt9CisrCisrIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgorKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisrIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCisraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKysKKysKKythY19jcj0nCisnCisrYWNfY3NfYXdrX2NyPWAkQVdLICdCRUdJTiB7IHByaW50ICJhXHJiIiB9JyA8L2Rldi9udWxsIDI+L2Rldi9udWxsYAorK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisrICBhY19jc19hd2tfY3I9J1xccicKKytlbHNlCisrICBhY19jc19hd2tfY3I9JGFjX2NyCisrZmkKKysKKytlY2hvICdCRUdJTiB7JyA+IiR0bXAvc3ViczEuYXdrIiAmJgorK19BQ0VPRgorKworKworK3sKKysgIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCisrICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCisrICBlY2hvICJfQUNFT0YiCisrfSA+Y29uZiQkc3Vicy5zaCB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICckJ2AKKythY19kZWxpbT0nJSFfISMgJworK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworKyAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKysgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrCisrICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAorKyAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKysgICAgYnJlYWsKKysgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisrICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgZWxzZQorKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorKyAgZmkKKytkb25lCisrcm0gLWYgY29uZiQkc3Vicy5zaAorKworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2NhdCA+PiJcJHRtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKKytfQUNFT0YKKytzZWQgLW4gJworK2gKKytzL14vU1siLzsgcy8hLiovIl09LworK3AKKytnCisrcy9eW14hXSohLy8KKys6cmVwbAorK3QgcmVwbAorK3MvJyIkYWNfZGVsaW0iJyQvLworK3QgZGVsaW0KKys6bmwKKytoCisrcy9cKC5cezE0OFx9XCkuKi9cMS8KKyt0IG1vcmUxCisrcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworK3AKKytuCisrYiByZXBsCisrOm1vcmUxCisrcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworK3AKKytnCisrcy8uXHsxNDhcfS8vCisrdCBubAorKzpkZWxpbQorK2gKKytzL1woLlx7MTQ4XH1cKS4qL1wxLworK3QgbW9yZTIKKytzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iLworK3AKKytiCisrOm1vcmUyCisrcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworK3AKKytnCisrcy8uXHsxNDhcfS8vCisrdCBkZWxpbQorKycgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKKysvXlteIiJdL3sKKysgIE4KKysgIHMvXG4vLworK30KKysnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisrcm0gLWYgY29uZiQkc3Vicy5hd2sKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKytfQUNBV0sKKytjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKysgIEZTID0gIgciCisrCisrfQorK3sKKysgIGxpbmUgPSAkIDAKKysgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorKyAgc3Vic3RlZCA9IDAKKysgIGxlbiA9IGxlbmd0aChmaWVsZFsxXSkKKysgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKysgICAga2V5ID0gZmllbGRbaV0KKysgICAga2V5bGVuID0gbGVuZ3RoKGtleSkKKysgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKysgICAgICB2YWx1ZSA9IFNba2V5XQorKyAgICAgIGxpbmUgPSBzdWJzdHIobGluZSwgMSwgbGVuKSAiIiB2YWx1ZSAiIiBzdWJzdHIobGluZSwgbGVuICsga2V5bGVuICsgMykKKysgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorKyAgICAgIHN1YnN0ZWQgPSAxCisrICAgIH0gZWxzZQorKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisrICB9CisrCisrICBwcmludCBsaW5lCisrfQorKworK19BQ0FXSworK19BQ0VPRgorK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKytpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCisrZWxzZQorKyAgY2F0CisrZmkgPCAiJHRtcC9zdWJzMS5hd2siID4gIiR0bXAvc3Vicy5hd2siIFwKKysgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorK19BQ0VPRgorKworKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAorKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisrIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKysjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCisraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKysgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworK3MvOipcJChzcmNkaXIpOiovOi8KKytzLzoqXCR7c3JjZGlyfToqLzovCisrcy86KkBzcmNkaXJAOiovOi8KKytzL15cKFtePV0qPVsJIF0qXCk6Ki9cMS8KKytzLzoqJC8vCisrcy9eW149XSo9WwkgXSokLy8KKyt9JworK2ZpCisrCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKysKKysjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KKysjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCisrIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCisraWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorK2NhdCA+IiR0bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAorK0JFR0lOIHsKKytfQUNFT0YKKysKKysjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworKyMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKysjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCisrCisrIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQorKyMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KKythY19kZWxpbT0nJSFfISMgJworK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbworKyAgYWNfdD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCisrICBpZiB0ZXN0IC16ICIkYWNfdCI7IHRoZW4KKysgICAgYnJlYWsKKysgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisrICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICBlbHNlCistICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCistICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCistICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKy0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorKyAgZmkKKytkb25lCisrCisrIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisrIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCisrIyBuZXdsaW5lIHNlcXVlbmNlcy4KKysKKythY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorK3NlZCAtbiAnCisrcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCisrdCByc2V0CisrOnJzZXQKKytzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLworK3QgZGVmCisrZAorKzpkZWYKKytzL1xcJC8vCisrdCBic25sCisrcy9bIlxcXS9cXCYvZworK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorK0RbIlwxIl09IiBcMyIvcAorK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCisrZAorKzpic25sCisrcy9bIlxcXS9cXCYvZworK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorK0RbIlwxIl09IiBcM1xcXFxcXG4iXFwvcAorK3QgY29udAorK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCisrdCBjb250CisrZAorKzpjb250CisrbgorK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZworK3QgY2xlYXIKKys6Y2xlYXIKKytzL1xcJC8vCisrdCBic25sYworK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvcAorK2QKKys6YnNubGMKKytzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXFxcXFxuIlxcL3AKKytiIGNvbnQKKysnIDxjb25mZGVmcy5oIHwgc2VkICcKKytzLyciJGFjX2RlbGltIicvIlxcXAorKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKysKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisrICBGUyA9ICIHIgorK30KKysvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKysgIGxpbmUgPSBcJCAwCisrICBzcGxpdChsaW5lLCBhcmcsICIgIikKKysgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisrICAgIGRlZnVuZGVmID0gYXJnWzJdCisrICAgIG1hYzEgPSBhcmdbM10KKysgIH0gZWxzZSB7CisrICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKKysgICAgbWFjMSA9IGFyZ1syXQorKyAgfQorKyAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQorKyAgbWFjcm8gPSBtYWMyWzFdCisrICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKysgIGlmIChEX2lzX3NldFttYWNyb10pIHsKKysgICAgIyBQcmVzZXJ2ZSB0aGUgd2hpdGUgc3BhY2Ugc3Vycm91bmRpbmcgdGhlICIjIi4KKysgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorKyAgICBuZXh0CisrICB9IGVsc2UgeworKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisrICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKysgICAgIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCisrICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisrICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgorKyAgICAgIG5leHQKKysgICAgfQorKyAgfQorK30KKyt7IHByaW50IH0KKytfQUNBV0sKKytfQUNFT0YKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisrICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisrCisrCisrZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgIgorK3NoaWZ0CisrZm9yIGFjX3RhZworK2RvCisrICBjYXNlICRhY190YWcgaW4KKysgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworKyAgZXNhYworKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KKysgIDpbRkhMXSo6Kik7OworKyAgOkwqIHwgOkMqOiopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHRhZyAkYWNfdGFnIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB0YWcgJGFjX3RhZyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworKyAgOltGSF0tKSBhY190YWc9LTotOzsKKysgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisrICBlc2FjCisrICBhY19zYXZlX0lGUz0kSUZTCisrICBJRlM9OgorKyAgc2V0IHggJGFjX3RhZworKyAgSUZTPSRhY19zYXZlX0lGUworKyAgc2hpZnQKKysgIGFjX2ZpbGU9JDEKKysgIHNoaWZ0CisrCisrICBjYXNlICRhY19tb2RlIGluCisrICA6TCkgYWNfc291cmNlPSQxOzsKKysgIDpbRkhdKQorKyAgICBhY19maWxlX2lucHV0cz0KKysgICAgZm9yIGFjX2YKKysgICAgZG8KKysgICAgICBjYXNlICRhY19mIGluCisrICAgICAgLSkgYWNfZj0iJHRtcC9zdGRpbiI7OworKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisrCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKysJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisrCSB0ZXN0IC1mICIkYWNfZiIgfHwKKysJICAgY2FzZSAkYWNfZiBpbgorKwkgICBbXFwvJF0qKSBmYWxzZTs7CisrCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKysJICAgZXNhYyB8fAorKwkgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworKyAgICAgIGVzYWMKKysgICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCisrICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAnJGFjX2YnIgorKyAgICBkb25lCisrCisrICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisrICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKysgICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKysgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworKwlgJyBieSBjb25maWd1cmUuJworKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisrICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKysgICAgZmkKKysgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKysgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCisrICAgICpcJiogfCAqXHwqIHwgKlxcKiApCisrICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorKyAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKysgICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7CisrICAgIGVzYWMKKysKKysgICAgY2FzZSAkYWNfdGFnIGluCisrICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIiBcCisrICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworKyAgICBlc2FjCisrICAgIDs7CisrICBlc2FjCisrCisrICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKysJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisrCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyskYXNfZWNobyBYIiRhY19maWxlIiB8CisrICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wvXClbXi9dLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIC9eWFwoXC9cL1wpJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wpLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIHMvLiovLi87IHEnYAorKyAgeyBhc19kaXI9IiRhY19kaXIiCisrICBjYXNlICRhc19kaXIgaW4gIygKKysgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKysgIGVzYWMKKysgIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKKysgICAgYXNfZGlycz0KKysgICAgd2hpbGUgOjsgZG8KKysgICAgICBjYXNlICRhc19kaXIgaW4gIygKKysgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKysgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworKyAgICAgIGVzYWMKKysgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CisrJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyskYXNfZWNobyBYIiRhc19kaXIiIHwKKysgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcKFwvXC9cKVteL10uKi97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wvXCkkL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcKFwvXCkuKi97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgcy8uKi8uLzsgcSdgCisrICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKysgICAgZG9uZQorKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisrICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKysgIGFjX2J1aWxkZGlyPS4KKysKKytjYXNlICIkYWNfZGlyIiBpbgorKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKyopCisrICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisrICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisrICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisrICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKysgIGVzYWMgOzsKKytlc2FjCisrYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCisrYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisrYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisrCisrY2FzZSAkc3JjZGlyIGluCisrICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisrICAgIGFjX3NyY2Rpcj0uCisrICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7CisrZXNhYworK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysKKysKKysgIGNhc2UgJGFjX21vZGUgaW4KKysgIDpGKQorKyAgIworKyAgIyBDT05GSUdfRklMRQorKyAgIworKworKyAgY2FzZSAkSU5TVEFMTCBpbgorKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisrICBlc2FjCisrX0FDRU9GCisrCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorKyMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KKysjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KKythY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KKysKKythY19zZWRfZGF0YXJvb3Q9JworKy9kYXRhcm9vdGRpci8geworKyAgcAorKyAgcQorK30KKysvQGRhdGFkaXJAL3AKKysvQGRvY2RpckAvcAorKy9AaW5mb2RpckAvcAorKy9AbG9jYWxlZGlyQC9wCisrL0BtYW5kaXJAL3AKKysnCisrY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKypkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKysqQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KKytfQUNFT0YKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworKyAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKKysgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKysgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisrICBzJkBtYW5kaXJAJiRtYW5kaXImZworKyAgICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworK2VzYWMKKytfQUNFT0YKKysKKysjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisrIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisrIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2FjX3NlZF9leHRyYT0iJGFjX3Zwc3ViCisrJGV4dHJhc3ViCisrX0FDRU9GCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorKzp0CisrL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorK3N8QGNvbmZpZ3VyZV9pbnB1dEB8JGFjX3NlZF9jb25mX2lucHV0fDt0IHQKKytzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKKytzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CisrcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKKytzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0CisrcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorK3MmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CisrcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorK3MmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKKyskYWNfZGF0YXJvb3RkaXJfaGFjaworKyIKKytldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkdG1wL3N1YnMuYXdrIiA+JHRtcC9vdXQgXAorKyAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisrICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCisrd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCisrd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KKysKKysgIHJtIC1mICIkdG1wL3N0ZGluIgorKyAgY2FzZSAkYWNfZmlsZSBpbgorKyAgLSkgY2F0ICIkdG1wL291dCIgJiYgcm0gLWYgIiR0bXAvb3V0Ijs7CisrICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkdG1wL291dCIgIiRhY19maWxlIjs7CisrICBlc2FjIFwKKysgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysgOzsKKysgIDpIKQorKyAgIworKyAgIyBDT05GSUdfSEVBREVSCisrICAjCisrICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisrICAgIHsKKysgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKysgICAgICAmJiBldmFsICckQVdLIC1mICIkdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKysgICAgfSA+IiR0bXAvY29uZmlnLmgiIFwKKysgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJHRtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorKyAgICBlbHNlCisrICAgICAgcm0gLWYgIiRhY19maWxlIgorKyAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKysJfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICBmaQorLSAgICBybSAtZiAkYWNfZmlsZQorLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisrICBlbHNlCisrICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCisrICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgLSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgLSIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgIGZpCistZmk7IGRvbmUKKysgOzsKKysKKyAKKy1FT0YKKy1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKysgIGVzYWMKKysKKytkb25lICMgZm9yIGFjX3RhZworIAorLUVPRgorLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAKKy1leGl0IDAKKy1FT0YKKyt7IChleGl0IDApOyBleGl0IDA7IH0KKytfQUNFT0YKKyBjaG1vZCAreCAkQ09ORklHX1NUQVRVUworLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCistdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisrYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKysKKyt0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHdyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiB3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworKworKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKysjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKysjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisrIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCisraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisrICBhY19jc19zdWNjZXNzPToKKysgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKysgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisrICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorKyAgZXhlYyA1Pi9kZXYvbnVsbAorKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorKyAgZXhlYyA1Pj5jb25maWcubG9nCisrICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisrICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKytmaQorK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KKytmaQorIAorIAorIGlmIHRlc3QgJElDVV9VU0VfVEhSRUFEUyA9IDA7IHRoZW4KK09ubHkgaW4gM18wL2ljdS9zb3VyY2UvZXh0cmEvc2NycHRydW46IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlOiBsaWIKK09ubHkgaW4gM18wL2ljdS9zb3VyY2Uvc2FtcGxlcy9sYXlvdXQ6IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlL3Rlc3QvbGV0ZXN0OiBNYWtlZmlsZQorT25seSBpbiAzXzAvaWN1L3NvdXJjZS90ZXN0L3Rlc3RtYXA6IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlL3Rlc3QvdGhhaXRlc3Q6IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlL3Rlc3QvdGhyZWFkdGVzdDogTWFrZWZpbGUKK09ubHkgaW4gM18wL2ljdS9zb3VyY2UvdG9vbHMvZHVtcGNlOiBNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9wYXRjaC8zXzIgYi9tdWx0aS9jL3BhdGNoLzNfMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODJiNWYzCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvYy9wYXRjaC8zXzIKQEAgLTAsMCArMSwxMjM4NCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorLS0tIDNfMi5vcmlnL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbiAgICAgICAgMjAwOC0xMC0yMCAxNDo1Nzo1Mi4wMDAwMDAwMDAgLTA3MDAKKysrKyAzXzIvaWN1L3NvdXJjZS9jb25maWcvbWgtZGFyd2luICAgICAyMDA4LTEwLTIwIDE1OjU3OjI4LjAwMDAwMDAwMCAtMDcwMAorQEAgLTEzLDggKzEzLDggQEAKKyBMRF9GTEFHUyArPSAtaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzCisgCisgIyMgQ29tbWFuZHMgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlcworLUdFTl9ERVBTLmM9CSQoQ0MpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKy1HRU5fREVQUy5jYz0JJChDWFgpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKytHRU5fREVQUy5jPQllY2hvIAorK0dFTl9ERVBTLmNjPQllY2hvIAorIAorICMjIENvbW1hbmRzIHRvIGNvbXBpbGUKKyBDT01QSUxFLmM9CSQoQ0MpICQoREVGUykgJChDUFBGTEFHUykgJChDRkxBR1MpIC1mbm8tY29tbW9uIC1jCitPbmx5IGluIDNfMC5vcmlnL2ljdS9zb3VyY2U6IGNvbmZpZy5jYWNoZQorT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25maWcubG9nCitkaWZmIC1ydSAzXzAub3JpZy9pY3Uvc291cmNlL2NvbmZpZ3VyZSAzXzAvaWN1L3NvdXJjZS9jb25maWd1cmUKKy0tLSAzXzIub3JpZy9pY3Uvc291cmNlL2NvbmZpZ3VyZQorKysrIDNfMi9pY3Uvc291cmNlL2NvbmZpZ3VyZQorMmQxCis8IAorNCw1YzMKKzwgIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCis8ICMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy0tLQorPiAjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42My4KKzZhNSw2Cis+ICMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorPiAjIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCis4YTksNTcxCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworPiAjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKz4gIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCis+IAorPiAjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKKz4gRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorPiBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKz4gICBlbXVsYXRlIHNoCis+ICAgTlVMTENNRD06Cis+ICAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCis+ICAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKz4gICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKz4gICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorPiBlbHNlCis+ICAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCis+ICAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Cis+IGVzYWMKKz4gCis+IGZpCis+IAorPiAKKz4gCis+IAorPiAjIFBBVEggbmVlZHMgQ1IKKz4gIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorPiBhc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKz4gYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCis+IGFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworPiBhc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCis+IGFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworPiAKKz4gYXNfbmw9JworPiAnCis+IGV4cG9ydCBhc19ubAorPiAjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorPiBhc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworPiBhc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKz4gYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKz4gaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKz4gICBhc19lY2hvPSdwcmludGYgJXNcbicKKz4gICBhc19lY2hvX249J3ByaW50ZiAlcycKKz4gZWxzZQorPiAgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorPiAgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKz4gICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKz4gICBlbHNlCis+ICAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworPiAgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKz4gICAgICAgYXJnPSQxOworPiAgICAgICBjYXNlICRhcmcgaW4KKz4gICAgICAgKiIkYXNfbmwiKikKKz4gCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworPiAJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKz4gICAgICAgZXNhYzsKKz4gICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorPiAgICAgJworPiAgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5Cis+ICAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworPiAgIGZpCis+ICAgZXhwb3J0IGFzX2VjaG9fYm9keQorPiAgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKKz4gZmkKKz4gCis+ICMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgorPiBpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorPiAgIFBBVEhfU0VQQVJBVE9SPToKKz4gICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7Cis+ICAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorPiAgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKz4gICB9Cis+IGZpCis+IAorPiAjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KKz4gaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgYXNfdW5zZXQ9dW5zZXQKKz4gZWxzZQorPiAgIGFzX3Vuc2V0PWZhbHNlCis+IGZpCis+IAorPiAKKz4gIyBJRlMKKz4gIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKz4gIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCis+ICMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorPiAjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCis+IElGUz0iICIiCSRhc19ubCIKKz4gCis+ICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCis+IGNhc2UgJDAgaW4KKz4gICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Cis+ICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorPiAgICAgIDs7Cis+IGVzYWMKKz4gIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworPiAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKz4gaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorPiAgIGFzX215c2VsZj0kMAorPiBmaQorPiBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCis+ICAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKz4gICB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gZmkKKz4gCis+ICMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorPiBmb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICis+IGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCis+IGRvbmUKKz4gUFMxPSckICcKKz4gUFMyPSc+ICcKKz4gUFM0PScrICcKKz4gCis+ICMgTkxTIG51aXNhbmNlcy4KKz4gTENfQUxMPUMKKz4gZXhwb3J0IExDX0FMTAorPiBMQU5HVUFHRT1DCis+IGV4cG9ydCBMQU5HVUFHRQorPiAKKz4gIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCis+IGlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCis+ICAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCis+ICAgYXNfZXhwcj1leHByCis+IGVsc2UKKz4gICBhc19leHByPWZhbHNlCis+IGZpCis+IAorPiBpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCis+ICAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKKz4gZWxzZQorPiAgIGFzX2Jhc2VuYW1lPWZhbHNlCis+IGZpCis+IAorPiAKKz4gIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorPiBhc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKz4gJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKz4gCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorPiAkYXNfZWNobyBYLyIkMCIgfAorPiAgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwvXChcL1wvXCkkL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgL15YXC9cKFwvXCkuKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIHMvLiovLi87IHEnYAorPiAKKz4gIyBDRFBBVEguCis+ICRhc191bnNldCBDRFBBVEgKKz4gCis+IAorPiBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCis+ICAgaWYgKGV2YWwgIjoiKSAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCis+IGVsc2UKKz4gICBhc19oYXZlX3JlcXVpcmVkPW5vCis+IGZpCis+IAorPiAgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSB5ZXMgJiYJIChldmFsICI6Cis+IChhc19mdW5jX3JldHVybiAoKSB7Cis+ICAgKGV4aXQgXCQxKQorPiB9Cis+IGFzX2Z1bmNfc3VjY2VzcyAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMAorPiB9Cis+IGFzX2Z1bmNfZmFpbHVyZSAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMQorPiB9Cis+IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworPiAgIHJldHVybiAwCis+IH0KKz4gYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Cis+ICAgcmV0dXJuIDEKKz4gfQorPiAKKz4gZXhpdGNvZGU9MAorPiBpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCis+ICAgZXhpdGNvZGU9MQorPiAgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCis+IGZpCis+IAorPiB0ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gCis+ICgKKz4gICBhc19saW5lbm9fMT1cJExJTkVOTworPiAgIGFzX2xpbmVub18yPVwkTElORU5PCis+ICAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCis+ICAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gIikgMj4gL2Rldi9udWxsOyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgYXNfY2FuZGlkYXRlX3NoZWxscz0KKz4gICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGNhc2UgJGFzX2RpciBpbgorPiAJIC8qKQorPiAJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworPiAJICAgICBhc19jYW5kaWRhdGVfc2hlbGxzPSIkYXNfY2FuZGlkYXRlX3NoZWxscyAkYXNfZGlyLyRhc19iYXNlIgorPiAJICAgZG9uZTs7Cis+ICAgICAgICBlc2FjCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gCis+ICAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCis+IAkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorPiAJIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorPiAJCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCis+IGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGVtdWxhdGUgc2gKKz4gICBOVUxMQ01EPToKKz4gICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKz4gICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorPiAgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworPiAgIHNldG9wdCBOT19HTE9CX1NVQlNUCis+IGVsc2UKKz4gICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKz4gICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKKz4gZXNhYworPiAKKz4gZmkKKz4gCis+IAorPiA6Cis+IF9BU0VPRgorPiB9OyB0aGVuCis+ICAgQ09ORklHX1NIRUxMPSRhc19zaGVsbAorPiAJICAgICAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCis+IAkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCis+IGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGVtdWxhdGUgc2gKKz4gICBOVUxMQ01EPToKKz4gICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKz4gICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorPiAgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworPiAgIHNldG9wdCBOT19HTE9CX1NVQlNUCis+IGVsc2UKKz4gICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKz4gICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKKz4gZXNhYworPiAKKz4gZmkKKz4gCis+IAorPiA6Cis+IChhc19mdW5jX3JldHVybiAoKSB7Cis+ICAgKGV4aXQgJDEpCis+IH0KKz4gYXNfZnVuY19zdWNjZXNzICgpIHsKKz4gICBhc19mdW5jX3JldHVybiAwCis+IH0KKz4gYXNfZnVuY19mYWlsdXJlICgpIHsKKz4gICBhc19mdW5jX3JldHVybiAxCis+IH0KKz4gYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Cis+ICAgcmV0dXJuIDAKKz4gfQorPiBhc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKz4gICByZXR1cm4gMQorPiB9Cis+IAorPiBleGl0Y29kZT0wCis+IGlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCis+IGZpCis+IAorPiBpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgorPiBmaQorPiAKKz4gaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9ICIkMSIgKTsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KKz4gZmkKKz4gCis+IHRlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cis+IAorPiAoCis+ICAgYXNfbGluZW5vXzE9JExJTkVOTworPiAgIGFzX2xpbmVub18yPSRMSU5FTk8KKz4gICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKz4gICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gCis+IF9BU0VPRgorPiB9OyB0aGVuCis+ICAgYnJlYWsKKz4gZmkKKz4gCis+IGZpCis+IAorPiAgICAgICBkb25lCis+IAorPiAgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgorPiAgIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCis+IAlkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorPiAJZG9uZQorPiAJZXhwb3J0IENPTkZJR19TSEVMTAorPiAJZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQorPiBmaQorPiAKKz4gCis+ICAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KKz4gICBlY2hvIFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwgdGhlCis+ICAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKKz4gICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQorPiAgICAgICBlY2hvIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4KKz4gICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cis+IGZpCis+IAorPiAKKz4gZmkKKz4gCis+IGZpCis+IAorPiAKKz4gCis+IChldmFsICJhc19mdW5jX3JldHVybiAoKSB7Cis+ICAgKGV4aXQgXCQxKQorPiB9Cis+IGFzX2Z1bmNfc3VjY2VzcyAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMAorPiB9Cis+IGFzX2Z1bmNfZmFpbHVyZSAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMQorPiB9Cis+IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworPiAgIHJldHVybiAwCis+IH0KKz4gYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Cis+ICAgcmV0dXJuIDEKKz4gfQorPiAKKz4gZXhpdGNvZGU9MAorPiBpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCis+ICAgZXhpdGNvZGU9MQorPiAgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCis+IGZpCis+IAorPiB0ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgeworPiAgIGVjaG8gTm8gc2hlbGwgZm91bmQgdGhhdCBzdXBwb3J0cyBzaGVsbCBmdW5jdGlvbnMuCis+ICAgZWNobyBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKKz4gICBlY2hvIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzIG1lc3NhZ2UuCis+ICAgZWNobyBUaGlzIGNhbiBoZWxwIHVzIGltcHJvdmUgZnV0dXJlIGF1dG9jb25mIHZlcnNpb25zLgorPiAgIGVjaG8gQ29uZmlndXJhdGlvbiB3aWxsIG5vdyBwcm9jZWVkIHdpdGhvdXQgc2hlbGwgZnVuY3Rpb25zLgorPiB9Cis+IAorPiAKKz4gCis+ICAgYXNfbGluZW5vXzE9JExJTkVOTworPiAgIGFzX2xpbmVub18yPSRMSU5FTk8KKz4gICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKz4gICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKKz4gCis+ICAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworPiAgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKKz4gICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKKz4gICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAorPiAgICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKKz4gICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCis+ICAgIyBjYXNlIGF0IGxpbmUgZW5kLgorPiAgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorPiAgICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQorPiAgICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCis+ICAgc2VkIC1uICcKKz4gICAgIHAKKz4gICAgIC9bJF1MSU5FTk8vPQorPiAgICcgPCRhc19teXNlbGYgfAorPiAgICAgc2VkICcKKz4gICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKz4gICAgICAgdCBsaW5lbm8KKz4gICAgICAgYgorPiAgICAgICA6bGluZW5vCis+ICAgICAgIE4KKz4gICAgICAgOmxvb3AKKz4gICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCis+ICAgICAgIHQgbG9vcAorPiAgICAgICBzLy1cbi4qLy8KKz4gICAgICcgPiRhc19tZS5saW5lbm8gJiYKKz4gICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiAgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCis+ICAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCis+ICAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKz4gICAuICIuLyRhc19tZS5saW5lbm8iCis+ICAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCis+ICAgZXhpdAorPiB9Cis+IAorPiAKKz4gaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgYXNfZGlybmFtZT1kaXJuYW1lCis+IGVsc2UKKz4gICBhc19kaXJuYW1lPWZhbHNlCis+IGZpCis+IAorPiBFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorPiBjYXNlIGBlY2hvIC1uIHhgIGluCis+IC1uKikKKz4gICBjYXNlIGBlY2hvICd4XGMnYCBpbgorPiAgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorPiAgICopICAgRUNIT19DPSdcYyc7OworPiAgIGVzYWM7OworPiAqKQorPiAgIEVDSE9fTj0nLW4nOzsKKz4gZXNhYworPiBpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorPiAgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorPiAgIGFzX2V4cHI9ZXhwcgorPiBlbHNlCis+ICAgYXNfZXhwcj1mYWxzZQorPiBmaQorPiAKKz4gcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKz4gaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCis+ICAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorPiBlbHNlCis+ICAgcm0gLWYgY29uZiQkLmRpcgorPiAgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKz4gZmkKKz4gaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorPiAgICAgYXNfbG5fcz0nbG4gLXMnCis+ICAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorPiAgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKz4gICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorPiAgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKz4gICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKz4gICAgICAgYXNfbG5fcz0nY3AgLXAnCis+ICAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKz4gICAgIGFzX2xuX3M9bG4KKz4gICBlbHNlCis+ICAgICBhc19sbl9zPSdjcCAtcCcKKz4gICBmaQorPiBlbHNlCis+ICAgYXNfbG5fcz0nY3AgLXAnCis+IGZpCis+IHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKKz4gcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorPiAKKz4gaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGFzX21rZGlyX3A9OgorPiBlbHNlCis+ICAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKz4gICBhc19ta2Rpcl9wPWZhbHNlCis+IGZpCis+IAorPiBpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgYXNfdGVzdF94PSd0ZXN0IC14JworPiBlbHNlCis+ICAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgICBhc19sc19MX29wdGlvbj1MCis+ICAgZWxzZQorPiAgICAgYXNfbHNfTF9vcHRpb249Cis+ICAgZmkKKz4gICBhc190ZXN0X3g9JworPiAgICAgZXZhbCBzaCAtYyAnXCcnCis+ICAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorPiAJdGVzdCAtZCAiJDEvLiI7Cis+ICAgICAgIGVsc2UKKz4gCWNhc2UgJDEgaW4KKz4gCS0qKXNldCAiLi8kMSI7OworPiAJZXNhYzsKKz4gCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCis+IAk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCis+ICAgICAnXCcnIHNoCis+ICAgJworPiBmaQorPiBhc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorPiAKKz4gIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorPiBhc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorPiAKKz4gIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCis+IGFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCis+IAorMTAsMTFjNTczLDU4MworPCAjIERlZmF1bHRzOgorPCBhY19oZWxwPQorLS0tCis+IAorPiBleGVjIDc8JjAgPC9kZXYvbnVsbCA2PiYxCis+IAorPiAjIE5hbWUgb2YgdGhlIGhvc3QuCis+ICMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCis+ICMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorPiBhY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKz4gCis+ICMKKz4gIyBJbml0aWFsaXphdGlvbnMuCis+ICMKKzEzLDUyYzU4NSw4MTAKKzwgIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXN0cmljdCAgICAgICAgIGNvbXBpbGUgd2l0aCBzdHJpY3QgY29tcGlsZXIgb3B0aW9ucyBbZGVmYXVsdD1ub10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtNjRiaXQtbGlicyAgICAgYnVpbGQgNjQtYml0IGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXNoYXJlZCAgICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgICAtLWVuYWJsZS1zdGF0aWMgICAgICAgICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgICAtLWVuYWJsZS1kZWJ1ZyAgICAgICAgICBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMgW2RlZmF1bHQ9bm9dIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXJlbGVhc2UgICAgICAgIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtcmVuYW1pbmcgICAgICAgYWRkIGEgdmVyc2lvbiBzdWZmaXggdG8gc3ltYm9scyBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXRyYWNpbmcgICAgICAgIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIFtkZWZhdWx0PXllc10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtcnBhdGggICAgICAgICAgdXNlIHJwYXRoIHdoZW4gbGlua2luZyBbZGVmYXVsdCBpcyBvbmx5IGlmIG5lY2Vzc2FyeV0iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtdGhyZWFkcyAgICAgICAgYnVpbGQgSUNVIHdpdGggdGhyZWFkIHNhZmV0eSBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0td2l0aC1pb3N0cmVhbT12ZXJzaW9uIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgaW9zdHJlYW0gdG8gdXNlIChub25lLCBvbGQsIHN0ZCwgYXV0bykgW2RlZmF1bHQ9YXV0b10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtZXh0cmFzICAgICAgICAgYnVpbGQgSUNVIGV4dHJhcyBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLWljdWlvICAgICAgICAgIGJ1aWxkIElDVSdzIGljdWlvIGxpYnJhcnkgW2RlZmF1bHQ9eWVzXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgICAtLWVuYWJsZS1sYXlvdXQgICAgICAgICBidWlsZCBJQ1UncyBsYXlvdXQgbGlicmFyeSBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0td2l0aC1kYXRhLXBhY2thZ2luZz10eXBlIHNwZWNpZnkgaG93IHRvIHBhY2thZ2UgSUNVIGRhdGEgKGZpbGVzLCBhcmNoaXZlLCBsaWJyYXJ5LCBhdXRvKSBbZGVmYXVsdD1hdXRvXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0td2l0aC1saWJyYXJ5LXN1ZmZpeD1zdWZmaXggICAgdGFnIGEgc3VmZml4IHRvIHRoZSBsaWJyYXJ5IG5hbWVzIFtkZWZhdWx0PV0iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtdGVzdHMgICAgICAgICAgYnVpbGQgSUNVIHRlc3RzIFtkZWZhdWx0PXllc10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtc2FtcGxlcyAgICAgICAgYnVpbGQgSUNVIHNhbXBsZXMgW2RlZmF1bHQ9eWVzXSAgCis8IEFkZGl0aW9uYWxseSwgdGhlIHZhcmlhYmxlIEZPUkNFX0xJQlMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyBjb25maWd1cmUuIElmIHNldCwgaXQgd2lsbCBSRVBMQUNFIGFueSBhdXRvbWF0aWMgbGlzdCBvZiBsaWJyYXJpZXMuIgorLS0tCis+IGFjX2NsZWFuX2ZpbGVzPQorPiBhY19jb25maWdfbGlib2JqX2Rpcj0uCis+IExJQk9CSlM9Cis+IGNyb3NzX2NvbXBpbGluZz1ubworPiBzdWJkaXJzPQorPiBNRkxBR1M9Cis+IE1BS0VGTEFHUz0KKz4gU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKz4gCis+ICMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgorPiBQQUNLQUdFX05BTUU9Cis+IFBBQ0tBR0VfVEFSTkFNRT0KKz4gUEFDS0FHRV9WRVJTSU9OPQorPiBQQUNLQUdFX1NUUklORz0KKz4gUEFDS0FHRV9CVUdSRVBPUlQ9Cis+IAorPiBhY191bmlxdWVfZmlsZT0iY29tbW9uL3VuaWNvZGUvdXR5cGVzLmgiCis+ICMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KKz4gYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorPiAjaW5jbHVkZSA8c3RkaW8uaD4KKz4gI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKz4gIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKz4gI2VuZGlmCis+ICNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKz4gIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIFNURENfSEVBREVSUworPiAjIGluY2x1ZGUgPHN0ZGxpYi5oPgorPiAjIGluY2x1ZGUgPHN0ZGRlZi5oPgorPiAjZWxzZQorPiAjIGlmZGVmIEhBVkVfU1RETElCX0gKKz4gIyAgaW5jbHVkZSA8c3RkbGliLmg+Cis+ICMgZW5kaWYKKz4gI2VuZGlmCis+ICNpZmRlZiBIQVZFX1NUUklOR19ICis+ICMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorPiAjICBpbmNsdWRlIDxtZW1vcnkuaD4KKz4gIyBlbmRpZgorPiAjIGluY2x1ZGUgPHN0cmluZy5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIEhBVkVfU1RSSU5HU19ICis+ICMgaW5jbHVkZSA8c3RyaW5ncy5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorPiAjIGluY2x1ZGUgPGludHR5cGVzLmg+Cis+ICNlbmRpZgorPiAjaWZkZWYgSEFWRV9TVERJTlRfSAorPiAjIGluY2x1ZGUgPHN0ZGludC5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIEhBVkVfVU5JU1REX0gKKz4gIyBpbmNsdWRlIDx1bmlzdGQuaD4KKz4gI2VuZGlmIgorPiAKKz4gYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpTCis+IExJQk9CSlMKKz4gQUlYX1NITElCCis+IGxkX3JwYXRoX3N1ZgorPiBwbGF0Zm9ybV9tYWtlX2ZyYWdtZW50Cis+IHBsYXRmb3JtX21ha2VfZnJhZ21lbnRfbmFtZQorPiBwbGF0Zm9ybQorPiBJQ1VEQVRBX0NIQVIKKz4gU0FNUExFU19UUlVFCis+IFRFU1RTX1RSVUUKKz4gSUNVTElCU1VGRklYQ05BTUUKKz4gVV9IQVZFX0xJQl9TVUZGSVgKKz4gSUNVTElCU1VGRklYCis+IERBVEFfUEFDS0FHSU5HX01PREUKKz4gREFUQV9QQUNLQUdJTkdfQ1BQRkxBR1MKKz4gdGhlcGtnaWN1ZGF0YWRpcgorPiBwa2dpY3VkYXRhZGlyCis+IHRoZWxpYmRpcgorPiB0aGVkYXRhZGlyCis+IHRoZXN5c2NvbmZkaXIKKz4gTEFZT1VUX1RSVUUKKz4gSUNVSU9fVFJVRQorPiBFWFRSQVNfVFJVRQorPiBVX1NJWkVPRl9XQ0hBUl9UCis+IFVfSEFWRV9XQ1NDUFkKKz4gVV9IQVZFX1dDSEFSX0gKKz4gSEFWRV9VSU5UNjRfVAorPiBIQVZFX0lOVDY0X1QKKz4gSEFWRV9VSU5UMzJfVAorPiBIQVZFX0lOVDMyX1QKKz4gSEFWRV9VSU5UMTZfVAorPiBIQVZFX0lOVDE2X1QKKz4gSEFWRV9VSU5UOF9UCis+IEhBVkVfSU5UOF9UCis+IFVfVElNRVpPTkUKKz4gVV9IQVZFX1RJTUVaT05FCis+IFVfVFpOQU1FCis+IFVfSEFWRV9UWk5BTUUKKz4gVV9UWlNFVAorPiBVX0hBVkVfVFpTRVQKKz4gVV9IQVZFX1BPUEVOCis+IFVfSEFWRV9QTEFDRU1FTlRfTkVXCis+IFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT04KKz4gVV9IQVZFX05BTUVTUEFDRQorPiBVX05MX0xBTkdJTkZPX0NPREVTRVQKKz4gVV9IQVZFX05MX0xBTkdJTkZPX0NPREVTRVQKKz4gVV9IQVZFX05MX0xBTkdJTkZPCis+IFVfSVNfQklHX0VORElBTgorPiBVX0lPU1RSRUFNX1NPVVJDRQorPiBDWFhDUFAKKz4gVV9IQVZFX0lOVFRZUEVTX0gKKz4gRUdSRVAKKz4gR1JFUAorPiBDUFAKKz4gR0VOQ0NPREVfQVNTRU1CTFkKKz4gSEFWRV9NTUFQCis+IElDVV9VU0VfVEhSRUFEUworPiBUSFJFQURTX1RSVUUKKz4gVV9JTkxJTkUKKz4gRU5BQkxFX1JQQVRICis+IFVfRU5BQkxFX1RSQUNJTkcKKz4gVV9ESVNBQkxFX1JFTkFNSU5HCis+IEFSCis+IFJBTkxJQgorPiBFTkFCTEVfUkVMRUFTRQorPiBFTkFCTEVfREVCVUcKKz4gRU5BQkxFX1NUQVRJQworPiBFTkFCTEVfU0hBUkVECis+IExJQl9NCis+IENPTVBJTEVfTElOS19FTlZWQVIKKz4gQVJGTEFHUworPiBob3N0X29zCis+IGhvc3RfdmVuZG9yCis+IGhvc3RfY3B1Cis+IGhvc3QKKz4gYnVpbGRfb3MKKz4gYnVpbGRfdmVuZG9yCis+IGJ1aWxkX2NwdQorPiBidWlsZAorPiBET1hZR0VOCis+IFVfTUFLRQorPiBTVFJJUAorPiBJTlNUQUxMX0RBVEEKKz4gSU5TVEFMTF9TQ1JJUFQKKz4gSU5TVEFMTF9QUk9HUkFNCis+IGFjX2N0X0NYWAorPiBDWFhGTEFHUworPiBDWFgKKz4gT0JKRVhUCis+IEVYRUVYVAorPiBhY19jdF9DQworPiBMREZMQUdTCis+IENGTEFHUworPiBDQworPiBDUFBGTEFHUworPiBVTklDT0RFX1ZFUlNJT04KKz4gTElCX1ZFUlNJT05fTUFKT1IKKz4gTElCX1ZFUlNJT04KKz4gVkVSU0lPTgorPiBQQUNLQUdFCis+IHRhcmdldF9hbGlhcworPiBob3N0X2FsaWFzCis+IGJ1aWxkX2FsaWFzCis+IExJQlMKKz4gRUNIT19UCis+IEVDSE9fTgorPiBFQ0hPX0MKKz4gREVGUworPiBtYW5kaXIKKz4gbG9jYWxlZGlyCis+IGxpYmRpcgorPiBwc2RpcgorPiBwZGZkaXIKKz4gZHZpZGlyCis+IGh0bWxkaXIKKz4gaW5mb2RpcgorPiBkb2NkaXIKKz4gb2xkaW5jbHVkZWRpcgorPiBpbmNsdWRlZGlyCis+IGxvY2Fsc3RhdGVkaXIKKz4gc2hhcmVkc3RhdGVkaXIKKz4gc3lzY29uZmRpcgorPiBkYXRhZGlyCis+IGRhdGFyb290ZGlyCis+IGxpYmV4ZWNkaXIKKz4gc2JpbmRpcgorPiBiaW5kaXIKKz4gcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorPiBwcmVmaXgKKz4gZXhlY19wcmVmaXgKKz4gUEFDS0FHRV9CVUdSRVBPUlQKKz4gUEFDS0FHRV9TVFJJTkcKKz4gUEFDS0FHRV9WRVJTSU9OCis+IFBBQ0tBR0VfVEFSTkFNRQorPiBQQUNLQUdFX05BTUUKKz4gUEFUSF9TRVBBUkFUT1IKKz4gU0hFTEwnCis+IGFjX3N1YnN0X2ZpbGVzPScnCis+IGFjX3VzZXJfb3B0cz0nCis+IGVuYWJsZV9vcHRpb25fY2hlY2tpbmcKKz4gZW5hYmxlX3N0cmljdAorPiBlbmFibGVfNjRiaXRfbGlicworPiBlbmFibGVfc2hhcmVkCis+IGVuYWJsZV9zdGF0aWMKKz4gZW5hYmxlX2RlYnVnCis+IGVuYWJsZV9yZWxlYXNlCis+IGVuYWJsZV9yZW5hbWluZworPiBlbmFibGVfdHJhY2luZworPiBlbmFibGVfcnBhdGgKKz4gZW5hYmxlX3RocmVhZHMKKz4gd2l0aF9pb3N0cmVhbQorPiBlbmFibGVfZXh0cmFzCis+IGVuYWJsZV9sYXlvdXQKKz4gd2l0aF9kYXRhX3BhY2thZ2luZworPiBlbmFibGVfbWFwcGVkCis+IHdpdGhfbGlicmFyeV9zdWZmaXgKKz4gZW5hYmxlX3Rlc3RzCis+IGVuYWJsZV9zYW1wbGVzCis+ICcKKz4gICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKKz4gaG9zdF9hbGlhcworPiB0YXJnZXRfYWxpYXMKKz4gQ0MKKz4gQ0ZMQUdTCis+IExERkxBR1MKKz4gTElCUworPiBDUFBGTEFHUworPiBDWFgKKz4gQ1hYRkxBR1MKKz4gQ0NDCis+IENQUAorPiBDWFhDUFAnCis+IAorNTRhODEzLDgxNgorPiBhY19pbml0X2hlbHA9Cis+IGFjX2luaXRfdmVyc2lvbj1mYWxzZQorPiBhY191bnJlY29nbml6ZWRfb3B0cz0KKz4gYWNfdW5yZWNvZ25pemVkX3NlcD0KKzU3LDU4YzgxOQorPCBidWlsZD1OT05FCis8IGNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKKy0tLQorPiBjYWNoZV9maWxlPS9kZXYvbnVsbAorNjBkODIwCis8IGhvc3Q9Tk9ORQorNjJkODIxCis8IG5vbm9wdD1OT05FCis3MWQ4MjkKKzwgdGFyZ2V0PU5PTkUKKzc0YTgzMyw4MzkKKz4gCis+ICMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorPiAjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKz4gIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKz4gIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorPiAjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorPiAjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCis3OGM4NDMsODQ0Cis8IGRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKKy0tLQorPiBkYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJworPiBkYXRhZGlyPScke2RhdGFyb290ZGlyfScKKzgyZDg0NworPCBsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKKzg1LDkzYzg1MCw4NTgKKzwgaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCis8IG1hbmRpcj0nJHtwcmVmaXh9L21hbicKKzwgCis8ICMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KKzwgc3ViZGlycz0KKzwgTUZMQUdTPSBNQUtFRkxBR1M9Cis8IFNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Cis8ICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KKzwgYWNfbWF4X2hlcmVfbGluZXM9MTIKKy0tLQorPiBkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0V9JworPiBpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworPiBodG1sZGlyPScke2RvY2Rpcn0nCis+IGR2aWRpcj0nJHtkb2NkaXJ9JworPiBwZGZkaXI9JyR7ZG9jZGlyfScKKz4gcHNkaXI9JyR7ZG9jZGlyfScKKz4gbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCis+IGxvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworPiBtYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKzk1YTg2MQorPiBhY19kYXNoZGFzaD0KKzk4ZDg2MworPCAKKzEwMWM4NjYKKzwgICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorLS0tCis+ICAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisxMDYsMTA4Yzg3MSw4NzMKKzwgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorPCAgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworPCAgICopIGFjX29wdGFyZz0gOzsKKy0tLQorPiAgIGNhc2UgJGFjX29wdGlvbiBpbgorPiAgICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKKz4gICAqKQlhY19vcHRhcmc9eWVzIDs7CisxMTNjODc4LDg4MAorPCAgIGNhc2UgIiRhY19vcHRpb24iIGluCistLS0KKz4gICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKz4gICAtLSkKKz4gICAgIGFjX2Rhc2hkYXNoPXllcyA7OworMTE4Yzg4NQorPCAgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworMTIxYzg4OAorPCAgICAgYWNfcHJldj1idWlsZCA7OworLS0tCis+ICAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisxMjNjODkwCis8ICAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworMTMwYzg5Nyw5MDAKKzwgICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworPiAKKz4gICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorPiAgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKzEzMmM5MDIKKzwgICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKy0tLQorPiAgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQorMTM0LDEzNmM5MDQsOTEyCis8ICAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCis8ICAgfCAtLWRhPSopCis8ICAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKKz4gICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworPiAKKz4gICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKKz4gICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKz4gICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKz4gICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCis+ICAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCis+ICAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisxMzljOTE1Cis8ICAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCistLS0KKz4gICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisxNDEsMTQ1YzkxNyw5MzkKKzwgICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorPCAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgICBmaQorPCAgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKzwgICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworLS0tCis+ICAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorPiAgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorPiAgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCis+ICAgICAgICoiCis+ICJlbmFibGVfJGFjX3VzZXJvcHQiCis+ICIqKSA7OworPiAgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKz4gCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworPiAgICAgZXNhYworPiAgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKz4gCis+ICAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKz4gICAgIGFjX3ByZXY9ZG9jZGlyIDs7Cis+ICAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCis+ICAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworPiAKKz4gICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQorPiAgICAgYWNfcHJldj1kdmlkaXIgOzsKKz4gICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorPiAgICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKKzE0OGM5NDIKKzwgICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKy0tLQorPiAgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorMTUwLDE1NmM5NDQsOTU0Cis8ICAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKzwgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorPCAgICAgZmkKKzwgICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCis8ICAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorPCAgICAgICAqPSopIDs7Cis8ICAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKy0tLQorPiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKz4gICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKz4gICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorPiAgICAgICAqIgorPiAiZW5hYmxlXyRhY191c2Vyb3B0IgorPiAiKikgOzsKKz4gICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKz4gCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworMTU4Yzk1NgorPCAgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworLS0tCis+ICAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworMTY3Yzk2NQorPCAgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKzE3MywyMjZjOTcxLDk3NgorPCAgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorPCAgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCis8ICAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCis8ICAgICBjYXQgPDwgRU9GCis8IFVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorPCBPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorPCBDb25maWd1cmF0aW9uOgorPCAgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCis8ICAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCis8ICAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKzwgICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKzwgICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCis8IERpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKzwgICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKzwgICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorPCAgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCis8ICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorPCAgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKzwgICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCis8ICAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKzwgICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCis8ICAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKzwgICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCis8ICAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKzwgICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKzwgICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorPCAgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorPCAgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCis8ICAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCis8ICAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCis8ICAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorPCAgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorPCAgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCis8ICAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworPCAgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCis8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCis8IEVPRgorPCAgICAgY2F0IDw8IEVPRgorPCBIb3N0IHR5cGU6Cis8ICAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKzwgICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCis8ICAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorPCBGZWF0dXJlcyBhbmQgcGFja2FnZXM6Cis8ICAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorPCAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKzwgICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKzwgICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCis8ICAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKzwgICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorPCBFT0YKKzwgICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorPCAgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKzwgICAgIGZpCis8ICAgICBleGl0IDAgOzsKKy0tLQorPiAgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCis+ICAgICBhY19pbml0X2hlbHA9bG9uZyA7OworPiAgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKz4gICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKz4gICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCis+ICAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKzIyOWM5NzkKKzwgICAgIGFjX3ByZXY9aG9zdCA7OworLS0tCis+ICAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKzIzMWM5ODEsOTg3Cis8ICAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKz4gCis+ICAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCis+ICAgICBhY19wcmV2PWh0bWxkaXIgOzsKKz4gICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKKz4gICB8IC0taHQ9KikKKz4gICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworMjM4Yzk5NAorPCAgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisyNDNjOTk5Cis8ICAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKzI0OGMxMDA0Cis8ICAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisyNTVjMTAxMSwxMDE2Cis8ICAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKz4gCis+ICAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorPiAgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKz4gICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQorPiAgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKzI1OCwyNTljMTAxOQorPCAgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKzwgICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKy0tLQorPiAgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCisyNjIsMjY0YzEwMjIsMTAyMworPCAgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorPCAgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKzwgICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKKz4gICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworMjY5YzEwMjgKKzwgICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKzI3NmMxMDM1Cis8ICAgfCAtLW5vLWNyIHwgLS1uby1jKQorLS0tCis+ICAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCisyOTBjMTA0OQorPCAgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisyOTVjMTA1NAorPCAgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworMzAyYzEwNjEKKzwgICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CiszMDljMTA2OAorPCAgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKzMyNmMxMDg1LDEwOTUKKzwgICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworPiAKKz4gICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorPiAgICAgYWNfcHJldj1wZGZkaXIgOzsKKz4gICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQorPiAgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKz4gCis+ICAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKKz4gICAgIGFjX3ByZXY9cHNkaXIgOzsKKz4gICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKz4gICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKKzMzNmMxMTA1Cis8ICAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKKzM0N2MxMTE2Cis8ICAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OworMzUyYzExMjEKKzwgICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIHNpdGU9JGFjX29wdGFyZyA7OworMzU3YzExMjYKKzwgICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKzM2NGMxMTMzCis8ICAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKzM2N2MxMTM2Cis8ICAgICBhY19wcmV2PXRhcmdldCA7OworLS0tCis+ICAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworMzY5YzExMzgKKzwgICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKzM3NCwzNzZjMTE0MywxMTQ0Cis8ICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCis8ICAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKzwgICAgIGV4aXQgMCA7OworLS0tCis+ICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKz4gICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CiszNzljMTE0NworPCAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKy0tLQorPiAgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKzM4MSwzODdjMTE0OSwxMTU5Cis8ICAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKzwgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorPCAgICAgZmkKKzwgICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCis8ICAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorPCAgICAgICAqPSopIDs7Cis8ICAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKy0tLQorPiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKz4gICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKz4gICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorPiAgICAgICAqIgorPiAid2l0aF8kYWNfdXNlcm9wdCIKKz4gIiopIDs7Cis+ICAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorPiAJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CiszODljMTE2MQorPCAgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKy0tLQorPiAgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CiszOTJjMTE2NAorPCAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorLS0tCis+ICAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorMzk0LDM5OGMxMTY2LDExNzgKKzwgICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorPCAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgICBmaQorPCAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKzwgICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKy0tLQorPiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKz4gICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKz4gICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorPiAgICAgICAqIgorPiAid2l0aF8kYWNfdXNlcm9wdCIKKz4gIiopIDs7Cis+ICAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorPiAJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Cis+ICAgICBlc2FjCis+ICAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKzQwOWMxMTg5Cis8ICAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKzQxNmMxMTk2Cis8ICAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworNDE4YzExOTgsMTIwMAorPCAgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+ICAgLSopIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICRhY19vcHRpb24KKz4gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzQyMGExMjAzLDEyMTEKKz4gICAqPSopCis+ICAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCis+ICAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCis+ICAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCis+ICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCis+ICAgICBleHBvcnQgJGFjX2VudnZhciA7OworPiAKKzQyMiw0MjhjMTIxMywxMjE3Cis8ICAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorPCAgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCis8ICAgICBmaQorPCAgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCis8ICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorPCAgICAgZmkKKzwgICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKy0tLQorPiAgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCis+ICAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgorPiAgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorNDM1YzEyMjQsMTIyNgorPCAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+ICAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDM4LDQ1MWMxMjI5LDEyMzUKKzwgdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKzwgCis8ICMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorPCAjIDAgc3RhbmRhcmQgaW5wdXQKKzwgIyAxIGZpbGUgY3JlYXRpb24KKzwgIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKzwgIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorPCAjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCis8ICMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKzwgIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKKzwgaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKzwgICBleGVjIDY+L2Rldi9udWxsCis8IGVsc2UKKzwgICBleGVjIDY+JjEKKy0tLQorPiBpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCis+ICAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorPiAgICAgbm8pIDs7Cis+ICAgICBmYXRhbCkgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworPiAgICAgKikgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMiA7OworPiAgIGVzYWMKKzQ1Myw0NThkMTIzNgorPCBleGVjIDU+Li9jb25maWcubG9nCis8IAorPCBlY2hvICJcCis8IFRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCis8IHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCis8ICIgMT4mNQorNDYwLDQ2M2MxMjM4LDEyNDIKKzwgIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCis8ICMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorPCBhY19jb25maWd1cmVfYXJncz0KKzwgZm9yIGFjX2FyZworLS0tCis+ICMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgorPiBmb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKKz4gCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKz4gCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCis+IAkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKKzQ2NSw0NzJjMTI0NCwxMjU0Cis8ICAgY2FzZSAiJGFjX2FyZyIgaW4KKzwgICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorPCAgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKzwgICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKzwgICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKzwgICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorPCAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworPCAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKy0tLQorPiAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorPiAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCis+ICAgY2FzZSAkYWNfdmFsIGluCis+ICAgICAqLyApCis+ICAgICAgIGFjX3ZhbD1gZXhwciAiWCRhY192YWwiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRhY192YWwiIDogJ1hcKC4qXCknYAorPiAgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworPiAgIGVzYWMKKz4gICAjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCis+ICAgY2FzZSAkYWNfdmFsIGluCis+ICAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworPiAgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworNDczYTEyNTYsMTI1NworPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzQ3Niw0ODRjMTI2MCwxMjkxCis8ICMgTkxTIG51aXNhbmNlcy4KKzwgIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorPCAjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKzwgIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCis8ICMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KKzwgaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCis8IGlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQorPCBpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKKzwgaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCistLS0KKz4gIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworPiAjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKz4gIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorPiBidWlsZD0kYnVpbGRfYWxpYXMKKz4gaG9zdD0kaG9zdF9hbGlhcworPiB0YXJnZXQ9JHRhcmdldF9hbGlhcworPiAKKz4gIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorPiBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKz4gICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKz4gICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorPiAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KKz4gICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCis+ICAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorPiAgICAgY3Jvc3NfY29tcGlsaW5nPXllcworPiAgIGZpCis+IGZpCis+IAorPiBhY190b29sX3ByZWZpeD0KKz4gdGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorPiAKKz4gdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorPiAKKz4gCis+IGFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorPiBhY19sc19kaT1gbHMgLWRpIC5gICYmCis+IGFjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IHRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDg2LDQ5M2QxMjkyCis8ICMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCis8IHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorPCAjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KKzwgZWNobyA+IGNvbmZkZWZzLmgKKzwgCis8ICMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKzwgIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KKzwgYWNfdW5pcXVlX2ZpbGU9Y29tbW9uL3VuaWNvZGUvdXR5cGVzLmgKKzQ5OCw1MDFjMTI5NywxMzIwCis8ICAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCis8ICAgYWNfcHJvZz0kMAorPCAgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorPCAgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKy0tLQorPiAgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKz4gICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX215c2VsZiIgfHwKKz4gJGFzX2V4cHIgWCIkYXNfbXlzZWxmIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorPiAJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKz4gCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXCkkJyBcfCBcCis+IAkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKz4gJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Cis+ICAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXC9cKVteL10uKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cL1wpJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cKS4qL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgcy8uKi8uLzsgcSdgCis1MDNjMTMyMgorPCAgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorLS0tCis+ICAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKzUwOSw1MzBjMTMyOCwxMzUyCis8IGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorPCAgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorPCAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgZWxzZQorPCAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKzwgICBmaQorPCBmaQorPCBzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKzwgCis8ICMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCis8IGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKzwgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKzwgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorPCAgIGVsc2UKKzwgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKzwgICBmaQorPCBmaQorPCBmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKzwgICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorPCAgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorPCAgICAgLiAiJGFjX3NpdGVfZmlsZSIKKzwgICBmaQorLS0tCis+IGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCis+ICAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IGZpCis+IGFjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKKz4gYWNfYWJzX2NvbmZkaXI9YCgKKz4gCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAJcHdkKWAKKz4gIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KKz4gaWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgorPiAgIHNyY2Rpcj0uCis+IGZpCis+ICMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCis+ICMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworPiAjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KKz4gY2FzZSAkc3JjZGlyIGluCis+ICovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworPiBlc2FjCis+IGZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCis+ICAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorPiAgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorPiAgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKz4gICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKzUzMyw1MzljMTM1NSwxMzYyCis8IGlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorPCAgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCis8ICAgLiAkY2FjaGVfZmlsZQorPCBlbHNlCis8ICAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCis8ICAgPiAkY2FjaGVfZmlsZQorPCBmaQorLS0tCis+ICMKKz4gIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorPiAjCis+IGlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCis+ICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCis+ICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorPiAgIGNhdCA8PF9BQ0VPRgorPiBcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorNTQxLDU1NmMxMzY0LDE4MTkKKzwgYWNfZXh0PWMKKzwgIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCis8IGFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCis8IAorPCBhY19leGVleHQ9Cis8IGFjX29iamV4dD1vCis8IGlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCis8ICAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCis8ICAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKzwgICAgIGFjX249IGFjX2M9JworPCAnIGFjX3Q9JwknCis8ICAgZWxzZQorPCAgICAgYWNfbj0tbiBhY19jPSBhY190PQorLS0tCis+IFVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorPiAKKz4gVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworPiBWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorPiAKKz4gRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCis+IAorPiBDb25maWd1cmF0aW9uOgorPiAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Cis+ICAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorPiAgICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcworPiAgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorPiAgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworPiAgICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KKz4gICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworPiAgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCis+ICAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCis+IAorPiBJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Cis+ICAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCis+ICAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKz4gICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorPiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCis+IAorPiBCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KKz4gXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKKz4gYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKKz4gZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKz4gCis+IEZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorPiAKKz4gRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKz4gICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKz4gICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKz4gICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCis+ICAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCis+ICAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKz4gICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCis+ICAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKz4gICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCis+ICAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKz4gICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCis+ICAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKz4gICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCis+ICAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCis+ICAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKz4gICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9QQUNLQUdFXQorPiAgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorPiAgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCis+ICAgLS1wZGZkaXI9RElSICAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKz4gICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCis+IF9BQ0VPRgorPiAKKz4gICBjYXQgPDxcX0FDRU9GCis+IAorPiBTeXN0ZW0gdHlwZXM6Cis+ICAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKz4gICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKz4gX0FDRU9GCis+IGZpCis+IAorPiBpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorPiAKKz4gICBjYXQgPDxcX0FDRU9GCis+IAorPiBPcHRpb25hbCBGZWF0dXJlczoKKz4gICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCis+ICAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorPiAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKz4gICAtLWVuYWJsZS1zdHJpY3QgICAgICAgICBjb21waWxlIHdpdGggc3RyaWN0IGNvbXBpbGVyIG9wdGlvbnMgZGVmYXVsdD1ubworPiAgIC0tZW5hYmxlLTY0Yml0LWxpYnMgICAgIGJ1aWxkIDY0LWJpdCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKz4gICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIGRlZmF1bHQ9eWVzCis+ICAgLS1lbmFibGUtc3RhdGljICAgICAgICAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBkZWZhdWx0PW5vCis+ICAgLS1lbmFibGUtZGVidWcgICAgICAgICAgYnVpbGQgZGVidWcgbGlicmFyaWVzIGRlZmF1bHQ9bm8KKz4gICAtLWVuYWJsZS1yZWxlYXNlICAgICAgICBidWlsZCByZWxlYXNlIGxpYnJhcmllcyBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLXJlbmFtaW5nICAgICAgIGFkZCBhIHZlcnNpb24gc3VmZml4IHRvIHN5bWJvbHMgZGVmYXVsdD15ZXMKKz4gICAtLWVuYWJsZS10cmFjaW5nICAgICAgICBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLXJwYXRoICAgICAgICAgIHVzZSBycGF0aCB3aGVuIGxpbmtpbmcgZGVmYXVsdCBpcyBvbmx5IGlmIG5lY2Vzc2FyeQorPiAgIC0tZW5hYmxlLXRocmVhZHMgICAgICAgIGJ1aWxkIElDVSB3aXRoIHRocmVhZCBzYWZldHkgZGVmYXVsdD15ZXMKKz4gICAtLWVuYWJsZS1leHRyYXMgICAgICAgICBidWlsZCBJQ1UgZXh0cmFzIGRlZmF1bHQ9eWVzCis+ICAgLS1lbmFibGUtaWN1aW8gICAgICAgICAgYnVpbGQgSUNVJ3MgaWN1aW8gbGlicmFyeSBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLWxheW91dCAgICAgICAgIGJ1aWxkIElDVSdzIGxheW91dCBsaWJyYXJ5IGRlZmF1bHQ9eWVzCis+IAorPiAgIC0tZW5hYmxlLXRlc3RzICAgICAgICAgIGJ1aWxkIElDVSB0ZXN0cyBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLXNhbXBsZXMgICAgICAgIGJ1aWxkIElDVSBzYW1wbGVzIGRlZmF1bHQ9eWVzCis+IEFkZGl0aW9uYWxseSwgdGhlIHZhcmlhYmxlIEZPUkNFX0xJQlMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyBjb25maWd1cmUuIElmIHNldCwgaXQgd2lsbCBSRVBMQUNFIGFueSBhdXRvbWF0aWMgbGlzdCBvZiBsaWJyYXJpZXMuCis+IAorPiBPcHRpb25hbCBQYWNrYWdlczoKKz4gICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKz4gICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCis+ICAgLS13aXRoLWlvc3RyZWFtPXZlcnNpb24gc3BlY2lmeSB0aGUgdmVyc2lvbiBvZiBpb3N0cmVhbSB0byB1c2UgKG5vbmUsIG9sZCwgc3RkLCBhdXRvKSBkZWZhdWx0PWF1dG8KKz4gICAtLXdpdGgtZGF0YS1wYWNrYWdpbmc9dHlwZSBzcGVjaWZ5IGhvdyB0byBwYWNrYWdlIElDVSBkYXRhIChmaWxlcywgYXJjaGl2ZSwgbGlicmFyeSwgYXV0bykgZGVmYXVsdD1hdXRvCis+ICAgLS13aXRoLWxpYnJhcnktc3VmZml4PXN1ZmZpeCAgICB0YWcgYSBzdWZmaXggdG8gdGhlIGxpYnJhcnkgbmFtZXMgZGVmYXVsdD0KKz4gCis+IFNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorPiAgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorPiAgIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKKz4gICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKz4gICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Cis+ICAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgorPiAgIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKz4gICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KKz4gICBDWFggICAgICAgICBDKysgY29tcGlsZXIgY29tbWFuZAorPiAgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworPiAgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCis+ICAgQ1hYQ1BQICAgICAgQysrIHByZXByb2Nlc3NvcgorPiAKKz4gVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKKz4gaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorPiAKKz4gX0FDRU9GCis+IGFjX3N0YXR1cz0kPworPiBmaQorPiAKKz4gaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgorPiAgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCis+ICAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKz4gICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8Cis+ICAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorPiAgICAgICBjb250aW51ZQorPiAgICAgYWNfYnVpbGRkaXI9LgorPiAKKz4gY2FzZSAiJGFjX2RpciIgaW4KKz4gLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Cis+ICopCis+ICAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKz4gICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCis+ICAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCis+ICAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorPiAgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKz4gICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKz4gICBlc2FjIDs7Cis+IGVzYWMKKz4gYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCis+IGFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKz4gIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKz4gYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Cis+IAorPiBjYXNlICRzcmNkaXIgaW4KKz4gICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCis+ICAgICBhY19zcmNkaXI9LgorPiAgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorPiAgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworPiAgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKz4gICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Cis+ICAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKz4gICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKz4gICAqKSAjIFJlbGF0aXZlIG5hbWUuCis+ICAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKz4gICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCis+ICAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKKz4gZXNhYworPiBhY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Cis+IAorPiAgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorPiAgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCis+ICAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCis+ICAgICAgIGVjaG8gJiYKKz4gICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKz4gICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCis+ICAgICAgIGVjaG8gJiYKKz4gICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorPiAgICAgZWxzZQorPiAgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorPiAgICAgZmkgfHwgYWNfc3RhdHVzPSQ/Cis+ICAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Cis+ICAgZG9uZQorPiBmaQorPiAKKz4gdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCis+IGlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKz4gICBjYXQgPDxcX0FDRU9GCis+IGNvbmZpZ3VyZQorPiBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjMKKz4gCis+IENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKz4gMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKz4gVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKz4gZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorPiBfQUNFT0YKKz4gICBleGl0Cis+IGZpCis+IGNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorPiBUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorPiBydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorPiAKKz4gSXQgd2FzIGNyZWF0ZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKKz4gZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCis+IAorPiAgICQgJDAgJEAKKz4gCis+IF9BQ0VPRgorPiBleGVjIDU+PmNvbmZpZy5sb2cKKz4geworPiBjYXQgPDxfQVNVTkFNRQorPiAjIyAtLS0tLS0tLS0gIyMKKz4gIyMgUGxhdGZvcm0uICMjCis+ICMjIC0tLS0tLS0tLSAjIworPiAKKz4gaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKz4gdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCis+IHVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorPiB1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKz4gdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCis+IAorPiAvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKz4gL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCis+IAorPiAvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCis+IC91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKz4gL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorPiAvdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCis+IC9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKz4gL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorPiAvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCis+IAorPiBfQVNVTkFNRQorPiAKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gfSA+JjUKKz4gCis+IGNhdCA+JjUgPDxfQUNFT0YKKz4gCis+IAorPiAjIyAtLS0tLS0tLS0tLSAjIworPiAjIyBDb3JlIHRlc3RzLiAjIworPiAjIyAtLS0tLS0tLS0tLSAjIworPiAKKz4gX0FDRU9GCis+IAorPiAKKz4gIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKz4gIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCis+ICMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorPiAjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCis+ICMgTWFrZSB0d28gcGFzc2VzIHRvIGFsbG93IGZvciBwcm9wZXIgZHVwbGljYXRlLWFyZ3VtZW50IHN1cHByZXNzaW9uLgorPiBhY19jb25maWd1cmVfYXJncz0KKz4gYWNfY29uZmlndXJlX2FyZ3MwPQorPiBhY19jb25maWd1cmVfYXJnczE9Cis+IGFjX211c3Rfa2VlcF9uZXh0PWZhbHNlCis+IGZvciBhY19wYXNzIGluIDEgMgorPiBkbworPiAgIGZvciBhY19hcmcKKz4gICBkbworPiAgICAgY2FzZSAkYWNfYXJnIGluCis+ICAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7Cis+ICAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorPiAgICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCis+ICAgICAgIGNvbnRpbnVlIDs7Cis+ICAgICAqXCcqKQorPiAgICAgICBhY19hcmc9YCRhc19lY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworPiAgICAgZXNhYworPiAgICAgY2FzZSAkYWNfcGFzcyBpbgorPiAgICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKKz4gICAgIDIpCis+ICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzMT0iJGFjX2NvbmZpZ3VyZV9hcmdzMSAnJGFjX2FyZyciCis+ICAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgorPiAJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorPiAgICAgICBlbHNlCis+IAljYXNlICRhY19hcmcgaW4KKz4gCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCis+IAkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKz4gCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAorPiAJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKz4gCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKz4gCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Cis+IAkgICAgZXNhYworPiAJICAgIDs7Cis+IAkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OworPiAJZXNhYworPiAgICAgICBmaQorPiAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKKz4gICAgICAgOzsKKz4gICAgIGVzYWMKKz4gICBkb25lCis+IGRvbmUKKz4gJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMCB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMCtzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczA9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MwOyB9Cis+ICRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQorPiAKKz4gIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorPiAjIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQorPiAjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKz4gIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCis+ICMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KKz4gdHJhcCAnZXhpdF9zdGF0dXM9JD8KKz4gICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKz4gICB7Cis+ICAgICBlY2hvCis+IAorPiAgICAgY2F0IDw8XF9BU0JPWAorPiAjIyAtLS0tLS0tLS0tLS0tLS0tICMjCis+ICMjIENhY2hlIHZhcmlhYmxlcy4gIyMKKz4gIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworPiBfQVNCT1gKKz4gICAgIGVjaG8KKz4gICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCis+ICgKKz4gICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCis+ICAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKz4gICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorPiAgICAgKiR7YXNfbmx9KikKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Cis+ICAgICAgIGVzYWMKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKz4gICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKz4gICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKz4gICAgICAgZXNhYyA7OworPiAgICAgZXNhYworPiAgIGRvbmUKKz4gICAoc2V0KSAyPiYxIHwKKz4gICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKz4gICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKz4gICAgICAgc2VkIC1uIFwKKz4gCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworPiAJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCis+ICAgICAgIDs7ICMoCis+ICAgICAqKQorPiAgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorPiAgICAgICA7OworPiAgICAgZXNhYyB8Cis+ICAgICBzb3J0Cis+ICkKKz4gICAgIGVjaG8KKz4gCis+ICAgICBjYXQgPDxcX0FTQk9YCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCis+ICMjIE91dHB1dCB2YXJpYWJsZXMuICMjCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCis+IF9BU0JPWAorPiAgICAgZWNobworPiAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycworPiAgICAgZG8KKz4gICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCis+ICAgICAgIGNhc2UgJGFjX3ZhbCBpbgorPiAgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Cis+ICAgICAgIGVzYWMKKz4gICAgICAgJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorPiAgICAgZG9uZSB8IHNvcnQKKz4gICAgIGVjaG8KKz4gCis+ICAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCis+ICAgICAgIGNhdCA8PFxfQVNCT1gKKz4gIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworPiAjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKz4gX0FTQk9YCis+ICAgICAgIGVjaG8KKz4gICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKz4gICAgICAgZG8KKz4gCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorPiAJY2FzZSAkYWNfdmFsIGluCis+IAkqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Cis+IAllc2FjCis+IAkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCis+ICAgICAgIGRvbmUgfCBzb3J0Cis+ICAgICAgIGVjaG8KKz4gICAgIGZpCis+IAorPiAgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCis+ICAgICAgIGNhdCA8PFxfQVNCT1gKKz4gIyMgLS0tLS0tLS0tLS0gIyMKKz4gIyMgY29uZmRlZnMuaC4gIyMKKz4gIyMgLS0tLS0tLS0tLS0gIyMKKz4gX0FTQk9YCis+ICAgICAgIGVjaG8KKz4gICAgICAgY2F0IGNvbmZkZWZzLmgKKz4gICAgICAgZWNobworPiAgICAgZmkKKz4gICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKz4gICAgICAgJGFzX2VjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCis+ICAgfSA+JjUKKz4gICBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogJiYKKz4gICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKz4gICAgIGV4aXQgJGV4aXRfc3RhdHVzCis+ICcgMAorPiBmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKz4gICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKKz4gZG9uZQorPiBhY19zaWduYWw9MAorPiAKKz4gIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KKz4gcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKz4gCis+ICMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKKz4gX0FDRU9GCis+IAorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKKz4gX0FDRU9GCis+IAorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKKz4gX0FDRU9GCis+IAorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCis+IF9BQ0VPRgorPiAKKz4gCis+IGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorPiBfQUNFT0YKKz4gCis+IAorPiAjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKz4gIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KKz4gYWNfc2l0ZV9maWxlMT1OT05FCis+IGFjX3NpdGVfZmlsZTI9Tk9ORQorPiBpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCis+ICAgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEUKKz4gZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKz4gICBhY19zaXRlX2ZpbGUxPSRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKz4gICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCis+IGVsc2UKKz4gICBhY19zaXRlX2ZpbGUxPSRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorPiAgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorPiBmaQorPiBmb3IgYWNfc2l0ZV9maWxlIGluICIkYWNfc2l0ZV9maWxlMSIgIiRhY19zaXRlX2ZpbGUyIgorPiBkbworPiAgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCis+ICAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9Cis+ICAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKz4gICAgIC4gIiRhY19zaXRlX2ZpbGUiCis+ICAgZmkKKz4gZG9uZQorPiAKKz4gaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCis+ICAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKz4gICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKz4gICBpZiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKz4gICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKz4gICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworPiAgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7Cis+ICAgICBlc2FjCis1NTljMTgyMiwxODg0Cis8ICAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKz4gICA+JGNhY2hlX2ZpbGUKKz4gZmkKKz4gCis+ICMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKz4gIyB2YWx1ZS4KKz4gYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCis+IGZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCis+ICAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKz4gICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorPiAgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKz4gICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCis+ICAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorPiAgICAgc2V0LCkKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKz4gICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKz4gICAgICxzZXQpCis+ICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKz4gICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKz4gICAgICwpOzsKKz4gICAgICopCis+ICAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKz4gCSMgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSBkbyBub3QgbGVhZCB0byBmYWlsdXJlLgorPiAJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCis+IAlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKz4gCWlmIHRlc3QgIiRhY19vbGRfdmFsX3ciICE9ICIkYWNfbmV3X3ZhbF93IjsgdGhlbgorPiAJICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKz4gCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKz4gCWVsc2UKKz4gCSAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Cis+IAkgIGV2YWwgJGFjX3Zhcj1cJGFjX29sZF92YWwKKz4gCWZpCis+IAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9Cis+IAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9Cis+ICAgICAgIGZpOzsKKz4gICBlc2FjCis+ICAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorPiAgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorPiAgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorPiAgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKz4gICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7Cis+ICAgICBlc2FjCis+ICAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKz4gICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCis+ICAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworPiAgICAgZXNhYworPiAgIGZpCis+IGRvbmUKKz4gaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNTY0YTE4OTAsMTkxMgorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gYWNfZXh0PWMKKz4gYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cis+IAorPiAKKz4gCis+IGFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29tbW9uL2ljdWNmZy5oIgorPiAKKzU2OCw1NjljMTkxNiwxOTE3Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjU3MDogY2hlY2tpbmcgZm9yIElDVSB2ZXJzaW9uIG51bWJlcnMiID4mNQorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgSUNVIHZlcnNpb24gbnVtYmVycyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzLi4uICIgPiY2OyB9Cis1NzhjMTkyNiwxOTI4Cis8ICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBDYW5ub3QgZGV0ZXJtaW5lIElDVSB2ZXJzaW9uIG51bWJlciBmcm9tIGhlYWRlciBmaWxlcyIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gICAgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2Fubm90IGRldGVybWluZSBJQ1UgdmVyc2lvbiBudW1iZXIgZnJvbSBoZWFkZXIgZmlsZXMiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogQ2Fubm90IGRldGVybWluZSBJQ1UgdmVyc2lvbiBudW1iZXIgZnJvbSBoZWFkZXIgZmlsZXMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNTg2YzE5MzYsMTkzNworPCBlY2hvICIkYWNfdCIicmVsZWFzZSAkVkVSU0lPTiwgbGlicmFyeSAkTElCX1ZFUlNJT04iIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiByZWxlYXNlICRWRVJTSU9OLCBsaWJyYXJ5ICRMSUJfVkVSU0lPTiIgPiY1Cis+ICRhc19lY2hvICJyZWxlYXNlICRWRVJTSU9OLCBsaWJyYXJ5ICRMSUJfVkVSU0lPTiIgPiY2OyB9Cis1OTRjMTk0NSwxOTkxCis8ICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy0tLQorPiBhY19leHQ9YworPiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCis+IGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCis+IGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKz4gaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorPiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorPiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCis+IGVsc2UKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorPiBmaQorPiBmaQorPiBDQz0kYWNfY3ZfcHJvZ19DQworPiBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKz4gJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis+IAorPiAKKz4gZmkKKz4gaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCis+ICAgYWNfY3RfQ0M9JENDCis+ICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorNTk2LDU5OWMxOTkzLDIwNDkKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjU5ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCis+IGVsc2UKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gZmkKKz4gZmkKKz4gYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKKz4gaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorPiBlbHNlCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorPiBmaQorPiAKKz4gICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKz4gICAgIENDPSIiCis+ICAgZWxzZQorPiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgorPiB5ZXM6KQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorPiBhY190b29sX3dhcm5lZD15ZXMgOzsKKz4gZXNhYworPiAgICAgQ0M9JGFjX2N0X0NDCis+ICAgZmkKKz4gZWxzZQorPiAgIENDPSIkYWNfY3ZfcHJvZ19DQyIKKz4gZmkKKz4gCis+IGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKz4gICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKz4gICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzYwNCw2MTNjMjA1NCwyMDY4Cis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEgiCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCis8ICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorPCAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCis8ICAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKzwgICAgICAgYnJlYWsKKzwgICAgIGZpCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfaWZzIgorLS0tCis+IGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKz4gICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorNjE2YzIwNzEKKzwgQ0M9IiRhY19jdl9wcm9nX0NDIgorLS0tCis+IENDPSRhY19jdl9wcm9nX0NDCis2MThjMjA3MywyMDc0Cis8ICAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKz4gJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cis2MjBjMjA3NiwyMDc3Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis2MjJhMjA4MCwyMDgyCis+IAorPiAgIGZpCis+IGZpCis2MjYsNjI5YzIwODYsMjA4OQorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6NjI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis2MzRkMjA5MworPCAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCis2MzYsNjQ4YzIwOTUsMjExMworPCAgIGFjX2R1bW15PSIkUEFUSCIKKzwgICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKzwgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCis8ICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKzwgICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCis8ICAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKzwgCWNvbnRpbnVlCis8ICAgICAgIGZpCis8ICAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCistLS0KKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCis+ICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworPiAgICAgICAgY29udGludWUKKz4gICAgICBmaQorPiAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorNjUzYzIxMTgKKzwgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCistLS0KKz4gICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKzY1OCw2NjBjMjEyMworPCAgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCis8ICAgICBzaGlmdAorPCAgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCistLS0KKz4gICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorNjY1YzIxMjgKKzwgQ0M9IiRhY19jdl9wcm9nX0NDIgorLS0tCis+IENDPSRhY19jdl9wcm9nX0NDCis2NjdjMjEzMCwyMTMxCis8ICAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKz4gJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cis2NjljMjEzMywyMTM0Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis2NzIsNjgwYzIxMzcsMjE0OAorPCAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKzwgICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCis8ICAgICAqd2luMzIqIHwgKldJTjMyKikKKzwgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis8IHNldCBkdW1teSBjbDsgYWNfd29yZD0kMgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiAKKz4gZmkKKz4gaWYgdGVzdCAteiAiJENDIjsgdGhlbgorPiAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKz4gICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKz4gICBkbworPiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis2ODUsNjk0YzIxNTMsMjE2NworPCAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCis8ICAgYWNfZHVtbXk9IiRQQVRIIgorPCAgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKzwgICAgICAgYnJlYWsKKzwgICAgIGZpCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfaWZzIgorLS0tCis+IGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKz4gICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKzY5N2MyMTcwCis8IENDPSIkYWNfY3ZfcHJvZ19DQyIKKy0tLQorPiBDQz0kYWNfY3ZfcHJvZ19DQworNjk5YzIxNzIsMjE3MworPCAgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Cis+ICRhc19lY2hvICIkQ0MiID4mNjsgfQorNzAxYzIxNzUsMjE3NgorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorNzAzLDcwNGMyMTc4LDIyMDYKKzwgIDs7Cis8ICAgICBlc2FjCistLS0KKz4gCis+IAorPiAgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworPiAgIGRvbmUKKz4gZmkKKz4gaWYgdGVzdCAteiAiJENDIjsgdGhlbgorPiAgIGFjX2N0X0NDPSRDQworPiAgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorPiBkbworPiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorPiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCis+IGVsc2UKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorNzA2YzIyMDgsMjIyMAorPCAgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gZG9uZQorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCis+IGZpCis+IGZpCis+IGFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCis+IGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorPiAkYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KKz4gZWxzZQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKz4gJGFzX2VjaG8gIm5vIiA+JjY7IH0KKzcwOSw3MTBkMjIyMgorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6NzExOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorNzEyLDczMGMyMjI0LDIyMjgKKzwgYWNfZXh0PWMKKzwgIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCis8IGFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCis8IAorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorPCAKKzwgI2xpbmUgNzIyICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAKKzwgbWFpbigpe3JldHVybigwKTt9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKzwgICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCis8ICAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCis8ICAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCistLS0KKz4gICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCis+IGRvbmUKKz4gCis+ICAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCis+ICAgICBDQz0iIgorNzMyYzIyMzAsMjIzNgorPCAgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKy0tLQorPiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgorPiB5ZXM6KQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorPiBhY190b29sX3dhcm5lZD15ZXMgOzsKKz4gZXNhYworPiAgICAgQ0M9JGFjX2N0X0NDCis3MzQsNzM3ZDIyMzcKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworNzM5LDc0NWQyMjM4Cis8IHJtIC1mciBjb25mdGVzdCoKKzwgYWNfZXh0PWMKKzwgIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCis8IGFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCis3NDcsNzQ5ZDIyMzkKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorPCAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Cis3NTEsNzU0ZDIyNDAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6NzUzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Cis8IGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKzc1Niw3NjdjMjI0MiwyMzY4Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjc1ODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCis8ICNpZmRlZiBfX0dOVUNfXworPCAgIHllczsKKzwgI2VuZGlmCis8IEVPRgorPCBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzY3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKzwgICBhY19jdl9wcm9nX2djYz15ZXMKKy0tLQorPiAKKz4gdGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cis+IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKKz4gU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorPiAKKz4gIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorPiAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorPiBzZXQgWCAkYWNfY29tcGlsZQorPiBhY19jb21waWxlcj0kMgorPiB7IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKz4geyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlciAtdiA+JjUiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorPiB7IChhY190cnk9IiRhY19jb21waWxlciAtViA+JjUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9Cis+IAorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKKz4gYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorPiAjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCis+ICMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKz4gIyBvZiBleGVleHQuCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0KKz4gYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKz4gCis+ICMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKKz4gYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKz4gCis+IGFjX3JtZmlsZXM9Cis+IGZvciBhY19maWxlIGluICRhY19maWxlcworPiBkbworPiAgIGNhc2UgJGFjX2ZpbGUgaW4KKz4gICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKz4gICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OworPiAgIGVzYWMKKz4gZG9uZQorPiBybSAtZiAkYWNfcm1maWxlcworPiAKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorPiAgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorPiAjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworPiAjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAorPiAjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworPiAjIEF1dG9jb25mLgorPiBmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKKz4gZG8KKz4gICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKz4gICBjYXNlICRhY19maWxlIGluCis+ICAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCis+IAk7OworPiAgICAgW2FiXS5vdXQgKQorPiAJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKz4gCSMgY2VydGFpbmx5IHJpZ2h0LgorPiAJYnJlYWs7OworPiAgICAgKi4qICkKKz4gICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKz4gCXRoZW4gOjsgZWxzZQorPiAJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCis+IAlmaQorPiAJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Cis+IAkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKz4gCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorPiAJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCis+IAkjIGFjdHVhbGx5IHdvcmtpbmcuCis+IAlicmVhazs7Cis+ICAgICAqICkKKz4gCWJyZWFrOzsKKz4gICBlc2FjCis+IGRvbmUKKz4gdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Cis+IAorNzY5YzIzNzAKKzwgICBhY19jdl9wcm9nX2djYz1ubworLS0tCis+ICAgYWNfZmlsZT0nJworNzcwYTIzNzIsMjQyMworPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQorPiBpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorPiB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKz4gICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH07IH0KKz4gZmkKKz4gCis+IGFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Cis+IAorPiAjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorPiAjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorPiAjIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCis+ICMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCis+IGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorPiAgIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJworPiAgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCis+ICAgICBjcm9zc19jb21waWxpbmc9bm8KKz4gICBlbHNlCis+ICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCis+IAljcm9zc19jb21waWxpbmc9eWVzCis+ICAgICBlbHNlCis+IAl7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cis+IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCis+IElmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCis+IElmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Cis+ICAgICBmaQorPiAgIGZpCis3NzFhMjQyNSwyNDI2Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Cis+ICRhc19lY2hvICJ5ZXMiID4mNjsgfQorNzczYzI0MjgsMjU0OQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CistLS0KKz4gcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKKz4gYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKz4gIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKz4gIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorPiAkYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Cis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCis+ICAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCis+ICMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorPiAjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorPiAjIGBybScuCis+IGZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworPiAgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorPiAgIGNhc2UgJGFjX2ZpbGUgaW4KKz4gICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKz4gICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorPiAJICBicmVhazs7Cis+ICAgICAqICkgYnJlYWs7OworPiAgIGVzYWMKKz4gZG9uZQorPiBlbHNlCis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorPiB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQorPiAKKz4gcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorPiBFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorPiBhY19leGVleHQ9JEVYRUVYVAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCis+ICAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKz4gICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7Cis+ICAgY2FzZSAkYWNfZmlsZSBpbgorPiAgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKz4gICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAorPiAgICAgICAgYnJlYWs7OworPiAgIGVzYWMKKz4gZG9uZQorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9vYmpleHQiID4mNjsgfQorPiBPQkpFWFQ9JGFjX2N2X29iamV4dAorPiBhY19vYmpleHQ9JE9CSkVYVAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworNzc1YzI1NTEsMjU5NAorPCBpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gI2lmbmRlZiBfX0dOVUNfXworPiAgICAgICAgY2hva2UgbWUKKz4gI2VuZGlmCis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBhY19jb21waWxlcl9nbnU9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2NvbXBpbGVyX2dudT1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKz4gCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQorPiBpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKzc3OWEyNTk5LDI2NTgKKz4gYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorPiBhY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKz4gICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKz4gICAgYWNfY3ZfcHJvZ19jY19nPW5vCis+ICAgIENGTEFHUz0iLWciCis+ICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X3Byb2dfY2NfZz15ZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJQ0ZMQUdTPSIiCis+ICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKzc4MSw3ODdjMjY2MCwyNjgyCis8IGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorPCBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKzwgQ0ZMQUdTPQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKzc4OSw3OTBjMjY4NCwyNzIxCis8ICAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCis8IGlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKz4gCSBDRkxBR1M9Ii1nIgorPiAJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorNzkzYzI3MjQsMjcyNworPCAgIGFjX2N2X3Byb2dfY2NfZz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAorNzk1ZDI3MjgKKzwgcm0gLWYgY29uZnRlc3QqCis3OTZhMjczMAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzc5OWMyNzMzLDI3NDAKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiAgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KKzgwMWMyNzQyCis8ICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCistLS0KKz4gICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCis4MTRhMjc1NiwyNzkwCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfY3ZfcHJvZ19jY19jODk9bm8KKz4gYWNfc2F2ZV9DQz0kQ0MKKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8c3RkYXJnLmg+Cis+ICNpbmNsdWRlIDxzdGRpby5oPgorPiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cis+ICNpbmNsdWRlIDxzeXMvc3RhdC5oPgorPiAvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCis+IHN0cnVjdCBidWYgeyBpbnQgeDsgfTsKKz4gRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKKz4gc3RhdGljIGNoYXIgKmUgKHAsIGkpCis+ICAgICAgY2hhciAqKnA7Cis+ICAgICAgaW50IGk7Cis+IHsKKz4gICByZXR1cm4gcFtpXTsKKz4gfQorPiBzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCis+IHsKKz4gICBjaGFyICpzOworPiAgIHZhX2xpc3QgdjsKKz4gICB2YV9zdGFydCAodixwKTsKKz4gICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworPiAgIHZhX2VuZCAodik7Cis+ICAgcmV0dXJuIHM7Cis+IH0KKzgxNmMyNzkyLDI4MjEKKzwgZm9yIGFjX3Byb2cgaW4gJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKyBjbAorLS0tCis+IC8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCis+ICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKz4gICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCis+ICAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKz4gICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorPiAgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKz4gICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworPiBpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworPiAKKz4gLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCis+ICAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKz4gI2RlZmluZSBGT08oeCkgJ3gnCis+IGludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworPiAKKz4gaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Cis+IHN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9OworPiBzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKKz4gaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Cis+IGludCBhcmdjOworPiBjaGFyICoqYXJndjsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCis+IAktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorODE4LDgyM2MyODIzLDI4OTUKKzwgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis8IHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6ODIyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DWFgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4gICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKz4gICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAKKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworPiBkb25lCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKKz4gQ0M9JGFjX3NhdmVfQ0MKKz4gCis+IGZpCis+ICMgQUNfQ0FDSEVfVkFMCis+IGNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCis+ICAgeCkKKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKKz4gJGFzX2VjaG8gIm5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKKz4gICB4bm8pCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Cis+ICRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7Cis+ICAgKikKKz4gICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Cis+IGVzYWMKKz4gCis+IAorPiBhY19leHQ9YworPiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCis+IGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCis+IGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKz4gCis+IGFjX2V4dD1jcHAKKz4gYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKz4gaWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKz4gICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgorPiAgICAgQ1hYPSRDQ0MKKz4gICBlbHNlCis+ICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCis+ICAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKz4gICBkbworPiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorODI4LDgzN2MyOTAwLDI5MTQKKzwgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorPCAgIGFjX2R1bW15PSIkUEFUSCIKKzwgICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKzwgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCis8ICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKzwgICAgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY19wcm9nIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCistLS0KKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKzg0MGMyOTE3Cis8IENYWD0iJGFjX2N2X3Byb2dfQ1hYIgorLS0tCis+IENYWD0kYWNfY3ZfcHJvZ19DWFgKKzg0MmMyOTE5LDI5MjAKKzwgICBlY2hvICIkYWNfdCIiJENYWCIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWCIgPiY1Cis+ICRhc19lY2hvICIkQ1hYIiA+JjY7IH0KKzg0NGMyOTIyLDI5MjMKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKz4gJGFzX2VjaG8gIm5vIiA+JjY7IH0KKzg0N2MyOTI2LDI5NTUKKzwgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKKy0tLQorPiAKKz4gICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCis+ICAgZG9uZQorPiBmaQorPiBpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorPiAgIGFjX2N0X0NYWD0kQ1hYCis+ICAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKz4gZG8KKz4gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKz4gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NYWCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKz4gZWxzZQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKzg0OWMyOTU3LDI5NjgKKzwgdGVzdCAtbiAiJENYWCIgfHwgQ1hYPSJnY2MiCistLS0KKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gZmkKKz4gZmkKKz4gYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAorPiBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DWFgiID4mNQorPiAkYXNfZWNobyAiJGFjX2N0X0NYWCIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis4NTIsODUzYzI5NzEsMjk3MgorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTo4NTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKy0tLQorPiAgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCis+IGRvbmUKKzg1NSw4NzNjMjk3NCwyOTc1Cis8IGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCis8IAorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorPCAKKzwgI2xpbmUgODY1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAKKzwgaW50IG1haW4oKXtyZXR1cm4oMCk7fQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPXllcworPCAgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKzwgICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKzwgICAgIGFjX2N2X3Byb2dfY3h4X2Nyb3NzPW5vCistLS0KKz4gICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCis+ICAgICBDWFg9ImcrKyIKKzg3NWMyOTc3LDI5ODMKKzwgICAgIGFjX2N2X3Byb2dfY3h4X2Nyb3NzPXllcworLS0tCis+ICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCis+IHllczopCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cis+IGFjX3Rvb2xfd2FybmVkPXllcyA7OworPiBlc2FjCis+ICAgICBDWFg9JGFjX2N0X0NYWAorODc3LDg4MGQyOTg0Cis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPW5vCis4ODIsODg4ZDI5ODUKKzwgcm0gLWZyIGNvbmZ0ZXN0KgorPCBhY19leHQ9YworPCAjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCis8IGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCis8IGFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKzwgYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKzg5MCw4OTJjMjk4NworPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X3dvcmtzIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X3dvcmtzID0gbm87IHRoZW4KKzwgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gICBmaQorODk0LDg5N2MyOTg5LDMwMzcKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQysrIGNvbXBpbGVyICgkQ1hYICRDWFhGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTo4OTY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X2Nyb3NzIiAxPiY2Cis8IGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jeHhfY3Jvc3MKKy0tLQorPiAjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCis+ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciB2ZXJzaW9uIiA+JjUKKz4gc2V0IFggJGFjX2NvbXBpbGUKKz4gYWNfY29tcGlsZXI9JDIKKz4geyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9Cis+IHsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC12ID4mNSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKz4geyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlciAtViA+JjUiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9jeHhfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzg5OSw5MDZjMzAzOSwzMDQzCis8IGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDKysiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6OTAxOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQysrIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ3h4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuQyA8PEVPRgorPCAjaWZkZWYgX19HTlVDX18KKzwgICB5ZXM7CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAjaWZuZGVmIF9fR05VQ19fCis+ICAgICAgICBjaG9rZSBtZQorOTA4LDkxNmQzMDQ0Cis8IEVPRgorPCBpZiB7IGFjX3RyeT0nJHtDWFgtZysrfSAtRSBjb25mdGVzdC5DJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIGFjX2N2X3Byb2dfZ3h4PXllcworPCBlbHNlCis8ICAgYWNfY3ZfcHJvZ19neHg9bm8KKzwgZmkKKzwgZmkKKzwgCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19neHgiIDE+JjYKKzkxOGMzMDQ2LDMwODIKKzwgaWYgdGVzdCAkYWNfY3ZfcHJvZ19neHggPSB5ZXM7IHRoZW4KKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2NvbXBpbGVyX2dudT15ZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY29tcGlsZXJfZ251PW5vCis+IGZpCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251Cis+IAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2OyB9Cis+IGlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorOTIyYTMwODcsMzEwNworPiBhY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorPiBhY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY3h4X2crc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWc9JGFjX2N4eF93ZXJyb3JfZmxhZworPiAgICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCis+ICAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKz4gICAgQ1hYRkxBR1M9Ii1nIgorPiAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis5MjQsOTMwYzMxMDksMzEzMQorPCBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCis8IGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKzwgQ1hYRkxBR1M9Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDWFgtZysrfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjkyOTogY2hlY2tpbmcgd2hldGhlciAke0NYWC1nKyt9IGFjY2VwdHMgLWciID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jeHhfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCis5MzIsOTMzYzMxMzMsMzIwOQorPCAgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuY2MKKzwgaWYgdGVzdCAteiAiYCR7Q1hYLWcrK30gLWcgLWMgY29uZnRlc3QuY2MgMj4mMWAiOyB0aGVuCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCUNYWEZMQUdTPSIiCis+ICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCis+IAkgQ1hYRkxBR1M9Ii1nIgorPiAJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis5MzZjMzIxMiwzMjE4Cis8ICAgYWNfY3ZfcHJvZ19jeHhfZz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAorPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis5MzhkMzIxOQorPCBybSAtZiBjb25mdGVzdCoKKzkzOWEzMjIxCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorOTQyYzMyMjQsMzIyOAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X2ciIDE+JjYKKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfcHJvZ19jeHhfZyIgPiY2OyB9Cis5NDRjMzIzMAorPCAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKKy0tLQorPiAgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCis5NTdhMzI0NCwzMjQ4Cis+IGFjX2V4dD1jCis+IGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCis+IGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorOTYwLDk2MWMzMjUxLDMyNTIKKzwgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKzwgICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorLS0tCis+IGZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCis+ICAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorOTY1YzMyNTYKKzwgICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCistLS0KKz4gICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KKzk2OGEzMjYwLDMyNjMKKz4gICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorPiAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCis+ICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKz4gICAgIGJyZWFrCis5NzJjMzI2NywzMjY5Cis8ICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KKy0tLQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzk3NCw5NzZjMzI3MSwzMjc5Cis8IGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKKzwgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCis8IGFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorLS0tCis+IAorPiAjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKz4gIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorPiAjIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKKz4gIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorPiBhY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCis+IGFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorPiBhY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCis+IAorOTg0YTMyODgKKz4gIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCis5ODdhMzI5MgorPiAjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKKzk4OSw5OTBjMzI5NCwzMjk2Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6OTkxOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKy0tLQorPiAjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQorOTkyLDk5M2MzMjk4LDMyOTkKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis5OTUsMTAwNWMzMzAxLDMzMTgKKzwgICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCis8ICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKzwgICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorPCAgICAgY2FzZSAiJGFjX2Rpci8iIGluCis8ICAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKzwgICAgICopCis8ICAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCis8ICAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorPCAgICAgICAjIGJ5IGRlZmF1bHQuCis8ICAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKzwgICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKy0tLQorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorPiBjYXNlICRhc19kaXIvIGluCis+ICAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKKz4gICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKz4gICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKKz4gICAvdXNyL3VjYi8qICkgOzsKKz4gICAqKQorPiAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKz4gICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorPiAgICAgIyBieSBkZWZhdWx0LgorPiAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworPiAgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKzEwMDdjMzMyMAorPCAgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorLS0tCis+IAkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorMTAwOWEzMzIzLDMzMjYKKz4gCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorPiAJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKz4gCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKz4gCSAgICA6CisxMDExLDEwMTJjMzMyOCwzMzM5Cis8IAkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorPCAJICAgIGJyZWFrIDIKKy0tLQorPiAJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorPiAJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCis+IAkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKz4gCSAgICBta2RpciBjb25mdGVzdC5kaXIKKz4gCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorPiAJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKz4gCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorPiAJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCis+IAkgICAgdGhlbgorPiAJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorPiAJICAgICAgYnJlYWsgMworPiAJICAgIGZpCisxMDE2LDEwMTljMzM0MywzMzUwCis8ICAgICAgIDs7Cis8ICAgICBlc2FjCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfSUZTIgorLS0tCis+ICAgICBkb25lCis+ICAgICA7OworPiBlc2FjCis+IAorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCis+IHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorMTAyM2MzMzU0Cis8ICAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorLS0tCis+ICAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKzEwMjUsMTAyNmMzMzU2LDMzNTcKKzwgICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKzwgICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorLS0tCis+ICAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCis+ICAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisxMDI4LDEwMjljMzM1OSwzMzYwCis8ICAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorPCAgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCistLS0KKz4gICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKz4gICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKzEwMzJjMzM2MywzMzY0Cis8IGVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKz4gJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KKzEwMzhjMzM3MAorPCB0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCistLS0KKz4gdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKzEwNTQsMTA1N2MzMzg2LDMzODkKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEwNTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1NUUklQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzEwNjIsMTA3MWMzMzk0LDM0MDgKKzwgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorPCAgIGFjX2R1bW15PSIkUEFUSCIKKzwgICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKzwgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCis8ICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKzwgICAgICAgYWNfY3ZfcHJvZ19TVFJJUD0ic3RyaXAiCis8ICAgICAgIGJyZWFrCis8ICAgICBmaQorPCAgIGRvbmUKKzwgICBJRlM9IiRhY19zYXZlX2lmcyIKKy0tLQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX1NUUklQPSJzdHJpcCIKKz4gICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cis+ICAgICBicmVhayAyCis+ICAgZmkKKz4gZG9uZQorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCisxMDc1YzM0MTIKKzwgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorLS0tCis+IFNUUklQPSRhY19jdl9wcm9nX1NUUklQCisxMDc3YzM0MTQsMzQxNQorPCAgIGVjaG8gIiRhY190IiIkU1RSSVAiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Cis+ICRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorMTA3OWMzNDE3LDM0MTgKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKz4gJGFzX2VjaG8gIm5vIiA+JjY7IH0KKzEwODJhMzQyMgorPiAKKzEwODVjMzQyNQorPCAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy0tLQorPiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorMTA4NywxMDkwYzM0MjcsMzQzMAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTA4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfVV9NQUtFJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wYXRoX1VfTUFLRStzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisxMDkyLDEwOTNjMzQzMiwzNDMzCis8ICAgY2FzZSAiJFVfTUFLRSIgaW4KKzwgICAvKikKKy0tLQorPiAgIGNhc2UgJFVfTUFLRSBpbgorPiAgIFtcXC9dKiB8ID86W1xcL10qKQorMTA5NiwxMDk4ZDM0MzUKKzwgICA/Oi8qKQkJCSAKKzwgICBhY19jdl9wYXRoX1VfTUFLRT0iJFVfTUFLRSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorPCAgIDs7CisxMTAwLDExMDljMzQzNywzNDUxCis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEgiCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wYXRoX1VfTUFLRT0iJGFjX2Rpci8kYWNfd29yZCIKKzwgICAgICAgYnJlYWsKKzwgICAgIGZpCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfaWZzIgorLS0tCis+ICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcGF0aF9VX01BS0U9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorMTExM2MzNDU1Cis8IFVfTUFLRT0iJGFjX2N2X3BhdGhfVV9NQUtFIgorLS0tCis+IFVfTUFLRT0kYWNfY3ZfcGF0aF9VX01BS0UKKzExMTVjMzQ1NywzNDU4Cis8ICAgZWNobyAiJGFjX3QiIiRVX01BS0UiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRVX01BS0UiID4mNQorPiAkYXNfZWNobyAiJFVfTUFLRSIgPiY2OyB9CisxMTE3YzM0NjAsMzQ2MQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorMTEyMGMzNDY0LDM0NjUKKzwgdGVzdCAtbiAiJFVfTUFLRSIgJiYgYnJlYWsKKy0tLQorPiAKKz4gICB0ZXN0IC1uICIkVV9NQUtFIiAmJiBicmVhaworMTEyOCwxMTMxYzM0NzMsMzQ3NgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTEzMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfRE9YWUdFTicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ET1hZR0VOK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzExMzMsMTEzNGMzNDc4LDM0NzkKKzwgICBjYXNlICIkRE9YWUdFTiIgaW4KKzwgICAvKikKKy0tLQorPiAgIGNhc2UgJERPWFlHRU4gaW4KKz4gICBbXFwvXSogfCA/OltcXC9dKikKKzExMzcsMTEzOWQzNDgxCis8ICAgPzovKikJCQkgCis8ICAgYWNfY3ZfcGF0aF9ET1hZR0VOPSIkRE9YWUdFTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorPCAgIDs7CisxMTQxLDExNTBjMzQ4MywzNDk4Cis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEg6L3Vzci9sb2NhbC9iaW46L3Vzci9iaW4iCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wYXRoX0RPWFlHRU49IiRhY19kaXIvJGFjX3dvcmQiCis8ICAgICAgIGJyZWFrCis8ICAgICBmaQorPCAgIGRvbmUKKzwgICBJRlM9IiRhY19zYXZlX2lmcyIKKy0tLQorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gYXNfZHVtbXk9IiRQQVRIOi91c3IvbG9jYWwvYmluOi91c3IvYmluIgorPiBmb3IgYXNfZGlyIGluICRhc19kdW1teQorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKz4gICAgIGFjX2N2X3BhdGhfRE9YWUdFTj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKz4gICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cis+ICAgICBicmVhayAyCis+ICAgZmkKKz4gZG9uZQorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCisxMTU0YzM1MDIKKzwgRE9YWUdFTj0iJGFjX2N2X3BhdGhfRE9YWUdFTiIKKy0tLQorPiBET1hZR0VOPSRhY19jdl9wYXRoX0RPWFlHRU4KKzExNTZjMzUwNCwzNTA1Cis8ICAgZWNobyAiJGFjX3QiIiRET1hZR0VOIiAxPiY2CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRE9YWUdFTiIgPiY1Cis+ICRhc19lY2hvICIkRE9YWUdFTiIgPiY2OyB9CisxMTU4YzM1MDcsMzUwOAorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorMTE2NCwxMTgwYzM1MTQsMzU0MworPCBpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Cis8IGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Cis8IGZpCis8IAorPCBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjExNzA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorPCAKKzwgaG9zdF9hbGlhcz0kaG9zdAorPCBjYXNlICIkaG9zdF9hbGlhcyIgaW4KKzwgTk9ORSkKKzwgICBjYXNlICRub25vcHQgaW4KKzwgICBOT05FKQorPCAgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorPCAgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgICBmaSA7OworPCAgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworPCAgIGVzYWMgOzsKKy0tLQorPiAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8Cis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworPiB0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKz4gICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAorPiB0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKz4gICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IGFjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKKz4gICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQorPiBjYXNlICRhY19jdl9idWlsZCBpbgorPiAqLSotKikgOzsKKz4gKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworMTE4MiwxMjE2YzM1NDUsMzU3MAorPCAKKzwgaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCis8IGhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKKzwgaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorPCBob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKzwgZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Cis8IAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjExOTE6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxMTk2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAKKzwgaW50IG1haW4oKSB7Cis8IAorPCAjaWZuZGVmIF9fQ1lHV0lOX18KKzwgI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXworPCAjZW5kaWYKKzwgcmV0dXJuIF9fQ1lHV0lOX187Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9jeWd3aW49eWVzCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9jeWd3aW49bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IGJ1aWxkPSRhY19jdl9idWlsZAorPiBhY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCis+IHNldCB4ICRhY19jdl9idWlsZAorPiBzaGlmdAorPiBidWlsZF9jcHU9JDEKKz4gYnVpbGRfdmVuZG9yPSQyCis+IHNoaWZ0OyBzaGlmdAorPiAjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKz4gIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgorPiBidWlsZF9vcz0kKgorPiBJRlM9JGFjX3NhdmVfSUZTCis+IGNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorPiAgIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCis+IGVsc2UKKz4gICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorPiAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorMTIxOSwxMjQ1ZDM1NzIKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKKzwgQ1lHV0lOPQorPCB0ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEyMjQ6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDEyMjkgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IAorPCBpbnQgbWFpbigpIHsKKzwgcmV0dXJuIF9fTUlOR1czMl9fOworPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfbWluZ3czMj15ZXMKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X21pbmd3MzI9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IHJtIC1mIGNvbmZ0ZXN0KgorMTI0NmEzNTc0LDM1OTMKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorPiBjYXNlICRhY19jdl9ob3N0IGluCis+ICotKi0qKSA7OworPiAqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiBlc2FjCis+IGhvc3Q9JGFjX2N2X2hvc3QKKz4gYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworPiBzZXQgeCAkYWNfY3ZfaG9zdAorPiBzaGlmdAorPiBob3N0X2NwdT0kMQorPiBob3N0X3ZlbmRvcj0kMgorPiBzaGlmdDsgc2hpZnQKKz4gIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCis+ICMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKKz4gaG9zdF9vcz0kKgorPiBJRlM9JGFjX3NhdmVfSUZTCis+IGNhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisxMjQ4LDEyNzdkMzU5NAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKKzwgTUlOR1czMj0KKzwgdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCis8IAorPCAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEyNTU6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KKzwgICBhY19jdl9leGVleHQ9LmV4ZQorPCBlbHNlCis8ICAgcm0gLWYgY29uZnRlc3QqCis8ICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Cis8ICAgYWNfY3ZfZXhlZXh0PQorPCAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgorPCAgICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KKzwgICAgICAgY2FzZSAkZmlsZSBpbgorPCAgICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKKzwgICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKKzwgICAgICAgZXNhYworPCAgICAgZG9uZQorPCAgIGVsc2UKKzwgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorPCAgIGZpCis8ICAgcm0gLWYgY29uZnRlc3QqCis8ICAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubworPCBmaQorPCBmaQorMTI3OSwxMjgyZDM1OTUKKzwgRVhFRVhUPSIiCis8IHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Cis8IGVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKKzwgYWNfZXhlZXh0PSRFWEVFWFQKKzEyODYsMTI4OGMzNTk5LDM2MDEKKzwgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbiIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxMjg4OiBjaGVja2luZyB3aGV0aGVyIHN0cmljdCBjb21waWxpbmcgaXMgb24iID4mNQorPCAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cmljdCBvciAtLWRpc2FibGUtc3RyaWN0IHdhcyBnaXZlbi4KKy0tLQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbiIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbi4uLiAiID4mNjsgfQorPiAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cmljdCB3YXMgZ2l2ZW4uCisxMjkwLDEyOTFjMzYwMworPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9zdHJpY3QiCis8ICAgCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9zdHJpY3Q7CisxMjk4YzM2MTAKKzwgICAgICAgCistLS0KKz4gCisxMzAzYzM2MTUsMzYxNgorPCAgICAgZWNobyAiJGFjX3QiIiRhY191c2Vfc3RyaWN0X29wdGlvbnMiIDE+JjYKKy0tLQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3VzZV9zdHJpY3Rfb3B0aW9ucyIgPiY1Cis+ICRhc19lY2hvICIkYWNfdXNlX3N0cmljdF9vcHRpb25zIiA+JjY7IH0KKzEzNDNjMzY1NiwzNjU3Cis8ICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjRiaXQtbGlicyBvciAtLWRpc2FibGUtNjRiaXQtbGlicyB3YXMgZ2l2ZW4uCistLS0KKz4gCis+ICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjRiaXQtbGlicyB3YXMgZ2l2ZW4uCisxMzQ1LDEzNDZjMzY1OQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV82NGJpdF9saWJzIgorPCAgIEVOQUJMRV82NEJJVF9MSUJTPSR7ZW5hYmxldmFsfQorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfNjRiaXRfbGliczsgRU5BQkxFXzY0QklUX0xJQlM9JHtlbmFibGV2YWx9CisxMzQ5YzM2NjIKKzwgICAgIAorLS0tCis+IAorMTM1MiwxMzUzYzM2NjUsMzY2NgorPCAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEzNTQ6IGNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IiA+JjUKKy0tLQorPiAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0Li4uICIgPiY2OyB9CisxNDA4YzM3MjEKKzwgICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCistLS0KKz4gICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA9IG5vOyB0aGVuCisxNDIwLDE0MjJjMzczMywzNzM4Cis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxNDIyICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMTQyNCwxNDI2YzM3NDAsMzc2MgorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKzE0MjksMTQzMmMzNzY1LDM3NzAKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBFTkFCTEVfNjRCSVRfTElCUz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IEVOQUJMRV82NEJJVF9MSUJTPW5vCisxNDM0YzM3NzIsMzc3MworPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxNDM2YTM3NzYKKz4gCisxNDUwYzM3OTAKKzwgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0KKz4gCisxNDU4LDE0NjBjMzc5OCwzODAzCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxNDYwICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMTQ2MiwxNDY0YzM4MDUsMzgyNworPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKzE0NjcsMTQ3MGMzODMwLDM4MzUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBFTkFCTEVfNjRCSVRfTElCUz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IEVOQUJMRV82NEJJVF9MSUJTPW5vCisxNDcyYzM4MzcsMzgzOAorPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxNDc0YTM4NDEKKz4gCisxNDgzLDE0ODVjMzg1MCwzODU1Cis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxNDg1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMTQ4NywxNDg5YzM4NTcsMzg3OQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKzE0OTIsMTQ5NWMzODgyLDM4ODcKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBFTkFCTEVfNjRCSVRfTElCUz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IEVOQUJMRV82NEJJVF9MSUJTPW5vCisxNDk3YzM4ODksMzg5MAorPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxNDk5YTM4OTMKKz4gCisxNTExYzM5MDUsMzkwNgorPCAgICAgICAgIGVjaG8gIiRhY190IiIkRU5BQkxFXzY0QklUX0xJQlMiIDE+JjYKKy0tLQorPiAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRFTkFCTEVfNjRCSVRfTElCUyIgPiY1Cis+ICRhc19lY2hvICIkRU5BQkxFXzY0QklUX0xJQlMiID4mNjsgfQorMTUxNywxNTIwYzM5MTIsMzkxNQorPCAJZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE1MTk6IGNoZWNraW5nIHdoaWNoIE1ha2VmaWxlIGZyYWdtZW50IHRvIHVzZSIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydpY3VfY3ZfaG9zdF9mcmFnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7aWN1X2N2X2hvc3RfZnJhZytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisxNTIyYzM5MTcKKzwgICAKKy0tLQorPiAKKzE1MjUsMTUyNmMzOTIwLDM5MjEKKzwgCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCQorPCAJCWljdV9jdl9ob3N0X2ZyYWc9bWgtc29sYXJpcy1nY2MgCistLS0KKz4gCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCis+IAkJaWN1X2N2X2hvc3RfZnJhZz1taC1zb2xhcmlzLWdjYworMTUzM2MzOTI4Cis8IAllbHNlICAKKy0tLQorPiAJZWxzZQorMTU4NywxNTg5ZDM5ODEKKzwgCQkKKzwgCQorPCBmaQorMTU5MWMzOTgzLDM5ODYKKzwgZWNobyAiJGFjX3QiIiRpY3VfY3ZfaG9zdF9mcmFnIiAxPiY2CistLS0KKz4gCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRpY3VfY3ZfaG9zdF9mcmFnIiA+JjUKKz4gJGFzX2VjaG8gIiRpY3VfY3ZfaG9zdF9mcmFnIiA+JjY7IH0KKzE1OTUsMTU5OWMzOTkwLDM5OTMKKzwgCSotKi1ocHV4KikgCWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTU5NzogY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIgPiY1Cis8IGFjX2xpYl92YXI9YGVjaG8gbSdfJ2Zsb29yIHwgc2VkICd5JS4vKy0lX19wXyUnYAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAkqLSotaHB1eCopIAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0uLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9saWJfbV9mbG9vcitzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisxNjAxYzM5OTUKKzwgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorLS0tCis+ICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworMTYwMywxNjI5YzM5OTcsNDA1NQorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDE2MDUgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgZmxvb3IoKTsKKzwgCis8IGludCBtYWluKCkgeworPCBmbG9vcigpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorPCAKKzwgZmkKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKzwgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistLS0KKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAKKz4gLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCis+ICAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworPiAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPiAjaWZkZWYgX19jcGx1c3BsdXMKKz4gZXh0ZXJuICJDIgorPiAjZW5kaWYKKz4gY2hhciBmbG9vciAoKTsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gZmxvb3IgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2xpYl9tX2Zsb29yPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9saWJfbV9mbG9vcj1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX21fZmxvb3IiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2xpYl9tX2Zsb29yIiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl9saWJfbV9mbG9vciIgPSB4IiJ5ZXM7IHRoZW4KKzE2MzEsMTYzMmQ0MDU2Cis8IGVsc2UKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKzE2MzUsMTY2NmQ0MDU4Cis8IAkKKzwgCSopIAkJZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxNjM4OiBjaGVja2luZyBmb3IgZmxvb3IgaW4gLWxtIiA+JjUKKzwgYWNfbGliX3Zhcj1gZWNobyBtJ18nZmxvb3IgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorPCBMSUJTPSItbG0gICRMSUJTIgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDE2NDYgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgZmxvb3IoKTsKKzwgCis8IGludCBtYWluKCkgeworPCBmbG9vcigpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorMTY2OCwxNjc1YzQwNjAsNDEyOQorPCBmaQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorPCAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKzwgICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG0gfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKzwgICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKzwgI2RlZmluZSAkYWNfdHJfbGliIDEKKzwgRU9GCistLS0KKz4gCSopCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvb3IgaW4gLWxtIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9tX2Zsb29yK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKKz4gTElCUz0iLWxtICAkTElCUyIKKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAKKz4gLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCis+ICAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworPiAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPiAjaWZkZWYgX19jcGx1c3BsdXMKKz4gZXh0ZXJuICJDIgorPiAjZW5kaWYKKz4gY2hhciBmbG9vciAoKTsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gZmxvb3IgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2xpYl9tX2Zsb29yPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9saWJfbV9mbG9vcj1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX21fZmxvb3IiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2xpYl9tX2Zsb29yIiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl9saWJfbV9mbG9vciIgPSB4IiJ5ZXM7IHRoZW4KKz4gICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCis+ICNkZWZpbmUgSEFWRV9MSUJNIDEKKz4gX0FDRU9GCisxNjc5LDE2ODBkNDEzMgorPCBlbHNlCis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisxNjgyYzQxMzQKKzwgIAorLS0tCis+IAorMTY4NywxNjg4YzQxMzksNDE0MAorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTY4OTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisxNjkwYzQxNDIKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIHdhcyBnaXZlbi4KKzE2OTIsMTY5M2M0MTQ0Cis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKzwgICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTcwM2M0MTU0LDQxNTUKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTcwNiwxNzA3YzQxNTgsNDE1OQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTcwODogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisxNzA5YzQxNjEKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIHdhcyBnaXZlbi4KKzE3MTEsMTcxMmM0MTYzCis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKKzwgICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfc3RhdGljOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTcxOWM0MTcwLDQxNzEKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTcyMiwxNzIzYzQxNzQsNDE3NQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGRlYnVnIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxNzI0OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGRlYnVnIGxpYnJhcmllcyIgPiY1CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgZGVidWcgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKzE3MjZjNDE3OAorPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgb3IgLS1kaXNhYmxlLWRlYnVnIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgd2FzIGdpdmVuLgorMTcyOCwxNzI5YzQxODAKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfZGVidWciCis8ICAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX2RlYnVnOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTczNWM0MTg2LDQxODcKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTczOCwxNzM5YzQxOTAsNDE5MQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE3NDA6IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMiID4mNQorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCByZWxlYXNlIGxpYnJhcmllcy4uLiAiID4mNjsgfQorMTc0MmM0MTk0Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yZWxlYXNlIG9yIC0tZGlzYWJsZS1yZWxlYXNlIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVsZWFzZSB3YXMgZ2l2ZW4uCisxNzQ0LDE3NDVjNDE5NgorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9yZWxlYXNlIgorPCAgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9yZWxlYXNlOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTc1MWM0MjAyLDQyMDMKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTc1NCwxNzU5YzQyMDYsNDIxMgorPCAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis8IHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE3NTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCis+ICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTc2NCwxNzc0YzQyMTcsNDIzMQorPCAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCis8ICAgYWNfZHVtbXk9IiRQQVRIIgorPCAgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCis8ICAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKKy0tLQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorMTc3N2M0MjM0Cis8IFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorLS0tCis+IFJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKKzE3NzljNDIzNiw0MjkzCis8ICAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQorPiAkYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis+IAorPiAKKz4gZmkKKz4gaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorPiAgIGFjX2N0X1JBTkxJQj0kUkFOTElCCis+ICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorPiBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKz4gZWxzZQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gZmkKKz4gZmkKKz4gYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgorPiBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorPiAkYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis+IAorPiAgIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KKz4gICAgIFJBTkxJQj0iOiIKKz4gICBlbHNlCis+ICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCis+IHllczopCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cis+IGFjX3Rvb2xfd2FybmVkPXllcyA7OworPiBlc2FjCis+ICAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorPiAgIGZpCisxNzgxYzQyOTUKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorMTc4NiwxNzg5YzQzMDAsNDMwMworPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTc4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfQVIrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTc5MSwxNzkyYzQzMDUsNDMwNgorPCAgIGNhc2UgIiRBUiIgaW4KKzwgICAvKikKKy0tLQorPiAgIGNhc2UgJEFSIGluCis+ICAgW1xcL10qIHwgPzpbXFwvXSopCisxNzk1LDE3OTdkNDMwOAorPCAgID86LyopCQkJIAorPCAgIGFjX2N2X3BhdGhfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorPCAgIDs7CisxNzk5LDE4MDhjNDMxMCw0MzI1Cis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEg6L2JpbjovdXNyL2JpbjovdXNyL2Njcy9iaW4iCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wYXRoX0FSPSIkYWNfZGlyLyRhY193b3JkIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCistLS0KKz4gICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGFzX2R1bW15PSIkUEFUSDovYmluOi91c3IvYmluOi91c3IvY2NzL2JpbiIKKz4gZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wYXRoX0FSPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKzE4MTNjNDMzMAorPCBBUj0iJGFjX2N2X3BhdGhfQVIiCistLS0KKz4gQVI9JGFjX2N2X3BhdGhfQVIKKzE4MTVjNDMzMiw0MzMzCis8ICAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFSIiA+JjUKKz4gJGFzX2VjaG8gIiRBUiIgPiY2OyB9CisxODE3YzQzMzUsNDMzNgorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorMTgyMSwxODIyYzQzNDAsNDM0MgorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSByZW5hbWluZyBvZiBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE4MjM6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlbmFtaW5nIG9mIHN5bWJvbHMiID4mNQorLS0tCis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgcmVuYW1pbmcgb2Ygc3ltYm9scyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlbmFtaW5nIG9mIHN5bWJvbHMuLi4gIiA+JjY7IH0KKzE4MjVjNDM0NQorPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVuYW1pbmcgb3IgLS1kaXNhYmxlLXJlbmFtaW5nIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVuYW1pbmcgd2FzIGdpdmVuLgorMTgyNywxODI4YzQzNDcKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfcmVuYW1pbmciCis8ICAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX3JlbmFtaW5nOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTgzNWM0MzU0LDQzNTUKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTgzOCwxODM5YzQzNTgsNDM1OQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE4NDA6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGZ1bmN0aW9uIGFuZCBkYXRhIHRyYWNpbmciID4mNQorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZy4uLiAiID4mNjsgfQorMTg0MmM0MzYyCis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10cmFjaW5nIG9yIC0tZGlzYWJsZS10cmFjaW5nIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdHJhY2luZyB3YXMgZ2l2ZW4uCisxODQ0LDE4NDVjNDM2NAorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV90cmFjaW5nIgorPCAgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV90cmFjaW5nOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTg1MmM0MzcxLDQzNzIKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTg1NWM0Mzc1Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ycGF0aCBvciAtLWRpc2FibGUtcnBhdGggd2FzIGdpdmVuLgorLS0tCis+ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ycGF0aCB3YXMgZ2l2ZW4uCisxODU3LDE4NThjNDM3NworPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9ycGF0aCIKKzwgICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfcnBhdGg7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisxODcxLDE4NzRjNDM5MCw0MzkzCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE4NzM6IGNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZGVmaW5pdGlvbiBvZiBVX0lOTElORSBmb3IgQyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfY19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTg3OCwxODgwYzQzOTcsNDQwMgorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMTg4MCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzE4ODJjNDQwNCw0NDA2Cis8IGludCBtYWluKCkgeworLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKzE4ODQsMTg4N2M0NDA4LDQ0MjkKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorMTg5MCwxODkxYzQ0MzIsNDQzNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisxODkzYzQ0MzcsNDQzOAorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxODk1LDE4OTZkNDQzOQorPCAgIAorPCBmaQorMTg5OGM0NDQxLDQ0NDMKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorLS0tCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfY19pbmxpbmUiID4mNjsgfQorMTkwOGM0NDUzCis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10aHJlYWRzIG9yIC0tZGlzYWJsZS10aHJlYWRzIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGhyZWFkcyB3YXMgZ2l2ZW4uCisxOTEwLDE5MTFjNDQ1NQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV90aHJlYWRzIgorPCAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX3RocmVhZHM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKzE5MTRjNDQ1OCw0NDYwCis8IAkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10aHJlYWRzIiAxPiYyOyBleGl0IDE7IH0gOzsKKy0tLQorPiAJCSopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10aHJlYWRzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRocmVhZHMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMTkzMCwxOTM1YzQ0NzYsNDQ4MQorPCAgICAgICAgICAgIAorPCAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2F0dHJfaW5pdCBpbiAtbHB0aHJlYWQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTkzMzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfYXR0cl9pbml0IGluIC1scHRocmVhZCIgPiY1Cis8IGFjX2xpYl92YXI9YGVjaG8gcHRocmVhZCdfJ3B0aHJlYWRfYXR0cl9pbml0IHwgc2VkICd5JS4vKy0lX19wXyUnYAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX2F0dHJfaW5pdCBpbiAtbHB0aHJlYWQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTkzN2M0NDgzCis8ICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKy0tLQorPiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKKzE5MzksMTk3MGM0NDg1LDQ1NDYKKzwgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxOTQxICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworPCAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCis8ICAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPCBjaGFyIHB0aHJlYWRfYXR0cl9pbml0KCk7Cis8IAorPCBpbnQgbWFpbigpIHsKKzwgcHRocmVhZF9hdHRyX2luaXQoKQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKzwgTElCUz0iJGFjX3NhdmVfTElCUyIKKzwgCis8IGZpCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gcHRocmVhZCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorPCAgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorPCAjZGVmaW5lICRhY190cl9saWIgMQorPCBFT0YKKy0tLQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIHB0aHJlYWRfYXR0cl9pbml0ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX2F0dHJfaW5pdCAoKTsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCis+ICAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0PW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQiID4mNjsgfQorPiBpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0IiA9IHgiInllczsgdGhlbgorPiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQorPiBfQUNFT0YKKzE5NzQsMTk3NWQ0NTQ5Cis8IGVsc2UKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKzE5ODEsMTk4NmM0NTU1LDQ1NjAKKzwgICAgICAgICAgICAgICAgCis8ICAgIAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxOTg1OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBwdGhyZWFkX211dGV4X2Rlc3Ryb3kuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzE5OTIsMjAwNWM0NTY2LDQ2MDgKKzwgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxOTk0ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworPCAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCis8ICAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPCBjaGFyIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpOworPCAKKzwgaW50IG1haW4oKSB7Cis8IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMjAwOSwyMDEwYzQ2MTIsNDYxNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyMDEyYzQ2MTcsNDYyMAorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzIwMTUsMjAyOGM0NjIzLDQ2NjUKKzwgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyMDE3ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworPCAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCis8ICAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPCBjaGFyIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpOworPCAKKzwgaW50IG1haW4oKSB7Cis8IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMjAzMSwyMDMyYzQ2NjgsNDY3MQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyMDM0YzQ2NzMsNDY3NgorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzIwMzgsMjAzOWM0NjgwLDQ2ODEKKzwgCis8IGVjaG8gIiRhY190IiIkYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjY7IH0KKzIwNDJjNDY4NAorPCAgIAorLS0tCis+IAorMjA0NGM0Njg2Cis8ICAgCistLS0KKz4gCisyMDUwLDIwNTRjNDY5Miw0Njk2Cis8ICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBpbiAtbHB0aHJlYWQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjA1MjogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBpbiAtbHB0aHJlYWQiID4mNQorPCBhY19saWJfdmFyPWBlY2hvIHB0aHJlYWQnXydwdGhyZWFkX211dGV4X2luaXQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4gCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9pbml0IGluIC1scHRocmVhZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2luaXQgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzIwNTZjNDY5OAorPCAgIGFjX3NhdmVfTElCUz0iJExJQlMiCistLS0KKz4gICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCisyMDU4LDIwODljNDcwMCw0NzYxCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjA2MCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciBwdGhyZWFkX211dGV4X2luaXQoKTsKKzwgCis8IGludCBtYWluKCkgeworPCBwdGhyZWFkX211dGV4X2luaXQoKQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKzwgTElCUz0iJGFjX3NhdmVfTElCUyIKKzwgCis8IGZpCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gcHRocmVhZCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorPCAgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorPCAjZGVmaW5lICRhY190cl9saWIgMQorPCBFT0YKKy0tLQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIHB0aHJlYWRfbXV0ZXhfaW5pdCAoKTsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gcHRocmVhZF9tdXRleF9pbml0ICgpOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdD1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQiID4mNjsgfQorPiBpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdCIgPSB4IiJ5ZXM7IHRoZW4KKz4gICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCis+ICNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKKz4gX0FDRU9GCisyMDkzLDIwOTRkNDc2NAorPCBlbHNlCis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisyMTAyLDIxMDljNDc3Miw0Nzg2Cis8ICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2siIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjEwNDogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjEwOSAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2suLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IC8qIERlZmluZSBwdGhyZWFkX211dGV4X2xvY2sgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwdGhyZWFkX211dGV4X2xvY2suCis+ICAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworPiAjZGVmaW5lIHB0aHJlYWRfbXV0ZXhfbG9jayBpbm5vY3VvdXNfcHRocmVhZF9tdXRleF9sb2NrCis+IAorMjExMSwyMTE2YzQ3ODgsNDc5NgorPCAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwdGhyZWFkX211dGV4X2xvY2soKTsgYmVsb3cuICAqLworPCAjaW5jbHVkZSA8YXNzZXJ0Lmg+Cis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgcHRocmVhZF9tdXRleF9sb2NrKCk7CistLS0KKz4gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOyBiZWxvdy4KKz4gICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCis+IAorPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCisyMTE4YzQ3OTgKKzwgaW50IG1haW4oKSB7CistLS0KKz4gI3VuZGVmIHB0aHJlYWRfbXV0ZXhfbG9jaworMjExOWE0ODAwLDQ4MDYKKz4gLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCis+ICAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworPiAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPiAjaWZkZWYgX19jcGx1c3BsdXMKKz4gZXh0ZXJuICJDIgorPiAjZW5kaWYKKz4gY2hhciBwdGhyZWFkX211dGV4X2xvY2sgKCk7CisyMTIzYzQ4MTAKKzwgI2lmIGRlZmluZWQgKF9fc3R1Yl9wdGhyZWFkX211dGV4X2xvY2spIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3B0aHJlYWRfbXV0ZXhfbG9jaykKKy0tLQorPiAjaWYgZGVmaW5lZCBfX3N0dWJfcHRocmVhZF9tdXRleF9sb2NrIHx8IGRlZmluZWQgX19zdHViX19fcHRocmVhZF9tdXRleF9sb2NrCisyMTI1LDIxMjZkNDgxMQorPCAjZWxzZQorPCBwdGhyZWFkX211dGV4X2xvY2soKTsKKzIxMjksMjE0N2M0ODE0LDQ4NTMKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCAKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ncHRocmVhZF9tdXRleF9sb2NrYFwiID0geWVzIjsgdGhlbgorPCAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKzwgICA6Cis8IGVsc2UKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX211dGV4X2xvY2sgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaz1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzIxNDhhNDg1NSw0ODU2Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2siID4mNjsgfQorMjE1NmM0ODY0Cis8ICAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCistLS0KKz4gICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID0gbm87IHRoZW4KKzIxODAsMjE4OGM0ODg4LDQ4OTkKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjE4MjogY2hlY2tpbmcgZm9yIG1tYXAiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyMTg3ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAgICAgCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtbWFwIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG1tYXAuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfb2src2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAKKzIxOTMsMjE5NGM0OTA0LDQ5MDcKKzwgICAgIAorPCBpbnQgbWFpbigpIHsKKy0tLQorPiAKKz4gaW50Cis+IG1haW4gKCkKKz4geworMjE5NiwyMTk5YzQ5MDksNDkzMworPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxOTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzIyMDIsMjIwNWM0OTM2LDQ5MzkKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9mdW5jX21tYXBfb2s9bm8KKy0tLQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY3ZfZnVuY19tbWFwX29rPW5vCisyMjA3YzQ5NDEsNDk0NAorPCBybSAtZiBjb25mdGVzdCogCistLS0KKz4gCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisyMjEwYzQ5NDcsNDk0OAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9vayIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX21tYXBfb2siID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2Z1bmNfbW1hcF9vayIgPiY2OyB9CisyMjI3LDIyMjhjNDk2NSw0OTcxCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjIyMjk6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKy0tLQorPiBhY19leHQ9YworPiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCis+IGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCis+IGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KKzIyMzQsMjIzNWM0OTc3LDUwODQKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+ICAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCis+ICAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorPiAgICAgZG8KKz4gICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorPiBmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKKz4gZG8KKz4gICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCis+ICAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCis+ICAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCis+ICAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCis+ICAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKz4gICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpZmRlZiBfX1NURENfXworPiAjIGluY2x1ZGUgPGxpbWl0cy5oPgorPiAjZWxzZQorPiAjIGluY2x1ZGUgPGFzc2VydC5oPgorPiAjZW5kaWYKKz4gCQkgICAgIFN5bnRheCBlcnJvcgorPiBfQUNFT0YKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCis+IGZpCis+IAorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiAKKz4gICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworPiAgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKz4gX0FDRU9GCis+IGlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9OyB0aGVuCis+ICAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KKz4gY29udGludWUKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAgICMgUGFzc2VzIGJvdGggdGVzdHMuCis+IGFjX3ByZXByb2Nfb2s9OgorPiBicmVhaworPiBmaQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+IGRvbmUKKz4gIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IGlmICRhY19wcmVwcm9jX29rOyB0aGVuCis+ICAgYnJlYWsKKz4gZmkKKz4gCis+ICAgICBkb25lCis+ICAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCis+IAorPiBmaQorPiAgIENQUD0kYWNfY3ZfcHJvZ19DUFAKKzIyMzcsMjIzOWM1MDg2LDUwOTYKKzwgICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Cis8ICAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKzwgICBDUFA9IiR7Q0MtY2N9IC1FIgorLS0tCis+ICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1BQIiA+JjUKKz4gJGFzX2VjaG8gIiRDUFAiID4mNjsgfQorPiBhY19wcmVwcm9jX29rPWZhbHNlCis+IGZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworPiBkbworPiAgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKz4gICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKz4gICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKzIyNDEsMjI1MWM1MDk4LDUxMjgKKzwgICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjI0NCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGFzc2VydC5oPgorPCBTeW50YXggRXJyb3IKKzwgRU9GCis8IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCis8IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKzwgYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorPCBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLS0tCis+ICAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCis+IAkJICAgICBTeW50YXggZXJyb3IKKz4gX0FDRU9GCis+IGlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9OyB0aGVuCisyMjU0LDIyNjhjNTEzMSw1MTgzCis8ICAgZWNobyAiJGFjX2VyciIgPiY1Cis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjI2MSAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGFzc2VydC5oPgorPCBTeW50YXggRXJyb3IKKzwgRU9GCis8IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCis8IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKzwgYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorPCBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorPiBjb250aW51ZQorPiBmaQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+ICAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKz4gICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Cis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfTsgdGhlbgorPiAgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIFBhc3NlcyBib3RoIHRlc3RzLgorPiBhY19wcmVwcm9jX29rPToKKz4gYnJlYWsKKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IAorPiBkb25lCis+ICMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiBpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorMjI3MSwyMjg1YzUxODYsNTQwMAorPCAgIGVjaG8gIiRhY19lcnIiID4mNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDIyNzggImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgU3ludGF4IEVycm9yCis8IEVPRgorPCBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorPCB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyODQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cis8IGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKzwgaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKy0tLQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKKz4gU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorPiBmaQorPiAKKz4gYWNfZXh0PWMKKz4gYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKz4gICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKKz4gICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbworPiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKz4gICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQorPiAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCis+ICAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKKz4gY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorPiAqR05VKikKKz4gICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKz4gKikKKz4gICBhY19jb3VudD0wCis+ICAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCis+ICAgd2hpbGUgOgorPiAgIGRvCis+ICAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorPiAgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorPiAgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCis+ICAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorPiAgICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKz4gICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKz4gICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCis+ICAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCis+ICAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorPiAgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCis+ICAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Cis+ICAgICBmaQorPiAgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorPiAgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCis+ICAgZG9uZQorPiAgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworPiBlc2FjCis+IAorPiAgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKz4gICAgIGRvbmUKKz4gICBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCis+ICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gICBmaQorPiBlbHNlCis+ICAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCis+IGZpCis+IAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQorPiAgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKKz4gCis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorPiAgICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgorPiAgICBlbHNlCis+ICAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorPiAgIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKKz4gICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKz4gICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorPiAgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKz4gIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKz4gICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKKz4gY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKz4gKkdOVSopCis+ICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7Cis+ICopCis+ICAgYWNfY291bnQ9MAorPiAgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorPiAgIHdoaWxlIDoKKz4gICBkbworPiAgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKz4gICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKz4gICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorPiAgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCis+ICAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKz4gICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKz4gICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCis+ICAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorPiAgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKz4gICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCis+ICAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorPiAgICAgZmkKKz4gICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKz4gICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworPiAgIGRvbmUKKz4gICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKKz4gZXNhYworPiAKKz4gICAgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMworPiAgICAgZG9uZQorPiAgIGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+ICAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCis+ICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAgIGZpCis+IGVsc2UKKz4gICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorPiBmaQorPiAKKz4gICAgZmkKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorPiAgRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgorPiAKKz4gCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8c3RkbGliLmg+Cis+ICNpbmNsdWRlIDxzdGRhcmcuaD4KKz4gI2luY2x1ZGUgPHN0cmluZy5oPgorPiAjaW5jbHVkZSA8ZmxvYXQuaD4KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9oZWFkZXJfc3RkYz1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IAorPiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorPiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDxzdHJpbmcuaD4KKz4gCis+IF9BQ0VPRgorPiBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis+ICAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorMjI4OCwyMjkyYzU0MDMKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBDUFA9L2xpYi9jcHAKKy0tLQorPiAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCisyMjk0YTU0MDYsNTQyNAorPiAKKz4gZmkKKz4gCis+IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis+ICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPHN0ZGxpYi5oPgorPiAKKz4gX0FDRU9GCis+IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKz4gICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCisyMjk2YTU0MjcsNTUwMQorPiAKKz4gZmkKKz4gCis+IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis+ICAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorPiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8Y3R5cGUuaD4KKz4gI2luY2x1ZGUgPHN0ZGxpYi5oPgorPiAjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCis+ICMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKz4gIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorPiAjZWxzZQorPiAjIGRlZmluZSBJU0xPV0VSKGMpIFwKKz4gCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorPiAJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorPiAJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCis+ICMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCis+ICNlbmRpZgorPiAKKz4gI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAgIGludCBpOworPiAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKz4gICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKz4gCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorPiAgICAgICByZXR1cm4gMjsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICggZXhpdCAkYWNfc3RhdHVzICkKKz4gYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKz4gZmkKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IAorPiAKKzIyOTgsMjI5OWQ1NTAyCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorMjMwMSwyMzAzYzU1MDQsNTUxMQorPCAgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorPCBlbHNlCis8ICAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Cis+IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis+IAorPiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorPiAjZGVmaW5lIFNURENfSEVBREVSUyAxCis+IF9BQ0VPRgorPiAKKzIzMDVkNTUxMgorPCBlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorMjMwN2M1NTE0LDU1MjUKKzwgZm9yIGFjX2hkciBpbiBpbnR0eXBlcy5oCistLS0KKz4gIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCis+IAkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCisyMzA5LDIzMzNjNTUyNyw1NTgxCis8IGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyMzEyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDIzMTcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDwkYWNfaGRyPgorPCBFT0YKKzwgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKzwgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorPCBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCis8IGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCis8IGVsc2UKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gIiA+JjY7IH0KKz4gaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IAorPiAjaW5jbHVkZSA8JGFjX2hlYWRlcj4KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCis+IGZpCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4gYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+IAkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Cis+ICRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKz4gYXNfdmFsPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+ICAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbgorPiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCis+IF9BQ0VPRgorPiAKKzIzMzUsMjM0M2M1NTgzLDU3MjgKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKzwgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Cis8ICAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKzwgI2RlZmluZSAkYWNfdHJfaGRyIDEKKzwgRU9GCis8ICAKKzwgZWxzZQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+IAorPiBkb25lCis+IAorPiAKKz4gCis+IGZvciBhY19oZWFkZXIgaW4gaW50dHlwZXMuaAorPiBkbworPiBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCis+IGlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAiID4mNjsgfQorPiBpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZmkKKz4gYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+IAkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Cis+ICRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKz4gZWxzZQorPiAgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+ICNpbmNsdWRlIDwkYWNfaGVhZGVyPgorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2hlYWRlcl9jb21waWxlcj1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorPiAkYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Cis+IAorPiAjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICIgPiY2OyB9Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPCRhY19oZWFkZXI+Cis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICAgYWNfaGVhZGVyX3ByZXByb2M9bm8KKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Cis+ICRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorPiAKKz4gIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Cis+IGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKz4gICB5ZXM6bm86ICkKKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKz4gICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworPiAgICAgOzsKKz4gICBubzp5ZXM6KiApCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKz4gCis+ICAgICA7OworPiBlc2FjCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICIgPiY2OyB9Cis+IGlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorPiBmaQorPiBhY19yZXM9YGV2YWwgJ2FzX3ZhbD0keyckYXNfYWNfSGVhZGVyJ30KKz4gCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKz4gCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorPiAKKz4gZmkKKz4gYXNfdmFsPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+ICAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbgorPiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCis+IF9BQ0VPRgorPiAKKzIzNDRhNTczMAorPiAKKzIzNTNjNTczOSw1NzQwCis8ICBlY2hvICIkYWNfdCIiIkMgY29tcGlsZXIgc2V0IHRvIENDQyAke0NDfSIgIiAxPiY2CistLS0KKz4gIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IFwiQyBjb21waWxlciBzZXQgdG8gQ0NDICR7Q0N9XCIgIiA+JjUKKz4gJGFzX2VjaG8gIlwiQyBjb21waWxlciBzZXQgdG8gQ0NDICR7Q0N9XCIgIiA+JjY7IH0KKzIzNjFjNTc0OCw1NzQ5Cis8ICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW9zdHJlYW0gb3IgLS13aXRob3V0LWlvc3RyZWFtIHdhcyBnaXZlbi4KKy0tLQorPiAKKz4gIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pb3N0cmVhbSB3YXMgZ2l2ZW4uCisyMzYzLDIzNjRjNTc1MQorPCAgIHdpdGh2YWw9IiR3aXRoX2lvc3RyZWFtIgorPCAgIGNhc2UgIiR7d2l0aHZhbH0iIGluCistLS0KKz4gICB3aXRodmFsPSR3aXRoX2lvc3RyZWFtOyBjYXNlICIke3dpdGh2YWx9IiBpbgorMjM2OWM1NzU2LDU3NTgKKzwgCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtaW9zdHJlYW0iIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtaW9zdHJlYW0iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIC0td2l0aC1pb3N0cmVhbSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisyMzc5LDIzODFjNTc2OCw1NzY5Cis8ICAgICAKKzwgICAgIGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorLS0tCis+IAorPiAgICAgYWNfZXh0PWNwcAorMjM4MywyMzg1YzU3NzEsNTc3MworPCBhY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCistLS0KKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKzIzOTMsMjM5N2M1NzgxLDU3ODkKKzwgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGlvc3RyZWFtIHVzYWJpbGl0eSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyMzk1OiBjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkiID4mNQorPCAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyMzk3ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaW9zdHJlYW0gdXNhYmlsaXR5IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaW9zdHJlYW0gdXNhYmlsaXR5Li4uICIgPiY2OyB9Cis+IAorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyMzk5YzU3OTEsNTc5MworPCBpbnQgbWFpbigpIHsKKy0tLQorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNDAxLDI0MDRjNTc5NSw1ODE2Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorMjQwNywyNDEwYzU4MTksNTgyMgorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X2hlYWRlcl9pb3N0cmVhbT1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9oZWFkZXJfaW9zdHJlYW09bm8KKzI0MTJjNTgyNCw1ODI1Cis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzI0MTdjNTgzMCw1ODMxCis8ICAgICBlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSIgMT4mNgorLS0tCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfaW9zdHJlYW0iID4mNjsgfQorMjQyMywyNDI0YzU4MzcsNTg0MworPCAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjQyNTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3NvciIgPiY1CistLS0KKz4gICAgICAgICBhY19leHQ9Y3BwCis+IGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCis+IGFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorMjQyNiwyNDI3YzU4NDUsNTg0NgorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DWFhDUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4gICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1hYQ1BQK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzI0MjksMjQ0NGM1ODQ4LDU4ODkKKzwgICBhY19leHQ9QworPCAjIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKzwgYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKzwgYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKzwgYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworPCAgIENYWENQUD0iJHtDWFgtZysrfSAtRSIKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI0MzggImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgRU9GCis8IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCis8IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKzwgYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorPCBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLS0tCis+ICAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENYWENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorPiAgICAgZm9yIENYWENQUCBpbiAiJENYWCAtRSIgIi9saWIvY3BwIgorPiAgICAgZG8KKz4gICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorPiBmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworPiBkbworPiAgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKz4gICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKz4gICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKz4gICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorPiAgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2lmZGVmIF9fU1REQ19fCis+ICMgaW5jbHVkZSA8bGltaXRzLmg+Cis+ICNlbHNlCis+ICMgaW5jbHVkZSA8YXNzZXJ0Lmg+Cis+ICNlbmRpZgorPiAJCSAgICAgU3ludGF4IGVycm9yCis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKzI0NDcsMjQ1MWM1ODkyLDU4OTYKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBDWFhDUFA9L2xpYi9jcHAKKy0tLQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KKz4gY29udGludWUKKzI0NTMsMjQ4OGM1ODk4LDU5MzYKKzwgcm0gLWYgY29uZnRlc3QqCis8ICAgYWNfY3ZfcHJvZ19DWFhDUFA9IiRDWFhDUFAiCis8IGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCis8IGZpCis8IGZpCis8IENYWENQUD0iJGFjX2N2X3Byb2dfQ1hYQ1BQIgorPCBlY2hvICIkYWNfdCIiJENYWENQUCIgMT4mNgorPCAKKzwgYWNfc2FmZT1gZWNobyAiaW9zdHJlYW0uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI0Njk6IGNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjQ3NCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGlvc3RyZWFtLmg+Cis8IEVPRgorPCBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorPCB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Nzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cis8IGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKzwgaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKKzwgZWxzZQorPCAgIGVjaG8gIiRhY19lcnIiID4mNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKKy0tLQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+ICAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKz4gICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Cis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorPiBjb250aW51ZQorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KKz4gYWNfcHJlcHJvY19vaz06Cis+IGJyZWFrCisyNDkwYzU5MzgsNjAwMworPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+IGRvbmUKKz4gIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IGlmICRhY19wcmVwcm9jX29rOyB0aGVuCis+ICAgYnJlYWsKKz4gZmkKKz4gCis+ICAgICBkb25lCis+ICAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCis+IAorPiBmaQorPiAgIENYWENQUD0kYWNfY3ZfcHJvZ19DWFhDUFAKKz4gZWxzZQorPiAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWENQUCIgPiY1Cis+ICRhc19lY2hvICIkQ1hYQ1BQIiA+JjY7IH0KKz4gYWNfcHJlcHJvY19vaz1mYWxzZQorPiBmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworPiBkbworPiAgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKz4gICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKz4gICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKz4gICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorPiAgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2lmZGVmIF9fU1REQ19fCis+ICMgaW5jbHVkZSA8bGltaXRzLmg+Cis+ICNlbHNlCis+ICMgaW5jbHVkZSA8YXNzZXJ0Lmg+Cis+ICNlbmRpZgorPiAJCSAgICAgU3ludGF4IGVycm9yCis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCisyNDkyLDI0OTNjNjAwNSw2MDUxCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorLS0tCis+IAorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiAKKz4gICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworPiAgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKz4gX0FDRU9GCis+IGlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyRhY19jeHhfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfTsgdGhlbgorPiAgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIFBhc3NlcyBib3RoIHRlc3RzLgorPiBhY19wcmVwcm9jX29rPToKKz4gYnJlYWsKKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IAorPiBkb25lCis+ICMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiBpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorMjQ5NmM2MDU0LDYxOTUKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKz4gZmkKKz4gCis+IGFjX2V4dD1jcHAKKz4gYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKz4gCis+IAorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9pb3N0cmVhbV9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmguLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfaW9zdHJlYW1faCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfaW9zdHJlYW1faCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNjsgfQorPiBlbHNlCis+ICAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHVzYWJpbGl0eSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGlvc3RyZWFtLmggdXNhYmlsaXR5Li4uICIgPiY2OyB9Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gI2luY2x1ZGUgPGlvc3RyZWFtLmg+Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19oZWFkZXJfY29tcGlsZXI9bm8KKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorPiAKKz4gIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHByZXNlbmNlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaW9zdHJlYW0uaCBwcmVzZW5jZS4uLiAiID4mNjsgfQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDxpb3N0cmVhbS5oPgorPiBfQUNFT0YKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9OyB0aGVuCis+ICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICBhY19oZWFkZXJfcHJlcHJvYz1ubworPiBmaQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Cis+IAorPiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KKz4gY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluCis+ICAgeWVzOm5vOiApCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Cis+ICAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKz4gICAgIDs7Cis+ICAgbm86eWVzOiogKQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW9zdHJlYW0uaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Cis+IAorPiAgICAgOzsKKz4gZXNhYworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmgiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgaW9zdHJlYW0uaC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9pb3N0cmVhbV9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oPSRhY19oZWFkZXJfcHJlcHJvYworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oIiA+JjY7IH0KKz4gCisyNDk4YTYxOTgKKz4gCisyNTAwLDI1MDdjNjIwMCw2MjEwCis8ICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNTAyOiBjaGVja2luZyB3aGV0aGVyIG9zdHJlYW0gaXMgcmVhbGx5IGRlZmluZWQiID4mNQorPCAgICAgICAgICAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaW9zdHJlYW1fb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI1MDcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZC4uLiAiID4mNjsgfQorPiAgICAgICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2lvc3RyZWFtX29rK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzI1MDljNjIxMiw2MjE0Cis8IGludCBtYWluKCkgeworLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKzI1MTEsMjUxNGM2MjE2LDYyNDAKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCistLS0KKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzI1MTcsMjUyMGM2MjQzLDYyNDYKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9pb3N0cmVhbV9vaz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9pb3N0cmVhbV9vaz1ubworMjUyMmM2MjQ4LDYyNTEKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisyNTI1YzYyNTQsNjI1NQorPCAgICAgICAgICAgICBlY2hvICIkYWNfdCIiJGFjX2N2X2lvc3RyZWFtX29rIiAxPiY2CistLS0KKz4gICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2lvc3RyZWFtX29rIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9pb3N0cmVhbV9vayIgPiY2OyB9CisyNTQ1YzYyNzUsNjI3NworPCAgICAgICAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICR7d2l0aHZhbH0gaW9zdHJlYW0gaXMgbm90IGF2YWlsYWJsZSIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gICAgICAgICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICR7d2l0aHZhbH0gaW9zdHJlYW0gaXMgbm90IGF2YWlsYWJsZSIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorMjU1MWQ2MjgyCis8ICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKzI1NTMsMjU1NWM2Mjg0LDYyODcKKzwgYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCis8IGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworLS0tCis+IGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorPiAKKzI1NTgsMjU2MWM2MjkwLDYyOTMKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNTYwOiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+ICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9jX2JpZ2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisyNTY0LDI1NjdjNjI5Niw2MzQ5Cis8ICMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjU2NyAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorPiAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaWZuZGVmIF9fQVBQTEVfQ0NfXworPiAJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCis+IAkgICAgICNlbmRpZgorPiAJICAgICB0eXBlZGVmIGludCBkdW1teTsKKz4gCis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAKKz4gCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCis+IAkjIHRoZXJlIGFyZSBzb21lIC1hcmNoIGZsYWdzLiAgTm90ZSB0aGF0ICpwcGMqIGFsc28gbWF0Y2hlcworPiAJIyBwcGM2NC4gIFRoaXMgY2hlY2sgaXMgYWxzbyByYXRoZXIgbGVzcyB0aGFuIGlkZWFsLgorPiAJY2FzZSAiJHtDQ30gJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30iIGluICAjKAorPiAJICAqLWFyY2gqcHBjKnwqLWFyY2gqaTM4Nip8Ki1hcmNoKng4Nl82NCopIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbDs7Cis+IAllc2FjCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCis+IGZpCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorPiAgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorPiAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyNTY5LDI1NzBjNjM1MQorPCAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Cis8IGludCBtYWluKCkgeworLS0tCis+IAkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKzI1NzIsMjU3OGM2MzUzLDYzODMKKzwgI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCis8ICBib2d1cyBlbmRpYW4gbWFjcm9zCis8ICNlbmRpZgorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1Nzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAjaWYgISAoZGVmaW5lZCBCWVRFX09SREVSICYmIGRlZmluZWQgQklHX0VORElBTiBcCis+IAkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKKz4gCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCis+IAkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCis+IAkgICAgICNlbmRpZgorPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisyNTgwLDI1ODJjNjM4NSw2MzkwCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjU4MiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzI1ODQsMjU4NWM2MzkyCis8ICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKzwgaW50IG1haW4oKSB7CistLS0KKz4gCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisyNTg2YTYzOTQsNjM5NgorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNTg4LDI1OTNjNjM5OCw2NDIyCis8ICBub3QgYmlnIGVuZGlhbgorPCAjZW5kaWYKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTkzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+IAkJIG5vdCBiaWcgZW5kaWFuCis+IAkJI2VuZGlmCis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKzI1OTYsMjU5OWM2NDI1LDY0MjgKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9jX2JpZ2VuZGlhbj1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9jX2JpZ2VuZGlhbj1ubworMjYwMWM2NDMwLDY0MzEKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorMjYwMywyNjA0YzY0MzMsNjQzNgorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyNjA2LDI2MjJjNjQzOCw2NDU5Cis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKzwgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKzwgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI2MTMgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IG1haW4gKCkgeworPCAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKzwgICB1bmlvbgorPCAgIHsKKzwgICAgIGxvbmcgbDsKKzwgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKKzwgICB9IHU7Cis8ICAgdS5sID0gMTsKKzwgICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOworLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gICAgIGZpCis+ICAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKz4gICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KKz4gICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8bGltaXRzLmg+Cis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+ICNpZiAhIChkZWZpbmVkIF9MSVRUTEVfRU5ESUFOIHx8IGRlZmluZWQgX0JJR19FTkRJQU4pCis+IAkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCis+IAkgICAgICNlbmRpZgorPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7CisyNjI0LDI2MzFjNjQ2MSw2NTE3Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKKzwgdGhlbgorPCAgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIF9CSUdfRU5ESUFOIG9yIG5vdC4KKz4gCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDxsaW1pdHMuaD4KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gI2lmbmRlZiBfQklHX0VORElBTgorPiAJCSBub3QgYmlnIGVuZGlhbgorPiAJCSNlbmRpZgorPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisyNjMyYTY1MTksNjUzMQorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9jX2JpZ2VuZGlhbj1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyNjM0YzY1MzMsNjYwMworPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiAgICAgZmkKKz4gICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorPiAgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCis+ICAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCis+ICAgIyBUcnkgdG8gZ3Vlc3MgYnkgZ3JlcHBpbmcgdmFsdWVzIGZyb20gYW4gb2JqZWN0IGZpbGUuCis+IAkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiBzaG9ydCBpbnQgYXNjaWlfbW1bXSA9Cis+IAkJICB7IDB4NDI0OSwgMHg0NzY1LCAweDZFNDQsIDB4Njk2MSwgMHg2RTUzLCAweDc5NTMsIDAgfTsKKz4gCQlzaG9ydCBpbnQgYXNjaWlfaWlbXSA9Cis+IAkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKz4gCQlpbnQgdXNlX2FzY2lpIChpbnQgaSkgeworPiAJCSAgcmV0dXJuIGFzY2lpX21tW2ldICsgYXNjaWlfaWlbaV07Cis+IAkJfQorPiAJCXNob3J0IGludCBlYmNkaWNfaWlbXSA9Cis+IAkJICB7IDB4ODlEMywgMHhFM0UzLCAweDg1OTMsIDB4OTVDNSwgMHg4OUM0LCAweDk1ODEsIDAgfTsKKz4gCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorPiAJCSAgeyAweEMyQzksIDB4Qzc4NSwgMHg5NUM0LCAweDg5ODEsIDB4OTVFMiwgMHhBOEUyLCAwIH07Cis+IAkJaW50IHVzZV9lYmNkaWMgKGludCBpKSB7Cis+IAkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworPiAJCX0KKz4gCQlleHRlcm4gaW50IGZvbzsKKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIHVzZV9hc2NpaSAoZm9vKSA9PSB1c2VfZWJjZGljIChmb28pOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KKz4gCSAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworPiAJICAgIGZpCis+IAkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgorPiAJICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfYmlnZW5kaWFuIiA9IHVua25vd247IHRoZW4KKz4gCQlhY19jdl9jX2JpZ2VuZGlhbj1ubworPiAJICAgICAgZWxzZQorPiAJCSMgZmluZGluZyBib3RoIHN0cmluZ3MgaXMgdW5saWtlbHkgdG8gaGFwcGVuLCBidXQgd2hvIGtub3dzPworPiAJCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKz4gCSAgICAgIGZpCis+IAkgICAgZmkKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAKKzI2MzZhNjYwNiw2NjYxCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IAorPiAJICAgICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCis+IAkgICAgIHVuaW9uCis+IAkgICAgIHsKKz4gCSAgICAgICBsb25nIGludCBsOworPiAJICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07Cis+IAkgICAgIH0gdTsKKz4gCSAgICAgdS5sID0gMTsKKz4gCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7Cis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKz4gICBhY19jdl9jX2JpZ2VuZGlhbj1ubworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IGFjX2N2X2NfYmlnZW5kaWFuPXllcworMjYzN2E2NjYzLDY2NjQKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisyNjQwLDI2NDRkNjY2NgorPCBlY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCis8ICNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKzwgRU9GCisyNjQ1YTY2NjgKKz4gICAgIGZpCisyNjQ2YTY2NzAsNjY5MworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19iaWdlbmRpYW4iID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KKz4gIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCis+ICAgIHllcykKKz4gICAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorPiAjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCis+IF9BQ0VPRgorPiA7OyAjKAorPiAgICBubykKKz4gICAgICAgOzsgIygKKz4gICAgdW5pdmVyc2FsKQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKz4gI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMQorPiBfQUNFT0YKKz4gCis+ICAgICAgOzsgIygKKz4gICAgKikKKz4gICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdW5rbm93biBlbmRpYW5uZXNzCis+ICBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiB1bmtub3duIGVuZGlhbm5lc3MKKz4gIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKz4gIGVzYWMKKzI2NTksMjY2NmM2NzA2LDY3MjAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI2NjE6IGNoZWNraW5nIGZvciBubF9sYW5naW5mbyIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX25sX2xhbmdpbmZvJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyNjY2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8iID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8uLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9mdW5jX25sX2xhbmdpbmZvK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gLyogRGVmaW5lIG5sX2xhbmdpbmZvIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgbmxfbGFuZ2luZm8uCis+ICAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworPiAjZGVmaW5lIG5sX2xhbmdpbmZvIGlubm9jdW91c19ubF9sYW5naW5mbworPiAKKzI2NjgsMjY3M2M2NzIyLDY3MjQKKzwgICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgbmxfbGFuZ2luZm8oKTsgYmVsb3cuICAqLworPCAjaW5jbHVkZSA8YXNzZXJ0Lmg+Cis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgbmxfbGFuZ2luZm8oKTsKKy0tLQorPiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBubF9sYW5naW5mbyAoKTsgYmVsb3cuCis+ICAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCis+ICAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworMjY3NWM2NzI2LDY3MzAKKzwgaW50IG1haW4oKSB7CistLS0KKz4gI2lmZGVmIF9fU1REQ19fCis+ICMgaW5jbHVkZSA8bGltaXRzLmg+Cis+ICNlbHNlCis+ICMgaW5jbHVkZSA8YXNzZXJ0Lmg+Cis+ICNlbmRpZgorMjY3NmE2NzMyLDY3NDAKKz4gI3VuZGVmIG5sX2xhbmdpbmZvCis+IAorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIG5sX2xhbmdpbmZvICgpOworMjY4MGM2NzQ0Cis8ICNpZiBkZWZpbmVkIChfX3N0dWJfbmxfbGFuZ2luZm8pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX25sX2xhbmdpbmZvKQorLS0tCis+ICNpZiBkZWZpbmVkIF9fc3R1Yl9ubF9sYW5naW5mbyB8fCBkZWZpbmVkIF9fc3R1Yl9fX25sX2xhbmdpbmZvCisyNjgyLDI2ODNkNjc0NQorPCAjZWxzZQorPCBubF9sYW5naW5mbygpOworMjY4NiwyNzAxYzY3NDgsNjc5MQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX25sX2xhbmdpbmZvPXllcyIKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCAKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nbmxfbGFuZ2luZm9gXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIG5sX2xhbmdpbmZvICgpOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9mdW5jX25sX2xhbmdpbmZvPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9mdW5jX25sX2xhbmdpbmZvPW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPSB4IiJ5ZXM7IHRoZW4KKzI3MDQsMjcwNWM2Nzk0Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Cis8IFVfSEFWRV9OTF9MQU5HSU5GTz0wCistLS0KKz4gICBVX0hBVkVfTkxfTEFOR0lORk89MAorMjcxMCwyNzEzYzY3OTksNjgwMgorPCAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBubF9sYW5naW5mbydzIGFyZ3VtZW50IHRvIG9idGFpbiB0aGUgY29kZXNldCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNzEyOiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8ncyBhcmd1bWVudCB0byBvYnRhaW4gdGhlIGNvZGVzZXQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8ncyBhcmd1bWVudCB0byBvYnRhaW4gdGhlIGNvZGVzZXQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8ncyBhcmd1bWVudCB0byBvYnRhaW4gdGhlIGNvZGVzZXQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzI3MTcsMjcxOWM2ODA2LDY4MTEKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI3MTkgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyNzIxYzY4MTMsNjgxNQorPCBpbnQgbWFpbigpIHsKKy0tLQorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNzIzLDI3MjZjNjgxNyw2ODQxCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjcyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMjcyOSwyNzMwYzY4NDQsNjg0NworPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyNzMyYzY4NDksNjg1MgorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzI3MzUsMjczNmM2ODU1LDY4NTYKKzwgCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0IiA+JjY7IH0KKzI3NDYsMjc0N2M2ODY2Cis8IGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorLS0tCis+IGFjX2V4dD1jcHAKKzI3NDksMjc2MGM2ODY4LDY4ODIKKzwgYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKzwgYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworPCAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5hbWVzcGFjZSBzdXBwb3J0IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI3NTU6IGNoZWNraW5nIGZvciBuYW1lc3BhY2Ugc3VwcG9ydCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9uYW1lc3BhY2Vfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI3NjAgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKz4gCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9uYW1lc3BhY2Vfb2src2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMjc2NCwyNzY1YzY4ODYsNjg4OQorPCAgICAgCis8IGludCBtYWluKCkgeworLS0tCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNzY3LDI3NzBjNjg5MSw2OTE1Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCisyNzczLDI3NzZjNjkxOCw2OTIxCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfbmFtZXNwYWNlX29rPW5vCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X25hbWVzcGFjZV9vaz1ubworMjc3OGM2OTIzLDY5MjYKKzwgcm0gLWYgY29uZnRlc3QqIAorLS0tCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMjc4MWM2OTI5LDY5MzAKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9uYW1lc3BhY2Vfb2siIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbmFtZXNwYWNlX29rIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9uYW1lc3BhY2Vfb2siID4mNjsgfQorMjc4OSwyNzkwYzY5MzgsNjkzOQorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNzkxOiBjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZSIgPiY1CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcm9wZXJseSBvdmVycmlkaW5nIG5ldyBhbmQgZGVsZXRlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHByb3Blcmx5IG92ZXJyaWRpbmcgbmV3IGFuZCBkZWxldGUuLi4gIiA+JjY7IH0KKzI3OTMsMjc5NGM2OTQyLDY5NDMKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X292ZXJyaWRlX2N4eF9hbGxvY2F0aW9uX29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IGlmIHRlc3QgIiR7YWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2src2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMjc5NiwyNzk4YzY5NDUsNjk1MAorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjc5OCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzI4MDcsMjgxM2M2OTU5LDY5ODgKKzwgICAgIAorPCBpbnQgbWFpbigpIHsKKzwgICAgIAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzI4MTYsMjgxOWM2OTkxLDY5OTQKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworMjgyMWM2OTk2LDY5OTkKKzwgcm0gLWYgY29uZnRlc3QqIAorLS0tCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMjgyNGM3MDAyLDcwMDMKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2siID4mNjsgfQorMjgyOCwyODM1YzcwMDcsNzAxNworPCAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyODMwOiBjaGVja2luZyBmb3IgcGxhY2VtZW50IG5ldyBhbmQgZGVsZXRlIiA+JjUKKzwgICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyODM1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUuLi4gIiA+JjY7IH0KKz4gICAgIGlmIHRlc3QgIiR7YWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vaytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyODQ2LDI4NTJjNzAyOCw3MDU3Cis8ICAgICAgICAgCis8IGludCBtYWluKCkgeworPCAgICAgICAgIAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzI4NTUsMjg1OGM3MDYwLDcwNjMKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rPW5vCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2s9bm8KKzI4NjBjNzA2NSw3MDY4Cis8IHJtIC1mIGNvbmZ0ZXN0KiAKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzI4NjNjNzA3MSw3MDcyCis8ICAgICBlY2hvICIkYWNfdCIiJGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2siIDE+JjYKKy0tLQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2siID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2siID4mNjsgfQorMjg3M2Q3MDgxCis8ICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKzI4NzUsMjg4NmM3MDgzLDcxMDEKKzwgYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCis8IGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworPCAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBvcGVuIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI4ODE6IGNoZWNraW5nIGZvciBwb3BlbiIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3BvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyODg2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwb3BlbiIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwb3Blbi4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfcG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAvKiBEZWZpbmUgcG9wZW4gdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwb3Blbi4KKz4gICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCis+ICNkZWZpbmUgcG9wZW4gaW5ub2N1b3VzX3BvcGVuCis+IAorMjg4OCwyODkzYzcxMDMsNzExMQorPCAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwb3BlbigpOyBiZWxvdy4gICovCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciBwb3BlbigpOworLS0tCis+ICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHBvcGVuICgpOyBiZWxvdy4KKz4gICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCis+IAorPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCisyODk1YzcxMTMKKzwgaW50IG1haW4oKSB7CistLS0KKz4gI3VuZGVmIHBvcGVuCisyODk2YTcxMTUsNzEyMQorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIHBvcGVuICgpOworMjkwMGM3MTI1Cis8ICNpZiBkZWZpbmVkIChfX3N0dWJfcG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3BvcGVuKQorLS0tCis+ICNpZiBkZWZpbmVkIF9fc3R1Yl9wb3BlbiB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BvcGVuCisyOTAyLDI5MDNkNzEyNgorPCAjZWxzZQorPCBwb3BlbigpOworMjkwNiwyOTI0YzcxMjksNzE2OAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX3BvcGVuPXllcyIKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2Z1bmNfcG9wZW49bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCAKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ncG9wZW5gXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgIDoKKzwgZWxzZQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIHBvcGVuICgpOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9mdW5jX3BvcGVuPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9mdW5jX3BvcGVuPW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMjkyNWE3MTcwLDcxNzEKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfcG9wZW4iID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2Z1bmNfcG9wZW4iID4mNjsgfQorMjkzNSwyOTQyYzcxODEsNzE5NQorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHpzZXQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjkzNzogY2hlY2tpbmcgZm9yIHR6c2V0IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI5NDIgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0enNldCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciB0enNldC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfdHpzZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAvKiBEZWZpbmUgdHpzZXQgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyB0enNldC4KKz4gICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCis+ICNkZWZpbmUgdHpzZXQgaW5ub2N1b3VzX3R6c2V0Cis+IAorMjk0NCwyOTQ5YzcxOTcsNzE5OQorPCAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciB0enNldCgpOyBiZWxvdy4gICovCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciB0enNldCgpOworLS0tCis+ICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHR6c2V0ICgpOyBiZWxvdy4KKz4gICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisyOTUxYzcyMDEsNzIwNQorPCBpbnQgbWFpbigpIHsKKy0tLQorPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCisyOTUyYTcyMDcsNzIxNQorPiAjdW5kZWYgdHpzZXQKKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgdHpzZXQgKCk7CisyOTU2YzcyMTkKKzwgI2lmIGRlZmluZWQgKF9fc3R1Yl90enNldCkgfHwgZGVmaW5lZCAoX19zdHViX19fdHpzZXQpCistLS0KKz4gI2lmIGRlZmluZWQgX19zdHViX3R6c2V0IHx8IGRlZmluZWQgX19zdHViX19fdHpzZXQKKzI5NTgsMjk1OWQ3MjIwCis8ICNlbHNlCis8IHR6c2V0KCk7CisyOTYyLDI5ODBjNzIyMyw3MjYyCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2Z1bmNfdHpzZXQ9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfZnVuY190enNldD1ubyIKKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IGZpCis8IAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyd0enNldGBcIiA9IHllcyI7IHRoZW4KKzwgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Cis8ICAgOgorPCBlbHNlCis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gdHpzZXQgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2Z1bmNfdHpzZXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2Z1bmNfdHpzZXQ9bm8KKz4gZmkKKz4gCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisyOTgxYTcyNjQsNzI2NQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY190enNldCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfZnVuY190enNldCIgPiY2OyB9CisyOTg5LDI5OTZjNzI3Myw3Mjg3Cis8ICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgX3R6c2V0IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI5OTE6IGNoZWNraW5nIGZvciBfdHpzZXQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19fdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI5OTYgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3R6c2V0IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90enNldC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfX3R6c2V0K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gLyogRGVmaW5lIF90enNldCB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIF90enNldC4KKz4gICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCis+ICNkZWZpbmUgX3R6c2V0IGlubm9jdW91c19fdHpzZXQKKz4gCisyOTk4LDMwMDNjNzI4OSw3Mjk3Cis8ICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIF90enNldCgpOyBiZWxvdy4gICovCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciBfdHpzZXQoKTsKKy0tLQorPiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBfdHpzZXQgKCk7IGJlbG93LgorPiAgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorPiAgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKz4gCis+ICNpZmRlZiBfX1NURENfXworPiAjIGluY2x1ZGUgPGxpbWl0cy5oPgorPiAjZWxzZQorPiAjIGluY2x1ZGUgPGFzc2VydC5oPgorPiAjZW5kaWYKKzMwMDVjNzI5OQorPCBpbnQgbWFpbigpIHsKKy0tLQorPiAjdW5kZWYgX3R6c2V0CiszMDA2YTczMDEsNzMwNworPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIF90enNldCAoKTsKKzMwMTBjNzMxMQorPCAjaWYgZGVmaW5lZCAoX19zdHViX190enNldCkgfHwgZGVmaW5lZCAoX19zdHViX19fX3R6c2V0KQorLS0tCis+ICNpZiBkZWZpbmVkIF9fc3R1Yl9fdHpzZXQgfHwgZGVmaW5lZCBfX3N0dWJfX19fdHpzZXQKKzMwMTIsMzAxM2Q3MzEyCis8ICNlbHNlCis8IF90enNldCgpOworMzAxNiwzMDM0YzczMTUsNzM1NAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX190enNldD15ZXMiCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX190enNldD1ubyIKKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IGZpCis8IAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydfdHpzZXRgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgIDoKKzwgZWxzZQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIF90enNldCAoKTsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCis+ICAgYWNfY3ZfZnVuY19fdHpzZXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2Z1bmNfX3R6c2V0PW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMzAzNWE3MzU2LDczNTcKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfX3R6c2V0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9mdW5jX190enNldCIgPiY2OyB9CiszMDQ3LDMwNTRjNzM2OSw3Mzc5Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0em5hbWUiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzA0OTogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl92YXJfdHpuYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzMDU0ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdHpuYW1lIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHR6bmFtZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Zhcl90em5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMzA2M2M3Mzg4LDczOTAKKzwgaW50IG1haW4oKSB7CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworMzA2NSwzMDY4YzczOTIsNzQxNgorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzMwNzEsMzA3NmM3NDE5LDc0MjIKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl92YXJfdHpuYW1lPW5vCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl92YXJfdHpuYW1lPW5vCiszMDc5Yzc0MjUsNzQzMAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl90em5hbWUiIDE+JjYKKy0tLQorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX3R6bmFtZSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdmFyX3R6bmFtZSIgPiY2OyB9CiszMDg0LDMwOTFjNzQzNSw3NDQ1Cis8ICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF90em5hbWUiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzA4NjogY2hlY2tpbmcgZm9yIF90em5hbWUiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX190em5hbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMwOTEgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF90em5hbWUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgX3R6bmFtZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Zhcl9fdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzMwOTUsMzA5NmM3NDQ5LDc0NTIKKzwgICAKKzwgaW50IG1haW4oKSB7CistLS0KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKzMwOTgsMzEwMWM3NDU0LDc0NzgKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCistLS0KKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCiszMTA0LDMxMDljNzQ4MSw3NDg0Cis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfdmFyX190em5hbWU9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3Zhcl9fdHpuYW1lPW5vCiszMTEyYzc0ODcsNzQ5MgorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl9fdHpuYW1lIiAxPiY2CistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Zhcl9fdHpuYW1lIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl92YXJfX3R6bmFtZSIgPiY2OyB9CiszMTIxLDMxMjhjNzUwMSw3NTExCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lem9uZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozMTIzOiBjaGVja2luZyBmb3IgdGltZXpvbmUiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX3RpbWV6b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzMTI4ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGltZXpvbmUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdGltZXpvbmUuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl92YXJfdGltZXpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMzEzN2M3NTIwLDc1MjIKKzwgaW50IG1haW4oKSB7CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworMzEzOSwzMTQyYzc1MjQsNzU0OAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzMxNDUsMzE1MGM3NTUxLDc1NTQKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl92YXJfdGltZXpvbmU9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3Zhcl90aW1lem9uZT1ubworMzE1M2M3NTU3LDc1NjIKKzwgZWNobyAiJGFjX3QiIiRhY19jdl92YXJfdGltZXpvbmUiIDE+JjYKKy0tLQorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl92YXJfdGltZXpvbmUiID4mNjsgfQorMzE1OSwzMTY2Yzc1NjgsNzU3OAorPCAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfX3RpbWV6b25lIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjMxNjE6IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl9fX3RpbWV6b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzMTY2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF9fdGltZXpvbmUuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl92YXJfX190aW1lem9uZStzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiszMTY4LDMxNjljNzU4MCw3NTgzCis8ICAgCis8IGludCBtYWluKCkgeworLS0tCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7CiszMTcxLDMxNzRjNzU4NSw3NjA5Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMzE3NywzMTgyYzc2MTIsNzYxNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3Zhcl9fX3RpbWV6b25lPW5vCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl92YXJfX190aW1lem9uZT1ubworMzE4NWM3NjE4LDc2MjMKKzwgZWNobyAiJGFjX3QiIiRhY19jdl92YXJfX190aW1lem9uZSIgMT4mNgorLS0tCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX190aW1lem9uZSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdmFyX19fdGltZXpvbmUiID4mNjsgfQorMzE5MCwzMTk3Yzc2MjgsNzYzOAorPCAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF90aW1lem9uZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozMTkyOiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl9fdGltZXpvbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMxOTcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90aW1lem9uZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Zhcl9fdGltZXpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMzE5OSwzMjAwYzc2NDAsNzY0MworPCAgICAgCis8IGludCBtYWluKCkgeworLS0tCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7CiszMjAyLDMyMDVjNzY0NSw3NjY5Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMzIwOCwzMjEzYzc2NzIsNzY3NQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3Zhcl9fdGltZXpvbmU9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3Zhcl9fdGltZXpvbmU9bm8KKzMyMTZjNzY3OCw3NjgzCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdmFyX190aW1lem9uZSIgMT4mNgorLS0tCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl92YXJfX3RpbWV6b25lIiA+JjY7IH0KKzMyMjYsMzI0NGM3NjkzLDc2OTYKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzIyODogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMyMzMgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGFyZy5oPgorPCAjaW5jbHVkZSA8c3RyaW5nLmg+Cis8ICNpbmNsdWRlIDxmbG9hdC5oPgorPCBFT0YKKzwgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKzwgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorPCBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCis8IGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50OF90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludDhfdC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50OF90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzMyNDYsMzI2MmM3Njk4LDc3NjYKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9oZWFkZXJfc3RkYz1ubworPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKzwgCis8IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis8ICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMyNTggImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdHJpbmcuaD4KKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0tLQorPiAgIGFjX2N2X3R5cGVfaW50OF90PW5vCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mIChpbnQ4X3QpKQorPiAgICAgICAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICgoaW50OF90KSkpCis+IAkgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKzMyNjUsMzI2OGM3NzY5LDc3NzAKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorMzI2OWE3NzcyCis+IAlhY19jdl90eXBlX2ludDhfdD15ZXMKKzMyNzIsMzI4MWM3Nzc1Cis8IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis8ICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMyNzYgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgOgorLS0tCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorMzI4MywzMjg2Yzc3NzcsNzc3OQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9oZWFkZXJfc3RkYz1ubworPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorMzI5MCwzMjkyYzc3ODMsNzc4NworPCBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorPCAgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKzwgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50OF90IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl90eXBlX2ludDhfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQ4X3QiID0geCIieWVzOyB0aGVuCiszMjk1LDMzMDRkNzc4OQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzI5NyAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGN0eXBlLmg+Cis8ICNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorPCAjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKzwgI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKKzwgaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorPCBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworPCBleGl0ICgwKTsgfQorMzMwNiwzMzE3Yzc3OTEsNzc5MworPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKzwgICA6Cis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBhY19jdl9oZWFkZXJfc3RkYz1ubworPCBmaQorPCBybSAtZnIgY29uZnRlc3QqCis8IGZpCistLS0KKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorPiBfQUNFT0YKKzMzMjBkNzc5NQorPCBmaQorMzMyMiwzMzI2Yzc3OTcsNzg3NAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCis8ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKKzwgRU9GCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1aW50OF90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQ4X3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfY3ZfdHlwZV91aW50OF90PW5vCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICh1aW50OF90KSkKKz4gICAgICAgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAoKHVpbnQ4X3QpKSkKKz4gCSAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiszMzI3YTc4NzYKKz4gCWFjX2N2X3R5cGVfdWludDhfdD15ZXMKKzMzMzAsMzMzM2M3ODc5Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQ4X3QiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzMzMjogY2hlY2tpbmcgZm9yIGludDhfdCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX2ludDhfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzMzMzUsMzM1MmM3ODgxLDc4ODIKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMzMzcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKzwgI2lmIFNURENfSEVBREVSUworPCAjaW5jbHVkZSA8c3RkbGliLmg+Cis8ICNpbmNsdWRlIDxzdGRkZWYuaD4KKzwgI2VuZGlmCis8IEVPRgorPCBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis8ICAgZWdyZXAgIihefFteYS16QS1aXzAtOV0paW50OF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfaW50OF90PXllcworPCBlbHNlCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfaW50OF90PW5vCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzMzNTQsMzM1OWQ3ODgzCis8IGZpCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQ4X3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQ4X3QgPSBubzsgdGhlbgorPCAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorPCAjZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorPCBFT0YKKzMzNjMsMzM4M2M3ODg3Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50OF90IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjMzNjU6IGNoZWNraW5nIGZvciB1aW50OF90IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDhfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzM3MCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50OF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfdWludDhfdD15ZXMKKzwgZWxzZQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX3VpbnQ4X3Q9bm8KKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzMzODVjNzg4OSw3ODkzCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQ4X3QiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3R5cGVfdWludDhfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50OF90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorMzM4NywzMzkwYzc4OTUKKzwgZmkKKzwgZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3VpbnQ4X3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV91aW50OF90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszMzkyYzc4OTcKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszMzk2LDM0MTNjNzkwMSw3OTA0Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQxNl90IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjMzOTg6IGNoZWNraW5nIGZvciBpbnQxNl90IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfaW50MTZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzQwMyAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlpbnQxNl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfaW50MTZfdD15ZXMKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDE2X3QiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50MTZfdC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50MTZfdCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiszNDE1ZDc5MDUKKzwgICBybSAtcmYgY29uZnRlc3QqCiszNDE2YTc5MDcsNzk4MAorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAoaW50MTZfdCkpCis+ICAgICAgICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKChpbnQxNl90KSkpCis+IAkgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3R5cGVfaW50MTZfdD15ZXMKKzM0MThjNzk4Miw3OTg3Cis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorMzQyMSwzNDIzYzc5OTAsNzk5OQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfaW50MTZfdCIgMT4mNgorPCBpZiB0ZXN0ICRhY19jdl90eXBlX2ludDE2X3QgPSBubzsgdGhlbgorPCAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MTZfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdHlwZV9pbnQxNl90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX2ludDE2X3QiID0geCIieWVzOyB0aGVuCis+ICAgOgorPiBlbHNlCis+IAorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszNDI1YzgwMDEKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszNDI5LDM0NDZjODAwNSw4MDA4Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50MTZfdCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozNDMxOiBjaGVja2luZyBmb3IgdWludDE2X3QiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aW50MTZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzQzNiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50MTZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX3VpbnQxNl90PXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdWludDE2X3QiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludDE2X3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQxNl90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM0NDhkODAwOQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzM0NDlhODAxMSw4MDg0Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICh1aW50MTZfdCkpCis+ICAgICAgICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKCh1aW50MTZfdCkpKQorPiAJICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl90eXBlX3VpbnQxNl90PXllcworMzQ1MWM4MDg2LDgwOTEKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCiszNDU0LDM0NTZjODA5NCw4MTAzCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aW50MTZfdCIgMT4mNgorPCBpZiB0ZXN0ICRhY19jdl90eXBlX3VpbnQxNl90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQxNl90IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl90eXBlX3VpbnQxNl90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQxNl90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorMzQ1OGM4MTA1Cis8IEVPRgorLS0tCis+IF9BQ0VPRgorMzQ2MiwzNDc5YzgxMDksODExMgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW50MzJfdCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozNDY0OiBjaGVja2luZyBmb3IgaW50MzJfdCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX2ludDMyX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDM0NjkgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKzwgI2lmIFNURENfSEVBREVSUworPCAjaW5jbHVkZSA8c3RkbGliLmg+Cis8ICNpbmNsdWRlIDxzdGRkZWYuaD4KKzwgI2VuZGlmCis8IEVPRgorPCBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis8ICAgZWdyZXAgIihefFteYS16QS1aXzAtOV0paW50MzJfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX2ludDMyX3Q9eWVzCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQzMl90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludDMyX3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX2ludDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMzQ4MWQ4MTEzCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorMzQ4MmE4MTE1LDgxODgKKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKGludDMyX3QpKQorPiAgICAgICAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICgoaW50MzJfdCkpKQorPiAJICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl90eXBlX2ludDMyX3Q9eWVzCiszNDg0YzgxOTAsODE5NQorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKzM0ODcsMzQ4OWM4MTk4LDgyMDcKKzwgZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX2ludDMyX3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQzMl90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDMyX3QiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3R5cGVfaW50MzJfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQzMl90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorMzQ5MWM4MjA5Cis8IEVPRgorLS0tCis+IF9BQ0VPRgorMzQ5NSwzNTEyYzgyMTMsODIxNgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdWludDMyX3QiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzQ5NzogY2hlY2tpbmcgZm9yIHVpbnQzMl90IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDMyX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDM1MDIgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKzwgI2lmIFNURENfSEVBREVSUworPCAjaW5jbHVkZSA8c3RkbGliLmg+Cis8ICNpbmNsdWRlIDxzdGRkZWYuaD4KKzwgI2VuZGlmCis8IEVPRgorPCBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis8ICAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pdWludDMyX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfdHlwZV91aW50MzJfdD15ZXMKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQzMl90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQzMl90Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV91aW50MzJfdCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiszNTE0ZDgyMTcKKzwgICBybSAtcmYgY29uZnRlc3QqCiszNTE1YTgyMTksODI5MgorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAodWludDMyX3QpKQorPiAgICAgICAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICgodWludDMyX3QpKSkKKz4gCSAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY3ZfdHlwZV91aW50MzJfdD15ZXMKKzM1MTdjODI5NCw4Mjk5Cis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorMzUyMCwzNTIyYzgzMDIsODMxMQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfdWludDMyX3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV91aW50MzJfdCA9IG5vOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aW50MzJfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdHlwZV91aW50MzJfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4IiJ5ZXM7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gCis+IGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKzM1MjRjODMxMworPCBFT0YKKy0tLQorPiBfQUNFT0YKKzM1MjgsMzU0NWM4MzE3LDgzMjAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGludDY0X3QiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzUzMDogY2hlY2tpbmcgZm9yIGludDY0X3QiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9pbnQ2NF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzNTM1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cis8ICNpZiBTVERDX0hFQURFUlMKKzwgI2luY2x1ZGUgPHN0ZGxpYi5oPgorPCAjaW5jbHVkZSA8c3RkZGVmLmg+Cis8ICNlbmRpZgorPCBFT0YKKzwgaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorPCAgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKWludDY0X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfdHlwZV9pbnQ2NF90PXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50NjRfdCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQ2NF90Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9pbnQ2NF90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM1NDdkODMyMQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzM1NDhhODMyMyw4NDA0Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mIChpbnQ2NF90KSkKKz4gICAgICAgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAoKGludDY0X3QpKSkKKz4gCSAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY3ZfdHlwZV9pbnQ2NF90PXllcworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCiszNTUwZDg0MDUKKzwgcm0gLWYgY29uZnRlc3QqCiszNTUxYTg0MDcKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiszNTUzLDM1NTVjODQwOSw4NDE1Cis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQ2NF90IiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X3R5cGVfaW50NjRfdCA9IG5vOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50NjRfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdHlwZV9pbnQ2NF90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX2ludDY0X3QiID0geCIieWVzOyB0aGVuCis+ICAgOgorPiBlbHNlCis+IAorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszNTU3Yzg0MTcKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszNTYxLDM1NzhjODQyMSw4NDI0Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50NjRfdCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozNTYzOiBjaGVja2luZyBmb3IgdWludDY0X3QiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aW50NjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzU2OCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50NjRfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX3VpbnQ2NF90PXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdWludDY0X3QiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludDY0X3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ2NF90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM1ODBkODQyNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzM1ODFhODQyNyw4NTAwCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICh1aW50NjRfdCkpCis+ICAgICAgICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKCh1aW50NjRfdCkpKQorPiAJICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl90eXBlX3VpbnQ2NF90PXllcworMzU4M2M4NTAyLDg1MDcKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCiszNTg2LDM1ODhjODUxMCw4NTE5Cis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aW50NjRfdCIgMT4mNgorPCBpZiB0ZXN0ICRhY19jdl90eXBlX3VpbnQ2NF90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorMzU5MGM4NTIxCis8IEVPRgorLS0tCis+IF9BQ0VPRgorMzY1MSwzNjU5Yzg1ODIsODYwMAorPCBhY19zYWZlPWBlY2hvICJ3Y2hhci5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdjaGFyLmgiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzY1NDogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzNjU5ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3djaGFyX2grc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igd2NoYXIuaC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY2OyB9Cis+IGVsc2UKKz4gICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdjaGFyLmggdXNhYmlsaXR5IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2NoYXIuaCB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorMzY2MSwzNjc5Yzg2MDIsODcwMQorPCBFT0YKKzwgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKzwgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjY0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorPCBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCis8IGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCis8IGVsc2UKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorPCAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKzwgICA6CistLS0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19oZWFkZXJfY29tcGlsZXI9bm8KKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorPiAKKz4gIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3Y2hhci5oIHByZXNlbmNlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2NoYXIuaCBwcmVzZW5jZS4uLiAiID4mNjsgfQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDx3Y2hhci5oPgorPiBfQUNFT0YKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCis+IGZpCis+IAorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorPiAkYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKz4gCis+ICMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworPiBjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCis+ICAgeWVzOm5vOiApCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Cis+ICAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKz4gICAgIDs7Cis+ICAgbm86eWVzOiogKQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Cis+IAorPiAgICAgOzsKKz4gZXNhYworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igd2NoYXIuaC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM2ODFjODcwMyw4NzA3Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gICBhY19jdl9oZWFkZXJfd2NoYXJfaD0kYWNfaGVhZGVyX3ByZXByb2MKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY2OyB9Cis+IAorMzY4M2E4NzEwCis+IAorMzY4OWM4NzE2Cis8ICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKzM2OTFjODcxOAorPCBFT0YKKy0tLQorPiBfQUNFT0YKKzM2OTQsMzcxOWM4NzIxLDg3ODIKKzwgICAgICAgICAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzY5NzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2VhcmNoX3djc2NweScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0iJExJQlMiCis8IGFjX2N2X3NlYXJjaF93Y3NjcHk9Im5vIgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDM3MDQgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgd2NzY3B5KCk7Cis8IAorPCBpbnQgbWFpbigpIHsKKzwgd2NzY3B5KCkKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3Zfc2VhcmNoX3djc2NweT0ibm9uZSByZXF1aXJlZCIKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHdjc2NweS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF93Y3NjcHkrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgd2NzY3B5ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiB3Y3NjcHkgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBmb3IgYWNfbGliIGluICcnIHdjcyB3OyBkbworPiAgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCis+ICAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCis+ICAgZWxzZQorPiAgICAgYWNfcmVzPS1sJGFjX2xpYgorPiAgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorPiAgIGZpCis+ICAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9zZWFyY2hfd2NzY3B5PSRhY19yZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAKKzM3MjEsMzc0MmM4Nzg0LDg3ODkKKzwgcm0gLWYgY29uZnRlc3QqCis8IHRlc3QgIiRhY19jdl9zZWFyY2hfd2NzY3B5IiA9ICJubyIgJiYgZm9yIGkgaW4gd2NzIHc7IGRvCis8IExJQlM9Ii1sJGkgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzcyNiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciB3Y3NjcHkoKTsKKzwgCis8IGludCBtYWluKCkgeworPCB3Y3NjcHkoKQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Mzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9zZWFyY2hfd2NzY3B5PSItbCRpIgorPCBicmVhaworPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfd2NzY3B5K3NldH0iID0gc2V0OyB0aGVuCis+ICAgYnJlYWsKKzM3NDRkODc5MAorPCBybSAtZiBjb25mdGVzdCoKKzM3NDZjODc5Miw4Nzk4Cis8IExJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCistLS0KKz4gaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfd2NzY3B5K3NldH0iID0gc2V0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgYWNfY3Zfc2VhcmNoX3djc2NweT1ubworPiBmaQorPiBybSBjb25mdGVzdC4kYWNfZXh0Cis+IExJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworMzc0N2E4ODAwLDg4MDQKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF93Y3NjcHkiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID4mNjsgfQorPiBhY19yZXM9JGFjX2N2X3NlYXJjaF93Y3NjcHkKKz4gaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKz4gICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorMzc0OSwzNzU0ZDg4MDUKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9zZWFyY2hfd2NzY3B5IiAxPiY2Cis8IGlmIHRlc3QgIiRhY19jdl9zZWFyY2hfd2NzY3B5IiAhPSAibm8iOyB0aGVuCis8ICAgdGVzdCAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfd2NzY3B5ICRMSUJTIgorPCAgIAorPCBlbHNlIDoKKzwgICAKKzM3NTVhODgwNworPiAKKzM3NjYsMzc2OWM4ODE4LDg4MjEKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjM3Njg6IGNoZWNraW5nIHNpemUgb2Ygd2NoYXJfdCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zaXplb2Zfd2NoYXJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3djaGFyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMzc3NCwzNzc2Yzg4MjYsODgzMQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzc3NiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzM3OTIsMzc5NGM4ODQ3LDg4NjkKKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorPCB0aGVuCistLS0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworPiAgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCiszNzk3LDM4MDBjODg3Miw4ODc3Cis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtZnIgY29uZnRlc3QqCis8ICAgYWNfY3Zfc2l6ZW9mX3djaGFyX3Q9MAorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IGFjX2N2X3NpemVvZl93Y2hhcl90PTAKKzM4MDJjODg3OSw4ODgwCis8IHJtIC1mciBjb25mdGVzdCoKKy0tLQorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzM4MDRhODg4MworPiAKKzM4MDYsMzgwN2M4ODg1LDg4ODcKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9zaXplb2Zfd2NoYXJfdCIgMT4mNgorPCBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfd2NoYXJfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3djaGFyX3QiID4mNjsgfQorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszODA5Yzg4ODkKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszODE1Yzg4OTUsODg5NworPCAJICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBUaGVyZSBpcyB3Y2hhci5oIGJ1dCB0aGUgc2l6ZSBvZiB3Y2hhcl90IGlzIDAiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+IAkgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogVGhlcmUgaXMgd2NoYXIuaCBidXQgdGhlIHNpemUgb2Ygd2NoYXJfdCBpcyAwIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFRoZXJlIGlzIHdjaGFyLmggYnV0IHRoZSBzaXplIG9mIHdjaGFyX3QgaXMgMCIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiszODI2Yzg5MDgKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyBvciAtLWRpc2FibGUtZXh0cmFzIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZXh0cmFzIHdhcyBnaXZlbi4KKzM4MjgsMzgyOWM4OTEwCis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX2V4dHJhcyIKKzwgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9leHRyYXM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKzM4MzJjODkxMyw4OTE1Cis8IAkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1leHRyYXMiIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWV4dHJhcyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1leHRyYXMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMzg0NGM4OTI3Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1leHRyYXMgb3IgLS1kaXNhYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCiszODQ2LDM4NDdjODkyOQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9leHRyYXMiCis8ICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfZXh0cmFzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCiszODUwYzg5MzIsODkzNAorPCAJCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtaWN1aW8iIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWljdWlvIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWljdWlvIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKzM4NjNjODk0NworPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGF5b3V0IG9yIC0tZGlzYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorLS0tCis+ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorMzg2NSwzODY2Yzg5NDkKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfbGF5b3V0IgorPCAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX2xheW91dDsgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMzg2OWM4OTUyLDg5NTQKKzwgCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWxheW91dCIgMT4mMjsgZXhpdCAxOyB9IDs7CistLS0KKz4gCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtbGF5b3V0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWxheW91dCIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CiszODgyYzg5NjcsODk2OAorPCAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRhdGEtcGFja2FnaW5nIG9yIC0td2l0aG91dC1kYXRhLXBhY2thZ2luZyB3YXMgZ2l2ZW4uCistLS0KKz4gCis+ICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgd2FzIGdpdmVuLgorMzg4NCwzODg1Yzg5NzAKKzwgICB3aXRodmFsPSIkd2l0aF9kYXRhX3BhY2thZ2luZyIKKzwgICBjYXNlICIke3dpdGh2YWx9IiBpbgorLS0tCis+ICAgd2l0aHZhbD0kd2l0aF9kYXRhX3BhY2thZ2luZzsgY2FzZSAiJHt3aXRodmFsfSIgaW4KKzM4OTFjODk3Niw4OTc4Cis8IAkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgLS13aXRoLWRhdGEtcGFja2FnaW5nIiAxPiYyOyBleGl0IDE7IH0gOzsKKy0tLQorPiAJCSopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgLS13aXRoLWRhdGEtcGFja2FnaW5nIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmciID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMzkxMGM4OTk3Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYXBwZWQgb3IgLS1kaXNhYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCiszOTEyLDM5MTNjODk5OQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYXBwZWQiCis8ICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfbWFwcGVkOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCiszOTE2YzkwMDIsOTAwNAorPCAgICAgICAgICAgICAgICAqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLW1hcHBlZDsgdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZyBub3ciIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+ICAgICAgICAgICAgICAgICopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1tYXBwZWQ7IHVzZSAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgbm93IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLW1hcHBlZDsgdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZyBub3ciID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMzkyNmM5MDE0LDkwMTUKKzwgICAgIAkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUgaW5zdGVhZCBvZiAtLWVuYWJsZS1tYXBwZWQiIDE+JjIKKy0tLQorPiAgICAgCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1hcmNoaXZlIGluc3RlYWQgb2YgLS1lbmFibGUtbWFwcGVkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1hcmNoaXZlIGluc3RlYWQgb2YgLS1lbmFibGUtbWFwcGVkIiA+JjI7fQorMzkyOWM5MDE4LDkwMTkKKzwgICAgIAkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiAxPiYyCistLS0KKz4gICAgIAkgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHVzZSAtLXdpdGgtZGF0YS1wYWNrYWdpbmc9bGlicmFyeSBpbnN0ZWFkIG9mIC0tZGlzYWJsZS1tYXBwZWQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiA+JjI7fQorMzkzM2M5MDIzLDkwMjUKKzwgCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+IAl7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorMzk1OSwzOTYxYzkwNTEsOTA1NAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6Mzk2MTogY2hlY2tpbmcgZm9yIGEgbGlicmFyeSBzdWZmaXggdG8gdXNlIiA+JjUKKzwgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJyYXJ5LXN1ZmZpeCBvciAtLXdpdGhvdXQtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UuLi4gIiA+JjY7IH0KKz4gCis+ICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorMzk2MywzOTY0YzkwNTYKKzwgICB3aXRodmFsPSIkd2l0aF9saWJyYXJ5X3N1ZmZpeCIKKzwgICBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCistLS0KKz4gICB3aXRodmFsPSR3aXRoX2xpYnJhcnlfc3VmZml4OyBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCiszOTczYzkwNjUsOTA2NgorPCBlY2hvICIkYWNfdCIiJG1zZyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRtc2ciID4mNQorPiAkYXNfZWNobyAiJG1zZyIgPiY2OyB9CiszOTg1YzkwNzgKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIG9yIC0tZGlzYWJsZS10ZXN0cyB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIHdhcyBnaXZlbi4KKzM5ODcsMzk4OGM5MDgwCis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX3Rlc3RzIgorPCAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX3Rlc3RzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCiszOTkxYzkwODMsOTA4NQorPCAJCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGVzdHMiIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRlc3RzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRlc3RzIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKzQwMDRjOTA5OAorPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2FtcGxlcyBvciAtLWRpc2FibGUtc2FtcGxlcyB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNhbXBsZXMgd2FzIGdpdmVuLgorNDAwNiw0MDA3YzkxMDAKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfc2FtcGxlcyIKKzwgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9zYW1wbGVzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCis0MDEwYzkxMDMsOTEwNQorPCAJCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtc2FtcGxlcyIgMT4mMjsgZXhpdCAxOyB9IDs7CistLS0KKz4gCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtc2FtcGxlcyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1zYW1wbGVzIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKzQwNjdjOTE2MgorPCAJKi0qLWhwdXgqKSAJCistLS0KKz4gCSotKi1ocHV4KikKKzQxMTMsNDExNGM5MjA4LDkyMTAKKzwgdHJhcCAnJyAxIDIgMTUKKzwgY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorLS0tCis+IGFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBpY3VkZWZzLm1rIE1ha2VmaWxlIGRhdGEvaWN1cGtnLmluYyBjb25maWcvTWFrZWZpbGUuaW5jIGRhdGEvTWFrZWZpbGUgc3R1YmRhdGEvTWFrZWZpbGUgY29tbW9uL01ha2VmaWxlIGkxOG4vTWFrZWZpbGUgbGF5b3V0L01ha2VmaWxlIGxheW91dGV4L01ha2VmaWxlIGlvL01ha2VmaWxlIGV4dHJhL01ha2VmaWxlIGV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlIHRvb2xzL01ha2VmaWxlIHRvb2xzL2N0ZXN0ZncvTWFrZWZpbGUgdG9vbHMvbWFrZWNvbnYvTWFrZWZpbGUgdG9vbHMvZ2VucmIvTWFrZWZpbGUgdG9vbHMvZ2VudWNhL01ha2VmaWxlIHRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIHRvb2xzL2dlbmNtbi9NYWtlZmlsZSB0b29scy9nZW5jbnZhbC9NYWtlZmlsZSB0b29scy9nZW5uYW1lcy9NYWtlZmlsZSB0b29scy9nZW50ZXN0L01ha2VmaWxlIHRvb2xzL2dlbm5vcm0vTWFrZWZpbGUgdG9vbHMvZ2VucHJvcHMvTWFrZWZpbGUgdG9vbHMvZ2VuY2FzZS9NYWtlZmlsZSB0b29scy9nZW5wbmFtZS9NYWtlZmlsZSB0b29scy9nZW5icmsvTWFrZWZpbGUgdG9vbHMvZ2Vuc3ByZXAvTWFrZWZpbGUgdG9vbHMvaWN1c3dhcC9NYWtlZmlsZSB0b29scy9wa2dkYXRhL01ha2VmaWxlIHRvb2xzL3Rvb2x1dGlsL01ha2VmaWxlIHRvb2xzL2R1bXBjZS9NYWtlZmlsZSB0ZXN0L01ha2VmaWxlIHRlc3QvdGVzdGRhdGEvTWFrZWZpbGUgdGVzdC90ZXN0ZGF0YS9wa2dkYXRhLmluYyB0ZXN0L2hkcnRzdC9NYWtlZmlsZSB0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIHRlc3QvY2ludGx0c3QvTWFrZWZpbGUgdGVzdC9pb3Rlc3QvTWFrZWZpbGUgdGVzdC90aGFpdGVzdC9NYWtlZmlsZSB0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUgdGVzdC9sZXRlc3QvTWFrZWZpbGUgdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIHNhbXBsZXMvTWFrZWZpbGUgc2FtcGxlcy9kYXRlL01ha2VmaWxlIHNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIGNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmgiCis+IAorPiBjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKzQxMTcsNDExOGM5MjEzLDkyMTUKKzwgIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKzwgIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCistLS0KKz4gIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKz4gIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorPiAjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKzQxMjAsNDEyN2M5MjE3LDkyMTgKKzwgIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKzwgIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorPCAjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKzwgIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKzwgIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCis8ICMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCis8ICMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorPCAjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorLS0tCis+ICMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Cis+ICMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorNDEyOWM5MjIwLDkyMjUKKzwgRU9GCistLS0KKz4gIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCis+ICMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKz4gIyBmb2xsb3dpbmcgdmFsdWVzLgorPiAKKz4gX0FDRU9GCis+IAorNDEzMmM5MjI4Cis8ICMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKy0tLQorPiAjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorNDEzNSw0MTU0YzkyMzEsOTI3NworPCAoc2V0KSAyPiYxIHwKKzwgICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorPCAgICphY19zcGFjZT1cICopCis8ICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorPCAgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKzwgICAgIHNlZCAtbiBcCis8ICAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCis8ICAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKzwgICAgIDs7Cis8ICAgKikKKzwgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCis8ICAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCis8ICAgICA7OworPCAgIGVzYWMgPj4gY29uZmNhY2hlCis8IGlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKzwgICA6Cis8IGVsc2UKKzwgICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCis8ICAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKzwgICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorLS0tCis+ICgKKz4gICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCis+ICAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKz4gICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorPiAgICAgKiR7YXNfbmx9KikKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Cis+ICAgICAgIGVzYWMKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKz4gICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKz4gICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKz4gICAgICAgZXNhYyA7OworPiAgICAgZXNhYworPiAgIGRvbmUKKz4gCis+ICAgKHNldCkgMj4mMSB8Cis+ICAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCis+ICAgICAqJHthc19ubH1hY19zcGFjZT1cICopCis+ICAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKKz4gICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCis+ICAgICAgIHNlZCAtbiBcCis+IAkicy8nLydcXFxcJycvZzsKKz4gCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorPiAgICAgICA7OyAjKAorPiAgICAgKikKKz4gICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKz4gICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKz4gICAgICAgOzsKKz4gICAgIGVzYWMgfAorPiAgICAgc29ydAorPiApIHwKKz4gICBzZWQgJworPiAgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorPiAgICAgIHQgY2xlYXIKKz4gICAgICA6Y2xlYXIKKz4gICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCis+ICAgICAgdCBlbmQKKz4gICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKz4gICAgICA6ZW5kJyA+PmNvbmZjYWNoZQorPiBpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCis+ICAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCis+ICAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKz4gICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCis0MTU2YzkyNzksOTI4MAorPCAgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCistLS0KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorNDE2MSw0MTYyZDkyODQKKzwgdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKzwgCis0MTY3LDQxNzJjOTI4OQorPCAjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKzwgIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCis8ICMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgorPCBpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorPCAgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKKzwgZmkKKy0tLQorPiBERUZTPS1ESEFWRV9DT05GSUdfSAorNDE3NGM5MjkxLDkzMDIKKzwgdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorLS0tCis+IGFjX2xpYm9ianM9Cis+IGFjX2x0bGlib2Jqcz0KKz4gZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCis+ICAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorPiAgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworPiAgIGFjX2k9YCRhc19lY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAorPiAgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKz4gICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKz4gICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKKz4gICBhY19sdGxpYm9ianM9IiRhY19sdGxpYm9ianMgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKKz4gZG9uZQorPiBMSUJPQkpTPSRhY19saWJvYmpzCis0MTc2YzkzMDQKKzwgREVGUz0tREhBVkVfQ09ORklHX0gKKy0tLQorPiBMVExJQk9CSlM9JGFjX2x0bGlib2JqcworNDE3OCw0MTc5ZDkzMDUKKzwgIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis8IDogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKzQxODEsNDE4NWM5MzA3LDkzMTcKKzwgZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworPCBybSAtZiAkQ09ORklHX1NUQVRVUworPCBjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorPCAjISAvYmluL3NoCis8ICMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorLS0tCis+IAorPiAKKz4gOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorPiBhY193cml0ZV9mYWlsPTAKKz4gYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKKz4gYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cis+IGNhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+ICMhICRTSEVMTAorPiAjIEdlbmVyYXRlZCBieSAkYXNfbWUuCis0MTg3LDQxOTFkOTMxOAorPCAjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCis8ICMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Cis8ICMKKzwgIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKzwgIworNDE5M2M5MzIwCis8ICMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorLS0tCis+ICMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKzQxOTUsNDE5NmM5MzIyLDk0MjAKKzwgYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKKzwgZm9yIGFjX29wdGlvbgorLS0tCis+IGRlYnVnPWZhbHNlCis+IGFjX2NzX3JlY2hlY2s9ZmFsc2UKKz4gYWNfY3Nfc2lsZW50PWZhbHNlCis+IFNIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9Cis+IF9BQ0VPRgorPiAKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKz4gIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworPiAKKz4gIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCis+IERVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKz4gaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgZW11bGF0ZSBzaAorPiAgIE5VTExDTUQ9OgorPiAgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorPiAgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCis+ICAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCis+ICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKz4gZWxzZQorPiAgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgorPiAgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworPiBlc2FjCis+IAorPiBmaQorPiAKKz4gCis+IAorPiAKKz4gIyBQQVRIIG5lZWRzIENSCis+ICMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KKz4gYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCis+IGFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworPiBhc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKKz4gYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworPiBhc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKz4gCis+IGFzX25sPScKKz4gJworPiBleHBvcnQgYXNfbmwKKz4gIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KKz4gYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKz4gYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCis+IGFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCis+IGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCis+ICAgYXNfZWNobz0ncHJpbnRmICVzXG4nCis+ICAgYXNfZWNob19uPSdwcmludGYgJXMnCis+IGVsc2UKKz4gICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKz4gICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCis+ICAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCis+ICAgZWxzZQorPiAgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKz4gICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCis+ICAgICAgIGFyZz0kMTsKKz4gICAgICAgY2FzZSAkYXJnIGluCis+ICAgICAgICoiJGFzX25sIiopCis+IAlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKz4gCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7Cis+ICAgICAgIGVzYWM7Cis+ICAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKz4gICAgICcKKz4gICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorPiAgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKz4gICBmaQorPiAgIGV4cG9ydCBhc19lY2hvX2JvZHkKKz4gICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCis+IGZpCis+IAorPiAjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KKz4gaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKz4gICBQQVRIX1NFUEFSQVRPUj06Cis+ICAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworPiAgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKz4gICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCis+ICAgfQorPiBmaQorPiAKKz4gIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCis+IGlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGFzX3Vuc2V0PXVuc2V0Cis+IGVsc2UKKz4gICBhc191bnNldD1mYWxzZQorPiBmaQorPiAKKz4gCis+ICMgSUZTCis+ICMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCis+ICMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorPiAjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKz4gIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorPiBJRlM9IiAiIgkkYXNfbmwiCis+IAorPiAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorPiBjYXNlICQwIGluCis+ICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworPiAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorNDE5OCw0MjA4Yzk0MjIsOTQyNAorPCAgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorPCAgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorPCAgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorPCAgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Cis8ICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCis8ICAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorPCAgICAgZXhpdCAwIDs7Cis8ICAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCis8ICAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Cis8ICAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworPCAgIGVzYWMKKy0tLQorPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCis0MjA5YTk0MjYKKz4gSUZTPSRhc19zYXZlX0lGUworNDIxMSw0MjEyYzk0MjgsOTQzOAorPCBhY19naXZlbl9zcmNkaXI9JHNyY2RpcgorPCBhY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKy0tLQorPiAgICAgIDs7Cis+IGVzYWMKKz4gIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworPiAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKz4gaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorPiAgIGFzX215c2VsZj0kMAorPiBmaQorPiBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCis+ICAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKz4gICB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gZmkKKzQyMTQsNDM5M2M5NDQwLDk1NzcKKzwgdHJhcCAncm0gLWZyIGBlY2hvICJpY3VkZWZzLm1rIFwKKzwgCQlNYWtlZmlsZSBcCis8IAkJZGF0YS9pY3Vwa2cuaW5jIFwKKzwgCQljb25maWcvTWFrZWZpbGUuaW5jIFwKKzwgCQlkYXRhL01ha2VmaWxlIFwKKzwgCQlzdHViZGF0YS9NYWtlZmlsZSBcCis8IAkJY29tbW9uL01ha2VmaWxlIFwKKzwgCQlpMThuL01ha2VmaWxlIFwKKzwgCQlsYXlvdXQvTWFrZWZpbGUgXAorPCAJCWxheW91dGV4L01ha2VmaWxlIFwKKzwgCQlpby9NYWtlZmlsZSBcCis8IAkJZXh0cmEvTWFrZWZpbGUgXAorPCAJCWV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlIFwKKzwgCQl0b29scy9NYWtlZmlsZSB0b29scy9jdGVzdGZ3L01ha2VmaWxlIFwKKzwgCQl0b29scy9tYWtlY29udi9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VucmIvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnVjYS9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNtbi9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VuY252YWwvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbm5hbWVzL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW50ZXN0L01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5ub3JtL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5wcm9wcy9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VuY2FzZS9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VucG5hbWUvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmJyay9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2Vuc3ByZXAvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2ljdXN3YXAvTWFrZWZpbGUgXAorPCAJCXRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUgXAorPCAJCXRvb2xzL3Rvb2x1dGlsL01ha2VmaWxlIFwKKzwgCQl0b29scy9kdW1wY2UvTWFrZWZpbGUgXAorPCAJCXRlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGVzdGRhdGEvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGVzdGRhdGEvcGtnZGF0YS5pbmMgXAorPCAJCXRlc3QvaGRydHN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L2lvdGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC90aGFpdGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC90ZXN0bWFwL01ha2VmaWxlIFwKKzwgCQl0ZXN0L2xldGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIFwKKzwgCQlzYW1wbGVzL01ha2VmaWxlIHNhbXBsZXMvZGF0ZS9NYWtlZmlsZSBcCis8IAkJc2FtcGxlcy9jYWwvTWFrZWZpbGUgc2FtcGxlcy9sYXlvdXQvTWFrZWZpbGUgXAorPCAJCWNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmggY29tbW9uL2ljdWNmZy5oIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Cis8IEVPRgorPCBjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKzwgCis8ICMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCis8IHNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cis8ICBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorPCAkYWNfdnBzdWIKKzwgJGV4dHJhc3ViCis8IHMlQFNIRUxMQCUkU0hFTEwlZworPCBzJUBDRkxBR1NAJSRDRkxBR1MlZworPCBzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKKzwgcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCis8IHMlQEZGTEFHU0AlJEZGTEFHUyVnCis8IHMlQERFRlNAJSRERUZTJWcKKzwgcyVATERGTEFHU0AlJExERkxBR1MlZworPCBzJUBMSUJTQCUkTElCUyVnCis8IHMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworPCBzJUBwcmVmaXhAJSRwcmVmaXglZworPCBzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCis8IHMlQGJpbmRpckAlJGJpbmRpciVnCis8IHMlQHNiaW5kaXJAJSRzYmluZGlyJWcKKzwgcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworPCBzJUBkYXRhZGlyQCUkZGF0YWRpciVnCis8IHMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKKzwgcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCis8IHMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKKzwgcyVAbGliZGlyQCUkbGliZGlyJWcKKzwgcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworPCBzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCis8IHMlQGluZm9kaXJAJSRpbmZvZGlyJWcKKzwgcyVAbWFuZGlyQCUkbWFuZGlyJWcKKzwgcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZworPCBzJUBWRVJTSU9OQCUkVkVSU0lPTiVnCis8IHMlQExJQl9WRVJTSU9OQCUkTElCX1ZFUlNJT04lZworPCBzJUBMSUJfVkVSU0lPTl9NQUpPUkAlJExJQl9WRVJTSU9OX01BSk9SJWcKKzwgcyVAVU5JQ09ERV9WRVJTSU9OQCUkVU5JQ09ERV9WRVJTSU9OJWcKKzwgcyVAQ0NAJSRDQyVnCis8IHMlQENYWEAlJENYWCVnCis8IHMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCis8IHMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZworPCBzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworPCBzJUBTVFJJUEAlJFNUUklQJWcKKzwgcyVAVV9NQUtFQCUkVV9NQUtFJWcKKzwgcyVARE9YWUdFTkAlJERPWFlHRU4lZworPCBzJUBob3N0QCUkaG9zdCVnCis8IHMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKKzwgcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCis8IHMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworPCBzJUBob3N0X29zQCUkaG9zdF9vcyVnCis8IHMlQEVYRUVYVEAlJEVYRUVYVCVnCis8IHMlQEFSRkxBR1NAJSRBUkZMQUdTJWcKKzwgcyVAQ09NUElMRV9MSU5LX0VOVlZBUkAlJENPTVBJTEVfTElOS19FTlZWQVIlZworPCBzJUBMSUJfTUAlJExJQl9NJWcKKzwgcyVARU5BQkxFX1NIQVJFREAlJEVOQUJMRV9TSEFSRUQlZworPCBzJUBFTkFCTEVfU1RBVElDQCUkRU5BQkxFX1NUQVRJQyVnCis8IHMlQEVOQUJMRV9ERUJVR0AlJEVOQUJMRV9ERUJVRyVnCis8IHMlQEVOQUJMRV9SRUxFQVNFQCUkRU5BQkxFX1JFTEVBU0UlZworPCBzJUBSQU5MSUJAJSRSQU5MSUIlZworPCBzJUBBUkAlJEFSJWcKKzwgcyVAVV9ESVNBQkxFX1JFTkFNSU5HQCUkVV9ESVNBQkxFX1JFTkFNSU5HJWcKKzwgcyVAVV9FTkFCTEVfVFJBQ0lOR0AlJFVfRU5BQkxFX1RSQUNJTkclZworPCBzJUBFTkFCTEVfUlBBVEhAJSRFTkFCTEVfUlBBVEglZworPCBzJUBVX0lOTElORUAlJFVfSU5MSU5FJWcKKzwgcyVAVEhSRUFEU19UUlVFQCUkVEhSRUFEU19UUlVFJWcKKzwgcyVASUNVX1VTRV9USFJFQURTQCUkSUNVX1VTRV9USFJFQURTJWcKKzwgcyVASEFWRV9NTUFQQCUkSEFWRV9NTUFQJWcKKzwgcyVAR0VOQ0NPREVfQVNTRU1CTFlAJSRHRU5DQ09ERV9BU1NFTUJMWSVnCis8IHMlQENQUEAlJENQUCVnCis8IHMlQFVfSEFWRV9JTlRUWVBFU19IQCUkVV9IQVZFX0lOVFRZUEVTX0glZworPCBzJUBDWFhDUFBAJSRDWFhDUFAlZworPCBzJUBVX0lPU1RSRUFNX1NPVVJDRUAlJFVfSU9TVFJFQU1fU09VUkNFJWcKKzwgcyVAVV9JU19CSUdfRU5ESUFOQCUkVV9JU19CSUdfRU5ESUFOJWcKKzwgcyVAVV9IQVZFX05MX0xBTkdJTkZPQCUkVV9IQVZFX05MX0xBTkdJTkZPJWcKKzwgcyVAVV9IQVZFX05MX0xBTkdJTkZPX0NPREVTRVRAJSRVX0hBVkVfTkxfTEFOR0lORk9fQ09ERVNFVCVnCis8IHMlQFVfTkxfTEFOR0lORk9fQ09ERVNFVEAlJFVfTkxfTEFOR0lORk9fQ09ERVNFVCVnCis8IHMlQFVfSEFWRV9OQU1FU1BBQ0VAJSRVX0hBVkVfTkFNRVNQQUNFJWcKKzwgcyVAVV9PVkVSUklERV9DWFhfQUxMT0NBVElPTkAlJFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT04lZworPCBzJUBVX0hBVkVfUExBQ0VNRU5UX05FV0AlJFVfSEFWRV9QTEFDRU1FTlRfTkVXJWcKKzwgcyVAVV9IQVZFX1BPUEVOQCUkVV9IQVZFX1BPUEVOJWcKKzwgcyVAVV9IQVZFX1RaU0VUQCUkVV9IQVZFX1RaU0VUJWcKKzwgcyVAVV9UWlNFVEAlJFVfVFpTRVQlZworPCBzJUBVX0hBVkVfVFpOQU1FQCUkVV9IQVZFX1RaTkFNRSVnCis8IHMlQFVfVFpOQU1FQCUkVV9UWk5BTUUlZworPCBzJUBVX0hBVkVfVElNRVpPTkVAJSRVX0hBVkVfVElNRVpPTkUlZworPCBzJUBVX1RJTUVaT05FQCUkVV9USU1FWk9ORSVnCis8IHMlQEhBVkVfSU5UOF9UQCUkSEFWRV9JTlQ4X1QlZworPCBzJUBIQVZFX1VJTlQ4X1RAJSRIQVZFX1VJTlQ4X1QlZworPCBzJUBIQVZFX0lOVDE2X1RAJSRIQVZFX0lOVDE2X1QlZworPCBzJUBIQVZFX1VJTlQxNl9UQCUkSEFWRV9VSU5UMTZfVCVnCis8IHMlQEhBVkVfSU5UMzJfVEAlJEhBVkVfSU5UMzJfVCVnCis8IHMlQEhBVkVfVUlOVDMyX1RAJSRIQVZFX1VJTlQzMl9UJWcKKzwgcyVASEFWRV9JTlQ2NF9UQCUkSEFWRV9JTlQ2NF9UJWcKKzwgcyVASEFWRV9VSU5UNjRfVEAlJEhBVkVfVUlOVDY0X1QlZworPCBzJUBVX0hBVkVfV0NIQVJfSEAlJFVfSEFWRV9XQ0hBUl9IJWcKKzwgcyVAVV9IQVZFX1dDU0NQWUAlJFVfSEFWRV9XQ1NDUFklZworPCBzJUBVX1NJWkVPRl9XQ0hBUl9UQCUkVV9TSVpFT0ZfV0NIQVJfVCVnCis8IHMlQEVYVFJBU19UUlVFQCUkRVhUUkFTX1RSVUUlZworPCBzJUBJQ1VJT19UUlVFQCUkSUNVSU9fVFJVRSVnCis8IHMlQExBWU9VVF9UUlVFQCUkTEFZT1VUX1RSVUUlZworPCBzJUB0aGVzeXNjb25mZGlyQCUkdGhlc3lzY29uZmRpciVnCis8IHMlQHRoZWRhdGFkaXJAJSR0aGVkYXRhZGlyJWcKKzwgcyVAdGhlbGliZGlyQCUkdGhlbGliZGlyJWcKKzwgcyVAcGtnaWN1ZGF0YWRpckAlJHBrZ2ljdWRhdGFkaXIlZworPCBzJUB0aGVwa2dpY3VkYXRhZGlyQCUkdGhlcGtnaWN1ZGF0YWRpciVnCis8IHMlQERBVEFfUEFDS0FHSU5HX0NQUEZMQUdTQCUkREFUQV9QQUNLQUdJTkdfQ1BQRkxBR1MlZworPCBzJUBEQVRBX1BBQ0tBR0lOR19NT0RFQCUkREFUQV9QQUNLQUdJTkdfTU9ERSVnCis8IHMlQElDVUxJQlNVRkZJWEAlJElDVUxJQlNVRkZJWCVnCis8IHMlQFVfSEFWRV9MSUJfU1VGRklYQCUkVV9IQVZFX0xJQl9TVUZGSVglZworPCBzJUBJQ1VMSUJTVUZGSVhDTkFNRUAlJElDVUxJQlNVRkZJWENOQU1FJWcKKzwgcyVAVEVTVFNfVFJVRUAlJFRFU1RTX1RSVUUlZworPCBzJUBTQU1QTEVTX1RSVUVAJSRTQU1QTEVTX1RSVUUlZworPCBzJUBJQ1VEQVRBX0NIQVJAJSRJQ1VEQVRBX0NIQVIlZworPCBzJUBwbGF0Zm9ybUAlJHBsYXRmb3JtJWcKKzwgcyVAcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lQCUkcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lJWcKKzwgcyVAcGxhdGZvcm1fbWFrZV9mcmFnbWVudEAlJHBsYXRmb3JtX21ha2VfZnJhZ21lbnQlZworPCBzJUBsZF9ycGF0aF9zdWZAJSRsZF9ycGF0aF9zdWYlZworPCBzJUBBSVhfU0hMSUJAJSRBSVhfU0hMSUIlZworPCAKKzwgQ0VPRgorPCBFT0YKKzwgCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgCis8ICMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCis8ICMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorPCBhY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorPCBhY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorPCBhY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KKzwgYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorPCBhY19tb3JlX2xpbmVzPToKKzwgYWNfc2VkX2NtZHM9IiIKKzwgd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCis8ICAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCis8ICAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorLS0tCis+ICMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorPiBmb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICis+IGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCis+IGRvbmUKKz4gUFMxPSckICcKKz4gUFMyPSc+ICcKKz4gUFM0PScrICcKKz4gCis+ICMgTkxTIG51aXNhbmNlcy4KKz4gTENfQUxMPUMKKz4gZXhwb3J0IExDX0FMTAorPiBMQU5HVUFHRT1DCis+IGV4cG9ydCBMQU5HVUFHRQorPiAKKz4gIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCis+IGlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCis+ICAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCis+ICAgYXNfZXhwcj1leHByCis+IGVsc2UKKz4gICBhc19leHByPWZhbHNlCis+IGZpCis+IAorPiBpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCis+ICAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKKz4gZWxzZQorPiAgIGFzX2Jhc2VuYW1lPWZhbHNlCis+IGZpCis+IAorPiAKKz4gIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorPiBhc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKz4gJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKz4gCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorPiAkYXNfZWNobyBYLyIkMCIgfAorPiAgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwvXChcL1wvXCkkL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgL15YXC9cKFwvXCkuKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIHMvLiovLi87IHEnYAorPiAKKz4gIyBDRFBBVEguCis+ICRhc191bnNldCBDRFBBVEgKKz4gCis+IAorPiAKKz4gICBhc19saW5lbm9fMT0kTElORU5PCis+ICAgYXNfbGluZW5vXzI9JExJTkVOTworPiAgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorPiAgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgeworPiAKKz4gICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCis+ICAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQorPiAgICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJworPiAgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCis+ICAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcworPiAgICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKKz4gICAjIGNhc2UgYXQgbGluZSBlbmQuCis+ICAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCis+ICAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCis+ICAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKz4gICBzZWQgLW4gJworPiAgICAgcAorPiAgICAgL1skXUxJTkVOTy89Cis+ICAgJyA8JGFzX215c2VsZiB8Cis+ICAgICBzZWQgJworPiAgICAgICBzL1skXUxJTkVOTy4qLyYtLworPiAgICAgICB0IGxpbmVubworPiAgICAgICBiCis+ICAgICAgIDpsaW5lbm8KKz4gICAgICAgTgorPiAgICAgICA6bG9vcAorPiAgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKz4gICAgICAgdCBsb29wCis+ICAgICAgIHMvLVxuLiovLworPiAgICAgJyA+JGFzX21lLmxpbmVubyAmJgorPiAgIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gCis+ICAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKz4gICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKz4gICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgorPiAgIC4gIi4vJGFzX21lLmxpbmVubyIKKz4gICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKz4gICBleGl0Cis+IH0KKz4gCis+IAorPiBpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKz4gICBhc19kaXJuYW1lPWRpcm5hbWUKKz4gZWxzZQorPiAgIGFzX2Rpcm5hbWU9ZmFsc2UKKz4gZmkKKz4gCis+IEVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Cis+IGNhc2UgYGVjaG8gLW4geGAgaW4KKz4gLW4qKQorPiAgIGNhc2UgYGVjaG8gJ3hcYydgIGluCis+ICAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCis+ICAgKikgICBFQ0hPX0M9J1xjJzs7Cis+ICAgZXNhYzs7Cis+ICopCis+ICAgRUNIT19OPSctbic7OworPiBlc2FjCis+IGlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCis+ICAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCis+ICAgYXNfZXhwcj1leHByCis+IGVsc2UKKz4gICBhc19leHByPWZhbHNlCis+IGZpCis+IAorPiBybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorPiBpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKz4gICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCis+IGVsc2UKKz4gICBybSAtZiBjb25mJCQuZGlyCis+ICAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorPiBmaQorPiBpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCis+ICAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCis+ICAgICBhc19sbl9zPSdsbiAtcycKKz4gICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Cis+ICAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorPiAgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCis+ICAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorPiAgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorPiAgICAgICBhc19sbl9zPSdjcCAtcCcKKz4gICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorPiAgICAgYXNfbG5fcz1sbgorNDM5NWM5NTc5Cis8ICAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKy0tLQorPiAgICAgYXNfbG5fcz0nY3AgLXAnCis0Mzk3LDQ0NzJjOTU4MSw5NTg1Cis8ICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorPCAgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorPCAgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCis8ICAgZWxzZQorPCAgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorPCAgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKzwgICAgIGVsc2UKKzwgICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCis8ICAgICBmaQorPCAgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCis8ICAgICBhY19iZWc9JGFjX2VuZAorPCAgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorPCAgIGZpCis8IGRvbmUKKzwgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorPCAgIGFjX3NlZF9jbWRzPWNhdAorPCBmaQorPCBFT0YKKzwgCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorPCAKKzwgQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iaWN1ZGVmcy5tayBcCis8IAkJTWFrZWZpbGUgXAorPCAJCWRhdGEvaWN1cGtnLmluYyBcCis8IAkJY29uZmlnL01ha2VmaWxlLmluYyBcCis8IAkJZGF0YS9NYWtlZmlsZSBcCis8IAkJc3R1YmRhdGEvTWFrZWZpbGUgXAorPCAJCWNvbW1vbi9NYWtlZmlsZSBcCis8IAkJaTE4bi9NYWtlZmlsZSBcCis8IAkJbGF5b3V0L01ha2VmaWxlIFwKKzwgCQlsYXlvdXRleC9NYWtlZmlsZSBcCis8IAkJaW8vTWFrZWZpbGUgXAorPCAJCWV4dHJhL01ha2VmaWxlIFwKKzwgCQlleHRyYS91Y29udi9NYWtlZmlsZSBleHRyYS9zY3JwdHJ1bi9NYWtlZmlsZSBcCis8IAkJdG9vbHMvTWFrZWZpbGUgdG9vbHMvY3Rlc3Rmdy9NYWtlZmlsZSBcCis8IAkJdG9vbHMvbWFrZWNvbnYvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnJiL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW51Y2EvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5jbW4vTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNudmFsL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5uYW1lcy9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VudGVzdC9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2Vubm9ybS9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VucHJvcHMvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNhc2UvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5icmsvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIFwKKzwgCQl0b29scy9pY3Vzd2FwL01ha2VmaWxlIFwKKzwgCQl0b29scy9wa2dkYXRhL01ha2VmaWxlIFwKKzwgCQl0b29scy90b29sdXRpbC9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZHVtcGNlL01ha2VmaWxlIFwKKzwgCQl0ZXN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L3Rlc3RkYXRhL01ha2VmaWxlIFwKKzwgCQl0ZXN0L3Rlc3RkYXRhL3BrZ2RhdGEuaW5jIFwKKzwgCQl0ZXN0L2hkcnRzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC9pbnRsdGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC9jaW50bHRzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC9pb3Rlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGhhaXRlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGVzdG1hcC9NYWtlZmlsZSBcCis8IAkJdGVzdC9sZXRlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSBcCis8IAkJc2FtcGxlcy9NYWtlZmlsZSBzYW1wbGVzL2RhdGUvTWFrZWZpbGUgXAorPCAJCXNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIFwKKzwgCQljb21tb24vdW5pY29kZS9wbGF0Zm9ybS5oIn0KKzwgRU9GCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKzwgICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCis8ICAgY2FzZSAiJGFjX2ZpbGUiIGluCis8ICAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKzwgICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworPCAgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Cis8ICAgZXNhYworLS0tCis+IGVsc2UKKz4gICBhc19sbl9zPSdjcCAtcCcKKz4gZmkKKz4gcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorPiBybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCis0NDc0Yzk1ODcsOTU5MgorPCAgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCistLS0KKz4gaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGFzX21rZGlyX3A9OgorPiBlbHNlCis+ICAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKz4gICBhc19ta2Rpcl9wPWZhbHNlCis+IGZpCis0NDc2LDQ0ODNjOTU5NCw5NTk4Cis8ICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCis8ICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKzwgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKzwgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCis8ICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorPCAgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorPCAgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKzwgICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCistLS0KKz4gaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGFzX3Rlc3RfeD0ndGVzdCAteCcKKz4gZWxzZQorPiAgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgICAgYXNfbHNfTF9vcHRpb249TAorNDQ4NWM5NjAwCis8ICAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorLS0tCis+ICAgICBhc19sc19MX29wdGlvbj0KKzQ0ODZhOTYwMiw5NjM3Cis+ICAgYXNfdGVzdF94PScKKz4gICAgIGV2YWwgc2ggLWMgJ1wnJworPiAgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKz4gCXRlc3QgLWQgIiQxLy4iOworPiAgICAgICBlbHNlCis+IAljYXNlICQxIGluCis+IAktKilzZXQgIi4vJDEiOzsKKz4gCWVzYWM7Cis+IAljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgorPiAJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorPiAgICAgJ1wnJyBzaAorPiAgICcKKz4gZmkKKz4gYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKz4gCis+ICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KKz4gYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKz4gCis+ICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorPiBhc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorPiAKKz4gCis+IGV4ZWMgNj4mMQorPiAKKz4gIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KKz4gIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCis+ICMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCis+IGFjX2xvZz0iCis+IFRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKKz4gZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCis+IAorPiAgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKz4gICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKz4gICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCis+ICAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworPiAgICQgJDAgJEAKKzQ0ODgsNDQ5NmM5NjM5LDk2NTAKKzwgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorPCAgIC4pICBzcmNkaXI9LgorPCAgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCis8ICAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworPCAgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Cis8ICAgKikgIyBSZWxhdGl2ZSBwYXRoLgorPCAgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKzwgICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKzwgICBlc2FjCistLS0KKz4gb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCis+ICIKKz4gCis+IF9BQ0VPRgorPiAKKz4gY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCis+ICIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKKz4gZXNhYworPiAKKz4gY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKz4gIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSQqOzsKKz4gZXNhYworNDQ5OCw0NTAxZDk2NTEKKzwgICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKzwgICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Cis8ICAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKzwgICBlc2FjCis0NTAzLDQ1MDljOTY1Myw5NzE4Cis8ICAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCis8ICAgcm0gLWYgIiRhY19maWxlIgorPCAgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorPCAgIGNhc2UgIiRhY19maWxlIiBpbgorPCAgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorPCAjICRjb25maWd1cmVfaW5wdXQiIDs7Cis8ICAgKikgYWNfY29tc3ViPSA7OworLS0tCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCis+IGNvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKKz4gY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKKz4gCis+IF9BQ0VPRgorPiAKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBhY19jc191c2FnZT0iXAorPiBcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKKz4gY3VycmVudCBjb25maWd1cmF0aW9uLgorPiAKKz4gVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtGSUxFXS4uLgorPiAKKz4gICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Cis+ICAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0Cis+ICAgLXEsIC0tcXVpZXQsIC0tc2lsZW50Cis+ICAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKz4gICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKz4gICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCis+ICAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKz4gICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorPiAgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKz4gICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCis+IAorPiBDb25maWd1cmF0aW9uIGZpbGVzOgorPiAkY29uZmlnX2ZpbGVzCis+IAorPiBDb25maWd1cmF0aW9uIGhlYWRlcnM6Cis+ICRjb25maWdfaGVhZGVycworPiAKKz4gUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCis+IAorPiBfQUNFT0YKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGFjX2NzX3ZlcnNpb249IlxcCis+IGNvbmZpZy5zdGF0dXMKKz4gY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLAorPiAgIHdpdGggb3B0aW9ucyBcXCJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYFxcIgorPiAKKz4gQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorPiBUaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKz4gZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKz4gCis+IGFjX3B3ZD0nJGFjX3B3ZCcKKz4gc3JjZGlyPSckc3JjZGlyJworPiBJTlNUQUxMPSckSU5TVEFMTCcKKz4gdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKKz4gX0FDRU9GCis+IAorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+ICMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KKz4gYWNfbmVlZF9kZWZhdWx0cz06Cis+IHdoaWxlIHRlc3QgJCMgIT0gMAorPiBkbworPiAgIGNhc2UgJDEgaW4KKz4gICAtLSo9KikKKz4gICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCis+ICAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCis+ICAgICBhY19zaGlmdD06Cis+ICAgICA7OworPiAgICopCis+ICAgICBhY19vcHRpb249JDEKKz4gICAgIGFjX29wdGFyZz0kMgorPiAgICAgYWNfc2hpZnQ9c2hpZnQKKz4gICAgIDs7Cis0NTEyLDQ1MjBjOTcyMSw5NzYwCis8ICAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKzwgICBzZWQgLWUgIiRhY19jb21zdWIKKzwgcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKKzwgcyVAc3JjZGlyQCUkc3JjZGlyJWcKKzwgcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworPCBzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCis8ICIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKKzwgZmk7IGRvbmUKKzwgcm0gLWYgY29uZnRlc3QucyoKKy0tLQorPiAgIGNhc2UgJGFjX29wdGlvbiBpbgorPiAgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCis+ICAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCis+ICAgICBhY19jc19yZWNoZWNrPTogOzsKKz4gICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCis+ICAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Cis+ICAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKz4gICAgIGRlYnVnPTogOzsKKz4gICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorPiAgICAgJGFjX3NoaWZ0Cis+ICAgICBjYXNlICRhY19vcHRhcmcgaW4KKz4gICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Cis+ICAgICBlc2FjCis+ICAgICBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJyRhY19vcHRhcmcnIgorPiAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7Cis+ICAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorPiAgICAgJGFjX3NoaWZ0Cis+ICAgICBjYXNlICRhY19vcHRhcmcgaW4KKz4gICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Cis+ICAgICBlc2FjCis+ICAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICckYWNfb3B0YXJnJyIKKz4gICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworPiAgIC0taGUgfCAtLWgpCis+ICAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKKz4gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiAgIC0taGVscCB8IC0taGVsIHwgLWggKQorPiAgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKz4gICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorPiAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKz4gICAgIGFjX2NzX3NpbGVudD06IDs7Cis+IAorPiAgICMgVGhpcyBpcyBhbiBlcnJvci4KKz4gICAtKikgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKKz4gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKz4gCis+ICAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKKz4gICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Cis0NTIyLDQ1NTNkOTc2MQorPCAjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorPCAjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCis8ICMKKzwgIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorPCBhY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKKzwgYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCis8IGFjX2RDPSdcMycKKzwgYWNfZEQ9JyVnJworPCAjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorPCBhY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKKzwgYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCis8IGFjX3VDPScgJworPCBhY191RD0nXDQlZycKKzwgIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KKzwgYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCis8IGFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCis8IGFjX2VDPScgJworPCBhY19lRD0nJWcnCis8IAorPCBpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorPCBFT0YKKzwgY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCis8ICAgQ09ORklHX0hFQURFUlM9ImNvbW1vbi9pY3VjZmcuaCIKKzwgRU9GCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgZmkKKzwgZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorPCAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKzwgICBjYXNlICIkYWNfZmlsZSIgaW4KKzwgICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorPCAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Cis8ICAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKzQ1NTRhOTc2Myw5NzY2Cis+ICAgc2hpZnQKKz4gZG9uZQorPiAKKz4gYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Cis0NTU2Yzk3NjgsOTc4MgorPCAgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKy0tLQorPiBpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCis+ICAgZXhlYyA2Pi9kZXYvbnVsbAorPiAgIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCis+IGZpCis+IAorPiBfQUNFT0YKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGlmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorPiAgIHNldCBYICckU0hFTEwnICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKz4gICBzaGlmdAorPiAgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2Cis+ICAgQ09ORklHX1NIRUxMPSckU0hFTEwnCis+ICAgZXhwb3J0IENPTkZJR19TSEVMTAorPiAgIGV4ZWMgIlwkQCIKKz4gZmkKKzQ1NTgsNDU4NGM5Nzg0LDk3OTcKKzwgICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorPCAgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCis8ICAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCis8IAorPCBFT0YKKzwgCis8ICMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCis8ICMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorPCAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorPCAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCis8IHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKzwgY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorPCBzL1tcXCYlXS9cXCYvZworPCBzJVtcXCRgXSVcXCYlZworPCBzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorPCBzJWFjX2QlYWNfdSVncAorPCBzJWFjX3UlYWNfZSVncAorPCBFT0YKKzwgc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworPCBybSAtZiBjb25mdGVzdC5oZHIKKzwgCis8ICMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKzwgIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorPCAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKzwgY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCis8IHMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCis8IEVPRgorLS0tCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGV4ZWMgNT4+Y29uZmlnLmxvZworPiB7Cis+ICAgZWNobworPiAgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCis+ICMjIFJ1bm5pbmcgJGFzX21lLiAjIworPiBfQVNCT1gKKz4gICAkYXNfZWNobyAiJGFjX2xvZyIKKz4gfSA+JjUKKz4gCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKz4gX0FDRU9GCis0NTg2LDQ1ODdjOTc5OQorPCAjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKzwgIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKy0tLQorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis0NTg5LDQ1OTBjOTgwMSw5ODAyCis8IHJtIC1mIGNvbmZ0ZXN0LnRhaWwKKzwgd2hpbGUgOgorLS0tCis+ICMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorPiBmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKKzQ1OTIsNDYxNmM5ODA0LDEwMDc2Cis8ICAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorPCAgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKzwgICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCis8ICAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCis8ICAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKzwgICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKzwgICBlY2hvICdDRU9GCis8ICAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKzwgICBybSAtZiBjb25mdGVzdC5pbgorPCAgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorPCAnID4+ICRDT05GSUdfU1RBVFVTCis8ICAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCis8ICAgcm0gLWYgY29uZnRlc3QudmFscworPCAgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworPCBkb25lCis8IHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKzwgCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKzwgICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKzwgICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorPCAgIHJtIC1mIGNvbmZ0ZXN0LmluCis8ICAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKzwgICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKzwgICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKy0tLQorPiAgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKz4gICAgICJjb21tb24vaWN1Y2ZnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbW1vbi9pY3VjZmcuaCIgOzsKKz4gICAgICJpY3VkZWZzLm1rIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGljdWRlZnMubWsiIDs7Cis+ICAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7Cis+ICAgICAiZGF0YS9pY3Vwa2cuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRhdGEvaWN1cGtnLmluYyIgOzsKKz4gICAgICJjb25maWcvTWFrZWZpbGUuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNvbmZpZy9NYWtlZmlsZS5pbmMiIDs7Cis+ICAgICAiZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYXRhL01ha2VmaWxlIiA7OworPiAgICAgInN0dWJkYXRhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHN0dWJkYXRhL01ha2VmaWxlIiA7OworPiAgICAgImNvbW1vbi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb21tb24vTWFrZWZpbGUiIDs7Cis+ICAgICAiaTE4bi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpMThuL01ha2VmaWxlIiA7OworPiAgICAgImxheW91dC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsYXlvdXQvTWFrZWZpbGUiIDs7Cis+ICAgICAibGF5b3V0ZXgvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGF5b3V0ZXgvTWFrZWZpbGUiIDs7Cis+ICAgICAiaW8vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW8vTWFrZWZpbGUiIDs7Cis+ICAgICAiZXh0cmEvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvTWFrZWZpbGUiIDs7Cis+ICAgICAiZXh0cmEvdWNvbnYvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvdWNvbnYvTWFrZWZpbGUiIDs7Cis+ICAgICAiZXh0cmEvc2NycHRydW4vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvc2NycHRydW4vTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvY3Rlc3Rmdy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9jdGVzdGZ3L01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL21ha2Vjb252L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL21ha2Vjb252L01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnJiL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnJiL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnVjYS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW51Y2EvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZ2VuY21uL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNtbi9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5jbnZhbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5jbnZhbC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5uYW1lcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5uYW1lcy9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW50ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZ2Vubm9ybS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5ub3JtL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnByb3BzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnByb3BzL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbmNhc2UvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VuY2FzZS9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5wbmFtZS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5wbmFtZS9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5icmsvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VuYnJrL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2ljdXN3YXAvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvaWN1c3dhcC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9wa2dkYXRhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZHVtcGNlL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2R1bXBjZS9NYWtlZmlsZSIgOzsKKz4gICAgICJ0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAidGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3Rlc3RkYXRhL01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvdGVzdGRhdGEvcGtnZGF0YS5pbmMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90ZXN0ZGF0YS9wa2dkYXRhLmluYyIgOzsKKz4gICAgICJ0ZXN0L2hkcnRzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2hkcnRzdC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvaW50bHRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAidGVzdC9jaW50bHRzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvaW90ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvaW90ZXN0L01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvdGhhaXRlc3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90aGFpdGVzdC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90ZXN0bWFwL01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvbGV0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvbGV0ZXN0L01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3RocmVhZHRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAic2FtcGxlcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzYW1wbGVzL01ha2VmaWxlIiA7OworPiAgICAgInNhbXBsZXMvZGF0ZS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzYW1wbGVzL2RhdGUvTWFrZWZpbGUiIDs7Cis+ICAgICAic2FtcGxlcy9jYWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9jYWwvTWFrZWZpbGUiIDs7Cis+ICAgICAic2FtcGxlcy9sYXlvdXQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9sYXlvdXQvTWFrZWZpbGUiIDs7Cis+ICAgICAiY29tbW9uL3VuaWNvZGUvcGxhdGZvcm0uaCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb21tb24vdW5pY29kZS9wbGF0Zm9ybS5oIiA7OworPiAKKz4gICAqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Cis+ICAgZXNhYworPiBkb25lCis+IAorPiAKKz4gIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorPiAjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKz4gIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorPiAjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgorPiBpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorPiAgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCis+ICAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKKz4gZmkKKz4gCis+ICMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorPiAjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCis+ICMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKz4gIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorPiAjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Cis+ICMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorPiAkZGVidWcgfHwKKz4geworPiAgIHRtcD0KKz4gICB0cmFwICdleGl0X3N0YXR1cz0kPworPiAgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCis+ICcgMAorPiAgIHRyYXAgJ3sgKGV4aXQgMSk7IGV4aXQgMTsgfScgMSAyIDEzIDE1Cis+IH0KKz4gIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCis+IAorPiB7Cis+ICAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCis+ICAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKKz4gfSAgfHwKKz4geworPiAgIHRtcD0uL2NvbmYkJC0kUkFORE9NCis+ICAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCis+IH0gfHwKKz4geworPiAgICAkYXNfZWNobyAiJGFzX21lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cis+IH0KKz4gCis+ICMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KKz4gIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKz4gIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCis+IGlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCis+IAorPiAKKz4gYWNfY3I9JworJworPiBhY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCis+IGlmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCis+ICAgYWNfY3NfYXdrX2NyPSdcXHInCis+IGVsc2UKKz4gICBhY19jc19hd2tfY3I9JGFjX2NyCis+IGZpCis+IAorPiBlY2hvICdCRUdJTiB7JyA+IiR0bXAvc3ViczEuYXdrIiAmJgorPiBfQUNFT0YKKz4gCis+IAorPiB7Cis+ICAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKz4gICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCis+ICAgZWNobyAiX0FDRU9GIgorPiB9ID5jb25mJCRzdWJzLnNoIHx8Cis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICckJ2AKKz4gYWNfZGVsaW09JyUhXyEjICcKKz4gZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCis+ICAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKz4gICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiAgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCis+ICAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKz4gICAgIGJyZWFrCis+ICAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKz4gICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgZWxzZQorPiAgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKz4gICBmaQorPiBkb25lCis+IHJtIC1mIGNvbmYkJHN1YnMuc2gKKz4gCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmCis+IF9BQ0VPRgorPiBzZWQgLW4gJworPiBoCis+IHMvXi9TWyIvOyBzLyEuKi8iXT0vCis+IHAKKz4gZworPiBzL15bXiFdKiEvLworPiA6cmVwbAorPiB0IHJlcGwKKz4gcy8nIiRhY19kZWxpbSInJC8vCis+IHQgZGVsaW0KKz4gOm5sCis+IGgKKz4gcy9cKC5cezE0OFx9XCkuKi9cMS8KKz4gdCBtb3JlMQorPiBzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCis+IHAKKz4gbgorPiBiIHJlcGwKKz4gOm1vcmUxCis+IHMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KKz4gcAorPiBnCis+IHMvLlx7MTQ4XH0vLworPiB0IG5sCis+IDpkZWxpbQorPiBoCis+IHMvXCguXHsxNDhcfVwpLiovXDEvCis+IHQgbW9yZTIKKz4gcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KKz4gcAorPiBiCis+IDptb3JlMgorPiBzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCis+IHAKKz4gZworPiBzLy5cezE0OFx9Ly8KKz4gdCBkZWxpbQorPiAnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCis+IC9eW14iIl0veworPiAgIE4KKz4gICBzL1xuLy8KKz4gfQorPiAnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCis+IHJtIC1mIGNvbmYkJHN1YnMuYXdrCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBfQUNBV0sKKz4gY2F0ID4+IlwkdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKz4gICBmb3IgKGtleSBpbiBTKSBTX2lzX3NldFtrZXldID0gMQorPiAgIEZTID0gIgciCis+IAorPiB9Cis+IHsKKz4gICBsaW5lID0gJCAwCis+ICAgbmZpZWxkcyA9IHNwbGl0KGxpbmUsIGZpZWxkLCAiQCIpCis+ICAgc3Vic3RlZCA9IDAKKz4gICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCis+ICAgZm9yIChpID0gMjsgaSA8IG5maWVsZHM7IGkrKykgeworPiAgICAga2V5ID0gZmllbGRbaV0KKz4gICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCis+ICAgICBpZiAoU19pc19zZXRba2V5XSkgeworPiAgICAgICB2YWx1ZSA9IFNba2V5XQorPiAgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCis+ICAgICAgIGxlbiArPSBsZW5ndGgodmFsdWUpICsgbGVuZ3RoKGZpZWxkWysraV0pCis+ICAgICAgIHN1YnN0ZWQgPSAxCis+ICAgICB9IGVsc2UKKz4gICAgICAgbGVuICs9IDEgKyBrZXlsZW4KKz4gICB9Cis+IAorPiAgIHByaW50IGxpbmUKKz4gfQorPiAKKz4gX0FDQVdLCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGlmIHNlZCAicy8kYWNfY3IvLyIgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCis+IGVsc2UKKz4gICBjYXQKKz4gZmkgPCAiJHRtcC9zdWJzMS5hd2siID4gIiR0bXAvc3Vicy5hd2siIFwKKz4gICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiBfQUNFT0YKKz4gCis+ICMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAorPiAjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorPiAjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorPiAjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCis+IGlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCis+ICAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97Cis+IHMvOipcJChzcmNkaXIpOiovOi8KKz4gcy86Klwke3NyY2Rpcn06Ki86LworPiBzLzoqQHNyY2RpckA6Ki86LworPiBzL15cKFtePV0qPVsJIF0qXCk6Ki9cMS8KKz4gcy86KiQvLworPiBzL15bXj1dKj1bCSBdKiQvLworPiB9JworPiBmaQorPiAKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCis+IAorPiAjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KKz4gIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorPiAjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIE1ha2VmaWxlJy4KKz4gaWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorPiBjYXQgPiIkdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKKz4gQkVHSU4geworPiBfQUNFT0YKKz4gCis+ICMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCis+ICMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKz4gIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorPiAKKz4gIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQorPiAjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCis+IGFjX2RlbGltPSclIV8hIyAnCis+IGZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbworPiAgIGFjX3Q9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorPiAgIGlmIHRlc3QgLXogIiRhY190IjsgdGhlbgorPiAgICAgYnJlYWsKKz4gICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorPiAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDYxOCw0NjIyYzEwMDc4LDEwNDUxCis8ICAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKzwgICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKzwgICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCis8ICAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCis8ICAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCistLS0KKz4gICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCis+ICAgZmkKKz4gZG9uZQorPiAKKz4gIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCis+ICMgbGlrZXdpc2UgUCBjb250YWlucyBtYWNybyBwYXJhbWV0ZXJzIGlmIGFueS4gIFByZXNlcnZlIGJhY2tzbGFzaAorPiAjIG5ld2xpbmUgc2VxdWVuY2VzLgorPiAKKz4gYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKKz4gc2VkIC1uICcKKz4gcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCis+IHQgcnNldAorPiA6cnNldAorPiBzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLworPiB0IGRlZgorPiBkCis+IDpkZWYKKz4gcy9cXCQvLworPiB0IGJzbmwKKz4gcy9bIlxcXS9cXCYvZworPiBzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKKz4gRFsiXDEiXT0iIFwzIi9wCis+IHMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCis+IGQKKz4gOmJzbmwKKz4gcy9bIlxcXS9cXCYvZworPiBzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKKz4gRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCis+IHQgY29udAorPiBzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMlxcXFxcXG4iXFwvcAorPiB0IGNvbnQKKz4gZAorPiA6Y29udAorPiBuCis+IHMvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZworPiB0IGNsZWFyCis+IDpjbGVhcgorPiBzL1xcJC8vCis+IHQgYnNubGMKKz4gcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCis+IGQKKz4gOmJzbmxjCis+IHMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAorPiBiIGNvbnQKKz4gJyA8Y29uZmRlZnMuaCB8IHNlZCAnCis+IHMvJyIkYWNfZGVsaW0iJy8iXFxcCis+ICIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKz4gCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCis+ICAgRlMgPSAiByIKKz4gfQorPiAvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKz4gICBsaW5lID0gXCQgMAorPiAgIHNwbGl0KGxpbmUsIGFyZywgIiAiKQorPiAgIGlmIChhcmdbMV0gPT0gIiMiKSB7Cis+ICAgICBkZWZ1bmRlZiA9IGFyZ1syXQorPiAgICAgbWFjMSA9IGFyZ1szXQorPiAgIH0gZWxzZSB7Cis+ICAgICBkZWZ1bmRlZiA9IHN1YnN0cihhcmdbMV0sIDIpCis+ICAgICBtYWMxID0gYXJnWzJdCis+ICAgfQorPiAgIHNwbGl0KG1hYzEsIG1hYzIsICIoIikgIykKKz4gICBtYWNybyA9IG1hYzJbMV0KKz4gICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKz4gICBpZiAoRF9pc19zZXRbbWFjcm9dKSB7Cis+ICAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgorPiAgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorPiAgICAgbmV4dAorPiAgIH0gZWxzZSB7Cis+ICAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCis+ICAgICAjIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCis+ICAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKz4gICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7Cis+ICAgICAgIHByaW50ICIvKiIsIHByZWZpeCBkZWZ1bmRlZiwgbWFjcm8sICIqLyIKKz4gICAgICAgbmV4dAorPiAgICAgfQorPiAgIH0KKz4gfQorPiB7IHByaW50IH0KKz4gX0FDQVdLCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IGZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgorPiAKKz4gCis+IGV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgICIKKz4gc2hpZnQKKz4gZm9yIGFjX3RhZworPiBkbworPiAgIGNhc2UgJGFjX3RhZyBpbgorPiAgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworPiAgIGVzYWMKKz4gICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorPiAgIDpbRkhMXSo6Kik7OworPiAgIDpMKiB8IDpDKjoqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB0YWcgJGFjX3RhZyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHRhZyAkYWNfdGFnIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiAgIDpbRkhdLSkgYWNfdGFnPS06LTs7Cis+ICAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKz4gICBlc2FjCis+ICAgYWNfc2F2ZV9JRlM9JElGUworPiAgIElGUz06Cis+ICAgc2V0IHggJGFjX3RhZworPiAgIElGUz0kYWNfc2F2ZV9JRlMKKz4gICBzaGlmdAorPiAgIGFjX2ZpbGU9JDEKKz4gICBzaGlmdAorPiAKKz4gICBjYXNlICRhY19tb2RlIGluCis+ICAgOkwpIGFjX3NvdXJjZT0kMTs7Cis+ICAgOltGSF0pCis+ICAgICBhY19maWxlX2lucHV0cz0KKz4gICAgIGZvciBhY19mCis+ICAgICBkbworPiAgICAgICBjYXNlICRhY19mIGluCis+ICAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKKz4gICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKz4gCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKz4gCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorPiAJIHRlc3QgLWYgIiRhY19mIiB8fAorPiAJICAgY2FzZSAkYWNfZiBpbgorPiAJICAgW1xcLyRdKikgZmFsc2U7OworPiAJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworPiAJICAgZXNhYyB8fAorPiAJICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiAgICAgICBlc2FjCis+ICAgICAgIGNhc2UgJGFjX2YgaW4gKlwnKikgYWNfZj1gJGFzX2VjaG8gIiRhY19mIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7IGVzYWMKKz4gICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAnJGFjX2YnIgorPiAgICAgZG9uZQorPiAKKz4gICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Cis+ICAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6Cis+ICAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworPiAgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorPiAJICAkYXNfZWNobyAiJCoiIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZycKKz4gCWAnIGJ5IGNvbmZpZ3VyZS4nCis+ICAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCis+ICAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKz4gICAgIGZpCis+ICAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgorPiAgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCis+ICAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorPiAgICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8Cis+ICAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKz4gICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworPiAgICAgZXNhYworPiAKKz4gICAgIGNhc2UgJGFjX3RhZyBpbgorPiAgICAgKjotOiogfCAqOi0pIGNhdCA+IiR0bXAvc3RkaW4iIFwKKz4gICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Cis+ICAgICBlc2FjCis+ICAgICA7OworPiAgIGVzYWMKKz4gCis+ICAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8Cis+ICRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCis+IAkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKz4gCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorPiAkYXNfZWNobyBYIiRhY19maWxlIiB8Cis+ICAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXC9cKVteL10uKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cL1wpJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cKS4qL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgcy8uKi8uLzsgcSdgCis+ICAgeyBhc19kaXI9IiRhY19kaXIiCis+ICAgY2FzZSAkYXNfZGlyIGluICMoCis+ICAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworPiAgIGVzYWMKKz4gICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7Cis+ICAgICBhc19kaXJzPQorPiAgICAgd2hpbGUgOjsgZG8KKz4gICAgICAgY2FzZSAkYXNfZGlyIGluICMoCis+ICAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorPiAgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworPiAgICAgICBlc2FjCis+ICAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCis+ICAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Cis+ICRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKz4gCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCis+IAkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Cis+ICRhc19lY2hvIFgiJGFzX2RpciIgfAorPiAgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgL15YXChcL1wvXClbXi9dLioveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXC9cKSQveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXCkuKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIHMvLiovLi87IHEnYAorPiAgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworPiAgICAgZG9uZQorPiAgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorPiAgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Cis+ICAgYWNfYnVpbGRkaXI9LgorPiAKKz4gY2FzZSAiJGFjX2RpciIgaW4KKz4gLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Cis+ICopCis+ICAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKz4gICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCis+ICAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCis+ICAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorPiAgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKz4gICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKz4gICBlc2FjIDs7Cis+IGVzYWMKKz4gYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCis+IGFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKz4gIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKz4gYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Cis+IAorPiBjYXNlICRzcmNkaXIgaW4KKz4gICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCis+ICAgICBhY19zcmNkaXI9LgorPiAgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorPiAgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworPiAgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKz4gICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Cis+ICAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKz4gICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKz4gICAqKSAjIFJlbGF0aXZlIG5hbWUuCis+ICAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKz4gICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCis+ICAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKKz4gZXNhYworPiBhY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Cis+IAorPiAKKz4gICBjYXNlICRhY19tb2RlIGluCis+ICAgOkYpCis+ICAgIworPiAgICMgQ09ORklHX0ZJTEUKKz4gICAjCis+IAorPiAgIGNhc2UgJElOU1RBTEwgaW4KKz4gICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7Cis+ICAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Cis+ICAgZXNhYworPiBfQUNFT0YKKz4gCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKz4gIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorPiAjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KKz4gYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Cis+IAorPiBhY19zZWRfZGF0YXJvb3Q9JworPiAvZGF0YXJvb3RkaXIvIHsKKz4gICBwCis+ICAgcQorPiB9Cis+IC9AZGF0YWRpckAvcAorPiAvQGRvY2RpckAvcAorPiAvQGluZm9kaXJAL3AKKz4gL0Bsb2NhbGVkaXJAL3AKKz4gL0BtYW5kaXJAL3AKKz4gJworPiBjYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCis+ICpkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKz4gKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KKz4gX0FDRU9GCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworPiAgIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKKz4gICBzJkBkb2NkaXJAJiRkb2NkaXImZworPiAgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKz4gICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZworPiAgIHMmQG1hbmRpckAmJG1hbmRpciZnCis+ICAgICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworPiBlc2FjCis+IF9BQ0VPRgorPiAKKz4gIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorPiAjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKz4gIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPworPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKz4gYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKz4gJGV4dHJhc3ViCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IDp0Cis+IC9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKKz4gc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorPiBzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKKz4gcyZAdG9wX2J1aWxkX3ByZWZpeEAmJGFjX3RvcF9idWlsZF9wcmVmaXgmO3QgdAorPiBzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorPiBzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Cis+IHMmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKKz4gcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Cis+IHMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorPiBzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorPiBzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Cis+IHMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKKz4gJGFjX2RhdGFyb290ZGlyX2hhY2sKKz4gIgorPiBldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkdG1wL3N1YnMuYXdrIiA+JHRtcC9vdXQgXAorPiAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAKKz4gdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKKz4gICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorPiAgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnICIkdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKKz4gd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJworPiB3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjI7fQorPiAKKz4gICBybSAtZiAiJHRtcC9zdGRpbiIKKz4gICBjYXNlICRhY19maWxlIGluCis+ICAgLSkgY2F0ICIkdG1wL291dCIgJiYgcm0gLWYgIiR0bXAvb3V0Ijs7Cis+ICAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJHRtcC9vdXQiICIkYWNfZmlsZSI7OworPiAgIGVzYWMgXAorPiAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAgOzsKKz4gICA6SCkKKz4gICAjCis+ICAgIyBDT05GSUdfSEVBREVSCis+ICAgIworPiAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKz4gICAgIHsKKz4gICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCis+ICAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgorPiAgICAgfSA+IiR0bXAvY29uZmlnLmgiIFwKKz4gICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorPiAgICAgZWxzZQorPiAgICAgICBybSAtZiAiJGFjX2ZpbGUiCis+ICAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKz4gCXx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDYyNCw0NjI1YzEwNDUzLDEwNDU4Cis8ICAgICBybSAtZiAkYWNfZmlsZQorPCAgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorLS0tCis+ICAgZWxzZQorPiAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCis+ICAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCis+ICAgICAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIC0iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAtIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzQ2MjdjMTA0NjAsMTA0NjEKKzwgZmk7IGRvbmUKKy0tLQorPiAgOzsKKz4gCis0NjI5LDQ2MzBjMTA0NjMsMTA0NjUKKzwgRU9GCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorLS0tCis+ICAgZXNhYworPiAKKz4gZG9uZSAjIGZvciBhY190YWcKKzQ2MzIsNDYzM2QxMDQ2NgorPCBFT0YKKzwgY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorNDYzNSw0NjM2YzEwNDY4LDEwNDY5Cis8IGV4aXQgMAorPCBFT0YKKy0tLQorPiB7IChleGl0IDApOyBleGl0IDA7IH0KKz4gX0FDRU9GCis0NjM4LDQ2MzljMTA0NzEsMTA1MDIKKzwgcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKKzwgdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCistLS0KKz4gYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKz4gCis+IHRlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8Cis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHdyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogd3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiAKKz4gIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorPiAjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKz4gIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKz4gIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCis+ICMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCis+ICMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKz4gIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCis+ICMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCis+IGlmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorPiAgIGFjX2NzX3N1Y2Nlc3M9OgorPiAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKz4gICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorPiAgICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCis+ICAgZXhlYyA1Pi9kZXYvbnVsbAorPiAgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKz4gICBleGVjIDU+PmNvbmZpZy5sb2cKKz4gICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorPiAgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorPiAgICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorPiBmaQorPiBpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KKz4gZmkKZGlmZiAtLWdpdCBhL211bHRpL2MvcGF0Y2gvM180XzEgYi9tdWx0aS9jL3BhdGNoLzNfNF8xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmVkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9jL3BhdGNoLzNfNF8xCkBAIC0wLDAgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKK09ubHkgaW4gM18wL2ljdS9zb3VyY2U6IGJpbgorT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25mZGVmcy5oCitkaWZmIC1ydSAzXzAub3JpZy9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4gM18wL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgorLS0tIDNfMC5vcmlnL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgkyMDA4LTEwLTIwIDE0OjU3OjUyLjAwMDAwMDAwMCAtMDcwMAorKysrIDNfMC9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4JMjAwOC0xMC0yMCAxNTo1NzoyOC4wMDAwMDAwMDAgLTA3MDAKK0BAIC0xNSw2ICsxNSw4IEBACisgIyMgQ29tbWFuZHMgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlcworIEdFTl9ERVBTLmM9CSQoQ0MpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKyBHRU5fREVQUy5jYz0JJChDWFgpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKytHRU5fREVQUy5jPQllY2hvCisrR0VOX0RFUFMuY2M9CWVjaG8KKyAKKyAjIyBDb21tYW5kcyB0byBjb21waWxlCisgQ09NUElMRS5jPQkkKENDKSAkKERFRlMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtZm5vLWNvbW1vbiAtYworT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25maWcuY2FjaGUKK09ubHkgaW4gM18wLm9yaWcvaWN1L3NvdXJjZTogY29uZmlnLmxvZwpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9wYXRjaC9yZWFkbWUudHh0IGIvbXVsdGkvYy9wYXRjaC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTIzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9jL3BhdGNoL3JlYWRtZS50eHQKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vY2F0CisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworCitDb250YWlucyBJQ1U0QyBwYXRjaGVzIHRvIG1ha2Ugb2xkIHZlcnNpb25zIGJ1aWxkLgpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9zdXBlcmNvbmYuc2ggYi9tdWx0aS9jL3N1cGVyY29uZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzk0YjMwCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvYy9zdXBlcmNvbmYuc2gKQEAgLTAsMCArMSw2NiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworIyBTYW1wbGUgInN1cGVyIGNvbmZpZ3VyZSIgCisjIHRoaXMgc2NyaXB0IGlzIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyBJQ1UuCisKKyMgaW5wdXQgdmFyaWFibGVzOworIyAkSUNVX1ZFUiAgLSB0aGUgSUNVIHZlcnNpb24gaW4gdW5kZXJzY29yZSBmb3JtYXQgKDRfMl8wXzEpCisKK0lDVV9TUkM9IiQxIgorSUNVX1ZFUj0iJDIiCisKK1VfSE9TVD1gaG9zdG5hbWVgCitVX1NZUz1gdW5hbWUgfHwgZWNobyB1bmtub3duYAorI2VjaG8gJEhPU1QKKworZXhwb3J0IHJjcz1ub25lCisKK2Nhc2UgJFVfU1lTIGluCisJQUlYKQorCQkjIHRoZSBwcmVmZXJyZWQgJ0FJWCcgdHlwZSB0byB1c2UKKwkJQUlYPUFJWAorCQljYXNlICRJQ1VfVkVSIGluIAorCQk0KikKKwkJCSNBSVg9QUlYNC4zVkEKKwkJCUFJWD1BSVgKKwkJCTs7CisJCSopCisJCQlBSVg9QUlYNC4zVkEKKwkJCTs7CisJICAgICAgICAxKnwyKnwzXzAqfDNfMSopCisJCQlBSVg9QUlYNC4zeGxDCisJCQlQQVRIPS91c3IvdmFjcHAvYmluLzokUEFUSAorCQkJOzsKKwkJZXNhYworCQlyY3M9JHtBSVh9CisJCTs7CisJKikKKwkJcmNzPW5vbmUKKwkJOzsKK2VzYWMKKworCisKK2Nhc2UgJEhPU1QgaW4KKyAgICAgICAgc3lzOTgqKQorICAgICAgICAgICAgICAgIHJjcz0kQUlYCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgaHAqKQorICAgICAgICAgICAgICAgIHJjcz0nSFAtVVgvQUNDJworICAgICAgICAgICAgICAgIDs7CisgICAgICAgIG1lcmlsbCp8cmVkaGF0KnxzdW5saWdodCopCisgICAgICAgICAgICAgICAgcmNzPSdMaW51eFJlZEhhdCcKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAqKQorCQllY2hvIHNoICR7SUNVX1NSQ30vY29uZmlndXJlCisgICAgICAgICAgICAgICAgI2VjaG8gVW5rbm93biBob3N0ICRIT1NULCBlZGl0ICQwCisgICAgICAgICAgICAgICAgZXhpdCAwCisgICAgICAgICAgICAgICAgOzsKK2VzYWMKKworZWNobyBzaCAke0lDVV9TUkN9L3J1bkNvbmZpZ3VyZUlDVSAiJHtyY3N9IgorCisKKworCmRpZmYgLS1naXQgYS9tdWx0aS9jb21tb24vTWFrZWZpbGUtbXVsdGkuaW5jIGIvbXVsdGkvY29tbW9uL01ha2VmaWxlLW11bHRpLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzNjMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvY29tbW9uL01ha2VmaWxlLW11bHRpLmluYwpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IElCTSBDb3JwLiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKK0NfUk9PVD0kKE1VTFRJQ1VfUk9PVCkvYworSl9ST09UPSQoTVVMVElDVV9ST09UKS9qCitNX1RNUD0kKE1VTFRJQ1VfUk9PVCkvdG1wCitDX0lOUz0kKE1fVE1QKS9pbnMKK0NfQkxEPSQoTV9UTVApL2J1aWxkCitDX1NSQz0kKE1fVE1QKS9zcmMKKworIyBDIGRlZnMKK1NfSU5TPWluY2x1ZGUvdW5pY29kZS91dHlwZXMuaAorU19TUkNESVI9aWN1L3NvdXJjZQorU19CTEQ9JChTX1NSQ0RJUikvY29uZmlnLnN0YXR1cworU19TUkM9JChTX1NSQ0RJUikvY29uZmlndXJlCisKKy1pbmNsdWRlICQoTVVMVElDVV9ST09UKS9jb21tb24vTWFrZWZpbGUtbG9jYWwuaW5jCisKK0lDVVM9JChNVUxUSUNVX1JPT1QpL3BhY2thZ2VzCisKK1RPUD0kKHNoZWxsIHB3ZCkKKworIyBKIGRlZnMKZGlmZiAtLWdpdCBhL211bHRpL2ovTWFrZWZpbGUtai5pbmMgYi9tdWx0aS9qL01ha2VmaWxlLWouaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDdhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9qL01ha2VmaWxlLWouaW5jCkBAIC0wLDAgKzEsOCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitpbmNsdWRlICQoTVVMVElDVV9ST09UKS9NYWtlZmlsZS1tdWx0aS5pbmMKK0lDVVM9JChNVUxUSUNVX1JPT1QpL2ljdXMKK0pfR09PRDo9JChzaGVsbCBbIC1kICQoSUNVUykgXSAmJiAoY2QgJChJQ1VTKSA7ICBscyAtZCBpY3U0ai0qLmphciB8IGN1dCAtZC0gLWYyIHwgY3V0IC1kLiAtZjEpKQorI0pfR09PRD0kKElDVTRKVkVSUzolPSQoSUNVUykvaWN1NGotJS5qYXIpCisKKwpkaWZmIC0tZ2l0IGEvbXVsdGkvai9vbGQtaWN1NGoudHh0IGIvbXVsdGkvai9vbGQtaWN1NGoudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjdlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9qL29sZC1pY3U0ai50eHQKQEAgLTAsMCArMSwyIEBACisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyBhIGxpc3Qgb2YgSUNVNENzIHRvbyBvbGQgdG8gYnVpbGQgd2l0aCB0aGUgY3VycmVudCBwYXRjaHNldC4KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovY2hlbGxvL01ha2VmaWxlIGIvbXVsdGkvcHJvai9jaGVsbG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNTRiMQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovY2hlbGxvL01ha2VmaWxlCkBAIC0wLDAgKzEsNTEgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgTWFrZWZpbGUgZm9yIG11bHRpY3Uvc2FtcGxlL2NoZWxsbworIyBDL0MrKyBoZWxsbworCisjIyBOYW1lIG9mIHRoZSBhcHAKK1RBUkdFVD1jaGVsbG8KKworIyMgU291cmNlcyBsaXN0IChDIGFuZCBDKysganVzdCB0byBiZSBkaWZmaWN1bHQpCitDX1NPVVJDRVM9ZGF0ZS5jCitDWFhfU09VUkNFUz11cHJpbnQuY3BwCitTUkNTPSQoQ19TT1VSQ0VTKSAkKENYWF9TT1VSQ0VTKQorSEVBREVSUz11cHJpbnQuaAorCithbGw6CisJQGVjaG8gVG8gYnVpbGQgYW5kIGxpc3QgIiciICQoT1VURklMRVMpICInIiAgaW4gIiciICQoQ19HT09EKSAiJyIgdXNlICIkKE1BS0UpIGNoZWNrIgorCisjIyBTZXR1cCBtdWx0aWN1CitNVUxUSUNVX1JPT1Q9Li4vLi4vCitpbmNsdWRlICQoTVVMVElDVV9ST09UKS9jL01ha2VmaWxlLWMuaW5jCisKK09VVD1vdXQKKworJChPVVQpOgorCW1rZGlyICQoT1VUKQorCisjIyBUaGUgb3V0cHV0IGZpbGVzLiAgV2lsbCByZXN1bHQgaW46ICAgb3V0LzNfOC50eHQgIG91dC80XzAudHh0ICBldGMuCitPVVRGSUxFUz0kKENfR09PRDolPSQoT1VUKS8lLnR4dCkKKworLlBSRUNJT1VTOiAkKENfQ0xFQU5fVEFSR0VUKQorCisjIyBHZW5lcmF0ZSBhIGZpbGUKKyQoT1VUKS8lLnR4dDogJChPVVQpICQoQ19JTlMpLyUvYmluLyQoVEFSR0VUKQorCSQoc2hlbGwgJChDX0lOUykvJCovYmluL2ljdS1jb25maWcgLS1pbnZva2UpICQoQ19JTlMpLyQqL2Jpbi8kKFRBUkdFVCkgID4gJEAKKworIyMgY2xlYW4KK2NsZWFuOgorCS1ybSAtZiAkKENfQ0xFQU5fVEFSR0VUKQorCS1ybSAtZiAuLyQoT1VUKS8qCisJLXJtZGlyICQoT1VUKQorCisjIyBKdXN0IGdlbmVyYXRlCitvdXRmaWxlczogJChPVVRGSUxFUykKKworIyMgVGVzdDogZ2VuZXJhdGUgb3V0IGZpbGVzLCBhbmQgcHJpbnQgdGhlbS4KK2NoZWNrOiAkKE9VVEZJTEVTKQorCUBmb3IgZmlsZSBpbiAkKE9VVEZJTEVTKTsgXAorCWRvIFwKKwkJZWNobzsgXAorCQlzZWQgLWUgInMlXiUkJGZpbGU6ICVnIiA8ICQkZmlsZTsgXAorCWRvbmUKKwpkaWZmIC0tZ2l0IGEvbXVsdGkvcHJvai9jaGVsbG8vZGF0ZS5jIGIvbXVsdGkvcHJvai9jaGVsbG8vZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjRhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL2NoZWxsby9kYXRlLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRmlsZSBkYXRlLmMKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwNi8xMS85OSAgICBzdGVwaGVuICAgICBDcmVhdGlvbi4KKyogICAwNi8xNi85OSAgICBzdGVwaGVuICAgICBNb2RpZmllZCB0byB1c2UgdXByaW50LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VkYXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjYWwuaCIKKworI2luY2x1ZGUgInVwcmludC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisjaWYgVUNPTkZJR19OT19GT1JNQVRUSU5HCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgcHJpbnRmKCIlczogU29ycnksIFVDT05GSUdfTk9fRk9STUFUVElORyB3YXMgdHVybmVkIG9uIChzZWUgdWNvbmZpZy5oKS4gTm8gZm9ybWF0dGluZyBjYW4gYmUgZG9uZS4gXG4iLCBhcmd2WzBdKTsKKyAgcmV0dXJuIDA7Cit9CisjZWxzZQorCisKKy8qIFByb3RvcyAqLworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCB2ZXJzaW9uKHZvaWQpOworc3RhdGljIHZvaWQgZGF0ZShjb25zdCBVQ2hhciAqdHosIFVEYXRlRm9ybWF0U3R5bGUgc3R5bGUsIGNoYXIgKmZvcm1hdCwgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworCisvKiBUaGUgdmVyc2lvbiBvZiBkYXRlICovCisjZGVmaW5lIERBVEVfVkVSU0lPTiAiMS4wIgorCisvKiAiR01UIiAqLworc3RhdGljIGNvbnN0IFVDaGFyIEdNVF9JRCBbXSA9IHsgMHgwMDQ3LCAweDAwNGQsIDB4MDA1NCwgMHgwMDAwIH07CisKKworaW50CittYWluKGludCBhcmdjLAorICAgICBjaGFyICoqYXJndikKK3sKKyAgaW50IHByaW50VXNhZ2UgPSAwOworICBpbnQgcHJpbnRWZXJzaW9uID0gMDsKKyAgaW50IG9wdGluZCA9IDE7CisgIGNoYXIgKmFyZzsKKyAgY29uc3QgVUNoYXIgKnR6ID0gMDsKKyAgVURhdGVGb3JtYXRTdHlsZSBzdHlsZSA9IFVEQVRfREVGQVVMVDsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIGNoYXIgKmZvcm1hdCA9IE5VTEw7CisKKworICAvKiBwYXJzZSB0aGUgb3B0aW9ucyAqLworICBmb3Iob3B0aW5kID0gMTsgb3B0aW5kIDwgYXJnYzsgKytvcHRpbmQpIHsKKyAgICBhcmcgPSBhcmd2W29wdGluZF07CisgICAgCisgICAgLyogdmVyc2lvbiBpbmZvICovCisgICAgaWYoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkgeworICAgICAgcHJpbnRWZXJzaW9uID0gMTsKKyAgICB9CisgICAgLyogdXNhZ2UgaW5mbyAqLworICAgIGVsc2UgaWYoc3RyY21wKGFyZywgIi1oIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLS1oZWxwIikgPT0gMCkgeworICAgICAgcHJpbnRVc2FnZSA9IDE7CisgICAgfQorICAgIC8qIGRpc3BsYXkgZGF0ZSBpbiBnbXQgKi8KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItdSIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tZ210IikgPT0gMCkgeworICAgICAgdHogPSBHTVRfSUQ7CisgICAgfQorICAgIC8qIGRpc3BsYXkgZGF0ZSBpbiBnbXQgKi8KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItZiIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tZnVsbCIpID09IDApIHsKKyAgICAgIHN0eWxlID0gVURBVF9GVUxMOworICAgIH0KKyAgICAvKiBkaXNwbGF5IGRhdGUgaW4gbG9uZyBmb3JtYXQgKi8KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItbCIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tbG9uZyIpID09IDApIHsKKyAgICAgIHN0eWxlID0gVURBVF9MT05HOworICAgIH0KKyAgICAvKiBkaXNwbGF5IGRhdGUgaW4gbWVkaXVtIGZvcm1hdCAqLworICAgIGVsc2UgaWYoc3RyY21wKGFyZywgIi1tIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLS1tZWRpdW0iKSA9PSAwKSB7CisgICAgICBzdHlsZSA9IFVEQVRfTUVESVVNOworICAgIH0KKyAgICAvKiBkaXNwbGF5IGRhdGUgaW4gc2hvcnQgZm9ybWF0ICovCisgICAgZWxzZSBpZihzdHJjbXAoYXJnLCAiLXMiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItLXNob3J0IikgPT0gMCkgeworICAgICAgc3R5bGUgPSBVREFUX1NIT1JUOworICAgIH0KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItRiIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tZm9ybWF0IikgPT0gMCkgeworICAgICAgaWYgKCBvcHRpbmQgKyAxIDwgYXJnYyApIHsgCisgICAgICAgICBvcHRpbmQrKzsKKyAgICAgICAgIGZvcm1hdCA9IGFyZ3Zbb3B0aW5kXTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogUE9TSVguMSBzYXlzIGFsbCBhcmd1bWVudHMgYWZ0ZXIgLS0gYXJlIG5vdCBvcHRpb25zICovCisgICAgZWxzZSBpZihzdHJjbXAoYXJnLCAiLS0iKSA9PSAwKSB7CisgICAgICAvKiBza2lwIHRoZSAtLSAqLworICAgICAgKytvcHRpbmQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogdW5yZWNvZ25pemVkIG9wdGlvbiAqLworICAgIGVsc2UgaWYoc3RybmNtcChhcmcsICItIiwgc3RybGVuKCItIikpID09IDApIHsKKyAgICAgIHByaW50ZigiaWN1ZGF0ZTogaW52YWxpZCBvcHRpb24gLS0gJXNcbiIsIGFyZysxKTsKKyAgICAgIHByaW50VXNhZ2UgPSAxOworICAgIH0KKyAgICAvKiBkb25lIHdpdGggb3B0aW9ucywgZGlzcGxheSBkYXRlICovCisgICAgZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBwcmludCB1c2FnZSBpbmZvICovCisgIGlmKHByaW50VXNhZ2UpIHsKKyAgICB1c2FnZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogcHJpbnQgdmVyc2lvbiBpbmZvICovCisgIGlmKHByaW50VmVyc2lvbikgeworICAgIHZlcnNpb24oKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIHByaW50IHRoZSBkYXRlICovCisgIGRhdGUodHosIHN0eWxlLCBmb3JtYXQsICZzdGF0dXMpOworCisgIHVfY2xlYW51cCgpOworICByZXR1cm4gKFVfRkFJTFVSRShzdGF0dXMpID8gMSA6IDApOworfQorCisvKiBVc2FnZSBpbmZvcm1hdGlvbiAqLworc3RhdGljIHZvaWQKK3VzYWdlKCkKK3sgIAorICBwdXRzKCJVc2FnZTogaWN1ZGF0ZSBbT1BUSU9OU10iKTsKKyAgcHV0cygiT3B0aW9uczoiKTsKKyAgcHV0cygiICAtaCwgLS1oZWxwICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuIik7CisgIHB1dHMoIiAgLXYsIC0tdmVyc2lvbiAgICAgUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGRhdGUgYW5kIGV4aXQuIik7CisgIHB1dHMoIiAgLXUsIC0tZ210ICAgICAgICAgRGlzcGxheSB0aGUgZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lLiIpOworICBwdXRzKCIgIC1mLCAtLWZ1bGwgICAgICAgIFVzZSBmdWxsIGRpc3BsYXkgZm9ybWF0LiIpOworICBwdXRzKCIgIC1sLCAtLWxvbmcgICAgICAgIFVzZSBsb25nIGRpc3BsYXkgZm9ybWF0LiIpOworICBwdXRzKCIgIC1tLCAtLW1lZGl1bSAgICAgIFVzZSBtZWRpdW0gZGlzcGxheSBmb3JtYXQuIik7CisgIHB1dHMoIiAgLXMsIC0tc2hvcnQgICAgICAgVXNlIHNob3J0IGRpc3BsYXkgZm9ybWF0LiIpOworfQorCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCitzdGF0aWMgdm9pZAordmVyc2lvbigpCit7CisgIHByaW50ZigiaWN1ZGF0ZSB2ZXJzaW9uICVzIChJQ1UgdmVyc2lvbiAlcyksIGNyZWF0ZWQgYnkgU3RlcGhlbiBGLiBCb290aC5cbiIsIAorCSBEQVRFX1ZFUlNJT04sIFVfSUNVX1ZFUlNJT04pOworICBwdXRzKFVfQ09QWVJJR0hUX1NUUklORyk7Cit9CisKKy8qIEZvcm1hdCB0aGUgZGF0ZSAqLworc3RhdGljIHZvaWQKK2RhdGUoY29uc3QgVUNoYXIgKnR6LAorICAgICBVRGF0ZUZvcm1hdFN0eWxlIHN0eWxlLAorICAgICBjaGFyICpmb3JtYXQsCisgICAgIFVFcnJvckNvZGUgKnN0YXR1cykKK3sKKyAgVUNoYXIgKnMgPSAwOworICBpbnQzMl90IGxlbiA9IDA7CisgIFVEYXRlRm9ybWF0ICpmbXQ7CisgIFVDaGFyIHVGb3JtYXRbMTAwXTsKKworICBmbXQgPSB1ZGF0X29wZW4oc3R5bGUsIHN0eWxlLCAwLCB0eiwgLTEsTlVMTCwwLCBzdGF0dXMpOworICBpZiAoIGZvcm1hdCAhPSBOVUxMICkgeworICAgICB1X2NoYXJzVG9VQ2hhcnMoZm9ybWF0LHVGb3JtYXQsc3RybGVuKGZvcm1hdCkpLAorICAgICB1ZGF0X2FwcGx5UGF0dGVybihmbXQsRkFMU0UsdUZvcm1hdCxzdHJsZW4oZm9ybWF0KSk7CisgIH0KKyAgbGVuID0gdWRhdF9mb3JtYXQoZm10LCB1Y2FsX2dldE5vdygpLCAwLCBsZW4sIDAsIHN0YXR1cyk7CisgIGlmKCpzdGF0dXMgPT0gVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpIHsKKyAgICAqc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIHMgPSAoVUNoYXIqKSBtYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChsZW4rMSkpOworICAgIGlmKHMgPT0gMCkgZ290byBmaW5pc2g7CisgICAgdWRhdF9mb3JtYXQoZm10LCB1Y2FsX2dldE5vdygpLCBzLCBsZW4gKyAxLCAwLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgZ290byBmaW5pc2g7CisgIH0KKworICAvKiBwcmludCB0aGUgZGF0ZSBzdHJpbmcgKi8KKyAgdXByaW50KHMsIHN0ZG91dCwgc3RhdHVzKTsKKworICAvKiBwcmludCBhIHRyYWlsaW5nIG5ld2xpbmUgKi8KKyAgcHJpbnRmKCIgQCBJQ1UgIiBVX0lDVV9WRVJTSU9OICJcbiIpOworCisgZmluaXNoOgorICB1ZGF0X2Nsb3NlKGZtdCk7CisgIGZyZWUocyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovY2hlbGxvL3VwcmludC5jcHAgYi9tdWx0aS9wcm9qL2NoZWxsby91cHJpbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2RlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL2NoZWxsby91cHJpbnQuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisqIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIHVwcmludC5jcHAKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqCURhdGUJCU5hbWUJCURlc2NyaXB0aW9uCisqCTA2LzE0Lzk5CXN0ZXBoZW4gCUNyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgInVwcmludC5oIgorCisjaW5jbHVkZSAidW5pY29kZS91Y252LmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKKyNkZWZpbmUgQlVGX1NJWkUgMTI4CisKKy8qIFByaW50IGEgdXN0cmluZyB0byB0aGUgc3BlY2lmaWVkIEZJTEUqIGluIHRoZSBkZWZhdWx0IGNvZGVwYWdlICovCitVX0NBUEkgdm9pZAordXByaW50KGNvbnN0IFVDaGFyICpzLAorCSAgIEZJTEUgKmYsCisJICAgVUVycm9yQ29kZSAqc3RhdHVzKQoreworICAvKiBjb252ZXJ0ZXIgKi8KKyAgVUNvbnZlcnRlciAqY29udmVydGVyOworICBjaGFyIGJ1ZiBbQlVGX1NJWkVdOworICBpbnQzMl90IHNvdXJjZUxlbjsKKyAgY29uc3QgVUNoYXIgKm15U291cmNlOworICBjb25zdCBVQ2hhciAqbXlTb3VyY2VFbmQ7CisgIGNoYXIgKm15VGFyZ2V0OworICBpbnQzMl90IGFycmF5U2l6ZTsKKworICBpZihzID09IDApIHJldHVybjsKKworICAvKiBzZXQgdXAgdGhlIGNvbnZlcnNpb24gcGFyYW1ldGVycyAqLworICBzb3VyY2VMZW4gICAgPSB1X3N0cmxlbihzKTsKKyAgbXlTb3VyY2UJICAgPSBzOworICBteVNvdXJjZUVuZCAgPSBteVNvdXJjZSArIHNvdXJjZUxlbjsKKyAgbXlUYXJnZXQJICAgPSBidWY7CisgIGFycmF5U2l6ZSAgICA9IEJVRl9TSVpFOworCisgIC8qIG9wZW4gYSBkZWZhdWx0IGNvbnZlcnRlciAqLworICBjb252ZXJ0ZXIgPSB1Y252X29wZW4oMCwgc3RhdHVzKTsKKyAgCisgIC8qIGlmIHdlIGZhaWxlZCwgY2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSBnb3RvIGZpbmlzaDsKKyAgCisgIC8qIHBlcmZvcm0gdGhlIGNvbnZlcnNpb24gKi8KKyAgZG8geworCS8qIHJlc2V0IHRoZSBlcnJvciBjb2RlICovCisJKnN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworCS8qIHBlcmZvcm0gdGhlIGNvbnZlcnNpb24gKi8KKwl1Y252X2Zyb21Vbmljb2RlKGNvbnZlcnRlciwgJm15VGFyZ2V0LAlteVRhcmdldCArIGFycmF5U2l6ZSwKKwkJCSAmbXlTb3VyY2UsIG15U291cmNlRW5kLCBOVUxMLAorCQkJIFRSVUUsIHN0YXR1cyk7CisKKwkvKiBXcml0ZSB0aGUgY29udmVydGVkIGRhdGEgdG8gdGhlIEZJTEUqICovCisJZndyaXRlKGJ1Ziwgc2l6ZW9mKGNoYXIpLCBteVRhcmdldCAtIGJ1ZiwgZik7CisKKwkvKiB1cGRhdGUgdGhlIGNvbnZlcnNpb24gcGFyYW1ldGVycyovCisJbXlUYXJnZXQJID0gYnVmOworCWFycmF5U2l6ZQkgPSBCVUZfU0laRTsKKyAgfQorICB3aGlsZSgqc3RhdHVzID09IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsgCisKKyBmaW5pc2g6CisgIAorICAvKiBjbG9zZSB0aGUgY29udmVydGVyICovCisgIHVjbnZfY2xvc2UoY29udmVydGVyKTsKK30KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovY2hlbGxvL3VwcmludC5oIGIvbXVsdGkvcHJvai9jaGVsbG8vdXByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1M2U2NQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovY2hlbGxvL3VwcmludC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisqIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIHVwcmludC5oCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDYvMTQvOTkgICAgc3RlcGhlbiAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIFVQUklOVF9ICisjZGVmaW5lIFVQUklOVF9IIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorCisvKiBQcmludCBhIHVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBGSUxFKiBpbiB0aGUgZGVmYXVsdCBjb2RlcGFnZSAqLworVV9DRlVOQyB2b2lkIHVwcmludChjb25zdCBVQ2hhciAqcywgRklMRSAqZiwgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworI2VuZGlmIC8qICEgVVBSSU5UX0ggKi8KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvTWFrZWZpbGUgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2E0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMzMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMC0yMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworYWxsOiBnbHVyZW5zIGlpIHBsdWdzIHRlc3Rwcm9nCisKKyMgZXh0cmEgZmlsZXMgdGhhdCBuZWVkIGdlbmVyYXRpb24uCitQTFVHX0VYVFJBX0RFUFM9CitVTkFNRT0kKHNoZWxsIHVuYW1lKQorCitpZmVxICgkKFVOQU1FKSxMaW51eCkKK0xJQlBBVEhfVkFSPUxEX0xJQlJBUllfUEFUSAorUExVR19FWFRSQV9MREZMQUdTPS1mUElDCitQQkxEX0VYVFJBX0ZMQUdTPS1mUElDCitHTFVFX0VYVFJBX0NGTEFHUz0gLWZQSUMKK1BMVUdMSUJfU089c28KK2Vsc2UKK2lmZXEgKCQoVU5BTUUpLERhcndpbikKK0xJQlBBVEhfVkFSPURZTERfTElCUkFSWV9QQVRICitQTFVHX0VYVFJBX0xERkxBR1M9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCAkKEdMVUVfRVhQT1JUKSAtZHluYW1pY2xpYiAtZHluYW1pYworUExVR19FWFRSQV9ERVBTKz0kKEdMVUVfRVhQT1JUKQorUExVR0xJQl9TTz1keWxpYgorZWxzZQorJCh3YXJuaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopCiskKHdhcm5pbmcgdGhpcyBzY3JpcHQgbWF5IG5vdCBrbm93IGhvdyB0byBoYW5kbGUgeW91ciAkKFVOQU1FKSBzeXN0ZW0pCitlbmRpZgorZW5kaWYKKworc3JjZGlyPSQoc2hlbGwgcHdkKQorCitQUk9WSURFUj1wcm92aWRlcgorTElCUFJPVklERVI9bGliJChQUk9WSURFUikuYQorCisjbGliczogJChJQ1VfVEFSQkFMTFNfVkVSUzolPSQoT1VUKS8lL2xpYi8kKExJQlBST1ZJREVSKSkKK1BMVUdMSUI9JChzaGVsbCBlY2hvICQoUFJPVklERVJfVEFSR0VUKSAgfCB0ciAnLicgJ18nICkKK1BMVUdMSUJfTUFKPSQoc2hlbGwgZWNobyAkKFBST1ZJREVSX1RBUkdFVCkgfCBjdXQgLWQuIC1mMS0yIHwgdHIgLWQgJy4nICkKK1BMVUdMSUJfSU5TVD0kKENfSU5TKS9yJChQTFVHTElCKQorUExVR0xJQl9JQ1VfQ09ORklHPSQoUExVR0xJQl9JTlNUKS9iaW4vaWN1LWNvbmZpZworI1BMVUdMSUJfU089JChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1zbyAyPi9kZXYvbnVsbCApCitQTFVHTElCX05BTUU9bGliaWN1cHJvdi4kKFBMVUdMSUJfTUFKKS4kKFBMVUdMSUJfU08pCisjUExVR0xJQl9NQUo9JChlY2hvICQoUExVR0xJQikgfCBjdXQgLWRfIC1mLTEgfCB0ciAtZCBfICkKKyNHTE9VVF9JQ1U9JChJQ1VfVEFSQkFMTFNfVkVSUzolPSQoR0xPVVQpLyUvJChPSykpCitQTFVHTElCX0FWQUlMQUJMRT0kKHNoZWxsIGVjaG8gJChQUk9WSURFUl9BVkFJTEFCTEUpIHwgdHIgJy4nICdfJykKK1BMVUdMSUJfQVZBSUxBQkxFX0RBVEE9JChQTFVHTElCX0FWQUlMQUJMRTolPSQoQlVJTEQpLyUvZGF0YS9vdXQvdG1wLyoubykKK1BMVUdMSUJfQVZBSUxBQkxFX1NUQVRJQ1M9JChQTFVHTElCX0FWQUlMQUJMRTolPSQoQlVJTEQpLyUvW2NpXSovKi5hbykKK1BMVUdMSUJfT1VUTElCUz0kKFBMVUdMSUI6JT0kKE9VVCkvJS9saWIvJChQTFVHTElCX05BTUUpKQorCisKKworIyMgY29uZmlndXJhdGlvbgorIyBBYnNvbHV0ZSBwYXRoIHRvIHRoaXMgZGlyLiAKKyMgZGlyIGhvbGRpbmcgSUNVcyB0byBiZSBidWlsdAorTVVMVElDVV9ST09UPS4uLy4uCitpbmNsdWRlICQoTVVMVElDVV9ST09UKS9jL01ha2VmaWxlLWMuaW5jCitJQ1VfQ09ORklHPWljdS1jb25maWctbm9zYW5pdHkKK0lDVV9DT05GSUdfT1JJRz1pY3UtY29uZmlnCisKKyMgc3ViZGlycy4uLgorIyBwcmVmaXggdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBub24tcHJvdmlkZXIgYnVpbGRzCitQX1BSRUZJWD1wCitCVUlMRD0kKE1fVE1QKS8kKFBfUFJFRklYKWJsZAorSU5TVD0kKE1fVE1QKS8kKFBfUFJFRklYKWlucworU1JDPSQoTV9UTVApLyQoUF9QUkVGSVgpc3JjCitPVVQ9JChUT1ApL291dAorU09VUkNFPSQoU19TUkNESVIpCitHTFVFPWdsdWUKK0dMVUVfRVhQT1JUPSQoR0xVRSkvZXhwb3J0LnR4dAorR0xPVVQ9JChNX1RNUCkvJChQX1BSRUZJWClnbG91dAorIyBoZWFkZXIgbG9jYXRpb25zCitJTkNHTFVFPSQoVE9QKS8kKEdMVUUpL2luY2x1ZGUKKyMgcmVsYXRpdmUgcGF0aCB0byBpY3VnbHVlIHdpdGhpbiBnbG91dAorR0xVUkVOPWdsdXJlbi9pbmNsdWRlL2ljdWdsdWUKKyMgcmVsYXRpdmUgcGF0aCB0byBnbHVyZW4uaAorR0xVUkVOX0g9JChHTFVSRU4pL2dsdXJlbi5oCisjIFNwZWNpYWwgJ2NvbmZpZ3VyZScgY2FsbGVyCitTVVBFUkNPTkY9JChUT1ApLyQoTVVMVElDVV9ST09UKS9jL3N1cGVyY29uZi5zaAorIyBvcHRpb25zIHRvIGNvbXBpbGF0aW9uIChzdWNoIGFzLCBkZWJ1ZykKK1hPUFRTPSQoRVhUUkFfQ09NUElMRV9PUFRTKQorT0s9b2sKK01PUFRTPQorCisjIGRpcmVjdG9yaWVzIHRoYXQgbmVlZCB0byBiZSBidWlsdAorQUxMRElSUz0kKElOU1QpICQoQlVJTEQpICQoU1JDKSAkKEdMT1VUKSAkKE9VVCkKKyMgVGhlICdvaycgZmxhZyBmaWxlIGZvciBpbnN0YWxsYXRpb25zCitJTlNUX0lDVT0kKFBMVUdMSUJfQVZBSUxBQkxFOiU9JChJTlNUKS8lLyQoT0spKQorQlVJTERfSUNVPSQoUExVR0xJQl9BVkFJTEFCTEU6JT0kKEJVSUxEKS8lLyQoT0spKQorIyB0aGlzIGhhcyB0byBkbyB3aXRoIHRoZSBwbHVnbGliCitHTE9VVF9JQ1U9JChQTFVHTElCOiU9JChHTE9VVCkvJS9vYmotJChPSykpCisjU1JDX0lDVT0kKElDVV9UQVJCQUxMU19WRVJTOiU9JChTUkMpLyUvJChPSykpCisjIGdsdXJlbi5oIGZpbGVzIGZvciBlYWNoIHZlcnNpb24KK0dMVVJFTl9JQ1U9JChQTFVHTElCX0FWQUlMQUJMRTolPSQoQlVJTEQpLyUvJChHTFVSRU5fSCkpCisjPworQ09ORklHVVJFX0NNRD0KKyMgT3B0aW9ucyBwYXNzZWQgdG8gY29uZmlndXJlCitDT05GSUdVUkVfT1BUUz0tLWVuYWJsZS1zdGF0aWMgLS1kaXNhYmxlLXNoYXJlZCAtLXdpdGgtZGF0YS1wYWNrYWdpbmc9c3RhdGljIC0tZGlzYWJsZS1leHRyYXMgLS1kaXNhYmxlLWljdWlvIC0tZGlzYWJsZS1sYXlvdXQgLS1kaXNhYmxlLXRlc3RzIC0tZGlzYWJsZS1zYW1wbGVzICAkKEVYVFJBX0NPTkZJR1VSRV9PUFRTKSAKKyMgYWRkaXRpb25hbCBvcHRpb25zIHBhc3NlZCB0byBtYWtlCitNQUtFX1hUUkFfT1BUUz0iUEtHREFUQV9NT0RFPXN0YXRpYyIKKyMgYWRkaXRpb25hbCBvcHRpb25zIHBhc3NlZCB0byBtYWtlIGluc3RhbGwKK01BS0VfSU5TVEFMTF9YVFJBX09QVFM9JChNQUtFX1hUUkFfT1BUUykKKworIyBNdW5nZWQgc291cmNlIG5hbWVzOiBsaXN0IG9mIEMrKywgTyBldGMgZmlsZXMgZm9yIEZyb250ZW5kCitQQVJUU1VGRj1fZmUKK0dMX0ZFX0NYWD0kKHNoZWxsIGNkICQoR0xVRSkgOyBscyAqJChQQVJUU1VGRikuY3BwKQorR0xfRkVfRklMRVM9JChHTF9GRV9DWFg6JS5jcHA9JChHTFVFKS8lLmNwcCkKK0dMX0ZFX089JChHTF9GRV9DUFA6JS5jcHA9JS5vKQorR0xfUEFSVFM9JChHTF9GRV9DWFg6JSQoUEFSVFNVRkYpLmNwcD0lKQorIyBDIGZsYWdzIHVzZWQgaW4gR2x1ZSBjb21waWxhdGlvbgorR0xVRV9DRkxBR1M9LUkkKElOQ0dMVUUpICQoR0xVRV9FWFRSQV9DRkxBR1MpCisKKyMgaWN1LWNvbmZpZyBzd2l0Y2hlcyBmb3IgY29tcGlsaW5nOiBDIGFuZCBDKysKK0lDVV9DT05GSUdfQ09NTU9OPS0tY3BwZmxhZ3MKKyMgaWN1LWNvbmZpZyBzd2l0Y2hlcyBmb3IgQworSUNVX0NPTkZJR19DQz0tLWNjICQoSUNVX0NPTkZJR19DT01NT04pIC0tY2ZsYWdzIAorIyBpY3UtY29uZmlnIHN3aXRjaGVzIGZvciBDKysKK0lDVV9DT05GSUdfQ1hYPS0tY3h4ICQoSUNVX0NPTkZJR19DT01NT04pIC0tY3h4ZmxhZ3MKKworaW5jbHVkZSBNYWtlZmlsZS5sb2NhbAorCisKKyMjIEBidWlsZCBBbGwgaW5zdGFsbGVkIElDVXMKK2lpOiAkKEdMT1VUX0lDVSkKKworIyBEb24ndCBkZWxldGUgdGhlc2UgZmlsZXMKKy5QUkVDSU9VUzogKElOU1RfSUNVKSAkKEJVSUxEX0lDVSkgJChTUkNfSUNVKSAkKElDVV9UQVJCQUxMU19WRVJTOiU9JChCVUlMRCkvJS9jb25maWcuc3RhdHVzKSAkKElDVV9UQVJCQUxMU19WRVJTOiU9JChHTE9VVCkvJS9vYmotJChPSykpICAkKElDVV9UQVJCQUxMU19WRVJTOiU9JChCVUlMRCkvJS9jb25maWcvJChJQ1VfQ09ORklHKSkgJChQTFVHTElCX0lDVV9DT05GSUcpCisKKyMgY2xlYW51cAorY2xlYW46CisJLXJtIC1yZiAkKEFMTERJUlMpCisJLSQoTUFLRSkgLUMgLi4vLi4gY2xlYW4KKworIyBjcmVhdGUgYWxsIGVtcHR5IHdvcmsgZGlycworJChBTExESVJTKToKKwktbWtkaXIgLXAgJChAKQorCisjIEJ1aWxkIHIkKFBMVUdMSUIpIGZyb20gLi4vLi4vYworJChQTFVHTElCX0lDVV9DT05GSUcpOgorCSQoTUFLRSkgLUMgLi4vLi4vYyBJQ1VWRVJTPSQoUExVR0xJQikgcmljdXMKKworIyBidWlsZCB0aGUgZ2x1ZSBvYmplY3RzIGZvciBUQVJHRVQKKyMgdXNlZCB0byBiZSAlLyogaW5zdGVhZCBvZiAkKFBMVUdMSUIpIC0gbm93LCB3aXJlIGl0IGRvd24gdG8gcGx1Z2xpYi4KKyQoR0xPVVQpLyQoUExVR0xJQikvb2JqLSQoT0spOiAkKEdMT1VUKSBnbHVyZW5zICAkKFBMVUdMSUJfSUNVX0NPTkZJRykgJChHTF9GRV9GSUxFUykKKwktbWtkaXIgJChHTE9VVCkvJChQTFVHTElCKQorIwkkKHNoZWxsICQoQlVJTEQpLyQoUExVR0xJQikvY29uZmlnLyQoSUNVX0NPTkZJRykgJChJQ1VfQ09ORklHX0NDKSkgJChHTFVFX0NGTEFHUykgLWMgLURJQ1VHTFVFX1ZFUj0kKFBMVUdMSUIpIC1vICQoR0xPVVQpLyQoUExVR0xJQikvZ2xfYmVfY18kKFBMVUdMSUIpLm8gJChHTF9CRV9DOiUuYz0kKEdMVUUpLyUuYykKKyMJJChzaGVsbCAkKEJVSUxEKS8kKFBMVUdMSUIpL2NvbmZpZy8kKElDVV9DT05GSUcpICQoSUNVX0NPTkZJR19DWFgpKSAkKEdMVUVfQ0ZMQUdTKSAtYyAtRElDVUdMVUVfVkVSPSQoUExVR0xJQikgLW8gJChHTE9VVCkvJChQTFVHTElCKS9nbF9iZV9jeHhfJChQTFVHTElCKS5vICQoR0xfQkVfQ1hYOiUuY3BwPSQoR0xVRSkvJS5jcHApCisJLXJtIC1yZiAkKEdMT1VUKS8kKFBMVUdMSUIpL2luY2x1ZGUKKwlta2RpciAtcCAkKEdMT1VUKS8kKFBMVUdMSUIpL2luY2x1ZGUvaWN1Z2x1ZS9pbmNsdWRlCisjIGZvciBlYWNoIHZlcnNpb24uLiAgYnVpbGQgYWxsIE9USEVSIEZFIGZpbGVzCisjIFRPRE86IGNoZWNrIGlzIHVubmVjZXNzYXJ5LCBub3QgcGVybWl0dGVkLgorIyBUT0RPOiBjaGFuZ2UgdG8gZGVwZW5kIGluc3RlYWQgb2YgZm9yIGxpc3QuIAorCUBmb3IgdmVyIGluICQoUExVR0xJQl9BVkFJTEFCTEUpIDsgXAorCWRvIFwKKwkJZWNobyBidWlsZGluZyAkJHZlciBmb3IgJChQTFVHTElCKSA7IFwKKwkJaWYgWyAhICIkJHZlciIgPSAiJChQTFVHTElCKSIgXTsgXAorCQl0aGVuIFwKKwkJCWZvciBwYXJ0IGluICQoR0xfUEFSVFMpIDsgXAorCQkJZG8gXAorCQkJCWVjaG8gJChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1ub3ZlcmlmeSAkKElDVV9DT05GSUdfQ1hYKSkgJChHTFVFX0NGTEFHUykgLWMgLUkkKFRPUCkvJChCVUlMRCkvJCR2ZXIvZ2x1cmVuL2luY2x1ZGUgLURJQ1VHTFVFX1ZFUj0kJHZlciAiLURJQ1VHTFVFX1ZFUl9TVFI9XCIkJHZlclwiIiAiLURHTFVFX1NZTSh4KT1nbHVlICMjIHggIyMgJCR2ZXIiIC1vICQoR0xPVVQpLyQoUExVR0xJQikvJCR7cGFydH1fJCR7dmVyfV9mb3JfJChQTFVHTElCKS5vICQoR0xVRSkvJCR7cGFydH0kKFBBUlRTVUZGKS5jcHAgJChYT1BUUykgOyBcCisJCQkJJChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1ub3ZlcmlmeSAkKElDVV9DT05GSUdfQ1hYKSkgJChHTFVFX0NGTEFHUykgLWMgLUkkKFRPUCkvJChCVUlMRCkvJCR2ZXIvZ2x1cmVuL2luY2x1ZGUgLURJQ1VHTFVFX1ZFUj0kJHZlciAiLURJQ1VHTFVFX1ZFUl9TVFI9XCIkJHZlclwiIiAiLURHTFVFX1NZTSh4KT1nbHVlICMjIHggIyMgJCR2ZXIiIC1vICQoR0xPVVQpLyQoUExVR0xJQikvJCR7cGFydH1fJCR7dmVyfV9mb3JfJChQTFVHTElCKS5vICQoR0xVRSkvJCR7cGFydH0kKFBBUlRTVUZGKS5jcHAgJChYT1BUUykgfHwgZXhpdCAxOyBcCisJCQlkb25lIDsgXAorCQkJZWNobyAiIEdMVUVfVkVSKCAkJHZlciApICIgPj4gJChHTE9VVCkvJChQTFVHTElCKS9pbmNsdWRlL2ljdWdsdWUvZ2x2ZXIuaDsgXAorCQlmaSBcCisJZG9uZQorIyBidWlsZCAndGhpcyB2ZXJzaW9uJyBGRSBmaWxlcworCUBlY2hvIEJ1aWxkaW5nIEZFIGZvciAkKFBMVUdMSUIpCisJQGZvciBwYXJ0IGluICQoR0xfUEFSVFMpIDsgXAorCWRvIFwKKwkJZWNobyAkKHNoZWxsICQoUExVR0xJQl9JQ1VfQ09ORklHKSAtLW5vdmVyaWZ5ICQoSUNVX0NPTkZJR19DWFgpKSAkKEdMVUVfQ0ZMQUdTKSAtSSQoR0xPVVQpLyQoUExVR0xJQikvaW5jbHVkZSAtYyAtbyAkKEdMT1VUKS8kKFBMVUdMSUIpLyQke3BhcnR9XyQoUExVR0xJQikubyAkKEdMVUUpLyQke3BhcnR9JChQQVJUU1VGRikuY3BwICQoWE9QVFMpIDsgXAorCQkkKHNoZWxsICQoUExVR0xJQl9JQ1VfQ09ORklHKSAtLW5vdmVyaWZ5ICQoSUNVX0NPTkZJR19DWFgpKSAkKEdMVUVfQ0ZMQUdTKSAtSSQoR0xPVVQpLyQoUExVR0xJQikvaW5jbHVkZSAtYyAtbyAkKEdMT1VUKS8kKFBMVUdMSUIpLyQke3BhcnR9XyQoUExVR0xJQikubyAkKEdMVUUpLyQke3BhcnR9JChQQVJUU1VGRikuY3BwICQoWE9QVFMpIHx8IGV4aXQgMTsgXAorCWRvbmUKKwl0b3VjaCAkQAorCitwbHVnczogJChQTFVHTElCX09VVExJQlMpICQoT1VUKS8kKFBMVUdMSUJfTUFKOiU9aWN1cGx1Z2lucyUudHh0KQorCitpbnN0YWxsLXBsdWdzOiAkKFBMVUdMSUJfSU5TVCkvbGliLyQoUExVR0xJQl9OQU1FKSAkKFBMVUdMSUJfSU5TVCkvbGliL2ljdS9pY3VwbHVnaW5zJChQTFVHTElCX01BSikudHh0CisJZWNobyAiUGx1Z2lucyBpbnN0YWxsZWQgZm9yIHRlc3RpbmcuIgorCisjVE9ETzogc2hvdWxkIGJlICdpbnN0YWxsJyBub3QgJ2NwJworJChQTFVHTElCX0lOU1QpL2xpYi8kKFBMVUdMSUJfTkFNRSkgJChQTFVHTElCX0lOU1QpL2xpYi9pY3UvaWN1cGx1Z2lucyQoUExVR0xJQl9NQUopLnR4dDogJChQTFVHTElCX09VVExJQlMpCisJY3AgJChQTFVHTElCX09VVExJQlMpICQoUExVR0xJQl9JTlNUKS9saWIKKwllY2hvICIjIEdlbmVyYXRlZC4gIiA+ICQoUExVR0xJQl9JTlNUKS9saWIvaWN1L2ljdXBsdWdpbnMkKFBMVUdMSUJfTUFKKS50eHQKKwlAZm9yIHBhcnQgaW4gJChHTF9QQVJUUykgOyBcCisJZG8gXAorCQllY2hvICIkKFBMVUdMSUJfTkFNRSkJJCR7cGFydH1fcHJvdmlkZXJfcGx1Z2luIiA+PiAkKFBMVUdMSUJfSU5TVCkvbGliL2ljdS9pY3VwbHVnaW5zJChQTFVHTElCX01BSikudHh0IDsgXAorCQllY2hvICIgJCR7cGFydH1fcHJvdmlkZXJfcGx1Z2luIiA7IFwKKwlkb25lCisKKyQoR0xVRV9FWFBPUlQpOiBNYWtlZmlsZSAkKEdMX0ZFX0ZJTEVTKQorCWVjaG8gIiMgR2VuZXJhdGVkIGZvciBpbnN0YWxsYXRpb24uICIgPiAkQAorCUBmb3IgcGFydCBpbiAkKEdMX1BBUlRTKSA7IFwKKwlkbyBcCisJCWVjaG8gIl8kJHtwYXJ0fV9wcm92aWRlcl9wbHVnaW4iID4+ICRAIDsgXAorCQllY2hvICIgXyQke3BhcnR9X3Byb3ZpZGVyX3BsdWdpbiIgOyBcCisJZG9uZQorCiskKE9VVCkvaWN1cGx1Z2lucyQoUExVR0xJQl9NQUopLnR4dDogJChQTFVHTElCX09VVExJQlMpIE1ha2VmaWxlCisJZWNobyAiIyBHZW5lcmF0ZWQgZm9yIHRlc3RpbmcuIiA+ICRACisJQGZvciBwYXJ0IGluICQoR0xfUEFSVFMpIDsgXAorCWRvIFwKKwkJZWNobyAiJChQTFVHTElCX05BTUUpCSQke3BhcnR9X3Byb3ZpZGVyX3BsdWdpbiIgPj4gJEAgOyBcCisJCWVjaG8gIiAkJHtwYXJ0fV9wcm92aWRlcl9wbHVnaW4iIDsgXAorCWRvbmUKKworVEVTVFBST0c9Y29sZGlmZiBkYXRlZGlmZgorCit0ZXN0cHJvZzogJChQTFVHTElCOiU9JChPVVQpLyUvYmluLyQoVEVTVFBST0cpKSAKKworY2hlY2s6IGFsbCB0ZXN0cHJvZyAkKE9VVCkvaWN1cGx1Z2lucyQoUExVR0xJQl9NQUopLnR4dAorCUlDVV9QTFVHSU5TPSQoT1VUKSAkKExJQlBBVEhfVkFSKT0kKFBMVUdMSUJfSU5TVCkvbGliOm91dC8kKFBMVUdMSUIpL2xpYiAkKFBMVUdMSUJfSU5TVCkvYmluL2ljdWluZm8gfHwgKCBlY2hvICJJQ1UgYnJva2VuLiIgOyAvYmluL2ZhbHNlICkKKwlJQ1VfUExVR0lOUz0kKE9VVCkgJChMSUJQQVRIX1ZBUik9JChQTFVHTElCX0lOU1QpL2xpYjpvdXQvJChQTFVHTElCKS9saWIgJChQTFVHTElCX0lOU1QpL2Jpbi9pY3VpbmZvIC1MIHx8ICggZWNobyAiUGx1Z2luIGJyb2tlbi4iIDsgL2Jpbi9mYWxzZSApCisJQGZvciBwcm9nIGluICQoVEVTVFBST0cpIDsgXAorCWRvIFwKKwkJZWNobyAiIyBJQ1VfUExVR0lOUz0kKE9VVCkgJChMSUJQQVRIX1ZBUik9JChQTFVHTElCX0lOU1QpL2xpYjpvdXQvJChQTFVHTElCKS9saWIgb3V0LyQoUExVR0xJQikvYmluLyQke3Byb2d9IiA7IFwKKwkJSUNVX1BMVUdJTlM9JChPVVQpICQoTElCUEFUSF9WQVIpPSQoUExVR0xJQl9JTlNUKS9saWI6b3V0LyQoUExVR0xJQikvbGliIG91dC8kKFBMVUdMSUIpL2Jpbi8kJHtwcm9nfSB8fCAoIGVjaG8gIiQke3Byb2d9IGZhaWxlZC4iIDsgL2Jpbi9mYWxzZSApIDsgXAorCWRvbmUKKworaW5zdGFsbC1jaGVjazogaW5zdGFsbC1wbHVncworCSQoTElCUEFUSF9WQVIpPSQoUExVR0xJQl9JTlNUKS9saWIgJChQTFVHTElCX0lOU1QpL2Jpbi9pY3VpbmZvIC1MIHx8ICggZWNobyAiUGx1Z2luIGJyb2tlbi4iIDsgL2Jpbi9mYWxzZSApCisJQGZvciBwcm9nIGluICQoVEVTVFBST0cpIDsgXAorCWRvIFwKKwkJZWNobyAiIyAkJHtwcm9nfSIgOyBcCisJCSQoTElCUEFUSF9WQVIpPSQoUExVR0xJQl9JTlNUKS9saWIgb3V0LyQoUExVR0xJQikvYmluLyQke3Byb2d9IHx8ICggZWNobyAiJCR7cHJvZ30gYWdhaW5zdCBpbnN0YWxsZWQgZmFpbGVkLiIgOyAvYmluL2ZhbHNlICkgOyBcCisJZG9uZQorCiskKE9VVCkvJChQTFVHTElCKS9iaW4vJChURVNUUFJPRyk6ICAkKEdMT1VUKS8kKFBMVUdMSUIpL29iai0kKE9LKSAkKE9VVCkvJChQTFVHTElCKS9wcm92aWRlcl92ZXJzaW9uLmgKKwktbWtkaXIgLXAgJChPVVQpLyQoUExVR0xJQikvYmluCisJQGZvciBwcm9nIGluICQoVEVTVFBST0cpIDsgXAorCWRvIFwKKwkJJChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1jeHggLS1jeHhmbGFncyAtLWNwcGZsYWdzIC0tbGRmbGFncykgLW8gJChPVVQpLyQoUExVR0xJQikvYmluLyQke3Byb2d9IC1JJChPVVQpLyQoUExVR0xJQikgJChzcmNkaXIpLyQke3Byb2d9LmNwcCA7IFwKKwlkb25lCisKKyQoT1VUKS8lL2xpYi8kKFBMVUdMSUJfTkFNRSk6ICAkKEdMT1VUKS8lL29iai0kKE9LKSAkKFBMVUdfRVhUUkFfREVQUykKKwktbWtkaXIgLXAgJChPVVQpLyQqL2xpYgorCSQoc2hlbGwgJChQTFVHTElCX0lDVV9DT05GSUcpIC0tY3h4IC0tY3h4ZmxhZ3MgLS1jcHBmbGFncyAtLWxkZmxhZ3MpICQoUExVR19FWFRSQV9MREZMQUdTKSAtc2hhcmVkIC1vICRAICQoR0xPVVQpLyQqLyoubyAkKFBMVUdMSUJfQVZBSUxBQkxFX0RBVEEpICQoUExVR0xJQl9BVkFJTEFCTEVfU1RBVElDUykKKworIwljcCAkQCAkKENfSU5TKS9yJCovbGliLworCiskKE9VVCkvJS9saWIvJChMSUJQUk9WSURFUik6ICAkKEdMT1VUKS8lL29iai0kKE9LKQorCS1ta2RpciAtcCAkKE9VVCkvJCovbGliCisJZWNobyBjb3B5IGluY2x1ZGVzCisJYXIgLXJ2ICRAICQoR0xPVVQpLyQqLyoubworCXJhbmxpYiAkQAorCisjIyBAQCBidWlsZCBnbHUgcmVuYW1lIGZpbGVzCitnbHVyZW5zOiAkKEdMVVJFTl9JQ1UpCisKKyMgYnVpbGQgc2luZ2xlIGdsdXJlbi5oIAorJChCVUlMRCkvJS8kKEdMVVJFTl9IKTogJChCVUlMRCkvJS9vayBNYWtlZmlsZQorCS1ta2RpciAtcCAkKEJVSUxEKS8kKi8kKEdMVVJFTikKKwljYXQgJChHTFVFKS9nbHVyZW4tdG9wLmggPiAkQAorCWVjaG8gIiNkZWZpbmUgR0xVUkVOX1ZFUiIgJCogPj4gJEAKKwllY2hvICIjZGVmaW5lIEdMVVJFTl9USU5ZIiAkKHNoZWxsIGVjaG8gJCogfCBjdXQgLWRfIC1mMS0yKSA+PiAkQAorCWVjaG8gPj4gJEAKKwllY2hvICcvKiBvbGQgc3R5bGUgKDw0LjQpKi8nID4+ICRACisJZ3JlcCAiXiNkZWZpbmUuKiQoc2hlbGwgZWNobyAkKiB8IGN1dCAtZF8gLWYxLTIpJCQiICQoU1JDKS8kKi8kKFNPVVJDRSkvY29tbW9uL3VuaWNvZGUvdXJlbmFtZS5oICAgfCBmZ3JlcCAtdiAnKicgfCBcCisJCXNlZCAtZSAic0BeI2RlZmluZSBcKFteIF0qXCkgXChbXiBdKlwpQCNkZWZpbmUgT0lDVV9cMSBcMkAiID4+ICRACisJZWNobyAnLyogbmV3IHN0eWxlICg0LjQrKSAqLycgPj4gJEAKKwlmZ3JlcCAiIFVfSUNVX0VOVFJZX1BPSU5UX1JFTkFNRSgiICQoU1JDKS8kKi8kKFNPVVJDRSkvY29tbW9uL3VuaWNvZGUvdXJlbmFtZS5oIHwgXAorCQlzZWQgLWUgInNAXiNkZWZpbmUgXChbXiBdKlwpIC4qQCNkZWZpbmUgT0lDVV9cMSBcMV8kKHNoZWxsIGVjaG8gJCogfCBjdXQgLWRfIC1mMS0yIHwgdHIgLWQgJ18nKUAiID4+ICRACisJY2F0ICQoR0xVRSkvZ2x1cmVuLWJvdHRvbS5oID4+ICRACisKKworJChCVUlMRCkvJS9jb25maWcvJChJQ1VfQ09ORklHKTogJChCVUlMRCkvJS9jb25maWcvJChJQ1VfQ09ORklHX09SSUcpIGljdS1jb25maWcuc2VkICQoQlVJTEQpLyUvb2sgCisJc2VkIC1mIGljdS1jb25maWcuc2VkIDwgJChCVUlMRCkvJCovY29uZmlnLyQoSUNVX0NPTkZJR19PUklHKSA+ICAkKEJVSUxEKS8kKi9jb25maWcvJChJQ1VfQ09ORklHKSAmJiBjaG1vZCBhK3J4ICAkKEJVSUxEKS8kKi9jb25maWcvJChJQ1VfQ09ORklHKQorCisjIHNtaWxpbmcgbm93LgorIyBwZXJmb3JtIGluc3RhbGxhdGlvbgorJChJTlNUKS8lL29rOiAkKEJVSUxEKS8lL29rCisJZWNobyAiSU5TVCAiICJbIiAkKiAiXSIKKwlta2RpciAtcCAkKElOU1QpLyQqCisJLSQoTUFLRSkgJChNT1BUUykgLUMgJChCVUlMRCkvJCogaW5zdGFsbCAkKE1BS0VfSU5TVEFMTF9YVFJBX09QVFMpIAorCXRvdWNoICRACisKKyMgdW5wYWNrIElDVSBhbmQgcGF0Y2gKKyQoU1JDKS8lL29rOiAkKElDVVMpL2ljdTRjLSUtc3JjLnRnegorCS1bIC1kICQoU1JDKS8kKiBdICYmIHJtIC1yZiAkKFNSQykvJCoKKwlAZWNobyAiVW5wYWNraW5nIiAkKgorCW1rZGlyIC1wICQoU1JDKS8kKgorCSggY2QgJChTUkMpLyQqICYmIHRhciB4ZnB6ICQoVE9QKS8kKElDVVMpL2ljdTRjLSQqLXNyYy50Z3ogKQorCUBlY2hvIFNob3VsZCBwYXRjaCAkKiBoZXJlCisJdG91Y2ggJEAKKworIyBjb25maWcgCiskKEJVSUxEKS8lL2NvbmZpZy5zdGF0dXM6ICQoU1JDKS8lL29rCisJQGVjaG8gIkNvbmZpZ2dpbmciICQqCisJLVsgLWQgJChCVUlMRCkvJCogXSAmJiBybSAtcmYgJChCVUlMRCkvJCoKKwlta2RpciAtcCAkKEJVSUxEKS8kKgorCSggY2QgJChCVUlMRCkvJCogJiYgZW52IENGTEFHUz0iJChDRkxBR1MpICQoUEJMRF9FWFRSQV9GTEFHUykiIENYWEZMQUdTPSIkKENYWEZMQUdTKSAkKFBCTERfRVhUUkFfRkxBR1MpIiAkKHNoZWxsICQoU1VQRVJDT05GKSAkKFRPUCkvJChTUkMpLyQqLyQoU09VUkNFKSAkKikgJChDT05GSUdVUkVfT1BUUykgLS1zcmNkaXI9JChUT1ApLyQoU1JDKS8kKi8kKFNPVVJDRSkgLS1wcmVmaXg9JChUT1ApLyQoSU5TVCkvJCogKQorCisjIGJ1aWxkIAorIyBub3RlOiByZWdleCBoYWQgcmVuYW1pbmcgcHJvYmxlbXMsIGFuZCBzcG9vZiBkZXBlbmRzIG9uIHJlZ2V4LiBOdWtlIHRoZW0uCiskKEJVSUxEKS8lL29rOiAkKEJVSUxEKS8lL2NvbmZpZy5zdGF0dXMKKwlAZWNobyAiQnVpbGRpbmciICQqCisJKCAkKE1BS0UpICAkKE1PUFRTKSAtQyAkKEJVSUxEKS8kKiBhbGwgJChNQUtFX1hUUkFfT1BUUykgKQorCUBpZiBbICEgLWYgJChCVUlMRCkvJCovY29tbW9uL3B1dGlsLmFvIF07IFwKKwl0aGVuIFwKKwkJZWNobyByZS11bnBhY2tpbmcgJChCVUlMRCkvJCovY29tbW9uIDsgXAorCQkoIGNkICQoQlVJTEQpLyQqL2NvbW1vbiAmJiBhciB4ZiAuLi9saWIvbGlic2ljdXVjLmEgfHwgZWNobyBjb3VsZCBub3QgdW5wYWNrIC4uL2xpYi9saWJzaWN1dWMuYSApIDsgXAorCQllY2hvIHJlLXVucGFja2luZyAkKEJVSUxEKS8kKi9pMThuIDsgXAorCQkoIGNkICQoQlVJTEQpLyQqL2kxOG4gJiYgYXIgeGYgLi4vbGliL2xpYnNpY3VpMThuLmEgfHwgZWNobyBjb3VsZCBub3QgdW5wYWNrIC4uL2xpYi9saWJzaWN1aTE4bi5hICkgOyBcCisJZmkKKwlAaWYgWyAhIC1mICQoQlVJTEQpLyQqL2NvbW1vbi9wdXRpbC5hbyBdOyBcCisJdGhlbiBcCisJCWVjaG8gRVJST1I6IHN0aWxsIGNvdWxkIG5vdCBmaW5kICQoQlVJTEQpLyQqL2NvbW1vbi9wdXRpbC5hbyAtIGJ1aWxkIG1heSBmYWlsLjsgXAorCWZpCisJLXJtIC1mICQoQlVJTEQpLyQqL2kxOG4vdXJlZ2V4Ki4qICQoQlVJTEQpLyQqL2kxOG4vdXNwb29mKi4qbyoKKwl0b3VjaCAkQAorCitpbmZvIGhlbHA6CisJQGVjaG8gSUNVIFByb3ZpZGVyIEJ1aWxkCisJQGVjaG8gIlRhcmdldHRpbmcgUHJvdmlkZXIgYWdhaW5zdCBJQ1UgJChQUk9WSURFUl9UQVJHRVQpICgkKFBMVUdMSUIpLCBtYWpvciAkKFBMVUdMSUJfTUFKKSkiCisJQGVjaG8gIkF2YWlsYWJsZSBwbHVnaW5zOiAkKFBST1ZJREVSX0FWQUlMQUJMRSkgKCQoUExVR0xJQl9BVkFJTEFCTEUpKSIKKwlAZWNobyAiQXZhaWxhYmxlIGtleXdvcmRzOiIKKwlAZm9yIHZlciBpbiAkKFBST1ZJREVSX0FWQUlMQUJMRSk7IGRvIFwKKwkJZWNobyAiICAgLi4uQHByb3ZpZGVyPWljdSJgZWNobyAkJHZlciB8IGN1dCAtZC4gLWYxLTIgfCB0ciAtZCAuYDsgXAorCWRvbmUKKwlAZWNobyAiUGx1Z2luIGxpYnJhcnkgd2lsbCBiZSAkKFBMVUdMSUJfTkFNRSkiCisJQGVjaG8KKwlAZWNobyBBdmFpbGFibGUgSUNVIHRhcmJhbGxzOiAgJChJQ1VfVEFSQkFMTFMpCisJQGVjaG8gQXZhaWxhYmxlIElDVSB2ZXJzaW9uczogJChzaGVsbCBlY2hvICQoSUNVX1RBUkJBTExTX1ZFUlMpIHwgdHIgJ18nICcuJykKKworJChPVVQpLyQoUExVR0xJQikvcHJvdmlkZXJfdmVyc2lvbi5oOiBNYWtlZmlsZS5sb2NhbCBNYWtlZmlsZQorCUBlY2hvIEdlbmVyYXRpbmcgJEAgLi4KKwlAZWNobyAiLyogR2VuZXJhdGVkIGZpbGUuICovIiA+ICRACisJQGVjaG8gImNvbnN0IGNoYXIgKnByb3ZpZGVyX3ZlcnNpb25bXSA9IHsiID4+ICRACisJQGZvciB2ZXIgaW4gJChQUk9WSURFUl9BVkFJTEFCTEUpOyBkbyBcCisJCWVjaG8gJyInYGVjaG8gJCR2ZXIgfCBjdXQgLWQuIC1mMS0yIHwgdHIgLWQgLmAnIiwnID4+ICRAIDsgXAorCWRvbmUKKwlAZWNobyAiIH07ICIgPj4gJEAKKwlAZWNobyAiI2RlZmluZSBQUk9WSURFUl9DT1VOVCAoc2l6ZW9mKHByb3ZpZGVyX3ZlcnNpb24pL3NpemVvZihwcm92aWRlcl92ZXJzaW9uWzBdKSkiID4+ICRACisJQGVjaG8gPj4gJEAKKworIy0tIGZvciB0aGUgcHJvdG90eXBlCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlLmxvY2FsLXNhbXBsZSBiL211bHRpL3Byb2ovcHJvdmlkZXIvTWFrZWZpbGUubG9jYWwtc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZThjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlLmxvY2FsLXNhbXBsZQpAQCAtMCwwICsxLDMyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyMgbG9jYWwgZGVmaW5pdGlvbnMgbXVzdCBnbyBpbiBNYWtlZmlsZS5sb2NhbAorIyBleGFtcGxlOgorCisjIworIyMgVGhlc2UgdHdvIGFyZSBSRVFVSVJFRC4KKyMjCisKKyMgVGhlIHZlcnNpb24gb2YgSUNVIHlvdSB3aWxsIGJ1aWxkIGFnYWluc3QsIHN1Y2ggYXM6ICAKKyMgRVhBTVBMRTogNC40LjIKK1BST1ZJREVSX1RBUkdFVD00LjQuMgorCisjIFRoZSB2ZXJzaW9ucyBvZiBJQ1UgeW91IHdhbnQgdG8gaGF2ZSBhdmFpbGFibGUgaW4gdGhlIHBsdWdpbi4gU3BhY2Ugc2VwYXJhdGVkLiAgRG9uJ3QgaW5jbHVkZSB0aGUgUFJPVklERVJfVEFSR0VUIHZlcnNpb24uCisjIEVYQU1QTEU6IDMuOC4xICA0LjIuMC4xCitQUk9WSURFUl9BVkFJTEFCTEU9My44LjEgNC4yLjAuMQorCisKKworCisKKyMjCisjIyBmb2xsb3dpbmcgYXJlIE9QVElPTkFMCisjIworCisjIyBkZWJ1ZyBvcHRpb25zCisjRVhUUkFfQ09NUElMRV9PUFRTPS1nCisKKyMjIGNvbmZpZ3VyZSBvcHRpb25zCisjRVhUUkFfQ09ORklHVVJFX09QVFM9LS13aXRoLWxpYnJhcnktc3VmZml4PXNybAorCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2NvbGRpZmYuY3BwIGIvbXVsdGkvcHJvai9wcm92aWRlci9jb2xkaWZmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjM4MTZjCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9jb2xkaWZmLmNwcApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgPHVuaWNvZGUvY29sbC5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNsZWFuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisvKiBTdHJpbmcgdG8gdXNlLiAqLworY29uc3QgVUNoYXIgc3R1ZmZbXSA9IHsgMHgzMEJCLCAweDBkNGMsIDB4NTMsIDB4NzQsIDB4NzUsIDB4NjYsIDB4NjYsIDB4MDAgfTsgLyogU3R1ZmYgKi8KKworI2luY2x1ZGUgInByb3ZpZGVyX3ZlcnNpb24uaCIKKworCisjZGVmaW5lIExPQ0FMRV9DT1VOVCA0Citjb25zdCBjaGFyICpsb2NhbGVbTE9DQUxFX0NPVU5UXSA9IHsgImZpIiwgImVuX1VTIiwgImphIiwgIm1sIiB9OyAvKiBMaXN0IG9mIGxvY2FsZXMgdG8gdGVzdCAqLworCisvKioKKyAqIFNldCB1cCBJQ1UsIHByaW50ICMgb2YgYXZhaWxhYmxlIGNvbGxhdG9ycworICovCit2b2lkIHNldHVwKFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIHVfaW5pdCgmc3RhdHVzKTsKKyAgCisgICAgZnByaW50ZihzdGRlcnIsICJJQ1UgJXMgaW5pdDogJXNcbiIsIFVfSUNVX1ZFUlNJT04sIHVfZXJyb3JOYW1lKHN0YXR1cykpOworCisgICAgaW50MzJfdCBjb3VudDsKKyAgICBTdHJpbmdFbnVtZXJhdGlvbiAqc2UgPSBDb2xsYXRvcjo6Z2V0QXZhaWxhYmxlTG9jYWxlcygpOworICAgIGNvdW50ID0gc2UtPmNvdW50KHN0YXR1cyk7CisgICAgZnByaW50ZihzdGRlcnIsICIjIENvbGxhdG9ycyBub3cgYXZhaWxhYmxlOiAlZCxcdCVzIC0gJWQgcHJvdmlkZXJzIGV4cGVjdGVkLlxuIiwgY291bnQsIHVfZXJyb3JOYW1lKHN0YXR1cyksIChpbnQzMl90KVBST1ZJREVSX0NPVU5UKTsKK30KKworaW50IG1haW4oaW50IC8qIGFyZ2MqLyAsIGNvbnN0IGNoYXIgKiAvKmFyZ3YqLyBbXSkgeworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIGludCBkaWZmcyA9IDA7CisgICAgaW50IGdiYWRkaWZmcyA9MDsKKyAgICBzZXR1cChzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRShzdGF0dXMpKSByZXR1cm4gMTsKKworICAgIGludCBleHBlY3RlZCA9IFBST1ZJREVSX0NPVU5UOworCisgICAgZm9yKGludCBsPTA7bDxMT0NBTEVfQ09VTlQ7bCsrKSB7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgdWludDhfdCBvbGRCeXRlc1syMDBdOworICAgICAgICBpbnQzMl90IG9sZExlbiA9IC0xOworICAgICAgICBmb3IoaW50IHY9MDt2PD1leHBlY3RlZDt2KyspIHsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBsb2NhbGUgSUQKKyAgICAgICAgICAgIGNoYXIgbG9jSURbMjAwXTsKKyAgICAgICAgICAgIHN0cmNweShsb2NJRCwgbG9jYWxlW2xdKTsKKyAgICAgICAgICAgIGlmKCh2IT1leHBlY3RlZCkpIHsgLy8gLTEgPSBubyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgc3RyY2F0KGxvY0lELCAiQHNwPWljdSIpOworICAgICAgICAgICAgICAgIHN0cmNhdChsb2NJRCwgcHJvdmlkZXJfdmVyc2lvblt2XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByaW50ZigiJS0yOHMgPSAgIiwgbG9jSUQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBVRXJyb3JDb2RlIHN1YlN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIHVpbnQ4X3QgYnl0ZXNbMjAwXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgYnl0ZXNiWzIwMF07CisjZGVmaW5lIFVTRV9DWFggMAorCisjaWYgVVNFX0NYWAorICAgICAgICAgICAgQ29sbGF0b3IgKmNvbCA9IENvbGxhdG9yOjpjcmVhdGVJbnN0YW5jZShMb2NhbGUobG9jSUQpLHN1YlN0YXR1cyk7CisgICAgICAgICAgICBpZihVX0ZBSUxVUkUoc3ViU3RhdHVzKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJSOiAlc1xuIiwgdV9lcnJvck5hbWUoc3ViU3RhdHVzKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGxlbiA9IGNvbC0+Z2V0U29ydEtleShzdHVmZiwgLTEsIGJ5dGVzLCAyMDApOworI2Vsc2UKKyNpZiAxCisgICAgICAgICAgICBjaGFyIHhidWYyWzIwMF07CisgICAgICAgICAgICBzdHJjcHkoeGJ1ZjIsIlgvIik7CisgICAgICAgICAgICBzdHJjYXQoeGJ1ZjIsbG9jSUQpOworICAgICAgICAgICAgc3RyY2F0KHhidWYyLCIvIik7CisgICAgICAgICAgICAvL3ByaW50ZigiIC0+ICVzXG4iLCB4YnVmMik7CisgICAgICAgICAgICBVQ29sbGF0b3IgKmNvbCA9IHVjb2xfb3BlbkZyb21TaG9ydFN0cmluZyh4YnVmMiwgRkFMU0UsTlVMTCwgJnN1YlN0YXR1cyk7CisjZWxzZQorICAgICAgICAgICAgVUNvbGxhdG9yICpjb2wgPSB1Y29sX29wZW4obG9jSUQsICZzdWJTdGF0dXMpOworI2VuZGlmCisgICAgICAgICAgICBpZihVX0ZBSUxVUkUoc3ViU3RhdHVzKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJSOiAlc1xuIiwgdV9lcnJvck5hbWUoc3ViU3RhdHVzKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKworICAgICAgICAgICAgY2hhciB4YnVmM1syMDBdOworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQzMl90IGRlZiA9IHVjb2xfZ2V0U2hvcnREZWZpbml0aW9uU3RyaW5nKGNvbCxsb2NJRC8qTlVMTCovLHhidWYzLDIwMCwmc3ViU3RhdHVzKTsKKyAgICAgICAgICAgICAgaWYoVV9GQUlMVVJFKHN1YlN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVyciBnZXR0aW5nIHNob3J0IHN0cmluZyBuYW1lOiAlc1xuIiwgdV9lcnJvck5hbWUoc3ViU3RhdHVzKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgLS0+ICVzXG4iLCB4YnVmMyk7CisgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGxlbiA9IHVjb2xfZ2V0U29ydEtleShjb2wsIHN0dWZmLCAtMSwgYnl0ZXMsIDIwMCk7CisjZW5kaWYKKworICAgICAgICAgICAgcHJpbnRmKCIgICAgICIpOworCisgICAgICAgICAgICBpbnQgdGRpZmZzPTA7CisKKyAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8bGVuO2krKykgeworCSAgICAgIGlmKGk8b2xkTGVuJiZieXRlc1tpXSE9b2xkQnl0ZXNbaV0pIHsKKyAgICAgICAgICAgICAgICBkaWZmcysrOworICAgICAgICAgICAgICAgIHByaW50ZigiKiIpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiICIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHByaW50ZigiJTAyWCIsICgweEZGJmJ5dGVzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisKKyAgICAgICAgICAgIGNoYXIgeGJ1ZjRbMjAwXTsKKyAgICAgICAgICAgIFVDb2xsYXRvciAqY29sMiA9IHVjb2xfb3BlbkZyb21TaG9ydFN0cmluZyh4YnVmMywgRkFMU0UsIE5VTEwsICZzdWJTdGF0dXMpOworICAgICAgICAgICAgaWYoVV9GQUlMVVJFKHN1YlN0YXR1cykpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJFcnIgb3BlbmluZyBmcm9tIG5ldyBzaG9ydCBzdHJpbmcgOiAlc1xuIiwgdV9lcnJvck5hbWUoc3ViU3RhdHVzKSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaW50MzJfdCBkZWY0ID0gdWNvbF9nZXRTaG9ydERlZmluaXRpb25TdHJpbmcoY29sLGxvY0lELypOVUxMKi8seGJ1ZjQsMjAwLCZzdWJTdGF0dXMpOworICAgICAgICAgICAgICBpZihzdHJjbXAoeGJ1ZjQseGJ1ZjMpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgLS0+IHJlb3BlbmVkID0gJXMgKCVzKVxuIiwgeGJ1ZjQsIHVfZXJyb3JOYW1lKHN1YlN0YXR1cykpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGxlbjIgPSB1Y29sX2dldFNvcnRLZXkoY29sMiwgc3R1ZmYsIC0xLCBieXRlc2IsIDIwMCk7CisKKyAgICAgICAgICAgIGludCBiYWRkaWZmcz0wOworICAgICAgICAgICAgZm9yKGludCBpPTA7aTxsZW47aSsrKSB7CisJICAgICAgaWYoaTxsZW4mJmJ5dGVzW2ldIT1ieXRlc2JbaV0pIHsKKyAgICAgICAgICAgICAgICAgIGJhZGRpZmZzKys7CisgICAgICAgICAgICAgICAgICBwcmludGYoIiEiKTsKKyAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAvLyBwcmludGYoIiAiKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHByaW50ZigiJTAyWCIsICgweEZGJmJ5dGVzYltpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYmFkZGlmZnM+MCkgeworICAgICAgICAgICAgICBwcmludGYoIiAtIEVSUiEgRGlmZnMgZnJvbSAlcyBpbiAlZCBwbGFjZXNcbiIsIHhidWYyLGJhZGRpZmZzKTsKKyAgICAgICAgICAgICAgZ2JhZGRpZmZzKz1iYWRkaWZmczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vcHJpbnRmKCIgIE9LLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKworICAgICAgICAgICAgCisKKyNpZiBVU0VfQ1hYCisgICAgICAgICAgICBkZWxldGUgY29sOworI2Vsc2UKKyAgICAgICAgICAgIHVjb2xfY2xvc2UoY29sKTsKKyNlbmRpZgorCisgICAgICAgICAgICBvbGRMZW4gPSBsZW47CisgICAgICAgICAgICBtZW1jcHkob2xkQnl0ZXMsIGJ5dGVzLCBsZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoZGlmZnM9PTApIHsKKyAgICAgIHByaW50ZigiRVJST1I6IDAgZGlmZmVyZW5jZXMgZm91bmQgYmV0d2VlbiBwbGF0Zm9ybXMuLiBhcmUgdGhlIHBsYXRmb3JtcyBpbnN0YWxsZWQ/IFRyeSAnaWN1aW5mbyAtTCdcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiJWQgZGlmZmVyZW5jZXMgZm91bmQgYW1vbmcgcHJvdmlkZXIgdmVyc2lvbnMhXG4iLCBkaWZmcyk7CisgICAgfQorCisgICAgaWYoZ2JhZGRpZmZzPjApIHsKKyAgICAgIHByaW50ZigiRVJST1I6ICVkIGRpZmZzIGZvdW5kIGJldHdlZW4gYSBjb2xsYXRvciBhbmQgaXQncyByZW9wZW5lZCAoZnJvbSBzaG9ydHN0cmluZykgdmFyaWFudC5cbiIsIGdiYWRkaWZmcyk7CisgICAgICByZXR1cm4gMjsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJDb2xsYXRvciBhbmQgcmVvcGVuZWQgKHNob3J0c3RyaW5nKSBhcmUgT0suXG4iKTsKKyAgICB9CisKKyAgICBwcmludGYoIlN1Y2Nlc3MhXG4iKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZGF0ZWRpZmYuY3BwIGIvbXVsdGkvcHJvai9wcm92aWRlci9kYXRlZGlmZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMTk5NwotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZGF0ZWRpZmYuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSA8dW5pY29kZS9kYXRlZm10Lmg+CisjaW5jbHVkZSA8dW5pY29kZS91ZGF0Lmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y2xlYW4uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKy8qIFN0cmluZyB0byB1c2UuICovCitjb25zdCBVRGF0ZSBzdHVmZiA9IDEyOTk5Nzc3NzEwMDAuMEw7CisKKyNpbmNsdWRlICJwcm92aWRlcl92ZXJzaW9uLmgiCisKKworI2RlZmluZSBMT0NBTEVfQ09VTlQgNAorY29uc3QgY2hhciAqbG9jYWxlW0xPQ0FMRV9DT1VOVF0gPSB7ICJmaSIsICJlbl9VUyIsICJqYSIsICJtbCIgfTsgLyogTGlzdCBvZiBsb2NhbGVzIHRvIHRlc3QgKi8KKworLyoqCisgKiBTZXQgdXAgSUNVLCBwcmludCAjIG9mIGF2YWlsYWJsZSBjb2xsYXRvcnMKKyAqLwordm9pZCBzZXR1cChVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgICB1X2luaXQoJnN0YXR1cyk7CisgIAorICAgIGZwcmludGYoc3RkZXJyLCAiSUNVICVzIGluaXQ6ICVzXG4iLCBVX0lDVV9WRVJTSU9OLCB1X2Vycm9yTmFtZShzdGF0dXMpKTsKKworICAgIC8vIGludDMyX3QgY291bnQ7CisgICAgLy8gU3RyaW5nRW51bWVyYXRpb24gKnNlID0gRGF0ZUZvcm1hdDo6Z2V0QXZhaWxhYmxlTG9jYWxlcygpOworICAgIC8vIGNvdW50ID0gc2UtPmNvdW50KHN0YXR1cyk7CisgICAgLy8gZnByaW50ZihzdGRlcnIsICIjIERhdGVGb3JtYXRzIG5vdyBhdmFpbGFibGU6ICVkLFx0JXMgLSAlZCBwcm92aWRlcnMgZXhwZWN0ZWQuXG4iLCBjb3VudCwgdV9lcnJvck5hbWUoc3RhdHVzKSwgKGludDMyX3QpUFJPVklERVJfQ09VTlQpOworfQorCitpbnQgbWFpbihpbnQgLyogYXJnYyovICwgY29uc3QgY2hhciAqIC8qYXJndiovIFtdKSB7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgaW50IGRpZmZzID0gMDsKKyAgICBpbnQgZ2JhZGRpZmZzID0wOworICAgIFVEYXRlRm9ybWF0U3R5bGUgc3R5bGVzW10gPSB7IFVEQVRfRlVMTCwgVURBVF9TSE9SVCB9OworICAgIHNldHVwKHN0YXR1cyk7CisgICAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHJldHVybiAxOworCisgICAgaW50IGV4cGVjdGVkID0gUFJPVklERVJfQ09VTlQ7CisKKyAgICBmb3IoaW50IHM9MDtzPHNpemVvZihzdHlsZXMpL3NpemVvZihzdHlsZXNbMF0pO3MrKykgeworICAgICAgZm9yKGludCBsPTA7bDxMT0NBTEVfQ09VTlQ7bCsrKSB7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgVUNoYXIgb2xkQ2hhcnNbMjAwXTsKKyAgICAgICAgaW50MzJfdCBvbGRMZW4gPSAtMTsKKyAgICAgICAgZm9yKGludCB2PTA7djw9ZXhwZWN0ZWQ7disrKSB7CisgICAgICAgICAgCisgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBsb2NhbGUgSUQKKyAgICAgICAgICBjaGFyIGxvY0lEWzIwMF07CisgICAgICAgICAgc3RyY3B5KGxvY0lELCBsb2NhbGVbbF0pOworICAgICAgICAgIGlmKCh2IT1leHBlY3RlZCkpIHsgLy8gLTEgPSBubyB2ZXJzaW9uCisgICAgICAgICAgICBzdHJjYXQobG9jSUQsICJAc3A9aWN1Iik7CisgICAgICAgICAgICBzdHJjYXQobG9jSUQsIHByb3ZpZGVyX3ZlcnNpb25bdl0pOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBwcmludGYoIiUxOHMgOiAiLCBsb2NJRCk7CisgICAgICAgICAgCisgICAgICAgICAgVUVycm9yQ29kZSBzdWJTdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgVUNoYXIgb3V0Y2hhcnNbMjAwXTsKKyAgICAgICAgICAKKyAgICAgICAgICBVRGF0ZUZvcm1hdCAqZGF0ID0gdWRhdF9vcGVuKHN0eWxlc1tzXSxzdHlsZXNbc10sIGxvY0lELCBOVUxMLCAtMSwgTlVMTCwgMCwgJnN1YlN0YXR1cyk7CisgICAgICAgICAgCisgICAgICAgICAgaWYoVV9GQUlMVVJFKHN1YlN0YXR1cykpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJSOiAlc1xuIiwgdV9lcnJvck5hbWUoc3ViU3RhdHVzKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaW50MzJfdCBsZW4gPSB1ZGF0X2Zvcm1hdChkYXQsIHN0dWZmLCBvdXRjaGFycywgMjAwLCBOVUxMLCAmc3ViU3RhdHVzKTsgCisgICAgICAgICAgCisgICAgICAgICAgLy9wcmludGYoIlxuIik7CisgICAgICAgICAgY2hhciB1dGY4WzIwMF07CisgICAgICAgICAgdV9zdHJUb1VURjgodXRmOCwgMjAwLCBOVUxMLCBvdXRjaGFycywgbGVuLCAmc3ViU3RhdHVzKTsKKyAgICAgICAgICBpZihvbGRMZW4hPWxlbiB8fCBtZW1jbXAob3V0Y2hhcnMsb2xkQ2hhcnMsbGVuKnNpemVvZihvdXRjaGFyc1swXSkpKSB7CisgICAgICAgICAgICBwdXRjaGFyICgnIScpOworICAgICAgICAgICAgZGlmZnMrKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHV0Y2hhciAoJz0nKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCIgJXMgIiwgdXRmOCk7IAorICAgICAgICAgIAorICAgICAgICAgIC8vIGZvcihpbnQgaT0wO2k8bGVuO2krKykgeworICAgICAgICAgIC8vICAgaWYoKGk8b2xkTGVuKSYmKG91dGNoYXJzW2ldIT1vbGRDaGFyc1tpXSkpIHsKKyAgICAgICAgICAvLyAgICAgICBkaWZmcysrOworICAgICAgICAgIC8vICAgICAgIHByaW50ZigiKiIsIG9sZENoYXJzW2ldKTsKKyAgICAgICAgICAvLyAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyAgICAgICBwcmludGYoIiAiKTsKKyAgICAgICAgICAvLyAgICAgfQorICAgICAgICAgIC8vICAgLy8gICAgICAgICAgICAgICAgcHJpbnRmKCJVKyUwNFgiLCAob3V0Y2hhcnNbaV0pKTsKKyAgICAgICAgICAvLyB9CisgICAgICAgICAgcHV0Y2hhcignXG4nKTsKKyAgICAgICAgICB1ZGF0X2Nsb3NlKGRhdCk7CisgICAgICAgICAgCisgICAgICAgICAgb2xkTGVuID0gbGVuOworICAgICAgICAgIG1lbWNweShvbGRDaGFycywgb3V0Y2hhcnMsIGxlbipzaXplb2Yob2xkQ2hhcnNbMF0pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAgIAorICAgIGlmKGRpZmZzPT0wKSB7CisgICAgICBwcmludGYoIkVSUk9SOiAwIGRpZmZlcmVuY2VzIGZvdW5kIGJldHdlZW4gcGxhdGZvcm1zLi4gYXJlIHRoZSBwbGF0Zm9ybXMgaW5zdGFsbGVkPyBUcnkgJ2ljdWluZm8gLUwnXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIiVkIGRpZmZlcmVuY2VzIGZvdW5kIGFtb25nIHByb3ZpZGVyIHZlcnNpb25zIVxuIiwgZGlmZnMpOworICAgIH0KKworICAgIC8vIGlmKGdiYWRkaWZmcz4wKSB7CisgICAgLy8gICBwcmludGYoIkVSUk9SOiAlZCBkaWZmcyBmb3VuZCBiZXR3ZWVuIGEgY29sbGF0b3IgYW5kIGl0J3MgcmVvcGVuZWQgKGZyb20gc2hvcnRzdHJpbmcpIHZhcmlhbnQuXG4iLCBnYmFkZGlmZnMpOworICAgIC8vICAgcmV0dXJuIDI7CisgICAgLy8gfSBlbHNlIHsKKyAgICAvLyAgIHByaW50ZigiQ29sbGF0b3IgYW5kIHJlb3BlbmVkIChzaG9ydHN0cmluZykgYXJlIE9LLlxuIik7CisgICAgLy8gfQorCisgICAgcHJpbnRmKCJTdWNjZXNzIVxuIik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2V4cG9ydC50eHQgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2V4cG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhYjc4NAotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZXhwb3J0LnR4dApAQCAtMCwwICsxLDIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCitfY29sbF9wcm92aWRlcl9wbHVnaW4KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9fdmVyc2lvbmxpc3RfLmNwcCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9fdmVyc2lvbmxpc3RfLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDEwNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL192ZXJzaW9ubGlzdF8uY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSA8aWN1Z2x1ZS9pY3VnbHVlLmg+CisjaW5jbHVkZSA8dW5pY29kZS9jb2xsLmg+CisKKworI2lmIGRlZmluZWQgKCBJQ1VHTFVFX1ZFUiApCisvLyNlcnJvciBERUZJTkVEIQorI2Vsc2UKKworI2RlZmluZSBHTFVFX1ZFUih4KSBwdXRzKCJWZXJzaW9uICIgIyB4ICk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyBnZW5lcmF0ZSBsaXN0IG9mIHZlcnNpb25zCisjaW5jbHVkZSA8aWN1Z2x1ZS9mZV92ZXJsaXN0Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKK3ByaW50ZigiSSdtIG9uICIgVV9JQ1VfVkVSU0lPTiAiIGJ1dCBpIGhhdmUgbW9kdWxlcyBmb3I6IFxuIik7CisgIGZvcihpbnQgaT0wO2ZlX3Zlcmxpc3RbaV07aSsrKSB7CisgICAgICBwcmludGYoIiVkOiAlc1xuIiwgaSwgZmVfdmVybGlzdFtpXSk7CisgIH0KK30KKworI2VuZGlmCisKKworCisKZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9jb2xsX2ZlLmNwcCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9jb2xsX2ZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGM1OTNhCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2NvbGxfZmUuY3BwCkBAIC0wLDAgKzEsNDgwIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIENPTExfRkVfREVCVUcKKyNkZWZpbmUgQ09MTF9GRV9ERUJVRyAwCisjZW5kaWYKKworI2luY2x1ZGUgPGljdWdsdWUvaWN1Z2x1ZS5oPgorI2luY2x1ZGUgPHVuaWNvZGUvY29sbC5oPgorLy8jaW5jbHVkZSA8dW5pY29kZS90Ymxjb2xsLmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKKworCisKKworLyoqCisgKiBNYWNybyB0byBkZWZpbmUgdGhlIENvbGxhdG9yX2dsdWVfNF8yIGNsYXNzIAorICovCisjZGVmaW5lIEdMVUVfVkVSKHgpIGNsYXNzIEdMVUVfU1lNX1YoIENvbGxhdG9yLCB4ICkgOiBwdWJsaWMgQ29sbGF0b3IgeyAgXAorICAgIFwKKyAgcHVibGljOiAgc3RhdGljIENvbGxhdG9yICpjcmVhdGUoY29uc3QgTG9jYWxlICZsb2MsIGNvbnN0IGNoYXIgKnZlcik7IFwKKyAgcHJpdmF0ZTogVUNvbGxhdG9yICpfdGhpczsgR0xVRV9TWU1fViggQ29sbGF0b3IsIHggKSAoIFVDb2xsYXRvciogdG4gKSA6IF90aGlzKHRuKXt9IFwKKyAgICB2aXJ0dWFsIH4gR0xVRV9TWU1fViAoIENvbGxhdG9yLCB4KSAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQqIGdldER5bmFtaWNDbGFzc0lEKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCogZ2V0U3RhdGljQ2xhc3NJRCgpIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIENvbGxhdG9yKiBjbG9uZSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIFVDb2xsYXRpb25SZXN1bHQgY29tcGFyZShjb25zdCBVbmljb2RlU3RyaW5nJiwgY29uc3QgVW5pY29kZVN0cmluZyYsIFVFcnJvckNvZGUmKSBjb25zdDsgXAorICAgIHZpcnR1YWwgVUNvbGxhdGlvblJlc3VsdCBjb21wYXJlKGNvbnN0IFVuaWNvZGVTdHJpbmcmLCBjb25zdCBVbmljb2RlU3RyaW5nJiwgaW50MzJfdCwgVUVycm9yQ29kZSYpIGNvbnN0OyBcCisgICAgdmlydHVhbCBVQ29sbGF0aW9uUmVzdWx0IGNvbXBhcmUoY29uc3QgVUNoYXIqLCBpbnQzMl90LCBjb25zdCBVQ2hhciosIGludDMyX3QsIFVFcnJvckNvZGUmKSBjb25zdDsgXAorICAgIHZpcnR1YWwgQ29sbGF0aW9uS2V5JiBnZXRDb2xsYXRpb25LZXkoY29uc3QgVW5pY29kZVN0cmluZyYsIENvbGxhdGlvbktleSYsIFVFcnJvckNvZGUmKSBjb25zdDsgXAorICAgIHZpcnR1YWwgQ29sbGF0aW9uS2V5JiBnZXRDb2xsYXRpb25LZXkoY29uc3QgVUNoYXIqLCBpbnQzMl90LCBDb2xsYXRpb25LZXkmLCBVRXJyb3JDb2RlJikgY29uc3Q7IFwKKyAgICB2aXJ0dWFsIGludDMyX3QgaGFzaENvZGUoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIGNvbnN0IExvY2FsZSBnZXRMb2NhbGUoVUxvY0RhdGFMb2NhbGVUeXBlLCBVRXJyb3JDb2RlJikgY29uc3Q7IFwKKyAgICB2aXJ0dWFsIEVDb2xsYXRpb25TdHJlbmd0aCBnZXRTdHJlbmd0aCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RyZW5ndGgoRUNvbGxhdGlvblN0cmVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0VmVyc2lvbih1aW50OF90KikgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXR0cmlidXRlKFVDb2xBdHRyaWJ1dGUsIFVDb2xBdHRyaWJ1dGVWYWx1ZSwgVUVycm9yQ29kZSYpOyBcCisgICAgdmlydHVhbCBVQ29sQXR0cmlidXRlVmFsdWUgZ2V0QXR0cmlidXRlKFVDb2xBdHRyaWJ1dGUsIFVFcnJvckNvZGUmKTsgXAorICAgIHZpcnR1YWwgdWludDMyX3Qgc2V0VmFyaWFibGVUb3AoY29uc3QgVUNoYXIqLCBpbnQzMl90LCBVRXJyb3JDb2RlJik7IFwKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHNldFZhcmlhYmxlVG9wKFVuaWNvZGVTdHJpbmcsIFVFcnJvckNvZGUmKTsgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VmFyaWFibGVUb3AodWludDMyX3QsIFVFcnJvckNvZGUmKTsgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFZhcmlhYmxlVG9wKFVFcnJvckNvZGUmKSBjb25zdDsgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIENvbGxhdG9yKiBzYWZlQ2xvbmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U29ydEtleShjb25zdCBVbmljb2RlU3RyaW5nJiwgdWludDhfdCosIGludDMyX3QpIGNvbnN0OyBcCisgICAgdmlydHVhbCBpbnQzMl90IGdldFNvcnRLZXkoY29uc3QgVUNoYXIqLCBpbnQzMl90LCB1aW50OF90KiwgaW50MzJfdCkgY29uc3Q7IFwKKyAgcHVibGljOiBzdGF0aWMgaW50MzJfdCBjb3VudEF2YWlsYWJsZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiBzdGF0aWMgaW50MzJfdCBhcHBlbmRBdmFpbGFibGUoVW5pY29kZVN0cmluZyogc3RycywgaW50MzJfdCBpLCBpbnQzMl90IGNvdW50KTsgXAorICBwdWJsaWM6IHZpcnR1YWwgaW50MzJfdCBpbnRlcm5hbEdldFNob3J0RGVmaW5pdGlvblN0cmluZyhjb25zdCBjaGFyICpsb2NhbGUsIGNoYXIgKmJ1ZmZlciwgaW50MzJfdCBjYXBhY2l0eSwgVUVycm9yQ29kZSAmc3RhdHVzKSBjb25zdDsgXAorICB9OworCisvKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRoZSBmb2xsb3dpbmcgY29kZSBydW5zIGluc2lkZSB0aGUgJ3RhcmdldCcgdmVyc2lvbiAoaS5lLiBvbGQgSUNVKSA9PT09PT09PT09ICoqLworI2lmIGRlZmluZWQgKCBJQ1VHTFVFX1ZFUiApCisKKworLy8gdGhlc2UgZnJvbSB0Ymxjb2xsLmgKK3N0YXRpYyBDb2xsYXRvcjo6RUNvbGxhdGlvblN0cmVuZ3RoIF9nZXRFQ29sbGF0aW9uU3RyZW5ndGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ29sbGF0aW9uU3RyZW5ndGggJnN0cmVuZ3RoKSAKK3sKKyAgICBzd2l0Y2ggKHN0cmVuZ3RoKQorICAgIHsKKyAgICBjYXNlIFVDT0xfUFJJTUFSWSA6CisgICAgICAgIHJldHVybiBDb2xsYXRvcjo6UFJJTUFSWTsKKyAgICBjYXNlIFVDT0xfU0VDT05EQVJZIDoKKyAgICAgICAgcmV0dXJuIENvbGxhdG9yOjpTRUNPTkRBUlk7CisgICAgY2FzZSBVQ09MX1RFUlRJQVJZIDoKKyAgICAgICAgcmV0dXJuIENvbGxhdG9yOjpURVJUSUFSWTsKKyAgICBjYXNlIFVDT0xfUVVBVEVSTkFSWSA6CisgICAgICAgIHJldHVybiBDb2xsYXRvcjo6UVVBVEVSTkFSWTsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgcmV0dXJuIENvbGxhdG9yOjpJREVOVElDQUw7CisgICAgfQorfQorCitzdGF0aWMgVUNvbGxhdGlvblN0cmVuZ3RoIF9nZXRVQ29sbGF0aW9uU3RyZW5ndGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbGxhdG9yOjpFQ29sbGF0aW9uU3RyZW5ndGggJnN0cmVuZ3RoKSAKK3sKKyAgICBzd2l0Y2ggKHN0cmVuZ3RoKQorICAgIHsKKyAgICBjYXNlIENvbGxhdG9yOjpQUklNQVJZIDoKKyAgICAgICAgcmV0dXJuIFVDT0xfUFJJTUFSWTsKKyAgICBjYXNlIENvbGxhdG9yOjpTRUNPTkRBUlkgOgorICAgICAgICByZXR1cm4gVUNPTF9TRUNPTkRBUlk7CisgICAgY2FzZSBDb2xsYXRvcjo6VEVSVElBUlkgOgorICAgICAgICByZXR1cm4gVUNPTF9URVJUSUFSWTsKKyAgICBjYXNlIENvbGxhdG9yOjpRVUFURVJOQVJZIDoKKyAgICAgICAgcmV0dXJuIFVDT0xfUVVBVEVSTkFSWTsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgcmV0dXJuIFVDT0xfSURFTlRJQ0FMOworICAgIH0KK30KKworCisKKy8qIGNvZGUgZm9yIHNvbWUgdmVyc2lvbiAqLworI2luY2x1ZGUgPGljdWdsdWUvZ2x1cmVuLmg+CisKKyNpbmNsdWRlICJvaWN1LmgiCisKKy8qIEV4cGFuZCBHTFVFX1ZFUiB0byBkZWZpbmUgdGhlIGNsYXNzICovCisjaWZkZWYgR0xVRV9WRVIKK0dMVUVfVkVSKCBJQ1VHTFVFX1ZFUiApCisjZW5kaWYKKworR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IH4gR0xVRV9TWU0oQ29sbGF0b3IpICgpIHsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiB1Y29sX2Nsb3NlIik7CisjZW5kaWYKKyAgICBPSUNVX3Vjb2xfY2xvc2UoX3RoaXMpOworfQorCisjaWYgMAorVV9DRlVOQyBpbnQzMl90IFVfQ0FMTENPTlYKK0dMVUVfU1lNICggZ2x1ZV9jYWxjU29ydEtleSkgKGNvbnN0ICAgIFVDb2xsYXRvciAgICAqY29sbCwKKyAgICAgICAgY29uc3QgICAgVUNoYXIgICAgICAgICpzb3VyY2UsCisgICAgICAgIGludDMyX3QgICAgICAgIHNvdXJjZUxlbmd0aCwKKyAgICAgICAgdWludDhfdCAgICAgICAgKipyZXN1bHQsCisgICAgICAgIHVpbnQzMl90ICAgICAgICByZXN1bHRMZW5ndGgsCisgICAgICAgIFVCb29sIGFsbG9jYXRlU0tCdWZmZXIsCisgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CisKKyNlbmRpZgorCitDb2xsYXRvciAqCitHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogY3JlYXRlIChjb25zdCBMb2NhbGUgJmxvYywgY29uc3QgY2hhciAqLyp2ZXIqLykgeworICAvLyBUT0RPOiBzYXZlICd2ZXInIG9mZi4KKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjaGFyIGxvY0J1ZlsyMDBdOworICAgIGNoYXIga3d2QnVmWzIwMF07CisgICAgaW50MzJfdCBsZW4gPSBsb2MuZ2V0S2V5d29yZFZhbHVlKCJjb2xsYXRpb24iLCBrd3ZCdWYsIDIwMCwgc3RhdHVzKTsKKyAgICBzdHJjcHkobG9jQnVmLGxvYy5nZXRCYXNlTmFtZSgpKTsKKyAgICBpZihsZW4+MCkgeworICAgICAgICBzdHJjYXQobG9jQnVmLCJAY29sbGF0b3I9Iik7CisgICAgICAgIHN0cmNhdChsb2NCdWYsa3d2QnVmKTsKKyAgICB9CisgICAgVUNvbGxhdG9yICogdWMgPSAgT0lDVV91Y29sX29wZW4oIGxvY0J1Ziwgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKSkgcmV0dXJuIE5VTEw7IC8vIFRPRE86IEVSUj8KKyAgICBDb2xsYXRvciAqYyA9ICBuZXcgR0xVRV9TWU0oIENvbGxhdG9yICkgKCB1YyApOworI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIHVjb2xfb3Blbj0lcyAtPj4gJXBcbiIsIGxvY0J1ZiwgYyk7CisjZW5kaWYKKyAgICByZXR1cm4gYzsKK30KKworVU9CSkVDVF9ERUZJTkVfUlRUSV9JTVBMRU1FTlRBVElPTiggR0xVRV9TWU0oIENvbGxhdG9yICkgKQorCitDb2xsYXRvciogR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGNsb25lKCkgY29uc3QgIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiBjbG9uZSAlcCAtPiAiICwgdGhpcyk7CisjZW5kaWYKKyAgICBVQ29sbGF0b3IgKmNsYyA9IE9JQ1VfdWNvbF9zYWZlQ2xvbmUoIF90aGlzLCBOVUxMLCAwLCAmc3RhdHVzKTsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiAuLiBzYWZlY2xvbmUgJXMgX3RoaXMgJXAtPiAlcCAiICwgdV9lcnJvck5hbWUoc3RhdHVzKSwgX3RoaXMsIGNsYyk7CisjZW5kaWYKKyAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKXx8Y2xjPT1OVUxMKSByZXR1cm4gTlVMTDsKKyAgICBDb2xsYXRvciAqYyA9IG5ldyBHTFVFX1NZTSggQ29sbGF0b3IgKSAoIGNsYyApOworI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIC4uIHdyYXAoJXApIC0+ICVwXG4iLCBjbGMsIGMpOworI2VuZGlmCisKKyAgICByZXR1cm4gYzsKK30KKworCitVQ29sbGF0aW9uUmVzdWx0IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBjb21wYXJlKGNvbnN0IFVuaWNvZGVTdHJpbmcmLCBjb25zdCBVbmljb2RlU3RyaW5nJiwgVUVycm9yQ29kZSYpIGNvbnN0ICB7CisgICAgcmV0dXJuIChVQ29sbGF0aW9uUmVzdWx0KTA7Cit9CisKKworVUNvbGxhdGlvblJlc3VsdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogY29tcGFyZShjb25zdCBVbmljb2RlU3RyaW5nJiwgY29uc3QgVW5pY29kZVN0cmluZyYsIGludDMyX3QsIFVFcnJvckNvZGUmKSBjb25zdCAgeworICAgIHJldHVybiAoVUNvbGxhdGlvblJlc3VsdCkwOworfQorCisKK1VDb2xsYXRpb25SZXN1bHQgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGNvbXBhcmUoY29uc3QgVUNoYXIqIHMsIGludDMyX3Qgc2wsIGNvbnN0IFVDaGFyKiBkICwgaW50MzJfdCBkbCwgVUVycm9yQ29kZSYvKmUqLyApIGNvbnN0ICB7CisgICAgcmV0dXJuIE9JQ1VfdWNvbF9zdHJjb2xsKF90aGlzLCBzLCBzbCwgZCwgZGwpOworfQorCisjaW5jbHVkZSAidW5pY29kZS9zb3J0a2V5LmgiCisKK3N0YXRpYyBDb2xsYXRpb25LZXkga2s7CisKK0NvbGxhdGlvbktleSYgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGdldENvbGxhdGlvbktleShjb25zdCBVbmljb2RlU3RyaW5nJiwgQ29sbGF0aW9uS2V5JiwgVUVycm9yQ29kZSYpIGNvbnN0ICB7CisgIC8vI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiBHQ0sgLSBub3RpbXAiKTsKKyAgICAvLyNlbmRpZgorcmV0dXJuIGtrOworfQorCisKK0NvbGxhdGlvbktleSYgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGdldENvbGxhdGlvbktleShjb25zdCBVQ2hhciosIGludDMyX3QsIENvbGxhdGlvbktleSYsIFVFcnJvckNvZGUmKSBjb25zdCAgeworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIEdLSzIgLSBub3RpbXAiKTsKK3JldHVybiBrazsKK30KKworCitpbnQzMl90IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBoYXNoQ29kZSgpIGNvbnN0ICB7CisgICAgcmV0dXJuIDA7Cit9CisKKworY29uc3QgTG9jYWxlIEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBnZXRMb2NhbGUoVUxvY0RhdGFMb2NhbGVUeXBlLCBVRXJyb3JDb2RlJikgY29uc3QgIHsKKyAgICByZXR1cm4gTG9jYWxlKCk7Cit9CisKKworQ29sbGF0b3I6OkVDb2xsYXRpb25TdHJlbmd0aAorIEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBnZXRTdHJlbmd0aCgpIGNvbnN0ICB7CisgICAgcmV0dXJuIF9nZXRFQ29sbGF0aW9uU3RyZW5ndGgoT0lDVV91Y29sX2dldFN0cmVuZ3RoKF90aGlzKSk7Cit9CisKKwordm9pZCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogc2V0U3RyZW5ndGgoRUNvbGxhdGlvblN0cmVuZ3RoIHMpICB7CisgICAgT0lDVV91Y29sX3NldFN0cmVuZ3RoKF90aGlzLCBfZ2V0VUNvbGxhdGlvblN0cmVuZ3RoKHMpKTsKK30KKworCit2b2lkIEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBnZXRWZXJzaW9uKHVpbnQ4X3QqKSBjb25zdCAgeworfQorCisKK3ZvaWQgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IHNldEF0dHJpYnV0ZShVQ29sQXR0cmlidXRlLCBVQ29sQXR0cmlidXRlVmFsdWUsIFVFcnJvckNvZGUmKSAgeworfQorCisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogZ2V0QXR0cmlidXRlKFVDb2xBdHRyaWJ1dGUsIFVFcnJvckNvZGUmKSAgeworcmV0dXJuIChVQ29sQXR0cmlidXRlVmFsdWUpMDsKK30KKworCit1aW50MzJfdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogc2V0VmFyaWFibGVUb3AoY29uc3QgVUNoYXIqLCBpbnQzMl90LCBVRXJyb3JDb2RlJikgIHsKK3JldHVybiAwOworfQorCisKK3VpbnQzMl90IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBzZXRWYXJpYWJsZVRvcChVbmljb2RlU3RyaW5nLCBVRXJyb3JDb2RlJikgIHsKK3JldHVybiAwOworfQorCisKK3ZvaWQgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IHNldFZhcmlhYmxlVG9wKHVpbnQzMl90LCBVRXJyb3JDb2RlJikgIHsKK30KKworCit1aW50MzJfdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogZ2V0VmFyaWFibGVUb3AoVUVycm9yQ29kZSYpIGNvbnN0ICB7CityZXR1cm4gMDsKK30KKworCitDb2xsYXRvciogR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IHNhZmVDbG9uZSgpICB7CisgICAgcmV0dXJuIGNsb25lKCk7Cit9CisKKworaW50MzJfdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogZ2V0U29ydEtleShjb25zdCBVbmljb2RlU3RyaW5nJiBzLCB1aW50OF90KmJ1ZiwgaW50MzJfdCBsZW4pIGNvbnN0ICB7CisjaWYgQ09MTF9GRV9ERUJVRworICBmcHJpbnRmKHN0ZGVyciwgICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiBHU0siKTsKKyNlbmRpZgorICAgIHJldHVybiBnZXRTb3J0S2V5KHMuZ2V0QnVmZmVyKCkscy5sZW5ndGgoKSwgYnVmLCBsZW4pOworfQorCisKKworCitpbnQzMl90IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBnZXRTb3J0S2V5KGNvbnN0IFVDaGFyKnMsIGludDMyX3QgbCwgdWludDhfdCpkLCBpbnQzMl90IGIpIGNvbnN0ICB7CisjaWYgQ09MTF9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIEdLUyIpOworI2VuZGlmCisgICAgcmV0dXJuIE9JQ1VfdWNvbF9nZXRTb3J0S2V5KF90aGlzLCBzLGwsZCxiKTsKK30KKworaW50MzJfdCBHTFVFX1NZTSAoQ29sbGF0b3IgKSA6OiAgaW50ZXJuYWxHZXRTaG9ydERlZmluaXRpb25TdHJpbmcoY29uc3QgY2hhciAqbG9jYWxlLCBjaGFyICpidWZmZXIsIGludDMyX3QgY2FwYWNpdHksIFVFcnJvckNvZGUgJnN0YXR1cykgY29uc3QgeworICBpZihVX0ZBSUxVUkUoc3RhdHVzKSkgcmV0dXJuIDA7CisgIGludDMyX3QgaW50UmVzID0gT0lDVV91Y29sX2dldFNob3J0RGVmaW5pdGlvblN0cmluZyhfdGhpcywgbG9jYWxlLCBidWZmZXIsIGNhcGFjaXR5LCAmc3RhdHVzKTsKKyAgaW50MzJfdCBuZXdSZXMgPSAoaW50UmVzICs9IDcpOyAvKiBfUElDVTM4ICovCisgIGludDMyX3QgcmVtYWluQ2FwID0gY2FwYWNpdHkgLSBuZXdSZXM7CisKKyAgaWYocmVtYWluQ2FwIDwgMCAmJiBVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgIHN0YXR1cyA9IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SOyAvKiByYW4gb3V0IG9mIHNwYWNlIG9uIG91ciB3YXRjaCAqLworICB9CisgIGlmKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgY2hhciAqcCA9IGJ1ZmZlcitzdHJsZW4oYnVmZmVyKTsKKyAgICBzdHJuY2F0KHAsIl9QSUNVIiw1KTsKKyAgICBwICs9NSA7CisgICAgKihwKyspID0gSUNVR0xVRV9WRVJfU1RSWzBdOworICAgICoocCsrKSA9IElDVUdMVUVfVkVSX1NUUlsyXTsKKyAgICBpZihyZW1haW5DYXA+MCkgeworICAgICAgKihwKyspPTA7CisgICAgfQorICB9CisgIHJldHVybiBuZXdSZXM7Cit9CisKKworCisgaW50MzJfdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogY291bnRBdmFpbGFibGUoKSB7CisgICAgaW50MzJfdCBjb3VudCA9ICBPSUNVX3Vjb2xfY291bnRBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gY291bnQ7CisgfQorIAorIAoraW50MzJfdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogYXBwZW5kQXZhaWxhYmxlKFVuaWNvZGVTdHJpbmcqIHN0cnMsIGludDMyX3QgaSwgaW50MzJfdCAvKmNvdW50Ki8pIHsKKyAgIGludCBhdmFpbCA9IE9JQ1VfdWNvbF9jb3VudEF2YWlsYWJsZSgpOworICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICBPSUNVX3VfaW5pdCgmc3RhdHVzKTsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiBhdmFpbCAlZCAtIGluaXQgJXNcbiIsIGF2YWlsLCB1X2Vycm9yTmFtZShzdGF0dXMpKTsKKyNlbmRpZiAgIAorICAgIGZvcihpbnQgaj0wO2o8YXZhaWw7aisrKSB7CisgICAgICAgICBzdHJzW2kral0uYXBwZW5kKE9JQ1VfdWNvbF9nZXRBdmFpbGFibGUoaikpOworICAgICAgICAgc3Ryc1tpK2pdLmFwcGVuZCgiQHNwPWljdSIpOworICAgICAgICAgc3Ryc1tpK2pdLmFwcGVuZCggSUNVR0xVRV9WRVJfU1RSWzBdICk7ICAvLyBYX3kKKyAgICAgICAgIHN0cnNbaStqXS5hcHBlbmQoIElDVUdMVUVfVkVSX1NUUlsyXSApOyAgLy8geF9ZCisjaWYgQ09MTF9GRV9ERUJVRworICAgICAgICAgeyAKKyAgICAgICAgICAgIGNoYXIgZm9vWzk5OV07CisgICAgICAgICAgICBjb25zdCBVQ2hhciAqc3MgPSBzdHJzW2kral0uZ2V0VGVybWluYXRlZEJ1ZmZlcigpOworICAgICAgICAgICAgdV9hdXN0cmNweShmb28sIHNzKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICAiVkNGICIgSUNVR0xVRV9WRVJfU1RSICIgYXBwZW5kaW5nIFslZCslZD0lZF0gPDwlcz4+XG4iLCBpLCBqLCBpK2osIGZvbyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gT0lDVV91Y29sX2NvdW50QXZhaWxhYmxlKCk7CisgfQorCisKKworI2Vsc2UKKy8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGhlIGZvbGxvd2luZyBjb2RlIHJ1bnMgaW5zaWRlIHRoZSAncHJvdmlkZXInIHZlcnNpb24gKGkuZS4gY3VycmVudCBJQ1UpID09PT09PT09PT0gKiovCisKKy8vIGRlZmluZSBDb2xsYXRvcl9YWAorI2luY2x1ZGUgImljdWdsdWUvZ2x2ZXIuaCIKKworLy8gZ2VuZXJhdGUgbGlzdCBvZiB2ZXJzaW9ucworc3RhdGljCisjaW5jbHVkZSA8aWN1Z2x1ZS9mZV92ZXJsaXN0Lmg+CisKK2NsYXNzIFZlcnNpb25Db2xsYXRvckZhY3RvcnkgOiBwdWJsaWMgQ29sbGF0b3JGYWN0b3J5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCBDb2xsYXRvciAqY3JlYXRlQ29sbGF0b3IoY29uc3QgTG9jYWxlICZsb2MpOworICB2aXJ0dWFsIGNvbnN0IFVuaWNvZGVTdHJpbmcgKmdldFN1cHBvcnRlZElEcyhpbnQzMl90ICZjb3VudCwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgdmlydHVhbCB2b2lkKiBnZXREeW5hbWljQ2xhc3NJRCgpIGNvbnN0OyAKKyAgc3RhdGljIHZvaWQqIGdldFN0YXRpY0NsYXNzSUQoKSA7IAorfTsKKworVU9CSkVDVF9ERUZJTkVfUlRUSV9JTVBMRU1FTlRBVElPTiggVmVyc2lvbkNvbGxhdG9yRmFjdG9yeSApCisKK0NvbGxhdG9yICpWZXJzaW9uQ29sbGF0b3JGYWN0b3J5OjpjcmVhdGVDb2xsYXRvcihjb25zdCBMb2NhbGUgJmxvYykgeworICAgIC8vIHB1bGwgb2ZmIHByb3ZpZGVyICMKKyAgICBjaGFyIHByb3ZpZGVyWzIwMF07CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisjaWYgQ09MTF9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRjpDQyAlc1xuIiwgbG9jLmdldE5hbWUoKSk7CisjZW5kaWYKKyAgICBpbnQzMl90IGxlbiA9IGxvYy5nZXRLZXl3b3JkVmFsdWUoInNwIiwgcHJvdmlkZXIsIDIwMCwgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKXx8bGVuPT0wKSByZXR1cm4gTlVMTDsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICAiVkNGOktXVj4gJXMvJWRcbiIsIHVfZXJyb3JOYW1lKHN0YXR1cyksIGxlbik7CisjZW5kaWYKKyAgICBwcm92aWRlcltsZW5dPTA7CisjaWYgQ09MTF9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRjpLV1YgJXNcbiIsIHByb3ZpZGVyKTsKKyNlbmRpZgorICAgIGlmKHN0cm5jbXAocHJvdmlkZXIsImljdSIsMykpIHJldHVybiBOVUxMOworICAgIGNvbnN0IGNoYXIgKmljdXZlcj1wcm92aWRlciszOworI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0Y6SUNVViAlc1xuIiwgaWN1dmVyKTsKKyNlbmRpZgorICAgIAorI2lmIGRlZmluZWQoR0xVRV9WRVIpCisjdW5kZWYgR0xVRV9WRVIKKyNlbmRpZgorI2RlZmluZSBHTFVFX1ZFUih4KSAvKnByaW50ZigiJWMvJWN8JWMvJWNcbiIsIGljdXZlclswXSwoI3gpWzBdLGljdXZlclsxXSwoI3gpWzJdKTsqLyAgaWYoaWN1dmVyWzBdPT0gKCN4KVswXSAmJiBpY3V2ZXJbMV09PSgjeClbMl0pIHsgQ29sbGF0b3IgKmMgPSBnbHVlICMjIENvbGxhdG9yICMjIHggOjogY3JlYXRlKGxvYywgaWN1dmVyKTsgLypmcHJpbnRmKHN0ZGVyciwgIlZDRjo6Q0MgJXMgLT4gJXBcbiIsIGxvYy5nZXROYW1lKCksIGMpOyovIHJldHVybiBjOyB9CisjaW5jbHVkZSAiaWN1Z2x1ZS9nbHZlci5oIgorI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0Y6Q0MgJXMgZmFpbGVkXG4iLCBsb2MuZ2V0TmFtZSgpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcgKmdMb2NhbGVzID0gTlVMTDsKK3N0YXRpYyAgaW50MzJfdCBnTG9jQ291bnQgPSAwOyAKKworY29uc3QgVW5pY29kZVN0cmluZworKlZlcnNpb25Db2xsYXRvckZhY3Rvcnk6OmdldFN1cHBvcnRlZElEcyhpbnQzMl90ICZjb3VudCwgVUVycm9yQ29kZSAmLypzdGF0dXMqLykgeworICBpZihnTG9jYWxlcz09TlVMTCkgeworICAgIGNvdW50ID0gMDsKKyAgICAKKyAgICAKKyAgICAvKiBnYXRoZXIgY291bnRzICovCisjaWYgZGVmaW5lZChHTFVFX1ZFUikKKyN1bmRlZiBHTFVFX1ZFUgorI2VuZGlmCisjZGVmaW5lIEdMVUVfVkVSKHgpIGNvdW50ICs9IGdsdWUgIyMgQ29sbGF0b3IgIyMgeCA6OiBjb3VudEF2YWlsYWJsZSgpOworI2luY2x1ZGUgImljdWdsdWUvZ2x2ZXIuaCIKKworI2lmIENPTExfRkVfREVCVUcKKyAgICBwcmludGYoIlZDRjogY291bnQ9JWRcbiIsIGNvdW50KTsKKyNlbmRpZgorICAgIFVuaWNvZGVTdHJpbmcgKnN0cnMgPSBuZXcgIFVuaWNvZGVTdHJpbmdbY291bnRdOworICAgIGludDMyX3QgaSA9IDA7CisKKyNpZiBkZWZpbmVkKEdMVUVfVkVSKQorI3VuZGVmIEdMVUVfVkVSCisjZW5kaWYKKyNkZWZpbmUgR0xVRV9WRVIoeCkgaSArPSBnbHVlICMjIENvbGxhdG9yICMjIHggOjogYXBwZW5kQXZhaWxhYmxlKHN0cnMsIGksIGNvdW50KTsKKyNpbmNsdWRlICJpY3VnbHVlL2dsdmVyLmgiCisKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgcHJpbnRmKCJWQ0Y6IGFwcGVuZGVkIGNvdW50PSVkXG4iLCBjb3VudCk7CisjZW5kaWYKKworICAgIGdMb2NDb3VudCA9IGNvdW50OworICAgIGdMb2NhbGVzID0gc3RyczsKKyAgfQorICBjb3VudCA9IGdMb2NDb3VudDsKKyAgcmV0dXJuIGdMb2NhbGVzOworfQorCisKKy8qIFBsdWdpbiBDb2RlICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdXZlcnNpb24uaD4KKworc3RhdGljIFVSZWdpc3RyeUtleSByayA9IE5VTEw7CisKK3ZvaWQgY29sbF9wcm92aWRlcl9yZWdpc3RlcihVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgcmsgPSBDb2xsYXRvcjo6cmVnaXN0ZXJGYWN0b3J5KG5ldyBWZXJzaW9uQ29sbGF0b3JGYWN0b3J5KCksIHN0YXR1cyk7Cit9CisKK3ZvaWQgY29sbF9wcm92aWRlcl91bnJlZ2lzdGVyKFVFcnJvckNvZGUgJnN0YXR1cykgeworICBDb2xsYXRvcjo6dW5yZWdpc3Rlcihyaywgc3RhdHVzKTsKK30KKworLyogUGx1Z2luLSBvbmx5IElDVSA0LjQrICovCisjaWYgKFVfSUNVX1ZFUlNJT05fTUFKT1JfTlVNID4gNCkgfHwgKChVX0lDVV9WRVJTSU9OX01BSk9SX05VTT09NCkmJihVX0lDVV9WRVJTSU9OX01JTk9SX05VTT4zKSkKKyNpbmNsdWRlICJ1bmljb2RlL2ljdXBsdWcuaCIKKworVV9DQVBJIFVQbHVnVG9rZW5SZXR1cm4gVV9FWFBPUlQyIGNvbGxfcHJvdmlkZXJfcGx1Z2luIChVUGx1Z0RhdGEgKmRhdGEsIFVQbHVnUmVhc29uIHJlYXNvbiwgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworVV9DQVBJIFVQbHVnVG9rZW5SZXR1cm4gVV9FWFBPUlQyIGNvbGxfcHJvdmlkZXJfcGx1Z2luIChVUGx1Z0RhdGEgKmRhdGEsIFVQbHVnUmVhc29uIHJlYXNvbiwgVUVycm9yQ29kZSAqc3RhdHVzKQoreworICBzd2l0Y2gocmVhc29uKSB7CisgIGNhc2UgVVBMVUdfUkVBU09OX1FVRVJZOgorICAgIHVwbHVnX3NldFBsdWdOYW1lKGRhdGEsICJDb2xsYXRpb24gUHJvdmlkZXIgUGx1Z2luIik7CisgICAgdXBsdWdfc2V0UGx1Z0xldmVsKGRhdGEsIFVQTFVHX0xFVkVMX0hJR0gpOworICAgIGJyZWFrOworICBjYXNlIFVQTFVHX1JFQVNPTl9MT0FEOgorICAgIGNvbGxfcHJvdmlkZXJfcmVnaXN0ZXIoKnN0YXR1cyk7CisgICAgYnJlYWs7CisgIGNhc2UgVVBMVUdfUkVBU09OX1VOTE9BRDoKKyAgICBjb2xsX3Byb3ZpZGVyX3VucmVnaXN0ZXIoKnN0YXR1cyk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7IC8qIG5vdCBoYW5kbGVkICovCisgIH0KKyAgcmV0dXJuIFVQTFVHX1RPS0VOOworfQorI2Vsc2UKKworLyogCisgICBOb3RlOiB0aGlzIElDVSB2ZXJzaW9uIG11c3QgZXhwbGljaXRseSBjYWxsICdjb2xsX3Byb3ZpZGVyX3BsdWdpbicKKyovCisKKyNlbmRpZiAvKiBwbHVnaW4gKi8KKworI2VuZGlmIC8qIHByb3ZpZGVyIHNpZGUgKHZzIHRhcmdldCkgKi8KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9kYXRlX2ZlLmNwcCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9kYXRlX2ZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQyYjIyCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2RhdGVfZmUuY3BwCkBAIC0wLDAgKzEsMzU5IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIERBVEVfRkVfREVCVUcKKyNkZWZpbmUgREFURV9GRV9ERUJVRyAwCisjZW5kaWYKKworI2luY2x1ZGUgPGljdWdsdWUvaWN1Z2x1ZS5oPgorI2luY2x1ZGUgInVuaWNvZGUvdWRhdC5oIgorLy8jaW5jbHVkZSA8dW5pY29kZS90Ymxjb2xsLmg+CisjaW5jbHVkZSAidW5pY29kZS9kYXRlZm10LmgiCisjaW5jbHVkZSAidW5pY29kZS9zbXBkdGZtdC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZS9ncmVnb2NhbC5oIgorCisKKworLyoqCisgKiBNYWNybyB0byBkZWZpbmUgdGhlIENvbGxhdG9yX2dsdWVfNF8yIGNsYXNzIAorICovCisjaWZkZWYgR0xVRV9WRVIKKyNlcnJvciBHTFVFX1ZFUiBpcyBkZWZpbmVkCisjZW5kaWYKKworI2RlZmluZSBHTFVFX1ZFUih4KSBjbGFzcyBHTFVFX1NZTV9WKCBEYXRlRm9ybWF0LCB4ICkgOiBwdWJsaWMgRGF0ZUZvcm1hdCB7ICBcCisgIHB1YmxpYzogIHN0YXRpYyBEYXRlRm9ybWF0ICpjcmVhdGUoVURhdGVGb3JtYXRTdHlsZSAgdGltZVN0eWxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVURhdGVGb3JtYXRTdHlsZSAgZGF0ZVN0eWxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmxvY2FsZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICp0eklELCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgdHpJRExlbmd0aCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICpwYXR0ZXJuLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgIHBhdHRlcm5MZW5ndGgsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAqc3RhdHVzLCBjb25zdCBMb2NhbGUgJmxvYywgY29uc3QgY2hhciAqdmVyKTsgXAorICBwcml2YXRlOiBVRGF0ZUZvcm1hdCAqX3RoaXM7IEdMVUVfU1lNX1YoIERhdGVGb3JtYXQsIHggKSAoIFVEYXRlRm9ybWF0KiB0biApOyBcCisgICAgdmlydHVhbCB+IEdMVUVfU1lNX1YgKCBEYXRlRm9ybWF0LCB4KSAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQqIGdldER5bmFtaWNDbGFzc0lEKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCogZ2V0U3RhdGljQ2xhc3NJRCgpIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIFVuaWNvZGVTdHJpbmcmIGZvcm1hdCggIENhbGVuZGFyJiBjYWwsIFVuaWNvZGVTdHJpbmcmIGFwcGVuZFRvLCBGaWVsZFBvc2l0aW9uJiBwb3MpIGNvbnN0OyBcCisgICAgdmlydHVhbCB2b2lkIHBhcnNlKCBjb25zdCBVbmljb2RlU3RyaW5nJiB0ZXh0LCBDYWxlbmRhciYgY2FsLCBQYXJzZVBvc2l0aW9uJiBwb3MpIGNvbnN0OyBcCisgICAgdmlydHVhbCBGb3JtYXQqIGNsb25lKHZvaWQpIGNvbnN0OyBcCisgIHB1YmxpYzogc3RhdGljIGludDMyX3QgY291bnRBdmFpbGFibGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitwdWJsaWM6IHN0YXRpYyBpbnQzMl90IGFwcGVuZEF2YWlsYWJsZShVbmljb2RlU3RyaW5nKiBzdHJzLCBpbnQzMl90IGksIGludDMyX3QgY291bnQpOyBcCisgIH07IFwKKworCisKKy8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGhlIGZvbGxvd2luZyBjb2RlIHJ1bnMgaW5zaWRlIHRoZSAndGFyZ2V0JyB2ZXJzaW9uIChpLmUuIG9sZCBJQ1UpID09PT09PT09PT0gKiovCisjaWYgZGVmaW5lZCAoIElDVUdMVUVfVkVSICkKKworCisKKy8qIGNvZGUgZm9yIHNvbWUgdmVyc2lvbiAqLworI2luY2x1ZGUgPGljdWdsdWUvZ2x1cmVuLmg+CisjaW5jbHVkZSAib2ljdS5oIgorCisjaWZkZWYgR0xVRV9WRVIKK0dMVUVfVkVSKCBJQ1VHTFVFX1ZFUiApCisjZW5kaWYKKworR0xVRV9TWU0gKERhdGVGb3JtYXQgKSA6OiBHTFVFX1NZTShEYXRlRm9ybWF0KSAoIFVEYXRlRm9ybWF0KiB0bikgOgorIF90aGlzKHRuKQoreyAKKworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgYWRvcHRDYWxlbmRhcihuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoc3RhdHVzKSk7Cit9CisKK0dMVUVfU1lNICggRGF0ZUZvcm1hdCApIDo6IH4gR0xVRV9TWU0oRGF0ZUZvcm1hdCkgKCkgeworI2lmIERBVEVfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIHVkYXRfY2xvc2UiKTsKKyNlbmRpZgorICAgIE9JQ1VfdWRhdF9jbG9zZShfdGhpcyk7Cit9CisKK0RhdGVGb3JtYXQgKgorR0xVRV9TWU0gKCBEYXRlRm9ybWF0ICkgOjogY3JlYXRlKFVEYXRlRm9ybWF0U3R5bGUgIHRpbWVTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRGF0ZUZvcm1hdFN0eWxlICBkYXRlU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgICAqdHpJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICB0eklETGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICpwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgIHBhdHRlcm5MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgKnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhbGUgJmxvYywgY29uc3QgY2hhciAqLyp2ZXIqLykgeworICAvLyBUT0RPOiBzYXZlIHZlcnNpb24KKyAgY2hhciBsb2NCdWZbMjAwXTsKKyAgY2hhciBrd3ZCdWZbMjAwXTsKKyAgVURhdGVGb3JtYXQgKiB1YyA9ICBPSUNVX3VkYXRfb3BlbiggdGltZVN0eWxlLCBkYXRlU3R5bGUsIGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHpJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHpJRExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpIHJldHVybiBOVUxMOyAvLyBUT0RPOiBFUlI/CisgICAgRGF0ZUZvcm1hdCAqYyA9ICBuZXcgR0xVRV9TWU0oIERhdGVGb3JtYXQgKSAoIHVjICk7CisjaWYgREFURV9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAiVkNGICIgSUNVR0xVRV9WRVJfU1RSICIgdWRhdF9vcGVuPSVzIC0+PiAlcFxuIiwgbG9jLmdldE5hbWUoKSwgKHZvaWQqKWMpOworI2VuZGlmCisgICAgcmV0dXJuIGM7Cit9CisKK1VuaWNvZGVTdHJpbmcmIEdMVUVfU1lNIChEYXRlRm9ybWF0ICkgOjogZm9ybWF0KCAgQ2FsZW5kYXImIGNhbCwgVW5pY29kZVN0cmluZyYgYXBwZW5kVG8sIEZpZWxkUG9zaXRpb24mIHBvcykgY29uc3QKK3sKKyNpZiBEQVRFX0ZFX0RFQlVHCisgIGZwcmludGYoc3RkZXJyLCAiVkNGICIgSUNVR0xVRV9WRVJfU1RSICIgLSBmb3JtYXR0aW5nLiBcbiIpOworI2VuZGlmCisgIGludDMyX3QgbGVuID0gYXBwZW5kVG8ubGVuZ3RoKCk7CisKKyAgVUNoYXIganVua1syMDBdOworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworICBVRmllbGRQb3NpdGlvbiBwb3MyOworCisgIGludDMyX3QgbmxlbiA9IE9JQ1VfdWRhdF9mb3JtYXQoX3RoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsLmdldFRpbWUoc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKworICAvLyB0b2RvOiB1c2UgcG9zMgorICBwb3Muc2V0QmVnaW5JbmRleChsZW4pOworICBwb3Muc2V0RW5kSW5kZXgobGVuICs9IG5sZW4pOworICBhcHBlbmRUby5hcHBlbmQoanVuaywgbmxlbik7CisKKyAgcmV0dXJuIGFwcGVuZFRvOworfQorCit2b2lkICBHTFVFX1NZTSAoRGF0ZUZvcm1hdCApIDo6IHBhcnNlKCBjb25zdCBVbmljb2RlU3RyaW5nJiB0ZXh0LCBDYWxlbmRhciYgY2FsLCBQYXJzZVBvc2l0aW9uJiBwb3MpIGNvbnN0Cit7CisgIHJldHVybjsKK30KKworRm9ybWF0KiAgR0xVRV9TWU0gKERhdGVGb3JtYXQgKSA6OiBjbG9uZSh2b2lkKSBjb25zdAoreworICByZXR1cm4gTlVMTDsKK30KKworCisKKyBpbnQzMl90IEdMVUVfU1lNICggRGF0ZUZvcm1hdCApIDo6IGNvdW50QXZhaWxhYmxlKCkgeworICAgIGludDMyX3QgY291bnQgPSAgT0lDVV91ZGF0X2NvdW50QXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIGNvdW50OworIH0KKyAKKyAKK2ludDMyX3QgR0xVRV9TWU0gKCBEYXRlRm9ybWF0ICkgOjogYXBwZW5kQXZhaWxhYmxlKFVuaWNvZGVTdHJpbmcqIHN0cnMsIGludDMyX3QgaSwgaW50MzJfdCAvKmNvdW50Ki8pIHsKKyAgIGludCBhdmFpbCA9IE9JQ1VfdWRhdF9jb3VudEF2YWlsYWJsZSgpOworICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICBPSUNVX3VfaW5pdCgmc3RhdHVzKTsKKyNpZiBEQVRFX0ZFX0RFQlVHCisgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiBhdmFpbCAlZCAtIGluaXQgJXNcbiIsIGF2YWlsLCB1X2Vycm9yTmFtZShzdGF0dXMpKTsKKyNlbmRpZiAgIAorICAgIGZvcihpbnQgaj0wO2o8YXZhaWw7aisrKSB7CisgICAgICAgICBzdHJzW2kral0uYXBwZW5kKE9JQ1VfdWRhdF9nZXRBdmFpbGFibGUoaikpOworICAgICAgICAgc3Ryc1tpK2pdLmFwcGVuZCgiQHNwPWljdSIpOworICAgICAgICAgc3Ryc1tpK2pdLmFwcGVuZCggSUNVR0xVRV9WRVJfU1RSWzBdICk7ICAvLyBYX3kKKyAgICAgICAgIHN0cnNbaStqXS5hcHBlbmQoIElDVUdMVUVfVkVSX1NUUlsyXSApOyAgLy8geF9ZCisjaWYgREFURV9GRV9ERUJVRworICAgICAgICAgeyAKKyAgICAgICAgICAgIGNoYXIgZm9vWzk5OV07CisgICAgICAgICAgICBjb25zdCBVQ2hhciAqc3MgPSBzdHJzW2kral0uZ2V0VGVybWluYXRlZEJ1ZmZlcigpOworICAgICAgICAgICAgdV9hdXN0cmNweShmb28sIHNzKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICAiVkNGICIgSUNVR0xVRV9WRVJfU1RSICIgYXBwZW5kaW5nIFslZCslZD0lZF0gPDwlcz4+XG4iLCBpLCBqLCBpK2osIGZvbyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gT0lDVV91Y29sX2NvdW50QXZhaWxhYmxlKCk7CisgfQorCitVT0JKRUNUX0RFRklORV9SVFRJX0lNUExFTUVOVEFUSU9OKCBHTFVFX1NZTSggRGF0ZUZvcm1hdCApICkKKworCisKKworI2Vsc2UKKy8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGhlIGZvbGxvd2luZyBjb2RlIHJ1bnMgaW5zaWRlIHRoZSAncHJvdmlkZXInIHZlcnNpb24gKGkuZS4gY3VycmVudCBJQ1UpID09PT09PT09PT0gKiovCisKKy8vIGRlZmluZSBDb2xsYXRvcl9YWAorI2luY2x1ZGUgImljdWdsdWUvZ2x2ZXIuaCIKKworLy8gZ2VuZXJhdGUgbGlzdCBvZiB2ZXJzaW9ucworc3RhdGljCisjaW5jbHVkZSA8aWN1Z2x1ZS9mZV92ZXJsaXN0Lmg+CisKK2NsYXNzIFZlcnNpb25EYXRlRm9ybWF0RmFjdG9yeSA6IHB1YmxpYyBVT2JqZWN0ICB7CitwdWJsaWM6CisgIHZpcnR1YWwgRGF0ZUZvcm1hdCAqY3JlYXRlRm9ybWF0KFVEYXRlRm9ybWF0U3R5bGUgIHRpbWVTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVURhdGVGb3JtYXRTdHlsZSAgZGF0ZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqbG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgICAqdHpJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgdHpJRExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICAgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgIHBhdHRlcm5MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAgICpzdGF0dXMpOworICB2aXJ0dWFsIGNvbnN0IFVuaWNvZGVTdHJpbmcgKmdldFN1cHBvcnRlZElEcyhpbnQzMl90ICZjb3VudCwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgdmlydHVhbCB2b2lkKiBnZXREeW5hbWljQ2xhc3NJRCgpIGNvbnN0OyAKKyAgc3RhdGljIHZvaWQqIGdldFN0YXRpY0NsYXNzSUQoKSA7IAorfTsKKworVU9CSkVDVF9ERUZJTkVfUlRUSV9JTVBMRU1FTlRBVElPTiggVmVyc2lvbkRhdGVGb3JtYXRGYWN0b3J5ICkKKworRGF0ZUZvcm1hdCAqVmVyc2lvbkRhdGVGb3JtYXRGYWN0b3J5OjpjcmVhdGVGb3JtYXQoVURhdGVGb3JtYXRTdHlsZSAgdGltZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVEYXRlRm9ybWF0U3R5bGUgIGRhdGVTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqbG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICp0eklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgIHR6SURMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICAgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgcGF0dGVybkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAqc3RhdHVzKSB7CisgICAgTG9jYWxlIGxvYyhsb2NhbGUpOworICAgIC8vIHB1bGwgb2ZmIHByb3ZpZGVyICMKKyAgICBjaGFyIHByb3ZpZGVyWzIwMF07CisjaWYgREFURV9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRjpDQyAlc1xuIiwgbG9jLmdldE5hbWUoKSk7CisjZW5kaWYKKyAgICBpbnQzMl90IGxlbiA9IGxvYy5nZXRLZXl3b3JkVmFsdWUoInNwIiwgcHJvdmlkZXIsIDIwMCwgKnN0YXR1cyk7CisgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpfHxsZW49PTApIHJldHVybiBOVUxMOworI2lmIERBVEVfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0Y6S1dWPiAlcy8lZFxuIiwgdV9lcnJvck5hbWUoKnN0YXR1cyksIGxlbik7CisjZW5kaWYKKyAgICBwcm92aWRlcltsZW5dPTA7CisjaWYgREFURV9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRjpLV1YgJXNcbiIsIHByb3ZpZGVyKTsKKyNlbmRpZgorICAgIGlmKHN0cm5jbXAocHJvdmlkZXIsImljdSIsMykpIHJldHVybiBOVUxMOworICAgIGNvbnN0IGNoYXIgKmljdXZlcj1wcm92aWRlciszOworI2lmIERBVEVfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0Y6SUNVViAlc1xuIiwgaWN1dmVyKTsKKyNlbmRpZgorICAgIAorI2lmIGRlZmluZWQoR0xVRV9WRVIpCisjdW5kZWYgR0xVRV9WRVIKKyNlbmRpZgorI2RlZmluZSBHTFVFX1ZFUih4KSAvKnByaW50ZigiJWMvJWN8JWMvJWNcbiIsIGljdXZlclswXSwoI3gpWzBdLGljdXZlclsxXSwoI3gpWzJdKTsqLyAgaWYoaWN1dmVyWzBdPT0gKCN4KVswXSAmJiBpY3V2ZXJbMV09PSgjeClbMl0pIHsgRGF0ZUZvcm1hdCAqYyA9IGdsdWUgIyMgRGF0ZUZvcm1hdCAjIyB4IDo6IGNyZWF0ZSh0aW1lU3R5bGUsZGF0ZVN0eWxlLGxvY2FsZSx0eklELHR6SURMZW5ndGgscGF0dGVybixwYXR0ZXJuTGVuZ3RoLHN0YXR1cyxsb2MsaWN1dmVyKTsgLypmcHJpbnRmKHN0ZGVyciwgIlZDRjo6Q0MgJXMgLT4gJXBcbiIsIGxvYy5nZXROYW1lKCksIGMpOyovIHJldHVybiBjOyB9CisjaW5jbHVkZSAiaWN1Z2x1ZS9nbHZlci5oIgorI2lmIERBVEVfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0Y6Q0MgJXMgZmFpbGVkXG4iLCBsb2MuZ2V0TmFtZSgpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcgKmdMb2NhbGVzRGF0ZSA9IE5VTEw7CitzdGF0aWMgIGludDMyX3QgZ0xvY0NvdW50RGF0ZSA9IDA7IAorCisKK2NvbnN0IFVuaWNvZGVTdHJpbmcKKypWZXJzaW9uRGF0ZUZvcm1hdEZhY3Rvcnk6OmdldFN1cHBvcnRlZElEcyhpbnQzMl90ICZjb3VudCwgVUVycm9yQ29kZSAmLypzdGF0dXMqLykgeworICBpZihnTG9jYWxlc0RhdGU9PU5VTEwpIHsKKyAgICBjb3VudCA9IDA7CisgICAgCisgICAgCisgICAgLyogZ2F0aGVyIGNvdW50cyAqLworCisjaWYgZGVmaW5lZChHTFVFX1ZFUikKKyN1bmRlZiBHTFVFX1ZFUgorI2VuZGlmCisjZGVmaW5lIEdMVUVfVkVSKHgpIGNvdW50ICs9IGdsdWUgIyMgRGF0ZUZvcm1hdCAjIyB4IDo6IGNvdW50QXZhaWxhYmxlKCk7CisjaW5jbHVkZSAiaWN1Z2x1ZS9nbHZlci5oIgorCisjaWYgREFURV9GRV9ERUJVRworICAgIHByaW50ZigiVkNGOiBjb3VudD0lZFxuIiwgY291bnQpOworI2VuZGlmCisgICAgVW5pY29kZVN0cmluZyAqc3RycyA9IG5ldyAgVW5pY29kZVN0cmluZ1tjb3VudF07CisgICAgaW50MzJfdCBpID0gMDsKKworI2lmIGRlZmluZWQoR0xVRV9WRVIpCisjdW5kZWYgR0xVRV9WRVIKKyNlbmRpZgorI2RlZmluZSBHTFVFX1ZFUih4KSBpICs9IGdsdWUgIyMgRGF0ZUZvcm1hdCAjIyB4IDo6IGFwcGVuZEF2YWlsYWJsZShzdHJzLCBpLCBjb3VudCk7CisjaW5jbHVkZSAiaWN1Z2x1ZS9nbHZlci5oIgorCisjaWYgREFURV9GRV9ERUJVRworICAgIHByaW50ZigiVkNGOiBhcHBlbmRlZCBjb3VudD0lZFxuIiwgY291bnQpOworI2VuZGlmCisKKyAgICBnTG9jQ291bnREYXRlID0gY291bnQ7CisgICAgZ0xvY2FsZXNEYXRlID0gc3RyczsKKyAgfQorICBjb3VudCA9IGdMb2NDb3VudERhdGU7CisgIHJldHVybiBnTG9jYWxlc0RhdGU7Cit9CisKKworLyogUGx1Z2luIENvZGUgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pY29kZS91dmVyc2lvbi5oPgorCisvL3N0YXRpYyBVUmVnaXN0cnlLZXkgcmtkYXRlID0gTlVMTDsKKworVmVyc2lvbkRhdGVGb3JtYXRGYWN0b3J5IHZkZjsKKworZXh0ZXJuICJDIiBVRGF0ZUZvcm1hdCAqdmVyc2lvbkRhdGVGb3JtYXRPcGVuZXIoVURhdGVGb3JtYXRTdHlsZSAgdGltZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVEYXRlRm9ybWF0U3R5bGUgIGRhdGVTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAgICAqbG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICp0eklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgIHR6SURMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICAgKnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgcGF0dGVybkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAqc3RhdHVzKSB7CisgIERhdGVGb3JtYXQgKmRmID0gdmRmLmNyZWF0ZUZvcm1hdCh0aW1lU3R5bGUsZGF0ZVN0eWxlLGxvY2FsZSx0eklELHR6SURMZW5ndGgscGF0dGVybixwYXR0ZXJuTGVuZ3RoLHN0YXR1cyk7CisgIC8vIHByaW50ZigiSGV5ISBJIGdvdDogJXMgLT4gJXBcbiIsIGxvY2FsZSwgZGYpOworICByZXR1cm4gKFVEYXRlRm9ybWF0KilkZjsKK30KKwordm9pZCBkYXRlX3Byb3ZpZGVyX3JlZ2lzdGVyKFVFcnJvckNvZGUgJnN0YXR1cykgeworICB1ZGF0X3JlZ2lzdGVyT3BlbmVyKHZlcnNpb25EYXRlRm9ybWF0T3BlbmVyLCAmc3RhdHVzKTsKKyAgLy8gICBya2RhdGUgPSBEYXRlRm9ybWF0OjpyZWdpc3RlckZhY3RvcnkobmV3IFZlcnNpb25EYXRlRm9ybWF0RmFjdG9yeSgpLCBzdGF0dXMpOworfQorCit2b2lkIGRhdGVfcHJvdmlkZXJfdW5yZWdpc3RlcihVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgdWRhdF91bnJlZ2lzdGVyT3BlbmVyKHZlcnNpb25EYXRlRm9ybWF0T3BlbmVyLCAmc3RhdHVzKTsKK30KKworLyogUGx1Z2luLSBvbmx5IElDVSA0LjQrICovCisjaWYgKFVfSUNVX1ZFUlNJT05fTUFKT1JfTlVNID4gNCkgfHwgKChVX0lDVV9WRVJTSU9OX01BSk9SX05VTT09NCkmJihVX0lDVV9WRVJTSU9OX01JTk9SX05VTT4zKSkKKyNpbmNsdWRlICJ1bmljb2RlL2ljdXBsdWcuaCIKKworVV9DQVBJIFVQbHVnVG9rZW5SZXR1cm4gVV9FWFBPUlQyIGRhdGVfcHJvdmlkZXJfcGx1Z2luIChVUGx1Z0RhdGEgKmRhdGEsIFVQbHVnUmVhc29uIHJlYXNvbiwgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworVV9DQVBJIFVQbHVnVG9rZW5SZXR1cm4gVV9FWFBPUlQyIGRhdGVfcHJvdmlkZXJfcGx1Z2luIChVUGx1Z0RhdGEgKmRhdGEsIFVQbHVnUmVhc29uIHJlYXNvbiwgVUVycm9yQ29kZSAqc3RhdHVzKQoreworICBzd2l0Y2gocmVhc29uKSB7CisgIGNhc2UgVVBMVUdfUkVBU09OX1FVRVJZOgorICAgIHVwbHVnX3NldFBsdWdOYW1lKGRhdGEsICJEYXRlIFByb3ZpZGVyIFBsdWdpbiIpOworICAgIHVwbHVnX3NldFBsdWdMZXZlbChkYXRhLCBVUExVR19MRVZFTF9ISUdIKTsKKyAgICBicmVhazsKKyAgY2FzZSBVUExVR19SRUFTT05fTE9BRDoKKyAgICBkYXRlX3Byb3ZpZGVyX3JlZ2lzdGVyKCpzdGF0dXMpOworICAgIGJyZWFrOworICBjYXNlIFVQTFVHX1JFQVNPTl9VTkxPQUQ6CisgICAgZGF0ZV9wcm92aWRlcl91bnJlZ2lzdGVyKCpzdGF0dXMpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOyAvKiBub3QgaGFuZGxlZCAqLworICB9CisgIHJldHVybiBVUExVR19UT0tFTjsKK30KKyNlbHNlCisKKy8qIAorICAgTm90ZTogdGhpcyBJQ1UgdmVyc2lvbiBtdXN0IGV4cGxpY2l0bHkgY2FsbCAnZGF0ZV9wcm92aWRlcl9wbHVnaW4nCisqLworCisjZW5kaWYgLyogcGx1Z2luICovCisKKyNlbmRpZiAvKiBwcm92aWRlciBzaWRlICh2cyB0YXJnZXQpICovCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvZ2x1cmVuLWJvdHRvbS5oIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2dsdXJlbi1ib3R0b20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWJmYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2dsdXJlbi1ib3R0b20uaApAQCAtMCwwICsxLDEyIEBACisKKyNlbmRpZgorCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKwpkaWZmIC0tZ2l0IGEvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2dsdXJlbi10b3AuaCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9nbHVyZW4tdG9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyOGJmMQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9nbHVyZW4tdG9wLmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgX0dMVVJFTl9ICisjZGVmaW5lIF9HTFVSRU5fSAorCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2NvbGxfYmUuaCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvY29sbF9iZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2M3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2NvbGxfYmUuaApAQCAtMCwwICsxLDI5IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfQ09MTF9CRQorI2RlZmluZSBfQ09MTF9CRQorCisjaW5jbHVkZSA8aWN1Z2x1ZS9pY3VnbHVlLmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y29sbC5oPiAvKiBmb3IgZGVmaW5pdGlvbnMgKi8KKworI2lmIGRlZmluZWQoWFBfQ1BMVVNQTFVTKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCAqIEdMVUVfU1lNKHVjb2xfb3BlbikgKGNvbnN0IGNoYXIgKmxvY2FsZSk7Cit2b2lkICogR0xVRV9TWU0odWNvbF9jbG9zZSkgKHZvaWQgKmNvbGwpOwordm9pZCAqIEdMVUVfU1lNKAorCisKKyNpZiBkZWZpbmVkKFhQX0NQTFVTUExVUykgCit9CisjZW5kaWYKKworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2luY2x1ZGUvaWN1Z2x1ZS9jb2xsX2ZlLmggYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2NvbGxfZmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmYyZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2luY2x1ZGUvaWN1Z2x1ZS9jb2xsX2ZlLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgX0NPTExfRkUKKyNkZWZpbmUgX0NPTExfRkUKKworI2luY2x1ZGUgPGljdWdsdWUvaWN1Z2x1ZS5oPgorI2luY2x1ZGUgPHVuaWNvZGUvY29sbC5oPgorCisjaWYgZGVmaW5lZChYUF9DUExVU1BMVVMpCisKK2NsYXNzIEdMVUVfU1lNKCBHbHVlRkVDb2xsYXRvciApIDogcHVibGljIENvbGxhdG9yIHsKKworfTsKKworI2VuZGlmIC8qIFhQX0NQTFVTUExVUyAqLworCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2ZlX3Zlcmxpc3QuaCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvZmVfdmVybGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjczYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2ZlX3Zlcmxpc3QuaApAQCAtMCwwICsxLDI2IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoqCisgKiBQdXJwb3NlOiBjcmVhdGUgbG9jYWwgb3Igc3RhdGljIGZlX3Zlcmxpc3Qgc3VjaCBhczoKKyAqIAorICogICBjb25zdCBjaGFyICpmZV92ZXJsaXN0W10gPSB7ICI0XzIiLCAiNF8yXzMiLCAuLi4sIE5VTEwgfTsgCisgKi8KKworI2lmIGRlZmluZWQoR0xVRV9WRVIpCisjdW5kZWYgR0xVRV9WRVIKKyNlbmRpZgorCitjb25zdCBjaGFyICpmZV92ZXJsaXN0W10gPSB7IAorI2RlZmluZSBHTFVFX1ZFUih4KSAgI3ggICwKKyNpbmNsdWRlICJpY3VnbHVlL2dsdmVyLmgiCisjdW5kZWYgR0xVRV9WRVIKKyAgICBOVUxMCit9OworCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2ljdWdsdWUuaCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvaWN1Z2x1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTE2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2ljdWdsdWUuaApAQCAtMCwwICsxLDE4IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9JQ1VHTFVFX0gKKyNkZWZpbmUgX0lDVUdMVUVfSAorCisvKiBHZXQgdXR5cGVzLmggZnJvbSB3aGF0ZXZlciBJQ1Ugd2UgYXJlIHVuZGVyICovCisjaW5jbHVkZSA8dW5pY29kZS91dHlwZXMuaD4KKworI2RlZmluZSBHTFVFX1NZTV9WKHgsIHYpIGdsdWUgIyMgeCAjIyB2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL29pY3UuaCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9vaWN1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjYTUwNwotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9vaWN1LmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgX09JQ1UKKyNkZWZpbmUgX09JQ1UKKworI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisvKioKKyAgIHVjbGVhbi5oCisqLworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIKK09JQ1VfdV9pbml0KFVFcnJvckNvZGUgKnN0YXR1cyk7CisKKyNpbmNsdWRlICJ1bmljb2RlL3Vjb2wuaCIKKy8qKgorIHVjb2wuaAorKi8KK1VfU1RBQkxFIFVDb2xsYXRvciogVV9FWFBPUlQyIAorT0lDVV91Y29sX29wZW4oY29uc3QgY2hhciAqbG9jLCBVRXJyb3JDb2RlJiBzdGF0dXMpOworCitVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMgorT0lDVV91Y29sX2dldFNob3J0RGVmaW5pdGlvblN0cmluZyhjb25zdCBVQ29sbGF0b3IgKmNvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiAKK09JQ1VfdWNvbF9jbG9zZShVQ29sbGF0b3IqKTsKKworVV9TVEFCTEUgVUNvbGxhdGlvblJlc3VsdCBPSUNVX3Vjb2xfc3RyY29sbAkoCWNvbnN0IFVDb2xsYXRvciAqIAljb2xsLAorY29uc3QgVUNoYXIgKiAJc291cmNlLAoraW50MzJfdCAJc291cmNlTGVuZ3RoLAorY29uc3QgVUNoYXIgKiAJdGFyZ2V0LAoraW50MzJfdCAJdGFyZ2V0TGVuZ3RoCSAKKyk7CisKK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyIAorT0lDVV91Y29sX3NldFN0cmVuZ3RoKGNvbnN0IFVDb2xsYXRvciAqLCBVQ29sbGF0aW9uU3RyZW5ndGggKTsKKworCisjaWZuZGVmIE9JQ1VfdWNvbF9nZXRBdmFpbGFibGUKKyNlcnJvciBPSUNVX3Vjb2xfZ2V0QXZhaWxhYmxlIG5vdCBmb3VuZCAtIHVyZW5hbWUgc3ltYm9sIG1pc21hdGNoPworI2VuZGlmCisKK1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIgCitPSUNVX3Vjb2xfZ2V0QXZhaWxhYmxlKGludDMyX3QgaSk7CisKK1VfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIAorT0lDVV91Y29sX2NvdW50QXZhaWxhYmxlKCk7CisKKworVV9TVEFCTEUgVUNvbGxhdGlvblN0cmVuZ3RoIFVfRVhQT1JUMiAKK09JQ1VfdWNvbF9nZXRTdHJlbmd0aChVQ29sbGF0b3IgKmNvbCk7CisKK1VfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIAorT0lDVV91Y29sX2dldFNvcnRLZXkoY29uc3QgICAgVUNvbGxhdG9yICAgICpjb2xsLAorICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgaW50MzJfdCAgICAgICAgc291cmNlTGVuZ3RoLAorICAgICAgICB1aW50OF90ICAgICAgICAqcmVzdWx0LAorICAgICAgICBpbnQzMl90ICAgICAgICByZXN1bHRMZW5ndGgpOworCisKK1VfU1RBQkxFIFVDb2xsYXRvciogVV9FWFBPUlQyIAorT0lDVV91Y29sX3NhZmVDbG9uZShjb25zdCBVQ29sbGF0b3IgKmNvbGwsCisgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnN0YWNrQnVmZmVyLAorICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICpwQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAqc3RhdHVzKTsKKworI2luY2x1ZGUgInVuaWNvZGUvdWRhdC5oIgorVV9TVEFCTEUgVURhdGVGb3JtYXQqIFVfRVhQT1JUMiAKK09JQ1VfdWRhdF9vcGVuKFVEYXRlRm9ybWF0U3R5bGUgIHRpbWVTdHlsZSwKKyAgICAgICAgICBVRGF0ZUZvcm1hdFN0eWxlICBkYXRlU3R5bGUsCisgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgKmxvY2FsZSwKKyAgICAgICAgICBjb25zdCBVQ2hhciAgICAgICAqdHpJRCwKKyAgICAgICAgICBpbnQzMl90ICAgICAgICAgICB0eklETGVuZ3RoLAorICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICpwYXR0ZXJuLAorICAgICAgICAgIGludDMyX3QgICAgICAgICAgIHBhdHRlcm5MZW5ndGgsCisgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgKnN0YXR1cyk7CisKK1VfU1RBQkxFIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIgCitPSUNVX3VkYXRfZ2V0QXZhaWxhYmxlKGludDMyX3QgaSk7CisKK1VfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIAorT0lDVV91ZGF0X2NvdW50QXZhaWxhYmxlKCk7CisKKworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgCitPSUNVX3VkYXRfY2xvc2UoVURhdGVGb3JtYXQqIGZvcm1hdCk7CisKK1VfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIAorT0lDVV91ZGF0X2Zvcm1hdCggICAgY29uc3QgICAgVURhdGVGb3JtYXQqICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVEYXRlICAgICAgICAgICBkYXRlVG9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciogICAgICAgICAgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc3VsdExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVGaWVsZFBvc2l0aW9uKiBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMpOworCisKKworLyoqCisgZW5kIHVjb2wuaAorKi8KKworLy8gZGVmaW5lIHZlcnNpb24KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2ljdS1jb25maWcuc2VkIGIvbXVsdGkvcHJvai9wcm92aWRlci9pY3UtY29uZmlnLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDlmZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9pY3UtY29uZmlnLnNlZApAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgbXVuZ2UKK3MlXnNhbml0eSQlIyBzYW5pdHkgZGlzYWJsZWQuJQorCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL3JlYWRtZS50eHQgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmMzZhNwotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvcmVhZG1lLnR4dApAQCAtMCwwICsxLDc5IEBACisjIS9iaW4vY2F0CisjIENvcHlyaWdodCAoYykgMjAwOS0yMDEyIElCTSBDb3JwLiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyMgSUNVIFByb3ZpZGVyIEZlYXR1cmUuIC0gJElkJAorCisqIE5vdGUsIGFzIG9mIElDVTQ5IHRoaXMgaXMgYSB0ZWNobm9sb2d5IHByZXZpZXcuCisKK0JVSUxESU5HOgorCisxYS4gRG93bmxvYWQgdGhlIElDVSBzb3VyY2UgKC50Z3opIHlvdSB3aXNoIHRvIFRBUkdFVCAoaS5lLiBsaW5rIHlvdXIKK2FwcGxpY2F0aW9uIGFnYWluc3QpLiAgVGhpcyBtdXN0IGJlIHRoZSBJQ1U0OSBicmFuY2gKK2h0dHA6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL3JlcG9zL2ljdS9pY3UvYnJhbmNoZXMvc3JsL3Vjb2w4MTU3IGF0Cit0aGlzIHdyaXRpbmcuCisKKzFiLiBEb3dubG9hZCBvbmUgb3IgbW9yZSBJQ1VzICgudGd6KSB5b3Ugd2lzaCB0byBoYXZlIEFWQUlMQUJMRSAodmlhCit0aGUgcHJvdmlkZXIgaW50ZXJmYWNlKS4gIEFzIG9mIHRoaXMgd3JpdGluZywgNDksIDQuOC4xLjEsIDQuNi54LCA0LjQueCwgNC4yLjAuMSwgMy44LjEsIDMuNiwgMy40LjEsIGFuZCAzLjIuMSBoYXZlIGJlZW4gdGVzdGVkLgorCisgICBOb3RlIHRoYXQgdGhlIE1BSk9SK01JTk9SIHZlcnNpb24gbnVtYmVycyBtdXN0IG5vdCBjb25mbGljdCBiZXR3ZWVuIHRoZSBUQVJHRVQgIGFuZCBBVkFJTEFCTEUgSUNVcy4gT25seSBvbmUgSUNVIG9mIGVhY2ggbWFqb3IrbWlub3IgaXMgYWxsb3dlZC4gCisgICBTbywgb25seSBvbmUgNC40LlgsIG9uZSAzLjguWCwgZXRjLiAgVGhpcyBpcyBkdWUgdG8gSUNVIGJpbmFyeSBjb21wYXRpYmlsaXR5IHJ1bGVzLgorCisKKzFjLiBDb3B5IHRoZSBJQ1VzIChuYW1lZCBhcyB0aGV5IHdlcmUgZG93bmxvYWRlZCkgaW50byB0aGUgLi4vLi4vcGFja2FnZXMvIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGlzIHJlYWRtZS4KKworMmEuIENvcHkgdGhlIGZpbGUgIk1ha2VmaWxlLWxvY2FsLnNhbXBsZSIgaW50byBhIG5ldyBmaWxlICJNYWtlZmlsZS5sb2NhbCIuCisKKzJiLiBFZGl0IHRoZSBNYWtlZmlsZS5sb2NhbCB0byBtb2RpZnkgdGhlIFBST1ZJREVSX1RBUkdFVCBhbmQKK1BST1ZJREVSX0FWQUlMQUJMRSBzZXR0aW5ncy4KKworICAgTm90ZSB0aGF0IGlmIHlvdSBoYXZlIGEgc3BlY2lhbCBpbnN0YWxsYXRpb24gb2YgdGhlIGN1cnJlbnQgSUNVCisgICAoSUNVIDQ5KSB0aGF0IHlvdSB3YW50IHRvIGJlIHRoZSB0YXJnZXQsIHlvdSBjYW4gc2V0IFBMVUdMSUJfSU5TVAorICAgdG8gdGhlIGluc3RhbGxlZCBJQ1UgcGF0aC4gWW91IG11c3Qgc3RpbGwgc2V0IFBST1ZJREVSX1RBUkdFVC4KKworMy4gQ2hlY2sgdGhlIG1ha2VmaWxlIHNldHRpbmdzIGJ5IHJ1bm5pbmcgJ21ha2UgaW5mbycsIHlvdSBzaG91bGQgc2VlIG91dHB1dCBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6CisKKyAgIElDVSBQcm92aWRlciBCdWlsZAorIFRhcmdldHRpbmcgUHJvdmlkZXIgYWdhaW5zdCBJQ1UgNDkgKDQ5LCBtYWpvciA0OSkKKyAgQXZhaWxhYmxlIHBsdWdpbnM6IDMuOC4xIDQuMi4wLjEgICgzXzhfMSA0XzJfMF8xKQorICAgQXZhaWxhYmxlIGtleXdvcmRzOgorICAgICAgLi4uQHByb3ZpZGVyPWljdTM4CisgICAgICAuLi5AcHJvdmlkZXI9aWN1NDIKKyAgIFBsdWdpbiBsaWJyYXJ5IHdpbGwgYmUgbGliaWN1cHJvdi40OS5zbworCisgICBBdmFpbGFibGUgSUNVIHRhcmJhbGxzOiBpY3U0Yy0zXzhfMS1zcmMudGd6IGljdTRjLTRfMl8wXzEtc3JjLnRneiBpY3U0Yy00XzRfMi1zcmMudGd6IAorICAgQXZhaWxhYmxlIElDVSB2ZXJzaW9uczogMy44LjEgNC4yLjAuMSA0LjQuMiAKKworCisgVGhlIGxhc3QgdHdvIGxpbmVzIHNob3cgd2hpY2ggSUNVIC50Z3ogZmlsZXMgYXJlIGF2YWlsYWJsZS4gSWYgYSB2ZXJzaW9uIGlzIG5vdCBsaXN0ZWQsIG1ha2Ugc3VyZSB0aGUgZmlsZW5hbWUgaXMgYXMgYWJvdmUuCisKKzQuIE5vdywgeW91IGFyZSByZWFkeSB0byBidWlsZCBhbmQgdGVzdC4KKworKE5vdGU6IHlvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZXMgQ0MsIENYWCwgQ1hYRkxBR1MsIGFuZCBDRkxBR1MgdG8gc2V0Cit0aGUgY29tcGlsZXIgb3B0aW9ucy4gKQorCisgICAgIG1ha2UgY2hlY2sKKworICAgVGhpcyB3aWxsIHRha2UgcXVpdGUgYSB3aGlsZSBhcyBpdCBoYXMgdG8gYnVpbGQgTiBjb3BpZXMgb2YgSUNVLgorCisgICBXaGVuIGRvbmUsIGl0IHNob3VsZCBzaG93IGEgbGlzdCBvZiBjb2xsYXRpb24ga2V5cywgYW5kIGluZGljYXRlIHRoYXQgdGhlcmUgd2VyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIElDVSAzLjgsIDQuNCwgNC4yLiAgIFlvdSBtYXkgbmVlZCB0byBtb2RpZnkgY29sZGlmZi5jcHAgaWYgeW91IGFyZSB1c2luZyBhIGRpZmZlcmVudCBzZXQgb2YgSUNVIHZlcnNpb25zLgorCis1LiBZb3UgY2FuIHRlc3QgaW4gYW4gJ2luc3RhbGxlZCcgSUNVIChub3QgdGhlIHN5c3RlbSBpbnN0YWxsKSB3aXRoIHRoaXMgY29tbWFuZDoKKworICAgICAgbWFrZSBpbnN0YWxsLWNoZWNrCisKK0RFUExPWUlORzoKKworNi4gIFRvIGluc3RhbGwgdGhlIHBsdWdpbiBpbiB5b3VyIG93biBJQ1UsIGNvcHkgIG91dC9pY3VwbHVnaW5zNDQudHh0IGludG8geW91ciBsaWIvaWN1LCAgYW5kIG91dC9saWIvbGliaWN1cHJvdi40NC5zbyBpbnRvIHlvdXIgbGliLyBkaXJlY3RvcmllcyB3aGVyZSBJQ1UgaXMgaW5zdGFsbGVkLiAKKworIE5vdGUgdGhhdCBydW5uaW5nICdpY3VpbmZvJyB3aWxsIHRlbGwgeW91IHdoZXJlIHRoZSBwbHVnaW4gZmlsZSBpcyBleHBlY3RlZCB0byBiZSBsb2NhdGVkLCBhbmQgJ2ljdWluZm8gLUwnIHdpbGwgZGVidWcgYW55IGxvYWQgaXNzdWVzLgorCitVU0lORzoKKworQ29sbGF0b3JzIG9wZW5lZCB3aXRoIGFuIGlkIHN1Y2ggYXMgdGhhdCBzaG93biBpbiAnbWFrZSBpbmZvJywgc3VjaCBhcyAgJ2VuX1VTQHByb3ZpZGVyPWljdTM4JyB3aWxsIGxvYWQsIGZvciBleGFtcGxlLCBhbiBJQ1UgMy44IGNvbGxhdG9yLgorCitEYXRlIEZvcm1hdHMgb3BlbmVkICh1ZGF0X29wZW4pIHdpbGwgYWxzbyBsb2FkIGEgZGlmZmVyZW50IGRhdGUKK2Zvcm1hdCwgYnV0IG9ubHkgdGhyb3VnaCAndWRhdF9vcGVuJy4KKworCisKKwpkaWZmIC0tZ2l0IGEvbXVsdGkvcmVhZG1lLnR4dCBiL211bHRpL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjYjc2ZAotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3JlYWRtZS50eHQKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL2NhdAorIyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworCisKK05PVEU6CitOT1RFOiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlICdQcm92aWRlcicgZmVhdHVyZSwgc2VlIHByb2ovcHJvdmlkZXIvcmVhZG1lLnR4dAorTk9URToKKworCisKKyBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBwaWVjZXMgb2YgdGhlICdNdWx0aUljdScgZmVhdHVyZSwgd2hpY2ggY29udGFpbnMKK3NjcmlwdHMgZm9yIGJ1aWxkaW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIElDVSBhdCB0aGUgc2FtZSB0aW1lLCBhbmQgcnVubmluZwordmFyaW91cyBwaWVjZXMgb2YgY29kZSBhZ2FpbnN0IGl0LgorCisgTm90ZSwgaWYgeW91IGNvcHkgb25lIG9mIHRoZXNlIHByb2plY3RzIG91dHNpZGUgdGhlIG11bHRpLyBkaXJlY3RvcnksCit5b3UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgJ01VTFRJSUNVX1JPT1QnIHZhcmlhYmxlIGluIGJ1aWxkIHNjcmlwdHMgcG9pbnRzCit0byB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBoZXJlLCAnbXVsdGkvJy4KKworIG11bHRpLyAgICAgICAgICAgICAgKCBZb3UgYXJlIEhlcmUgKQorIG11bHRpL3BhY2thZ2VzLyAgICAgLnRneiBhbmQgLmphciBmaWxlcyBmb3IgQyBhbmQgSiByZXNwZWN0aXZlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgdGhlIHJlYWRtZSBpbiB0aGF0IGRpcmVjdG9yeSkKKyBtdWx0aS9jLyAgICAgICAgICAgIFNjcmlwdHMgZm9yIGJ1aWxkaW5nIGFnYWluc3QgSUNVNEMKKyBtdWx0aS9jL3BhdGNoLyAgICAgICAgIFBhdGNoZXMgZm9yIGJ1aWxkaW5nIG9sZCBJQ1UgdmVyc2lvbnMKKyAKKyBtdWx0aS9jb21tb24vICAgICAgIENvbW1vbiBtYWtlZmlsZXMKKworIG11bHRpL2ovICAgICAgICAgICAgU2NyaXB0cyBmb3IgYnVpbGRpbmcgYWdhaW5zdCBJQ1U0SgorCisgbXVsdGkvdG1wLyAgICAgICAgICBUZW1wb3JhcnkgZGlyZWN0b3J5LCBjb250YWlucyBpbnRlcm1lZGlhdGUgYnVpbGRzCisgbXVsdGkvdG1wL3NyYy8gICAgICAgICBVbnBhY2tlZCBhbmQgcGF0Y2hlZCBzb3VyY2UKKyBtdWx0aS90bXAvYnVpbGQvICAgICAgIEJ1aWx0IElDVXMKKyBtdWx0aS90bXAvaW5zdC8gICAgICAgIEluc3RhbGxlZCBJQ1VzCisKKyBtdWx0aS9wcm9qLyAgICAgICAgIENvbnRhaW5zIHZhcmlvdXMgcHJvamVjdHMgd2hpY2ggbWFrZSB1c2Ugb2YgbXVsdGktaWN1LgorICAgICAgICAgICAgICAgICAgICAgICAoU2VlIGluZGl2aWR1YWwgcmVhZG1lcyB1bmRlciBlYWNoIHByb2plY3QuKQorIG11bHRpL3Byb2ovY2hlbGxvLyAgQyAiaGVsbG8gd29ybGQiIGFnYWluc3QgbXVsdGlwbGUgSUNVcworIG11bHRpL3Byb2ovamhlbGxvLyAgSiAiaGVsbG8gd29ybGQiIGFnYWluc3QgbXVsdGlwbGUgSUNVcworCistLQorSE9XIFRPIFVTRQorCisxLiBDb3B5IHNvbWUgSUNVIHNvdXJjZSBmaWxlcyBpbnRvIG11bHRpL3BhY2thZ2VzLworCisyLiBpbiAibXVsdGkvYyIgIHJ1biAibWFrZSBpaWN1cyIgLSB0aGlzIHdpbGwgdGFrZSBhIHdoaWxlLgorCiszLlRvIHZlcmlmeSB0aGUgSUNVIGJ1aWxkLCBpbiAibXVsdGkvcHJvai9jaGVsbG8iLCAgcnVuICJtYWtlIGNoZWNrIi4KKworICAgWW91IHNob3VsZCBzZWUgb3V0cHV0IGxpa2UgdGhpczoKKworICAgICAgIG91dC8zXzhfMS50eHQ6ICBJQ1UgMy44LjEKKyAgICAgICBvdXQvNF8yXzBfMS50eHQ6ICBJQ1UgNC4yCisgICAgICAgb3V0LzRfNF8xLnR4dDogIElDVSA0LjQuMQorCis0LiBUaGUgJ1Byb3ZpZGVyJyBwcm9qZWN0IGlzIG1vcmUgY29tcGxleC4gVG8gc2VlIGl0cyBpbmZvcm1hdGlvbiwgc2VlCit0aGUgcmVhZG1lIGluIHRoYXQgZGlyZWN0b3J5LiAKZGlmZiAtLWdpdCBhL3JlbGVhc2UvYy9hbGxMb2NhbGVUZXN0LnNoIGIvcmVsZWFzZS9jL2FsbExvY2FsZVRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNhMDc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9hbGxMb2NhbGVUZXN0LnNoCkBAIC0wLDAgKzEsMTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBJQk0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworZWNobyAiVGVzdGluZyAkMSBpbiBhbGwgbG9jYWxlcyIKK291dGZpbGU9JDEtbG9jYWxlLnR4dAorZWNobyAiIiA+ICRvdXRmaWxlCitmb3IgbG9jIGluIGBsb2NhbGUgLWFgOyBkbworZWNobyBMQ19BTEw9JGxvYyA+PiAkb3V0ZmlsZQorTENfQUxMPSRsb2MgbWFrZSBjaGVjayAkMiA+PiAkb3V0ZmlsZSAyPiYxCitkb25lCisKK2VjaG8gIkRvbmUgdGVzdGluZyAkMSBpbiBhbGwgbG9jYWxlcyIKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL2FsbFRpbWV6b25lVGVzdC5zaCBiL3JlbGVhc2UvYy9hbGxUaW1lem9uZVRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTIzMTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9hbGxUaW1lem9uZVRlc3Quc2gKQEAgLTAsMCArMSwxNSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggSUJNIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKK2VjaG8gIlRlc3RpbmcgJDEgaW4gYWxsIHRpbWV6b25lcyIKK291dGZpbGU9JDEtdGltZXpvbmUudHh0CitlY2hvICIiID4gJG91dGZpbGUKK2ZvciB0aW1lem9uZSBpbiBgbG9jYXRlIC91c3Ivc2hhcmUvem9uZWluZm8vfGZncmVwIC12IC9yaWdodC98ZmdyZXAgLXYgL3Bvc2l4L2A7IGRvCit0aW1lem9uZT0ke3RpbWV6b25lIy91c3Ivc2hhcmUvem9uZWluZm8vfQorZWNobyBUWj0kdGltZXpvbmUgPj4gJG91dGZpbGUKK1RaPSR0aW1lem9uZSBtYWtlIGNoZWNrICQyID4+ICRvdXRmaWxlIDI+JjEKK2RvbmUKKworZWNobyAiRG9uZSB0ZXN0aW5nICQxIGluIGFsbCB0aW1lem9uZXMiCisKZGlmZiAtLWdpdCBhL3JlbGVhc2UvYy9ib21maXgucHkgYi9yZWxlYXNlL2MvYm9tZml4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Y2Q3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2MvYm9tZml4LnB5CkBAIC0wLDAgKzEsODggQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMgQ29weXJpZ2h0IChDKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBSdW4gdGhpcyBsaWtlIHNvOgorIyAgY2QgL3BhdGgvdG8vSUNVCisjICBweXRob24gL3BhdGgvdG8vdGhpc3NjcmlwdC9ib21maXgucHkKKyMKKyMgaXQgd2lsbCBmaXh1cCBhbnkgZmlsZXMgdGhhdCBoYXZlIGEgbWltZS10eXBlIG9mICJ1dGYtOCIgYnV0IG5vIEJPTS4KKworaW1wb3J0IG9zCitpbXBvcnQgc3ZuLmNvcmUsIHN2bi5jbGllbnQsIHN2bi53YworaW1wb3J0IGNvZGVjcworCisKK3ByaW50ICJGaXhpbmcgYm9tIGluIC5cbiIKKworY3R4ID0gc3ZuLmNsaWVudC5zdm5fY2xpZW50X2N0eF90KCkKKwordHJlZSA9IG9zLndhbGsoIi4iKQorCitub3RzPTAKK25vdHV0Zjg9MAorbm9wcm9wcz0wCit1dGY4PTAKK2ZpeGVkPTAKK3RmaWxlcz0wCitib209Y29kZWNzLkJPTV9VVEY4CisKKworZm9yIGVudCBpbiB0cmVlOgorICAgIChwYXRoLGRpcnMsZmlsZXMpID0gZW50CisgICAgaWYocGF0aC5maW5kKCIvLnN2biIpICE9IC0xKToKKyAgICAgICAgY29udGludWUKKyAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgdGZpbGVzPXRmaWxlcysxCisgICAgICAgIHJldmlzaW9uID0gc3ZuLmNvcmUuc3ZuX29wdF9yZXZpc2lvbl90KCkKKyAgICAgICAgZnAgPSBvcy5wYXRoLmFic3BhdGgocGF0aCArICIvIiArIGZpbGUpCisgICAgICAgICNwcmludCAidGVzdGluZyAiICsgZnAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvcHMgPSBzdm4uY2xpZW50LnByb3BnZXQoInN2bjptaW1lLXR5cGUiLCBmcCwgcmV2aXNpb24sIDAsIGN0eCkKKyAgICAgICAgICAgIGlmIChub3QgcHJvcHMgb3Igbm90IHByb3BzW2ZwXSk6IAorICAgICAgICAgICAgICAgIG5vcHJvcHMgPSBub3Byb3BzICsgMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBwcm9wc1tmcF0KKworICAgICAgICAgICAgaWYgKG5vdCB0eXBlID09ICJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgiKToKKyAgICAgICAgICAgICAgICBub3R1dGY4ID0gbm90dXRmOCArIDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIGZwIGlzIHV0Zi04CisgICAgICAgICAgICB1dGY4PXV0ZjgrMQorCisgICAgICAgICAgICBmID0gb3BlbihmcCwgJ3JiJykKKyAgICAgICAgICAgIGJ5dGVzPWYucmVhZCgzKQorICAgICAgICAgICAgaWYgbm90IGJ5dGVzOgorICAgICAgICAgICAgICAgIHByaW50IGZwICsgIjogY291bGQgbm90IHJlYWQgMyBieXRlcyIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiAoYnl0ZXMgPT0gYm9tKToKKyAgICAgICAgICAgICAgICAjcHJpbnQgZnAgKyAiOiBPSyIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3MucmVuYW1lKGZwLGZwKyIudG1wIikKKyAgICAgICAgICAgIG89b3BlbihmcCwnd2InKQorICAgICAgICAgICAgby53cml0ZShib20pCisgICAgICAgICAgICB3aGlsZSgxKToKKyAgICAgICAgICAgICAgICBieXRlcyA9IGYucmVhZCgyMDQ4KQorICAgICAgICAgICAgICAgIGlmIGJ5dGVzOgorICAgICAgICAgICAgICAgICAgICBvLndyaXRlKGJ5dGVzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvLmNsb3NlKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKGZwKyIudG1wIikKKyAgICAgICAgICAgIGZpeGVkPWZpeGVkKzEKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICBwcmludCBmcAorICAgICAgICAgICAgCisgICAgICAgIGV4Y2VwdCBzdm4uY29yZS5TdWJ2ZXJzaW9uRXhjZXB0aW9uOgorICAgICAgICAgICAgbm90cyA9IG5vdHMgKyAxCisgICAgICAgICAgICAjcHJpbnQgIk5vdCB1bmRlciB2YzogIiArIGZwCisKKworcHJpbnQgIiVkIGZpbGVzLCAlZCBub3QgdW5kZXIgc3ZuLCAlZCB3aXRoIG5vIHByb3BzLCAlZCBub3QgdXRmODogJWQgdXRmOCwgJWQgZml4ZWRcbiIgJSAodGZpbGVzLG5vdHMsbm9wcm9wcyxub3R1dGY4LHV0ZjgsZml4ZWQpCmRpZmYgLS1naXQgYS9yZWxlYXNlL2MvZW52aXJvbm1lbnRUZXN0LnNoIGIvcmVsZWFzZS9jL2Vudmlyb25tZW50VGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNTQyMDZjCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9jL2Vudmlyb25tZW50VGVzdC5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggSUJNIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMgVGhpcyB0ZXN0IHNjcmlwdCBlbnVtZXJhdGVzIGFsbCBsb2NhbGVzIGFuZCBhbGwgdGltZXpvbmVzIGluc3RhbGxlZCBvbiBhCisjIG1hY2hpbmUgKHVzdWFsbHkgTGludXgpLCBhbmQgcnVucyB0aGUgZXhpc3RpbmcgSUNVNEMgdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQKKyMgdGhlIHRlc3RzIHBhc3MuIE5vdCBldmVyeW9uZSBpcyB1c2luZyBhbmQgdGVzdGluZyBJQ1U0QyBpbiB0aGUgZW5fVVMgbG9jYWxlCisjIHdpdGggdGhlIFBhY2lmaWMgdGltZXpvbmUuCit0b3BfaWN1X2Rpcj0uLi8uLi8uLi9pY3UKK3JlbGVhc2VfdG9vbHNfZGlyPS4uLy4uLy4uLy4uL3Rvb2xzL3JlbGVhc2UvYworY2QgJHRvcF9pY3VfZGlyL3NvdXJjZS90ZXN0L2ludGx0ZXN0CiskcmVsZWFzZV90b29sc19kaXIvYWxsTG9jYWxlVGVzdC5zaCBpbnRsdGVzdCAmCiskcmVsZWFzZV90b29sc19kaXIvYWxsVGltZXpvbmVUZXN0LnNoIGludGx0ZXN0ICYKK2NkIC4uL2lvdGVzdAorJHJlbGVhc2VfdG9vbHNfZGlyL2FsbExvY2FsZVRlc3Quc2ggaW90ZXN0IElPVEVTVF9PUFRTPWlvdGVzdC1jLWxvYy50eHQgJgorJHJlbGVhc2VfdG9vbHNfZGlyL2FsbFRpbWV6b25lVGVzdC5zaCBpb3Rlc3QgSU9URVNUX09QVFM9aW90ZXN0LWMtdHoudHh0ICYKK2NkIC4uL2NpbnRsdHN0CiskcmVsZWFzZV90b29sc19kaXIvYWxsTG9jYWxlVGVzdC5zaCBjaW50bHRzdCAmCiskcmVsZWFzZV90b29sc19kaXIvYWxsVGltZXpvbmVUZXN0LnNoIGNpbnRsdHN0ICYKKworZWNobyAiQWxsIHRlc3RzIGhhdmUgYmVlbiBzcGF3bmVkLiIKK2VjaG8gIlBsZWFzZSB3YWl0IHdoaWxlIHRoZSB0ZXN0cyBydW4uIFRoaXMgbWF5IHRha2UgYSB3aGlsZS4iCmRpZmYgLS1naXQgYS9yZWxlYXNlL2Mvb3MtbWFwcGluZy9NYWtlZmlsZSBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MjIzODcKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy9NYWtlZmlsZQpAQCAtMCwwICsxLDcwIEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjCisjICBGSUxFIE5BTUUgOiBNYWtlZmlsZQorIworIyAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisjICAgMDMvMDIvMjAwNiAgZ3Job3RlbiAgICAgQ3JlYXRpb24uCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyMgTGlzdCBvZiBwaG9ueSB0YXJnZXRzCisuUEhPTlkgOiBhbGwgYWxsLWxvY2FsIGluc3RhbGwgaW5zdGFsbC1sb2NhbCBjbGVhbiBjbGVhbi1sb2NhbAlcCitkaXN0Y2xlYW4gZGlzdGNsZWFuLWxvY2FsIGluc3RhbGwtbGlicmFyeSBpbnN0YWxsLWhlYWRlcnMgZGlzdAlcCitkaXN0LWxvY2FsIGNoZWNrIGNoZWNrLWxvY2FsCisKKyMjIENsZWFyIHN1ZmZpeCBsaXN0CisuU1VGRklYRVMgOgorCisjIyBMaXN0IG9mIHN0YW5kYXJkIHRhcmdldHMKK2FsbDogYWxsLWxvY2FsCitpbnN0YWxsOiBpbnN0YWxsLWxvY2FsCitjbGVhbjogY2xlYW4tbG9jYWwKK2Rpc3RjbGVhbiA6IGRpc3RjbGVhbi1sb2NhbAorZGlzdDogZGlzdC1sb2NhbAorY2hlY2s6IGFsbCBjaGVjay1sb2NhbAorCitBTExfVEFSR0VUUyA9IGRpc3BsYXlMb2NhbGVDb252IHRlc3RUaW1lem9uZQorI0lDVV9CQVNFID0gL2hvbWUvYnVpbGQvQnVpbGRfSUNVX0hQMTFpQUNDCisjSUNVX0JBU0UgPSAvaG9tZS9idWlsZC9CdWlsZF9JQ1VfU29sYXJpczlDQworSUNVX0JBU0UgPSAvaG9tZS9idWlsZC9CdWlsZF9JQ1VfTGludXhSSEVMNC4yCisjSUNVX0JBU0UgPSAvaG9tZS9idWlsZC9CdWlsZF9JQ1VfTWFjT1NYCisjSUNVX0JBU0UgPSAvaG9tZS9idWlsZC9CdWlsZF9JQ1VfQUlYNS4yVkE2CisKK2FsbC1sb2NhbDogJChBTExfVEFSR0VUUykKKworZGlzcGxheUxvY2FsZUNvbnY6IGRpc3BsYXlMb2NhbGVDb252LmMKKwkjYUNDICtERDY0IC1JJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9jb21tb24vIC1MJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9saWIvIC1saWN1dWMgLWxpY3VkYXRhIC1vICRAICQ8CisJI0NDIC14dGFyZ2V0PXVsdHJhIC14YXJjaD12OSAtSSQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvY29tbW9uLyAtTCQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvbGliLyAtbGljdXVjIC1saWN1ZGF0YSAtbyAkQCAkPAorCWdjYyAtSSAkKElDVV9CQVNFKS9pY3Uvc291cmNlL2NvbW1vbi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YyAtbGljdWRhdGEgLW8gJEAgJDwKKwkjZ2NjIC1JICQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvY29tbW9uLyAtTCQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvbGliLyAtbGljdXVjIC1saWN1ZGF0YSAtbyAkQCAkPAorCSN4bGMgLXE2NCAtSSAkKElDVV9CQVNFKS9pY3Uvc291cmNlL2NvbW1vbi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YzM1IC1saWN1ZGF0YTM1IC1vICRAICQ8CisKK3Rlc3RUaW1lem9uZTogdGVzdFRpbWV6b25lLmMKKwkjYUNDICtERDY0IC1JJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9jb21tb24vIC1JJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9pMThuLyAtTCQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvbGliLyAtbGljdXVjIC1saWN1ZGF0YSAtbyAkQCAkPAorCSNDQyAteHRhcmdldD11bHRyYSAteGFyY2g9djkgLUkkKElDVV9CQVNFKS9pY3Uvc291cmNlL2NvbW1vbi8gLUkkKElDVV9CQVNFKS9pY3Uvc291cmNlL2kxOG4vIC1MJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9saWIvIC1saWN1dWMgLWxpY3VkYXRhIC1vICRAICQ8CisJZ2NjIC1JICQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvY29tbW9uLyAtSSQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvaTE4bi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YyAtbGljdWRhdGEgLW8gJEAgJDwKKwkjZ2NjIC1JICQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvY29tbW9uLyAtSSQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvaTE4bi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YyAtbGljdWRhdGEgLW8gJEAgJDwKKwkjeGxjIC1xNjQgLUkgJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9jb21tb24vIC1JJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9pMThuLyAtTCQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvbGliLyAtbGljdXVjMzUgLWxpY3VkYXRhMzUgLW8gJEAgJDwKKworCitpbnN0YWxsLWxvY2FsOiBpbnN0YWxsLWhlYWRlcnMgaW5zdGFsbC1saWJyYXJ5CisKK2luc3RhbGwtbGlicmFyeTogYWxsLWxvY2FsCisKK2luc3RhbGwtaGVhZGVyczoKKworZGlzdC1sb2NhbDoKKworY2xlYW4tbG9jYWw6CisjCXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8ICQoUk1WKSAkKENMRUFORklMRVMpCisJcm0gJChPQkpFQ1RTKSAkKEFMTF9UQVJHRVRTKSAkKFNPX1ZFUlNJT05fREFUQSkKKworZGlzdGNsZWFuLWxvY2FsOiBjbGVhbi1sb2NhbAorCitjaGVjay1sb2NhbDoKKworCmRpZmYgLS1naXQgYS9yZWxlYXNlL2Mvb3MtbWFwcGluZy9kaXNwbGF5TG9jYWxlQ29udi5jIGIvcmVsZWFzZS9jL29zLW1hcHBpbmcvZGlzcGxheUxvY2FsZUNvbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzgwNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9jL29zLW1hcHBpbmcvZGlzcGxheUxvY2FsZUNvbnYuYwpAQCAtMCwwICsxLDM1IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgRklMRSBOQU1FIDogdGVzdFRpbWV6b25lLmMKKyoKKyogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorKiAgIDAzLzAyLzIwMDYgIGdyaG90ZW4gICAgIENyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworI2luY2x1ZGUgInVuaWNvZGUvcHV0aWwuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vsb2MuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VyZXMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKSB7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisKKyAgICB1cmVzX2Nsb3NlKHVyZXNfb3BlbihOVUxMLCBOVUxMLCAmc3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBVX1pFUk9fRVJST1IpIHsKKyAgICAgICAgcHJpbnRmKCJ1bG9jX2dldERlZmF1bHQgPSAlc1xuIiwgdWxvY19nZXREZWZhdWx0KCkpOworICAgICAgICBwcmludGYoIkxvY2FsZSBhdmFpbGFibGUgaW4gSUNVID0gJXNcbiIsIHN0YXR1cyA9PSBVX1pFUk9fRVJST1IgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCh1Y252X2dldERlZmF1bHROYW1lKCksICJVUy1BU0NJSSIpID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJ1cHJ2X2dldERlZmF1bHRDb2RlcGFnZSA9ICVzXG4iLCB1cHJ2X2dldERlZmF1bHRDb2RlcGFnZSgpKTsKKyAgICAgICAgcHJpbnRmKCJ1Y252X2dldERlZmF1bHROYW1lID0gJXNcbiIsIHVjbnZfZ2V0RGVmYXVsdE5hbWUoKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL29zLW1hcHBpbmcvcmVhZG1lLnR4dCBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiYjYzOAotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3JlYWRtZS50eHQKQEAgLTAsMCArMSwxMiBAQAorIworIyAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA4LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisjICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisKK1RoZXNlIHRlc3RzIGFsbG93IHlvdSB0byBzZWUgaG93IHRpbWV6b25lcywgbG9jYWxlcywgY2hhcnNldHMgYW5kIG90aGVyIHNpbWlsYXIgc3R1ZmYgYXJlIG1hcHBlZCBmcm9tIHRoZSBPUyB2YWx1ZXMgdG8gSUNVIHNwZWNpZmljIHZhbHVlcy4KKworU29tZSB0d2Vha2luZyBtYXkgYmUgcmVxdWlyZWQgdG8gZ2V0IHRoZXNlIHRvb2xzIHRvIHdvcmsuCisKK0lmIHRoZSBjaGFyc2V0IG1hcHMgdG8gVVMtQVNDSUksIGl0IG1heSBiZSBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGFsaWFzIG9yIG1hcHBpbmcgdGFibGUgZG8gbm90IGV4aXN0IGluIElDVS4KK0lmIHRoZSBsb2NhbGUgZG9lc24ndCBleGlzdCwgdGhlIHRlc3Qgd2lsbCBzdGF0ZSB0aGF0IHRoZSBsb2NhbGUgaXMgbm90IGF2YWlsYWJsZS4KK0lmIHRoZSB0aW1lem9uZSBkb2Vzbid0IG1hdGNoLCBpdCB3aWxsIGJlIGxpc3RlZCBhcyBhIGRpZmZlcmVuY2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL29zLW1hcHBpbmcvdGVzdExvY2FsZXMuc2ggYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy90ZXN0TG9jYWxlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTVlMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9jL29zLW1hcHBpbmcvdGVzdExvY2FsZXMuc2gKQEAgLTAsMCArMSw4IEBACisjIS9iaW4vc2gKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIworIyAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA4LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisjICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ZvciBsb2MgaW4gYGxvY2FsZSAtYWA7IGRvIGVjaG8gOyBlY2hvIExDX0FMTD0kbG9jIDsgTENfQUxMPSRsb2MgLi9kaXNwbGF5TG9jYWxlQ29udiA7IGRvbmUKZGlmZiAtLWdpdCBhL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RUaW1lem9uZS5jIGIvcmVsZWFzZS9jL29zLW1hcHBpbmcvdGVzdFRpbWV6b25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2N2NhNgotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RUaW1lem9uZS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBGSUxFIE5BTUUgOiB0ZXN0VGltZXpvbmUuYworKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDMvMDIvMjAwNiAgZ3Job3Rlbi9tb3cgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlICJ1bmljb2RlL3B1dGlsLmgiCisjaW5jbHVkZSAidW5pY29kZS91ZGF0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjaGFyIHN5c1RpbWVTdHJbMjU2XTsKKyAgICBzdHJ1Y3QgdG0gc3VtbWVyVGltZVRNOworICAgIHN0cnVjdCB0bSB3aW50ZXJUaW1lVE07CisKKyAgICBtZW1zZXQoc3lzVGltZVN0ciwgMCwgc2l6ZW9mKHN5c1RpbWVTdHIpKTsKKyAgICBtZW1zZXQoJnN1bW1lclRpbWVUTSwgMCwgc2l6ZW9mKHN1bW1lclRpbWVUTSkpOworICAgIG1lbXNldCgmd2ludGVyVGltZVRNLCAwLCBzaXplb2Yod2ludGVyVGltZVRNKSk7CisKKyAgICBzdHJwdGltZSgiMjAwNi0wNi0wMSAxMjowMCIsICIlWS0lbS0lZCAlSDolTSIsICZzdW1tZXJUaW1lVE0pOworICAgIHN0cmZ0aW1lKHN5c1RpbWVTdHIsIHNpemVvZihzeXNUaW1lU3RyKS0xLCAiJVktJW0tJWQgJUg6JU0iLCAmc3VtbWVyVGltZVRNKTsKKyAgICBwdXRzKHN5c1RpbWVTdHIpOworfQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL29zLW1hcHBpbmcvdGVzdFRpbWV6b25lcy5zaCBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RUaW1lem9uZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ5NWI1MQotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RUaW1lem9uZXMuc2gKQEAgLTAsMCArMSw0NSBAQAorIyEvYmluL3NoCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit0aW1lem9uZXM9YGxvY2F0ZSB6b25laW5mbyB8IGZncmVwIC12IGV2b2x1dGlvbi1kYXRhLXNlcnZlcmAKK2ZvciB0em9uZSBpbiAkdGltZXpvbmVzCitkbyAKKyAgICBpZiBbIC1mICR0em9uZSBdOyB0aGVuCisgICAgICAgIHR6bmFtZT0ke3R6b25lIy91c3Ivc2hhcmUvem9uZWluZm8vfQorICAgICAgICBJQ1VUaW1lPWBMRF9MSUJSQVJZX1BBVEg9Li4vZGV2LWljdS9pY3Uvc291cmNlL2xpYi8gVFo9JHR6bmFtZSAuL2NoZWNrVGltZXpvbmVgCisgICAgICAgIHN5c3RlbUhvdXI9YFRaPSR0em5hbWUgZGF0ZSArJUlgCisgICAgICAgICMgT1MgWCBkb2VzIG5vdCBhbGxvdyAlLUkgc28gdGhpcyB1Z2x5IG1lc3MgbmVlZHMgdG8gb2NjdXIKKyAgICAgICAgaWYgWyAiJHtzeXN0ZW1Ib3VyOjA6MX0iID09ICIwIiBdOyB0aGVuCisgICAgICAgICAgICBzeXN0ZW1Ib3VyPSR7c3lzdGVtSG91cjoxOjF9CisgICAgICAgIGZpCisgICAgICAgIHN5c3RlbVRpbWVTaG9ydD1gVFo9JHR6bmFtZSBkYXRlICslYlwgJWQsXCAlWWAKKyAgICAgICAgc3lzdGVtVGltZVNob3J0PSIke3N5c3RlbVRpbWVTaG9ydH0gJHtzeXN0ZW1Ib3VyfSIKKyAgICAgICAgc3lzdGVtVGltZUFNUE09YFRaPSR0em5hbWUgZGF0ZSArJXBgCisgICAgICAgIGluZGV4MT1gZXhwciAiJHN5c3RlbVRpbWVTaG9ydCIgOiAnLionYAorICAgICAgICBpbmRleDI9YGV4cHIgIiRJQ1VUaW1lIiA6ICcuKidgLTIKKyAgICAgICAgSUNVVGltZVNob3J0PSR7SUNVVGltZTowOiR7aW5kZXgxfX0KKyAgICAgICAgSUNVQU1QTT0ke0lDVVRpbWU6JHtpbmRleDJ9OjJ9CisgICAgICAgIHN5c3RlbVRpbWU9YFRaPSR0em5hbWUgZGF0ZSArJWJcICVkLFwgJVlcICVyYAorICAgICAgICBpZiBbICIkc3lzdGVtVGltZVNob3J0IiA9PSAiJElDVVRpbWVTaG9ydCIgXSAmJiBbICIkc3lzdGVtVGltZUFNUE0iID09ICIkSUNVQU1QTSIgXTsgdGhlbgorICAgICAgICAgICAgaWYgWyAiJG9wdDEiICE9ICItYmFkIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyBUWj0kdHpuYW1lCisgICAgICAgICAgICAgICAgZWNobyBTeXN0ZW06ICRzeXN0ZW1UaW1lCisgICAgICAgICAgICAgICAgZWNobyBJQ1U6ICRJQ1VUaW1lCisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlIAorICAgICAgICAgICAgaWYgWyAiJG9wdDEiID09ICItYWxsIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAtLVRaPSR0em5hbWUKKyAgICAgICAgICAgICAgICBlY2hvIC0tU3lzdGVtOiAkc3lzdGVtVGltZQorICAgICAgICAgICAgICAgIGVjaG8gLS1JQ1U6ICRJQ1VUaW1lCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZWNobyBUWj0kdHpuYW1lCisgICAgICAgICAgICAgICAgZWNobyBTeXN0ZW06ICRzeXN0ZW1UaW1lCisgICAgICAgICAgICAgICAgZWNobyBJQ1U6ICRJQ1VUaW1lCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGZpCitkb25lCmRpZmYgLS1naXQgYS9yZWxlYXNlL2MvdWNvbmZpZ3Rlc3Quc2ggYi9yZWxlYXNlL2MvdWNvbmZpZ3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDY1ZjFmMwotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy91Y29uZmlndGVzdC5zaApAQCAtMCwwICsxLDMyOSBAQAorIyEvYmluL3NoCisjIEV4aGF1c3QoaXZlLCBpbmcpICAoTWVhbiwgTXVsdGkpICAoVGVzdCwgVHJvdWJsZSkKKyMgQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgSUJNIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworIyBCdWlsZHMgSUNVIGEgd2hvbGUgbG90dGEgdGltZXMgYW5kIHdpdGggZGlmZmVyZW50IG9wdGlvbnMKKyMgU2V0IHRoZSBvcHRpb25zIGJlbG93IGFuZCBleGVjdXRlIHRoaXMgc2NyaXB0IHdpdGggdGhlIHNoZWxsLgorCisjIFRoaXMgc2NyaXB0IGlzIGNoZWNrZWQgaW50byB0b29scy90cnVuay9yZWxlYXNlL2MuIEl0IGFzc3VtZXMgdGhhdCB0aGUKKyMgaWN1IGRpcmVjdG9yeSBpcyBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgdG9vbHMgIGRpcmVjdG9yeS4gSWYgdGhpcworIyBpcyBub3QgdGhlIGNhc2UsIHVzZSB0aGUgdWNvbmZpZ3Rlc3QubG9jYWwgZmlsZSB0byBzZXQgdGhlCisjIFNSQ19ESVIgdmFyaWFibGUgdG8gcG9pbnQgYXQgdGhlIElDVSBzb3VyY2UgZGlyZWN0b3J5LiAKKyMgT3IsIGFsdGVybmF0aXZlbHksIHlvdSBjYW4gbWFrZSBhIHN5bWxpbmsgdG9vbHMvaWN1IC0+IHlvdXJfaWN1X2RpcgorIyBZb3UgY2FuIGFsc28gdXNlIHRoZSB1Y29uZmlndGVzdC5sb2NhbCBmaWxlIHRvIG92ZXJyaWRlIHRoZSBCVUlMRF9ESVIKKyMgYW5kIElDVVBMQVRGT1JNIHZhcmlhYmxlcy4KKworIyBJdCBjYW4gYmUgaGFuZHkgdG8gcnVuICd0YWlsIC1GIHVjb25maWd0ZXN0L3N0YXRzJyBpbiBhbm90aGVyIHdpbmRvdyB0byBzZWUgd2hlcmUgdGhpbmdzIGFyZS4KKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLSBGaW5kIGZ1bGwgcGF0aCBuYW1lcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0pPUFQ9LWoyCisKKyMgY2hlY2sgZm9yIHVjb25maWd0ZXN0LmxvY2FsCitpZiBbIC1mIC4vdWNvbmZpZ3Rlc3QubG9jYWwgXQordGhlbgorICAgIC4gLi91Y29uZmlndGVzdC5sb2NhbAorZmkKKworIyBsb2NhdGlvbiBvZiB0aGlzIHNjcmlwdAorUz0kKHB3ZCkKKworIyBCdWlsZCByb290IC0gdG9vbHMvcmVsZWFzZS9jL3Vjb25maWd0ZXN0CitCVUlMRF9ESVI9JHtCVUlMRF9ESVI6LSR7U30vdWNvbmZpZ3Rlc3R9CisKK0ZBSUxTPSR7QlVJTERfRElSfS9mYWlscworU1RBVFM9JHtCVUlMRF9ESVJ9L3N0YXRzCisKKz4ke0ZBSUxTfQorPiR7U1RBVFN9CitlY2hvID4+ICR7U1RBVFN9CitlY2hvID4+ICR7U1RBVFN9CisKKyMgdGhlIHJ1bkNvbmZpZ3VyZUlDVSBwbGF0Zm9ybSBuYW1lCitJQ1VQTEFURk9STT0ke0lDVVBMQVRGT1JNOi1MaW51eH0KKworIyBHbG9iYWwgQ29uZmlnIG9wdGlvbnMgdG8gdXNlCisjZXhwb3J0IENPUFRTPSIgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUiCitleHBvcnQgQ09QVFM9CisKKyMgR2xvYmFsIHRlc3Rpbmcgb3B0aW9ucyB0byB1c2UKK2V4cG9ydCBJTlRMVEVTVE9QVFM9LXcgCitleHBvcnQgQ0lOVExURVNUX09QVFM9LXcKKyMgLS0tIFByb2JhYmx5IHdpbGwgbm90IG5lZWQgdG8gbW9kaWZ5IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIC0tLQorCisjIElDVSBkaXJlY3RvcnkgaXMgJFMvLi4vLi4vLi4vaWN1CitJQ1U9JChkaXJuYW1lICQoZGlybmFtZSAkKGRpcm5hbWUgJHtTfSkpKS9pY3UKKworIyBTb3VyY2UgZGlyZWN0b3J5CitTUkNfRElSPSR7U1JDX0RJUjotJHtJQ1V9L3NvdXJjZX0KKworIyAtLS0tLS0tLS0tLS0gRW5kIG9mIGNvbmZpZyB2YXJpYWJsZXMKK1VDT05GSUdfSD0kU1JDX0RJUi9jb21tb24vdW5pY29kZS91Y29uZmlnLmgKK1VDT05GSUdfTE9DQUxfSD11Y29uZmlnX2xvY2FsLmgKK1VDT05GSUdfVVNFX0xPQ0FMPVVDT05GSUdfVVNFX0xPQ0FMCisjIFByZXBhcmUgdWNvbmZpZy5oCitpZiBncmVwIC1xICR7VUNPTkZJR19MT0NBTF9IfSAgJFVDT05GSUdfSCA7Cit0aGVuCisgICAgZWNobyAiIyAkVUNPTkZJR19IIGFscmVhZHkgY29udGFpbnMgb3VyIHBhdGNoLCBubyBjaGFuZ2UiCitlbHNlCisgICAgbXYgJFVDT05GSUdfSCAke1VDT05GSUdfSH0ub3JpZworICAgIGNhdCA+ICRVQ09ORklHX0ggIDw8RU9GCisjaWYgZGVmaW5lZCgke1VDT05GSUdfVVNFX0xPQ0FMfSkKKyNpbmNsdWRlICR7VUNPTkZJR19MT0NBTF9IfSIKKyNlbmRpZgorLyogZm9yIHVjb25maWd0ZXN0LnNoIC0geW91IG1heSBSRU1PVkUgYWJvdmUgdGhpcyBsaW5lICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworRU9GCitjYXQgJHtVQ09ORklHX0h9Lm9yaWcgPj4gJHtVQ09ORklHX0h9CisgICAgZWNobyAiIyAkVUNPTkZJR19IIHVwZGF0ZWQiCitmaQorCisKKyMgU3RhcnQsICBzZXQgYSBkZWZhdWx0IG5hbWUgdG8gc3RhcnQgd2l0aCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nCisKK2V4cG9ydCBOQU1FPWZvbworbWtkaXIgLXAgJHtCVUlMRF9ESVJ9ICR7QlVJTERfRElSfS90aW1lcyAyPi9kZXYvbnVsbAorCisjIEJhbm5lciBmdW5jdGlvbiAtIHByaW50IGEgc2VwYXJhdG9yIHRvIHNwbGl0IHRoZSBvdXRwdXQKK2JhbigpCit7CisgICAgZWNobworICAgIGVjaG8KKyAgICBlY2hvICIjLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSROQU1FLS0tLS0tLS0tLS0tLSAtIyIKKyAgICBlY2hvCisgICAgZWNobyAiQ1BQRkxBR1MgPSAkQ1BQRkxBR1MiCisgICAgZWNobyAiVUNPTkZJR1MgPSAkVUNPTkZJR1MiCisgICAgZWNobworICAgIGVjaG8gIiBidWlsZCB0byAke0JVSUxEX0RJUn0vJHtOQU1FfSBhbmQgaW5zdGFsbCBpbiAke0JVSUxEX0RJUn0vSSR7TkFNRX0gIgorICAgIGVjaG8KKworICAgIGVjaG8gIiR7TkFNRX0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA+PiAke1NUQVRTfQorfQorCisjIENsZWFuIHVwIHRoZSBvbGQgdHJlZSBiZWZvcmUgYnVpbGRpbmcgYWdhaW4KK2NsZWFuKCkKK3sKKyAgICBzdGF0cyBjbGVhbgorICAgIGVjaG8gY2xlYW5pbmcgJHtCVUlMRF9ESVJ9LyR7TkFNRX0gYW5kICR7QlVJTERfRElSfS9JJHtOQU1FfQorICAgIHJtIC1yZiAke0JVSUxEX0RJUn0vSSR7TkFNRX0gJHtCVUlMRF9ESVJ9LyR7TkFNRX0KKyAgICBta2RpciAtcCAke0JVSUxEX0RJUn0vJHtOQU1FfQorfQorCisjIFJ1biBjb25maWd1cmUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9ucyAob3V0IG9mIHNvdXJjZSBidWlsZCkKK2NvbmZpZygpCit7CisgICAgc3RhdHMgY29uZmlnCisgICAgbWtkaXIgLXAgJHtCVUlMRF9ESVJ9LyR7TkFNRX0gMj4vZGV2L251bGwKKyAgICBjZCAke0JVSUxEX0RJUn0vJHtOQU1FfQorICAgIG1rZGlyIGVtdGluYyAyPi9kZXYvbnVsbAorCisgICAgIyBteWNvbmZpZy5oCisgICAgY2F0ID4gZW10aW5jLyR7VUNPTkZJR19MT0NBTF9IfSA8PEVPRgorLyogTkFNRT0ke05BTUV9ICAgICAgICAgICAgKi8KKy8qIFVDT05GSUdTPSR7VUNPTkZJR1N9ICAgICovCisvKiBDUFBGTEFHUz0ke0NQUEZMQUdTfSAgICAqLworI2lmbmRlZiBfTVlDT05GSUdfSAorI2RlZmluZSBfTVlDT05GSUdfSAorCitFT0YKKyAgICBmb3Igd2hhdCBpbiBgZWNobyAkVUNPTkZJR1NgOworICAgIGRvCisgICAgICAgIGVjaG8gIiNkZWZpbmUgVUNPTkZJR18ke3doYXR9IDEiID4+IGVtdGluYy8ke1VDT05GSUdfTE9DQUxfSH0KKyAgICBkb25lCisgICAgY2F0ID4+IGVtdGluYy8ke1VDT05GSUdfTE9DQUxfSH0gPDxFT0YKKyNlbmRpZgorRU9GCisgICAgQ1BQRkxBR1M9IiR7Q1BQRkxBR1N9IC1EJHtVQ09ORklHX1VTRV9MT0NBTH0gLUkke0JVSUxEX0RJUn0vJHtOQU1FfS9lbXRpbmMiCisgICAgZWNobyAiQ1BQRkxBR1M9XCIkQ1BQRkxBR1NcIiBDb25maWd1cmUgJENPUFRTIC0tc3JjZGlyPSRTUkNfRElSIgorICAgICRTUkNfRElSL3J1bkNvbmZpZ3VyZUlDVSAke0lDVVBMQVRGT1JNfSAkQ09QVFMgLS1wcmVmaXg9JHtCVUlMRF9ESVJ9L0kke05BTUV9IC0tc3JjZGlyPSRTUkNfRElSIDI+JjEgPiAke0JVSUxEX0RJUn0vJHtOQU1FfS9jb25maWcub3V0Cit9CisKK3N0YXRzKCkKK3sKKyAgICBTVEFUVVM9IiR7TkFNRX06ICR7MX0gCSJgZGF0ZWAKKyAgICBlY2hvICR7U1RBVFVTfSA+PiAke1NUQVRTfQorICAgIGVjaG8gIhtbMW0qKiogJHtOQU1FfSAqKioqKioqKiogJHsxfSAqKioqKioqKioqKioqIBtbbSIKK30KKworZmFpbCgpCit7CisgICAgRkFJTFVSRT0iZXJyb3I6ICR7QlVJTERfRElSfS8ke05BTUV9OiAkezF9ICJgZGF0ZWAKKyAgICBlY2hvICR7RkFJTFVSRX0gPj4gJHtGQUlMU30KKyAgICBlY2hvICR7RkFJTFVSRX0gPj4gJHtTVEFUU30KKyAgICBlY2hvICIbWzdtJHtGQUlMVVJFfRtbbSIKK30KKworIyBEbyBhbiBhY3R1YWwgYnVpbGQKK2JsZCgpCit7CisjIyojIyAgU3RyZWFtIGZpbHRlciB0byBwdXQgJ05BTUU6ICcgaW4gZnJvbnQgb2YKKyMjKiMjICBldmVyeSBsaW5lOgorIyMqIyMgICAgICAuIC4gLiAgIDI+JjEgfCB0ZWUgLWEgLi9ibGQubG9nIHwgc2VkIC1lICJzL14vJHtOQU1FfTogLyIKKyAgICBjZCAke0JVSUxEX0RJUn0vJHtOQU1FfQorICAgIHN0YXRzICJtYWtlIC1rICR7Sk9QVH0gYWxsICR7MX0iCisgICAgL3Vzci9iaW4vdGltZSAtbyAke0JVSUxEX0RJUn0vdGltZXMvJHtOQU1FfS5hbGwgICAgIG1ha2UgLWsgJHtKT1BUfSBhbGwgJHsxfSAgICBERVBTPSAgICAgICAgICAgICAgICAgIHx8IGZhaWwgbWFrZQorICAgIHN0YXRzIGluc3RhbGwKKyAgICAvdXNyL2Jpbi90aW1lIC1vICR7QlVJTERfRElSfS90aW1lcy8ke05BTUV9Lmluc3RhbGwgbWFrZSAtayBpbnN0YWxsICR7MX0gICAgICAgIERFUFM9ICAgICAgICAgIElOU1RBTExfREFUQT0nbG4gLXN2ZiAnICB8fCBmYWlsIGluc3RhbGwKKyAgICAvdXNyL2Jpbi90aW1lIC1vICR7QlVJTERfRElSfS90aW1lcy8ke05BTUV9LmlsICAgICAgbWFrZSAtayBpbnN0YWxsLWxvY2FsICR7MX0gIERFUFM9ICAgICAgICAgIHx8IGZhaWwgaW5zdGFsbC1sb2NhbAorICAgIHN0YXRzIGNoZWNrCisgICAgL3Vzci9iaW4vdGltZSAtbyAke0JVSUxEX0RJUn0vdGltZXMvJHtOQU1FfS5jaGsgICAgIG1ha2UgLWsgJHtKT1BUfSBjaGVjayAkezF9IElOVExURVNUX09QVFM9LXcgQ0lOVExUU1RfT1BUUz0tdyBERVBTPSB8fCBmYWlsIGNoZWNrCisgICAgc3RhdHMgaGRydHN0CisgICAgUEFUSD0ke0JVSUxEX0RJUn0vSSR7TkFNRX0vYmluOiRQQVRIIG1ha2UgLWsgLUMgJHtCVUlMRF9ESVJ9LyR7TkFNRX0vdGVzdC9oZHJ0c3QvICBERVBTPSBjaGVjayAgICB8fCBmYWlsIGhkcnRzdAorfQorCisKKyMgRG8gYSBjb21wbGV0ZSBjeWNsZSBmb3IgYSBydW4KKyMgYXJnOiBvcHRzIHRvIGJ1aWxkCitkb2l0KCkKK3sKK2JhbiA7IGNsZWFuIDsgY29uZmlnIDsgYmxkICR7MX0KK30KKworIyBTZXQgdXAgdGhlIHZhcmlhYmxlcyBmb3IgY29udmVuaWVuY2UKK05PX0NPTD0iTk9fQ09MTEFUSU9OIgorTk9fQlJLPSJOT19CUkVBS19JVEVSQVRJT04iCitOT19GTVQ9Ik5PX0ZPUk1BVFRJTkciCitOT19VQ009Ik5PX0xFR0FDWV9DT05WRVJTSU9OIgorIyBTaW5jZSBOT19DT05WRVJTSU9OIGlzIG9ubHkgbWVhbnQgdG8gYWxsb3cgdGhlIGNvbW1vbiBhbmQgaTE4bgorIyBsaWJyYXJpZXMgdG8gYmUgYnVpbHQsIHdlIGRvbid0IHRlc3QgdGhpcyBjb25maWd1cmF0aW9uLgorI05PX0NOVj0iTk9fQ09OVkVSU0lPTiIKK05PX0ZJTz0iTk9fRklMRV9JTyIKK05PX1hMVD0iTk9fVFJBTlNMSVRFUkFUSU9OIgorTk9fUkdYPSJOT19SRUdVTEFSX0VYUFJFU1NJT05TIgorSlNfQ09MPSJPTkxZX0NPTExBVElPTiIKK05PX05STT0iTk9fTk9STUFMSVpBVElPTiIKK05PX0lETj0iTk9fSUROQSIKK05PX1NWQz0iTk9fU0VSVklDRSIKK05PX01TVD0iJE5PX0NPTCAkTk9fQlJLICROT19GTVQgJE5PX1VDTSAkTk9fRklPICROT19SR1ggJE5PX1hMVCAkTk9fTlJNICROT19JRE4gJE5PX1NWQyIKK05PX0FMTD0iJE5PX01TVCAkTk9fU1ZDIgorCisjIE5vdywgY29tZSB0aGUgYWN0dWFsIHRlc3QgcnVucworIyBFYWNoIG9uZSBzZXRzIGEgTkFNRSwgYW5kIENQUEZMQUdTIG9yIG90aGVyIGZsYWdzLCBhbmQgY2FsbHMgZG9pdAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERFRkFVTFQKK2V4cG9ydCBOQU1FPURFRkFVTFQKK2V4cG9ydCBVQ09ORklHUz0iIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CitVU0VfUFJFQlVJTFRfREFUQT0iSUNVREFUQV9TT1VSQ0VfQVJDSElWRT1gZWNobyAke0JVSUxEX0RJUn0vREVGQVVMVC9kYXRhL291dC90bXAvKi5kYXRgIgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX01TVAorZXhwb3J0IE5BTUU9Tk9fTVNUCitleHBvcnQgVUNPTkZJR1M9IiROT19NU1QiCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19SR1gKK2V4cG9ydCBOQU1FPU5PX1JHWAorZXhwb3J0IFVDT05GSUdTPSIkTk9fUkdYIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0ICR7VVNFX1BSRUJVSUxUX0RBVEF9CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9fQ09MCitleHBvcnQgTkFNRT1OT19DT0wKK2V4cG9ydCBVQ09ORklHUz0iJE5PX0NPTCIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX0JSSworZXhwb3J0IE5BTUU9Tk9fQlJLCitleHBvcnQgVUNPTkZJR1M9IiROT19CUksiCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19GTVQKK2V4cG9ydCBOQU1FPU5PX0ZNVAorZXhwb3J0IFVDT05GSUdTPSIkTk9fRk1UIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9fVUNNCitleHBvcnQgTkFNRT1OT19VQ00KK2V4cG9ydCBVQ09ORklHUz0iJE5PX1VDTSIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX0ZJTworZXhwb3J0IE5BTUU9Tk9fRklPCitleHBvcnQgVUNPTkZJR1M9IiROT19GSU8iCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQgJHtVU0VfUFJFQlVJTFRfREFUQX0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19YTFQKK2V4cG9ydCBOQU1FPU5PX1hMVAorZXhwb3J0IFVDT05GSUdTPSIkTk9fWExUIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9fSUROCitleHBvcnQgTkFNRT1OT19JRE4KK2V4cG9ydCBVQ09ORklHUz0iJE5PX0lETiIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX05STQorZXhwb3J0IE5BTUU9Tk9fTlJNCitleHBvcnQgVUNPTkZJR1M9IiROT19OUk0iCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19TVkMKK2V4cG9ydCBOQU1FPU5PX1NWQworZXhwb3J0IFVDT05GSUdTPSIkTk9fU1ZDIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSlNfQ09MCitleHBvcnQgTkFNRT1KU19DT0wKK2V4cG9ydCBVQ09ORklHUz0iJEpTX0NPTCIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX0FMTAorZXhwb3J0IE5BTUU9Tk9fQUxMCitleHBvcnQgVUNPTkZJR1M9IiROT19BTEwiCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitOQU1FPWRvbmUKK2JhbgorZWNobyAiQWxsIGJ1aWxkcyBmaW5pc2hlZCEgVGltZXMgYXJlIGluICR7QlVJTERfRElSfS90aW1lcyIKK2VjaG8gIlRoZXJlIHdlcmUgZXJyb3JzIGlmIHRoZSBmb2xsb3dpbmcgZ3JlcCBmaW5kcyBhbnl0aGluZy4iCitlY2hvICJncmVwIHN0YXR1cyAke0JVSUxEX0RJUn0vdGltZXMvKiIKK2dyZXAgc3RhdHVzICR7QlVJTERfRElSfS90aW1lcy8qCisKK2lmIFsgLXMgJHtGQUlMU30gXTsKK3RoZW4KKyAgICBlY2hvICJGYWlsdXJlczogIgorICAgIGNhdCAke0ZBSUxTfQorZmkKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhLy5jbGFzc3BhdGggYi9yZWxlYXNlL2phdmEvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU1OGM0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDkgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKy0tPgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJjbGFzc2VzIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS8ucHJvamVjdCBiL3JlbGVhc2UvamF2YS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdmZGNlCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisjIENvcHlyaWdodCAoQykgMjAwOSBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorLS0+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPnRvb2xzajwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvTWFrZWZpbGUgYi9yZWxlYXNlL2phdmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMTcyMAotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvamF2YS9NYWtlZmlsZQpAQCAtMCwwICsxLDgxIEBACisjIENvcHlyaWdodCAoQykgMjAwOS0yMDExIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyMKKyMKKyMKKyNVc2FnZToKKyMgbWFrZSBPTERfSUNVPS94c3JsL0UvNDAxbTQwICBORVdfSUNVPS94c3JsL0UvaWN1NGN0NDIKKyMKKyMgeW91IGNhbiBwdXQgdGhlIE9MRF9JQ1U9eHggYW5kIE5FV19JQ1U9eXkgaW4gc2VwYXJhdGUgbGluZXMgaW4gTWFrZWZpbGUubG9jYWwgCisjCisKK0FOVD1hbnQKK0FOVF9UQVJHRVQ9YXBpcmVwb3J0CitET1hZR0VOPWRveHlnZW4KKworLWluY2x1ZGUgTWFrZWZpbGUubG9jYWwKKworVEFSR0VUPUFQSUNoYW5nZVJlcG9ydC5odG1sCisKK05PVFNFVD0KKworaWZlcSAoJChPTERfSUNVKSwpCitOT1RTRVQ6PSIkKE5PVFNFVCkgT0xEX0lDVSIKK2VuZGlmCisKK2lmZXEgKCQoTkVXX0lDVSksKQorTk9UU0VUOj0iJChOT1RTRVQpIE5FV19JQ1UiCitlbmRpZgorCitpZmVxICgkKE5FV19JQ1VfQlVJTEQpLCkKK05FV19JQ1VfQlVJTEQ6PSQoTkVXX0lDVSkvc291cmNlCitlbmRpZgorCitpZmVxICgkKE9MRF9JQ1VfQlVJTEQpLCkKK09MRF9JQ1VfQlVJTEQ6PSQoT0xEX0lDVSkvc291cmNlCitlbmRpZgorCithbGw6ICQoVEFSR0VUKSAkKExPQ0FMX1RBUkdFVCkKKworCitpZm5lcSAoJChOT1RTRVQpLCkKK2NoZWNrLXZhcnM6CisJQGVjaG8gIkVycm9yOiBwbGVhc2Ugc2V0ICQoTk9UU0VUKSBpbiBNYWtlZmlsZS5sb2NhbCBvciBvbiB0aGUgY29tbWFuZCBsaW5lLiIKKwlmYWxzZQorZWxzZQorY2hlY2stdmFyczoKK2VuZGlmCisKKy5QSE9OWTogY2hlY2stdmFycyBjbGFzc2VzIGNsZWFuLWRvY3MKKworLlBSRUNJT1VTOiAkKFRBUkdFVCkgJChPTERfSUNVX0JVSUxEKS8kKERPWFlGSUxFKSAkKE5FV19JQ1VfQlVJTEQpLyQoRE9YWUZJTEUpCisKKyMjIyMjIyMKK0RPWFlGSUxFPURveHlmaWxlCitYTUw9ZG9jL3htbAorVVZFUlNJT05IPSQoWE1MKS91dmVyc2lvbl84aC54bWwKKworY2xlYW4tZG9jczogfCBjaGVjay12YXJzCisJLXJtIC1yZiAiJChPTERfSUNVX0JVSUxEKS8kKFhNTCkiICIkKE5FV19JQ1VfQlVJTEQpLyQoWE1MKSIKKworJChUQVJHRVQpOiBjaGVjay12YXJzICQoT0xEX0lDVV9CVUlMRCkvJChYTUwpICQoTkVXX0lDVV9CVUlMRCkvJChYTUwpIAorCWVjaG8gIlJlbWVtYmVyIHRvIHJ1biB0aGUgbm9uLWFzY2lpIGZpbGUgZGV0ZWN0b3IgaWYgeW91IGdldCBlcnJvcnMuIgorCSQoQU5UKSAtRG9sZGRpcj0iJChPTERfSUNVX0JVSUxEKS8kKFhNTCkiIC1EbmV3ZGlyPSIkKE5FV19JQ1VfQlVJTEQpLyQoWE1MKSIgJChBTlRfVEFSR0VUKQorCisjIGNoZWNrLXZhcnMgJChPTERfSUNVX0JVSUxEKS8kKFhNTCkgJChORVdfSUNVX0JVSUxEKS8kKFhNTCkgCitBUElDaGFuZ2VSZXBvcnQueG1sOgorCWVjaG8gIlJlbWVtYmVyIHRvIHJ1biB0aGUgbm9uLWFzY2lpIGZpbGUgZGV0ZWN0b3IgaWYgeW91IGdldCBlcnJvcnMuIgorCSQoQU5UKSAtRG9sZGRpcj0iJChPTERfSUNVX0JVSUxEKS8kKFhNTCkiIC1EbmV3ZGlyPSIkKE5FV19JQ1VfQlVJTEQpLyQoWE1MKSIgJChBTlRfVEFSR0VUKV94bWwKKworJS9kb2MveG1sOgklL0RveHlmaWxlCisjIGRvbid0IGNhcmUgd2hhdCBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIHByZXZpb3VzbHkgLSBzZXQgaXQgdG8geWVzLgorCUBlY2hvIHJ1bm5pbmcgZG94eXVnZW4gLi4gCisJKCBjZCAiJCovIiAmJiAoIChjYXQgLi9Eb3h5ZmlsZSB8IGdyZXAgLXYgJ15HRU5FUkFURV8nKSA7ICBlY2hvICdHRU5FUkFURV9YTUw9WUVTJykgIHwgJChET1hZR0VOKSAtICApCisJQGVjaG8gZG94eWdlbiBkb25lIGluICQqCisKKyUvRG94eWZpbGU6CSUvTWFrZWZpbGUKKwlAZWNobyBnZW5lcmF0aW5nICRACisJQCQoTUFLRSkgLUMgICIkKi8iIERveHlmaWxlIHx8ICggZWNobyAiY291bGQgbm90IG1ha2UgRG94eWZpbGUgaW4gJCogIC0gd2FzIGRveHlnZW4gYXZhaWxhYmxlPyIgOyBmYWxzZSApCisKKyMlL3NvdXJjZS9NYWtlZmlsZTogJS9zb3VyY2UvTWFrZWZpbGUuaW4KKyMJQGVjaG8gIiRAIGRvZXMgbm90IHNlZW0gdG8gZXhpc3QgLSB3YXMgY29uZmlndXJlIHJ1bj8iIDsgZmFsc2UKZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS9idWlsZC54bWwgYi9yZWxlYXNlL2phdmEvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZjBmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2phdmEvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTI5IEBACis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGlzIHRoZSBhbnQgYnVpbGQgZmlsZSBmb3IgSUNVIHRvb2xzLiAKKyovCistLT4KKzxwcm9qZWN0IG5hbWU9InJlbGVhc2UtdG9vbHMiIGRlZmF1bHQ9InRvb2xzIiBiYXNlZGlyPSIuIiA+CisgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgICAgPHRzdGFtcC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0ic3JjIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiB2YWx1ZT0ibGliIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJjbGFzc2VzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBmaWxlPSJhcGktcmVwb3J0LnByb3BlcnRpZXMiIC8+CisKKyAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9ImphdmEgaG9tZTogJHtqYXZhLmhvbWV9Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9ImphdmEgdmVyc2lvbjogJHtqYXZhLnZlcnNpb259Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9ImphdmEgdmVuZG9yOiAke2phdmEudm0udmVuZG9yfSIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJhbnQgamF2YSB2ZXJzaW9uOiAke2FudC5qYXZhLnZlcnNpb259Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IiR7YW50LnZlcnNpb259Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IiR7YmFzZWRpcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idG9vbHMiICBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iY29tcGlsZSByZWxlYXNlIHRvb2xzIj4KKyAgICAgICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgaW5jbHVkZXM9IioqLyouamF2YSIKKyAgICAgICAgICAgIHNyY2Rpcj0iJHtzcmMuZGlyfSIKKyAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIKKyAgICAgICAgICAgIHNvdXJjZT0iMS41IgorICAgICAgICAgICAgZGVidWc9Im9uIiBkZXByZWNhdGlvbj0ib2ZmIgorICAgICAgICAgICAgZW5jb2Rpbmc9ImFzY2lpIi8+CisgICAgPC90YXJnZXQ+ICAgICAgICAgICAgIAorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249InJlbW92ZSBhbGwgYnVpbGQgdGFyZ2V0cyI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iYXBpcmVwb3J0IiBkZXBlbmRzPSJ0b29scyI+ICAgIAorICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5pYm0uaWN1LmRldi50b29scy5kb2NzLlN0YWJsZUFQSSIgZm9yaz0ieWVzIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgIAorPCEtLQorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItREVMRVRFTUUtbmV3dmVyIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIjQuNiIvPgorLS0+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1vbGRkaXIiLz4gCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7b2xkZGlyfSIvPgorICAgICAgICAgICAgCis8IS0tCisJISEgT25seSBuZWVkIHRoZXNlIGlmIHlvdSBtdXN0IG92ZXJyaWRlLiBSZW1vdmUgdGhlIERFTEVURU1FCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIi1ERUxFVEVNRS1uZXd2ZXIiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtuZXd2ZXJ9Ii8+CistLT4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLW5ld2RpciIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICIke25ld2Rpcn0iLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLWNwcHhzbHQiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtiYXNlZGlyfS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENwcEZ1bmMueHNsdCIvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIi0tY3hzbHQiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtiYXNlZGlyfS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENGdW5jLnhzbHQiLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLXJlcG9ydHhzbHQiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtiYXNlZGlyfS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VuUmVwb3J0LnhzbHQiLz4KKworICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLXJlc3VsdGZpbGUiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtiYXNlZGlyfS9BUElDaGFuZ2VSZXBvcnQuaHRtbCIvPgorCisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofS8iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bGliLmRpcn0veGFsYW4uamFyIi8+CisJCTxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsaWIuZGlyfS94ZXJjZXNJbXBsLmphciIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIuIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC9qYXZhPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iYXBpcmVwb3J0X3htbCIgZGVwZW5kcz0idG9vbHMiPiAgICAKKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uaWJtLmljdS5kZXYudG9vbHMuZG9jcy5TdGFibGVBUEkiIGZvcms9InllcyIgZmFpbG9uZXJyb3I9InRydWUiPgorCis8IS0tCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIi1ERUxFVEVNRS1uZXd2ZXIiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiNC40LjEiLz4KKyAgICAKKy0tPgorCis8IS0tICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLURFTEVURU1FLW5ld3ZlciIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICI0LjYiLz4KKy0tPiAgICAgICAgICAgIAorCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIi0tb2xkZGlyIi8+IAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICIke29sZGRpcn0iLz4KKyAgICAgICAgICAgIAorPCEtLQorCSEhIE9ubHkgbmVlZCB0aGVzZSBpZiB5b3UgbXVzdCBvdmVycmlkZS4gUmVtb3ZlIHRoZSBERUxFVEVNRQorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItREVMRVRFTUUtbmV3dmVyIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7bmV3dmVyfSIvPgorLS0+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1uZXdkaXIiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtuZXdkaXJ9Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1jcHB4c2x0Ii8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7YmFzZWRpcn0vc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDcHBGdW5jX3htbC54c2x0Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1jeHNsdCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICIke2Jhc2VkaXJ9L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ0Z1bmNfeG1sLnhzbHQiLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLXJlcG9ydHhzbHQiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtiYXNlZGlyfS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VuUmVwb3J0X3htbC54c2x0Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1yZXN1bHRmaWxlIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7YmFzZWRpcn0vQVBJQ2hhbmdlUmVwb3J0LnhtbCIvPgorCisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofS8iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bGliLmRpcn0veGFsYW4uamFyIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2xpYi5kaXJ9L3hlcmNlc0ltcGwuamFyIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9Ii4iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmE+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvaWN1NGMuY3NzIGIvcmVsZWFzZS9qYXZhL2ljdTRjLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGU4NjA1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL2ljdTRjLmNzcwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIERlZmF1bHQgQ1NTIHN0eWxlIHNoZWV0IGZvciB0aGUgSUNVNEMgT3BlbiBTb3VyY2UgcmVhZG1lCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworICogQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworLyogR2xvYmFsIHN0eWxlcyAqLworCitib2R5LHAsbGksb2wsdWwsdGgsdGQgeworCWZvbnQtc2l6ZTogMTBwdDsKKwlmb250LWZhbWlseTogIkFyaWFsIiwgIkhlbHZldGljYSIsIHNhbnMtc2VyaWY7Cit9CisKK2JvZHkgeworCW1hcmdpbjogMWVtOworfQorCitib2R5LmRyYWZ0IHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2RyYWZ0YmcucG5nKTsKK30KKworLm1haW5ib2R5IHsKKwlwYWRkaW5nOiAxZW07Cit9CisKKy8qCisgKiBDdXN0b21pemUgdGhlIGhlYWRlcnMgdG8gaGF2ZSBsZXNzIHNwYWNlIGFyb3VuZCB0aGVtIHRoYW4gdXN1YWwKKyAqLworCitoMSB7CisJbWFyZ2luLWJvdHRvbTogLjVlbTsKKwltYXJnaW4tdG9wOiAuNWVtOworCXBhZGRpbmctYm90dG9tOiAuNWVtOworCXBhZGRpbmctdG9wOiAuNWVtOworCWZvbnQtd2VpZ2h0OiA3MDA7CisJZm9udC1zaXplOiAyMHB0OworCWZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworCWJvcmRlci13aWR0aDogMnB4OworCWJvcmRlci1zdHlsZTogc29saWQ7CisJdGV4dC1hbGlnbjogY2VudGVyOworCXdpZHRoOiAxMDAlOworCWZvbnQtc2l6ZTogMjAwJTsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworaDIgeworCWJvcmRlci10b3A6IDJweCBzb2xpZCAjMjJkOworCWJvcmRlci1sZWZ0OiAycHggc29saWQgIzIyZDsKKwltYXJnaW4tYm90dG9tOiAwLjVlbTsKKwlwYWRkaW5nLWxlZnQ6IDRweDsKKwltYXJnaW4tdG9wOiAxMnB0OworCWZvbnQtd2VpZ2h0OiA3MDA7CisJZm9udC1zaXplOiAyZW07CisJZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKKwlwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzOworfQorCitoMiBhIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6IGJsYWNrOworfQorCitoMiBhOmhvdmVyIHsKKwljb2xvcjogYmx1ZTsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworaDMgeworCWJvcmRlci10b3A6IDFweCBzb2xpZCBncmF5OworCWNvbG9yOiAjMWUxYzQ2OworCW1hcmdpbi1ib3R0b206IDBwdDsKKwltYXJnaW4tdG9wOiAxMnB0OworCXBhZGRpbmctbGVmdDogMDsKKwltYXJnaW4tbGVmdDogMWVtOworCW1hcmdpbi10b3A6IDAuMmVtOworCXBhZGRpbmctYm90dG9tOiAwLjRlbTsKKwlmb250LXNpemU6IDEuNWVtOworCWZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworfQorCitoMyBhIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6IGJsYWNrOworfQorCitoMyBhOmhvdmVyIHsKKwljb2xvcjogYmx1ZTsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworaDQgeworCW1hcmdpbi1sZWZ0OiAxLjVlbTsKKwltYXJnaW4tYm90dG9tOiAwcHQ7CisJbWFyZ2luLXRvcDogMTJwdDsKKwlmb250LXNpemU6IDEuMGVtOworCWZvbnQtd2VpZ2h0OiBib2xkZXI7CisJZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7Cit9CisKK2g0IGEgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogYmxhY2s7Cit9CisKK2g0IGE6aG92ZXIgeworCWNvbG9yOiBibHVlOworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitoNSwgaDYgeworCW1hcmdpbi1sZWZ0OiAxLjhlbTsKKwltYXJnaW4tYm90dG9tOiAwcHQ7CisJbWFyZ2luLXRvcDogMTJwdDsKKwlwYWRkaW5nLWxlZnQ6IDAuNzVlbTsKKwlmb250LXNpemU6IHgtc21hbGw7CisJZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7Cit9CisKK3AscHJlLHRhYmxlLHVsLG9sLGRsIHsKKwltYXJnaW4tbGVmdDogMmVtOworfQorCisvKgorICogTmF2aWdhdGlvbiBzaWRlYmFyIG9uIHRoZSBsZWZ0IGhhbmQgb2YgbW9zdCBwYWdlcworICovCisKK3RkLnNpZGViYXIxIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjOTlDQ0ZGOworCWZvbnQtd2VpZ2h0OiA3MDA7CisJbWFyZ2luLXRvcDogMHB4OworCW1hcmdpbi1ib3R0b206IDBweDsKKwlwYWRkaW5nLXRvcDogMWVtOworCXBhZGRpbmctbGVmdDogMC4yZW07CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKwordGQuc2lkZWJhcjIgeworCWJhY2tncm91bmQtY29sb3I6ICM5OUNDRkY7CisJbWFyZ2luLXRvcDogMHB4OworCW1hcmdpbi1ib3R0b206IDBweDsKKwltYXJnaW4tbGVmdDogMHB4OworCXBhZGRpbmctdG9wOiAxcHg7CisJcGFkZGluZy1ib3R0b206IDFweDsKKwlwYWRkaW5nLWxlZnQ6IDFweDsKKwlwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwlkaXNwbGF5OiBibG9jazsKK30KKwordGQuc2lkZWJhcjI6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNFRUVFRkY7CisJcGFkZGluZy10b3A6IDFweDsKKwlwYWRkaW5nLWJvdHRvbTogMXB4OworCXBhZGRpbmctbGVmdDogMXB4OworCXBhZGRpbmctcmlnaHQ6IDAuNWVtOworfQorCithLnNpZGViYXIyIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJZGlzcGxheTogYmxvY2s7CisJd2lkdGg6IDEwMCU7Cit9CisKK2Euc2lkZWJhcjI6bGluayB7CisJY29sb3I6ICMwMDAwOTk7CisJZGlzcGxheTogYmxvY2s7Cit9CisKK2Euc2lkZWJhcjI6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNFRUVFRkY7CisJZGlzcGxheTogYmxvY2s7Cit9CisKKy51bmRlcmxpbmVob3Zlcjpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI0VFRUVGRjsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworLyogVGhpcyBpcyB0aGUgZmFkZWQgaGVhZGVyIGF0IHRoZSB0b3AgKi8KKwordGQuZmFkZWR0b3AgeworCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHA6Ly93d3cuaWN1LXByb2plY3Qub3JnL2ltYWdlcy9ncjEwMC5naWYpOworfQorCisvKiBSZWxhdGVkIHNpdGUgb24gdGhlIGxlZnQgKi8KKworcC5yZWxhdGVkc2l0ZSB7CisJY29sb3I6IFdoaXRlOworCWZvbnQtd2VpZ2h0OiA3MDA7CisJZm9udC1zaXplOiAxMHB0OworCW1hcmdpbi10b3A6IDFlbTsKKwltYXJnaW4tYm90dG9tOiAwOworCXBhZGRpbmctbGVmdDogMC4yZW07CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLyogUmVsYXRlZCBzaXRlIG9uIHRoZSBsZWZ0ICovCisKK3Auc2lkZWJhcjMgeworCW1hcmdpbi10b3A6IDAuNzVlbTsKKwltYXJnaW4tYm90dG9tOiAwOworCXBhZGRpbmctbGVmdDogMC44ZW07Cit9CisKK2Euc2lkZWJhcjMgeworCWZvbnQtc2l6ZTogMC45ZW07CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCithLnNpZGViYXIzOmxpbmsgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogV2hpdGU7Cit9CisKK2Euc2lkZWJhcjM6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisvKiBGQVEgKi8KKworbGkuZmFxX2NvbnRlbnRzIHsKKwlmb250LXdlaWdodDogNTAwOworfQorCitwLmZhcV9xIHsKKwlmb250LXdlaWdodDogNzAwOworCW1hcmdpbi1ib3R0b206IDBweDsKK30KKworcC5mYXFfYSB7CisJbWFyZ2luLXRvcDogMHB4OworfQorCisvKiBOZXdzIGl0ZW1zICovCisKK3RhYmxlLm5ld3NJdGVtIHsKKwlwYWRkaW5nLWxlZnQ6IDFlbTsKKwlwYWRkaW5nLXJpZ2h0OiAxZW07CisJYm9yZGVyLXdpZHRoOiBtZWRpdW07Cit9CisKK3RoLm5ld3NJdGVtIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OworCWNvbG9yOiBXaGl0ZTsKK30KKwordGQubmV3c0l0ZW0geworCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Cit9CisKK3RkLnJlbGVhc2UtbGluZSx0aC5yZWxlYXNlLWxpbmUgeworCXBhZGRpbmctbGVmdDogMC41ZW07CisJcGFkZGluZy1yaWdodDogMC41ZW07CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwlib3JkZXI6IDFweDsKK30KKworLm5vdGUgeworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlmb250LXNpemU6IHNtYWxsOworCW1hcmdpbi1sZWZ0OiAxZW07Cit9CisKK3NhbXAgeworCW1hcmdpbi1sZWZ0OiAxZW07CisJbWFyZ2luLXJpZ2h0OiAyZW07CisJYm9yZGVyLXN0eWxlOiBncm9vdmU7CisJcGFkZGluZzogMWVtOworCWRpc3BsYXk6IGJsb2NrOworCWJhY2tncm91bmQtY29sb3I6ICNFRUVFRUUKK30KKwordGFibGUucnRhYmxlIGNhcHRpb24geworCW1hcmdpbi1sZWZ0OiAycHg7CisJbWFyZ2luLXJpZ2h0OiAycHg7CisJcGFkZGluZzogM3B4OworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNkZWUyZmY7CisJdGV4dC1hbGlnbjogbGVmdDsKK30KKwordGFibGUucnRhYmxlIHRyIHRoIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZGVlMmZmOworCXRleHQtYWxpZ246IGxlZnQ7Cit9CisKK3RhYmxlLnJ0YWJsZSB0ciB0ZCB7CisJYmFja2dyb3VuZC1jb2xvcjogI2MwYzBmZDsKKwlwYWRkaW5nOiAzcHg7Cit9CisKK3RhYmxlLnJ0YWJsZSB0ci5icm9rZW4gdGQgeworCWJhY2tncm91bmQtY29sb3I6ICNmYmI7CisJYm9yZGVyOiAxcHggZGFzaGVkIGdyYXk7CisJcGFkZGluZzogM3B4OworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCit0YWJsZS5ydGFibGUgdHIucmFyZWx5IHRkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlOWMyOworCXBhZGRpbmc6IDNweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKKy8qICBBUElDaGFuZ2VSZXBvcnQgc3BlY2lmaWMgdGhpbmdzICovCisKKy5yb3cwIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKK30KKworLnJvdzEgeworCWJhY2tncm91bmQtY29sb3I6ICNkZmQ7Cit9CisKKy52ZXJjaGFuZ2UgeworCWNvbG9yOiByZWQ7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJZm9udC1zaXplOiBsYXJnZTsKK30KKworLnN0YWJjaGFuZ2UgeworCWNvbG9yOiByZWQ7CisJZm9udC1zaXplOiBsYXJnZTsKK30KKworLmJpZ3dhcm4geworCWNvbG9yOiByZWQ7CisJYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisJZm9udC1zaXplOiB4LWxhcmdlOworCW1hcmdpbjogMC41IGVtOworfQorCit0YWJsZS5nZW5UYWJsZSB7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKwlib3JkZXI6IDFweCBzb2xpZCBibGFjazsKK30KKworLyogJ2V2ZXJ5dGhpbmcgaW5jIHZlcnNpb24gKi8KKwordGFibGUuZ2VudGFibGUgdGQgeworCWJvcmRlcjogMXB4IHNvbGlkIGdyYXk7CisJcGFkZGluZzogMC4yNWVtOworCWZvbnQtc2l6ZTogc21hbGw7Cit9CisKKy8qIG5vdCB2ZXJzaW9uICovCisKK3RhYmxlLmdlblRhYmxlIHRkLmZpbGUsCit0YWJsZS5nZW5UYWJsZSB0ZC5wcm90byB7CisJYm9yZGVyOiBub25lOworCWZvbnQtc2l6ZTogbWVkaXVtOworfQorCit0YWJsZS5nZW5UYWJsZSB0ZC5maWxlIHsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlOworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitkaXYub3RoZXIgLnJvdzAgeworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworfQorCitkaXYub3RoZXIgLnJvdzEgeworCWJhY2tncm91bmQtY29sb3I6ICNkZGY7Cit9CisKK3RhYmxlLmRvY1RhYmxlIHsKKwlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworCWJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOworfQorCisvKiAnZXZlcnl0aGluZyBpbmMgdmVyc2lvbiAqLworCit0YWJsZS5kb2NUYWJsZSB0ZCwKK3RhYmxlLmRvY1RhYmxlIHRoIHsKKwlib3JkZXI6IDFweCBzb2xpZCBncmF5OworCXBhZGRpbmc6IDAuMjVlbTsKKwlmb250LXNpemU6IHNtYWxsOworfQorCisvKiBub3QgdmVyc2lvbiAqLworCit0YWJsZS5kb2NUYWJsZSB0ZC5maWxlLAordGFibGUuZG9jVGFibGUgdGQucHJvdG8geworCWJvcmRlcjogbm9uZTsKKwlmb250LXNpemU6IG1lZGl1bTsKK30KKwordGFibGUuZG9jVGFibGUgdGQuZmlsZSB7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworYWJiciB7CisJYm9yZGVyLWJvdHRvbTogMXB4IGRhc2hlZCAjMEIwOworfQorCitoMi5UT0MgeworCXBhZ2UtYnJlYWstYmVmb3JlOiBhdXRvOworfQorCitib2R5LnJlYWRtZSB7CisJCit9CisKK2NhcHRpb24geworCWZvbnQtd2VpZ2h0OiBib2xkOworCXRleHQtYWxpZ246IGxlZnQKK30KKworZGl2LmluZGVudCB7CisJbWFyZ2luLWxlZnQ6IDJlbQorfQorCit1bC5UT0MgeworCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKwlwYWRkaW5nLWxlZnQ6IDFlbTsKKwlmb250LXNpemU6IGxhcmdlcjsKK30KKwordWwuVE9DIGxpIGEgeworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCit1bC5UT0MgbGkgdWwgbGkgYSB7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CisJZm9udC1zaXplOiBzbWFsbDsKK30KKwordWwuVE9DIGxpIHVsIHsKKwltYXJnaW4tbGVmdDogMDsKKwlwYWRkaW5nLWxlZnQ6IDJlbTsKKwlmb250LXdlaWdodDogbm9ybWFsOworCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKK30KKworcHJlLnNhbXAsc2FtcCB7CisJbWFyZ2luLWxlZnQ6IDFlbTsKKwlib3JkZXItc3R5bGU6IGdyb292ZTsKKwlwYWRkaW5nOiAxZW07CisJZGlzcGxheTogYmxvY2s7CisJYmFja2dyb3VuZC1jb2xvcjogI0VFRUVFRQorfQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhL3JlYWRtZS50eHQgYi9yZWxlYXNlL2phdmEvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QyZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3JlYWRtZS50eHQKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitBUEkgQ2hhbmdlIFJlcG9ydDoKKworQSB0b29sIHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIEFQSSBzdGF0dXMgY2hhbmdlcyBiZXR3ZWVuIHR3byBJQ1U0QyByZWxlYXNlcy4KKyhJQ1U0SiBoYXMgYSBidWlsdGluIGNoYW5nZSByZXBvcnQgZ2VuZXJhdG9yKQorCitSZXF1aXJlbWVudHM6CisgIC0gRXZlcnl0aGluZyBuZWVkZWQgdG8gYnVpbGQgSUNVNEMgZnJvbSBhIGNvbW1hbmQgbGluZSAoVU5JWCkgZW52aXJvbm1lbnQKKyAgLSBEb3h5Z2VuIChmb3IgZ2VuZXJhdGluZyBkb2NzKS4KKyAgICAgRG94eWdlbiAxLjcuNS4xIGlzIHJlY29tbWVuZGVkIGZvciBJQ1UgQVBJIGRvY3MsIAorICAgICBidXQgYW4gb2xkZXIgRG94eWdlbiBtYXkgd29yayBmb3IgdGhlIEFQSSBDaGFuZ2UgUmVwb3J0LgorICAtIEphdmEgSkRLIDEuNSsKKyAgLSBBcGFjaGUgQW50CisKK1RvIHVzZSB0aGUgdXRpbGl0eToKKyAxLiBQdXQgYm90aCBvbGQgYW5kIG5ldyBJQ1Ugc291cmNlIHRyZWVzIG9uIHlvdXIgc3lzdGVtCisgMi4gUnVuICJjb25maWd1cmUiIGluIGJvdGggb2xkIGFuZCBuZXcgKHlvdSBjYW4gdXNlIGFueSBtaXh0dXJlIG9mIGluLXNvdXJjZSBhbmQgb3V0LW9mLXNvdXJjZSBidWlsZHMpLiBEb3h5Z2VuIG11c3QgYmUgZm91bmQgZHVyaW5nIHRoZSBjb25maWd1cmUgcGhhc2UsIGJ1dCB5b3UgZG8gbm90IG5lZWQgdG8gYnVpbGQgdGhlIHN0YW5kYXJkIEFQSSBkb2NzLgorIDMuIGNyZWF0ZSBhIE1ha2VmaWxlLmxvY2FsIGluIHRoaXMgcmVhZG1lJ3MgZGlyZWN0b3J5ICh0b29scy9yZWxlYXNlL2phdmEvKSAKKyAgICAgICAgICAgIHdpdGgganVzdCB0aGVzZSB0d28gbGluZXM6CisJCQlPTERfSUNVPS94c3JsL0UvaWN1LTEuMAorCQkJTkVXX0lDVT0veHNybC9FL2ljdS02LjgKKwkgICAoIHdoZXJlIHRoZXNlIGFyZSB0aGUgcGF0aHMgdG8gdGhlIHBhcmVudCBvZiAnc291cmNlJywgZXRjKSAgICAgCisgICAgICAgICAgIElmIHlvdXIgSUNVIGlzIGFuIG91dC1vZi1zb3VyY2UtYnVpbGQsIGFkZCB0aGVzZSB0d28gbGluZXMKKyAgICAgICAgICAgaW5kaWNhdGluZyB0aGUgYnVpbGQgbG9jYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBPTERfSUNVX0JVSUxEPS94c3JsL0UvaWN1LWJ1aWxkLW00OAorICAgICAgICAgICAgICAgICAgICAgICAgTkVXX0lDVV9CVUlMRD0veHNybC9FL2ljdS1idWlsZAorIDQuIGZyb20gdGhpcyBkaXJlY3RvcnksICh0b29scy9yZWxlYXNlL2phdmEvKSBydW4gTWFrZSB0byBidWlsZCBkb2NzOgorICAgICAgICAgICAgbWFrZQorIDUuIFRoaXMgd2lsbCBjcmVhdGUgYW4gJ0FQSUNoYW5nZVJlcG9ydC5odG1sJyBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LiBMb29rIGl0IG92ZXIsIGFuZCB0aGVuIGNoZWNrIGl0IGluIHRvICR7TkVXX0lDVX0vQVBJQ2hhbmdlUmVwb3J0Lmh0bWwgKHBhcmVudCBvZiBpY3Uvc291cmNlKS4KZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvU3RhYmxlQVBJLmphdmEgYi9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL1N0YWJsZUFQSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjVkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL1N0YWJsZUFQSS5qYXZhCkBAIC0wLDAgKzEsOTg3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDExLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisgKiBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDcmVhdGVkIG9uIDIwMDYtNy0yNCA/CisgKiBNb3ZlZCBmcm9tIEphdmEgMS40IHRvIDEuNT8gQVBJIGJ5IHNybCAyMDA5LTAxLTE2CisgKi8KK3BhY2thZ2UgY29tLmlibS5pY3UuZGV2LnRvb2xzLmRvY3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKKworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuZmFzdGluZm9zZXQuc3RheC5ldmVudHMuWE1MQ29uc3RhbnRzOworCisKKy8qKgorIEEgdXRpbGl0eSB0byByZXBvcnQgdGhlIHN0YXR1cyBjaGFuZ2UgYmV0d2VlbiB0d28gSUNVIHJlbGVhc2VzCisKK1RvIHVzZSB0aGUgdXRpbGl0eQorMS4gR2VuZXJhdGUgdGhlIFhNTCBmaWxlcworICAgIChwdXQgdGhlIHR3byBJQ1UgcmVsZWFzZXMgb24geW91ciBtYWNoaW5lIF5fXiApCisgICAgKGdlbmVyYXRlICdEb3h5Z2VuJyBmaWxlIG9uIFdpbmRvd3MgcGxhdGZvcm0gd2l0aCBDeWd3aW4ncyBoZWxwKQorICAgIEVkaXQgdGhlIGdlbmVyYXRlZCAnRG94eWdlbicgZmlsZSB1bmRlciBJQ1U0QyBzb3VyY2UgZGlyZWN0b3J5CisgICAgYSkgR0VORVJBVEVfWE1MICAgICAgICAgICA9IFlFUworICAgIGIpIFN5bmMgdGhlIEFMSUFTRVMgZGVmaW5pYXRpb24KKyAgICAgICAoRm9yIGV4YW1wbGUsIGNvcHkgdGhlIEFMSUFTRVMgZGVmaW5hdGlvbiBmcm9tIElDVSAzLjYKKyAgICAgICBEb3h5Z2VuIGZpbGUgdG8gSUNVIDMuNCBEb3h5Z2VuIGZpbGUuKQorICAgIGMpIGdlcmVuYXRlIHRoZSBYTUwgZmlsZXMKKzIuIEJ1aWxkIHRoZSB0b29sCisgICAgRG93bmxvYWQgQXBhY2hlIFhlcmNlcyBKYXZhIFBhcnNlcgorICAgIEJ1aWxkIHRoaXMgZmlsZSB3aXRoIHRoZSBsaWJyYXJ5CiszLiBFZGl0IHRoZSBhcGktcmVwb3J0LWNvbmZpZy54bWwgZmlsZSAmIENoYW5nZSB0aGUgZmlsZSBhY2NvcmRpbmcgeW91ciByZWFsIGNvbmZpZ3VyYXRpb24KKzQuIFJ1biB0aGUgdG9vbCB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LgorCisgKiBAYXV0aG9yIFJheW1vbmQgWWFuZworICovCitwdWJsaWMgY2xhc3MgU3RhYmxlQVBJIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfRk9MREVSID0gImRvY0ZvbGRlciI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX1hNTCA9ICJpbmRleC54bWwiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ1VfU1BBQ0VfUFJFRklYID0gIklDVSAiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMSVpFUl9YUEFUSCA9ICJpbml0aWFsaXplciI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfWFBBVEggPSAibmFtZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVWRVJTSU9OQSA9ICJ1dmVybnVtXzhoLnhtbCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVWRVJTSU9OQiA9ICJ1dmVyc2lvbl84aC54bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVX0lDVV9WRVJTSU9OID0gIlVfSUNVX1ZFUlNJT04iOworICAgIC8qIElDVSA0LjQrICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDVV9WRVJTSU9OX1hQQVRIQSA9ICIvZG94eWdlbi9jb21wb3VuZGRlZltAaWQ9J3V2ZXJudW1fOGgnXVtAa2luZD0nZmlsZSddL3NlY3Rpb25kZWZbQGtpbmQ9J2RlZmluZSddIjsKKwkvKiBJQ1UgPDQuNCAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ1VfVkVSU0lPTl9YUEFUSEIgPSAiL2RveHlnZW4vY29tcG91bmRkZWZbQGlkPSd1dmVyc2lvbl84aCddW0BraW5kPSdmaWxlJ10vc2VjdGlvbmRlZltAa2luZD0nZGVmaW5lJ10iOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBJQ1VfVkVSU0lPTl9YUEFUSCA9IElDVV9WRVJTSU9OX1hQQVRIQTsKKworCXByaXZhdGUgU3RyaW5nIGxlZnRWZXI7CisgICAgcHJpdmF0ZSBGaWxlIGxlZnREaXIgPSBudWxsOworLy8gICAgcHJpdmF0ZSBTdHJpbmcgbGVmdFN0YXR1czsKKyAgICBwcml2YXRlIFN0cmluZyBsZWZ0TWlsZXN0b25lID0gIiI7CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgcmlnaHRWZXI7CisgICAgcHJpdmF0ZSBGaWxlIHJpZ2h0RGlyID0gbnVsbDsKKy8vICAgIHByaXZhdGUgU3RyaW5nIHJpZ2h0U3RhdHVzOworICAgIHByaXZhdGUgU3RyaW5nIHJpZ2h0TWlsZXN0b25lID0gIiI7CisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGR1bXBDcHBYc2x0U3RyZWFtID0gbnVsbDsgCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBkdW1wQ1hzbHRTdHJlYW0gPSBudWxsOworCXByaXZhdGUgSW5wdXRTdHJlYW0gcmVwb3J0WHNsU3RyZWFtID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hTTFQgPSAiZHVtcEFsbENGdW5jLnhzbHQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUFBYU0xUID0gImR1bXBBbGxDcHBGdW5jLnhzbHQiOyAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlBUWFNMVCA9ICJnZW5SZXBvcnQueHNsdCI7CisKKyAgICBwcml2YXRlIEZpbGUgZHVtcENwcFhzbHQ7CisgICAgcHJpdmF0ZSBGaWxlIGR1bXBDWHNsdDsKKyAgICBwcml2YXRlIEZpbGUgcmVwb3J0WHNsOworICAgIHByaXZhdGUgRmlsZSByZXN1bHRGaWxlOworICAgIAorICAgIAorICAgIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBudWwgPSAiTm9uZSI7IAorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgU3RhYmxlQVBJIHQgPSBuZXcgU3RhYmxlQVBJKCk7CisgICAgICAgIHQucnVuKGFyZ3MpOyAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHJ1bihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMucGFyc2VBcmdzKGFyZ3MpOworICAgICAgICBTZXQ8Sm9pbmVkRnVuY3Rpb24+IGZ1bGwgPSBuZXcgVHJlZVNldDxKb2luZWRGdW5jdGlvbj4oKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlJlYWRpbmcgQysrLi4uIik7CisgICAgICAgIFNldDxKb2luZWRGdW5jdGlvbj4gc2V0Q3BwID0gdGhpcy5nZXRGdWxsTGlzdChkdW1wQ3BwWHNsdFN0cmVhbSwgQ1BQWFNMVCk7CisgICAgICAgIGZ1bGwuYWRkQWxsKHNldENwcCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVhZCAiK3NldENwcC5zaXplKCkgKyIgQysrLiAgUmVhZGluZyBDOiIpOworICAgICAgICAKKyAgICAgICAgU2V0PEpvaW5lZEZ1bmN0aW9uPiBzZXRDID0gdGhpcy5nZXRGdWxsTGlzdChkdW1wQ1hzbHRTdHJlYW0sIENYU0xUKTsKKyAgICAgICAgZnVsbC5hZGRBbGwoc2V0Qyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWFkICIrc2V0Qy5zaXplKCkgKyIgQy4gU2V0dGluZyBub2RlOiIpOworICAgICAgICAKKyAgICAgICAgTm9kZSBmdWxsTGlzdCA9IHRoaXMuc2V0VG9Ob2RlKGZ1bGwpOworLy8gICAgICAgIHQuZHVtcE5vZGUoZnVsbExpc3QsIiIpOworICAgICAgICAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIHNldC4gUmVwb3J0aW5nOiIpOworICAgICAgICAKKyAgICAgICAgdGhpcy5yZXBvcnRTZWxlY3RlZEZ1bihmdWxsTGlzdCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZS4gUGxlYXNlIGNoZWNrICIgKyB0aGlzLnJlc3VsdEZpbGUpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQXJncyhTdHJpbmdbXSBhcmdzKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXJnID0gYXJnc1tpXTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZy5lcXVhbHMoIi0taGVscCIpICkgeworICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLS1vbGR2ZXIiKSApIHsKKyAgICAgICAgICAgICAgICBsZWZ0VmVyID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItLW9sZGRpciIpICkgeworICAgICAgICAgICAgICAgIGxlZnREaXIgPSBuZXcgRmlsZShhcmdzWysraV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItLW5ld3ZlciIpKSB7CisgICAgICAgICAgICAgICAgcmlnaHRWZXIgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tbmV3ZGlyIikpIHsKKyAgICAgICAgICAgICAgICByaWdodERpciA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tY3hzbHQiKSApIHsKKyAgICAgICAgICAgICAgICBkdW1wQ1hzbHQgPSBuZXcgRmlsZShhcmdzWysraV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItLWNwcHhzbHQiKSApIHsKKyAgICAgICAgICAgICAgICBkdW1wQ3BwWHNsdCA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tcmVwb3J0eHNsdCIpICkgeworICAgICAgICAgICAgICAgIHJlcG9ydFhzbCA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tcmVzdWx0ZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0RmlsZSA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBvcHRpb246ICIrYXJnKTsKKyAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKworICAgICAgICBkdW1wQ3BwWHNsdFN0cmVhbSA9IGxvYWRTdHJlYW0oQ1BQWFNMVCwgIi0tY3BweHNsdCIsIGR1bXBDcHBYc2x0KTsKKyAgICAgICAgZHVtcENYc2x0U3RyZWFtPSBsb2FkU3RyZWFtKENYU0xULCAiLS1jeHNsdCIsIGR1bXBDWHNsdCk7CisgICAgICAgIHJlcG9ydFhzbFN0cmVhbT0gbG9hZFN0cmVhbShSUFRYU0xULCAiLS1yZXBvcnR4c2x0IiwgcmVwb3J0WHNsKTsKKworICAgICAgICBsZWZ0VmVyID0gdHJpbUlDVShzZXRWZXIobGVmdFZlciwgIm9sZCIsIGxlZnREaXIpKTsKKyAgICAgICAgcmlnaHRWZXIgPSB0cmltSUNVKHNldFZlcihyaWdodFZlciwgIm5ldyIsIHJpZ2h0RGlyKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGxvYWRTdHJlYW0oU3RyaW5nIG5hbWUsIFN0cmluZyBhcmdOYW1lLCBGaWxlIGFyZ0ZpbGUpIHsKKyAgICAJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAJaWYoYXJnRmlsZSAhPSBudWxsKSB7CisgICAgCQl0cnkgeworCSAgICAJCXN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnRmlsZSk7CisJICAgIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkgICAgCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6IENvdWxkIG5vdCBsb2FkICIgKyBhcmdOYW1lICsiICIgKyBhcmdGaWxlLmdldFBhdGgoKSArICIgLSAiICsgaW9lLnRvU3RyaW5nKCksIGlvZSk7CisJICAgIAl9CisgICAgCX0gZWxzZSB7ICAgIAkKKyAgICAgICAgCXN0cmVhbSA9IFN0YWJsZUFQSS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgICAgICAJaWYoc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiTm8gcmVzb3VyY2UgZm91bmQgZm9yICIgKyBTdGFibGVBUEkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSsiLyIrIG5hbWUgKyAiIC0gICB1c2UgIiArIGFyZ05hbWUpOworICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCByZXNvdXJjZSAiICsgbmFtZSk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cmVhbTsKKwl9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiB3YXJuU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FybihTdHJpbmcgd2hhdCkgeworICAgICAgICBpZighd2FyblNldC5jb250YWlucyh3aGF0KSkgeworICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiAiK3doYXQpOworICAgICAgICAgICAgICAgaWYod2FyblNldC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAoVGhlc2Ugd2FybmluZ3MgYXJlIG9ubHkgcHJpbnRlZCBvbmUgdGltZSBlYWNoLikiKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHdhcm5TZXQuYWRkKHdoYXQpOworICAgICAgICB9CisgICAgfSAKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpZFdhcm5TdXBlclRyaW0gPSBmYWxzZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJpbUlDVShTdHJpbmcgdmVyKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBJQ1VfID0gSUNVX1NQQUNFX1BSRUZJWDsKKyAgICAgICAgZmluYWwgU3RyaW5nIElDVSA9ICJJQ1UiOworICAgICAgICBpZih2ZXIgIT0gbnVsbCkgeyAvLyB0cmltIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSAnSUNVLi4uJworICAgICAgICAgICAgdmVyID0gdmVyLnRyaW0oKTsKKyAgICAgICAgICAgIGludCBpY3VpZHggPSB2ZXIubGFzdEluZGV4T2YoSUNVXyk7CisgICAgICAgICAgICBpbnQgaWN1aWR4MSA9IHZlci5sYXN0SW5kZXhPZihJQ1UpOworICAgICAgICAgICAgaWYoaWN1aWR4Pj0wKSB7CisgICAgICAgICAgICAgICAgd2FybigiVHJpbW1pbmcgdGV4dCBiZWZvcmUgJ0lDVSc6ICIgKyB2ZXIuc3Vic3RyaW5nKDAsaWN1aWR4K0lDVV8ubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICB2ZXIgPSB2ZXIuc3Vic3RyaW5nKGljdWlkeCtJQ1VfLmxlbmd0aCgpKS50cmltKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYoaWN1aWR4MT49MCkgeworICAgICAgICAgICAgICAgIHdhcm4oIlRyaW1taW5nIHRleHQgYmVmb3JlICdJQ1UgJzogIiArIHZlci5zdWJzdHJpbmcoMCxpY3VpZHgxK0lDVS5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIHZlciA9IHZlci5zdWJzdHJpbmcoaWN1aWR4MStJQ1UubGVuZ3RoKCkpLnRyaW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gYWx3YXlzIHRyaW0gYW55dGhpbmcgYWZ0ZXIgYSB2ZXJzaW9uICMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICBmb3Iobj12ZXIubGVuZ3RoKCktMTtuPjAgJiYgKCh2ZXIuY2hhckF0KG4pPT0nLicpIHx8IENoYXJhY3Rlci5pc0RpZ2l0KHZlci5jaGFyQXQobikpKSA7bi0tKQorICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgaWYobj4wKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm4oIlRyaW1taW5nIGV4dHJhbmVvdXMgdGV4dCBhZnRlciB2ZXJzaW9uOiAnIiArIHZlci5zdWJzdHJpbmcobisxLHZlci5sZW5ndGgoKSkgKyAiJyIpOworICAgICAgICAgICAgICAgICAgICB2ZXIgPSB2ZXIuc3Vic3RyaW5nKG4rMSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBpZighZGlkV2FyblN1cGVyVHJpbSkgeworICAgICAgICAgICAgICAgIAlkaWRXYXJuU3VwZXJUcmltID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAJd2FybigiUGxlYXNlIE9OTFkgdXNlOiAgJ0B3aGF0ZXZlciBJQ1UgWC5ZLlonIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiB2ZXI7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIHNldFZlcihTdHJpbmcgcHJldlZlciwgU3RyaW5nIHdoaWNoVmVyLCBGaWxlIGRpcikgeworCSAgICBTdHJpbmcgVVZFUlNJT04gPSBVVkVSU0lPTkE7CisgICAgCWlmKGRpcj09bnVsbCkgeworICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCItLSIrd2hpY2hWZXIrImRpciBub3Qgc2V0LiIpOworICAgIAkJcHJpbnRVc2FnZSgpOyAvKiBleGl0cyAqLworICAgIAl9IGVsc2UgaWYoIWRpci5leGlzdHMoKXx8IWRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIit3aGljaFZlcisiZGlyPSIrZGlyLmdldE5hbWUoKSsiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeS4iKTsKKyAgICAJCXByaW50VXNhZ2UoKTsgLyogZXhpdHMgKi8KKyAgICAJfQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgLy8gbG9va2luZyBmb3I6IDxuYW1lPlVfSUNVX1ZFUlNJT048L25hbWU+IGluIHV2ZXJzaW9uXzhoLnhtbDogICAgICAgIDxpbml0aWFsaXplcj4mcXVvdDszLjguMSZxdW90OzwvaW5pdGlhbGl6ZXI+CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIHZlckZpbGUgPSBuZXcgRmlsZShkaXIsIFVWRVJTSU9OKTsKKwkJICAgIGlmKCF2ZXJGaWxlLmV4aXN0cygpKSB7CisJCQkJVVZFUlNJT049VVZFUlNJT05COworCQkJCUlDVV9WRVJTSU9OX1hQQVRIPUlDVV9WRVJTSU9OX1hQQVRIQjsKKwkJCQl2ZXJGaWxlID0gbmV3IEZpbGUoZGlyLCBVVkVSU0lPTik7CisJCSAgICB9IGVsc2UgeworCQkJCUlDVV9WRVJTSU9OX1hQQVRIPUlDVV9WRVJTSU9OX1hQQVRIQTsKKwkJICAgIH0KKyAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KHZlckZpbGUpOworICAgICAgICAgICAgRE9NU291cmNlIHV2ZXJudW1faCA9IG5ldyBET01Tb3VyY2UoZG9jKTsKKyAgICAgICAgICAgIFhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKworICAgICAgICAgICAgTm9kZSBkZWZpbmVzID0gKE5vZGUpeHBhdGguZXZhbHVhdGUoSUNVX1ZFUlNJT05fWFBBVEgsIHV2ZXJudW1faC5nZXROb2RlKCksIFhQYXRoQ29uc3RhbnRzLk5PREUpOworCisJICAgIGlmKGRlZmluZXM9PW51bGwpIHsKKwkgICAgCVN5c3RlbS5lcnIucHJpbnRsbigiY2FuJ3QgbG9hZCBmcm9tICIrdmVyRmlsZS5nZXROYW1lKCkrIjoiK0lDVV9WRVJTSU9OX1hQQVRIKTsKKwkgICAgfQorCisgICAgICAgICAgICBOb2RlTGlzdCBuTGlzdCA9IGRlZmluZXMuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IHJlc3VsdD09bnVsbCYmIChpIDwgbkxpc3QuZ2V0TGVuZ3RoKCkpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIGxuID0gbkxpc3QuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBpZighIm1lbWJlcmRlZiIuZXF1YWxzKGxuLmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBOb2RlIG5hbWUgPSAoTm9kZSl4cGF0aC5ldmFsdWF0ZShOQU1FX1hQQVRILCBsbiwgWFBhdGhDb25zdGFudHMuTk9ERSk7CisgICAgICAgICAgICAgICAgaWYobmFtZT09bnVsbCkgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oIkdvdHRhIG5vZGU6ICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBOb2RlIG5hbWVWYWwgPSBuYW1lLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICBpZihuYW1lVmFsPT1udWxsKSBuYW1lVmFsID0gbmFtZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZVN0ciA9IG5hbWVWYWwuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYobmFtZVN0cj09bnVsbCkgY29udGludWU7CisKKyAgICAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiR290dGEgbmFtZTogIiArIG5hbWVTdHIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKG5hbWVTdHIudHJpbSgpLmVxdWFscyhVX0lDVV9WRVJTSU9OKSkgeworICAgICAgICAgICAgICAgICAgICBOb2RlIGluaXRpYWxpemVyID0gKE5vZGUpeHBhdGguZXZhbHVhdGUoSU5JVElBTElaRVJfWFBBVEgsIGxuLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoaW5pdGlhbGl6ZXI9PW51bGwpIFN5c3RlbS5lcnIucHJpbnRsbigiaW5pdGlhbGl6ZXIgd2l0aCBubyB2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBOb2RlIGluaXRWYWwgPSBpbml0aWFsaXplci5nZXRGaXJzdENoaWxkKCk7CisvLyAgICAgICAgICAgICAgICAgICAgaWYoaW5pdFZhbD09bnVsbCkgaW5pdFZhbCA9IGluaXRpYWxpemVyOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5pdFN0ciA9IGluaXRWYWwuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwiIik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IElDVV9TUEFDRV9QUkVGSVgraW5pdFN0cjsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEZXRlY3RlZCAiK3doaWNoVmVyICsgIiB2ZXJzaW9uOiAiICsgcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWlsZXN0b25lT2YgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86ICAjMSB1c2UgVVZlcnNpb25JbmZvLiAodGhpcyB0b29sIGRvZXNuJ3QgZGVwZW5kIG9uIElDVTRKIHlldCkgCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAjMiBtb3ZlIHRoaXMgdG8gYSB1dGlsaXR5IGZ1bmN0aW9uOiBzdHJpcC8iZXhwbGFpbiIgYW4gSUNVIHZlcnNpb24gIy4KKyAgICAgICAgICAgICAgICAgICAgaWYocmVzdWx0LnN0YXJ0c1dpdGgoIklDVSAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNbXSA9IHJlc3VsdC5zdWJzdHJpbmcoNCkuc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1haiA9IEludGVnZXIucGFyc2VJbnQodmVyc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluID0gdmVycy5sZW5ndGg+MT9JbnRlZ2VyLnBhcnNlSW50KHZlcnNbMV0pOjA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWljciA9IHZlcnMubGVuZ3RoPjI/SW50ZWdlci5wYXJzZUludCh2ZXJzWzJdKTowOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhdGNoID0gdmVycy5sZW5ndGg+Mz9JbnRlZ2VyLnBhcnNlSW50KHZlcnNbM10pOjA7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1haiA+PSA0OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBzY2hlbWU6IDQ5IGFuZCBmb2xsb3dpbmcuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cnVuY1ZlcnNpb24gPSAiSUNVICIgK21hajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtaW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxlc3RvbmVPZiA9ICIgKG0iK21pY3IrIikiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAuLiAiICsgbWlsZXN0b25lT2YgKyAiIGlzIGEgbWlsZXN0b25lIHRvd2FyZHMgIiArIHRydW5jVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1pbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRlbm90ZSBhcyBtaWxlc3RvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gIklDVSAiKyhtYWopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAuLiAiICsgbWlsZXN0b25lT2YgKyAiIGlzIHRoZSByZWxlYXNlIG9mICIgKyB0cnVuY1ZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGVzdG9uZU9mID0gIiAodXBkYXRlICIrbWljcisiLiIrcGF0Y2grIikiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiSUNVICIrKG1haik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgIC4uICIgKyBtaWxlc3RvbmVPZiArICIgaXMgYW4gdXBkYXRlIHRvICAiICsgdHJ1bmNWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHRydW5jYXRlIHRvIG1ham9yICMgZm9yIGNvbXBhcmluZyB0YWdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydW5jVmVyc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2xkIHNjaGVtZSAtIDEuMC4qIC4uIDQuOC4qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRydW5jVmVyc2lvbiA9ICJJQ1UgIiArIG1haisiLiIrbWluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChtaW4lMik9PTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsZXN0b25lT2YgPSAiICgiK21haisiLiIrKG1pbisxKSsibSIrbWljcisiKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jVmVyc2lvbiA9ICJJQ1UgIisobWFqKSsiLiIrKG1pbisxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgLi4gIiArIG1pbGVzdG9uZU9mICsgIiBpcyBhIG1pbGVzdG9uZSB0b3dhcmRzICIgKyB0cnVuY1ZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtaWNyPT0wICYmIHBhdGNoPT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgIC4uICIgKyBtaWxlc3RvbmVPZiArICIgaXMgdGhlIHJlbGVhc2Ugb2YgIiArIHRydW5jVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsZXN0b25lT2YgPSAiICh1cGRhdGUgIittaWNyKyIuIitwYXRjaCsiKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAgIC4uICIgKyBtaWxlc3RvbmVPZiArICIgaXMgYW4gdXBkYXRlIHRvICIgKyB0cnVuY1ZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVuY1ZlcnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZih3aGljaFZlci5lcXVhbHMoIm5ldyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRNaWxlc3RvbmUgPSBtaWxlc3RvbmVPZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdE1pbGVzdG9uZSA9IG1pbGVzdG9uZU9mOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9kdW1wTm9kZShkZWZpbmVzLCIiKTsKKyAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogQ291bGRuJ3QgZ2V0ICIgKyB3aGljaFZlcisgICIgdmVyc2lvbiBmcm9tICIrIFVWRVJTSU9OICsgIiAtIHJldmVydGluZyB0byAiICsgcHJldlZlcik7CisgICAgICAgICAgICByZXN1bHQgPSBwcmV2VmVyOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAJCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKHByZXZWZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZighcmVzdWx0LmVxdWFscyhwcmV2VmVyKSkgeyAKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJOb3RlOiBEZXRlY3RlZCAiICsgcmVzdWx0ICsgIiB2ZXJzaW9uIGJ1dCB3ZSdsbCB1c2UgeW91ciByZXF1ZXN0ZWQgLS0iK3doaWNoVmVyKyJ2ZXIgIitwcmV2VmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJldlZlcjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIXJpZ2h0TWlsZXN0b25lLmlzRW1wdHkoKSYmd2hpY2hWZXIuZXF1YWxzKCJuZXciKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgLi4gaWdub3JpbmcgbWlsZXN0b25lIGluZGljYXRvciAiICsgcmlnaHRNaWxlc3RvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRNaWxlc3RvbmUgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZighbGVmdE1pbGVzdG9uZS5pc0VtcHR5KCkmJiF3aGljaFZlci5lcXVhbHMoIm5ldyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0TWlsZXN0b25lPSIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJOb3RlOiBZb3UgZG9uJ3QgbmVlZCB0byB1c2UgICctLSIrd2hpY2hWZXIrInZlciAiK3Jlc3VsdCsiJyBhbnltb3JlIC0gd2UgZGV0ZWN0ZWQgaXQgY29ycmVjdGx5LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJOb3RlOiBEaWRuJ3QgZGV0ZWN0IHZlcnNpb24gc28gd2UnbGwgdXNlIHlvdXIgcmVxdWVzdGVkIC0tIit3aGljaFZlcisidmVyICIrcHJldlZlcik7CisgICAgICAgICAgICAJcmVzdWx0ID0gcHJldlZlcjsKKyAgICAgICAgICAgIAlpZighcmlnaHRNaWxlc3RvbmUuaXNFbXB0eSgpJiZ3aGljaFZlci5lcXVhbHMoIm5ldyIpKSB7CisgICAgICAgICAgICAJCVN5c3RlbS5lcnIucHJpbnRsbigiIC4uIGlnbm9yaW5nIG1pbGVzdG9uZSBpbmRpY2F0b3IgIiArIHJpZ2h0TWlsZXN0b25lKTsKKyAgICAgICAgICAgIAkJcmlnaHRNaWxlc3RvbmUgPSAiIjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgaWYoIWxlZnRNaWxlc3RvbmUuaXNFbXB0eSgpJiYhd2hpY2hWZXIuZXF1YWxzKCJuZXciKSkgeworICAgICAgICAgICAgICAgICAgICBsZWZ0TWlsZXN0b25lPSIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgCVN5c3RlbS5lcnIucHJpbnRsbigicHJldlZlcj0iK3ByZXZWZXIpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogWW91J2xsIG5lZWQgdG8gdXNlIHRoZSBvcHRpb24gIFwiLS0iK3doaWNoVmVyKyJ2ZXJcIiAgYmVjYXVzZSB3ZSBjb3VsZCBub3QgZGV0ZWN0IGFuIElDVSB2ZXJzaW9uIGluICIgKyBVVkVSU0lPTiApOworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoIkVycm9yOiBZb3UnbGwgbmVlZCB0byB1c2UgdGhlIG9wdGlvbiAgXCItLSIrd2hpY2hWZXIrInZlclwiICBiZWNhdXNlIHdlIGNvdWxkIG5vdCBkZXRlY3QgYW4gSUNVIHZlcnNpb24gaW4gIiArIFVWRVJTSU9OICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCl7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IFN0YWJsZUFQSSBvcHRpb24qIHRhcmdldCoiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3B0aW9uczoiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLS1oZWxwICAgICAgICAgIFByaW50IHRoaXMgdGV4dCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLW9sZHZlciAgICAgICAgVmVyc2lvbiBvZiBvbGQgdmVyc2lvbiBvZiBJQ1UgKG9wdGlvbmFsKSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLW9sZGRpciAgICAgICAgRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgeG1sIGRvY3Mgb2Ygb2xkIHZlcnNpb24iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLS1uZXd2ZXIgICAgICAgIFZlcnNpb24gb2YgbmV3IHZlcnNpb24gb2YgSUNVIChvcHRpb25hbCkiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLS1uZXdkaXIgICAgICAgIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHhtbCBkb2NzIG9mIG5ldyB2ZXJzaW9uIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC0tY3hzbHQgICAgICAgICBYU0xUIGZpbGUgZm9yIEMgZG9jcyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLWNwcHhzbHQgICAgICAgWFNMVCBmaWxlIGZvciBDKysgZG9jcyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLXJlcG9ydHhzbHQgICAgWFNMVCBmaWxlIGZvciByZXBvcnQgZG9jcyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLXJlc3VsdGZpbGUgICAgT3V0cHV0IGZpbGUiKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoLTEpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cihOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSl7CisgICAgCWlmKG5vZGUuZ2V0QXR0cmlidXRlcygpPT1udWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKT09MykgeworLy8gICAgCQlyZXR1cm4gIih0ZXh0IG5vZGUgMykiOworICAgIAkJcmV0dXJuICIoTm9kZTogIiArIG5vZGUudG9TdHJpbmcoKSArICIgKSI7CisvLyAgICAJCXJldHVybiBub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKS5nZXROb2RlVmFsdWUoKTsKKyAgICAJfQorICAgIAkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpLmdldE5vZGVWYWx1ZSgpOworICAgICAgICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAJaWYobm9kZS5nZXRBdHRyaWJ1dGVzKCk9PW51bGwpICB7CisgICAgICAgIAkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoIltubyBhdHRyaWJ1dGVzIENhbid0IGdldCBhdHRyICIrYXR0ck5hbWUgKyIgb3V0IG9mIG5vZGUgIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSsiOiIrbm9kZS5nZXROb2RlVHlwZSgpKyI6Iitub2RlLmdldE5vZGVWYWx1ZSgpKyJAIitub2RlLmdldFRleHRDb250ZW50KCkpOworICAgICAgICAJfSBlbHNlIGlmKG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk9PW51bGwpIHsKKyAgICAgICAgCQlyZXR1cm4gbnVsbDsgCisgICAgICAgIAkJLy90aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiTm8gYXR0cmlidXRlIG5hbWVkOiAiK2F0dHJOYW1lKTsKKyAgICAgICAgCX0gZWxzZSB7CisgICAgICAgIAkJU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBnZXQgYXR0ciAiK2F0dHJOYW1lKyI6ICIrbnBlLnRvU3RyaW5nKCkpOworICAgICAgICAJfQorICAgICAgICAJbnBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoIkNhbid0IGdldCBhdHRyICIrYXR0ck5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cihOYW1lZE5vZGVNYXAgYXR0ckxpc3QsIFN0cmluZyBhdHRyTmFtZSl7CisgICAgICAgIHJldHVybiBhdHRyTGlzdC5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpLmdldE5vZGVWYWx1ZSgpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgRnVuY3Rpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPEZ1bmN0aW9uPiB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvdG90eXBlOworICAgICAgICBwdWJsaWMgU3RyaW5nIGlkOworICAgICAgICBwdWJsaWMgU3RyaW5nIHN0YXR1czsKKyAgICAgICAgcHVibGljIFN0cmluZyB2ZXJzaW9uOworICAgICAgICBwdWJsaWMgU3RyaW5nIGZpbGU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgY29tcGFyYWJsZU5hbWU7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhGdW5jdGlvbiByaWdodCl7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuZXF1YWxzKHJpZ2h0LnByb3RvdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIEZ1bmN0aW9uIGZyb21YbWwoTm9kZSBuKXsKKyAgICAgICAgICAgIEZ1bmN0aW9uIGYgPSBuZXcgRnVuY3Rpb24oKTsKKyAgICAgICAgICAgIGYucHJvdG90eXBlID0gZ2V0QXR0cihuLCAicHJvdG90eXBlIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCJ5ZXMiLmVxdWFscyhnZXRBdHRyKG4sICJzdGF0aWMiKSkmJiFmLnByb3RvdHlwZS5jb250YWlucygic3RhdGljIikpIHsKKyAgICAgICAgICAgIAlmLnByb3RvdHlwZSA9ICJzdGF0aWMgIi5jb25jYXQoZi5wcm90b3R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgIAorICAgICAgICAgICAgZi5pZCA9IGdldEF0dHIobiwgImlkIik7CisgICAgICAgICAgICBmLnN0YXR1cyA9IGdldEF0dHIobiwgInN0YXR1cyIpOworICAgICAgICAgICAgZi52ZXJzaW9uID0gdHJpbUlDVShnZXRBdHRyKG4sICJ2ZXJzaW9uIikpOworICAgICAgICAgICAgZi5maWxlID0gZ2V0QXR0cihuLCAiZmlsZSIpOworICAgICAgICAgICAgZi5wdXJpZnlQcm90b3R5cGUoKTsKKyAgICAgICAgICAgIGlmKGYuZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAJZi5maWxlID0gIntudWxsfSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgCWYuZmlsZSA9IEZ1bmN0aW9uLmdldEJhc2VuYW1lKGYuZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmLmNvbXBhcmFibGVOYW1lID0gZi5jb21wYXJhYmxlTmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0IHN0cmluZyB0byBiYXNlbmFtZS4KKyAgICAgICAgICogQHBhcmFtIHN0cgorICAgICAgICAgKiBAcmV0dXJuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZW5hbWUoU3RyaW5nIHN0cil7CisgICAgICAgICAgICBpbnQgaSA9IHN0ci5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICAgICAgc3RyID0gaSA9PSAtMSA/IHN0ciA6IHN0ci5zdWJzdHJpbmcoaSsxKTsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTcGVjaWFsIGNhc2VzOgorICAgICAgICAgKiAKKyAgICAgICAgICogUmVtb3ZlIHRoZSBzdGF0dXMgYXR0cmlidXRlIGVtYmVkZGVkIGluIHRoZSBDIHByb3RvdHlwZQorICAgICAgICAgKiAKKyAgICAgICAgICogUmVtb3ZlIHRoZSB2aXJ0dWFsIGtleXdvcmQgaW4gQ3BwIHByb3RvdHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHB1cmlmeVByb3RvdHlwZSgpeworICAgICAgICAgICAgLy9yZWZlciB0byAndW1hY2hpbmUuaCcKKyAgICAgICAgICAgIFN0cmluZyBzdGF0dXNMaXN0W10gPSB7IlVfQ0FQSSIsICJVX1NUQUJMRSIsICJVX0RSQUZUIiwgIlVfREVQUkVDQVRFRCIsICJVX09CU09MRVRFIiwgIlVfSU5URVJOQUwiLCAidmlydHVhbCIsICJVX0VYUE9SVDIifTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzTGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gc3RhdHVzTGlzdFtpXTsKKyAgICAgICAgICAgICAgICBwcm90b3R5cGUgPSBwcm90b3R5cGUucmVwbGFjZUFsbChzLCIiKTsKKyAgICAgICAgICAgICAgICBwcm90b3R5cGUgPSBwcm90b3R5cGUudHJpbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcmVwbExpc3RbXSA9IHsgICJbIF0qXFwoWyBdKnZvaWRbIF0qXFwpWyBdKiIsICAgIigpIiwKKyAgICAgICAgICAgIAkJCQkgICAgICAgIiAsICIsICIsICIsCisgICAgICAgICAgICAJCQkJCQl9OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBsTGlzdC5sZW5ndGg7IGkrPSAyKSB7CisgICAgICAgICAgICAgICAgcHJvdG90eXBlID0gcHJvdG90eXBlLnJlcGxhY2VBbGwocmVwbExpc3RbaSswXSxyZXBsTGlzdFtpKzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBwcm90b3R5cGUgPSBwcm90b3R5cGUudHJpbSgpOworCisgICAgICAgICAgICAvLyBOb3csIHJlbW92ZSBwYXJhbWV0ZXIgbmFtZXMhCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGluID0gbmV3IFN0cmluZ0J1ZmZlcihwcm90b3R5cGUpOworICAgICAgICAgICAgaW50IG9wZW5QYXJlbiA9IGluLmluZGV4T2YoIigiKTsKKyAgICAgICAgICAgIGludCBjbG9zZVBhcmVuID0gaW4ubGFzdEluZGV4T2YoIikiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYob3BlblBhcmVuPT0tMSB8fCBjbG9zZVBhcmVuPT0tMSkgcmV0dXJuOyAvLyBleGl0LCBtYWxmb3JtZWQ/CisgICAgICAgICAgICBpZihvcGVuUGFyZW4rMT09Y2xvc2VQYXJlbikgcmV0dXJuOyAvLyBleGl0OiAoKQorICAgICAgICAgICAgCisgICAgICAgICAgICBvdXQuYXBwZW5kKGluLCAwLCBvcGVuUGFyZW4rMSk7IC8vIHByZWx1ZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGludCBsZWZ0ID0gb3BlblBhcmVuKzE7IGxlZnQ8Y2xvc2VQYXJlbjspIHsKKyAgICAgICAgICAgIAlpbnQgcmlnaHQgPSBpbi5pbmRleE9mKCIsIiwgbGVmdCsxKTsgLy8gcmlnaHQgZWRnZQorICAgICAgICAgICAgCWlmKHJpZ2h0Pj1jbG9zZVBhcmVuIHx8IHJpZ2h0PT0tMSApICByaWdodD1jbG9zZVBhcmVuOyAvLyBmb3VuZCBsYXN0IGNvbW1hCisgICAgICAgICAgICAJCisgICAgICAgICAgICAvLwlTeXN0ZW0uZXJyLnByaW50bG4oIkNvbnNpZGVyaW5nICAiICsgbGVmdCArICIgLyAiICsgcmlnaHQgKyAiIC0gIiArIGNsb3NlUGFyZW4gKyAgIiA6ICIgICsgaW4uc3Vic3RyaW5nKGxlZnQsIHJpZ2h0KSk7CisgICAgICAgICAgICAJCisgICAgICAgICAgICAJaWYobGVmdD09cmlnaHQpIGNvbnRpbnVlOyAKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAkvLyBmaW5kIHZhcmlhYmxlIG5hbWUKKyAgICAgICAgICAgIAlpbnQgcmlnaHRDaCA9IHJpZ2h0LTE7CisgICAgICAgICAgICAJaWYocmlnaHRDaD09bGVmdCkgeyAvLyAxIGNoLSBicmVhaworICAgICAgICAgICAgCQlvdXQuYXBwZW5kKGluLGxlZnQscmlnaHQpOworICAgICAgICAgICAgCQljb250aW51ZTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJLy8gZWF0IHdoaXRlc3BhY2UgYXQgcmlnaHQKKyAgICAgICAgICAgIAlpbnQgbmFtZUVuZENoID0gcmlnaHRDaDsKKyAgICAgICAgICAgIAl3aGlsZShuYW1lRW5kQ2g+bGVmdCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGluLmNoYXJBdChuYW1lRW5kQ2gpKSkgeworICAgICAgICAgICAgCQluYW1lRW5kQ2gtLTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJaW50IG5hbWVTdGFydENoID0gbmFtZUVuZENoOworICAgICAgICAgICAgCXdoaWxlKG5hbWVTdGFydENoPmxlZnQgJiYgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGluLmNoYXJBdChuYW1lU3RhcnRDaCkpKSB7CisgICAgICAgICAgICAJCW5hbWVTdGFydENoLS07CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCQorICAgICAgICAgICAgCS8vIG5vdywgZGlkIHdlIGZpbmQgc29tZXRoaW5nIHRvIHNraXA/CisgICAgICAgICAgICAJaWYobmFtZVN0YXJ0Q2g+bGVmdCAmJiBuYW1lRW5kQ2g+bmFtZVN0YXJ0Q2gpIHsKKyAgICAgICAgICAgIAkJb3V0LmFwcGVuZChpbiwgbGVmdCwgbmFtZVN0YXJ0Q2grMSk7CisgICAgICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgICAgIAkJLy8gcGFzcyB0aHJvdWdoCisgICAgICAgICAgICAJCW91dC5hcHBlbmQoaW4sIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJCisgICAgICAgICAgICAJbGVmdCA9IHJpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvdXQuYXBwZW5kKGluLCBjbG9zZVBhcmVuLCBpbi5sZW5ndGgoKSk7IC8vIHBvc3RsdWRlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIERlbGV0ZSBhbnkgZG91YmxlZCB3aGl0ZXNwYWNlLgorICAgICAgICAgICAgZm9yKGludCBwPTE7cDxvdXQubGVuZ3RoKCk7cCsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBwcmV2ID0gb3V0LmNoYXJBdChwLTEpOyAKKyAgICAgICAgICAgIAlpZihDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHByZXYpKSB7CisgICAgICAgICAgICAJCXdoaWxlIChvdXQubGVuZ3RoKCk+cCYmKENoYXJhY3Rlci5pc1doaXRlc3BhY2Uob3V0LmNoYXJBdChwKSkpKSB7CisgICAgICAgICAgICAJCQlvdXQuZGVsZXRlQ2hhckF0KHApOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJCWlmKG91dC5sZW5ndGgoKT5wKSB7CisgICAgICAgICAgICAJCQkvLyBhbnkgdHJhaWxpbmdzIHRvIGRlbGV0ZT8KKyAgICAgICAgICAgIAkJCWNoYXIgY3VyciA9IG91dC5jaGFyQXQocCk7CisgICAgICAgICAgICAJCQlpZihjdXJyPT0nLCcgfHwgY3Vycj09JyknIHx8IGN1cnI9PScqJyB8fCBjdXJyPT0nJicpIHsgLy8gZGVsZXRlIHNwYWNlcyBiZWZvcmUgdGhlc2UuCisgICAgICAgICAgICAJCQkJb3V0LmRlbGV0ZUNoYXJBdCgtLXApOworICAgICAgICAgICAgCQkJCWNvbnRpbnVlOworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgLy8gIFN5c3RlbS5lcnIucHJpbnRsbihwcm90b3R5cGUrIiAtPiAiICsgb3V0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcHJvdG90eXBlID0gb3V0LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKy8vICAgICAgICBwcml2YXRlIEVsZW1lbnQgdG9YbWwoRG9jdW1lbnQgZG9jKXsKKy8vICAgICAgICAgICAgRWxlbWVudCAgZWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZ1bmMiKTsKKy8vICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgicHJvdG90eXBlIiwgcHJvdG90eXBlKTsKKy8vICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgiaWQiLCBpZCk7CisvLyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsIHN0YXR1cyk7CisvLyAgICAgICAgICAgIHJldHVybiBlbGU7CisvLyAgICAgICAgfQorCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhGdW5jdGlvbiBvKSB7CisJCQlyZXR1cm4gY29tcGFyYWJsZU5hbWUuY29tcGFyZVRvKCgoRnVuY3Rpb24pbykuY29tcGFyYWJsZU5hbWUpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgY29tcGFyYWJsZU5hbWUoKSB7IAorCQkJcmV0dXJuIGZpbGUrInwiK3Byb3RvdHlwZSsifCIrc3RhdHVzKyJ8Iit2ZXJzaW9uKyJ8IitpZDsKKwkJfQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgSm9pbmVkRnVuY3Rpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPEpvaW5lZEZ1bmN0aW9uPiB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvdG90eXBlOworICAgICAgICBwdWJsaWMgU3RyaW5nIGxlZnRSZWZJZDsKKyAgICAgICAgcHVibGljIFN0cmluZyBsZWZ0U3RhdHVzOworICAgICAgICBwdWJsaWMgU3RyaW5nIGxlZnRWZXJzaW9uOworICAgICAgICBwdWJsaWMgU3RyaW5nIHJpZ2h0VmVyc2lvbjsKKyAgICAgICAgcHVibGljIFN0cmluZyBsZWZ0RmlsZTsKKyAgICAgICAgcHVibGljIFN0cmluZyByaWdodFJlZklkOworICAgICAgICBwdWJsaWMgU3RyaW5nIHJpZ2h0U3RhdHVzOworICAgICAgICBwdWJsaWMgU3RyaW5nIHJpZ2h0RmlsZTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY29tcGFyYWJsZU5hbWU7CisgICAgICAgIAorICAgICAgICBzdGF0aWMgSm9pbmVkRnVuY3Rpb24gZnJvbUxlZnRGdW4oRnVuY3Rpb24gbGVmdCl7CisgICAgICAgICAgICBKb2luZWRGdW5jdGlvbiB1ID0gbmV3IEpvaW5lZEZ1bmN0aW9uKCk7CisgICAgICAgICAgICB1LnByb3RvdHlwZSA9IGxlZnQucHJvdG90eXBlOworICAgICAgICAgICAgdS5sZWZ0UmVmSWQgPSBsZWZ0LmlkOworICAgICAgICAgICAgdS5sZWZ0U3RhdHVzID0gbGVmdC5zdGF0dXM7CisgICAgICAgICAgICB1LmxlZnRGaWxlID0gbGVmdC5maWxlOworICAgICAgICAgICAgdS5yaWdodFJlZklkID0gbnVsOworICAgICAgICAgICAvLyB1LnJpZ2h0VmVyc2lvbiA9IG51bDsKKyAgICAgICAgICAgIHUubGVmdFZlcnNpb24gPSBsZWZ0LnZlcnNpb247CisgICAgICAgICAgICB1LnJpZ2h0U3RhdHVzID0gbnVsOworICAgICAgICAgICAgdS5yaWdodEZpbGUgPSBudWw7CisgICAgICAgICAgICB1LmNvbXBhcmFibGVOYW1lID0gbGVmdC5jb21wYXJhYmxlTmFtZTsKKyAgICAgICAgICAgIHJldHVybiB1OworICAgICAgICB9CisgICAgCisgICAgICAgIHN0YXRpYyBKb2luZWRGdW5jdGlvbiBmcm9tUmlnaHRGdW4oRnVuY3Rpb24gcmlnaHQpeworICAgICAgICAgICAgSm9pbmVkRnVuY3Rpb24gdSA9IG5ldyBKb2luZWRGdW5jdGlvbigpOworICAgICAgICAgICAgdS5wcm90b3R5cGUgPSByaWdodC5wcm90b3R5cGU7CisgICAgICAgICAgICB1LmxlZnRSZWZJZCA9IG51bDsKKyAgICAgICAgICAgIHUubGVmdFN0YXR1cyA9IG51bDsKKyAgICAgICAgICAgIHUubGVmdEZpbGUgPSBudWw7CisgICAgICAgICAgIC8vIHUubGVmdFZlcnNpb24gPSBudWw7CisgICAgICAgICAgICB1LnJpZ2h0VmVyc2lvbiA9IHJpZ2h0LnZlcnNpb247CisgICAgICAgICAgICB1LnJpZ2h0UmVmSWQgPSByaWdodC5pZDsKKyAgICAgICAgICAgIHUucmlnaHRTdGF0dXMgPSByaWdodC5zdGF0dXM7CisgICAgICAgICAgICB1LnJpZ2h0RmlsZSA9IHJpZ2h0LmZpbGU7CisgICAgICAgICAgICB1LmNvbXBhcmFibGVOYW1lID0gcmlnaHQuY29tcGFyYWJsZU5hbWU7CisgICAgICAgICAgICByZXR1cm4gdTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3RhdGljIEpvaW5lZEZ1bmN0aW9uIGZyb21Ud29GdW4oRnVuY3Rpb24gbGVmdCwgRnVuY3Rpb24gcmlnaHQpeworICAgICAgICAgICAgaWYgKCFsZWZ0LmVxdWFscyhyaWdodCkpIHRocm93IG5ldyBFcnJvcigpOworICAgICAgICAgICAgSm9pbmVkRnVuY3Rpb24gdSA9IG5ldyBKb2luZWRGdW5jdGlvbigpOworICAgICAgICAgICAgdS5wcm90b3R5cGUgPSBsZWZ0LnByb3RvdHlwZTsKKyAgICAgICAgICAgIHUubGVmdFJlZklkID0gbGVmdC5pZDsKKyAgICAgICAgICAgIHUubGVmdFN0YXR1cyA9IGxlZnQuc3RhdHVzOworICAgICAgICAgICAgdS5sZWZ0RmlsZSA9IGxlZnQuZmlsZTsKKyAgICAgICAgICAgIHUucmlnaHRSZWZJZCA9IHJpZ2h0LmlkOworICAgICAgICAgICAgdS5yaWdodFN0YXR1cyA9IHJpZ2h0LnN0YXR1czsKKyAgICAgICAgICAgIHUubGVmdFZlcnNpb24gPSBsZWZ0LnZlcnNpb247CisgICAgICAgICAgICB1LnJpZ2h0VmVyc2lvbiA9IHJpZ2h0LnZlcnNpb247CisgICAgICAgICAgICB1LnJpZ2h0RmlsZSA9IHJpZ2h0LmZpbGU7CisgICAgICAgICAgICB1LmNvbXBhcmFibGVOYW1lID0gbGVmdC5jb21wYXJhYmxlTmFtZSsiKyIrcmlnaHQuY29tcGFyYWJsZU5hbWU7CisgICAgICAgICAgICByZXR1cm4gdTsKKyAgICAgICAgfQorCisgICAgICAgIEVsZW1lbnQgdG9YbWwoRG9jdW1lbnQgZG9jKXsKKyAgICAgICAgICAgIEVsZW1lbnQgIGVsZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJmdW5jIik7CisgICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJwcm90b3R5cGUiLCBmb3JtYXRDb2RlKHByb3RvdHlwZSkpOworLy8gICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJsZWZ0UmVmSWQiLCBsZWZ0UmVmSWQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJsZWZ0U3RhdHVzIiwgbGVmdFN0YXR1cyk7CisvLyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoInJpZ2h0UmVmSWQiLCByaWdodFJlZklkKTsKKyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoInJpZ2h0U3RhdHVzIiwgcmlnaHRTdGF0dXMpOworICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgibGVmdFZlcnNpb24iLCBsZWZ0VmVyc2lvbik7CisvLyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoInJpZ2h0UmVmSWQiLCByaWdodFJlZklkKTsKKyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoInJpZ2h0VmVyc2lvbiIsIHJpZ2h0VmVyc2lvbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorLy8gICAgICAgICAgICBTdHJpbmcgZiA9IHJpZ2h0UmVmSWQuZXF1YWxzKG51bCkgPyBsZWZ0UmVmSWQgOiByaWdodFJlZklkOworLy8gICAgICAgICAgICBpbnQgdGFpbCA9IGYuaW5kZXhPZigiXyIpOworLy8gICAgICAgICAgICBmID0gdGFpbCAhPSAtMSA/IGYuc3Vic3RyaW5nKDAsIHRhaWwpIDogZjsKKy8vICAgICAgICAgICAgZiA9IGYuc3RhcnRzV2l0aCgiY2xhc3MiKSA/IGYucmVwbGFjZUZpcnN0KCJjbGFzcyIsIiIpIDogZjsKKyAgICAgICAgICAgIFN0cmluZyBmID0gcmlnaHRGaWxlLmVxdWFscyhudWwpID8gbGVmdEZpbGUgOiByaWdodEZpbGU7CisgICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJmaWxlIiwgZik7CisgICAgICAgICAgICByZXR1cm4gZWxlOworICAgICAgICB9CisgICAgICAgIAorCisJCXB1YmxpYyBpbnQgY29tcGFyZVRvKEpvaW5lZEZ1bmN0aW9uIG8pIHsKKwkJCXJldHVybiBjb21wYXJhYmxlTmFtZS5jb21wYXJlVG8oby5jb21wYXJhYmxlTmFtZSk7CisJCX0KKwkJCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhGdW5jdGlvbiByaWdodCl7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuZXF1YWxzKHJpZ2h0LnByb3RvdHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNGYWMgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICBUcmFuc2Zvcm1lciBtYWtlVHJhbnNmb3JtZXIoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBuYW1lKSB7CisgICAgCWlmKGlzPT1udWxsKSB7CisgICAgCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiTm8gaW5wdXRzdHJlYW0gc2V0IGZvciAiICsgbmFtZSk7CisgICAgCX0KKyAgICAJU3lzdGVtLmVyci5wcmludGxuKCJUcmFuc2Zvcm1pbmcgZnJvbTogIiArIG5hbWUpOworICAgIAlUcmFuc2Zvcm1lciB0OworCQl0cnkgeworLy8JCQkvLyBjaGVjayB0aGUgcHJvbG9nCisvLwkJCWlmKGlzLm1hcmtTdXBwb3J0ZWQoKSkgIHRyeSB7CisvLwkJCQlpcy5tYXJrKDEwMCk7CisvLwkJCQlpbnQgYiA9IGlzLnJlYWQoKTsKKy8vCQkJCWlzLnJlc2V0KCk7CisvLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlJlYWQgYnl0ZTogPT0gIiArIEludGVnZXIudG9IZXhTdHJpbmcoYikpOworLy8JCQl9IGNhdGNoKFRocm93YWJsZSB0aCkgeworLy8JCQkJU3lzdGVtLmVyci5wcmludGxuKCIgKCBjb3VsZG4ndCByZWFkIGEgYnl0ZTogIiArIHRoLnRvU3RyaW5nKCkrICIgKSIpOworLy8JCQl9IGVsc2UgeworLy8JCQkJU3lzdGVtLmVyci5wcmludGxuKCIgKCBjb3VsZG4ndCBzZXQgbWFyaykiKTsKKy8vCQkJfQorCQkJU3RyZWFtU291cmNlIHNzID0gbmV3IFN0cmVhbVNvdXJjZShpcyk7CisJCQlzcy5zZXRTeXN0ZW1JZChuZXcgRmlsZSgiLiIpKTsKKwkJCXQgPSB0cmFuc0ZhYy5uZXdUcmFuc2Zvcm1lcihzcyk7CisJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoIkNvdWxkbid0IG1ha2UgdHJhbnNmb3JtZXIgZm9yICIgKyBuYW1lICsgIiAtICIgKyBlLmdldE1lc3NhZ2VBbmRMb2NhdGlvbigpKTsJCQkKKwkJfQorICAgIAlpZih0ID09IG51bGwpIHsKKyAgICAJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJDb3VsZG4ndCBtYWtlIHRyYW5zZm9ybWVyIGZvciAiICsgbmFtZSk7CisgICAgCX0KKyAgICAJcmV0dXJuIHQ7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCByZXBvcnRTZWxlY3RlZEZ1bihOb2RlIGpvaW5lZE5vZGUpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsKKyAgICAgICAgVHJhbnNmb3JtZXIgcmVwb3J0ID0gbWFrZVRyYW5zZm9ybWVyKHJlcG9ydFhzbFN0cmVhbSwgUlBUWFNMVCk7CisgICAgICAgIC8vcmVwb3J0LnNldFBhcmFtZXRlcigibGVmdFN0YXR1cyIsIGxlZnRTdGF0dXMpOworICAgICAgICByZXBvcnQuc2V0UGFyYW1ldGVyKCJsZWZ0VmVyIiwgbGVmdFZlcik7CisvLyAgICAgICAgcmVwb3J0LnNldFBhcmFtZXRlcigicmlnaHRTdGF0dXMiLCByaWdodFN0YXR1cyk7CisgICAgICAgIHJlcG9ydC5zZXRQYXJhbWV0ZXIoIm91clllYXIiLCBuZXcgSW50ZWdlcihuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCkuZ2V0KGphdmEudXRpbC5DYWxlbmRhci5ZRUFSKSkpOworICAgICAgICByZXBvcnQuc2V0UGFyYW1ldGVyKCJyaWdodFZlciIsIHJpZ2h0VmVyKTsKKyAgICAgICAgcmVwb3J0LnNldFBhcmFtZXRlcigicmlnaHRNaWxlc3RvbmUiLCByaWdodE1pbGVzdG9uZSk7CisgICAgICAgIHJlcG9ydC5zZXRQYXJhbWV0ZXIoImxlZnRNaWxlc3RvbmUiLCBsZWZ0TWlsZXN0b25lKTsKKyAgICAgICAgcmVwb3J0LnNldFBhcmFtZXRlcigiZGF0ZVRpbWUiLCBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKS5nZXRUaW1lKCkpOworICAgICAgICByZXBvcnQuc2V0UGFyYW1ldGVyKCJudWwiLCBudWwpOworICAgICAgICAKKyAgICAgICAgRE9NU291cmNlIHNyYyA9IG5ldyBET01Tb3VyY2Uoam9pbmVkTm9kZSk7CisKKyAgICAgICAgUmVzdWx0IHJlcyA9IG5ldyBTdHJlYW1SZXN1bHQocmVzdWx0RmlsZSk7CisvLyAgICAgICAgRE9NUmVzdWx0IHJlcyA9IG5ldyBET01SZXN1bHQoKTsKKyAgICAgICAgcmVwb3J0LnRyYW5zZm9ybShzcmMsIHJlcyk7CisvLyAgICAgICAgZHVtcE5vZGUocmVzLmdldE5vZGUoKSwiIik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU2V0PEpvaW5lZEZ1bmN0aW9uPiBnZXRGdWxsTGlzdChJbnB1dFN0cmVhbSBkdW1wWHNsdFN0cmVhbSwgU3RyaW5nIGR1bXBYc2x0RmlsZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257CisgICAgICAgIC8vIHByZXBhcmUgdHJhbnNmb3JtZXIKKyAgICAgICAgWFBhdGggeHBhdGggPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9ICIvbGlzdCI7CisgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gbWFrZVRyYW5zZm9ybWVyKGR1bXBYc2x0U3RyZWFtLCBkdW1wWHNsdEZpbGUpOworCisgICAgICAgIC8vICAgICAgICBJbnB1dFNvdXJjZSBsZWZ0U291cmNlID0gbmV3IElucHV0U291cmNlKGxlZnREaXIgKyAiaW5kZXgueG1sIik7CisgICAgICAgIERPTVNvdXJjZSBsZWZ0SW5kZXggPSBuZXcgRE9NU291cmNlKGdldERvY3VtZW50KG5ldyBGaWxlKGxlZnREaXIsSU5ERVhfWE1MKSkpOworICAgICAgICBET01SZXN1bHQgbGVmdFJlc3VsdCA9IG5ldyBET01SZXN1bHQoKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKERPQ19GT0xERVIsIGxlZnREaXIpOworICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obGVmdEluZGV4LCBsZWZ0UmVzdWx0KTsKKworLy8gICAgICAgIE5vZGUgbGVmdExpc3QgPSBYUGF0aEFQSS5zZWxlY3RTaW5nbGVOb2RlKGxlZnRSZXN1bHQuZ2V0Tm9kZSgpLCIvbGlzdCIpOworICAgICAgICBOb2RlIGxlZnRMaXN0ID0gKE5vZGUpeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgbGVmdFJlc3VsdC5nZXROb2RlKCksIFhQYXRoQ29uc3RhbnRzLk5PREUpOworICAgICAgICBpZihsZWZ0TGlzdD09bnVsbCkgeworICAgICAgICAgICAJLy9kdW1wTm9kZSh4c2x0U291cmNlLmdldE5vZGUoKSk7CisgICAgICAgICAgCWR1bXBOb2RlKGxlZnRSZXN1bHQuZ2V0Tm9kZSgpKTsKKy8vICAgICAgICAJZHVtcE5vZGUobGVmdEluZGV4LmdldE5vZGUoKSk7CisgICAgICAgIAlTeXN0ZW0ub3V0LmZsdXNoKCk7CisgICAgICAgIAlTeXN0ZW0uZXJyLmZsdXNoKCk7CisgICAgICAgIAl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiZ2V0RnVsbExpc3QoIitkdW1wWHNsdEZpbGUudG9TdHJpbmcoKSsiKSByZXR1cm5lZCBhIG51bGwgbGVmdCAiK2V4cHJlc3Npb24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB4cGF0aC5yZXNldCgpOyAvLyByZXVzZQorICAgICAgICAKKyAgICAgICAgRE9NU291cmNlIHJpZ2h0SW5kZXggPSBuZXcgRE9NU291cmNlKGdldERvY3VtZW50KG5ldyBGaWxlKHJpZ2h0RGlyLElOREVYX1hNTCkpKTsKKyAgICAgICAgRE9NUmVzdWx0IHJpZ2h0UmVzdWx0ID0gbmV3IERPTVJlc3VsdCgpOworICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoRE9DX0ZPTERFUiwgcmlnaHREaXIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImFiZFRvTG9hZCAiK2R1bXBYc2x0RmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHJpZ2h0SW5kZXgsIHJpZ2h0UmVzdWx0KTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJkbmxUb0xvYWQgIitkdW1wWHNsdEZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgIE5vZGUgcmlnaHRMaXN0ID0gKE5vZGUpeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgcmlnaHRSZXN1bHQuZ2V0Tm9kZSgpLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKyAgICAgICAgaWYocmlnaHRMaXN0PT1udWxsKSB7CisgICAgICAgIAl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiZ2V0RnVsbExpc3QoIitkdW1wWHNsdEZpbGUudG9TdHJpbmcoKSsiKSByZXR1cm5lZCBhIG51bGwgcmlnaHQgIitleHByZXNzaW9uKTsKKyAgICAgICAgfQorLy8gICAgICAgIGR1bXBOb2RlKHJpZ2h0TGlzdCwiIik7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU2V0PEZ1bmN0aW9uPiBsZWZ0U2V0ID0gbm9kZVRvU2V0KGxlZnRMaXN0KTsKKyAgICAgICAgU2V0PEZ1bmN0aW9uPiByaWdodFNldCA9IG5vZGVUb1NldChyaWdodExpc3QpOworICAgICAgICBTZXQ8Sm9pbmVkRnVuY3Rpb24+IGpvaW5lZCA9IGZ1bGxKb2luKGxlZnRTZXQsIHJpZ2h0U2V0KTsKKyAgICAgICAgcmV0dXJuIGpvaW5lZDsKKy8vICAgICAgICBqb2luZWROb2RlID0gc2V0VG9Ob2RlKGpvaW5lZCk7CisvLyAgICAgICAgZHVtcE5vZGUoam9pbmVkTm9kZSwiIik7CisvLyAgICAgICAgcmV0dXJuIGpvaW5lZE5vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5vZGUKKyAgICAgKiBAcmV0dXJuICAgICAgU2V0PEZ1bj4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxGdW5jdGlvbj4gbm9kZVRvU2V0KE5vZGUgbm9kZSl7CisgICAgICAgIFNldDxGdW5jdGlvbj4gcyA9IG5ldyBUcmVlU2V0PEZ1bmN0aW9uPigpOworICAgICAgICBOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBOb2RlIG4gPSBsaXN0Lml0ZW0oaSk7CisgICAgICAgICAgICBzLmFkZChGdW5jdGlvbi5mcm9tWG1sKG4pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2V0ICAgICAgIFNldDxKb2luZWRGdW4+CisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgTm9kZSBzZXRUb05vZGUoU2V0PEpvaW5lZEZ1bmN0aW9uPiBzZXQpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9ueworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jICA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgibGlzdCIpOworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdCk7CisgICAgICAgIGZvciAoSXRlcmF0b3I8Sm9pbmVkRnVuY3Rpb24+IGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBKb2luZWRGdW5jdGlvbiBmdW4gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZnVuLnRvWG1sKGRvYykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogZnVsbC1qb2luIHR3byBTZXQgb24gJ3Byb3RvdHlwZScgCisgICAgICogCisgICAgICogQHBhcmFtIGxlZnQgICAgIFNldDxGdW4+CisgICAgICogQHBhcmFtIHJpZ2h0ICAgIFNldDxGdW4+CisgICAgICogQHJldHVybiAgICAgICAgICBTZXQ8Sm9pbmVkRnVuPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNldDxKb2luZWRGdW5jdGlvbj4gZnVsbEpvaW4oU2V0PEZ1bmN0aW9uPiBsZWZ0LCBTZXQ8RnVuY3Rpb24+IHJpZ2h0KXsKKworICAgICAgICBTZXQ8Sm9pbmVkRnVuY3Rpb24+IGpvaW5lZCA9IG5ldyBUcmVlU2V0PEpvaW5lZEZ1bmN0aW9uPigpOyAvL1NldDxKb2luZWRGdW4+CisgICAgICAgIFNldDxGdW5jdGlvbj4gY29tbW9uID0gbmV3IFRyZWVTZXQ8RnVuY3Rpb24+KCk7IC8vU2V0PEZ1bj4KKyAgICAgICAgZm9yIChJdGVyYXRvcjxGdW5jdGlvbj4gaXRlcjEgPSBsZWZ0Lml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZ1bmN0aW9uIGYxID0gaXRlcjEubmV4dCgpOworLy8gICAgICAgICAgICBpZiAoZjEucHJvdG90eXBlLm1hdGNoZXMoIi4qVHJhbnNsaXRlcmF0b3I6Oi4qIikpeworLy8gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJsZWZ0OiAiICsgZjEucHJvdG90eXBlKTsKKy8vICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigibGVmdDogIiArIGYxLnN0YXR1cyk7CisvLyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RnVuY3Rpb24+IGl0ZXIyID0gcmlnaHQuaXRlcmF0b3IoKTsgaXRlcjIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEZ1bmN0aW9uIGYyID0gaXRlcjIubmV4dCgpOworLy8gICAgICAgICAgICAgICAgaWYgKCBmMS5wcm90b3R5cGUubWF0Y2hlcygiLipmaWx0ZXJlZFRyYW5zbGl0ZXJhdGUuKiIpCisvLyAgICAgICAgICAgICAgICAgICYmIGYyLnByb3RvdHlwZS5tYXRjaGVzKCIuKmZpbHRlcmVkVHJhbnNsaXRlcmF0ZS4qIikpeworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmlnaHQ6ICIgKyBmMi5wcm90b3R5cGUpOworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmlnaHQ6ICIgKyBmMi5zdGF0dXMpOworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihmMS5wcm90b3R5cGUuZXF1YWxzKGYyLnByb3RvdHlwZSkpOworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihmMS5wcm90b3R5cGUuZ2V0Qnl0ZXMoKVswXSk7CisvLyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGYyLnByb3RvdHlwZS5nZXRCeXRlcygpWzBdKTsKKy8vICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZjEuZXF1YWxzKGYyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYWRkIGxlZnQgaXRlbSB0byBjb21tb24gc2V0CisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIHdpbGwgcmVtb3ZlIGNvbW1vbiBpdGVtcyB3aXRoIGxlZnQgc2V0IGxhdGVyCisgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5hZGQoZjEpOworICAgICAgICAgICAgICAgICAgICBqb2luZWQuYWRkKEpvaW5lZEZ1bmN0aW9uLmZyb21Ud29GdW4oZjEsIGYyKSk7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnJlbW92ZShmMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yPEZ1bmN0aW9uPiBpdGVyID0gY29tbW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgRnVuY3Rpb24gZiA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgbGVmdC5yZW1vdmUoZik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoSXRlcmF0b3I8RnVuY3Rpb24+IGl0ZXIgPSBsZWZ0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgRnVuY3Rpb24gZiA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgam9pbmVkLmFkZChKb2luZWRGdW5jdGlvbi5mcm9tTGVmdEZ1bihmKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoSXRlcmF0b3I8RnVuY3Rpb24+IGl0ZXIgPSByaWdodC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZ1bmN0aW9uIGYgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGpvaW5lZC5hZGQoSm9pbmVkRnVuY3Rpb24uZnJvbVJpZ2h0RnVuKGYpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam9pbmVkOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBOb2RlKE5vZGUgbikgeworICAgIAlkdW1wTm9kZShuLCIiKTsKKyAgICB9CisgICAgLyoqCisgICAgICogRHVtcCBvdXQgYSBub2RlIGZvciBkZWJ1Z2dpbmcuIFJlY3Vyc2l2ZSBmY24KKyAgICAgKiBAcGFyYW0gbgorICAgICAqIEBwYXJhbSBwcmUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBOb2RlKE5vZGUgbiwgU3RyaW5nIHByZSkgeworICAgIAlTdHJpbmcgb3ByZSA9IHByZTsKKwkJcHJlICs9ICIgIjsKKwkJU3lzdGVtLm91dC5wcmludChvcHJlICsgIjwiICsgbi5nZXROb2RlTmFtZSgpICk7CisJCS8vIGR1bXAgYXR0cmlidXRlCisJCU5hbWVkTm9kZU1hcCBhdHRyID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisJCWlmIChhdHRyICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ci5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQkJU3lzdGVtLm91dC5wcmludCgiXG4iK3ByZSsiICAgIithdHRyLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSsiPVwiIiArIGF0dHIuaXRlbShpKS5nZXROb2RlVmFsdWUoKSsiXCIiKTsKKwkJCX0KKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4iKTsKKworCQkvLyBkdW1wIHZhbHVlCisJCVN0cmluZyB2ID0gcHJlICsgbi5nZXROb2RlVmFsdWUoKTsKKwkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbih2KTsKKworCQkvLyBkdW1wIHN1YiBub2RlcworCQlOb2RlTGlzdCBuTGlzdCA9IG4uZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5MaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJCU5vZGUgbG4gPSBuTGlzdC5pdGVtKGkpOworCQkJZHVtcE5vZGUobG4sIHByZSArICIgIik7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKG9wcmUgKyAiPC8iICsgbi5nZXROb2RlTmFtZSgpICsgIj4iKTsKKwl9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIHRoZUJ1aWxkZXIgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmICA9IG51bGw7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgCWlmKHRoZUJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgdGhlQnVpbGRlciA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAJfQorICAgIAlyZXR1cm4gdGhlQnVpbGRlcjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoRmlsZSBmaWxlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGZpcyk7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgcmV0dXJuIGRvYzsKKyAgICB9CisgICAgc3RhdGljIGJvb2xlYW4gdHJpZWQgPSBmYWxzZTsKKyAgICBzdGF0aWMgRm9ybWF0dGVyIGFGb3JtYXR0ZXIgPSBudWxsOworICAgIAorICAgIHB1YmxpYyBpbnRlcmZhY2UgRm9ybWF0dGVyIHsKKyAgICAJcHVibGljIFN0cmluZyBmb3JtYXRDb2RlKFN0cmluZyBzKTsKKyAgICB9CisgICAgCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRfa2V5d29yZHNbXSA9IHsKKyAgICAJImVudW0iLCIjZGVmaW5lIiwic3RhdGljIgorICAgIH07CisgICAgCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byB1c2UgYSBwcmV0dHkgZm9ybWF0dGVyCisgICAgICogQHBhcmFtIHByb3RvdHlwZTIKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0Q29kZShTdHJpbmcgcHJvdG90eXBlMikgeworCQlpZighdHJpZWQpIHsKKwkJCVN0cmluZyB0aGVGb3JtYXR0ZXIgPSBTdGFibGVBUEkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSsiLkNvZGVGb3JtYXR0ZXIiOworCQkJdHJ5IHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQlDbGFzczxGb3JtYXR0ZXI+IGZvcm1hdENsYXNzID0gKENsYXNzPEZvcm1hdHRlcj4pIENsYXNzLmZvck5hbWUodGhlRm9ybWF0dGVyKTsKKwkJCQlhRm9ybWF0dGVyID0gKEZvcm1hdHRlcikgZm9ybWF0Q2xhc3MubmV3SW5zdGFuY2UoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJOb3RlOiBDb3VsZG4ndCBsb2FkICIgKyB0aGVGb3JtYXR0ZXIpOworCQkJCWFGb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKCkgeworCisJCQkJCXB1YmxpYyBTdHJpbmcgZm9ybWF0Q29kZShTdHJpbmcgcykgeworCQkJCQkJU3RyaW5nIHN0ciA9IEhUTUxTYWZlKHMudHJpbSgpKTsKKwkJCQkJCWZvcihTdHJpbmcga2V5d29yZCA6IGZvcm1hdF9rZXl3b3JkcykgeworCQkJCQkJCWlmKHN0ci5zdGFydHNXaXRoKGtleXdvcmQpKSB7CisJCQkJCQkJCXN0ciA9IHN0ci5yZXBsYWNlRmlyc3Qoa2V5d29yZCwgIjx0dD4iK2tleXdvcmQrIjwvdHQ+Iik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcmV0dXJuIHN0cjsKKwkJCQkJfQorCQkJCQkKKwkJCQl9OworCQkJfQorCQkJdHJpZWQgPSB0cnVlOworCQl9CisJCWlmKGFGb3JtYXR0ZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGFGb3JtYXR0ZXIuZm9ybWF0Q29kZShwcm90b3R5cGUyKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBIVE1MU2FmZShwcm90b3R5cGUyKTsKKwkJfQorCX0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxTYWZlKFN0cmluZyBzKSB7CisgICAgICAgIGlmKHM9PW51bGwpIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIAorICAgICAgICAgICAgcy5yZXBsYWNlQWxsKCImIiwiJmFtcDsiKQorICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCI8IiwiJmx0OyIpCisgICAgICAgICAgICAgLnJlcGxhY2VBbGwoIj4iLCImZ3Q7IikKKyAgICAgICAgICAgICAucmVwbGFjZUFsbCgiXCIiLCImcXVvdDsiKTsKKyAgICB9CisgICAgCisJCit9CmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDRnVuYy54c2x0IGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ0Z1bmMueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTg3OWMzCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ0Z1bmMueHNsdApAQCAtMCwwICsxLDEwNyBAQAorPCEtLQorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhpcyBpcyBhbiBYU0xUIGJ1aWxkIGZpbGUgZm9yIElDVSB0b29scy4gCisqLworLS0+Cis8IS0tCisgIExpc3QgYWxsIEMgZnVuY3Rpb25zIGdlbmVyYXRlZCBmcm9tIHRoZSAnaW5kZXgueG1sJworLS0+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisgIDx4c2w6cGFyYW0gbmFtZT0iZG9jRm9sZGVyIiAvPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICA8bGlzdD4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZXNfbm9kZSIgc2VsZWN0PSIvZG94eWdlbmluZGV4L2NvbXBvdW5kW0BraW5kPSdmaWxlJ10vQHJlZmlkIiAvPgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmaWxlc19ub2RlIj4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlIiBzZWxlY3Q9ImNvbmNhdCgkZG9jRm9sZGVyLCAnLycsIC4gLCAnLnhtbCcpIiAvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZ1bmNzX25vZGUiIHNlbGVjdD0iZG9jdW1lbnQoJGZpbGUpL2RveHlnZW4vY29tcG91bmRkZWYvc2VjdGlvbmRlZi9tZW1iZXJkZWZbQHByb3Q9J3B1YmxpYyddW0BraW5kPSdmdW5jdGlvbiddIiAvPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZ1bmNzX25vZGUiPgorICAgICAgICAgIDxjcHBmdW5jPgorICAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpZCIgLz4KKyAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwcm90b3R5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoZGVmaW5pdGlvbi90ZXh0KCksIGFyZ3NzdHJpbmcvdGV4dCgpKSIgLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0ibG9jYXRpb24vQGZpbGUiIC8+CisgICAgICAgICAgPC9jcHBmdW5jPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgCisgICAgICAgIDwhLS0gIG5vdyBnZXQgI2RlZmluZXMgIC0tPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRlZnNfbm9kZSIgc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZi9zZWN0aW9uZGVmL21lbWJlcmRlZltAcHJvdD0ncHVibGljJ11bQGtpbmQ9J2RlZmluZSddIiAvPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRlZnNfbm9kZSI+CisgICAgICAgICAgPGNwcGZ1bmM+CisgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0YXR1cyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+I2RlZmluZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZS90ZXh0KCkiIC8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorICAgICAgICAgIDwvY3BwZnVuYz4KK8KgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKworCQk8IS0tICBub3cgZW51bXMgLS0+CisJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9ub2RlIgorCQkJc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZi9zZWN0aW9uZGVmL21lbWJlcmRlZltAa2luZD0nZW51bSddW0Bwcm90PSdwdWJsaWMnXSIgLz4KKwkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbnVtX25vZGUiPgorCisJCQk8IS0tICB1c2UgYSBuYW1lLCBlbHNlICcoYW5vbnltb3VzKScgLS0+CisJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9uYW1lIj4KKwkJCQk8eHNsOmNob29zZT4JCQkJCQorCQkJCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMobmFtZS90ZXh0KCksICdAJykiPgorCQkJCQkJKGFub255bW91cyk8L3hzbDp3aGVuPgorCQkJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lL3RleHQoKSIgLz48L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPgorCQkJPC94c2w6dmFyaWFibGU+CisJCQorCQkJPCEtLSAgZW51bSBvYmplY3QgIC0tPgorCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnVtX3N0YXR1cyIgc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPgorCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnVtX3ZlcnNpb24iIHNlbGVjdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSIvPgorCQkJCisJCQkgPCEtLSAgbm8gYW5vbnltb3VzIGZpbGUgbGV2ZWwgZW51bXMgLS0+PCEtLQorCQkJPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMobmFtZS90ZXh0KCksICdAJykpIj4KKwkJCQk8Y3BwZnVuYz4gCisJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpZCIgLz4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW1fc3RhdHVzIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+ZW51bSA8eHNsOnZhbHVlLW9mCisJCQkJCQlzZWxlY3Q9IiRlbnVtX25vZGVfbmFtZSIgLz4ge308L3hzbDphdHRyaWJ1dGU+CisJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCTwvY3BwZnVuYz4KKwkJCTwveHNsOmlmPgorCQkJCisJCQktLT48eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9maWxlIiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCisKKwkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9tZW1iZXIiIHNlbGVjdD0iZW51bXZhbHVlW0Bwcm90PSdwdWJsaWMnXSIvPgorCQkJCisJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVudW1fbWVtYmVyIj4KKwkJCQk8Y3BwZnVuYz4KKwkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorCQkJCQk8IS0tICBzdGF0dXMgYW5kIHZlcnNpb246IG9ubHkgb3ZlcnJpZGUgaWYgc2V0LiAtLT4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOmNob29zZT4KKwkJCQkJCQk8eHNsOndoZW4gdGVzdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZ0aXRsZS90ZXh0KCkgIT0gJyciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPjwveHNsOndoZW4+CisJCQkJCQkJPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz48L3hzbDpvdGhlcndpc2U+CisJCQkJCQk8L3hzbDpjaG9vc2U+PC94c2w6YXR0cmlidXRlPgorCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOmNob29zZT4KKwkJCQkJCQk8eHNsOndoZW4gdGVzdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSAhPSAnJyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiLz48L3hzbDp3aGVuPgorCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZW51bV92ZXJzaW9uIiAvPjwveHNsOm90aGVyd2lzZT4KKwkJCQkJCTwveHNsOmNob29zZT48L3hzbDphdHRyaWJ1dGU+CisJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+ZW51bSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW1fbm9kZV9uYW1lIi8+Ojo8eHNsOnZhbHVlLW9mCisJCQkJCQlzZWxlY3Q9Im5hbWUvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmlsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX25vZGVfZmlsZSIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJPC9jcHBmdW5jPgorCQkJCisJCQk8L3hzbDpmb3ItZWFjaD4gPCEtLSAgZG9uZSB3aXRoIGVudW0gbWVtYmVyIC0tPgorCQkJCisKKwkJPC94c2w6Zm9yLWVhY2g+IDwhLS0gIGRvbmUgd2l0aCBlbnVtIC0tPgorCisKKyAgICAgIDwveHNsOmZvci1lYWNoPgorICA8L2xpc3Q+CisgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KKworCmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDRnVuY194bWwueHNsdCBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENGdW5jX3htbC54c2x0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTBlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDRnVuY194bWwueHNsdApAQCAtMCwwICsxLDM2IEBACis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGlzIGFuIFhTTFQgYnVpbGQgZmlsZSBmb3IgSUNVIHRvb2xzLiAKKyovCistLT4KKzwhLS0KKyAgTGlzdCBhbGwgQyBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZyb20gdGhlICdpbmRleC54bWwnCistLT4KKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KKyAgPHhzbDpwYXJhbSBuYW1lPSJkb2NGb2xkZXIiIC8+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgIDxsaXN0PgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlc19ub2RlIiBzZWxlY3Q9Ii9kb3h5Z2VuaW5kZXgvY29tcG91bmRbQGtpbmQ9J2ZpbGUnXS9AcmVmaWQiIC8+CisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZpbGVzX25vZGUiPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbGUiIHNlbGVjdD0iY29uY2F0KCRkb2NGb2xkZXIsICcvJywgLiAsICcueG1sJykiIC8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZnVuY3Nfbm9kZSIgc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZi9zZWN0aW9uZGVmL21lbWJlcmRlZltAcHJvdD0ncHVibGljJ11bQGtpbmQ9J2Z1bmN0aW9uJ10iIC8+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZnVuY3Nfbm9kZSI+CisgICAgICAgICAgPGNwcGZ1bmM+CisgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0YXR1cyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdChkZWZpbml0aW9uL3RleHQoKSwgYXJnc3N0cmluZy90ZXh0KCkpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJsb2NhdGlvbi9AZmlsZSIgLz4KKyAgICAgICAgICA8L2NwcGZ1bmM+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgPC94c2w6Zm9yLWVhY2g+CisgIDwvbGlzdD4KKyAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgorCisKZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENwcEZ1bmMueHNsdCBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENwcEZ1bmMueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTk5MjljCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ3BwRnVuYy54c2x0CkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAtLT4KKzwhLS0gTGlzdCBhbGwgY3BwIHB1YmxpYyBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZyb20gdGhlICdpbmRleC54bWwnIC0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKKwl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisJPHhzbDpwYXJhbSBuYW1lPSJkb2NGb2xkZXIiIC8+CisKKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKwkJPGxpc3Q+CisJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbGVzX25vZGUiCisJCQkJc2VsZWN0PSIvZG94eWdlbmluZGV4L2NvbXBvdW5kW0BraW5kPSdjbGFzcyddL0ByZWZpZCIgLz4KKwkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZmlsZXNfbm9kZSI+CisJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlIgorCQkJCQlzZWxlY3Q9ImNvbmNhdCgkZG9jRm9sZGVyLCAnLycsIC4gLCAnLnhtbCcpIiAvPgorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZnVuY3Nfbm9kZSIKKwkJCQkJc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZltAcHJvdD0ncHVibGljJ10vc2VjdGlvbmRlZi9tZW1iZXJkZWZbQHByb3Q9J3B1YmxpYyddW0BraW5kPSdmdW5jdGlvbiddIiAvPgorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG91bmRuYW1lIgorCQkJCQlzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmW0Bwcm90PSdwdWJsaWMnXS9jb21wb3VuZG5hbWUvdGV4dCgpIiAvPgorCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZnVuY3Nfbm9kZSI+CisJCQkJCTxjcHBmdW5jPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+PHhzbDp2YWx1ZS1vZgorCQkJCQkJCXNlbGVjdD0iY29uY2F0KGRlZmluaXRpb24vdGV4dCgpLCBhcmdzc3RyaW5nL3RleHQoKSkiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0ibG9jYXRpb24vQGZpbGUiIC8+CisJCQkJCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSJAc3RhdGljIiAvPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlubGluZSIgLz4KKwkJCQkJPC9jcHBmdW5jPgorCQkJCTwveHNsOmZvci1lYWNoPgorCQkJCQorCQkJCTwhLS0gIG5vdyBjb25zdCBzdGF0aWMgcHVibGljcyAtLT4KKwkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNjb25zdF9ub2RlIgorCQkJCQlzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmW0Bwcm90PSdwdWJsaWMnXS9zZWN0aW9uZGVmL21lbWJlcmRlZltAcHJvdD0ncHVibGljJ11bQGtpbmQ9J3ZhcmlhYmxlJ11bQHN0YXRpYz0neWVzJ10iIC8+CisJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzY29uc3Rfbm9kZSI+CisJCQkJCTxjcHBmdW5jPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+c3RhdGljIDx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRlZmluaXRpb24vdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQHN0YXRpYyIgLz4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpbmxpbmUiIC8+CisJCQkJCTwvY3BwZnVuYz4KKwkJCQk8L3hzbDpmb3ItZWFjaD4KKworCQk8IS0tIAorCQkJCS8vTm8gcmVhbCBub24tc3RhdGljIHZhcmlhYmxlcyAtIGFuZCBhbHNvLCBkb3h5Z2VuIGlzIGNvbmZ1c2VkIGFib3V0IG5lc3RlZCBzdHJ1Y3RzL3VuaW9ucworCQkJCQorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uc3Rfbm9kZSIKKwkJCQkJc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZltAcHJvdD0ncHVibGljJ10vc2VjdGlvbmRlZi9tZW1iZXJkZWZbQHByb3Q9J3B1YmxpYyddW0BraW5kPSd2YXJpYWJsZSddW0BzdGF0aWM9J25vJ10iIC8+CisJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb25zdF9ub2RlIj4KKwkJCQkJPGNwcGZ1bmM+CisJCQkJCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSJAaWQiIC8+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPjx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPjx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icHJvdG90eXBlIj4vKiBub3Qgc3RhdGljICovIDx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRlZmluaXRpb24vdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQHN0YXRpYyIgLz4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpbmxpbmUiIC8+CisJCQkJCTwvY3BwZnVuYz4KKwkJCQk8L3hzbDpmb3ItZWFjaD4KKwkJLS0+CisJCQkJPCEtLSAgbm93IGVudW1zIC0tPgorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9ub2RlIgorCQkJCQlzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmW0Bwcm90PSdwdWJsaWMnXS9zZWN0aW9uZGVmL21lbWJlcmRlZltAa2luZD0nZW51bSddW0Bwcm90PSdwdWJsaWMnXSIgLz4KKwkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVudW1fbm9kZSI+CisKKwkJCQkJPCEtLSAgdXNlIGEgbmFtZSwgZWxzZSAnKGFub255bW91cyknIC0tPgorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9uYW1lIj48eHNsOmNob29zZT4JCQkJCQorCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhuYW1lL3RleHQoKSwgJ0AnKSI+KGFub255bW91cyk8L3hzbDp3aGVuPgorCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lL3RleHQoKSIgLz48L3hzbDpvdGhlcndpc2U+CisJCQkJCQk8L3hzbDpjaG9vc2U+PC94c2w6dmFyaWFibGU+CisKKwkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnVtX3N0YXR1cyIgc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPgorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fdmVyc2lvbiIgc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIi8+CisKKwkJCQkJPGNwcGZ1bmM+CisJCQkJCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSJAaWQiIC8+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPjx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSIkZW51bV92ZXJzaW9uIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+ZW51bSAKKwkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbXBvdW5kbmFtZSIvPjo6PHhzbDp2YWx1ZS1vZgorCQkJCQkJCXNlbGVjdD0iJGVudW1fbm9kZV9uYW1lIiAvPiB7fTwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCQk8L2NwcGZ1bmM+CisJCQorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9maWxlIiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkKKwkJCisJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9tZW1iZXIiIHNlbGVjdD0iZW51bXZhbHVlW0Bwcm90PSdwdWJsaWMnXSIvPgorCQkJCQkKKwkJCQkJPCEtLSAgZm9yIGVhY2ggbWVtYmVyIC0tPgorCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVudW1fbWVtYmVyIj4KKwkJCQkJCTxjcHBmdW5jPgorCQkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpZCIgLz4KKwkJCQkJCQk8IS0tICBzdGF0dXMgYW5kIHZlcnNpb246IG9ubHkgb3ZlcnJpZGUgaWYgc2V0LiAtLT4KKwkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPgorCQkJCQkJCQk8eHNsOmNob29zZT4KKwkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSAhPSAnJyI+CisJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIi8+CisJCQkJCQkJCQk8L3hzbDp3aGVuPgorCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+CisJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz4KKwkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJPC94c2w6Y2hvb3NlPgorCQkJCQkJCTwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj4KKwkJCQkJCQkJPHhzbDpjaG9vc2U+CisJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSAhPSAnJyI+CisJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiLz4KKwkJCQkJCQkJCTwveHNsOndoZW4+CisJCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW1fdmVyc2lvbiIgLz4KKwkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJPC94c2w6Y2hvb3NlPgorCQkJCQkJCTwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwcm90b3R5cGUiPmVudW0gCisJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb21wb3VuZG5hbWUiLz46Ojx4c2w6dmFsdWUtb2YKKwkJCQkJCQkJc2VsZWN0PSIkZW51bV9ub2RlX25hbWUiIC8+Ojo8eHNsOnZhbHVlLW9mCisJCQkJCQkJCXNlbGVjdD0ibmFtZS90ZXh0KCkiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImZpbGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZW51bV9ub2RlX2ZpbGUiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJPC9jcHBmdW5jPgorCQkJCQkKKwkJCQkJPC94c2w6Zm9yLWVhY2g+IDwhLS0gIGRvbmUgd2l0aCBlbnVtIG1lbWJlciAtLT4KKwkJCQkJwqAKKwkJCQk8L3hzbDpmb3ItZWFjaD4gPCEtLSAgZG9uZSB3aXRoIGVudW1zIC0tPgorCisJCQk8L3hzbDpmb3ItZWFjaD4gPCEtLSAgZG9uZSB3aXRoIGZpbGUgLS0+CisKKwkJPC9saXN0PgorCTwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KKworCmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDcHBGdW5jX3htbC54c2x0IGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ3BwRnVuY194bWwueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMzZmYzCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ3BwRnVuY194bWwueHNsdApAQCAtMCwwICsxLDM2IEBACis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGlzIGFuIFhTTFQgZmlsZS4gCisqLworLS0+Cis8IS0tCisgIExpc3QgYWxsIGNwcCBwdWJsaWMgZnVuY3Rpb25zIGdlbmVyYXRlZCBmcm9tIHRoZSAnaW5kZXgueG1sJworLS0+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisgIDx4c2w6cGFyYW0gbmFtZT0iZG9jRm9sZGVyIiAvPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICA8bGlzdD4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZXNfbm9kZSIgc2VsZWN0PSIvZG94eWdlbmluZGV4L2NvbXBvdW5kW0BraW5kPSdjbGFzcyddL0ByZWZpZCIgLz4KKyAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZmlsZXNfbm9kZSI+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZSIgc2VsZWN0PSJjb25jYXQoJGRvY0ZvbGRlciwgJy8nLCAuICwgJy54bWwnKSIgLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmdW5jc19ub2RlIiBzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmL3NlY3Rpb25kZWYvbWVtYmVyZGVmW0Bwcm90PSdwdWJsaWMnXVtAa2luZD0nZnVuY3Rpb24nXSIgLz4KKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdW5jc19ub2RlIj4KKyAgICAgICAgICA8Y3BwZnVuYz4KKyAgICAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAaWQiIC8+CisgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZ0aXRsZS90ZXh0KCkiLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icHJvdG90eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KGRlZmluaXRpb24vdGV4dCgpLCBhcmdzc3RyaW5nL3RleHQoKSkiIC8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorICAgICAgICAgIDwvY3BwZnVuYz4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgPC9saXN0PgorICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CisKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9nZW5SZXBvcnQueHNsdCBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VuUmVwb3J0LnhzbHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2OTI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VuUmVwb3J0LnhzbHQKQEAgLTAsMCArMSwyNTggQEAKKzwhLS0KKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMjAwOC0yMDExLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAgICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhpcyBpcyB0aGUgWFNMVCBmb3IgdGhlIEFQSSBSZXBvcnQuIAorKi8KKy0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgorICA8eHNsOnBhcmFtIG5hbWU9ImxlZnRWZXIiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0icmlnaHRWZXIiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0iZGF0ZVRpbWUiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0icmlnaHRNaWxlc3RvbmUiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0ibGVmdE1pbGVzdG9uZSIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJudWwiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0ib3VyWWVhciIgLz4KKworICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjQuMCIgIGRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgCitkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIgorCW9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiCWVuY29kaW5nPSJ1dGYtOCIgaW5kZW50PSJ5ZXMiLz4KKyAgCisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgICAgPGh0bWw+CisJPHhzbDpjb21tZW50PgorCSBDb3B5cmlnaHQgKEMpICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91clllYXIiIC8+LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKwk8L3hzbDpjb21tZW50PgorICAgIDxoZWFkPgorICAgIDx0aXRsZT5JQ1U0QyBBUEkgQ29tcGFyaXNvbjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsZWZ0VmVyIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsZWZ0TWlsZXN0b25lIiAvPiB3aXRoIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodE1pbGVzdG9uZSIgLz4gPC90aXRsZT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImljdTRjLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+CisgICAgPC9oZWFkPgorICAgIAorICAgIDxib2R5PgorICAgIAorICAgIDxhIG5hbWU9IiNfdG9wIj48L2E+CisgICAgCisgICAgPGgxPklDVTRDIEFQSSBDb21wYXJpc29uOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRNaWxlc3RvbmUiIC8+IHdpdGggPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIgLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0TWlsZXN0b25lIiAvPiA8L2gxPgorICAgIAorICAgIDxkaXYgaWQ9InRvYyI+CisJICAgIDx1bD4KKwkgICAgCTxsaT48YSBocmVmPSIjcmVtb3ZlZCI+UmVtb3ZlZCBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGVmdFZlciIvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNkZXByZWNhdGVkIj5EZXByZWNhdGVkIG9yIE9ic29sZXRlZCBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNjaGFuZ2VkIj5DaGFuZ2VkIGluICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNwcm9tb3RlZCI+UHJvbW90ZWQgdG8gc3RhYmxlIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9hPjwvbGk+CisJICAgIAk8bGk+PGEgaHJlZj0iI2FkZGVkIj5BZGRlZCBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNvdGhlciI+T3RoZXIgZXhpc3RpbmcgZHJhZnRzIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9hPjwvbGk+CisJICAgIDwvdWw+CisJICAgIDxociAvPgorCTwvZGl2PgorCQorCTxhIG5hbWU9InJlbW92ZWQiPjwvYT4KKwkgICAgPGgyPlJlbW92ZWQgZnJvbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiLz4gPC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jW0ByaWdodFN0YXR1cz0kbnVsXSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDxQLz48YSBocmVmPSIjX3RvcCI+KGp1bXAgYmFjayB0byB0b3ApPC9hPjxoci8+CisKKwk8YSBuYW1lPSJkZXByZWNhdGVkIj48L2E+CisgICAgPGgyPkRlcHJlY2F0ZWQgb3IgT2Jzb2xldGVkIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jWyhAcmlnaHRTdGF0dXM9J0RlcHJlY2F0ZWQnIGFuZCBAbGVmdFN0YXR1cyE9J0RlcHJlY2F0ZWQnKSBvciAoQHJpZ2h0U3RhdHVzPSdPYnNvbGV0ZScgYW5kIEBsZWZ0U3RhdHVzIT0nT2Jzb2xldGUnKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8UC8+PGEgaHJlZj0iI190b3AiPihqdW1wIGJhY2sgdG8gdG9wKTwvYT48aHIvPgorCisJPGEgbmFtZT0iY2hhbmdlZCI+PC9hPgorICAgIDxoMj5DaGFuZ2VkIGluICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPiAob2xkLCBuZXcpPC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jWyhAbGVmdFN0YXR1cyAhPSAkbnVsKSBhbmQgKEByaWdodFN0YXR1cyAhPSAkbnVsKSBhbmQgKCAoQGxlZnRTdGF0dXMgIT0gQHJpZ2h0U3RhdHVzKSBvciAoQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24pICkgYW5kIG5vdCAoIChAbGVmdFN0YXR1cyA9ICdEcmFmdCcpIGFuZCAoQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZScpIGFuZCAoQHJpZ2h0VmVyc2lvbiA9ICRyaWdodFZlcikgKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8UC8+PGEgaHJlZj0iI190b3AiPihqdW1wIGJhY2sgdG8gdG9wKTwvYT48aHIvPgorCisJPGEgbmFtZT0icHJvbW90ZWQiPjwvYT4KKyAgICA8aDI+UHJvbW90ZWQgdG8gc3RhYmxlIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jW0BsZWZ0U3RhdHVzICE9ICdTdGFibGUnIGFuZCAgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSddIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPFAvPjxhIGhyZWY9IiNfdG9wIj4oanVtcCBiYWNrIHRvIHRvcCk8L2E+PGhyLz4KKyAgICAKKyAgICA8YSBuYW1lPSJhZGRlZCI+PC9hPgorICAgIDxoMj5BZGRlZCBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvaDI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZW5UYWJsZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZXMiIHNlbGVjdD0iL2xpc3QvZnVuY1tAbGVmdFN0YXR1cz0kbnVsXSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDxQLz48YSBocmVmPSIjX3RvcCI+KGp1bXAgYmFjayB0byB0b3ApPC9hPjxoci8+CisgICAgCisgICAgPGEgbmFtZT0ib3RoZXIiPjwvYT4KKyAgICA8aDI+T3RoZXIgZXhpc3RpbmcgZHJhZnRzIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9oMj4KKyAgICA8ZGl2IGNsYXNzPSdvdGhlcic+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmZvVGFibGUiPiA8IS0tICBub3RlOiBub3RlIGdlblRhYmxlIC0tPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbQHJpZ2h0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAkcmlnaHRWZXJdIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9kaXY+CisgICAgPFAvPjxhIGhyZWY9IiNfdG9wIj4oanVtcCBiYWNrIHRvIHRvcCk8L2E+PGhyLz4KKzwhLS0gICAgCisgICAgCistLT4gICAgCisKKyAgICA8cD48aT48Zm9udCBzaXplPSItMSI+Q29udGVudHMgZ2VuZXJhdGVkIGJ5IFN0YWJsZUFQSSB0b29sIG9uIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGF0ZVRpbWUiIC8+PGJyLz5Db3B5cmlnaHQgKEMpIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3VyWWVhciIgLz4sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9mb250PjwvaT48L3A+CisgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJnZW5UYWJsZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJub2RlcyIgLz4KKyAgICA8dGFibGUgY2xhc3M9J2dlblRhYmxlJyBCT1JERVI9IjEiPgorICAgIDxUSEVBRD4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ0ZpbGUnIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ0FQSSciIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGVmdFZlciIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIgLz4gPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L1RIRUFEPgorCisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbm9kZXMiPgorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQGZpbGUiIC8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIncm93JyIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iKHBvc2l0aW9uKCkgbW9kIDIpIi8+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gCisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Iihwb3NpdGlvbigpIG1vZCAyKSA9IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyb3cwIiAvPjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MSIgLz48L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0nZmlsZSc+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlsZSIgLz4gPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J3Byb3RvJz4gPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IkBwcm90b3R5cGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFN0YXR1cyA9ICdTdGFibGUnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidzdGFiY2hhbmdlJyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgCTx4c2w6aWYgIHRlc3QgPSAiQGxlZnRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIj4yPC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPmNlbnRlcjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAJPC94c2w6aWY+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVmdFN0YXR1cyIgLz48eHNsOmlmICB0ZXN0ID0gIkBsZWZ0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZScgYW5kIEBsZWZ0VmVyc2lvbiA9IEByaWdodFZlcnNpb24iPsK7U3RhYmxlPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgIDxici8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVmdFZlcnNpb24iIC8+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgCTx4c2w6aWYgIHRlc3QgPSAiQGxlZnRTdGF0dXMgIT0gJ0RyYWZ0JyBvciBAcmlnaHRTdGF0dXMgIT0gJ1N0YWJsZScgb3IgQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24iPgorICAgICAgICAgICAgICAgIDx0ZD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFN0YXR1cyIgLz4gCisgICAgICAgICAgICAgICAgICAgIDxici8+IAorICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiBhbmQgQGxlZnRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICcnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iid2ZXJjaGFuZ2UnIiAvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFZlcnNpb24iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiBhbmQgQGxlZnRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgbm90ICggKEBsZWZ0U3RhdHVzID0gJ0RyYWZ0JykgYW5kIChAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJykgYW5kIChAcmlnaHRWZXJzaW9uID0gJHJpZ2h0VmVyKSApIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPjxiIHRpdGxlPSdBIHN0YWJsZSBBUEkgY2hhbmdlZCB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihjaGFuZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQHJpZ2h0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAkcmlnaHRWZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0EgZHJhZnQgQVBJIGhhcyB0aGUgd3JvbmcgdmVyc2lvbi4nIGNsYXNzPSdiaWd3YXJuJz4oc2hvdWxkIGJlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiLz4pPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBsZWZ0U3RhdHVzID0gJ05vbmUnIGFuZCBAcmlnaHRWZXJzaW9uID0gJyciPgorICAgICAgICAgICAgICAgICAgICAgICAgCTxici8+PGIgdGl0bGU9J0EgbmV3IEFQSSB3YXMgaW50cm9kdWNlZCB0aGF0IHdhcyBub3QgdGFnZ2VkLicgY2xhc3M9J2JpZ3dhcm4nPih1bnRhZ2dlZCk8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAJPHhzbDppZiAgdGVzdCA9ICJAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgQHJpZ2h0VmVyc2lvbiA9ICRyaWdodFZlciI+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdib3Juc3RhYmxlJz4KKyAgICAgICAgICAgICAgICAgICAgPGIgdGl0bGU9J0EgbmV3IEFQSSB3YXMgaW50cm9kdWNlZCBhcyBzdGFibGUgaW4gJHJpZ2h0VmVyLicgY2xhc3M9J2JpZ3dhcm4nPihCb3JuIFN0YWJsZSk8L2I+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3RhYmxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmZvVGFibGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZXMiIC8+CisgICAgPHRhYmxlIGNsYXNzPSdnZW5UYWJsZScgQk9SREVSPSIxIj4KKyAgICA8VEhFQUQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidGaWxlJyIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidBUEknIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+IDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC9USEVBRD4KKworICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGVzIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBmaWxlIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3JvdyciLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iihwb3NpdGlvbigpIG1vZCAyKSIvPgorICAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MCIgLz48L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJvdzEiIC8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpbGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdwcm90byc+IDx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJAcHJvdG90eXBlIiAvPiA8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRTdGF0dXMgPSAnU3RhYmxlJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInc3RhYmNoYW5nZSciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAJPHhzbDppZiAgdGVzdCA9ICJAbGVmdFN0YXR1cyA9IEByaWdodFN0YXR1cyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIj4yPC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPmNlbnRlcjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAJPC94c2w6aWY+CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsZWZ0U3RhdHVzIiAvPgorICAgICAgICAgICAgICAgICAgICA8YnIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxlZnRWZXJzaW9uIiAvPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0gIkBsZWZ0U3RhdHVzICE9IEByaWdodFN0YXR1cyBvciBAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiI+CisgICAgICAgICAgICAgICAgPHRkPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJpZ2h0U3RhdHVzIiAvPiAKKyAgICAgICAgICAgICAgICAgICAgPGJyLz4gCisgICAgICAgICAgICAgICAgICAgIDxzcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9IkBsZWZ0VmVyc2lvbiAhPSBAcmlnaHRWZXJzaW9uIGFuZCBAbGVmdFZlcnNpb24gIT0gJycgYW5kIEByaWdodFZlcnNpb24gIT0gJyciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3ZlcmNoYW5nZSciIC8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4gICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJpZ2h0VmVyc2lvbiIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24gYW5kIEBsZWZ0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0Egc3RhYmxlIEFQSSBjaGFuZ2VkIHZlcnNpb24uJyBjbGFzcz0nYmlnd2Fybic+KGNoYW5nZWQpPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAcmlnaHRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICRyaWdodFZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz48YiB0aXRsZT0nQSBkcmFmdCBBUEkgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihzaG91bGQgYmUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIvPik8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGxlZnRTdGF0dXMgPSAnTm9uZScgYW5kIEByaWdodFZlcnNpb24gPSAnJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAJPGJyLz48YiB0aXRsZT0nQSBuZXcgQVBJIHdhcyBpbnRyb2R1Y2VkIHRoYXQgd2FzIG5vdCB0YWdnZWQuJyBjbGFzcz0nYmlnd2Fybic+KHVudGFnZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisgIAorPC94c2w6c3R5bGVzaGVldD4KKworCisKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9nZW5yZXBvcnRfeG1sLnhzbHQgYi9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2dlbnJlcG9ydF94bWwueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjAxYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9nZW5yZXBvcnRfeG1sLnhzbHQKQEAgLTAsMCArMSwyMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgICAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgaXMgdGhlIFhTTFQgZm9yIHRoZSBBUEkgUmVwb3J0LCBYTUwgc3R5bGUKKyovCistLT4KKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KKzwhLS0KKyAgPHhzbDpwYXJhbSBuYW1lPSJsZWZ0U3RhdHVzIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9InJpZ2h0U3RhdHVzIiAvPgorLS0+CisgIDx4c2w6cGFyYW0gbmFtZT0ibGVmdFZlciIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJyaWdodFZlciIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJkYXRlVGltZSIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJudWwiIC8+CisKKyAgPHhzbDpwYXJhbSBuYW1lPSJvdXJZZWFyIiAvPgorICAKKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICA8eHNsOmNvbW1lbnQ+CisgICAgICBDb3B5cmlnaHQgKEMpICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91clllYXIiIC8+LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAgICA8L3hzbDpjb21tZW50PgorICAgIDxjaGFuZ2VSZXBvcnQ+CisgICAgICA8aWRlbnRpdHk+CisJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGVmdCI+CisJICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsZWZ0VmVyIi8+CisJPC94c2w6YXR0cmlidXRlPgorCTx4c2w6YXR0cmlidXRlIG5hbWU9InJpZ2h0Ij4KKwkgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+CisJPC94c2w6YXR0cmlidXRlPgorCTx4c2w6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRlZC1kYXRlIj4KKwkgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGF0ZVRpbWUiIC8+CisJPC94c2w6YXR0cmlidXRlPgorICAgICAgPC9pZGVudGl0eT4KKworICAgICAgPCEtLSA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImljdTRjLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+IC0tPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9InJlbW92ZWQiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbQHJpZ2h0U3RhdHVzPSRudWxdIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L2Z1bmN0aW9ucz4KKworICAgICAgPGZ1bmN0aW9ucyBuYW1lPSJkZXByZWNhdGVkIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jWyhAcmlnaHRTdGF0dXM9J0RlcHJlY2F0ZWQnIGFuZCBAbGVmdFN0YXR1cyE9J0RlcHJlY2F0ZWQnKSBvciAoQHJpZ2h0U3RhdHVzPSdPYnNvbGV0ZScgYW5kIEBsZWZ0U3RhdHVzIT0nT2Jzb2xldGUnKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9ImNoYW5nZWQiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbKEBsZWZ0U3RhdHVzICE9ICRudWwpIGFuZCAoQHJpZ2h0U3RhdHVzICE9ICRudWwpIGFuZCAoIChAbGVmdFN0YXR1cyAhPSBAcmlnaHRTdGF0dXMpIG9yIChAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbikgKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9InByb21vdGVkIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jW0BsZWZ0U3RhdHVzICE9ICdTdGFibGUnIGFuZCAgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSddIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L2Z1bmN0aW9ucz4KKyAgICAKKyAgICAgIDxmdW5jdGlvbnMgbmFtZT0iYWRkZWQiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbQGxlZnRTdGF0dXM9JG51bF0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9ImRyYWZ0Ij4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZm9UYWJsZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZXMiIHNlbGVjdD0iL2xpc3QvZnVuY1tAcmlnaHRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICRyaWdodFZlcl0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgPC9jaGFuZ2VSZXBvcnQ+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZXMiIC8+CisgICAgPHRhYmxlIGNsYXNzPSdnZW5UYWJsZScgQk9SREVSPSIxIj4KKyAgICA8VEhFQUQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidGaWxlJyIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidBUEknIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+IDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC9USEVBRD4KKworICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGVzIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBmaWxlIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3JvdyciLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iihwb3NpdGlvbigpIG1vZCAyKSIvPgorICAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MCIgLz48L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJvdzEiIC8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpbGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdwcm90byc+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJvdG90eXBlIiAvPiA8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRTdGF0dXMgPSAnU3RhYmxlJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInc3RhYmNoYW5nZSciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgIAk8eHNsOmlmICB0ZXN0ID0gIkBsZWZ0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZScgYW5kIEBsZWZ0VmVyc2lvbiA9IEByaWdodFZlcnNpb24iPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29sc3BhbiI+CisgICAgICAgCSAgICAgICAgICAgIAkJMgorICAgICAgIAkgICAgICAgICAgICAJPC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPgorICAgICAgIAkgICAgICAgICAgICAJCWNlbnRlcgorICAgICAgIAkgICAgICAgICAgICAJPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgIAk8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsZWZ0U3RhdHVzIiAvPjx4c2w6aWYgIHRlc3QgPSAiQGxlZnRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+Jmd0O1N0YWJsZTwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8YnIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxlZnRWZXJzaW9uIiAvPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgIAk8eHNsOmlmICB0ZXN0ID0gIkBsZWZ0U3RhdHVzICE9ICdEcmFmdCcgb3IgQHJpZ2h0U3RhdHVzICE9ICdTdGFibGUnIG9yIEBsZWZ0VmVyc2lvbiAhPSBAcmlnaHRWZXJzaW9uIj4KKyAgICAgICAgICAgICAgICA8dGQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmlnaHRTdGF0dXMiIC8+IAorICAgICAgICAgICAgICAgICAgICA8YnIvPiAKKyAgICAgICAgICAgICAgICAgICAgPHNwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24gYW5kIEBsZWZ0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAnJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIndmVyY2hhbmdlJyIgLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmlnaHRWZXJzaW9uIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24gYW5kIEBsZWZ0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0Egc3RhYmxlIEFQSSBjaGFuZ2VkIHZlcnNpb24uJyBjbGFzcz0nYmlnd2Fybic+KGNoYW5nZWQpPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAcmlnaHRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICRyaWdodFZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz48YiB0aXRsZT0nQSBkcmFmdCBBUEkgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihzaG91bGQgYmUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIvPik8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGxlZnRTdGF0dXMgPSAnTm9uZScgYW5kIEByaWdodFZlcnNpb24gPSAnJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAJPGJyLz48YiB0aXRsZT0nQSBuZXcgQVBJIHdhcyBpbnRyb2R1Y2VkIHRoYXQgd2FzIG5vdCB0YWdnZWQuJyBjbGFzcz0nYmlnd2Fybic+KHVudGFnZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3RhYmxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmZvVGFibGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZXMiIC8+CisgICAgPHRhYmxlIGNsYXNzPSdnZW5UYWJsZScgQk9SREVSPSIxIj4KKyAgICA8VEhFQUQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidGaWxlJyIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidBUEknIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+IDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC9USEVBRD4KKworICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGVzIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBmaWxlIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3JvdyciLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iihwb3NpdGlvbigpIG1vZCAyKSIvPgorICAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MCIgLz48L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJvdzEiIC8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpbGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdwcm90byc+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJvdG90eXBlIiAvPiA8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRTdGF0dXMgPSAnU3RhYmxlJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInc3RhYmNoYW5nZSciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAJPHhzbDppZiAgdGVzdCA9ICJAbGVmdFN0YXR1cyA9IEByaWdodFN0YXR1cyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIj4KKyAgICAgICAJICAgICAgICAgICAgCQkyCisgICAgICAgCSAgICAgICAgICAgIAk8L3hzbDphdHRyaWJ1dGU+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbGlnbiI+CisgICAgICAgCSAgICAgICAgICAgIAkJY2VudGVyCisgICAgICAgCSAgICAgICAgICAgIAk8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgCTwveHNsOmlmPgorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVmdFN0YXR1cyIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGJyLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsZWZ0VmVyc2lvbiIgLz4KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9ICJAbGVmdFN0YXR1cyAhPSBAcmlnaHRTdGF0dXMgb3IgQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24iPgorICAgICAgICAgICAgICAgIDx0ZD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFN0YXR1cyIgLz4gCisgICAgICAgICAgICAgICAgICAgIDxici8+IAorICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiBhbmQgQGxlZnRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICcnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iid2ZXJjaGFuZ2UnIiAvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFZlcnNpb24iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgPCEtLSAKKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9IkBsZWZ0VmVyc2lvbiAhPSBAcmlnaHRWZXJzaW9uIGFuZCBAbGVmdFZlcnNpb24gIT0gJycgYW5kIEByaWdodFZlcnNpb24gIT0gJycgYW5kIEByaWdodFN0YXR1cyA9ICdTdGFibGUnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPjxiIHRpdGxlPSdBIHN0YWJsZSBBUEkgY2hhbmdlZCB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihjaGFuZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQHJpZ2h0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAkcmlnaHRWZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0EgZHJhZnQgQVBJIGhhcyB0aGUgd3JvbmcgdmVyc2lvbi4nIGNsYXNzPSdiaWd3YXJuJz4oc2hvdWxkIGJlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiLz4pPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBsZWZ0U3RhdHVzID0gJ05vbmUnIGFuZCBAcmlnaHRWZXJzaW9uID0gJyciPgorICAgICAgICAgICAgICAgICAgICAgICAgCTxici8+PGIgdGl0bGU9J0EgbmV3IEFQSSB3YXMgaW50cm9kdWNlZCB0aGF0IHdhcyBub3QgdGFnZ2VkLicgY2xhc3M9J2JpZ3dhcm4nPih1bnRhZ2dlZCk8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorICAKKzwveHNsOnN0eWxlc2hlZXQ+CisKKworCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY3B5c2VhcmNoL0NweS5wbSBiL3NjcmlwdHMvY3B5c2VhcmNoL0NweS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWI5MDQzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jcHlzZWFyY2gvQ3B5LnBtCkBAIC0wLDAgKzEsMTA5IEBACisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAgKiBDT1BZUklHSFQ6CisjICAqIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbgorIyAgKiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMKKyMgQ29tbW9uIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiBjcHlzZWFyY2gucGwgYW5kIGNweXNjYW4ucGwKKyMKKworcGFja2FnZSBDcHk7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIGJhc2UgJ0V4cG9ydGVyJzsKKworb3VyIEBFWFBPUlQgPSBxdyhhbnkgZ2xvYl90b19yZWdleCBzaG91bGRfaWdub3JlKTsKKworIyBhbnkoQ09ERSwgTElTVCkKKyMgRXZhbHVhdGUgQ09ERSBmb3IgZWFjaCBlbGVtZW50IG9mIExJU1QgdGlsbCBDT0RFKCRfKSByZXR1cm5zIDEuIFJldHVybiAwIGlmCisjIG5vdCBmb3VuZC4KK3N1YiBhbnkoJkApIHsKKyAgICBteSAkY29kZSA9IHNoaWZ0OworICAgIGxvY2FsICRfOworICAgICYkY29kZSAmJiByZXR1cm4gMSBmb3IgQF87CisgICAgMDsKK30KKworIyBQZXJsIGRvZXNuJ3QgaGF2ZSBmbm1hdGNoLiBDbG9zZXN0IHRoaW5nIGlzIEZpbGU6OkZuTWF0Y2ggYnV0IHRoYXQncworIyBVTklYLW9ubHkgKHNlZSBpdHMgY2F2ZWF0cykuIFNvLCBhcyBhIHdvcmthcm91bmQsIGNvbnZlcnQgZ2xvYnMgdG8gcmVndWxhcgorIyBleHByZXNzaW9ucy4gVHJhbnNsYXRlZCBmcm9tIFB5dGhvbidzIGZubWF0Y2ggbW9kdWxlLgorc3ViIGdsb2JfdG9fcmVnZXgoJCkgeworICAgIG15ICgkZ2xvYiwgJGksICRsZW4sICRyZWdleCk7CisgICAgJGdsb2IgPSBzaGlmdDsKKyAgICAkaSA9IDA7CisgICAgJGxlbiA9IGxlbmd0aCgkZ2xvYik7CisgICAgJHJlZ2V4ID0gIiI7CisKKyAgICAjIGNoYXJhdChTVFIsIElEWCkKKyAgICAjIFJldHVybiB0aGUgY2hhcmFjdGVyIGluIHRoZSBhcmd1bWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgbXkgJGNoYXJhdCA9IHN1YigkJCkgeyByZXR1cm4gc3Vic3RyKHNoaWZ0LCBzaGlmdCwgMSkgfTsKKworICAgIHdoaWxlICgkaSA8ICRsZW4pIHsKKyAgICAgICAgbXkgKCRjLCAkb3V0KTsKKyAgICAgICAgJGMgPSAmJGNoYXJhdCgkZ2xvYiwgJGkrKyk7CisgICAgICAgIGlmICAgICgkYyBlcSAnKicpIHsgJG91dCA9ICcuKicgfQorICAgICAgICBlbHNpZiAoJGMgZXEgJz8nKSB7ICRvdXQgPSAnLicgfQorICAgICAgICBlbHNpZiAoJGMgZXEgJ1snKSB7ICMgZ2xvYiBjbGFzc2VzCisgICAgICAgICAgICBteSAkaiA9ICRpOworCisgICAgICAgICAgICAjIEdldCB0aGUgY2xvc2luZyBpbmRleCBvZiB0aGUgY2xhc3MuIF0gYXBwZWFyaW5nIGhlcmUgaXMgcGFydAorICAgICAgICAgICAgIyBvZiB0aGUgY2xhc3MuCisgICAgICAgICAgICBpZiAgICAoJGogPCAkbGVuICYmICYkY2hhcmF0KCRnbG9iLCAkaikgZXEgJyEnKSB7ICRqKysgfQorICAgICAgICAgICAgaWYgICAgKCRqIDwgJGxlbiAmJiAmJGNoYXJhdCgkZ2xvYiwgJGopIGVxICddJykgeyAkaisrIH0KKyAgICAgICAgICAgIHdoaWxlICgkaiA8ICRsZW4gJiYgJiRjaGFyYXQoJGdsb2IsICRqKSBuZSAnXScpIHsgJGorKyB9CisKKyAgICAgICAgICAgICMgRGlkbid0IGZpbmQgY2xvc2luZyBicmFjZS4gVXNlIGxpdGVyYWwgWworICAgICAgICAgICAgaWYgKCRqID49ICRsZW4pIHsgJG91dCA9ICJcXFsiIH0KKworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBUaGUgY29tcGxldGUgY2xhc3MgY29udGVudHMgKGV4Y2VwdCB0aGUgYnJhY2VzKQorICAgICAgICAgICAgICAgIG15ICRzID0gc3Vic3RyKCRyZWdleCwgJGksICRqIC0gJGkpOworICAgICAgICAgICAgICAgICRzID1+IHMvXFwvXFxcXC9nOworICAgICAgICAgICAgICAgICRpID0gJGogKyAxOyAjIGNoYW5nZSBwb3NpdGlvbiB0byBvdXRzaWRlIGNsYXNzCisKKyAgICAgICAgICAgICAgICAjIE5lZ2F0aW9uCisgICAgICAgICAgICAgICAgaWYgKCYkY2hhcmF0KCRzLCAwKSBlcSAnIScpIHsgJHMgPSAnXicuc3Vic3RyKCRzLCAxKTsgfQorICAgICAgICAgICAgICAgICMgTGl0ZXJhbCBeCisgICAgICAgICAgICAgICAgZWxzaWYgKCYkY2hhcmF0KCRzLCAwKSBlcSAnXicpIHsgJHMgPSAnXFwnLiRzOyB9CisKKyAgICAgICAgICAgICAgICAkb3V0ID0gIlskc10iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAkb3V0ID0gcXVvdGVtZXRhKCRjKSB9CisgICAgICAgICRyZWdleCAuPSAkb3V0OworICAgIH0KKyAgICByZXR1cm4gJHJlZ2V4OworfQorCitvdXIgJGNweXNraXAgPSAnY3B5c2tpcC50eHQnOworZGllICgiQ2FuJ3QgZmluZCAkY3B5c2tpcC4gUGxlYXNlIGRvd25sb2FkIGl0IGZyb20gIi4KKyAgICAgImh0dHA6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL2NweXNraXAudHh0IChzZWUgIi4KKyAgICAgImh0dHA6Ly9zaXRlLmljdS1wcm9qZWN0Lm9yZy9wcm9jZXNzZXMvY29weXJpZ2h0LXNjYW4gZm9yIG1vcmUgZGV0YWlscykuIikKKyAgICB1bmxlc3MgLWYgJGNweXNraXA7CisKK29wZW4gU0tJUCwgIjwkY3B5c2tpcCIgb3IgZGllICJFcnJvciBvcGVuaW5nICRjcHlza2lwLiI7CitvdXIgQGlnbm9yZV9nbG9icyA9IG1hcCAgeyBjaG9tcDsgZ2xvYl90b19yZWdleCgkXykgfQorICAgICAgICAgICAgICAgICAgICBncmVwIHsgISBtL15ccyojLyB9CisgICAgICAgICAgICAgICAgICAgIDxTS0lQPjsKK2Nsb3NlIFNLSVA7CisKKyMgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdG8gaWdub3JlCitvdXIgQGlnbm9yZV9leHRlbnNpb25zID0gcXcoc3ZuIGRsbCBpbGsgaWRiIHBkYiBkc3AgZHN3IG9wdCBuY2IgdmNwcm9qIHNsbiBzdW8KKyAgICBjdnNpZ25vcmUgY252IHJlcyBpY3UgZXhlIG9iaiBiaW4gZXhwIGxpYiBvdXQgcGxnIGphciBzcHAgc3R1YiBwb2xpY3kgdHRmCisgICAgVFRGIG90Zik7CitvdXIgJGlnbm9yZV9leHRzID0gam9pbiAnfCcsCisgICAgICAgICAgICAgICAgICAgbWFwIHsgIlxcLiRfIiB9CisgICAgICAgICAgICAgICAgICAgQGlnbm9yZV9leHRlbnNpb25zOworCisjIGlnbm9yZSByZWdleAorb3VyICRpZ25vcmVfcmVnZXggPSAiZGF0YS9vdXQvYnVpbGR8Q1ZTfFxcfnxcXCN8RGVidWd8UmVsZWFzZXxwb3NpdGlvbnN8dW5pZGF0YXwkaWdub3JlX2V4dHMiOworCisjIENoZWNrIGlmIHRoaXMgZmlsZSBzaG91bGQgYmUgaWdub3JlZC4KK3N1YiBzaG91bGRfaWdub3JlKCQpIHsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKyAgICByZXR1cm4gMSBpZiAkZmlsZW5hbWUgPX4gLyRpZ25vcmVfcmVnZXgvOworICAgIGZvciBteSAkciAoQGlnbm9yZV9nbG9icykgeyByZXR1cm4gMSBpZiAkZmlsZW5hbWUgPX4gLyRyLyB9CisgICAgMDsKK30KKworMTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY3B5c2VhcmNoL2NweXNjYW4ucGwgYi9zY3JpcHRzL2NweXNlYXJjaC9jcHlzY2FuLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlYjc1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NweXNlYXJjaC9jcHlzY2FuLnBsCkBAIC0wLDAgKzEsMzIgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgICogQ09QWVJJR0hUOgorIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbgorIyAgKiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgCisjICBTZWFyY2ggZm9yIGFuZCBsaXN0IGZpbGVzIHdoaWNoIGRvbid0IGhhdmUgYSBjb3B5cmlnaHQgbm90aWNlLCBhbmQgc2hvdWxkLgorIwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBGaWxlOjpGaW5kOworCit1c2UgRmluZEJpbiBxdygkQmluKTsKK3VzZSBsaWIgJEJpbjsKKwordXNlIENweTsKK215ICRpY3Vfc3JjID0gJEFSR1ZbMF0gfHwgIi4iOworZGllICJDYW4ndCBvcGVuIElDVSBkaXJlY3Rvcnk6ICRpY3Vfc3JjIiB1bmxlc3MgLWQgJGljdV9zcmM7CitmaW5kKHsKKyAgICAgICAgd2FudGVkID0+IHN1YiB7CisgICAgICAgICAgICByZXR1cm4gdW5sZXNzIC1mOworICAgICAgICAgICAgcmV0dXJuIGlmIHNob3VsZF9pZ25vcmUoJF8pOworCisgICAgICAgICAgICBvcGVuIEYsICI8JF8iIG9yIGRpZSAiRXJyb3Igb3BlbmluZyAnJF8nLiI7CisgICAgICAgICAgICBteSAkcmVzdWx0ID0gYW55IHsgJF8gPX4gL2NvcHlyaWdodC4qKGludGVybmF0aW9uYWx8aWJtKS9pIH0gPEY+OworICAgICAgICAgICAgY2xvc2UgRjsKKworICAgICAgICAgICAgcHJpbnQgIiRfXG4iIHVubGVzcyAkcmVzdWx0OworICAgICAgICB9LAorICAgICAgICBub19jaGRpciA9PiAxLAorICAgIH0sICRpY3Vfc3JjKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY3B5c2VhcmNoL2NweXNlYXJjaC5wbCBiL3NjcmlwdHMvY3B5c2VhcmNoL2NweXNlYXJjaC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzJjNDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jcHlzZWFyY2gvY3B5c2VhcmNoLnBsCkBAIC0wLDAgKzEsNDMgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgICogQ09QWVJJR0hUOgorIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbgorIyAgKiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMKKyMgU2VhcmNoIGZvciBmaWxlcyBtb2RpZmllZCB0aGlzIHllYXIsIHRoYXQgbmVlZCB0byBoYXZlIGNvcHlyaWdodCBpbmRpY2F0aW5nCisjIHRoaXMgY3VycmVudCB5ZWFyIG9uIHRoZW0uCisjCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIFRpbWU6OmxvY2FsdGltZTsKK3VzZSBGaWxlOjpzdGF0OwordXNlIEZpbGU6OkZpbmQ7CisKKyMgQWRkIHNjcmlwdCBkaXJlY3RvcnkgdG8gUGVybCBQQVRILgordXNlIEZpbmRCaW4gcXcoJEJpbik7Cit1c2UgbGliICRCaW47CisKK3VzZSBDcHk7CisKK215ICRpY3Vfc3JjID0gJEFSR1ZbMF0gfHwgIi4iOworZGllICJDYW4ndCBvcGVuIElDVSBkaXJlY3Rvcnk6ICRpY3Vfc3JjIiB1bmxlc3MgLWQgJGljdV9zcmM7CitteSAkeWVhciA9IGxvY2FsdGltZS0+eWVhciArIDE5MDA7CisKK2ZpbmQoeworICAgICAgICB3YW50ZWQgPT4gc3ViIHsgIyAkXyBpcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlCisgICAgICAgICAgICByZXR1cm4gdW5sZXNzIC1mOworICAgICAgICAgICAgcmV0dXJuIGlmIChsb2NhbHRpbWUoc3RhdCgkXyktPm10aW1lKS0+eWVhciArIDE5MDApIDwgJHllYXI7CisgICAgICAgICAgICByZXR1cm4gaWYgc2hvdWxkX2lnbm9yZSgkXyk7CisgICAgICAgICAgICAjIGZpbGUgaXMgcmVjZW50IGFuZCBzaG91bGRuJ3QgYmUgaWdub3JlZC4gZmluZCBjb3B5cmlnaHQuCisKKyAgICAgICAgICAgICMgaWYgZmlsZSBjb250YWlucyBhIGxpbmUgd2l0aCAiY29weXJpZ2h0IiBhbmQgY3VycmVudCB5ZWFyIG9uIHRoZQorICAgICAgICAgICAgIyBzYW1lIGxpbmUsIHdlJ3JlIGdvb2QuCisgICAgICAgICAgICBvcGVuIEYsICI8JF8iIG9yIGRpZSAiRXJyb3Igb3BlbmluZyAnJF8nLiI7CisgICAgICAgICAgICBteSAkcmVzdWx0ID0gYW55IHsgJF8gPX4gL2NvcHlyaWdodC4qJHllYXIvaSB9IDxGPjsKKyAgICAgICAgICAgIGNsb3NlIEY7CisKKyAgICAgICAgICAgIHByaW50ICIkX1xuIiB1bmxlc3MgJHJlc3VsdDsKKyAgICAgICAgfSwKKyAgICAgICAgbm9fY2hkaXIgPT4gMSwKKyAgICB9LCAkaWN1X3NyYyk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NweXNlYXJjaC9yZWFkbWUudHh0IGIvc2NyaXB0cy9jcHlzZWFyY2gvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdkZTdmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jcHlzZWFyY2gvcmVhZG1lLnR4dApAQCAtMCwwICsxLDE4IEBACitDb3B5cmlnaHQgKGMpIDIwMDItMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitjcHlzZWFyY2gucGwgaXMgYSBwZXJsIHNjcmlwdCB1c2VkIHRvIGRldGVjdCB0aGUgZmlsZXMgdGhhdCBtaWdodCBub3QgaGF2ZSB0aGUgY29weXJpZ2h0IG5vdGljZS4gQmVzdCB3aGVuIHVzZWQgb24gd2luZG93cyBvbiBhIGNsZWFuIGNoZWNrb3V0LiBFZGl0ICRpY3VTb3VyY2UgdG8geW91ciBwYXRoLiBJZiB5b3UgYXJlIHdvcmtpbmcgb24gb3RoZXIgcGxhdGZvcm0sIHlvdSBwcm9iYWJseSB3YW50IHRvIGVkaXQgJGlnbm9yZSB0byByZWZsZWN0IGRpZmZlcmVudCB0ZW1wb3JhcnkgZmlsZXMgdGhhdCB5b3UgZG9uJ3Qgd2FudCBpbiB0aGUgc2Nhbi4gVGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSB3b3JkIGNvcHlyaWdodCAoY2FzZSBpZ25vcmVkKSBpbiBmaXJzdCAxMCBsaW5lcy4gTG9vayBhdCB0aGVtIGFuZCBmaXggaWYgbmVlZGVkLiAKKworY3B5c2VhcmNoLnBsICBzZWFyY2hlcyBmb3IgZmlsZXMgbW9kaWZpZWQgdGhpcyB5ZWFyIHRoYXQgZG9uJ3QgaGF2ZSB0aGUKKyAgY29ycmVjdCB5ZWFyIGNvcHlyaWdodCAoaS5lLiAnY29weXJpZ2h0IDE5OTUnKSAKKworY3B5c2Nhbi5wbCAgICBzZWFyY2hlcyBmb3IgYWxsIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgY29weXJpZ2h0CisKK2NweXNraXAudHh0ICBpcyBwYXJ0IG9mIHRoZSBpZ25vcmUgbGlzdC4gRG93bmxvYWQgdGhlIGxhdGVzdCBmcm9tCisgICBodHRwOi8vc291cmNlLmljdS1wcm9qZWN0Lm9yZy9jcHlza2lwLnR4dAorCittb3JlIGRvY3Mgb24gY29weXJpZ2h0IHNjYW4gYXQ6CisgICBodHRwOi8vc2l0ZS5pY3UtcHJvamVjdC5vcmcvcHJvY2Vzc2VzL2NvcHlyaWdodC1zY2FuCisKKworSGF2ZSBmdW4hCit3ZWl2CmRpZmYgLS1naXQgYS9zY3JpcHRzL2ljdXJ1biBiL3NjcmlwdHMvaWN1cnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyZWM1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2ljdXJ1bgpAQCAtMCwwICsxLDIwNCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIGlzIGRlc2lnbmVkIGZvciBidWlsZGluZyBhbmQgcnVubmluZyBzaW5nbGUtc291cmNlLWZpbGUgSUNVIHByb2dyYW1zLgorIworIyBJbiBpdHMgc2ltcGxlc3QgdXNhZ2UsICBzaW1wbHkgdHlwZToKKyMKKyMgICAgIGljdXJ1biAgeW91cnByb2dyYW0uYyAKKyMgICAgICAgKG9yIC5jcHAgaWYgaXQgaXMgYSBDKysgcHJvZ3JhbSkgCisjCisjICBUaGUgdG9vbCB3aWxsIGNvbXBpbGUgYW5kIHRoZW4gcnVuIHRoZSBwcm9ncmFtCisjCisjICBGSU5ESU5HIElDVQorIyAgVG8gZmluZCBJQ1UsIHRoZSBmb2xsb3dpbmcgc2VhcmNoIG9yZGVyIGlzIHVzZWQgYnkgcHJpb3JpdHk6CisjCisjICAxKSAgICAiLWkgPHBhdGg+IiAuLiB0aGUgPHBhdGg+IHdpbGwgYmUgc2VhcmNoZWQgZm9yIGVpdGhlciBhIGRpcmVjdCBwYXRoIHRvIGljdS1jb25maWcsCisjICAgICAgICAgICAgb3IgYSBkaXJlY3RvcnkgY29udGFpbmluZyBpdCwgb3IgYSBkaXJlY3RvcnkgY29udGFpbmluZyAnL2JpbicgY29udGFpbmluZyBpdC4KKyMgICAgICAgIEluIG90aGVyIHdvcmRzLCBpZiBpY3UtY29uZmlnIGlzICAvb3B0L2xvY2FsL2Jpbi9pY3UtY29uZmlnLCBhbnkgb2YgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CisjICAgICAgICAgICAgICAgICAtaSAvb3B0L2xvY2FsCisjICAgICAgICAgICAgICAgICAtaSAvb3B0L2xvY2FsL2JpbgorIyAgICAgICAgICAgICAgICAgLWkgL29wdC9sb2NhbC9iaW4vaWN1LWNvbmZpZworIyAgICAgICAgIAorIyAgICAgICAgIEFkZGl0aW9uYWxseSwgL2ljdS9zb3VyY2UgaXMgYSBidWlsdCBJQ1Ugc291cmNlIGRpcmVjdG9yeSwgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgd2lsbCB3b3JrOgorIworIyAgICAgICAgICAgICAgICAgLWkgL2ljdQorIyAgICAgICAgICAgICAgICAgLWkgL2ljdS9zb3VyY2UKKyMKKyMgICAgICAgICBBbHNvLCBpZiAvYnVpbGQgaXMgYW4gb3V0LW9mLXNvdXJjZSBidWlsZCwgdGhpcyB3aWxsIHdvcms6CisjCisjICAgICAgICAgICAgICAgICAtaSAvYnVpbGQKKyMKKyMgIDIpICAgIElmIHRoZXJlIGlzIGFuIGV4ZWN1dGFibGUgfi8uaWN1cnVucmMgc2NyaXB0LCBpdCBjYW4gc2V0IHRoZSB2YXJpYWJsZSAiSUNVX0NPTkZJRyIgdG8gcG9pbnQKKyMgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBpY3UtY29uZmlnIGZpbGUuCisjICAgICAgICBBbiBleGFtcGxlIH4vLmljdXJ1bnJjIHNjcmlwdCAgY29udGFpbnMganVzdCB0aGlzIGxpbmU6CisjICAgICAgICAgICAgICAgCisjICAgICAgICAgICAgICBJQ1VfQ09ORklHPS9ob21lL3NybC9FL0lJL2Jpbi9pY3UtY29uZmlnCisjCisjICAzKSAgICBJQ1VfQ09ORklHIGNhbiBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50IHRvIHBvaW50IHRvIGljdS1jb25maWcgICggaXQncyBvdmVycmlkZGVuIGJ5IHRoZSAuaWN1cnVucmMgc2NyaXB0ICkKKyMKKyMgIDQpICAgIGlmICJpY3UtY29uZmlnIiBpcyBvbiB0aGUgUEFUSCwgaXQgd2lsbCBiZSB1c2VkLgorIworIyAKKyMgIFJVTk5JTkcKKyMgICBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9sbG93aW5nIHRoZSBmaWxlIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyMKKyMgIFRPRE8KKyMgICAqIHNob3VsZCBzdXBwb3J0IHBrZy1jb25maWcsIHdoaWNoIGlzIHByZWZlcnJlZCBvdmVyIGljdS1jb25maWcsIGFsdGhvdWdoIGljdS1jb25maWcgbWFrZXMgdGhpcyB1c2FnZQorIyAgICAgZWFzaWVyCisjCisjICAgKiBuZWVkIHRvIHRlc3QgdGhlICRQQVRIIGFuZCAkSUNVX0NPTkZJRyB1c2FnZSBtb2RlbHMKKworU0NSSVBUVkVSPSckUmV2aXNpb24kJworCisKK0lDVV9PVkVSUklERT0iIgorCit1c2FnZSgpCit7CisgICAgZWNobyAiU2NyaXB0IFZlcnNpb24gJHtTQ1JJUFRWRVJ9IgorICAgIGVjaG8gIlVzYWdlOiAkMCBbIC1pIC9wYXRoL3RvL2ljdSB8IC1pIC9wYXRoL3RvL2ljdS1jb25maWcgXSAgZmlsZS5je3BwfSBbIHByb2dyYW0gYXJncyAuLi5dIgorfQorCitpZiBbICQjIC1sdCAxIF07Cit0aGVuCisgICAgICAgIHVzYWdlCisgICAgICAgIGV4aXQgMQorZmkKKworaWYgWyAiJDEiID09ICItPyIgLW8gJDEgPT0gIi1oIiBdOwordGhlbgorICAgICAgICB1c2FnZQorICAgICAgICBleGl0IDAKK2ZpCisKKworaWYgWyAkMSA9PSAiLWkiIF07Cit0aGVuCisgICAgICAgIHNoaWZ0CisgICAgICAgIElDVV9PVkVSUklERT0kMQorICAgICAgICBzaGlmdAorZmkKKworaWYgWyAkMSA9PSAiLU8iIF07Cit0aGVuCisgICAgc2hpZnQKKyAgICBYVFJBX09QVFM9JDEKKyAgICBzaGlmdAorZmkKKworaWYgWyAhIC14ICIke0lDVV9DT05GSUd9IiBdOwordGhlbgorICAgIElDVV9DT05GSUc9YHdoaWNoIGljdS1jb25maWcgMj4vZGV2L251bGwgfHwgZWNob2AKK2ZpCisKKworIyBub3csIHNlYXJjaAoraWYgWyAteCB+Ly5pY3VydW5yYyBdOwordGhlbgorICAgICAgICAuIH4vLmljdXJ1bnJjCitmaQorCitJTl9TT1VSQ0U9CitJQ1VfQ09ORklHX09QVFM9CisKK2lmIFsgIngke0lDVV9PVkVSUklERX0iICE9ICJ4IiBdOwordGhlbgorICAgICAgICBpZiBbIC1mICIke0lDVV9PVkVSUklERX0iIC1hIC14ICIke0lDVV9PVkVSUklERX0iIF07CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBJQ1VfQ09ORklHPSIke0lDVV9PVkVSUklERX0iCisgICAgICAgIGVsaWYgWyAteCAiJHtJQ1VfT1ZFUlJJREV9L2ljdS1jb25maWciIF07CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBJQ1VfQ09ORklHPSIke0lDVV9PVkVSUklERX0vaWN1LWNvbmZpZyIKKyAgICAgICAgZWxpZiBbIC14ICIke0lDVV9PVkVSUklERX0vYmluL2ljdS1jb25maWciIF07CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBJQ1VfQ09ORklHPSIke0lDVV9PVkVSUklERX0vYmluL2ljdS1jb25maWciCisgICAgICAgIGVsaWYgWyAteCAiJHtJQ1VfT1ZFUlJJREV9L3NvdXJjZS9jb25maWcvaWN1LWNvbmZpZyIgXTsKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIElDVV9DT05GSUc9IiR7SUNVX09WRVJSSURFfS9zb3VyY2UvY29uZmlnL2ljdS1jb25maWciCisgICAgICAgICAgICAgICAgSU5fU09VUkNFPSIke0lDVV9PVkVSUklERX0vc291cmNlIgorICAgICAgICBlbGlmIFsgLXggIiR7SUNVX09WRVJSSURFfS9jb25maWcvaWN1LWNvbmZpZyIgXTsKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIElDVV9DT05GSUc9IiR7SUNVX09WRVJSSURFfS9jb25maWcvaWN1LWNvbmZpZyIKKyAgICAgICAgICAgICAgICBJTl9TT1VSQ0U9IiR7SUNVX09WRVJSSURFfSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVjaG8gIiQwOiBEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCAkSUNVX09WRVJSSURFIC0gbm90IGFuIGV4ZWN1dGFibGUgb3IgYSBkaXJlY3RvcnkgY29udGFpbmluZyBJQ1Ugc291cmNlIG9yIGluc3RhbGwiID4mMgorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorZmkKKworaWYgWyAhIC14ICIke0lDVV9DT05GSUd9IiBdOwordGhlbgorICAgICAgICBlY2hvICIkMDogRXJyb3I6IFwiJHtJQ1VfQ09ORklHfVwiIGlzIG5vdCBhbiBpY3UtY29uZmlnIHNjcmlwdC4gQmFpbGluZy4iID4mMgorICAgICAgICBleGl0IDEKK2ZpCisKK2lmIFsgLWQgIiR7SU5fU09VUkNFfSIgXTsKK3RoZW4KKyAgICBlY2hvICJJQ1Ugd29ya3NwYWNlIGRpcjoiICIke0lOX1NPVVJDRX0iCisgICAgIyByZXZpc2l0CisgICAgaWYgWyAtZiAiJHtJTl9TT1VSQ0V9L2NvbW1vbi91bmljb2RlL3V0eXBlcy5oIiBdOworICAgIHRoZW4KKyAgICAgICAgdG9wX3NyY2Rpcj0iJHtJTl9TT1VSQ0V9IgorICAgIGVsc2UKKyAgICAgICAgdG9wX3NyY2Rpcj1gc2VkIC1uIC1lICdzJV50b3Bfc3JjZGlyID0gXCguKlwpJVwxJXAnIDwgIiR7SU5fU09VUkNFfS9NYWtlZmlsZSJgCisgICAgICAgIGlmIFsgISAtZCAiJHt0b3Bfc3JjZGlyfSIgXTsKKyAgICAgICAgdGhlbgorICAgICAgICAgICAgZWNobyAiU29ycnk6IGNhbm5vdCBmaW5kIHRvcF9zcmNkaXIgZnJvbSAke0lOX1NPVVJDRX0vTWFrZWZpbGUiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBmaQorICAgIGlmIFsgISAtZiAiJHt0b3Bfc3JjZGlyfS9jb21tb24vdW5pY29kZS91dHlwZXMuaCIgXTsKKyAgICB0aGVuCisgICAgICAgIGVjaG8gU29ycnk6IGNhbm5vdCBmaW5kICIke3RvcF9zcmNkaXJ9L2NvbW1vbi91bmljb2RlL3V0eXBlcy5oIgorICAgICAgICBleGl0IDEKKyAgICBmaQorICAgIGVjaG8gIklDVSB0b3AgbGV2ZWwgc291cmNlIGRpcjoiICIke3RvcF9zcmNkaXJ9IgorCisgICAgSUNVX0NPTkZJR19PUFRTPS0tbm92ZXJpZnkKKyAgICBMSU5LT1BUUz0iLS1sZGZsYWdzLWxpYnNvbmx5IC0tbGRmbGFncy1zeXN0ZW0gLS1sZGZsYWdzLWljdWlvIgorICAgIE9VUkxJQlBBVEg9JHtJTl9TT1VSQ0V9L2xpYjoke0lOX1NPVVJDRX0vc3R1YmRhdGE6JHtJTl9TT1VSQ0V9L3Rvb2xzL2N0ZXN0ZncKKyAgICBTUkNfT1BUUz0iLUkke3RvcF9zcmNkaXJ9L2NvbW1vbiAtSSR7dG9wX3NyY2Rpcn0vaTE4biAtSSR7dG9wX3NyY2Rpcn0vdG9vbHMvY3Rlc3RmdyAtSSR7dG9wX3NyY2Rpcn0vdG9vbHMvdG9vbHV0aWwgLUkke0lOX1NPVVJDRX0vY29tbW9uIC1MJHtJTl9TT1VSQ0V9L2xpYiAtTCR7SU5fU09VUkNFfS9zdHViZGF0YSAtTCR7SU5fU09VUkNFfS90b29scy9jdGVzdGZ3IgorICAgIElOVk9LRT1gJHtJQ1VfQ09ORklHfSAke0lDVV9DT05GSUdfT1BUU30gLS1pbnZva2VgOiIke09VUkxJQlBBVEh9IgorZWxzZQorICAgICMgbm8gY3BwZmxhZ3MgZm9yIGluLXNvdXJjZQorICAgIENQUE9QVFM9Ii0tY3BwZmxhZ3MiCisgICAgTElOS09QVFM9Ii0tbGRmbGFncyAtLWxkZmxhZ3MtaWN1aW8iCisgICAgSU5WT0tFPWAke0lDVV9DT05GSUd9ICR7SUNVX0NPTkZJR19PUFRTfSAtLWludm9rZWAKK2ZpCisKK2VjaG8gJ0lDVSAnIHZlcnNpb246IGAke0lDVV9DT05GSUd9ICR7SUNVX0NPTkZJR19PUFRTfSAtLXZlcnNpb25gIHByZWZpeDogYCR7SUNVX0NPTkZJR30gJHtJQ1VfQ09ORklHX09QVFN9IC0tcHJlZml4YAorCitGSUxFPSQxCitzaGlmdAorCitpZiBbICEgLWYgIiR7RklMRX0iIF07Cit0aGVuCisgICAgZWNobyAiJDA6IENhbid0IG9wZW4gJHtGSUxFfSIgPiYyCisgICAgdXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKKworCitjYXNlICIke0ZJTEV9IiBpbgorICAgICAqLmNwcCkKKyAgICAgICAgQ09NUD1gJHtJQ1VfQ09ORklHfSAke0lDVV9DT05GSUdfT1BUU30gLS1jeHggLS1jeHhmbGFncyAke0NQUE9QVFN9ICR7TElOS09QVFN9YAorICAgICAgICBPVVQ9YGJhc2VuYW1lICR7RklMRX0gLmNwcGAKKyAgICAgOzsKKworICAgICAqLmMpCisgICAgICAgIENPTVA9YCR7SUNVX0NPTkZJR30gICR7SUNVX0NPTkZJR19PUFRTfSAtLWNjIC0tY2ZsYWdzICR7Q1BQT1BUU30gJHtMSU5LT1BUU31gCisgICAgICAgIE9VVD1gYmFzZW5hbWUgJHtGSUxFfSAuY2AKKyAgICAgOzsKKworICAgICAqKQorICAgICAgICBlY2hvICIkMDogZXJyb3IsIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoICR7RklMRX0iID4mMgorICAgICAgICBleGl0IDEKKyAgICAgOzsKK2VzYWMKKworZWNobyAiIyAke0NPTVB9IiAtbyAiJHtPVVR9IiAiJHtGSUxFfSIgIiR7WFRSQV9PUFRTfSIKKyggJHtDT01QfSAke1NSQ19PUFRTfSAtbyAiJHtPVVR9IiAiJHtGSUxFfSIgJHtYVFJBX09QVFN9IHx8IChybSAtZiAiJHtPVVR9IiA7IGV4aXQgMSkgKSAgJiYgKCBlY2hvICIjICR7SU5WT0tFfSAuLyR7T1VUfSIgOyAiJHtTSEVMTH0iIC1jICIke0lOVk9LRX0gLi8ke09VVH0iICIkQCIpCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODJkNjc1NgotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMKKyNmcm9tIGljdXRyYWN4dG4ud2ViX3VpIGltcG9ydCAqCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9kY3V0LnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvZGN1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYjc0ODZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvZGN1dC5weQpAQCAtMCwwICsxLDE1MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitpbXBvcnQgcmUKKworZnJvbSB0cmFjLmNvcmUgaW1wb3J0ICoKK2Zyb20gdHJhYy51dGlsIGltcG9ydCBNYXJrdXAKK2Zyb20gdHJhYy53ZWIgaW1wb3J0IElSZXF1ZXN0SGFuZGxlcgorZnJvbSB0cmFjLndlYi5jaHJvbWUgaW1wb3J0IGFkZF9zdHlsZXNoZWV0LCBJTmF2aWdhdGlvbkNvbnRyaWJ1dG9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlbXBsYXRlUHJvdmlkZXIKK2Zyb20gdHJhYy53ZWIuaHJlZiBpbXBvcnQgSHJlZgorI2Zyb20gdHJhYy52ZXJzaW9uY29udHJvbC53ZWJfdWkuY2hhbmdlc2V0IGltcG9ydCBJQ2hhbmdlc2V0UmFuZ2VMaW5rCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyCisKKworY2xhc3MgRGN1dE1vZHVsZShDb21wb25lbnQpOgorCisgICAgaW1wbGVtZW50cyhJUmVxdWVzdEhhbmRsZXIpCisjICAgIGltcGxlbWVudHMoSVJlcXVlc3RIYW5kbGVyLElDaGFuZ2VzZXRSYW5nZUxpbmspCisKKyAgICBkZWYgcmV2aXNpb25fcmFuZ2VfbGluayhzZWxmLCByZXEsIGJhc2UsIHN0YXJ0LCBlbmQpOgorICAgICAgICByZXR1cm4gKCdEQ1VUIEhlbHBlcicsIHJlcS5ocmVmKCdkY3V0JyxvbGRfcGF0aD1iYXNlLG5ld19wYXRoPWJhc2Usb2xkPXN0YXJ0LG5ldz1lbmQpKQorCisgICAgX3JlcXVlc3RfcmUgPSByZS5jb21waWxlKHIiL2RjdXQoPzovKFteL10rKSk/KC8uKik/JCIpCisKKyAgICBkZWYgbWF0Y2hfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHNlbGYuX3JlcXVlc3RfcmUsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxKToKKworICAgICAgICBpZHggPSAwCisgICAgICAgICMgc3JsCisjICAgICAgICBzaG93X2ZpbGVzID0gc2VsZi50aW1lbGluZV9zaG93X2ZpbGVzCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHRpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgIHJldmxpc3QgPSB7fSAjIGRpY3Qgb2YgcmV2aXNpb24tPgorICAgICAgICAjIHdlbGwuIGNoZWNrIGl0IGFnYWluLC4KKyAgICAgICAgICAgIAorICAgICAgICBzcmxkZWJ1Zz1GYWxzZQorICAgICAgICAKKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeShyZXEuYXV0aG5hbWUpCisgICAgICAgIAorICAgICAgICBuZXdfcGF0aCA9IHJlcS5hcmdzLmdldCgnbmV3X3BhdGgnKQorICAgICAgICBuZXdfcmV2ID0gcmVxLmFyZ3MuZ2V0KCduZXcnKQorICAgICAgICBvbGRfcGF0aCA9IHJlcS5hcmdzLmdldCgnb2xkX3BhdGgnKQorICAgICAgICBvbGRfcmV2ID0gcmVxLmFyZ3MuZ2V0KCdvbGQnKQorCisgICAgICAgIG5ld19wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgobmV3X3BhdGgpCisgICAgICAgIG5ld19yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG5ld19yZXYpCisgICAgICAgIG9sZF9wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgob2xkX3BhdGgpCisgICAgICAgIG9sZF9yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG9sZF9yZXYpCisKKyAgICAgICAgb2xkX3JldiA9IGludChvbGRfcmV2KQorICAgICAgICBuZXdfcmV2ID0gaW50KG5ld19yZXYpCisgICAgICAgIAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQuZGlmZl9ocmVmJ10gPSByZXEuaHJlZignY2hhbmdlc2V0JyxvbGRfcGF0aD1vbGRfcGF0aCxuZXc9bmV3X3JldixuZXdfcGF0aD1uZXdfcGF0aCxvbGQ9b2xkX3JldikKKworICAgICAgICByZXEuaGRmWydpc19kY3V0J109MQorICAgICAgICAKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9yZXYnXSA9IG9sZF9yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm5ld19yZXYnXSA9IG5ld19yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9wYXRoJ10gPSBvbGRfcGF0aAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQubmV3X3BhdGgnXSA9IG5ld19wYXRoCisKKyAgICAgICAgaWYgVHJ1ZToKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RhcmdldF9wYXRoJ10gPSAnLic7CisgICAgICAgICAgICAjIG9rYXkuIG1hbnVhbGx5IHRyb21wIHRocm91Z2ggJ2VtCisgICAgICAgICAgICBucmV2ID0gb2xkX3JldisxCisgICAgICAgICAgICB3aGlsZSBucmV2IDw9IG5ld19yZXY6CisgICAgICAgICAgICAgICAgY2hnc2V0ID0gcmVwb3MuZ2V0X2NoYW5nZXNldChucmV2KQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBjaGdzZXQubWVzc2FnZSBvciAnLS0nCisgICAgICAgICAgICAgICAgIyBjYW4gd2UgbG9hZCBhIHRpY2tldCBmcm9tIGl0PworICAgICAgICAgICAgICAgIHNwbGl0cz1tZXNzYWdlLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICBpZiBtZXNzYWdlLnN0YXJ0c3dpdGgoJ3RpY2tldDonKSBhbmQgbGVuKHNwbGl0cyk+MjoKKyAgICAgICAgICAgICAgICAgICAgdGlja25hbWU9c3BsaXRzWzFdCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tudW09aW50KHRpY2tuYW1lKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgICAgICAgICBucmV2ID0gbnJldisxCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIHllcywgd2UgaGF2ZSBhIHRpY2tldCAjCisgICAgICAgICAgICAgICAgICAgIGZpbGVzPVtdCisgICAgICAgICAgICAgICAgICAgIGZvciBjaGcgaW4gY2hnc2V0LmdldF9jaGFuZ2VzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2hnWzBdLnN0YXJ0c3dpdGgob2xkX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQoY2hnKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZmlsZXMpPT0wOgorICAgICAgICAgICAgICAgICAgICAgICAgbnJldiA9IG5yZXYrMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyBubyByZWxldmFudCBmaWxlcworICAgICAgICAgICAgICAgICAgICB0aXRlbT0odGlja251bSxmaWxlcyxjaGdzZXQpCisgICAgICAgICAgICAgICAgICAgIGlmIHRpY2tudW0gaW4gdGlja2V0bGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldGxpc3RbdGlja251bV0uYXBwZW5kKCB0aXRlbSApCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRsaXN0W3RpY2tudW1dPVsgdGl0ZW0gXQorICAgICAgICAgICAgICAgICAgICByZXZsaXN0W25yZXZdPXRpdGVtCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIm1hbGZvcm1lZCB0aWNrZXQ/ICVzIGF0ICVkIiAlIChtZXNzYWdlLG5yZXYpICMgZG9uJ3Qga25vdyB0aGUgc3ludGF4IGZvciBkaWUuLgorICAgICAgICAgICAgICAgIG5yZXYgPSBucmV2KzEKKyAgICAgICAgICAgIGlmIGxlbih0aWNrZXRsaXN0KToKKyAgICAgICAgICAgICAgICB0aWNrZXRzPXRpY2tldGxpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgdGlja2V0cy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgdGlja2V0IGluIHRpY2tldHM6CisgICAgICAgICAgICAgICAgICAgIGF0aWNrZXQ9dGlja2V0bGlzdFt0aWNrZXRdICAjICh0aWNrZXQsZmlsZXMsY2hnKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSAndGlja2V0OiVkIC0gJWQgcmV2czogJyAlICh0aWNrZXQsbGVuKGF0aWNrZXQpKQorICAgICAgICAgICAgICAgICAgICBmb3IgcmV2IGluIGF0aWNrZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXZuID0gcmV2WzJdLnJldgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWNvdW50ID0gbGVuKHJldlsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArICdyJWQgLSAlZCBmaWxlcyAoJyAlIChyZXZuLGZpbGVjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlIGluIHJldlsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyBmaWxlWzBdICsgJyAnCisgICAgICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnKSAnCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gd2lraV90b19vbmVsaW5lcihjbXQsIHNlbGYuZW52LCBkYiwgIHNob3J0ZW49RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubnVtYmVyJyAlIHRpY2tldF0gPSB0aWNrZXQKKyAgICAgICAgICAgIGlmIGxlbihyZXZsaXN0KToKKyAgICAgICAgICAgICAgICByZXZzPXJldmxpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgcmV2cy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgcmV2IGluIHJldnM6CisgICAgICAgICAgICAgICAgICAgIGFyZXY9cmV2bGlzdFtyZXZdICAjICh0aWNrZXQsZmlsZXMsY2hnKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSAnciVkIHRpY2tldDolZCAnICUgKGFyZXZbMl0ucmV2LGFyZXZbMF0pCisgICAgICAgICAgICAgICAgICAgIGZpbGVjb3VudCA9IGxlbihhcmV2WzFdKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnIC0gJWQgZmlsZXMgKCcgJSBmaWxlY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2hvcnRmaWxlcz0nJworICAgICAgICAgICAgICAgICAgICBqID0gMAorICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZSBpbiBhcmV2WzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5wYXRoJyAlIChyZXYsaildID0gZmlsZVswXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5raW5kJyAlIChyZXYsaildID0gZmlsZVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5jaGFuZ2UnICUgKHJldixqKV0gPSBmaWxlWzJdCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydHBhdGg9ZmlsZVswXVtsZW4ob2xkX3BhdGgpKzE6XQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5zaG9ydHBhdGgnICUgKHJldixqKV0gPSBzaG9ydHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArIGZpbGVbMF0gKyAnICcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ZmlsZXMgPSBzaG9ydGZpbGVzICsgJyAnICsgc2hvcnRwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICBqPWorMQorICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnKSAnCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQuY29tbWVudCcgJSByZXZdID0gd2lraV90b19vbmVsaW5lcihjbXQsIHNlbGYuZW52LCBkYiwgIHNob3J0ZW49RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQubnVtYmVyJyAlIHJldl0gPSByZXYKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5zaG9ydGZpbGVzJyAlIHJldl0gPSBzaG9ydGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQuYmFja251bWJlcicgJSByZXZdID0gKHJldi0xKQorICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLnRpY2tldCcgJSByZXZdID0gYXJldlswXQorCisKKyMgICAgICAgIGlmIGlzaW5zdGFuY2UodGVtcGxhdGUsIGJhc2VzdHJpbmcpOgorIyAgICAgICAgICAgIHJlcS5oZGZbJ2FkbWluLnBhZ2VfdGVtcGxhdGUnXSA9IHRlbXBsYXRlCisjICAgICAgICBlbHNlOgorIyAgICAgICAgICAgIHJlcS5oZGZbJ2FkbWluLnBhZ2VfY29udGVudCddID0gTWFya3VwKHRlbXBsYXRlLnJlbmRlcigpKQorCisgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiCisgICAgICAgIGFkZF9zdHlsZXNoZWV0KHJlcSwgJ2Nzcy9pY3V4dG4uY3NzJykKKyAgICAgICAgcmV0dXJuICdkY3V0LmNzJywgY29udGVudF90eXBlCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL2h0ZG9jcy9jc3MvaWN1eHRuLmNzcyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL2h0ZG9jcy9jc3MvaWN1eHRuLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFlNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvaHRkb2NzL2Nzcy9pY3V4dG4uY3NzCkBAIC0wLDAgKzEsNTMgQEAKKy8qIEBvdmVycmlkZSBodHRwOi8vYnVncy5pY3UtcHJvamVjdC5vcmcvdHJhYy9jaHJvbWUvaWN1Y29kZXRvb2xzL2Nzcy9pY3V4dG4uY3NzICovCisKKy8qIENvcHlyaWdodCAoQykgMjAxMC0yMDEyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gKi8KKworLyogQG92ZXJyaWRlIGh0dHA6Ly91bmljb2RlLm9yZy9jbGRyL3RyYWMvY2hyb21lL2ljdWNvZGV0b29scy9jc3MvaWN1eHRuLmNzcyAqLworCisKK3RhYmxlLmljdXJldmlldyB7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKwlib3JkZXI6ICAxcHggc29saWQgZ3JheTsKK30KKwordGFibGUuaWN1cmV2aWV3IHRoLCB0YWJsZS5pY3VyZXZpZXcgdGQgeworCXRleHQtYWxpZ246IGxlZnQ7CisJYm9yZGVyOiAgMXB4IHNvbGlkIGdyYXk7CisJcGFkZGluZzogIDJweDsKK30KKwordGFibGUuaWN1cmV2aWV3IHRoZWFkIHRoIHsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKwordGFibGUuaWN1cmV2aWV3IHRkLmNoYW5nZXMgeworCXRleHQtYWxpZ246IHJpZ2h0OworfQorCit0YWJsZS5pY3VyZXZpZXcgdGQub3ZlcmFsbCAgeworCWJhY2tncm91bmQtY29sb3I6IHNpbHZlcjsKKwlmb250LXN0eWxlOiBpdGFsaWM7CisJdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy5icmFuY2gtdW5rbm93biB7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwlmb250LXN0eWxlOiAgaXRhbGljOworfQorLmJyYW5jaC10YWdzIHsKKwlmb250LXdlaWdodDogYm9sZDsKKwlmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKKwljb2xvcjogIHdoaXRlOworCWJhY2tncm91bmQtY29sb3I6IG5hdnk7CisJcGFkZGluZzogIDFweDsKK30KKy5icmFuY2gtYnJhbmNoZXMgeworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJY29sb3I6ICAjMzUzOworfQorCisuYnJhbmNoLXRydW5rIHsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9odGRvY3MvanMvcmV2aWV3LmpzIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvaHRkb2NzL2pzL3Jldmlldy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzZjNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvaHRkb2NzL2pzL3Jldmlldy5qcwpAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMiBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIHZhciBzZXRCcmFuY2hOYW1lcyA9IGZ1bmN0aW9uKCkgeworICAgICB2YXIgY3N0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoYW5nZXNldHRhYmxlIik7CisgICAgIHZhciB0cnM9Y3N0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ciIpOworICAgICBmb3IoIGk9MSA7IGkgPCB0cnMubGVuZ3RoIDsgaSsrICkgeworICAgICAgICB2YXIgc2VjID0gdHJzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZCcpWzBdOworICAgICAgICB2YXIgYnJrID0gc2VjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhJyk7CisgICAgICAgIGZvcihqPTA7ajxicmsubGVuZ3RoO2orKykgeworICAgICAgICAgICB2YXIgYnJpID0gYnJrW2pdOworICAgICAgICAgICB2YXIgc3RyID0gYnJpLmlubmVySFRNTDsKKyAgICAgICAgICAgaWYoc3RyLmluZGV4T2YoInRydW5rIik+LTEpIHsKKyAgICAgICAgICAgICAgYnJpLmNsYXNzTmFtZSA9ICdicmFuY2gtdHJ1bmsnOworICAgICAgICAgICB9IGVsc2UgaWYoc3RyLmluZGV4T2YoImJyYW5jaGVzIik+LTEpIHsKKyAgICAgICAgICAgICAgYnJpLmNsYXNzTmFtZSA9ICdicmFuY2gtYnJhbmNoZXMnOworICAgICAgICAgICB9IGVsc2UgaWYoc3RyLmluZGV4T2YoInRhZ3MiKT4tMSkgeworCSAgICAgIGJyaS5jbGFzc05hbWUgPSAnYnJhbmNoLXRhZ3MnOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgfQorICB9CisKKy8vIGh0dHA6Ly9ja29uLndvcmRwcmVzcy5jb20vMjAwOC8wNy8yNS9zdG9wLXVzaW5nLXdpbmRvd29ubG9hZC1pbi1qYXZhc2NyaXB0LworaWYgKHdpbmRvdy5hdHRhY2hFdmVudCkge3dpbmRvdy5hdHRhY2hFdmVudCgnb25sb2FkJywgc2V0QnJhbmNoTmFtZXMpO30KK2Vsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBzZXRCcmFuY2hOYW1lcywgZmFsc2UpO30KK2Vsc2Uge2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBzZXRCcmFuY2hOYW1lcywgZmFsc2UpO30KKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvcmV2aWV3LnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvcmV2aWV3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllMmI1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9yZXZpZXcucHkKQEAgLTAsMCArMSwzMzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisjIFJldmlldyBtb2R1bGUuCisjIFRPRE86IHJlZmFjdG9yIHRpY2tldCBtYW5pcHVsYXRpb24gaXRlbXMgaW50byB0aWNrZXRtZ3IuCisKK2ltcG9ydCByZQorCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgQ29tcG9uZW50LCBpbXBsZW1lbnRzCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgQ29tcG9uZW50TWFuYWdlcgorZnJvbSB0cmFjLmNvcmUgaW1wb3J0IFRyYWNFcnJvcgorZnJvbSB0cmFjLnV0aWwgaW1wb3J0IE1hcmt1cAorZnJvbSB0cmFjLndlYiBpbXBvcnQgSVJlcXVlc3RIYW5kbGVyCitmcm9tIHRyYWMud2ViLmNocm9tZSBpbXBvcnQgYWRkX3N0eWxlc2hlZXQsIGFkZF9zY3JpcHQsIElUZW1wbGF0ZVByb3ZpZGVyLCBhZGRfY3R4dG5hdgorZnJvbSB0cmFjLnZlcnNpb25jb250cm9sIGltcG9ydCBDaGFuZ2VzZXQKK2Zyb20gdHJhYy53ZWIuYXBpIGltcG9ydCBJUmVxdWVzdEZpbHRlcgorZnJvbSB0cmFjLndpa2kgaW1wb3J0IHdpa2lfdG9faHRtbCwgd2lraV90b19vbmVsaW5lciwgSVdpa2lTeW50YXhQcm92aWRlcgorICAgICAgICAgICAgCitmcm9tIGdlbnNoaS5idWlsZGVyIGltcG9ydCB0YWcKKyNmcm9tIHRyYWMuZW52IGltcG9ydCBJRW52aXJvbm1lbnRTZXR1cFBhcnRpY2lwYW50Citmcm9tIHRyYWMucGVybSBpbXBvcnQgSVBlcm1pc3Npb25SZXF1ZXN0b3IKK2Zyb20gdHJhYy5jb25maWcgaW1wb3J0IExpc3RPcHRpb24KK2Zyb20gaWN1Y29kZXRvb2xzLnRpY2tldG1nciBpbXBvcnQgVGlja2V0TWFuYWdlcgorZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCByZXNvdXJjZV9maWxlbmFtZSAjQFVucmVzb2x2ZWRJbXBvcnQKKworY2xhc3MgUmV2aWV3TW9kdWxlKENvbXBvbmVudCk6CisKKyAgICBpbXBsZW1lbnRzKElUZW1wbGF0ZVByb3ZpZGVyLCBJUmVxdWVzdEZpbHRlciwgSVJlcXVlc3RIYW5kbGVyLCBJUGVybWlzc2lvblJlcXVlc3RvcikKKworICAgICMgcGF0aCB0byBtYXRjaCBmb3IgcmV2aWV3CisgICAgcGF0aF9tYXRjaCA9IHJlLmNvbXBpbGUocicvaWN1cmV2aWV3LyhbMC05XSspJykKKworICAgIHZvdGVhYmxlX3BhdGhzID0gTGlzdE9wdGlvbignaWN1Y29kZXRvb2xzJywgJ3BhdGhzJywgJy90aWNrZXQqJywKKyAgICAgICAgZG9jPSdMaXN0IG9mIFVSTCBwYXRocyB0byBzaG93IHJldmlld3Mgb24uIEdsb2JzIGFyZSBzdXBwb3J0ZWQuJykKKworICAgICMgIHNlYXJjaCBmb3IgZWFybGllc3QgbWF0Y2gsIGFuZCBob3cgbWFueSBzZWdtZW50cyB0byBpbmNsdWRlIGZvbGxvd2luZworICAgICMgICAgdHJ1bmsKKyAgICAjICAgIGJyYW5jaGVzL21haW50L21haW50LTQtOAorICAgICMgICAgdGFncy9yZWxlYXNlLTItMAorICAgIGJyYW5jaExpc3QgPSBbWyd0cnVuaycsMF0sWydicmFuY2hlcycsMl0sWyd0YWdzJywxXV0KKworICAgICMgSVBlcm1pc3Npb25SZXF1ZXN0b3IgbWV0aG9kcworICAgIGRlZiBnZXRfcGVybWlzc2lvbl9hY3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWydJQ1VSRVZJRVdfVklFVyddCisKKyAgICAjIElUZW1wbGF0ZVByb3ZpZGVyIG1ldGhvZHMKKyAgICBkZWYgZ2V0X3RlbXBsYXRlc19kaXJzKHNlbGYpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAJcmV0dXJuIFtyZXNvdXJjZV9maWxlbmFtZShfX25hbWVfXywgJ3RlbXBsYXRlcycpXQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZTogCisgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygnQ291bGQgbm90IGdldCB0ZW1wbGF0ZSBkaXI6ICVzOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUoZSksIGUpKQorCQlyZXR1cm4gIiIKKworCisgICAgZGVmIGdldF9odGRvY3NfZGlycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsoJ2ljdWNvZGV0b29scycsIHJlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCAnaHRkb2NzJykpXQorCisgICAgIyBJUmVxdWVzdEZpbHRlciBtZXRob2RzCisgICAgZGVmIHByZV9wcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxLCBoYW5kbGVyKToKKyAgICAgICAgaWYgJ0lDVVJFVklFV19WSUVXJyBub3QgaW4gcmVxLnBlcm06CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlcgorCisgICAgICAgIGlmIHNlbGYubWF0Y2hfdGlja2V0cGFnZShyZXEpOgorICAgICAgICAgICAgc2VsZi5yZW5kZXJfcmV2aWV3bGluayhyZXEpCisKKyAgICAgICAgcmV0dXJuIGhhbmRsZXIKKworICAgIGRlZiBwb3N0X3Byb2Nlc3NfcmVxdWVzdChzZWxmLCByZXEsIHRlbXBsYXRlLCBkYXRhLCBjb250ZW50X3R5cGUpOgorICAgICAgICByZXR1cm4gKHRlbXBsYXRlLCBkYXRhLCBjb250ZW50X3R5cGUpCisKKyAgICBkZWYgcmVuZGVyX3Jldmlld2xpbmsoc2VsZiwgcmVxKToKKyAgICAgICAgI2FkZF9zdHlsZXNoZWV0KHJlcSwgJ2ljdWNvZGV0b29scy9jc3MvaWN1eHRuLmNzcycpCisKKyAgICAgICAgZWxzID0gW10KKworICAgICAgICB0aWNrZXRfbWdyID0gVGlja2V0TWFuYWdlcihzZWxmLmNvbXBtZ3IpCisKKyAgICAgICAgZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeSgpCisgICAgICAgIGlmIG5vdCByZXBvczoKKyAgICAgICAgICAgIHJhaXNlIFRyYWNFcnJvcigiQ291bGQgbm90IGdldCByZXBvc2l0b3J5IGZvciAlcyIgJSAocmVxLmF1dGhuYW1lKSkKKworICAgICAgICByZXZzID0gdGlja2V0X21nci50a3QycmV2cyhzZWxmLmxvZywgZGIsIHJlcG9zLCByZXEsIHJlcS5hcmdzWyd0aWNrZXQnXSkKKworICAgICAgICBpZiBub3QgcmV2czoKKyAgICAgICAgICAgIHN0ciA9ICdObyBjb21taXRzLicKKyAgICAgICAgICAgIGxpID0gdGFnLmxpKHN0cikKKyAgICAgICAgICAgIGVscy5hcHBlbmQobGkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHIgPSAnICVkIGNvbW1pdHMuJyAlIGxlbihyZXZzKQorICAgICAgICAgICAgaHJlZiA9IHJlcS5ocmVmLnJldmlldyhyZXEuYXJnc1sndGlja2V0J10pCisgICAgICAgICAgICBhID0gdGFnLmEoJ1JldmlldycsIGhyZWY9aHJlZikKKyAgICAgICAgICAgIGxpID0gdGFnLmxpKGEgKyBzdHIpCisgICAgICAgICAgICBlbHMuYXBwZW5kKGxpKSAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgdWwgPSB0YWcudWwoZWxzLCBjbGFzc189J3JldmlldycpCisgICAgICAgIGNsYXNzTmFtZSA9ICcnCisgICAgICAgIHRpdGxlID0gIlJldmlld3MiCisgICAgICAgIGFkZF9jdHh0bmF2KHJlcSwgdGFnLnNwYW4odGFnLm9iamVjdCh1bCksIGlkPSdpY3VyZXZpZXcnLCB0aXRsZT10aXRsZSwgY2xhc3NfPWNsYXNzTmFtZSkpCisKKworICAgIGRlZiBtYXRjaF9yZXF1ZXN0KHNlbGYsIHJlcSk6CisgICAgICAgIG1hdGNoID0gcmUubWF0Y2goJy9yZXZpZXcoPzovKFteL10rKSk/KD86LyhbXi9dKykpPyg/Oi8oLiopJCk/JywgcmVxLnBhdGhfaW5mbykKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXEuYXJnc1sndGlja2V0J10gPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBtYXRjaF90aWNrZXRwYWdlKHNlbGYsIHJlcSk6CisgICAgICAgIG1hdGNoID0gcmUubWF0Y2goJy90aWNrZXQoPzovKFteL10rKSk/KD86LyhbXi9dKykpPyg/Oi8oLiopJCk/JywgcmVxLnBhdGhfaW5mbykKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXEuYXJnc1sndGlja2V0J10gPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwYXRoVG9CcmFuY2hOYW1lKHNlbGYsIHBhdGgpOgorICAgICAgICAjcmV0dXJuICcvJy5qb2luKHBhdGguc3BsaXQoJy8nKVswOjJdKQorICAgICAgICB3aW5kZXggPSBOb25lCisgICAgICAgIHdpbiA9IE5vbmUKKyAgICAgICAgZm9yIGJyYW5jaCBpbiBzZWxmLmJyYW5jaExpc3Q6CisgICAgICAgICAgICBpZihwYXRoID09IGJyYW5jaFswXSk6ICAjIGNhdGNoIGNoYW5nZXMgdG8ganVzdCAndHJ1bmsnCisgICAgICAgICAgICAgICAgaWR4ID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZHggPSBwYXRoLmZpbmQoYnJhbmNoWzBdKycvJykKKyAgICAgICAgICAgIGlmKGlkeCA+IC0xIGFuZCAod2luZGV4ID09IE5vbmUgb3Igd2luZGV4ID4gaWR4KSk6CisgICAgICAgICAgICAgICAgd2luZGV4ID0gaWR4CisgICAgICAgICAgICAgICAgd2luID0gYnJhbmNoCisgICAgICAgIGlmIHdpbmRleCA9PSBOb25lOgorICAgICAgICAgICAgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykKKyAgICAgICAgICAgIHJldHVybiAnLycuam9pbihzZWdtZW50c1swOjJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI3ByaW50ICJmb3VuZCAlcyBmb2xsICVzIEAgJWQiICUgKHdpblswXSx3aW5bMV0sd2luZGV4KQorICAgICAgICAgICAgc2VnbWVudHMgPSBwYXRoW3dpbmRleDpdLnNwbGl0KCcvJykKKyAgICAgICAgICAgIHJldHVybiBwYXRoWzp3aW5kZXhdICsgKCcvJy5qb2luKHNlZ21lbnRzWzA6d2luWzFdKzFdKSkgIyB1c2Ugc3BlY2lmaWVkICMgb2YgZm9sbG93aW5nIHNlZ21lbnRzCisKKyAgICBkZWYgY2hhbmdlVG9SYW5nZShzZWxmLCBjX25ldywgY2hhbmdlKToKKyAgICAgICAgIyBxOiAodSd0cnVuay9Mb2NhbGUuamF2YScsICdmaWxlJywgJ2FkZCcsIE5vbmUsIHUnLTEnKSAgZnJvbSByMworICAgICAgICAjIHE6ICh1J3RydW5rL3V0aWwuYycsICAgICAgJ2ZpbGUnLCAnZWRpdCcsIHUndHJ1bmsvdXRpbC5jJywgdScyJykgIGZyb20gcjQKKyMgICAgICAgIGNfcGF0aCA9IGNoYW5nZVswXQorIyAgICAgICAgY19pdGVtdHlwZSA9IGNoYW5nZVsxXQorICAgICAgICBjX3R5cGUgPSBjaGFuZ2VbMl0KKyAgICAgICAgY19vbGRwYXRoID0gY2hhbmdlWzNdCisgICAgICAgIGNfb2xkID0gaW50KGNoYW5nZVs0XSBvciAtMSkKKyAgICAgICAgaWYoY190eXBlIGluIChDaGFuZ2VzZXQuQ09QWSxDaGFuZ2VzZXQuTU9WRSkpOgorICAgICAgICAgICAgcmV0dXJuICgtMSwgY19uZXcsIGNfdHlwZSwgY19vbGQsIGNfb2xkcGF0aCkgIyBpZ25vcmUgT0xEIHJldiBmb3IgdGhlc2UKKyAgICAgICAgZWxpZihjX3R5cGUgaW4gKENoYW5nZXNldC5ERUxFVEUpKToKKyAgICAgICAgICAgIHJldHVybiAoY19vbGQsIC0xLCBjX3R5cGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKGNfb2xkLCBjX25ldywgY190eXBlKQorICAgICAgICAKKyAgICBkZWYgZGVzY3JpYmVDaGFuZ2Uoc2VsZiwgZmlsZSwgY2hhbmdlLCByZXEsIGRiKToKKyAgICAgICAgd2hhdCA9IGNoYW5nZVsyXSBvciAnY2hhbmdlJworICAgICAgICB3aGVyZSA9ICdyJWQ6JWQnICUgKGNoYW5nZVswXSxjaGFuZ2VbMV0pCisgICAgICAgIGlmKGNoYW5nZVswXSA9PSAtMSk6CisgICAgICAgICAgICBpZihjaGFuZ2VbMV0gPT0gLTEpOgorICAgICAgICAgICAgICAgIHVybCA9IE5vbmUKKyAgICAgICAgICAgICAgICB3aGF0ID0gIm5vb3AiCisgICAgICAgICAgICAgICAgd2hlcmUgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNpZiBjaGFuZ2VbMl0gPT0gJ2FkZCtjb21taXRzJzoKKyAgICAgICAgICAgICAgICB1cmwgPSByZXEuaHJlZi5icm93c2VyKGZpbGUsIHJldj1jaGFuZ2VbMV0pICMgJ2FkZCcKKyAgICAgICAgICAgICAgICB3aGVyZSA9ICdyJWQnICUgY2hhbmdlWzFdCisgICAgICAgICAgICAgICAgd2hhdCA9IGNoYW5nZVsyXQorICAgICAgICBlbGlmKGNoYW5nZVsxXSA9PSAtMSk6CisgICAgICAgICAgICB1cmwgPSBOb25lICMgZGVsZXRlZAorICAgICAgICAgICAgd2hhdCA9ICJkZWxldGVkIgorICAgICAgICAgICAgd2hlcmUgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmwgPSByZXEuaHJlZi5jaGFuZ2VzZXQob2xkX3BhdGg9ZmlsZSwgb2xkPWNoYW5nZVswXSwgbmV3X3BhdGg9ZmlsZSwgbmV3PWNoYW5nZVsxXSkKKyAgICAgICAgaWYgdXJsOgorICAgICAgICAgICAgd2hhdCA9IE1hcmt1cCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAodXJsLHdoYXQpKQorICAgICAgICBpZiB3aGVyZToKKyAgICAgICAgICAgIHJldHVybiAod2hhdCwgdGFnLmEod2hlcmUsIGhyZWY9cmVxLmhyZWYuc2VhcmNoKHE9d2hlcmUpKSkKKyAgICAgICAgICAgICNyZXR1cm4gKHdoYXQsIHdoZXJlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICh3aGF0LCAnJykKKworCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICAjb2ssIHdoYXQgYXJlIHdlIGFib3V0LgorICAgICAgICAjZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgI3RpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgICNyZXZsaXN0ID0ge30gIyBkaWN0IG9mIHJldmlzaW9uLT4KKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeSgpCisKKyAgICAgICAgbmV3X3BhdGggPSByZXEuYXJncy5nZXQoJ25ld19wYXRoJykKKyAgICAgICAgbmV3X3JldiA9IHJlcS5hcmdzLmdldCgnbmV3JykKKyAgICAgICAgb2xkX3BhdGggPSByZXEuYXJncy5nZXQoJ29sZF9wYXRoJykKKyAgICAgICAgb2xkX3JldiA9IHJlcS5hcmdzLmdldCgnb2xkJykKKworICAgICAgICBuZXdfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG5ld19wYXRoKQorICAgICAgICBuZXdfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihuZXdfcmV2KQorICAgICAgICBvbGRfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG9sZF9wYXRoKQorICAgICAgICBvbGRfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihvbGRfcmV2KQorICAgICAgICAKKworIyAgICAgICAgaWYgbm90IHJlcS5wZXJtLmhhc19wZXJtaXNzaW9uKCdUSUNLRVRfTU9ESUZZJyk6CisjICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChyZXEuaHJlZi5icm93c2VyKCkpCisKKyAgICAgICAgb2xkX3JldiA9IGludChvbGRfcmV2KQorICAgICAgICBuZXdfcmV2ID0gaW50KG5ld19yZXYpCisgICAgICAgIAorICAgICAgICB0aWNrZXQgPSByZXEuYXJncy5nZXQoJ3RpY2tldCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRpY2tldCA9IGludCh0aWNrZXQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICB0aWNrZXQgPSAwCisjICAgICAgICByZXEuaGRmWydyZXZpZXcudGlja2V0J10gPSB0aWNrZXQKKyMgICAgICAgIHJlcS5oZGZbJ3Jldmlldy50aWNrZXRodG1sJ10gPSB0YWcuYSh0aWNrZXQsIHJlcS5ocmVmLnRpY2tldCh0aWNrZXQpKQorCisgICAgICAgIGRhdGEgPSB7fQorCisgICAgICAgIGRhdGFbJ292ZXJhbGxfeSddID0gMAorICAgICAgICBkYXRhWyd0aWNrZXRfaWQnXSA9IHJlcS5hcmdzWyd0aWNrZXQnXQorICAgICAgICBkYXRhWyd0aWNrZXRfaHJlZiddID0gcmVxLmhyZWYudGlja2V0KHJlcS5hcmdzWyd0aWNrZXQnXSkKKworICAgICAgICB0aWNrZXRfbWdyID0gVGlja2V0TWFuYWdlcihzZWxmLmNvbXBtZ3IpCisKKyAgICAgICAgZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeSgpCisKKyAgICAgICAgcmV2cyA9IHRpY2tldF9tZ3IudGt0MnJldnMoc2VsZi5sb2csIGRiLCByZXBvcywgcmVxLCByZXEuYXJnc1sndGlja2V0J10pCisgICAgICAgIAorICAgICAgICBpZiAobm90IHJldnMgb3IgbGVuKHJldnMpPT0wKToKKyAgICAgICAgICAgICMgbm90aGluZyB0byByZXZpZXcuIHNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgICAgIHJldHVybiAoJ25vdGhpbmcuaHRtbCcsIGRhdGEsICd0ZXh0L2h0bWwnKQorICAgICAgICBlbGlmKGxlbihyZXZzKT09MSk6CisgICAgICAgICAgICAjIG9ubHkgb25lIGNoYW5nZSAtIGp1c3QgZG8gYSBjaGFuZ2VzZXQgdmlldworICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChyZXEuaHJlZi5jaGFuZ2VzZXQocmV2c1swXSkpCisKKyAgICAgICAgcmV2Y291bnQgPSAwCisgICAgICAgIGJyYW5jaGVzID0ge30KKyAgICAgICAgZmlsZXMgPSB7fQorICAgICAgICAjIG1heSBiZSAwIHJldnMuCisgICAgICAgIHJldmlzaW9ucyA9IFtdCisgICAgICAgIAorICAgICAgICBmb3IgcmV2IGluIHJldnM6CisgICAgICAgICAgICBjaGdzZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KHJldikKKyAgICAgICAgICAgICMgcTogKHUndHJ1bmsvTG9jYWxlLmphdmEnLCAnZmlsZScsICdhZGQnLCBOb25lLCB1Jy0xJykgIGZyb20gcjMKKyAgICAgICAgICAgICMgcTogKHUndHJ1bmsvdXRpbC5jJywgJ2ZpbGUnLCAnZWRpdCcsIHUndHJ1bmsvdXRpbC5jJywgdScyJykgIGZyb20gcjQKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBjaGdzZXQubWVzc2FnZSBvciAnLS0nCisgICAgICAgICAgICByZXZjb3VudCA9IHJldmNvdW50ICsgMQorICAgICAgICAgICAgcmV2aXNpb24gPSB7fQorICAgICAgICAgICAgcmV2aXNpb25bJ3JldiddID0gIHRhZy5hKHJldiwgcmVxLmhyZWYuY2hhbmdlc2V0KHJldikpCisgICAgICAgICAgICByZXZpc2lvblsnbnVtJ10gPSAgcmV2CisgICAgICAgICAgICByZXZpc2lvblsnY29tbWVudCddID0gIG1lc3NhZ2UgI3dpa2lfdG9fb25lbGluZXIoIG1lc3NhZ2UsIHNlbGYuZW52LCBkYiwgc2hvcnRlbj1GYWxzZSApCisgICAgICAgICAgICByYnJhbmNoZXMgPSByZXZpc2lvblsnYnJhbmNoZXMnXSA9IFtdCisgICAgICAgICAgICBmb3IgY2hnIGluIGNoZ3NldC5nZXRfY2hhbmdlcygpOgorICAgICAgICAgICAgICAgIHBhdGggPSBjaGdbMF0KKyAgICAgICAgICAgICAgICBpZiBwYXRoIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gZmlsZXNbcGF0aF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gW10KKyAgICAgICAgICAgICAgICAgICAgZmlsZXNbcGF0aF0gPSBpdGVtOworICAgICAgICAgICAgICAgIGl0ZW0uYXBwZW5kKHNlbGYuY2hhbmdlVG9SYW5nZShyZXYsY2hnKSkKKyAgICAgICAgICAgICAgICBicmFuY2hfbmFtZSA9IHNlbGYucGF0aFRvQnJhbmNoTmFtZShwYXRoKQorICAgICAgICAgICAgICAgIGlmIGJyYW5jaF9uYW1lIG5vdCBpbiByYnJhbmNoZXM6CisgICAgICAgICAgICAgICAgICAgIHJicmFuY2hlcy5hcHBlbmQoYnJhbmNoX25hbWUpCisgICAgICAgICAgICByZXZpc2lvbnMuYXBwZW5kKHJldmlzaW9uKQorICAgICAgICBkYXRhWydyZXZpc2lvbnMnXSA9IHJldmlzaW9ucworICAgICAgICAKKyAgICAgICAgaWYocmV2Y291bnQgPiAwKToKKyAgICAgICAgICAgIGRhdGFbJ3JldmNvdW50J10gPSByZXZjb3VudAorICAgICAgICAKKyAgICAgICAgIyBwcmludCAiZmlsZXM6ICVkIiAlIGxlbihmaWxlcykKKyAgICAgICAgIyBnbyB0aHJvdWhnIGVhY2ggZmlsZSBhbmQgY2FsY3VsYXRlIGl0cyBtaW5pbXVtIHJhbmdlCisgICAgICAgIGZpbGVsaXN0ID0gZmlsZXMua2V5cygpCisgICAgICAgIGZpbGVsaXN0LnNvcnQoKQorIyAgICAgICAgcHJpbnQgJ2JhciB0byAlZCBsZW4gb2YgJXMnICUgKGxlbihmaWxlbGlzdCksc3RyKGZpbGVsaXN0KSkKKyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZWxpc3Q6CisgICAgICAgICAgICBjaGFuZ2VzID0gZmlsZXNbZmlsZV0KKyAgICAgICAgICAgIGkgPSAwCisjICAgICAgICAgICAgcHJpbnQgIiBsb29waW5nIGZyb20gJWQgdG8gJWQgb3ZlciAlZCAiICUgKGksbGVuKGNoYW5nZXMpLTEsbGVuKGNoYW5nZXMpKQorICAgICAgICAgICAgd2hpbGUgbGVuKGNoYW5nZXMpPjEgYW5kIGk8KGxlbihjaGFuZ2VzKS0xKToKKyAgICAgICAgICAgICAgICBpZiBjaGFuZ2VzW2ldWzFdID09IGNoYW5nZXNbaSsxXVswXToKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hhbmdlc1tpXVswXSA9PSAtMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXNbaSsxXSA9IChjaGFuZ2VzW2ldWzBdLGNoYW5nZXNbaSsxXVsxXSwnYWRkK2NvbW1pdHMnKSAjIHJldGFpbiAnZmlyc3QnIHJldgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1tpKzFdID0gKGNoYW5nZXNbaV1bMF0sY2hhbmdlc1tpKzFdWzFdLCdtdWx0aXBsZSBjb21taXRzJykgIyByZXRhaW4gJ2ZpcnN0JyByZXYKKworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlc1s6aV0gKyBjaGFuZ2VzW2krMTpdICMgYW5kIHNoaWZ0IGRvd24KKyMgICAgICAgICAgICAgICAgICAgIHByaW50ICJtZXJnZWQ6ICVzIiAlIHN0cihjaGFuZ2VzKQorICAgICAgICAgICAgICAgICAgICBmaWxlc1tmaWxlXSA9IGNoYW5nZXMKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgCisgICAgICAgICMgbm93LCB3cml0ZSAnZW0gb3V0CisgICAgICAgIHNlcmEgPSAwCisgICAgICAgICNmaWxlc19kYXRhID0gW10KKyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZWxpc3Q6CisgICAgICAgICAgICBzZXJhID0gc2VyYSsxCisgICAgICAgICAgICBmaWxlX2RhdGEgPSB7fQorICAgICAgICAgICAgZmlsZV9kYXRhWyduYW1lJ10gPSBNYXJrdXAoJzxhIGhyZWY9IiVzIj4lczwvYT4nICUgKHJlcS5ocmVmLmJyb3dzZXIoZmlsZSksZmlsZSkpCisgICAgICAgICAgICBicmFuY2hfbmFtZSA9IHNlbGYucGF0aFRvQnJhbmNoTmFtZShmaWxlKQorICAgICAgICAgICAgI3ByaW50ICJicmFuY2ggaXM6ICglcykiICUgKGJyYW5jaF9uYW1lKQorICAgICAgICAgICAgYnJhbmNoZXNfZGF0YSA9IGJyYW5jaGVzLmdldChicmFuY2hfbmFtZSwge30pCisgICAgICAgICAgICBmaWxlc19kYXRhID0gYnJhbmNoZXNfZGF0YS5nZXQoJ2ZpbGVzJyxbXSkKKworICAgICAgICAgICAgY2hhbmdlcyA9IGZpbGVzW2ZpbGVdCisgICAgICAgICAgICBjaGEgPSAwCisgICAgICAgICAgICBjaGFuZ2VzX2RhdGEgPSBbXQorICAgICAgICAgICAgZm9yIGNoYW5nZSBpbiBjaGFuZ2VzOgorICAgICAgICAgICAgICAgIGNoYSA9IGNoYSArIDEKKyMgICAgICAgICAgICAgICAgcHJpbnQgIiVzIG91dHB1dCAlcyAiICUgKGZpbGUsIHN0cihjaGFuZ2UpKQorICAgICAgICAgICAgICAgIGNoYW5nZXNfZGF0YS5hcHBlbmQoc2VsZi5kZXNjcmliZUNoYW5nZShmaWxlLCBjaGFuZ2UsIHJlcSwgZGIpKQorICAgICAgICAgICAgZmlsZV9kYXRhWydjaGFuZ2VzJ10gPSBjaGFuZ2VzX2RhdGEKKyAgICAgICAgICAgIGlmKGxlbihjaGFuZ2VzKT4xKToKKyAgICAgICAgICAgICAgICB3aGF0aHRtbCA9IHNlbGYuZGVzY3JpYmVDaGFuZ2UoZmlsZSwgKGNoYW5nZXNbMF1bMF0sIGNoYW5nZXNbbGVuKGNoYW5nZXMpLTFdWzFdLCAnb3ZlcmFsbCcpLCByZXEsIGRiKQorICAgICAgICAgICAgICAgIGZpbGVfZGF0YVsnb3ZlcmFsbCddID0gd2hhdGh0bWwKKyAgICAgICAgICAgICAgICBmaWxlX2RhdGFbJ292ZXJhbGxfeSddID0gMQorICAgICAgICAgICAgICAgIGRhdGFbJ292ZXJhbGxfeSddID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmaWxlX2RhdGFbJ292ZXJhbGxfeSddID0gMAorICAgICAgICAgICAgZmlsZXNfZGF0YS5hcHBlbmQoZmlsZV9kYXRhKQorICAgICAgICAgICAgIyBzZXRzCisgICAgICAgICAgICBicmFuY2hlc19kYXRhWydmaWxlcyddID0gZmlsZXNfZGF0YQorICAgICAgICAgICAgYnJhbmNoZXNfZGF0YVsnbGVuJ10gPSBsZW4oZmlsZXNfZGF0YSkKKyAgICAgICAgICAgIGJyYW5jaGVzX2RhdGFbJ25hbWUnXSA9IGJyYW5jaF9uYW1lCisgICAgICAgICAgICBicmFuY2hlc1ticmFuY2hfbmFtZV0gPSBicmFuY2hlc19kYXRhCisKKyAgICAgICAgIyAuLiBjb252ZXJ0IGRpY3QgdG8gYXJyYXkuCisgICAgICAgIGJyYW5jaF9saXN0ID0gW10KKyAgICAgICAgZm9yIGJyYW5jaCBpbiBicmFuY2hlczoKKyAgICAgICAgICAgIGJyYW5jaF9saXN0LmFwcGVuZChicmFuY2hlc1ticmFuY2hdKQorICAgICAgICBkYXRhWydicmFuY2hlcyddID0gYnJhbmNoX2xpc3QKKyAgICAgICAgZGF0YVsnbGFzdGJyYW5jaCddID0gYnJhbmNoCisgICAgICAgIGRhdGFbJ2JyYW5jaGNvdW50J10gPSBsZW4oYnJhbmNoZXMpCisgICAgICAgIAorICAgICAgICBjb250ZW50X3R5cGUgPSAidGV4dC9odG1sIgorICAgICAgICBhZGRfc3R5bGVzaGVldChyZXEsICdpY3Vjb2RldG9vbHMvY3NzL2ljdXh0bi5jc3MnKQorICAgICAgICBhZGRfc2NyaXB0KHJlcSwgJ2ljdWNvZGV0b29scy9qcy9yZXZpZXcuanMnKQorICAgICAgICByZXR1cm4gJ3Jldmlldy5odG1sJywgZGF0YSwgY29udGVudF90eXBlCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90ZW1wbGF0ZXMvbm90aGluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTllZTQKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90ZW1wbGF0ZXMvbm90aGluZy5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzwhRE9DVFlQRSBodG1sCisgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgorICAgICAgeG1sbnM6cHk9Imh0dHA6Ly9nZW5zaGkuZWRnZXdhbGwub3JnLyIKKyAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ibGF5b3V0Lmh0bWwiIC8+CisgIDxoZWFkPgorICAgIDx0aXRsZT5Ob3RoaW5nIHRvIFJldmlldyBmb3IgdGlja2V0ICMke3RpY2tldF9pZH08L3RpdGxlPgorICA8L2hlYWQ+CisKKyAgPGJvZHk+CisgICAgPGRpdiBpZD0iY3R4dG5hdiIgY2xhc3M9Im5hdiI+PC9kaXY+CisKKyAgICA8ZGl2IGlkPSJjb250ZW50IiBjbGFzcz0iaWN1Y29kZXJldmlldyI+CisgICAgICA8aDE+Tm90aGluZyB0byByZXZpZXchPC9oMT4KKyAgICAgIDxwPgorICAgICAgCU5vdGhpbmcgdG8gcmV2aWV3IC0gbm8gY2hhbmdlc2V0cyBpbiB0aWNrZXQgPGEgaHJlZj0iJHt0aWNrZXRfaHJlZn0iPiMke3RpY2tldF9pZH08L2E+CisgICAgICA8L3A+CisgICAgPC9kaXY+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9yZXZpZXcuaHRtbCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9yZXZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2MwOWRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sCkBAIC0wLDAgKzEsMTM3IEBACis8IURPQ1RZUEUgaHRtbAorICAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMiBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKKyAgICAgIHhtbG5zOnB5PSJodHRwOi8vZ2Vuc2hpLmVkZ2V3YWxsLm9yZy8iCisgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDx4aTppbmNsdWRlIGhyZWY9ImxheW91dC5odG1sIiAvPgorICA8aGVhZD4KKyAgICA8dGl0bGU+UmV2aWV3IGZvciB0aWNrZXQgIyR7dGlja2V0X2lkfTwvdGl0bGU+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJjdHh0bmF2IiBjbGFzcz0ibmF2Ij48L2Rpdj4KKworICAgIDxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJpY3Vjb2RlcmV2aWV3Ij4KKworCisgPGgxPlRpY2tldCA8YSBocmVmPScke2hyZWYudGlja2V0KHRpY2tldF9pZCl9Jz4jJHt0aWNrZXRfaWR9PC9hPjwvaDE+CisKKzxweTppZiB0ZXN0PSJyZXZjb3VudCI+CisKKyAgPGgyPiR7cmV2Y291bnR9IENoYW5nZXNldHM8L2gyPgorICA8dGFibGUgaWQ9J2NoYW5nZXNldHRhYmxlJyBjbGFzcz0naWN1cmV2aWV3Jz4KKyAgICA8dGhlYWQ+CisgICAgICA8dHI+CisJPHRoPnI8L3RoPgorCTx0aD5zZWN0aW9uKHMpPC90aD4KKwk8dGg+Y29tbWVudDwvdGg+CisgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAgICAgPHB5OmZvciBlYWNoPSJyZXYgaW4gcmV2aXNpb25zIj4KKwk8dHI+CisJICA8dGg+CisJICAgIDxhIGhyZWY9IiR7aHJlZi5jaGFuZ2VzZXQocmV2Lm51bSl9Ij5yJHtyZXYubnVtfTwvYT4KKwkgIDwvdGg+CisJICA8dGQ+CisJICAgIDwhLS0gc2VjdGlvbnMgLS0+CisJICAgIDxweTpmb3IgZWFjaD0iYnJhbmNoIGluIHJldi5icmFuY2hlcyI+CisJICAgICAgPGIgY2xhc3M9J2JyYW5jaGxpc3QnPgorCQk8YSBjbGFzcz0nYnJhbmNoLXVua25vd24nIGhyZWY9IiMke2JyYW5jaH0iPiR7YnJhbmNofTwvYT4gCisJICAgICAgPC9iPgorCSAgICA8L3B5OmZvcj4KKwkgIDwvdGQ+CisJICA8dGQ+CisJICAgICR7cmV2LmNvbW1lbnR9CisJICA8L3RkPgorCTwvdHI+CisgICAgICA8L3B5OmZvcj4KKyAgICA8L3Rib2R5PgorICA8L3RhYmxlPgorICAKKzxweTppZiB0ZXN0PSJicmFuY2hjb3VudCA+IDEiPgorPGgyPkZpbGVzPC9oMj4KKzxoMz5KdW1wIHRvIFNlY3Rpb25zPC9oMz4KKzx1bD4KKzxweTpmb3IgZWFjaD0iYnJhbmNoIGluIGJyYW5jaGVzIj4KKyAgPGxpPjxhIGhyZWY9IiMke2JyYW5jaC5uYW1lfSI+JHticmFuY2gubmFtZX08L2E+ICZtZGFzaDsgJHticmFuY2gubGVufSBmaWxlczwvbGk+Cis8L3B5OmZvcj4KKzwvdWw+Cis8L3B5OmlmPgorCis8cHk6Zm9yIGVhY2g9ImJyYW5jaCBpbiBicmFuY2hlcyI+Cis8aHIvPgorPGEgbmFtZT0iJHticmFuY2gubmFtZX0iPgorICA8aDM+CisgICAgICAgIDxhIGhyZWY9IiR7aHJlZi5icm93c2VyKGJyYW5jaC5uYW1lKX0iPiR7YnJhbmNoLm5hbWV9PC9hPiAmbWRhc2g7ICgke2JyYW5jaC5sZW59IGZpbGVzIGNoYW5nZWQpCisgIDwvaDM+Cis8L2E+CisKKzxibG9ja3F1b3RlPgorCis8dGFibGUgY2xhc3M9J2ljdXJldmlldyc+Cis8dGhlYWQ+Cis8dHI+CisgPHRoPkZpbGU8L3RoPgorIDx0aD5DaGFuZ2VzPC90aD4KKyA8dGg+RGV0YWlsczwvdGg+CisgPHB5OmlmIHRlc3Q9Im92ZXJhbGxfeSA+IDAiPiAKKyAgPHRoPk92ZXJhbGw8YnIvPjxpPihpbmNsdWRpbmcgb3RoZXIgY2hhbmdlcyk8L2k+PC90aD4KKyAgPHRoPkRldGFpbHM8L3RoPgorIDwvcHk6aWY+Cis8L3RyPgorPC90aGVhZD4KKzx0Ym9keT4KKzxweTpmb3IgZWFjaD0iZmlsZSBpbiBicmFuY2guZmlsZXMiPgorIDx0cj4KKyAgICA8dGggY2xhc3M9J25hbWUnPiR7ZmlsZS5uYW1lfTwvdGg+CisgICAgPHRkIGNsYXNzPSdjaGFuZ2VzJz4KKyAgICAgIDxweTpmb3IgZWFjaD0iY2hhbmdlIGluIGZpbGUuY2hhbmdlcyI+CisgICAgICAgICR7Y2hhbmdlWzBdfTxici8+CisgICAgICA8L3B5OmZvcj4KKyAgICA8L3RkPgorICAgIDx0ZCBjbGFzcz0nZGV0YWlscyc+CisgICAgICA8cHk6Zm9yIGVhY2g9ImNoYW5nZSBpbiBmaWxlLmNoYW5nZXMiPgorICAgICAgICAke2NoYW5nZVsxXX08YnIvPgorICAgICAgPC9weTpmb3I+CisgICAgPC90ZD4KKwkgIAorICAgIDxweTppZiB0ZXN0PSJvdmVyYWxsX3kgPiAwIj4gCisgICAgIDxweTppZiB0ZXN0PSJmaWxlLm92ZXJhbGxfeSA+IDAiPgorICAgICAgPHRkIGNsYXNzPSdvdmVyYWxsJz4ke2ZpbGUub3ZlcmFsbFswXX08L3RkPgorICAgICAgPHRkIGNsYXNzPSdvdmVyYWxsJz4ke2ZpbGUub3ZlcmFsbFsxXX08L3RkPgorICAgICA8L3B5OmlmPgorICAgIDwvcHk6aWY+CisgIDwvdHI+Cis8L3B5OmZvcj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorCis8L2Jsb2NrcXVvdGU+CisKKzwvcHk6Zm9yPgorCis8aHIvPgorCis8ZGl2IHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4KKzxoMj5NZXJnZSBDb21tYW5kczwvaDI+CitWZXJ5IGV4cGVyaW1lbnRhbC4gIENoYW5nZSA/Pz8gdG8gdGhlIHRvcCBvZiB0aGUgdHJlZSB5b3Ugd2FudCB0byBtZXJnZSBmcm9tIChpY3Ugb3IgaWN1NGopPGJyLz4KKzx0ZXh0YXJlYT5zdm4gbWVyZ2UgLWMgPD9jcyBlYWNoOnJldiA9IHJldmlzaW9ucyA/Pjw/Y3MgdmFyOnJldi5udW0gPz4sPD9jcyAvZWFjaCA/PiBzdm4rc3NoOi8vc291cmNlLmljdS1wcm9qZWN0Lm9yZy9yZXBvcy9pY3UvPz8/L3RydW5rPC90ZXh0YXJlYT4KKworPGhyLz4KKzwvZGl2PgorPGhyLz4KKzxpZnJhbWUgc3JjPSJodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL2ljdWNvZGV0b29scy92MS9yZXZpZXciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjgwMHB4Ij4KKzxoMT48YSBocmVmPSJodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL2ljdWNvZGV0b29scy92MS9yZXZpZXciPkhlbHA8L2E+PC9oMT4KKzwvaWZyYW1lPgorCis8L3B5OmlmPgorPGhyLz4KKzxpPiRJZDogJDwvaT4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGlja2V0bWdyLnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGlja2V0bWdyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyZTMxYTUKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkKQEAgLTAsMCArMSwxNzAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisjIEF1dGhvcjogPHNybEBpY3UtcHJvamVjdC5vcmc+CisjCisKKyMgCisjIFRpY2tldCBtYW5hZ2VtZW50LgorIyBUaGlzIGNvbXBvbmVudCBtYW5hZ2VzIHRoZSByZXZpc2lvbiB0byB0aWNrZXQgbWFwLgorCisKKworZnJvbSB0cmFjLmNvcmUgaW1wb3J0IENvbXBvbmVudCwgaW1wbGVtZW50cywgVHJhY0Vycm9yCitmcm9tIHRyYWMuZW52IGltcG9ydCBJRW52aXJvbm1lbnRTZXR1cFBhcnRpY2lwYW50Citmcm9tIHRyYWMuZGIgaW1wb3J0IFRhYmxlLCBDb2x1bW4sIEluZGV4LCBEYXRhYmFzZU1hbmFnZXIKK2Zyb20gdHJhYy5jb25maWcgaW1wb3J0IE9wdGlvbgorZnJvbSB0cmFjLnV0aWwudGV4dCBpbXBvcnQgZXhjZXB0aW9uX3RvX3VuaWNvZGUKKworaW1wb3J0IHJlCisKK3RrdG1ncl9zY2hlbWEgPSBbCisgICAgVGFibGUoJ3JldjJ0aWNrZXQnLCBrZXk9J3JldicpWyAgICAgICAgICMgbWFwIHJldi0+dGlja2V0CisgICAgICAgIENvbHVtbigncmV2JywgdHlwZT0naW50JyksICAgICAgICAgICMgY2hhbmdlc2V0IGlkCisgICAgICAgIENvbHVtbigndGlja2V0JywgdHlwZT0naW50JyksICAgICAgICMgdGlja2V0ICMKKyAgICAgICAgSW5kZXgoWyd0aWNrZXQnXSldLCAgICAgICAgICAgICAgICAgIyBpbmRleCBieSB0aWNrZXQKK10KKworY2xhc3MgVGlja2V0TWFuYWdlcihDb21wb25lbnQpOgorICAgIGltcGxlbWVudHMoSUVudmlyb25tZW50U2V0dXBQYXJ0aWNpcGFudCkKKyMgICAgaW1wbGVtZW50cyhJRW52aXJvbm1lbnRTZXR1cFBhcnRpY2lwYW50LCBJUmVwb3NpdG9yeU9ic2VydmVyKQorCisgICAgdGlja2V0X3BhdHRlcm4gPSBPcHRpb24oJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdedGlja2V0OihcZCspJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiQSByZWdleCBtYXRjaGluZyB0aGUgY29tbWl0IG1lc3NhZ2VzLiBHcm91cCAxIG11c3QgcmV0dXJuIGEgbnVtYmVyLiIiIikKKyAgICAKKyAgICBkZWYgaWN1X3RrdG1ncihzZWxmKToKKyAgICAgICAgcmV0dXJuIDE7CisgICAgCisgICAga25vd25feW91bmdlc3QgPSAtMQorCisgICAgZGVmIGVudmlyb25tZW50X2NyZWF0ZWQoc2VsZik6CisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIGNvbm5lY3RvciwgXyA9IERhdGFiYXNlTWFuYWdlcihzZWxmLmVudikuX2dldF9jb25uZWN0b3IoKQorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBmb3IgdGFibGUgaW4gdGt0bWdyX3NjaGVtYToKKyAgICAgICAgICAgIGZvciBzdG10IGluIGNvbm5lY3Rvci50b19zcWwodGFibGUpOgorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKHN0bXQpCisKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIklOU0VSVCBJTlRPIHN5c3RlbSAobmFtZSx2YWx1ZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICgnaWN1X3RrdG1ncicsJXMpIiwgKHNlbGYuaWN1X3RrdG1ncigpLCkpCisgICAgICAgIGRiLmNvbW1pdCgpCisgICAgICAgIHNlbGYubG9nLmluZm8oJ0RhdGFiYXNlIHVwZGF0ZTogaWN1X3RrdG1nciB0YWJsZXMgdmVyc2lvbiAlZCAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmljdV90a3RtZ3IoKSkKKyAgICAgICAgcHJpbnQgJ2ljdWNvZGV0b29scy50aWNrZXRtZ3I6IE5vdGUsIGZpcnN0IHJldmlldyB3aWxsIHRha2UgYSB3aGlsZS5cbicKKyAgICAKKyAgICBkZWYgeW91bmdlc3RfcmV2KHNlbGYsZGIpOgorICAgICAgICBpZiAoc2VsZi5rbm93bl95b3VuZ2VzdCA8IDApOgorICAgICAgICAgICAgI3ByaW50KCdEaWQgbm90IGtub3cgeW91bmdlc3QgdmFsdWUuJykKKyAgICAgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gc3lzdGVtIFdIRVJFIG5hbWU9J2ljdV90a3RtZ3JfeW91bmdlc3QnIikKKyAgICAgICAgICAgIHJvdyA9IGN1cnNvci5mZXRjaG9uZSgpCisgICAgICAgICAgICBpZiBub3Qgcm93OgorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJJTlNFUlQgSU5UTyBzeXN0ZW0gKG5hbWUsdmFsdWUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICgnaWN1X3RrdG1ncl95b3VuZ2VzdCcsJy0xJykiKQorICAgICAgICAgICAgICAgIGRiLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgc2VsZi5rbm93bl95b3VuZ2VzdCA9IC0yCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGtub3duX3lvdW5nZXN0ID0gaW50KHJvd1swXSkKKyAgICAgICAgICAgICAgICBzZWxmLmtub3duX3lvdW5nZXN0ID0ga25vd25feW91bmdlc3QKKyAgICAgICAgcmV0dXJuIHNlbGYua25vd25feW91bmdlc3QKKyAgICAgICAgCisgICAgZGVmIGNoZWNrX3N5bmMoc2VsZiwgbG9nLCBkYiwgcmVwb3MpOgorICAgICAgICBvdXJZb3VuZ2VzdCA9IHNlbGYueW91bmdlc3RfcmV2KGRiKQorICAgICAgICB0aGVpcllvdW5nZXN0ID0gcmVwb3MuZ2V0X3lvdW5nZXN0X3JldigpCisgICAgICAgICNsb2cuaW5mbygiVEtUOiBjaGVja19zeW5jICVkLyVkIiAlIChvdXJZb3VuZ2VzdCx0aGVpcllvdW5nZXN0KSkKKyAgICAgICAgaWYob3VyWW91bmdlc3QgPD0gdGhlaXJZb3VuZ2VzdCk6CisgICAgICAgICAgICBzZWxmLnJlc3luYyhsb2csIGRiLCByZXBvcywgb3VyWW91bmdlc3QsIHRoZWlyWW91bmdlc3QpCisgICAgCisgICAgZGVmIGVudmlyb25tZW50X25lZWRzX3VwZ3JhZGUoc2VsZiwgZGIpOgorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gc3lzdGVtIFdIRVJFIG5hbWU9J2ljdV90a3RtZ3InIikKKyAgICAgICAgcm93ID0gY3Vyc29yLmZldGNob25lKCkKKyAgICAgICAgaWYgbm90IHJvdyBvciBpbnQocm93WzBdKSA8IHNlbGYuaWN1X3RrdG1ncigpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB1cGdyYWRlX2Vudmlyb25tZW50KHNlbGYsIGRiKToKKyAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCkKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NIHN5c3RlbSBXSEVSRSBuYW1lPSdpY3VfdGt0bWdyJyIpCisgICAgICAgIHJvdyA9IGN1cnNvci5mZXRjaG9uZSgpCisgICAgICAgIGlmIG5vdCByb3c6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NyZWF0ZWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2cuaW5mbygnRG8gbm90IGtub3cgaG93IHRvIHVwZ3JhZGUgaWN1dHJheGN0bl90aWNrZXRtZ3IgdGFibGVzIHRvICVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pY3VfdGt0bWdyKCkpCisJY3Vyc29yLmNsb3NlKCkKKworICAgIGRlZiByZXN5bmMoc2VsZiwgbG9nLCBkYiwgcmVwb3MsIG91cllvdW5nZXN0LCB0aGVpcllvdW5nZXN0KToKKyAgICAgICAgc2VsZi5sb2cuaW5mbygncmVzeW5jOiBvdXJZb3VuZ2VzdD0lZCB0aGVpcllvdW5nZXN0PSVkJyAlIChvdXJZb3VuZ2VzdCwgdGhlaXJZb3VuZ2VzdCkpCisgICAgICAgIGlmIChvdXJZb3VuZ2VzdCA8IDApOgorICAgICAgICAgICAgIyBzdGFydCBhdCByZXYgMQorICAgICAgICAgICAgb3VyWW91bmdlc3QgPSAxCisgICAgICAgIAorICAgICAgICAjc2VsZi50aWNrZXRfcGF0dGVybiA9IHNlbGYuZW52LmNvbmZpZy5nZXQoJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdeY2xkcmJ1ZyAoXGQrKTonKQorCisgICAgICAgICMgICAgICAgIGxvZy5pbmZvKCJQYXQ6ICVzIiAlIChzZWxmLnRpY2tldF9wYXR0ZXJuKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50aWNrZXRfbWF0Y2ggPSByZS5jb21waWxlKHNlbGYudGlja2V0X3BhdHRlcm4pCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZW52LmNvbmZpZy5nZXQoJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdOb25lRm91bmQnKQorICAgICAgICAgICAgcmFpc2UgVHJhY0Vycm9yKCdDb3VsZCBub3QgY29tcGlsZSBpY3Vjb2RldG9vbHMudGlja2V0X3BhdHRlcm49LyVzLyBidXQgLyVzLzogJXMnICUgKHNlbGYudGlja2V0X3BhdHRlcm4sIGZvdW5kLCBleGNlcHRpb25fdG9fdW5pY29kZShlLCB0cmFjZWJhY2s9VHJ1ZSkpKQorCisjICAgICAgICBzZWxmLnRpY2tldF9tYXRjaCA9IHJlLmNvbXBpbGUoc2VsZi50aWNrZXRfcGF0dGVybi5nZXQoKSkKKyMgICAgICAgIHNlbGYudGlja2V0X21hdGNoID0gcmUuY29tcGlsZSgnLionKQorICAgICAgICBmb3IgaSBpbiByYW5nZShvdXJZb3VuZ2VzdCwgdGhlaXJZb3VuZ2VzdCsxKToKKyAgICAgICAgICAgICNsb2cud2FybmluZygnc3luY2luZzogJWQgWyVkLyVkKzFdJywgaSwgdGhlaXJZb3VuZ2VzdCkKKyAgICAgICAgICAgIGNzZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KGkpCisgICAgICAgICAgICBzZWxmLnJldmlzaW9uX2NoYW5nZWQobG9nLCBjc2V0LCBpLCBkYi5jdXJzb3IoKSkKKyAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCk7CisgICAgICAgIGN1cnNvci5leGVjdXRlKCJ1cGRhdGUgc3lzdGVtIHNldCB2YWx1ZT0nJXMnIHdoZXJlIG5hbWU9J2ljdV90a3RtZ3JfeW91bmdlc3QnIiAlICh0aGVpcllvdW5nZXN0KSkKKyAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgI2xvZy53YXJuKCJzZWxmLmtub3duX3lvdW5nZXN0IHdhcyAlZCBbJWQvJWRdIiAlIChzZWxmLmtub3duX3lvdW5nZXN0LG91cllvdW5nZXN0LHRoZWlyWW91bmdlc3QpKSAKKyAgICAgICAgIyB1cGRhdGUga25vd24geW91bmdlc3QuCisgICAgICAgIHNlbGYua25vd25feW91bmdlc3QgPSB0aGVpcllvdW5nZXN0CisgICAgICAgICNsb2cud2Fybigic2VsZi5rbm93bl95b3VuZ2VzdCBub3cgJWQgWyVkLyVkXSIgJSAoc2VsZi5rbm93bl95b3VuZ2VzdCxvdXJZb3VuZ2VzdCx0aGVpcllvdW5nZXN0KSkgCisgICAgICAgIHJldHVybgorCisgICAgIyBJUmVwb3NpdG9yeU9ic2VydmVyIG1ldGhvZHMKKyAgICBkZWYgcmV2aXNpb25fY2hhbmdlZChzZWxmLCBsb2csIGNzZXQsIG5leHRfeW91bmdlc3QsIGN1cnNvcik6CisgICAgICAgICMgc3luYyB0aGUgJ3JldjJ0aWNrZXQnIHRhYmxlCisgICAgICAgIG1lc3NhZ2UgPSBjc2V0Lm1lc3NhZ2Ugb3IgJy0tJworICAgICAgICAjIGNhbiB3ZSBsb2FkIGEgdGlja2V0IGZyb20gaXQ/ICAgInRpY2tldDoxMjM0OiBNZXNzYWdlIgorICAgICAgICByZXMgPSBzZWxmLnRpY2tldF9tYXRjaC5tYXRjaChtZXNzYWdlKQorICAgICAgICBpZiByZXM6CisgICAgICAgICAgICB0aWNrbmFtZSA9IHJlcy5ncm91cCgxKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGludChyZXMuZ3JvdXAoMSkpICMgc2hvdWxkIGJlIGludAorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICBsb2cud2FybmluZygnUmV2aXNpb24gWyVzXSBoYWQgdW5wYXJzZWFibGUgdGlja2V0IG51bWJlciBbJXNdOiBbJXNdJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dF95b3VuZ2VzdCwgdGlja25hbWUsIGUpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdHJ5OgorCQkjbG9nLndhcm5pbmcoJ3Ilcz0jJXMnICUgKHN0cihuZXh0X3lvdW5nZXN0KSwgdGlja25hbWUpKQorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJJTlNFUlQgT1IgSUdOT1JFIElOVE8gcmV2MnRpY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAocmV2LHRpY2tldCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCVzLCVzKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIobmV4dF95b3VuZ2VzdCksIHRpY2tuYW1lKSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6ICMgKmFub3RoZXIqIDEuMS4gcmVzeW5jIGF0dGVtcHQgd29uIAorICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCdyZXYydGlja2V0ICVzIGNvdWxkIG5vdCBjYWNoZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0X3lvdW5nZXN0LCBlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2cud2FybmluZygnUmV2aXNpb24gJXMgaGFkIHVubWF0Y2hlZCBtZXNzYWdlICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dF95b3VuZ2VzdCwgY3NldC5tZXNzYWdlKSkKKyAgICAKKyAgICBkZWYgcmVwb3NpdG9yeV9yZXN5bmMoc2VsZiwgY3Vyc29yKToKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIkRFTEVURSBGUk9NIHJldjJ0aWNrZXQiKTsKKyAgICAgICAgCisgICAgZGVmIHRrdDJyZXZzKHNlbGYsIGxvZywgZGIsIHJlcG9zLCByZXEsIHRpY2tldCk6CisgICAgICAgICIiIkdpdmVuIGEgdGlja2V0LCByZXR1cm4gYSBsaXN0IG9mIHJldnMuCisgICAgICAgICIiIgorICAgICAgICAKKyAgICAgICAgc2VsZi5jaGVja19zeW5jKGxvZywgZGIsIHJlcG9zKQorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHJ0LnJldiBmcm9tIHJldjJ0aWNrZXQgYXMgcnQgd2hlcmUgcnQudGlja2V0ID0gJWQgb3JkZXIgYnkgcnQucmV2IiAlIGludCh0aWNrZXQpKQorICAgICAgICByZXZzID0gW10KKyAgICAgICAgZm9yIHJldiwgaW4gY3Vyc29yOgorICAgICAgICAgICAgcmV2ID0gaW50KHJldikKKyAgICAgICAgICAgIHJldnMuYXBwZW5kKHJldikKKwljdXJzb3IuY2xvc2UoKQorICAgICAgICByZXR1cm4gcmV2cwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGt0bGlzdC5weSBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdkZTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkKQEAgLTAsMCArMSwxNzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworaW1wb3J0IHJlCisKK2ltcG9ydCBzeXMKKworZnJvbSB0cmFjLmNvcmUgaW1wb3J0ICoKK2Zyb20gdHJhYy51dGlsIGltcG9ydCBNYXJrdXAKK2Zyb20gdHJhYy53ZWIgaW1wb3J0IElSZXF1ZXN0SGFuZGxlcgorZnJvbSB0cmFjLndlYi5jaHJvbWUgaW1wb3J0IGFkZF9zdHlsZXNoZWV0LCBJTmF2aWdhdGlvbkNvbnRyaWJ1dG9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlbXBsYXRlUHJvdmlkZXIKK2Zyb20gdHJhYy53ZWIuaHJlZiBpbXBvcnQgSHJlZgorI2Zyb20gdHJhYy52ZXJzaW9uY29udHJvbC53ZWJfdWkuY2hhbmdlc2V0IGltcG9ydCBJQ2hhbmdlc2V0UmFuZ2VMaW5rCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyCitmcm9tIHRyYWMudGlja2V0IGltcG9ydCBUaWNrZXQKKworCisKK2NsYXNzIFRpY2tldGxpc3RNb2R1bGUoQ29tcG9uZW50KToKKworICAgIGltcGxlbWVudHMoSVJlcXVlc3RIYW5kbGVyKQorIyAgICBpbXBsZW1lbnRzKElSZXF1ZXN0SGFuZGxlcixJQ2hhbmdlc2V0UmFuZ2VMaW5rKQorCisgICAgZGVmIHJldmlzaW9uX3JhbmdlX2xpbmsoc2VsZiwgcmVxLCBiYXNlLCBzdGFydCwgZW5kKToKKyAgICAgICAgcmV0dXJuICgnVGlja2V0IExpc3QnLCByZXEuaHJlZigndGt0bGlzdCcsb2xkX3BhdGg9YmFzZSxuZXdfcGF0aD1iYXNlLG9sZD1zdGFydCxuZXc9ZW5kKSkKKworICAgIF9yZXF1ZXN0X3JlID0gcmUuY29tcGlsZShyIi90a3RsaXN0KD86LyhbXi9dKykpPygvLiopPyQiKQorCisgICAgZGVmIG1hdGNoX3JlcXVlc3Qoc2VsZiwgcmVxKToKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChzZWxmLl9yZXF1ZXN0X3JlLCByZXEucGF0aF9pbmZvKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcSk6CisgICAgICAgICNvaywgd2hhdCBhcmUgd2UgYWJvdXQuCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHRpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgIHJldmxpc3QgPSB7fSAjIGRpY3Qgb2YgcmV2aXNpb24tPgorICAgICAgICByZXBvcyA9IHNlbGYuZW52LmdldF9yZXBvc2l0b3J5KHJlcS5hdXRobmFtZSkKKworICAgICAgICBpZiBub3QgcmVxLnBlcm0uaGFzX3Blcm1pc3Npb24oJ1RJQ0tFVF9NT0RJRlknKToKKyAgICAgICAgICAgIHJldHVybiByZXEucmVkaXJlY3QocmVxLmhyZWYuYnJvd3NlcigpKQorCisgICAgICAgICMgc2hvcnRjdXQgLSBpZiAicmV2cyIgaXMgc2V0LCBqdXN0IHVzZSB0aGF0CisgICAgICAgIHJldnMgPSByZXEuYXJncy5nZXQoJ3JldnMnKQorICAgICAgICBpZiByZXZzIGFuZCBsZW4ocmV2cyk+MDoKKyAgICAgICAgICAgY29udGVudF90eXBlID0gInRleHQvaHRtbCIKKyAgICAgICAgICAgYWRkX3N0eWxlc2hlZXQocmVxLCAnY3NzL2ljdXh0bi5jc3MnKQorICAgICAgICAgICByZXEuaGRmWyd0aXgucmV2cyddID0gcmV2cworICAgICAgICAgICBpdGVtcyA9IHJldnMuc3BsaXQoKQorICAgICAgICAgICBvdXRzdHIgPSAnMT0wICcKKyAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICAgICByZXYgPSBpbnQoaXRlbSkgIyBtYXkgZmFpbAorICAgICAgICAgICAgICAgb3V0c3RyID0gJ3J0LnJldj0lZCclKHJldikKKyAgICAgICAgICAgcmVxLmhkZlsnaXNfZGN1dCddPTEKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddID0gb3V0c3RyICAKKyAgICAgICAgICAgIyB0ZXN0IC0gZ2V0IHJlbGV2YW50IHJldnMKKyAgICMgICAgICAgIHByaW50ICJvdGltZT0lcywgbnRpbWU9JXMiJSh0eXBlKG90aW1lKSx0eXBlKG50aW1lKSkKKyAgICAgICAgICAgI2N1cnNvci5leGVjdXRlKCJzZWxlY3QgZGlzdGluY3QgdC5pZCx0LnN1bW1hcnkgZnJvbSB0aWNrZXQgYXMgdCxyZXZpc2lvbiBhcyByLCByZXYydGlja2V0IGFzIHJ0ICIKKyAgICAgICAgICAgIyAgICAgICAgICAgICAgICIgd2hlcmUgdC5pZCA9IHJ0LnRpY2tldCBhbmQgKCVzKSBvcmRlciBieSB0LmlkIiUob3V0c3RyKSkKKyAgICAgICAgICAgYWxsc3FsID0gInNlbGVjdCBkaXN0aW5jdCB0aWNrZXQgZnJvbSByZXYydGlja2V0IGFzIHJ0IHdoZXJlICVzIG9yZGVyIGJ5IHJ0LnRpY2tldCIlKG91dHN0cikKKyAgICAgICAgICAgYWxsc3FsID0gInNlbGVjdCB0aWNrZXQgZnJvbSByZXYydGlja2V0IHdoZXJlIHJldj0lcyBvcmRlciBieSB0aWNrZXQiCisgICAgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgICAgIyBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHRpY2tldCBmcm9tIHJldjJ0aWNrZXQgd2hlcmUgcmV2PSVzIG9yZGVyIGJ5IHRpY2tldCIsKCIyMjkxMyIsKSkKKyAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCBydC5yZXYgZnJvbSByZXYydGlja2V0IGFzIHJ0IHdoZXJlIHJ0LnRpY2tldCA9ICVkIG9yZGVyIGJ5IHJ0LnJldiIgJSBpbnQoNjAxMCkpCisgICAgICAgICAgIHRpY2tldCA9IDAKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddID0gYWxsc3FsICAKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddPSJ6ZXJvIgorICAgICAgICAgICBmb3IgdGt0IGluIGN1cnNvcjoKKyAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpeC5zcWwnXT10a3QKKyAgICAgICAgICAgICAgIHN1bW0gPSAiIjsKKyAgICAgICAgICAgICAgICNzeXMuc3RkZXJyLndyaXRlKCIgdGt0ICVzIHN1bW0gJXMgZnJvbSAoZC1kKSIgJSAodGt0LHN1bW0pKQorICAgICAgICAgICAgICAgdGlja2V0ID0gdGlja2V0ICsgMQorICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gc3VtbQorICAgICAgICAgICAgICAgICAgICNyZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCBzdW1tLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49VHJ1ZSApCisgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddPWUKKyAgICAgICAgICAgICAgICAgICAjcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50aHRtbCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9ICcnCisgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLm51bWJlcicgJSB0aWNrZXRdID0gdGt0CisgICAgICAgICAgICAgICAjYWEgPSBNYXJrdXAoIjxhIGNsYXNzPVwibmV3IHRpY2tldFwiIGhyZWY9XCIlc1wiIHRpdGxlPVwiVGlja2V0IHggKG5ldylcIj4jJXM8L2E+IiUocmVxLmhyZWYudGlja2V0KHRrdCksdGt0KSkKKyAgICAgICAgICAgICAgICNyZXEuaGRmWyd0aWNrZXRzLiVkLmh0bWwnICUgdGlja2V0XSA9IGFhCisgICAgICAgICAgICMgc2V0IFJERiBoZXJlCisgICAgICAgICAgIHJldHVybiAndGt0cmV2cy5jcycsIGNvbnRlbnRfdHlwZQorCisgICAgICAgIG5ld19wYXRoID0gcmVxLmFyZ3MuZ2V0KCduZXdfcGF0aCcpCisgICAgICAgIG5ld19yZXYgPSByZXEuYXJncy5nZXQoJ25ldycpCisgICAgICAgIG9sZF9wYXRoID0gcmVxLmFyZ3MuZ2V0KCdvbGRfcGF0aCcpCisgICAgICAgIG9sZF9yZXYgPSByZXEuYXJncy5nZXQoJ29sZCcpCisKKyAgICAgICAgbmV3X3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChuZXdfcGF0aCkKKyAgICAgICAgbmV3X3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYobmV3X3JldikKKyAgICAgICAgb2xkX3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChvbGRfcGF0aCkKKyAgICAgICAgb2xkX3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYob2xkX3JldikKKworCisgICAgICAgIG9sZF9yZXYgPSBpbnQob2xkX3JldikKKyAgICAgICAgbmV3X3JldiA9IGludChuZXdfcmV2KQorICAgICAgICAKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0LmRpZmZfaHJlZiddID0gcmVxLmhyZWYoJ2NoYW5nZXNldCcsb2xkX3BhdGg9b2xkX3BhdGgsbmV3PW5ld19yZXYsbmV3X3BhdGg9bmV3X3BhdGgsb2xkPW9sZF9yZXYpCisKKyAgICAgICAgcmVxLmhkZlsnaXNfZGN1dCddPTEKKyAgICAgICAgCisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5vbGRfcmV2J10gPSBvbGRfcmV2CisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5uZXdfcmV2J10gPSBuZXdfcmV2CisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5vbGRfcGF0aCddID0gb2xkX3BhdGgKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm5ld19wYXRoJ10gPSBuZXdfcGF0aAorICAgICAgICBjb250ZW50X3R5cGUgPSAidGV4dC9odG1sIgorICAgICAgICBhZGRfc3R5bGVzaGVldChyZXEsICdjc3MvaWN1eHRuLmNzcycpCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICMgZmlyc3QsIGdldCByZWxldmFudCBjaGFuZ2VzLgorICAgICAgICByZXEuaGRmWyd0YXJnZXRfcGF0aCddID0gJy4nOworICAgICAgICAjIG9rYXkuIG1hbnVhbGx5IHRyb21wIHRocm91Z2ggJ2VtCisgICAgICAgIG9zZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KG9sZF9yZXYpOworICAgICAgICBuc2V0ID0gcmVwb3MuZ2V0X2NoYW5nZXNldChuZXdfcmV2KTsKKyAgICAgICAgb3RpbWUgPSBpbnQob3NldC5kYXRlKQorICAgICAgICBudGltZSA9IGludChuc2V0LmRhdGUpCisgICAgICAgIAorICAgICAgICBub3JtX3RyPSJzdHlsZT0nYm9yZGVyOiAxcHggZGFzaGVkIGdyZWVuOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0ZDOyciCisgICAgICAgIGNsb3NlZF90cj0ic3R5bGU9J2NvbG9yOiAjNjY2OyciCisgICAgICAgIG5vcmV2X3RyPSJzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjojRkREOyBib3JkZXI6IDFweCBzb2xpZCAjRjk5OyBmb250LXdlaWdodDogYm9sZDsnIgorCisgICAgICAgIHJlcS5oZGZbJ3NhbXBsZS5ub3JtLnRyJ10gPSBub3JtX3RyCisgICAgICAgIHJlcS5oZGZbJ3NhbXBsZS5jbG9zZWQudHInXSA9IGNsb3NlZF90cgorICAgICAgICByZXEuaGRmWydzYW1wbGUubm9yZXYudHInXSA9IG5vcmV2X3RyCisgICAgICAgIAorIyAgICAgICAgcHJpbnQgIiBzZWFyY2hpbmcgaW4gICglcy0lcykiICUgKG90aW1lLCBudGltZSkKKworICAgICAgICAjIHRlc3QgLSBnZXQgcmVsZXZhbnQgcmV2cworICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorIyAgICAgICAgcHJpbnQgIm90aW1lPSVzLCBudGltZT0lcyIlKHR5cGUob3RpbWUpLHR5cGUobnRpbWUpKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IGRpc3RpbmN0IHQuaWQsdC5zdW1tYXJ5LHQub3duZXIsIHQubWlsZXN0b25lLCB0LnN0YXR1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICIgLCBjLnZhbHVlICIgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gdGlja2V0IGFzIHQscmV2aXNpb24gYXMgciwgcmV2MnRpY2tldCBhcyBydCAiCisgICAgICAgICAgICAgICAgICAgICAgICIgbGVmdCBqb2luIHRpY2tldF9jdXN0b20gYXMgYyAiCisgICAgICAgICAgICAgICAgICAgICAgICIgb24gICggYy5uYW1lID0gJ3JldncnIEFORCBjLnRpY2tldCA9IHQuaWQgKSAiCisjICAgICAgICAgICAgICAgICAgICAgICAiICwgdGlja2V0X2N1c3RvbSBhcyBjICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiB3aGVyZSB0LmlkID0gcnQudGlja2V0IGFuZCBydC5yZXYgPSByLnJldiBhbmQgci50aW1lID4gJXMgYW5kIHIudGltZSA8PSAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbmQgZXhpc3RzICggc2VsZWN0IG5jLnJldiBmcm9tIG5vZGVfY2hhbmdlIGFzIG5jIHdoZXJlIG5jLnJldj1yLnJldiBhbmQgbmMucGF0aCBsaWtlICVzICkgIgorICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIgYnkgdC5pZCIsIChzdHIob3RpbWUpLCBzdHIobnRpbWUpLCAob2xkX3BhdGggKyAiJSIpKSkKKyAgICAgICAgdGlja2V0ID0gMAorICAgICAgICBmb3IgdGt0LHN1bW0sb3ducixtaWxlc3RvbmUsc3RhdHVzLCByZXZ3IGluIGN1cnNvcjoKKyMgICAgICAgICAgICBwcmludCAiIHRrdCAlcyBzdW1tICVzIGZyb20gKCVkLSVkKSIgJSAodGt0LHN1bW0sIG90aW1lLCBudGltZSkKKyAgICAgICAgICAgIHRpY2tldCA9IHRpY2tldCArIDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9IHN1bW0KKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCBzdW1tLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49VHJ1ZSApCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50aHRtbCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9ICcnCisgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLm51bWJlcicgJSB0aWNrZXRdID0gdGt0CisgICAgICAgICAgICBhYSA9IE1hcmt1cCgiPGEgY2xhc3M9XCJuZXcgdGlja2V0XCIgaHJlZj1cIiVzXCIgdGl0bGU9XCJUaWNrZXQgeCAobmV3KVwiPiMlczwvYT4iJShyZXEuaHJlZi50aWNrZXQodGt0KSx0a3QpKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5odG1sJyAlIHRpY2tldF0gPSBhYQorICAgICAgICAgICAgYWEgPSBNYXJrdXAoIjxhIGNsYXNzPVwibmV3IHRpY2tldFwiIGhyZWY9XCIlc1wiIHRpdGxlPVwiVGlja2V0IHggKG5ldylcIj4jJXM8L2E+IiUocmVxLmhyZWYudGlja2V0KHRrdCksdGt0KSkKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQub3duZXInICUgdGlja2V0XSA9IG93bnIKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubWlsZXN0b25lJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCAibWlsZXN0b25lOiVzIiVtaWxlc3RvbmUgLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49RmFsc2UgKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5yZXZpZXdlcicgJSB0aWNrZXRdID0gcmV2dworICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5zdGF0dXNodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCAiIyVzIiUodGt0KSwgc2VsZi5lbnYsIGRiLCBzaG9ydGVuPUZhbHNlICkKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuaHRtbCcgJSB0aWNrZXRdID0gYWEKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IG5vcm1fdHIKKyAgICAgICAgICAgIGlmIHN0YXR1cyBhbmQgc3RhdHVzLnN0YXJ0c3dpdGgoJ2Nsb3NlZCcpOgorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IGNsb3NlZF90cgorICAgICAgICAgICAgaWYgKCBub3QgcmV2dyApIG9yIGxlbihyZXZ3KTwxOgorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IG5vcmV2X3RyCisgICAgICAgIAorICAgICAgICByZXR1cm4gJ3RrdGxpc3QuY3MnLCBjb250ZW50X3R5cGUKKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9saWNlbnNlLmh0bWwgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUwMjUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiPjwvbWV0YT4KKzx0aXRsZT5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBCR0NPTE9SPSIjZmZmZmZmIj4KKzxoMj5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L2gyPgorCis8cD5DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFPC9wPgorCis8cD4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDEwIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworPC9wPgorPHA+CitBbGwgcmlnaHRzIHJlc2VydmVkLgorPC9wPgorPHA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zCit0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcworcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgCitJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKK09SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis8L3A+Cis8cD4KK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbgordGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKzwvcD4KKworPGhyPgorPHA+PHNtYWxsPgorQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCis8L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvcmVhZG1lLnR4dCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ5ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNzQgQEAKK0lDVSBDb2RlIFRvb2xzIHBsdWdpbgorCitDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitTZWUgbGljZW5zZS5odG1sIGZvciB0aGUgbGljZW5zZSBmaWxlLiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUKK0lDVSBwcm9qZWN0IGFuZCBpcyB1bmRlciB0aGUgc2FtZSBsaWNlbnNlLgorCitSZXF1aXJlbWVudHM6CisJVHJhYyAoMC4xMSBvciAwLjEyKz8pCisJUmVwb3NpdG9yeQorCitJbnN0YWxsaW5nOgorCTEuIGluc3RhbGwgdGhlIHBsdWdpbiAtIGF0IGxlYXN0IHRoZSB0aWNrZXRtYW5hZ2VyIGFuZCByZXZpZXcgcG9ydGlvbi4KKworICAgICAgICAgYS4gVGhlcmUgaXMgbm8gc291cmNlIHJlbGVhc2UgYXQgdGhpcyB0aW1lOiBJIHJlY29tbWVuZAorICAgICAgICAgICAgIHRoYXQgeW91IGNoZWNrIG91dCB0aGlzIGNvZGUgd2l0aCBzdm4KKyAgICAgICAgICAgICBhbmQgaW4gdGhpcyBkaXJlY3RvcnksIHJ1bjogCisgICAgICAgICAgICAgICAgInB5dGhvbiBzZXR1cC5weSBkZXZlbG9wIgorCQorCSBiLiBJbiB0cmFjLmluaSB1bmRlciAnW2NvbXBvbmVudHNdJyBhZGQ6CisJCWljdWNvZGV0b29scy5yZXZpZXcucmV2aWV3bW9kdWxlID0gZW5hYmxlZAorCQlpY3Vjb2RldG9vbHMudGlja2V0bWdyLnRpY2tldG1hbmFnZXIgPSBlbmFibGVkCisJCisJTk9URTogRENVVCBhbmQgVEtUTElTVCBwYXJ0cyBhcmUgbm90IHdvcmtpbmcgeWV0LiAKKwlEb24ndCBib3RoZXIgdG8gZW5hYmxlIHRoZW0uCisKKwkyLiBpbiB5b3VyIHRyYWMuaW5pIGRlc2NyaWJlIGhvdyB5b3VyIGNoYW5nZXNldHMgZGVzY3JpYmUgYSB0aWNrZXQuIAorCU91ciBjaGFuZ2VzZXRzIGxvb2sgbGlrZSB0aGlzOiAgInRpY2tldDoxMjM0OiBmaXhlZCB0aGUgYnJva2VuIGNvZGUiCisJV2UgdXNlIHRoaXMgcmVnZXg6CisKKwkgICBbaWN1Y29kZXRvb2xzXQorCSAgIHRpY2tldF9wYXR0ZXJuID0gXnRpY2tldDooXGQrKQorCisJMy4geW91IG1heSBuZWVkIHRvIHJ1biB0cmFjLWFkbWluIDxlbnZpcm9ubWVudD4gdXBncmFkZSAKKworCTQuIEdyYW50IHBlcm1pc3Npb24gb2YgSUNVUkVWSUVXX1ZJRVcgdG8gd2hvbWV2ZXIgeW91IHdhbnQgdG8gCisJICAgYmUgYWJsZSB0byByZXZpZXcgdGlja2V0cy4gCisKKwk1LiBOb3csIGFueSB0aWNrZXQgd2lsbCBoYXZlIHNvbWV0aGluZyBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciB3aGljaCBzYXlzOgorCSAgICAgIk5vIGNvbW1pdHMiIC0gbm8gY29tbWl0cyBhZ2FpbnN0IHRoaXMgdGlja2V0CisKKwkgICAgICJSZXZpZXcgMSBjb21taXRzIiAgLSB0aGVyZSBpcyBvbmx5IG9uZSBjb21taXQuIENsaWNraW5nIHRoaXMgbGluaworCSAgICAgICAgICAgICB3aWxsIGp1c3QgdGFrZSB5b3UgdG8gdGhhdCBzaW5nbGUgY2hhbmdlc2V0LgorCisJICAgICAgIlJldmlldyBuIGNvbW1pdHMiICAtIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNvbW1pdHMgYWdhaW5zdCB0aGlzCisJICAgICAgICAgICAgIHRpY2tldC4KKworIAorVHJvdWJsZXNob290aW5nOgorCitROiBNeSBjb21taXRzIGFyZW4ndCBiZWluZyBmb3VuZCEKK0E6IENoZWNrIHRoZSBkZWJ1ZyBsb2cuIEl0IHdpbGwgbm90ZSBjb21taXRzIHdpdGggdW5wYXJzZWFibGUgbWVzc2FnZXMKKworUTogSG93IGRvIEkgcmVzeW5jIHRoZSBjb21taXRzPworQTogVW50aWwgd2UgaW1wbGVtZW50IHRyYWMgMC4xMiBjaGFuZ2VzZXQgbGlzdGVuZXJzLCB5b3UgY2FuIGRvIHRoaXM6CisKKyAgICAwLiAgYmFjayB1cCB5b3VyIHBhdGgvdG8vZW52L2RiL3RyYWMuZGIKKworICAgIDEuICQgc3FsaXRlMyAgcGF0aC90by9lbnYvZGIvdHJhYy5kYgorICAgIAorICAgIDIuIHNxbGl0ZT4gZGVsZXRlIGZyb20gcmV2MnRpY2tldDsKKworICAgIDMuIHNxbGl0ZT4gdXBkYXRlIHN5c3RlbSBzZXQgdmFsdWU9Jy0xJyB3aGVyZSBuYW1lPSdpY3VfdGt0bWdyX3lvdW5nZXN0JzsKKworICAgIDQuIHNxbGl0ZT4gIC5xdWl0CisKK05vdyB0aGUgdGlja2V0IG1hbmFnZXIgd2lsbCByZS1zeW5jIHRoZSBmaXJzdCB0aW1lIHlvdSBoaXQgYSB0aWNrZXQuCisKK0ZJTElORyBCVUdTL0ZFQVRVUkUgUkVRVUVTVFM6CisgLSBVc2UgSUNVJ3MgdHJhYyByZXBvc2l0b3J5IGF0IGh0dHA6Ly9idWdzLmljdS1wcm9qZWN0Lm9yZy90cmFjCisgLSBVc2UgdGhlICdpbmZyYXN0cnVjdHVyZScgY29tcG9uZW50IGFuZCBjbGVhcmx5IGlkZW50aWZ5IHRoZSAnSUNVIENvZGUgVG9vbHMKKyAgIGZvciBUcmFjJyB3aGVuIHlvdSBmaWxlIHRoZSBidWcuCisKKworCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL3NldHVwLmNmZyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjNmMmIKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL3NldHVwLmNmZwpAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKK1tlZ2dfaW5mb10KK3RhZ19idWlsZCA9IGRldgordGFnX3N2bl9yZXZpc2lvbiA9IHRydWUKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkYmRkMDMKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL3NldHVwLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTIgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIGZpbmRfcGFja2FnZXMKKworUEFDS0FHRSA9ICdJY3VDb2RlVG9vbHMnCitWRVJTSU9OID0gJzAuMC4xJworCitzZXR1cCgKKyAgICBuYW1lPVBBQ0tBR0UsIHZlcnNpb249VkVSU0lPTiwKKyAgICBkZXNjcmlwdGlvbj0nTWlzY2VsbGFuZW91cyBJQ1UgRXh0ZW5zaW9ucyB0byBUcmFjJywKKyAgICBhdXRob3I9IlN0ZXZlbiBSLiBMb29taXMiLCBhdXRob3JfZW1haWw9InNybEBpY3UtcHJvamVjdC5vcmciLAorICAgIGxpY2Vuc2U9J0JTRCcsIHVybD0naHR0cDovL2ljdS1wcm9qZWN0Lm9yZycsCisgICAgcGFja2FnZXM9ZmluZF9wYWNrYWdlcyhleGNsdWRlPVsnZXpfc2V0dXAnLCAnKi50ZXN0cyonXSksCisgICAgcGFja2FnZV9kYXRhPXsKKyAgICAgICAgJ2ljdWNvZGV0b29scyc6IFsKKyAgICAgICAgICAgICdodGRvY3MvY3NzLyouY3NzJywKKyAgICAgICAgICAgICd0ZW1wbGF0ZXMvKi5odG1sJywKKyMjICAgICAgICAgICAgJ2h0ZG9jcy9pbWcvKi5wbmcnLAorICAgICAgICAgICAnaHRkb2NzL2pzLyouanMnLAorICAgICAgICBdCisgICAgfSwKKyAgICBlbnRyeV9wb2ludHMgPSB7CisgICAgICAgICd0cmFjLnBsdWdpbnMnOiBbCisgICAgICAgICAgICAnaWN1Y29kZXRvb2xzLnRpY2tldG1nciA9IGljdWNvZGV0b29scy50aWNrZXRtZ3InLAorICAgICAgICAgICAgJ2ljdWNvZGV0b29scy5yZXZpZXcgPSBpY3Vjb2RldG9vbHMucmV2aWV3JywKKyAgICAgICAgICAgICdpY3Vjb2RldG9vbHMudGt0bGlzdCA9IGljdWNvZGV0b29scy50a3RsaXN0JywKKyAgICAgICAgICAgICdpY3Vjb2RldG9vbHMuZGN1dCA9IGljdWNvZGV0b29scy5kY3V0JworICAgICAgICBdCisgICAgfQorKQpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvX19pbml0X18ucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MmQ2NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvX19pbml0X18ucHkKQEAgLTAsMCArMSw1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworIworI2Zyb20gaWN1dHJhY3h0bi53ZWJfdWkgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL2RjdXQucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9kY3V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiNzQ4NmYKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9kY3V0LnB5CkBAIC0wLDAgKzEsMTUxIEBACisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKK2ltcG9ydCByZQorCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgKgorZnJvbSB0cmFjLnV0aWwgaW1wb3J0IE1hcmt1cAorZnJvbSB0cmFjLndlYiBpbXBvcnQgSVJlcXVlc3RIYW5kbGVyCitmcm9tIHRyYWMud2ViLmNocm9tZSBpbXBvcnQgYWRkX3N0eWxlc2hlZXQsIElOYXZpZ2F0aW9uQ29udHJpYnV0b3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVtcGxhdGVQcm92aWRlcgorZnJvbSB0cmFjLndlYi5ocmVmIGltcG9ydCBIcmVmCisjZnJvbSB0cmFjLnZlcnNpb25jb250cm9sLndlYl91aS5jaGFuZ2VzZXQgaW1wb3J0IElDaGFuZ2VzZXRSYW5nZUxpbmsKK2Zyb20gdHJhYy53aWtpIGltcG9ydCB3aWtpX3RvX2h0bWwsIHdpa2lfdG9fb25lbGluZXIsIElXaWtpU3ludGF4UHJvdmlkZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZXIKKworCitjbGFzcyBEY3V0TW9kdWxlKENvbXBvbmVudCk6CisKKyAgICBpbXBsZW1lbnRzKElSZXF1ZXN0SGFuZGxlcikKKyMgICAgaW1wbGVtZW50cyhJUmVxdWVzdEhhbmRsZXIsSUNoYW5nZXNldFJhbmdlTGluaykKKworICAgIGRlZiByZXZpc2lvbl9yYW5nZV9saW5rKHNlbGYsIHJlcSwgYmFzZSwgc3RhcnQsIGVuZCk6CisgICAgICAgIHJldHVybiAoJ0RDVVQgSGVscGVyJywgcmVxLmhyZWYoJ2RjdXQnLG9sZF9wYXRoPWJhc2UsbmV3X3BhdGg9YmFzZSxvbGQ9c3RhcnQsbmV3PWVuZCkpCisKKyAgICBfcmVxdWVzdF9yZSA9IHJlLmNvbXBpbGUociIvZGN1dCg/Oi8oW14vXSspKT8oLy4qKT8kIikKKworICAgIGRlZiBtYXRjaF9yZXF1ZXN0KHNlbGYsIHJlcSk6CisgICAgICAgIG1hdGNoID0gcmUubWF0Y2goc2VsZi5fcmVxdWVzdF9yZSwgcmVxLnBhdGhfaW5mbykKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXEpOgorCisgICAgICAgIGlkeCA9IDAKKyAgICAgICAgIyBzcmwKKyMgICAgICAgIHNob3dfZmlsZXMgPSBzZWxmLnRpbWVsaW5lX3Nob3dfZmlsZXMKKyAgICAgICAgZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgdGlja2V0bGlzdCA9IHt9ICAjIGRpY3Qgb2YgdGlja2V0LT4/Pz8KKyAgICAgICAgcmV2bGlzdCA9IHt9ICMgZGljdCBvZiByZXZpc2lvbi0+CisgICAgICAgICMgd2VsbC4gY2hlY2sgaXQgYWdhaW4sLgorICAgICAgICAgICAgCisgICAgICAgIHNybGRlYnVnPUZhbHNlCisgICAgICAgIAorICAgICAgICByZXBvcyA9IHNlbGYuZW52LmdldF9yZXBvc2l0b3J5KHJlcS5hdXRobmFtZSkKKyAgICAgICAgCisgICAgICAgIG5ld19wYXRoID0gcmVxLmFyZ3MuZ2V0KCduZXdfcGF0aCcpCisgICAgICAgIG5ld19yZXYgPSByZXEuYXJncy5nZXQoJ25ldycpCisgICAgICAgIG9sZF9wYXRoID0gcmVxLmFyZ3MuZ2V0KCdvbGRfcGF0aCcpCisgICAgICAgIG9sZF9yZXYgPSByZXEuYXJncy5nZXQoJ29sZCcpCisKKyAgICAgICAgbmV3X3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChuZXdfcGF0aCkKKyAgICAgICAgbmV3X3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYobmV3X3JldikKKyAgICAgICAgb2xkX3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChvbGRfcGF0aCkKKyAgICAgICAgb2xkX3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYob2xkX3JldikKKworICAgICAgICBvbGRfcmV2ID0gaW50KG9sZF9yZXYpCisgICAgICAgIG5ld19yZXYgPSBpbnQobmV3X3JldikKKyAgICAgICAgCisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5kaWZmX2hyZWYnXSA9IHJlcS5ocmVmKCdjaGFuZ2VzZXQnLG9sZF9wYXRoPW9sZF9wYXRoLG5ldz1uZXdfcmV2LG5ld19wYXRoPW5ld19wYXRoLG9sZD1vbGRfcmV2KQorCisgICAgICAgIHJlcS5oZGZbJ2lzX2RjdXQnXT0xCisgICAgICAgIAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQub2xkX3JldiddID0gb2xkX3JldgorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQubmV3X3JldiddID0gbmV3X3JldgorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQub2xkX3BhdGgnXSA9IG9sZF9wYXRoCisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5uZXdfcGF0aCddID0gbmV3X3BhdGgKKworICAgICAgICBpZiBUcnVlOgorICAgICAgICAgICAgcmVxLmhkZlsndGFyZ2V0X3BhdGgnXSA9ICcuJzsKKyAgICAgICAgICAgICMgb2theS4gbWFudWFsbHkgdHJvbXAgdGhyb3VnaCAnZW0KKyAgICAgICAgICAgIG5yZXYgPSBvbGRfcmV2KzEKKyAgICAgICAgICAgIHdoaWxlIG5yZXYgPD0gbmV3X3JldjoKKyAgICAgICAgICAgICAgICBjaGdzZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KG5yZXYpCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGNoZ3NldC5tZXNzYWdlIG9yICctLScKKyAgICAgICAgICAgICAgICAjIGNhbiB3ZSBsb2FkIGEgdGlja2V0IGZyb20gaXQ/CisgICAgICAgICAgICAgICAgc3BsaXRzPW1lc3NhZ2Uuc3BsaXQoJzonKQorICAgICAgICAgICAgICAgIGlmIG1lc3NhZ2Uuc3RhcnRzd2l0aCgndGlja2V0OicpIGFuZCBsZW4oc3BsaXRzKT4yOgorICAgICAgICAgICAgICAgICAgICB0aWNrbmFtZT1zcGxpdHNbMV0KKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdGlja251bT1pbnQodGlja25hbWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5yZXYgPSBucmV2KzEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICMgeWVzLCB3ZSBoYXZlIGEgdGlja2V0ICMKKyAgICAgICAgICAgICAgICAgICAgZmlsZXM9W10KKyAgICAgICAgICAgICAgICAgICAgZm9yIGNoZyBpbiBjaGdzZXQuZ2V0X2NoYW5nZXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjaGdbMF0uc3RhcnRzd2l0aChvbGRfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZChjaGcpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihmaWxlcyk9PTA6CisgICAgICAgICAgICAgICAgICAgICAgICBucmV2ID0gbnJldisxCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAjIG5vIHJlbGV2YW50IGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHRpdGVtPSh0aWNrbnVtLGZpbGVzLGNoZ3NldCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGlja251bSBpbiB0aWNrZXRsaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGlja2V0bGlzdFt0aWNrbnVtXS5hcHBlbmQoIHRpdGVtICkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldGxpc3RbdGlja251bV09WyB0aXRlbSBdCisgICAgICAgICAgICAgICAgICAgIHJldmxpc3RbbnJldl09dGl0ZW0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAibWFsZm9ybWVkIHRpY2tldD8gJXMgYXQgJWQiICUgKG1lc3NhZ2UsbnJldikgIyBkb24ndCBrbm93IHRoZSBzeW50YXggZm9yIGRpZS4uCisgICAgICAgICAgICAgICAgbnJldiA9IG5yZXYrMQorICAgICAgICAgICAgaWYgbGVuKHRpY2tldGxpc3QpOgorICAgICAgICAgICAgICAgIHRpY2tldHM9dGlja2V0bGlzdC5rZXlzKCkKKyAgICAgICAgICAgICAgICB0aWNrZXRzLnNvcnQoKQorICAgICAgICAgICAgICAgIGZvciB0aWNrZXQgaW4gdGlja2V0czoKKyAgICAgICAgICAgICAgICAgICAgYXRpY2tldD10aWNrZXRsaXN0W3RpY2tldF0gICMgKHRpY2tldCxmaWxlcyxjaGcpCisgICAgICAgICAgICAgICAgICAgIGNtdCA9ICd0aWNrZXQ6JWQgLSAlZCByZXZzOiAnICUgKHRpY2tldCxsZW4oYXRpY2tldCkpCisgICAgICAgICAgICAgICAgICAgIGZvciByZXYgaW4gYXRpY2tldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldm4gPSByZXZbMl0ucmV2CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlY291bnQgPSBsZW4ocmV2WzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgY210ID0gY210ICsgJ3IlZCAtICVkIGZpbGVzICgnICUgKHJldm4sZmlsZWNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZpbGUgaW4gcmV2WzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArIGZpbGVbMF0gKyAnICcKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArICcpICcKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50JyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKGNtdCwgc2VsZi5lbnYsIGRiLCAgc2hvcnRlbj1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5udW1iZXInICUgdGlja2V0XSA9IHRpY2tldAorICAgICAgICAgICAgaWYgbGVuKHJldmxpc3QpOgorICAgICAgICAgICAgICAgIHJldnM9cmV2bGlzdC5rZXlzKCkKKyAgICAgICAgICAgICAgICByZXZzLnNvcnQoKQorICAgICAgICAgICAgICAgIGZvciByZXYgaW4gcmV2czoKKyAgICAgICAgICAgICAgICAgICAgYXJldj1yZXZsaXN0W3Jldl0gICMgKHRpY2tldCxmaWxlcyxjaGcpCisgICAgICAgICAgICAgICAgICAgIGNtdCA9ICdyJWQgdGlja2V0OiVkICcgJSAoYXJldlsyXS5yZXYsYXJldlswXSkKKyAgICAgICAgICAgICAgICAgICAgZmlsZWNvdW50ID0gbGVuKGFyZXZbMV0pCisgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArICcgLSAlZCBmaWxlcyAoJyAlIGZpbGVjb3VudAorICAgICAgICAgICAgICAgICAgICBzaG9ydGZpbGVzPScnCisgICAgICAgICAgICAgICAgICAgIGogPSAwCisgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlIGluIGFyZXZbMV06CisgICAgICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLmZpbGVzLiVkLnBhdGgnICUgKHJldixqKV0gPSBmaWxlWzBdCisgICAgICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLmZpbGVzLiVkLmtpbmQnICUgKHJldixqKV0gPSBmaWxlWzFdCisgICAgICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLmZpbGVzLiVkLmNoYW5nZScgJSAocmV2LGopXSA9IGZpbGVbMl0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0cGF0aD1maWxlWzBdW2xlbihvbGRfcGF0aCkrMTpdCisgICAgICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLmZpbGVzLiVkLnNob3J0cGF0aCcgJSAocmV2LGopXSA9IHNob3J0cGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgY210ID0gY210ICsgZmlsZVswXSArICcgJworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRmaWxlcyA9IHNob3J0ZmlsZXMgKyAnICcgKyBzaG9ydHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGo9aisxCisgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArICcpICcKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5jb21tZW50JyAlIHJldl0gPSB3aWtpX3RvX29uZWxpbmVyKGNtdCwgc2VsZi5lbnYsIGRiLCAgc2hvcnRlbj1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5udW1iZXInICUgcmV2XSA9IHJldgorICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLnNob3J0ZmlsZXMnICUgcmV2XSA9IHNob3J0ZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5iYWNrbnVtYmVyJyAlIHJldl0gPSAocmV2LTEpCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQudGlja2V0JyAlIHJldl0gPSBhcmV2WzBdCisKKworIyAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZW1wbGF0ZSwgYmFzZXN0cmluZyk6CisjICAgICAgICAgICAgcmVxLmhkZlsnYWRtaW4ucGFnZV90ZW1wbGF0ZSddID0gdGVtcGxhdGUKKyMgICAgICAgIGVsc2U6CisjICAgICAgICAgICAgcmVxLmhkZlsnYWRtaW4ucGFnZV9jb250ZW50J10gPSBNYXJrdXAodGVtcGxhdGUucmVuZGVyKCkpCisKKyAgICAgICAgY29udGVudF90eXBlID0gInRleHQvaHRtbCIKKyAgICAgICAgYWRkX3N0eWxlc2hlZXQocmVxLCAnY3NzL2ljdXh0bi5jc3MnKQorICAgICAgICByZXR1cm4gJ2RjdXQuY3MnLCBjb250ZW50X3R5cGUKKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvaHRkb2NzL2Nzcy9pY3V4dG4uY3NzIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvaHRkb2NzL2Nzcy9pY3V4dG4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWU0OTUKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9odGRvY3MvY3NzL2ljdXh0bi5jc3MKQEAgLTAsMCArMSw1MyBAQAorLyogQG92ZXJyaWRlIGh0dHA6Ly9idWdzLmljdS1wcm9qZWN0Lm9yZy90cmFjL2Nocm9tZS9pY3Vjb2RldG9vbHMvY3NzL2ljdXh0bi5jc3MgKi8KKworLyogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAqLworCisvKiBAb3ZlcnJpZGUgaHR0cDovL3VuaWNvZGUub3JnL2NsZHIvdHJhYy9jaHJvbWUvaWN1Y29kZXRvb2xzL2Nzcy9pY3V4dG4uY3NzICovCisKKwordGFibGUuaWN1cmV2aWV3IHsKKwlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworCWJvcmRlcjogIDFweCBzb2xpZCBncmF5OworfQorCit0YWJsZS5pY3VyZXZpZXcgdGgsIHRhYmxlLmljdXJldmlldyB0ZCB7CisJdGV4dC1hbGlnbjogbGVmdDsKKwlib3JkZXI6ICAxcHggc29saWQgZ3JheTsKKwlwYWRkaW5nOiAgMnB4OworfQorCit0YWJsZS5pY3VyZXZpZXcgdGhlYWQgdGggeworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCit0YWJsZS5pY3VyZXZpZXcgdGQuY2hhbmdlcyB7CisJdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK3RhYmxlLmljdXJldmlldyB0ZC5vdmVyYWxsICB7CisJYmFja2dyb3VuZC1jb2xvcjogc2lsdmVyOworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwl0ZXh0LWFsaWduOiByaWdodDsKK30KKworLmJyYW5jaC11bmtub3duIHsKKwlmb250LXdlaWdodDogbm9ybWFsOworCWZvbnQtc3R5bGU6ICBpdGFsaWM7Cit9CisuYnJhbmNoLXRhZ3MgeworCWZvbnQtd2VpZ2h0OiBib2xkOworCWZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworCWNvbG9yOiAgd2hpdGU7CisJYmFja2dyb3VuZC1jb2xvcjogbmF2eTsKKwlwYWRkaW5nOiAgMXB4OworfQorLmJyYW5jaC1icmFuY2hlcyB7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwljb2xvcjogICMzNTM7Cit9CisKKy5icmFuY2gtdHJ1bmsgeworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL2h0ZG9jcy9qcy9yZXZpZXcuanMgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9odGRvY3MvanMvcmV2aWV3LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNmM3MTgKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9odGRvY3MvanMvcmV2aWV3LmpzCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEyIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgdmFyIHNldEJyYW5jaE5hbWVzID0gZnVuY3Rpb24oKSB7CisgICAgIHZhciBjc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hhbmdlc2V0dGFibGUiKTsKKyAgICAgdmFyIHRycz1jc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyIik7CisgICAgIGZvciggaT0xIDsgaSA8IHRycy5sZW5ndGggOyBpKysgKSB7CisgICAgICAgIHZhciBzZWMgPSB0cnNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJylbMF07CisgICAgICAgIHZhciBicmsgPSBzZWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKKyAgICAgICAgZm9yKGo9MDtqPGJyay5sZW5ndGg7aisrKSB7CisgICAgICAgICAgIHZhciBicmkgPSBicmtbal07CisgICAgICAgICAgIHZhciBzdHIgPSBicmkuaW5uZXJIVE1MOworICAgICAgICAgICBpZihzdHIuaW5kZXhPZigidHJ1bmsiKT4tMSkgeworICAgICAgICAgICAgICBicmkuY2xhc3NOYW1lID0gJ2JyYW5jaC10cnVuayc7CisgICAgICAgICAgIH0gZWxzZSBpZihzdHIuaW5kZXhPZigiYnJhbmNoZXMiKT4tMSkgeworICAgICAgICAgICAgICBicmkuY2xhc3NOYW1lID0gJ2JyYW5jaC1icmFuY2hlcyc7CisgICAgICAgICAgIH0gZWxzZSBpZihzdHIuaW5kZXhPZigidGFncyIpPi0xKSB7CisJICAgICAgYnJpLmNsYXNzTmFtZSA9ICdicmFuY2gtdGFncyc7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICB9CisgIH0KKworLy8gaHR0cDovL2Nrb24ud29yZHByZXNzLmNvbS8yMDA4LzA3LzI1L3N0b3AtdXNpbmctd2luZG93b25sb2FkLWluLWphdmFzY3JpcHQvCitpZiAod2luZG93LmF0dGFjaEV2ZW50KSB7d2luZG93LmF0dGFjaEV2ZW50KCdvbmxvYWQnLCBzZXRCcmFuY2hOYW1lcyk7fQorZWxzZSBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHNldEJyYW5jaE5hbWVzLCBmYWxzZSk7fQorZWxzZSB7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHNldEJyYW5jaE5hbWVzLCBmYWxzZSk7fQorCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9yZXZpZXcucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9yZXZpZXcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWUyYjVkMQotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3Jldmlldy5weQpAQCAtMCwwICsxLDMzMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyMgUmV2aWV3IG1vZHVsZS4KKyMgVE9ETzogcmVmYWN0b3IgdGlja2V0IG1hbmlwdWxhdGlvbiBpdGVtcyBpbnRvIHRpY2tldG1nci4KKworaW1wb3J0IHJlCisKK2Zyb20gdHJhYy5jb3JlIGltcG9ydCBDb21wb25lbnQsIGltcGxlbWVudHMKK2Zyb20gdHJhYy5jb3JlIGltcG9ydCBDb21wb25lbnRNYW5hZ2VyCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgVHJhY0Vycm9yCitmcm9tIHRyYWMudXRpbCBpbXBvcnQgTWFya3VwCitmcm9tIHRyYWMud2ViIGltcG9ydCBJUmVxdWVzdEhhbmRsZXIKK2Zyb20gdHJhYy53ZWIuY2hyb21lIGltcG9ydCBhZGRfc3R5bGVzaGVldCwgYWRkX3NjcmlwdCwgSVRlbXBsYXRlUHJvdmlkZXIsIGFkZF9jdHh0bmF2Citmcm9tIHRyYWMudmVyc2lvbmNvbnRyb2wgaW1wb3J0IENoYW5nZXNldAorZnJvbSB0cmFjLndlYi5hcGkgaW1wb3J0IElSZXF1ZXN0RmlsdGVyCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyCisgICAgICAgICAgICAKK2Zyb20gZ2Vuc2hpLmJ1aWxkZXIgaW1wb3J0IHRhZworI2Zyb20gdHJhYy5lbnYgaW1wb3J0IElFbnZpcm9ubWVudFNldHVwUGFydGljaXBhbnQKK2Zyb20gdHJhYy5wZXJtIGltcG9ydCBJUGVybWlzc2lvblJlcXVlc3RvcgorZnJvbSB0cmFjLmNvbmZpZyBpbXBvcnQgTGlzdE9wdGlvbgorZnJvbSBpY3Vjb2RldG9vbHMudGlja2V0bWdyIGltcG9ydCBUaWNrZXRNYW5hZ2VyCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHJlc291cmNlX2ZpbGVuYW1lICNAVW5yZXNvbHZlZEltcG9ydAorCitjbGFzcyBSZXZpZXdNb2R1bGUoQ29tcG9uZW50KToKKworICAgIGltcGxlbWVudHMoSVRlbXBsYXRlUHJvdmlkZXIsIElSZXF1ZXN0RmlsdGVyLCBJUmVxdWVzdEhhbmRsZXIsIElQZXJtaXNzaW9uUmVxdWVzdG9yKQorCisgICAgIyBwYXRoIHRvIG1hdGNoIGZvciByZXZpZXcKKyAgICBwYXRoX21hdGNoID0gcmUuY29tcGlsZShyJy9pY3VyZXZpZXcvKFswLTldKyknKQorCisgICAgdm90ZWFibGVfcGF0aHMgPSBMaXN0T3B0aW9uKCdpY3Vjb2RldG9vbHMnLCAncGF0aHMnLCAnL3RpY2tldConLAorICAgICAgICBkb2M9J0xpc3Qgb2YgVVJMIHBhdGhzIHRvIHNob3cgcmV2aWV3cyBvbi4gR2xvYnMgYXJlIHN1cHBvcnRlZC4nKQorCisgICAgIyAgc2VhcmNoIGZvciBlYXJsaWVzdCBtYXRjaCwgYW5kIGhvdyBtYW55IHNlZ21lbnRzIHRvIGluY2x1ZGUgZm9sbG93aW5nCisgICAgIyAgICB0cnVuaworICAgICMgICAgYnJhbmNoZXMvbWFpbnQvbWFpbnQtNC04CisgICAgIyAgICB0YWdzL3JlbGVhc2UtMi0wCisgICAgYnJhbmNoTGlzdCA9IFtbJ3RydW5rJywwXSxbJ2JyYW5jaGVzJywyXSxbJ3RhZ3MnLDFdXQorCisgICAgIyBJUGVybWlzc2lvblJlcXVlc3RvciBtZXRob2RzCisgICAgZGVmIGdldF9wZXJtaXNzaW9uX2FjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbJ0lDVVJFVklFV19WSUVXJ10KKworICAgICMgSVRlbXBsYXRlUHJvdmlkZXIgbWV0aG9kcworICAgIGRlZiBnZXRfdGVtcGxhdGVzX2RpcnMoc2VsZik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgIAlyZXR1cm4gW3Jlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCAndGVtcGxhdGVzJyldCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOiAKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCdDb3VsZCBub3QgZ2V0IHRlbXBsYXRlIGRpcjogJXM6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZShlKSwgZSkpCisJCXJldHVybiAiIgorCisKKyAgICBkZWYgZ2V0X2h0ZG9jc19kaXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gWygnaWN1Y29kZXRvb2xzJywgcmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sICdodGRvY3MnKSldCisKKyAgICAjIElSZXF1ZXN0RmlsdGVyIG1ldGhvZHMKKyAgICBkZWYgcHJlX3Byb2Nlc3NfcmVxdWVzdChzZWxmLCByZXEsIGhhbmRsZXIpOgorICAgICAgICBpZiAnSUNVUkVWSUVXX1ZJRVcnIG5vdCBpbiByZXEucGVybToKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVyCisKKyAgICAgICAgaWYgc2VsZi5tYXRjaF90aWNrZXRwYWdlKHJlcSk6CisgICAgICAgICAgICBzZWxmLnJlbmRlcl9yZXZpZXdsaW5rKHJlcSkKKworICAgICAgICByZXR1cm4gaGFuZGxlcgorCisgICAgZGVmIHBvc3RfcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcSwgdGVtcGxhdGUsIGRhdGEsIGNvbnRlbnRfdHlwZSk6CisgICAgICAgIHJldHVybiAodGVtcGxhdGUsIGRhdGEsIGNvbnRlbnRfdHlwZSkKKworICAgIGRlZiByZW5kZXJfcmV2aWV3bGluayhzZWxmLCByZXEpOgorICAgICAgICAjYWRkX3N0eWxlc2hlZXQocmVxLCAnaWN1Y29kZXRvb2xzL2Nzcy9pY3V4dG4uY3NzJykKKworICAgICAgICBlbHMgPSBbXQorCisgICAgICAgIHRpY2tldF9tZ3IgPSBUaWNrZXRNYW5hZ2VyKHNlbGYuY29tcG1ncikKKworICAgICAgICBkYiA9IHNlbGYuZW52LmdldF9kYl9jbngoKQorICAgICAgICByZXBvcyA9IHNlbGYuZW52LmdldF9yZXBvc2l0b3J5KCkKKyAgICAgICAgaWYgbm90IHJlcG9zOgorICAgICAgICAgICAgcmFpc2UgVHJhY0Vycm9yKCJDb3VsZCBub3QgZ2V0IHJlcG9zaXRvcnkgZm9yICVzIiAlIChyZXEuYXV0aG5hbWUpKQorCisgICAgICAgIHJldnMgPSB0aWNrZXRfbWdyLnRrdDJyZXZzKHNlbGYubG9nLCBkYiwgcmVwb3MsIHJlcSwgcmVxLmFyZ3NbJ3RpY2tldCddKQorCisgICAgICAgIGlmIG5vdCByZXZzOgorICAgICAgICAgICAgc3RyID0gJ05vIGNvbW1pdHMuJworICAgICAgICAgICAgbGkgPSB0YWcubGkoc3RyKQorICAgICAgICAgICAgZWxzLmFwcGVuZChsaSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0ciA9ICcgJWQgY29tbWl0cy4nICUgbGVuKHJldnMpCisgICAgICAgICAgICBocmVmID0gcmVxLmhyZWYucmV2aWV3KHJlcS5hcmdzWyd0aWNrZXQnXSkKKyAgICAgICAgICAgIGEgPSB0YWcuYSgnUmV2aWV3JywgaHJlZj1ocmVmKQorICAgICAgICAgICAgbGkgPSB0YWcubGkoYSArIHN0cikKKyAgICAgICAgICAgIGVscy5hcHBlbmQobGkpICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICB1bCA9IHRhZy51bChlbHMsIGNsYXNzXz0ncmV2aWV3JykKKyAgICAgICAgY2xhc3NOYW1lID0gJycKKyAgICAgICAgdGl0bGUgPSAiUmV2aWV3cyIKKyAgICAgICAgYWRkX2N0eHRuYXYocmVxLCB0YWcuc3Bhbih0YWcub2JqZWN0KHVsKSwgaWQ9J2ljdXJldmlldycsIHRpdGxlPXRpdGxlLCBjbGFzc189Y2xhc3NOYW1lKSkKKworCisgICAgZGVmIG1hdGNoX3JlcXVlc3Qoc2VsZiwgcmVxKToKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaCgnL3Jldmlldyg/Oi8oW14vXSspKT8oPzovKFteL10rKSk/KD86LyguKikkKT8nLCByZXEucGF0aF9pbmZvKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJlcS5hcmdzWyd0aWNrZXQnXSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIG1hdGNoX3RpY2tldHBhZ2Uoc2VsZiwgcmVxKToKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaCgnL3RpY2tldCg/Oi8oW14vXSspKT8oPzovKFteL10rKSk/KD86LyguKikkKT8nLCByZXEucGF0aF9pbmZvKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJlcS5hcmdzWyd0aWNrZXQnXSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBhdGhUb0JyYW5jaE5hbWUoc2VsZiwgcGF0aCk6CisgICAgICAgICNyZXR1cm4gJy8nLmpvaW4ocGF0aC5zcGxpdCgnLycpWzA6Ml0pCisgICAgICAgIHdpbmRleCA9IE5vbmUKKyAgICAgICAgd2luID0gTm9uZQorICAgICAgICBmb3IgYnJhbmNoIGluIHNlbGYuYnJhbmNoTGlzdDoKKyAgICAgICAgICAgIGlmKHBhdGggPT0gYnJhbmNoWzBdKTogICMgY2F0Y2ggY2hhbmdlcyB0byBqdXN0ICd0cnVuaycKKyAgICAgICAgICAgICAgICBpZHggPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlkeCA9IHBhdGguZmluZChicmFuY2hbMF0rJy8nKQorICAgICAgICAgICAgaWYoaWR4ID4gLTEgYW5kICh3aW5kZXggPT0gTm9uZSBvciB3aW5kZXggPiBpZHgpKToKKyAgICAgICAgICAgICAgICB3aW5kZXggPSBpZHgKKyAgICAgICAgICAgICAgICB3aW4gPSBicmFuY2gKKyAgICAgICAgaWYgd2luZGV4ID09IE5vbmU6CisgICAgICAgICAgICBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy8nKQorICAgICAgICAgICAgcmV0dXJuICcvJy5qb2luKHNlZ21lbnRzWzA6Ml0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjcHJpbnQgImZvdW5kICVzIGZvbGwgJXMgQCAlZCIgJSAod2luWzBdLHdpblsxXSx3aW5kZXgpCisgICAgICAgICAgICBzZWdtZW50cyA9IHBhdGhbd2luZGV4Ol0uc3BsaXQoJy8nKQorICAgICAgICAgICAgcmV0dXJuIHBhdGhbOndpbmRleF0gKyAoJy8nLmpvaW4oc2VnbWVudHNbMDp3aW5bMV0rMV0pKSAjIHVzZSBzcGVjaWZpZWQgIyBvZiBmb2xsb3dpbmcgc2VnbWVudHMKKworICAgIGRlZiBjaGFuZ2VUb1JhbmdlKHNlbGYsIGNfbmV3LCBjaGFuZ2UpOgorICAgICAgICAjIHE6ICh1J3RydW5rL0xvY2FsZS5qYXZhJywgJ2ZpbGUnLCAnYWRkJywgTm9uZSwgdSctMScpICBmcm9tIHIzCisgICAgICAgICMgcTogKHUndHJ1bmsvdXRpbC5jJywgICAgICAnZmlsZScsICdlZGl0JywgdSd0cnVuay91dGlsLmMnLCB1JzInKSAgZnJvbSByNAorIyAgICAgICAgY19wYXRoID0gY2hhbmdlWzBdCisjICAgICAgICBjX2l0ZW10eXBlID0gY2hhbmdlWzFdCisgICAgICAgIGNfdHlwZSA9IGNoYW5nZVsyXQorICAgICAgICBjX29sZHBhdGggPSBjaGFuZ2VbM10KKyAgICAgICAgY19vbGQgPSBpbnQoY2hhbmdlWzRdIG9yIC0xKQorICAgICAgICBpZihjX3R5cGUgaW4gKENoYW5nZXNldC5DT1BZLENoYW5nZXNldC5NT1ZFKSk6CisgICAgICAgICAgICByZXR1cm4gKC0xLCBjX25ldywgY190eXBlLCBjX29sZCwgY19vbGRwYXRoKSAjIGlnbm9yZSBPTEQgcmV2IGZvciB0aGVzZQorICAgICAgICBlbGlmKGNfdHlwZSBpbiAoQ2hhbmdlc2V0LkRFTEVURSkpOgorICAgICAgICAgICAgcmV0dXJuIChjX29sZCwgLTEsIGNfdHlwZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoY19vbGQsIGNfbmV3LCBjX3R5cGUpCisgICAgICAgIAorICAgIGRlZiBkZXNjcmliZUNoYW5nZShzZWxmLCBmaWxlLCBjaGFuZ2UsIHJlcSwgZGIpOgorICAgICAgICB3aGF0ID0gY2hhbmdlWzJdIG9yICdjaGFuZ2UnCisgICAgICAgIHdoZXJlID0gJ3IlZDolZCcgJSAoY2hhbmdlWzBdLGNoYW5nZVsxXSkKKyAgICAgICAgaWYoY2hhbmdlWzBdID09IC0xKToKKyAgICAgICAgICAgIGlmKGNoYW5nZVsxXSA9PSAtMSk6CisgICAgICAgICAgICAgICAgdXJsID0gTm9uZQorICAgICAgICAgICAgICAgIHdoYXQgPSAibm9vcCIKKyAgICAgICAgICAgICAgICB3aGVyZSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgI2lmIGNoYW5nZVsyXSA9PSAnYWRkK2NvbW1pdHMnOgorICAgICAgICAgICAgICAgIHVybCA9IHJlcS5ocmVmLmJyb3dzZXIoZmlsZSwgcmV2PWNoYW5nZVsxXSkgIyAnYWRkJworICAgICAgICAgICAgICAgIHdoZXJlID0gJ3IlZCcgJSBjaGFuZ2VbMV0KKyAgICAgICAgICAgICAgICB3aGF0ID0gY2hhbmdlWzJdCisgICAgICAgIGVsaWYoY2hhbmdlWzFdID09IC0xKToKKyAgICAgICAgICAgIHVybCA9IE5vbmUgIyBkZWxldGVkCisgICAgICAgICAgICB3aGF0ID0gImRlbGV0ZWQiCisgICAgICAgICAgICB3aGVyZSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVybCA9IHJlcS5ocmVmLmNoYW5nZXNldChvbGRfcGF0aD1maWxlLCBvbGQ9Y2hhbmdlWzBdLCBuZXdfcGF0aD1maWxlLCBuZXc9Y2hhbmdlWzFdKQorICAgICAgICBpZiB1cmw6CisgICAgICAgICAgICB3aGF0ID0gTWFya3VwKCc8YSBocmVmPSIlcyI+JXM8L2E+JyAlICh1cmwsd2hhdCkpCisgICAgICAgIGlmIHdoZXJlOgorICAgICAgICAgICAgcmV0dXJuICh3aGF0LCB0YWcuYSh3aGVyZSwgaHJlZj1yZXEuaHJlZi5zZWFyY2gocT13aGVyZSkpKQorICAgICAgICAgICAgI3JldHVybiAod2hhdCwgd2hlcmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKHdoYXQsICcnKQorCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcSk6CisgICAgICAgICNvaywgd2hhdCBhcmUgd2UgYWJvdXQuCisgICAgICAgICNkYiA9IHNlbGYuZW52LmdldF9kYl9jbngoKQorICAgICAgICAjdGlja2V0bGlzdCA9IHt9ICAjIGRpY3Qgb2YgdGlja2V0LT4/Pz8KKyAgICAgICAgI3Jldmxpc3QgPSB7fSAjIGRpY3Qgb2YgcmV2aXNpb24tPgorICAgICAgICByZXBvcyA9IHNlbGYuZW52LmdldF9yZXBvc2l0b3J5KCkKKworICAgICAgICBuZXdfcGF0aCA9IHJlcS5hcmdzLmdldCgnbmV3X3BhdGgnKQorICAgICAgICBuZXdfcmV2ID0gcmVxLmFyZ3MuZ2V0KCduZXcnKQorICAgICAgICBvbGRfcGF0aCA9IHJlcS5hcmdzLmdldCgnb2xkX3BhdGgnKQorICAgICAgICBvbGRfcmV2ID0gcmVxLmFyZ3MuZ2V0KCdvbGQnKQorCisgICAgICAgIG5ld19wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgobmV3X3BhdGgpCisgICAgICAgIG5ld19yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG5ld19yZXYpCisgICAgICAgIG9sZF9wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgob2xkX3BhdGgpCisgICAgICAgIG9sZF9yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG9sZF9yZXYpCisgICAgICAgIAorCisjICAgICAgICBpZiBub3QgcmVxLnBlcm0uaGFzX3Blcm1pc3Npb24oJ1RJQ0tFVF9NT0RJRlknKToKKyMgICAgICAgICAgICByZXR1cm4gcmVxLnJlZGlyZWN0KHJlcS5ocmVmLmJyb3dzZXIoKSkKKworICAgICAgICBvbGRfcmV2ID0gaW50KG9sZF9yZXYpCisgICAgICAgIG5ld19yZXYgPSBpbnQobmV3X3JldikKKyAgICAgICAgCisgICAgICAgIHRpY2tldCA9IHJlcS5hcmdzLmdldCgndGlja2V0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGlja2V0ID0gaW50KHRpY2tldCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHRpY2tldCA9IDAKKyMgICAgICAgIHJlcS5oZGZbJ3Jldmlldy50aWNrZXQnXSA9IHRpY2tldAorIyAgICAgICAgcmVxLmhkZlsncmV2aWV3LnRpY2tldGh0bWwnXSA9IHRhZy5hKHRpY2tldCwgcmVxLmhyZWYudGlja2V0KHRpY2tldCkpCisKKyAgICAgICAgZGF0YSA9IHt9CisKKyAgICAgICAgZGF0YVsnb3ZlcmFsbF95J10gPSAwCisgICAgICAgIGRhdGFbJ3RpY2tldF9pZCddID0gcmVxLmFyZ3NbJ3RpY2tldCddCisgICAgICAgIGRhdGFbJ3RpY2tldF9ocmVmJ10gPSByZXEuaHJlZi50aWNrZXQocmVxLmFyZ3NbJ3RpY2tldCddKQorCisgICAgICAgIHRpY2tldF9tZ3IgPSBUaWNrZXRNYW5hZ2VyKHNlbGYuY29tcG1ncikKKworICAgICAgICBkYiA9IHNlbGYuZW52LmdldF9kYl9jbngoKQorICAgICAgICByZXBvcyA9IHNlbGYuZW52LmdldF9yZXBvc2l0b3J5KCkKKworICAgICAgICByZXZzID0gdGlja2V0X21nci50a3QycmV2cyhzZWxmLmxvZywgZGIsIHJlcG9zLCByZXEsIHJlcS5hcmdzWyd0aWNrZXQnXSkKKyAgICAgICAgCisgICAgICAgIGlmIChub3QgcmV2cyBvciBsZW4ocmV2cyk9PTApOgorICAgICAgICAgICAgIyBub3RoaW5nIHRvIHJldmlldy4gc2hvdWxkbid0IGhhcHBlbgorICAgICAgICAgICAgcmV0dXJuICgnbm90aGluZy5odG1sJywgZGF0YSwgJ3RleHQvaHRtbCcpCisgICAgICAgIGVsaWYobGVuKHJldnMpPT0xKToKKyAgICAgICAgICAgICMgb25seSBvbmUgY2hhbmdlIC0ganVzdCBkbyBhIGNoYW5nZXNldCB2aWV3CisgICAgICAgICAgICByZXR1cm4gcmVxLnJlZGlyZWN0KHJlcS5ocmVmLmNoYW5nZXNldChyZXZzWzBdKSkKKworICAgICAgICByZXZjb3VudCA9IDAKKyAgICAgICAgYnJhbmNoZXMgPSB7fQorICAgICAgICBmaWxlcyA9IHt9CisgICAgICAgICMgbWF5IGJlIDAgcmV2cy4KKyAgICAgICAgcmV2aXNpb25zID0gW10KKyAgICAgICAgCisgICAgICAgIGZvciByZXYgaW4gcmV2czoKKyAgICAgICAgICAgIGNoZ3NldCA9IHJlcG9zLmdldF9jaGFuZ2VzZXQocmV2KQorICAgICAgICAgICAgIyBxOiAodSd0cnVuay9Mb2NhbGUuamF2YScsICdmaWxlJywgJ2FkZCcsIE5vbmUsIHUnLTEnKSAgZnJvbSByMworICAgICAgICAgICAgIyBxOiAodSd0cnVuay91dGlsLmMnLCAnZmlsZScsICdlZGl0JywgdSd0cnVuay91dGlsLmMnLCB1JzInKSAgZnJvbSByNAorICAgICAgICAgICAgbWVzc2FnZSA9IGNoZ3NldC5tZXNzYWdlIG9yICctLScKKyAgICAgICAgICAgIHJldmNvdW50ID0gcmV2Y291bnQgKyAxCisgICAgICAgICAgICByZXZpc2lvbiA9IHt9CisgICAgICAgICAgICByZXZpc2lvblsncmV2J10gPSAgdGFnLmEocmV2LCByZXEuaHJlZi5jaGFuZ2VzZXQocmV2KSkKKyAgICAgICAgICAgIHJldmlzaW9uWydudW0nXSA9ICByZXYKKyAgICAgICAgICAgIHJldmlzaW9uWydjb21tZW50J10gPSAgbWVzc2FnZSAjd2lraV90b19vbmVsaW5lciggbWVzc2FnZSwgc2VsZi5lbnYsIGRiLCBzaG9ydGVuPUZhbHNlICkKKyAgICAgICAgICAgIHJicmFuY2hlcyA9IHJldmlzaW9uWydicmFuY2hlcyddID0gW10KKyAgICAgICAgICAgIGZvciBjaGcgaW4gY2hnc2V0LmdldF9jaGFuZ2VzKCk6CisgICAgICAgICAgICAgICAgcGF0aCA9IGNoZ1swXQorICAgICAgICAgICAgICAgIGlmIHBhdGggaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBmaWxlc1twYXRoXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBbXQorICAgICAgICAgICAgICAgICAgICBmaWxlc1twYXRoXSA9IGl0ZW07CisgICAgICAgICAgICAgICAgaXRlbS5hcHBlbmQoc2VsZi5jaGFuZ2VUb1JhbmdlKHJldixjaGcpKQorICAgICAgICAgICAgICAgIGJyYW5jaF9uYW1lID0gc2VsZi5wYXRoVG9CcmFuY2hOYW1lKHBhdGgpCisgICAgICAgICAgICAgICAgaWYgYnJhbmNoX25hbWUgbm90IGluIHJicmFuY2hlczoKKyAgICAgICAgICAgICAgICAgICAgcmJyYW5jaGVzLmFwcGVuZChicmFuY2hfbmFtZSkKKyAgICAgICAgICAgIHJldmlzaW9ucy5hcHBlbmQocmV2aXNpb24pCisgICAgICAgIGRhdGFbJ3JldmlzaW9ucyddID0gcmV2aXNpb25zCisgICAgICAgIAorICAgICAgICBpZihyZXZjb3VudCA+IDApOgorICAgICAgICAgICAgZGF0YVsncmV2Y291bnQnXSA9IHJldmNvdW50CisgICAgICAgIAorICAgICAgICAjIHByaW50ICJmaWxlczogJWQiICUgbGVuKGZpbGVzKQorICAgICAgICAjIGdvIHRocm91aGcgZWFjaCBmaWxlIGFuZCBjYWxjdWxhdGUgaXRzIG1pbmltdW0gcmFuZ2UKKyAgICAgICAgZmlsZWxpc3QgPSBmaWxlcy5rZXlzKCkKKyAgICAgICAgZmlsZWxpc3Quc29ydCgpCisjICAgICAgICBwcmludCAnYmFyIHRvICVkIGxlbiBvZiAlcycgJSAobGVuKGZpbGVsaXN0KSxzdHIoZmlsZWxpc3QpKQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgIGNoYW5nZXMgPSBmaWxlc1tmaWxlXQorICAgICAgICAgICAgaSA9IDAKKyMgICAgICAgICAgICBwcmludCAiIGxvb3BpbmcgZnJvbSAlZCB0byAlZCBvdmVyICVkICIgJSAoaSxsZW4oY2hhbmdlcyktMSxsZW4oY2hhbmdlcykpCisgICAgICAgICAgICB3aGlsZSBsZW4oY2hhbmdlcyk+MSBhbmQgaTwobGVuKGNoYW5nZXMpLTEpOgorICAgICAgICAgICAgICAgIGlmIGNoYW5nZXNbaV1bMV0gPT0gY2hhbmdlc1tpKzFdWzBdOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFuZ2VzW2ldWzBdID09IC0xOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1tpKzFdID0gKGNoYW5nZXNbaV1bMF0sY2hhbmdlc1tpKzFdWzFdLCdhZGQrY29tbWl0cycpICMgcmV0YWluICdmaXJzdCcgcmV2CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzW2krMV0gPSAoY2hhbmdlc1tpXVswXSxjaGFuZ2VzW2krMV1bMV0sJ211bHRpcGxlIGNvbW1pdHMnKSAjIHJldGFpbiAnZmlyc3QnIHJldgorCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzWzppXSArIGNoYW5nZXNbaSsxOl0gIyBhbmQgc2hpZnQgZG93bgorIyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIm1lcmdlZDogJXMiICUgc3RyKGNoYW5nZXMpCisgICAgICAgICAgICAgICAgICAgIGZpbGVzW2ZpbGVdID0gY2hhbmdlcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAKKyAgICAgICAgIyBub3csIHdyaXRlICdlbSBvdXQKKyAgICAgICAgc2VyYSA9IDAKKyAgICAgICAgI2ZpbGVzX2RhdGEgPSBbXQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgIHNlcmEgPSBzZXJhKzEKKyAgICAgICAgICAgIGZpbGVfZGF0YSA9IHt9CisgICAgICAgICAgICBmaWxlX2RhdGFbJ25hbWUnXSA9IE1hcmt1cCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAocmVxLmhyZWYuYnJvd3NlcihmaWxlKSxmaWxlKSkKKyAgICAgICAgICAgIGJyYW5jaF9uYW1lID0gc2VsZi5wYXRoVG9CcmFuY2hOYW1lKGZpbGUpCisgICAgICAgICAgICAjcHJpbnQgImJyYW5jaCBpczogKCVzKSIgJSAoYnJhbmNoX25hbWUpCisgICAgICAgICAgICBicmFuY2hlc19kYXRhID0gYnJhbmNoZXMuZ2V0KGJyYW5jaF9uYW1lLCB7fSkKKyAgICAgICAgICAgIGZpbGVzX2RhdGEgPSBicmFuY2hlc19kYXRhLmdldCgnZmlsZXMnLFtdKQorCisgICAgICAgICAgICBjaGFuZ2VzID0gZmlsZXNbZmlsZV0KKyAgICAgICAgICAgIGNoYSA9IDAKKyAgICAgICAgICAgIGNoYW5nZXNfZGF0YSA9IFtdCisgICAgICAgICAgICBmb3IgY2hhbmdlIGluIGNoYW5nZXM6CisgICAgICAgICAgICAgICAgY2hhID0gY2hhICsgMQorIyAgICAgICAgICAgICAgICBwcmludCAiJXMgb3V0cHV0ICVzICIgJSAoZmlsZSwgc3RyKGNoYW5nZSkpCisgICAgICAgICAgICAgICAgY2hhbmdlc19kYXRhLmFwcGVuZChzZWxmLmRlc2NyaWJlQ2hhbmdlKGZpbGUsIGNoYW5nZSwgcmVxLCBkYikpCisgICAgICAgICAgICBmaWxlX2RhdGFbJ2NoYW5nZXMnXSA9IGNoYW5nZXNfZGF0YQorICAgICAgICAgICAgaWYobGVuKGNoYW5nZXMpPjEpOgorICAgICAgICAgICAgICAgIHdoYXRodG1sID0gc2VsZi5kZXNjcmliZUNoYW5nZShmaWxlLCAoY2hhbmdlc1swXVswXSwgY2hhbmdlc1tsZW4oY2hhbmdlcyktMV1bMV0sICdvdmVyYWxsJyksIHJlcSwgZGIpCisgICAgICAgICAgICAgICAgZmlsZV9kYXRhWydvdmVyYWxsJ10gPSB3aGF0aHRtbAorICAgICAgICAgICAgICAgIGZpbGVfZGF0YVsnb3ZlcmFsbF95J10gPSAxCisgICAgICAgICAgICAgICAgZGF0YVsnb3ZlcmFsbF95J10gPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGVfZGF0YVsnb3ZlcmFsbF95J10gPSAwCisgICAgICAgICAgICBmaWxlc19kYXRhLmFwcGVuZChmaWxlX2RhdGEpCisgICAgICAgICAgICAjIHNldHMKKyAgICAgICAgICAgIGJyYW5jaGVzX2RhdGFbJ2ZpbGVzJ10gPSBmaWxlc19kYXRhCisgICAgICAgICAgICBicmFuY2hlc19kYXRhWydsZW4nXSA9IGxlbihmaWxlc19kYXRhKQorICAgICAgICAgICAgYnJhbmNoZXNfZGF0YVsnbmFtZSddID0gYnJhbmNoX25hbWUKKyAgICAgICAgICAgIGJyYW5jaGVzW2JyYW5jaF9uYW1lXSA9IGJyYW5jaGVzX2RhdGEKKworICAgICAgICAjIC4uIGNvbnZlcnQgZGljdCB0byBhcnJheS4KKyAgICAgICAgYnJhbmNoX2xpc3QgPSBbXQorICAgICAgICBmb3IgYnJhbmNoIGluIGJyYW5jaGVzOgorICAgICAgICAgICAgYnJhbmNoX2xpc3QuYXBwZW5kKGJyYW5jaGVzW2JyYW5jaF0pCisgICAgICAgIGRhdGFbJ2JyYW5jaGVzJ10gPSBicmFuY2hfbGlzdAorICAgICAgICBkYXRhWydsYXN0YnJhbmNoJ10gPSBicmFuY2gKKyAgICAgICAgZGF0YVsnYnJhbmNoY291bnQnXSA9IGxlbihicmFuY2hlcykKKyAgICAgICAgCisgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiCisgICAgICAgIGFkZF9zdHlsZXNoZWV0KHJlcSwgJ2ljdWNvZGV0b29scy9jc3MvaWN1eHRuLmNzcycpCisgICAgICAgIGFkZF9zY3JpcHQocmVxLCAnaWN1Y29kZXRvb2xzL2pzL3Jldmlldy5qcycpCisgICAgICAgIHJldHVybiAncmV2aWV3Lmh0bWwnLCBkYXRhLCBjb250ZW50X3R5cGUKKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL25vdGhpbmcuaHRtbCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhOWVlNAotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwKQEAgLTAsMCArMSwyNSBAQAorPCFET0NUWVBFIGh0bWwKKyAgICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgICAgICB4bWxuczpweT0iaHR0cDovL2dlbnNoaS5lZGdld2FsbC5vcmcvIgorICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICA8eGk6aW5jbHVkZSBocmVmPSJsYXlvdXQuaHRtbCIgLz4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPk5vdGhpbmcgdG8gUmV2aWV3IGZvciB0aWNrZXQgIyR7dGlja2V0X2lkfTwvdGl0bGU+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJjdHh0bmF2IiBjbGFzcz0ibmF2Ij48L2Rpdj4KKworICAgIDxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJpY3Vjb2RlcmV2aWV3Ij4KKyAgICAgIDxoMT5Ob3RoaW5nIHRvIHJldmlldyE8L2gxPgorICAgICAgPHA+CisgICAgICAJTm90aGluZyB0byByZXZpZXcgLSBubyBjaGFuZ2VzZXRzIGluIHRpY2tldCA8YSBocmVmPSIke3RpY2tldF9ocmVmfSI+IyR7dGlja2V0X2lkfTwvYT4KKyAgICAgIDwvcD4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzA5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90ZW1wbGF0ZXMvcmV2aWV3Lmh0bWwKQEAgLTAsMCArMSwxMzcgQEAKKzwhRE9DVFlQRSBodG1sCisgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEyIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgorICAgICAgeG1sbnM6cHk9Imh0dHA6Ly9nZW5zaGkuZWRnZXdhbGwub3JnLyIKKyAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ibGF5b3V0Lmh0bWwiIC8+CisgIDxoZWFkPgorICAgIDx0aXRsZT5SZXZpZXcgZm9yIHRpY2tldCAjJHt0aWNrZXRfaWR9PC90aXRsZT4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorICAgIDxkaXYgaWQ9ImN0eHRuYXYiIGNsYXNzPSJuYXYiPjwvZGl2PgorCisgICAgPGRpdiBpZD0iY29udGVudCIgY2xhc3M9ImljdWNvZGVyZXZpZXciPgorCisKKyA8aDE+VGlja2V0IDxhIGhyZWY9JyR7aHJlZi50aWNrZXQodGlja2V0X2lkKX0nPiMke3RpY2tldF9pZH08L2E+PC9oMT4KKworPHB5OmlmIHRlc3Q9InJldmNvdW50Ij4KKworICA8aDI+JHtyZXZjb3VudH0gQ2hhbmdlc2V0czwvaDI+CisgIDx0YWJsZSBpZD0nY2hhbmdlc2V0dGFibGUnIGNsYXNzPSdpY3VyZXZpZXcnPgorICAgIDx0aGVhZD4KKyAgICAgIDx0cj4KKwk8dGg+cjwvdGg+CisJPHRoPnNlY3Rpb24ocyk8L3RoPgorCTx0aD5jb21tZW50PC90aD4KKyAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+CisgICAgICA8cHk6Zm9yIGVhY2g9InJldiBpbiByZXZpc2lvbnMiPgorCTx0cj4KKwkgIDx0aD4KKwkgICAgPGEgaHJlZj0iJHtocmVmLmNoYW5nZXNldChyZXYubnVtKX0iPnIke3Jldi5udW19PC9hPgorCSAgPC90aD4KKwkgIDx0ZD4KKwkgICAgPCEtLSBzZWN0aW9ucyAtLT4KKwkgICAgPHB5OmZvciBlYWNoPSJicmFuY2ggaW4gcmV2LmJyYW5jaGVzIj4KKwkgICAgICA8YiBjbGFzcz0nYnJhbmNobGlzdCc+CisJCTxhIGNsYXNzPSdicmFuY2gtdW5rbm93bicgaHJlZj0iIyR7YnJhbmNofSI+JHticmFuY2h9PC9hPiAKKwkgICAgICA8L2I+CisJICAgIDwvcHk6Zm9yPgorCSAgPC90ZD4KKwkgIDx0ZD4KKwkgICAgJHtyZXYuY29tbWVudH0KKwkgIDwvdGQ+CisJPC90cj4KKyAgICAgIDwvcHk6Zm9yPgorICAgIDwvdGJvZHk+CisgIDwvdGFibGU+CisgIAorPHB5OmlmIHRlc3Q9ImJyYW5jaGNvdW50ID4gMSI+Cis8aDI+RmlsZXM8L2gyPgorPGgzPkp1bXAgdG8gU2VjdGlvbnM8L2gzPgorPHVsPgorPHB5OmZvciBlYWNoPSJicmFuY2ggaW4gYnJhbmNoZXMiPgorICA8bGk+PGEgaHJlZj0iIyR7YnJhbmNoLm5hbWV9Ij4ke2JyYW5jaC5uYW1lfTwvYT4gJm1kYXNoOyAke2JyYW5jaC5sZW59IGZpbGVzPC9saT4KKzwvcHk6Zm9yPgorPC91bD4KKzwvcHk6aWY+CisKKzxweTpmb3IgZWFjaD0iYnJhbmNoIGluIGJyYW5jaGVzIj4KKzxoci8+Cis8YSBuYW1lPSIke2JyYW5jaC5uYW1lfSI+CisgIDxoMz4KKyAgICAgICAgPGEgaHJlZj0iJHtocmVmLmJyb3dzZXIoYnJhbmNoLm5hbWUpfSI+JHticmFuY2gubmFtZX08L2E+ICZtZGFzaDsgKCR7YnJhbmNoLmxlbn0gZmlsZXMgY2hhbmdlZCkKKyAgPC9oMz4KKzwvYT4KKworPGJsb2NrcXVvdGU+CisKKzx0YWJsZSBjbGFzcz0naWN1cmV2aWV3Jz4KKzx0aGVhZD4KKzx0cj4KKyA8dGg+RmlsZTwvdGg+CisgPHRoPkNoYW5nZXM8L3RoPgorIDx0aD5EZXRhaWxzPC90aD4KKyA8cHk6aWYgdGVzdD0ib3ZlcmFsbF95ID4gMCI+IAorICA8dGg+T3ZlcmFsbDxici8+PGk+KGluY2x1ZGluZyBvdGhlciBjaGFuZ2VzKTwvaT48L3RoPgorICA8dGg+RGV0YWlsczwvdGg+CisgPC9weTppZj4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHB5OmZvciBlYWNoPSJmaWxlIGluIGJyYW5jaC5maWxlcyI+CisgPHRyPgorICAgIDx0aCBjbGFzcz0nbmFtZSc+JHtmaWxlLm5hbWV9PC90aD4KKyAgICA8dGQgY2xhc3M9J2NoYW5nZXMnPgorICAgICAgPHB5OmZvciBlYWNoPSJjaGFuZ2UgaW4gZmlsZS5jaGFuZ2VzIj4KKyAgICAgICAgJHtjaGFuZ2VbMF19PGJyLz4KKyAgICAgIDwvcHk6Zm9yPgorICAgIDwvdGQ+CisgICAgPHRkIGNsYXNzPSdkZXRhaWxzJz4KKyAgICAgIDxweTpmb3IgZWFjaD0iY2hhbmdlIGluIGZpbGUuY2hhbmdlcyI+CisgICAgICAgICR7Y2hhbmdlWzFdfTxici8+CisgICAgICA8L3B5OmZvcj4KKyAgICA8L3RkPgorCSAgCisgICAgPHB5OmlmIHRlc3Q9Im92ZXJhbGxfeSA+IDAiPiAKKyAgICAgPHB5OmlmIHRlc3Q9ImZpbGUub3ZlcmFsbF95ID4gMCI+CisgICAgICA8dGQgY2xhc3M9J292ZXJhbGwnPiR7ZmlsZS5vdmVyYWxsWzBdfTwvdGQ+CisgICAgICA8dGQgY2xhc3M9J292ZXJhbGwnPiR7ZmlsZS5vdmVyYWxsWzFdfTwvdGQ+CisgICAgIDwvcHk6aWY+CisgICAgPC9weTppZj4KKyAgPC90cj4KKzwvcHk6Zm9yPgorPC90Ym9keT4KKzwvdGFibGU+CisKKzwvYmxvY2txdW90ZT4KKworPC9weTpmb3I+CisKKzxoci8+CisKKzxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPgorPGgyPk1lcmdlIENvbW1hbmRzPC9oMj4KK1ZlcnkgZXhwZXJpbWVudGFsLiAgQ2hhbmdlID8/PyB0byB0aGUgdG9wIG9mIHRoZSB0cmVlIHlvdSB3YW50IHRvIG1lcmdlIGZyb20gKGljdSBvciBpY3U0aik8YnIvPgorPHRleHRhcmVhPnN2biBtZXJnZSAtYyA8P2NzIGVhY2g6cmV2ID0gcmV2aXNpb25zID8+PD9jcyB2YXI6cmV2Lm51bSA/Piw8P2NzIC9lYWNoID8+IHN2bitzc2g6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL3JlcG9zL2ljdS8/Pz8vdHJ1bms8L3RleHRhcmVhPgorCis8aHIvPgorPC9kaXY+Cis8aHIvPgorPGlmcmFtZSBzcmM9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvaWN1Y29kZXRvb2xzL3YxL3JldmlldyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iODAwcHgiPgorPGgxPjxhIGhyZWY9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvaWN1Y29kZXRvb2xzL3YxL3JldmlldyI+SGVscDwvYT48L2gxPgorPC9pZnJhbWU+CisKKzwvcHk6aWY+Cis8aHIvPgorPGk+JElkOiAkPC9pPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQ4YjhiYwotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RpY2tldG1nci5weQpAQCAtMCwwICsxLDE5NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgQXV0aG9yOiA8c3JsQGljdS1wcm9qZWN0Lm9yZz4KKyMKKworIyAKKyMgVGlja2V0IG1hbmFnZW1lbnQuCisjIFRoaXMgY29tcG9uZW50IG1hbmFnZXMgdGhlIHJldmlzaW9uIHRvIHRpY2tldCBtYXAuCisjCisjIDIwMTEtamFuLTI3CXNybAlhZGRpbmcgSVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lciBmdW5jdGlvbmFsaXR5IChyZXF1aXJlcyB0cmFjIDAuMTIpCisKKworCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgQ29tcG9uZW50LCBpbXBsZW1lbnRzLCBUcmFjRXJyb3IKK2Zyb20gdHJhYy5lbnYgaW1wb3J0IElFbnZpcm9ubWVudFNldHVwUGFydGljaXBhbnQKK2Zyb20gdHJhYy5kYiBpbXBvcnQgVGFibGUsIENvbHVtbiwgSW5kZXgsIERhdGFiYXNlTWFuYWdlcgorZnJvbSB0cmFjLmNvbmZpZyBpbXBvcnQgT3B0aW9uCitmcm9tIHRyYWMudXRpbC50ZXh0IGltcG9ydCBleGNlcHRpb25fdG9fdW5pY29kZQorZnJvbSB0cmFjLnZlcnNpb25jb250cm9sLmFwaSBpbXBvcnQgSVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcgorCitpbXBvcnQgcmUKKwordGt0bWdyX3NjaGVtYSA9IFsKKyAgICBUYWJsZSgncmV2MnRpY2tldCcsIGtleT0ncmV2JylbICAgICAgICAgIyBtYXAgcmV2LT50aWNrZXQKKyAgICAgICAgQ29sdW1uKCdyZXYnLCB0eXBlPSdpbnQnKSwgICAgICAgICAgIyBjaGFuZ2VzZXQgaWQKKyAgICAgICAgQ29sdW1uKCd0aWNrZXQnLCB0eXBlPSdpbnQnKSwgICAgICAgIyB0aWNrZXQgIworICAgICAgICBJbmRleChbJ3RpY2tldCddKV0sICAgICAgICAgICAgICAgICAjIGluZGV4IGJ5IHRpY2tldAorXQorCitjbGFzcyBUaWNrZXRNYW5hZ2VyKENvbXBvbmVudCk6CisgICAgaW1wbGVtZW50cyhJRW52aXJvbm1lbnRTZXR1cFBhcnRpY2lwYW50LCBJUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKQorCisgICAgdGlja2V0X3BhdHRlcm4gPSBPcHRpb24oJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdedGlja2V0OihcZCspJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiQSByZWdleCBtYXRjaGluZyB0aGUgY29tbWl0IG1lc3NhZ2VzLiBHcm91cCAxIG11c3QgcmV0dXJuIGEgbnVtYmVyLiIiIikKKyAgICAKKyAgICBkZWYgaWN1X3RrdG1ncihzZWxmKToKKyAgICAgICAgcmV0dXJuIDE7CisgICAgCisgICAga25vd25feW91bmdlc3QgPSAtMQorCisgICAgZGVmIGVudmlyb25tZW50X2NyZWF0ZWQoc2VsZik6CisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIGNvbm5lY3RvciwgXyA9IERhdGFiYXNlTWFuYWdlcihzZWxmLmVudikuX2dldF9jb25uZWN0b3IoKQorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBmb3IgdGFibGUgaW4gdGt0bWdyX3NjaGVtYToKKyAgICAgICAgICAgIGZvciBzdG10IGluIGNvbm5lY3Rvci50b19zcWwodGFibGUpOgorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKHN0bXQpCisKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIklOU0VSVCBJTlRPIHN5c3RlbSAobmFtZSx2YWx1ZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICgnaWN1X3RrdG1ncicsJXMpIiwgKHNlbGYuaWN1X3RrdG1ncigpLCkpCisgICAgICAgIGRiLmNvbW1pdCgpCisgICAgICAgIHNlbGYubG9nLmluZm8oJ0RhdGFiYXNlIHVwZGF0ZTogaWN1X3RrdG1nciB0YWJsZXMgdmVyc2lvbiAlZCAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmljdV90a3RtZ3IoKSkKKyAgICAgICAgcHJpbnQgJ2ljdWNvZGV0b29scy50aWNrZXRtZ3I6IE5vdGUsIGZpcnN0IHJldmlldyB3aWxsIHRha2UgYSB3aGlsZS5cbicKKyAgICAKKyAgICBkZWYgeW91bmdlc3RfcmV2KHNlbGYsZGIpOgorICAgICAgICBpZiAoc2VsZi5rbm93bl95b3VuZ2VzdCA8IDApOgorICAgICAgICAgICAgI3ByaW50KCdEaWQgbm90IGtub3cgeW91bmdlc3QgdmFsdWUuJykKKyAgICAgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gc3lzdGVtIFdIRVJFIG5hbWU9J2ljdV90a3RtZ3JfeW91bmdlc3QnIikKKyAgICAgICAgICAgIHJvdyA9IGN1cnNvci5mZXRjaG9uZSgpCisgICAgICAgICAgICBpZiBub3Qgcm93OgorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJJTlNFUlQgSU5UTyBzeXN0ZW0gKG5hbWUsdmFsdWUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICgnaWN1X3RrdG1ncl95b3VuZ2VzdCcsJy0xJykiKQorICAgICAgICAgICAgICAgIGRiLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgc2VsZi5rbm93bl95b3VuZ2VzdCA9IC0yCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGtub3duX3lvdW5nZXN0ID0gaW50KHJvd1swXSkKKyAgICAgICAgICAgICAgICBzZWxmLmtub3duX3lvdW5nZXN0ID0ga25vd25feW91bmdlc3QKKyAgICAgICAgcmV0dXJuIHNlbGYua25vd25feW91bmdlc3QKKyAgICAgICAgCisgICAgZGVmIGNoZWNrX3N5bmMoc2VsZiwgbG9nLCBkYiwgcmVwb3MpOgorICAgICAgICBvdXJZb3VuZ2VzdCA9IHNlbGYueW91bmdlc3RfcmV2KGRiKQorICAgICAgICB0aGVpcllvdW5nZXN0ID0gcmVwb3MuZ2V0X3lvdW5nZXN0X3JldigpCisgICAgICAgICNsb2cuaW5mbygiVEtUOiBjaGVja19zeW5jICVkLyVkIiAlIChvdXJZb3VuZ2VzdCx0aGVpcllvdW5nZXN0KSkKKyAgICAgICAgaWYob3VyWW91bmdlc3QgPD0gdGhlaXJZb3VuZ2VzdCk6CisgICAgICAgICAgICBzZWxmLnJlc3luYyhsb2csIGRiLCByZXBvcywgb3VyWW91bmdlc3QsIHRoZWlyWW91bmdlc3QpCisgICAgCisgICAgZGVmIGVudmlyb25tZW50X25lZWRzX3VwZ3JhZGUoc2VsZiwgZGIpOgorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gc3lzdGVtIFdIRVJFIG5hbWU9J2ljdV90a3RtZ3InIikKKyAgICAgICAgcm93ID0gY3Vyc29yLmZldGNob25lKCkKKyAgICAgICAgaWYgbm90IHJvdyBvciBpbnQocm93WzBdKSA8IHNlbGYuaWN1X3RrdG1ncigpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB1cGdyYWRlX2Vudmlyb25tZW50KHNlbGYsIGRiKToKKyAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCkKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NIHN5c3RlbSBXSEVSRSBuYW1lPSdpY3VfdGt0bWdyJyIpCisgICAgICAgIHJvdyA9IGN1cnNvci5mZXRjaG9uZSgpCisgICAgICAgIGlmIG5vdCByb3c6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NyZWF0ZWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2cuaW5mbygnRG8gbm90IGtub3cgaG93IHRvIHVwZ3JhZGUgaWN1dHJheGN0bl90aWNrZXRtZ3IgdGFibGVzIHRvICVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pY3VfdGt0bWdyKCkpCisJY3Vyc29yLmNsb3NlKCkKKworICAgIGRlZiByZXN5bmMoc2VsZiwgbG9nLCBkYiwgcmVwb3MsIG91cllvdW5nZXN0LCB0aGVpcllvdW5nZXN0KToKKyAgICAgICAgc2VsZi5sb2cuaW5mbygncmVzeW5jOiBvdXJZb3VuZ2VzdD0lZCB0aGVpcllvdW5nZXN0PSVkJyAlIChvdXJZb3VuZ2VzdCwgdGhlaXJZb3VuZ2VzdCkpCisgICAgICAgIGlmIChvdXJZb3VuZ2VzdCA8IDApOgorICAgICAgICAgICAgIyBzdGFydCBhdCByZXYgMQorICAgICAgICAgICAgb3VyWW91bmdlc3QgPSAxCisgICAgICAgIAorICAgICAgICAjc2VsZi50aWNrZXRfcGF0dGVybiA9IHNlbGYuZW52LmNvbmZpZy5nZXQoJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdeY2xkcmJ1ZyAoXGQrKTonKQorCisgICAgICAgICMgICAgICAgIGxvZy5pbmZvKCJQYXQ6ICVzIiAlIChzZWxmLnRpY2tldF9wYXR0ZXJuKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50aWNrZXRfbWF0Y2ggPSByZS5jb21waWxlKHNlbGYudGlja2V0X3BhdHRlcm4pCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZW52LmNvbmZpZy5nZXQoJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdOb25lRm91bmQnKQorICAgICAgICAgICAgcmFpc2UgVHJhY0Vycm9yKCdDb3VsZCBub3QgY29tcGlsZSBpY3Vjb2RldG9vbHMudGlja2V0X3BhdHRlcm49LyVzLyBidXQgLyVzLzogJXMnICUgKHNlbGYudGlja2V0X3BhdHRlcm4sIGZvdW5kLCBleGNlcHRpb25fdG9fdW5pY29kZShlLCB0cmFjZWJhY2s9VHJ1ZSkpKQorCisjICAgICAgICBzZWxmLnRpY2tldF9tYXRjaCA9IHJlLmNvbXBpbGUoc2VsZi50aWNrZXRfcGF0dGVybi5nZXQoKSkKKyMgICAgICAgIHNlbGYudGlja2V0X21hdGNoID0gcmUuY29tcGlsZSgnLionKQorICAgICAgICBmb3IgaSBpbiByYW5nZShvdXJZb3VuZ2VzdCwgdGhlaXJZb3VuZ2VzdCsxKToKKyAgICAgICAgICAgICNsb2cud2FybmluZygnc3luY2luZzogJWQgWyVkLyVkKzFdJywgaSwgdGhlaXJZb3VuZ2VzdCkKKyAgICAgICAgICAgIGNzZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KGkpCisgICAgICAgICAgICBzZWxmLnJldmlzaW9uX2NoYW5nZWQobG9nLCBjc2V0LCBpLCBkYi5jdXJzb3IoKSkKKyAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCk7CisgICAgICAgIGN1cnNvci5leGVjdXRlKCJ1cGRhdGUgc3lzdGVtIHNldCB2YWx1ZT0nJXMnIHdoZXJlIG5hbWU9J2ljdV90a3RtZ3JfeW91bmdlc3QnIiAlICh0aGVpcllvdW5nZXN0KSkKKyAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgI2xvZy53YXJuKCJzZWxmLmtub3duX3lvdW5nZXN0IHdhcyAlZCBbJWQvJWRdIiAlIChzZWxmLmtub3duX3lvdW5nZXN0LG91cllvdW5nZXN0LHRoZWlyWW91bmdlc3QpKSAKKyAgICAgICAgIyB1cGRhdGUga25vd24geW91bmdlc3QuCisgICAgICAgIHNlbGYua25vd25feW91bmdlc3QgPSB0aGVpcllvdW5nZXN0CisgICAgICAgICNsb2cud2Fybigic2VsZi5rbm93bl95b3VuZ2VzdCBub3cgJWQgWyVkLyVkXSIgJSAoc2VsZi5rbm93bl95b3VuZ2VzdCxvdXJZb3VuZ2VzdCx0aGVpcllvdW5nZXN0KSkgCisgICAgICAgIHJldHVybgorCisgICAgIyBJUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyIG1ldGhvZHMKKyAgICAjIE11c3QgY2FsbCB3aXRoOiB0cmFjLWFkbWluIC9ob21lL2ljdXRyYWMgY2hhbmdlc2V0IG1vZGlmaWVkICcoZGVmYXVsdCknIDI5MzMwIDI5MzMzICAtIHVnbHksIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS90cmFjLWRldkBnb29nbGVncm91cHMuY29tL21zZzA0NTY4Lmh0bWwKKyAgICBkZWYgY2hhbmdlc2V0X21vZGlmaWVkKHNlbGYsIHJlcG9zLCBjaGFuZ2VzZXQsIG9sZF9jaGFuZ2VzZXQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRpY2tldF9tYXRjaCA9IHJlLmNvbXBpbGUoc2VsZi50aWNrZXRfcGF0dGVybikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5lbnYuY29uZmlnLmdldCgnaWN1Y29kZXRvb2xzJywgJ3RpY2tldF9wYXR0ZXJuJywgJ05vbmVGb3VuZCcpCisgICAgICAgICAgICByYWlzZSBUcmFjRXJyb3IoJ0NvdWxkIG5vdCBjb21waWxlIGljdWNvZGV0b29scy50aWNrZXRfcGF0dGVybj0vJXMvIGJ1dCAvJXMvOiAlcycgJSAoc2VsZi50aWNrZXRfcGF0dGVybiwgZm91bmQsIGV4Y2VwdGlvbl90b191bmljb2RlKGUsIHRyYWNlYmFjaz1UcnVlKSkpCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgIGN1cnNvci5leGVjdXRlKCJERUxFVEUgRlJPTSByZXYydGlja2V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIHJldj0gJXMgIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGNoYW5nZXNldC5yZXYpKQorICAgICAgICBzZWxmLnJldmlzaW9uX2NoYW5nZWQoc2VsZi5sb2csIGNoYW5nZXNldCwgY2hhbmdlc2V0LnJldiwgZGIuY3Vyc29yKCkpCisJZGIuY29tbWl0KCkKKwkjc2VsZi5sb2cuZXJyb3IoImNoYW5nZXNldF9hZGRlZDogJXNcbiIgJSBjaGFuZ2VzZXQucmV2KQorCisgICAgZGVmIGNoYW5nZXNldF9hZGRlZChzZWxmLCByZXBvcywgY2hhbmdlc2V0KToKKyAgICAgICAgbWVzc2FnZSA9IGNoYW5nZXNldC5tZXNzYWdlIG9yICctLScKKwkjc2VsZi5sb2cuZXJyb3IoImNoYW5nZXNldF9hZGRlZDogJXNcbiIgJSBjaGFuZ2VzZXQucmV2KQorCisgICAgIyBJUmVwb3NpdG9yeU9ic2VydmVyIGZ1bmN0aW9uCisgICAgZGVmIHJldmlzaW9uX2NoYW5nZWQoc2VsZiwgbG9nLCBjc2V0LCBuZXh0X3lvdW5nZXN0LCBjdXJzb3IpOgorICAgICAgICAjIHN5bmMgdGhlICdyZXYydGlja2V0JyB0YWJsZQorICAgICAgICBtZXNzYWdlID0gY3NldC5tZXNzYWdlIG9yICctLScKKyAgICAgICAgIyBjYW4gd2UgbG9hZCBhIHRpY2tldCBmcm9tIGl0PyAgICJ0aWNrZXQ6MTIzNDogTWVzc2FnZSIKKyAgICAgICAgcmVzID0gc2VsZi50aWNrZXRfbWF0Y2gubWF0Y2gobWVzc2FnZSkKKyAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgdGlja25hbWUgPSByZXMuZ3JvdXAoMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbnQocmVzLmdyb3VwKDEpKSAjIHNob3VsZCBiZSBpbnQKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygnUmV2aXNpb24gWyVzXSBoYWQgdW5wYXJzZWFibGUgdGlja2V0IG51bWJlciBbJXNdOiBbJXNdJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dF95b3VuZ2VzdCwgdGlja25hbWUsIGUpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdHJ5OgorCQkjbG9nLndhcm5pbmcoJ3Ilcz0jJXMnICUgKHN0cihuZXh0X3lvdW5nZXN0KSwgdGlja25hbWUpKQorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJJTlNFUlQgT1IgSUdOT1JFIElOVE8gcmV2MnRpY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAocmV2LHRpY2tldCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCVzLCVzKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIobmV4dF95b3VuZ2VzdCksIHRpY2tuYW1lKSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6ICMgKmFub3RoZXIqIDEuMS4gcmVzeW5jIGF0dGVtcHQgd29uIAorICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCdyZXYydGlja2V0ICVzIGNvdWxkIG5vdCBjYWNoZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0X3lvdW5nZXN0LCBlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2cud2FybmluZygnUmV2aXNpb24gJXMgaGFkIHVubWF0Y2hlZCBtZXNzYWdlICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dF95b3VuZ2VzdCwgY3NldC5tZXNzYWdlKSkKKyAgICAKKyAgICBkZWYgcmVwb3NpdG9yeV9yZXN5bmMoc2VsZiwgY3Vyc29yKToKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIkRFTEVURSBGUk9NIHJldjJ0aWNrZXQiKTsKKyAgICAgICAgCisgICAgZGVmIHRrdDJyZXZzKHNlbGYsIGxvZywgZGIsIHJlcG9zLCByZXEsIHRpY2tldCk6CisgICAgICAgICIiIkdpdmVuIGEgdGlja2V0LCByZXR1cm4gYSBsaXN0IG9mIHJldnMuCisgICAgICAgICIiIgorICAgICAgICAKKyAgICAgICAgc2VsZi5jaGVja19zeW5jKGxvZywgZGIsIHJlcG9zKQorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHJ0LnJldiBmcm9tIHJldjJ0aWNrZXQgYXMgcnQgd2hlcmUgcnQudGlja2V0ID0gJWQgb3JkZXIgYnkgcnQucmV2IiAlIGludCh0aWNrZXQpKQorICAgICAgICByZXZzID0gW10KKyAgICAgICAgZm9yIHJldiwgaW4gY3Vyc29yOgorICAgICAgICAgICAgcmV2ID0gaW50KHJldikKKyAgICAgICAgICAgIHJldnMuYXBwZW5kKHJldikKKwljdXJzb3IuY2xvc2UoKQorICAgICAgICByZXR1cm4gcmV2cwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGt0bGlzdC5weSBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdkZTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkKQEAgLTAsMCArMSwxNzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworaW1wb3J0IHJlCisKK2ltcG9ydCBzeXMKKworZnJvbSB0cmFjLmNvcmUgaW1wb3J0ICoKK2Zyb20gdHJhYy51dGlsIGltcG9ydCBNYXJrdXAKK2Zyb20gdHJhYy53ZWIgaW1wb3J0IElSZXF1ZXN0SGFuZGxlcgorZnJvbSB0cmFjLndlYi5jaHJvbWUgaW1wb3J0IGFkZF9zdHlsZXNoZWV0LCBJTmF2aWdhdGlvbkNvbnRyaWJ1dG9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlbXBsYXRlUHJvdmlkZXIKK2Zyb20gdHJhYy53ZWIuaHJlZiBpbXBvcnQgSHJlZgorI2Zyb20gdHJhYy52ZXJzaW9uY29udHJvbC53ZWJfdWkuY2hhbmdlc2V0IGltcG9ydCBJQ2hhbmdlc2V0UmFuZ2VMaW5rCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyCitmcm9tIHRyYWMudGlja2V0IGltcG9ydCBUaWNrZXQKKworCisKK2NsYXNzIFRpY2tldGxpc3RNb2R1bGUoQ29tcG9uZW50KToKKworICAgIGltcGxlbWVudHMoSVJlcXVlc3RIYW5kbGVyKQorIyAgICBpbXBsZW1lbnRzKElSZXF1ZXN0SGFuZGxlcixJQ2hhbmdlc2V0UmFuZ2VMaW5rKQorCisgICAgZGVmIHJldmlzaW9uX3JhbmdlX2xpbmsoc2VsZiwgcmVxLCBiYXNlLCBzdGFydCwgZW5kKToKKyAgICAgICAgcmV0dXJuICgnVGlja2V0IExpc3QnLCByZXEuaHJlZigndGt0bGlzdCcsb2xkX3BhdGg9YmFzZSxuZXdfcGF0aD1iYXNlLG9sZD1zdGFydCxuZXc9ZW5kKSkKKworICAgIF9yZXF1ZXN0X3JlID0gcmUuY29tcGlsZShyIi90a3RsaXN0KD86LyhbXi9dKykpPygvLiopPyQiKQorCisgICAgZGVmIG1hdGNoX3JlcXVlc3Qoc2VsZiwgcmVxKToKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChzZWxmLl9yZXF1ZXN0X3JlLCByZXEucGF0aF9pbmZvKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcSk6CisgICAgICAgICNvaywgd2hhdCBhcmUgd2UgYWJvdXQuCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHRpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgIHJldmxpc3QgPSB7fSAjIGRpY3Qgb2YgcmV2aXNpb24tPgorICAgICAgICByZXBvcyA9IHNlbGYuZW52LmdldF9yZXBvc2l0b3J5KHJlcS5hdXRobmFtZSkKKworICAgICAgICBpZiBub3QgcmVxLnBlcm0uaGFzX3Blcm1pc3Npb24oJ1RJQ0tFVF9NT0RJRlknKToKKyAgICAgICAgICAgIHJldHVybiByZXEucmVkaXJlY3QocmVxLmhyZWYuYnJvd3NlcigpKQorCisgICAgICAgICMgc2hvcnRjdXQgLSBpZiAicmV2cyIgaXMgc2V0LCBqdXN0IHVzZSB0aGF0CisgICAgICAgIHJldnMgPSByZXEuYXJncy5nZXQoJ3JldnMnKQorICAgICAgICBpZiByZXZzIGFuZCBsZW4ocmV2cyk+MDoKKyAgICAgICAgICAgY29udGVudF90eXBlID0gInRleHQvaHRtbCIKKyAgICAgICAgICAgYWRkX3N0eWxlc2hlZXQocmVxLCAnY3NzL2ljdXh0bi5jc3MnKQorICAgICAgICAgICByZXEuaGRmWyd0aXgucmV2cyddID0gcmV2cworICAgICAgICAgICBpdGVtcyA9IHJldnMuc3BsaXQoKQorICAgICAgICAgICBvdXRzdHIgPSAnMT0wICcKKyAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICAgICByZXYgPSBpbnQoaXRlbSkgIyBtYXkgZmFpbAorICAgICAgICAgICAgICAgb3V0c3RyID0gJ3J0LnJldj0lZCclKHJldikKKyAgICAgICAgICAgcmVxLmhkZlsnaXNfZGN1dCddPTEKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddID0gb3V0c3RyICAKKyAgICAgICAgICAgIyB0ZXN0IC0gZ2V0IHJlbGV2YW50IHJldnMKKyAgICMgICAgICAgIHByaW50ICJvdGltZT0lcywgbnRpbWU9JXMiJSh0eXBlKG90aW1lKSx0eXBlKG50aW1lKSkKKyAgICAgICAgICAgI2N1cnNvci5leGVjdXRlKCJzZWxlY3QgZGlzdGluY3QgdC5pZCx0LnN1bW1hcnkgZnJvbSB0aWNrZXQgYXMgdCxyZXZpc2lvbiBhcyByLCByZXYydGlja2V0IGFzIHJ0ICIKKyAgICAgICAgICAgIyAgICAgICAgICAgICAgICIgd2hlcmUgdC5pZCA9IHJ0LnRpY2tldCBhbmQgKCVzKSBvcmRlciBieSB0LmlkIiUob3V0c3RyKSkKKyAgICAgICAgICAgYWxsc3FsID0gInNlbGVjdCBkaXN0aW5jdCB0aWNrZXQgZnJvbSByZXYydGlja2V0IGFzIHJ0IHdoZXJlICVzIG9yZGVyIGJ5IHJ0LnRpY2tldCIlKG91dHN0cikKKyAgICAgICAgICAgYWxsc3FsID0gInNlbGVjdCB0aWNrZXQgZnJvbSByZXYydGlja2V0IHdoZXJlIHJldj0lcyBvcmRlciBieSB0aWNrZXQiCisgICAgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgICAgIyBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHRpY2tldCBmcm9tIHJldjJ0aWNrZXQgd2hlcmUgcmV2PSVzIG9yZGVyIGJ5IHRpY2tldCIsKCIyMjkxMyIsKSkKKyAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCBydC5yZXYgZnJvbSByZXYydGlja2V0IGFzIHJ0IHdoZXJlIHJ0LnRpY2tldCA9ICVkIG9yZGVyIGJ5IHJ0LnJldiIgJSBpbnQoNjAxMCkpCisgICAgICAgICAgIHRpY2tldCA9IDAKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddID0gYWxsc3FsICAKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddPSJ6ZXJvIgorICAgICAgICAgICBmb3IgdGt0IGluIGN1cnNvcjoKKyAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpeC5zcWwnXT10a3QKKyAgICAgICAgICAgICAgIHN1bW0gPSAiIjsKKyAgICAgICAgICAgICAgICNzeXMuc3RkZXJyLndyaXRlKCIgdGt0ICVzIHN1bW0gJXMgZnJvbSAoZC1kKSIgJSAodGt0LHN1bW0pKQorICAgICAgICAgICAgICAgdGlja2V0ID0gdGlja2V0ICsgMQorICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gc3VtbQorICAgICAgICAgICAgICAgICAgICNyZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCBzdW1tLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49VHJ1ZSApCisgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddPWUKKyAgICAgICAgICAgICAgICAgICAjcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50aHRtbCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9ICcnCisgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLm51bWJlcicgJSB0aWNrZXRdID0gdGt0CisgICAgICAgICAgICAgICAjYWEgPSBNYXJrdXAoIjxhIGNsYXNzPVwibmV3IHRpY2tldFwiIGhyZWY9XCIlc1wiIHRpdGxlPVwiVGlja2V0IHggKG5ldylcIj4jJXM8L2E+IiUocmVxLmhyZWYudGlja2V0KHRrdCksdGt0KSkKKyAgICAgICAgICAgICAgICNyZXEuaGRmWyd0aWNrZXRzLiVkLmh0bWwnICUgdGlja2V0XSA9IGFhCisgICAgICAgICAgICMgc2V0IFJERiBoZXJlCisgICAgICAgICAgIHJldHVybiAndGt0cmV2cy5jcycsIGNvbnRlbnRfdHlwZQorCisgICAgICAgIG5ld19wYXRoID0gcmVxLmFyZ3MuZ2V0KCduZXdfcGF0aCcpCisgICAgICAgIG5ld19yZXYgPSByZXEuYXJncy5nZXQoJ25ldycpCisgICAgICAgIG9sZF9wYXRoID0gcmVxLmFyZ3MuZ2V0KCdvbGRfcGF0aCcpCisgICAgICAgIG9sZF9yZXYgPSByZXEuYXJncy5nZXQoJ29sZCcpCisKKyAgICAgICAgbmV3X3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChuZXdfcGF0aCkKKyAgICAgICAgbmV3X3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYobmV3X3JldikKKyAgICAgICAgb2xkX3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChvbGRfcGF0aCkKKyAgICAgICAgb2xkX3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYob2xkX3JldikKKworCisgICAgICAgIG9sZF9yZXYgPSBpbnQob2xkX3JldikKKyAgICAgICAgbmV3X3JldiA9IGludChuZXdfcmV2KQorICAgICAgICAKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0LmRpZmZfaHJlZiddID0gcmVxLmhyZWYoJ2NoYW5nZXNldCcsb2xkX3BhdGg9b2xkX3BhdGgsbmV3PW5ld19yZXYsbmV3X3BhdGg9bmV3X3BhdGgsb2xkPW9sZF9yZXYpCisKKyAgICAgICAgcmVxLmhkZlsnaXNfZGN1dCddPTEKKyAgICAgICAgCisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5vbGRfcmV2J10gPSBvbGRfcmV2CisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5uZXdfcmV2J10gPSBuZXdfcmV2CisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5vbGRfcGF0aCddID0gb2xkX3BhdGgKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm5ld19wYXRoJ10gPSBuZXdfcGF0aAorICAgICAgICBjb250ZW50X3R5cGUgPSAidGV4dC9odG1sIgorICAgICAgICBhZGRfc3R5bGVzaGVldChyZXEsICdjc3MvaWN1eHRuLmNzcycpCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICMgZmlyc3QsIGdldCByZWxldmFudCBjaGFuZ2VzLgorICAgICAgICByZXEuaGRmWyd0YXJnZXRfcGF0aCddID0gJy4nOworICAgICAgICAjIG9rYXkuIG1hbnVhbGx5IHRyb21wIHRocm91Z2ggJ2VtCisgICAgICAgIG9zZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KG9sZF9yZXYpOworICAgICAgICBuc2V0ID0gcmVwb3MuZ2V0X2NoYW5nZXNldChuZXdfcmV2KTsKKyAgICAgICAgb3RpbWUgPSBpbnQob3NldC5kYXRlKQorICAgICAgICBudGltZSA9IGludChuc2V0LmRhdGUpCisgICAgICAgIAorICAgICAgICBub3JtX3RyPSJzdHlsZT0nYm9yZGVyOiAxcHggZGFzaGVkIGdyZWVuOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0ZDOyciCisgICAgICAgIGNsb3NlZF90cj0ic3R5bGU9J2NvbG9yOiAjNjY2OyciCisgICAgICAgIG5vcmV2X3RyPSJzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjojRkREOyBib3JkZXI6IDFweCBzb2xpZCAjRjk5OyBmb250LXdlaWdodDogYm9sZDsnIgorCisgICAgICAgIHJlcS5oZGZbJ3NhbXBsZS5ub3JtLnRyJ10gPSBub3JtX3RyCisgICAgICAgIHJlcS5oZGZbJ3NhbXBsZS5jbG9zZWQudHInXSA9IGNsb3NlZF90cgorICAgICAgICByZXEuaGRmWydzYW1wbGUubm9yZXYudHInXSA9IG5vcmV2X3RyCisgICAgICAgIAorIyAgICAgICAgcHJpbnQgIiBzZWFyY2hpbmcgaW4gICglcy0lcykiICUgKG90aW1lLCBudGltZSkKKworICAgICAgICAjIHRlc3QgLSBnZXQgcmVsZXZhbnQgcmV2cworICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorIyAgICAgICAgcHJpbnQgIm90aW1lPSVzLCBudGltZT0lcyIlKHR5cGUob3RpbWUpLHR5cGUobnRpbWUpKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IGRpc3RpbmN0IHQuaWQsdC5zdW1tYXJ5LHQub3duZXIsIHQubWlsZXN0b25lLCB0LnN0YXR1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICIgLCBjLnZhbHVlICIgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gdGlja2V0IGFzIHQscmV2aXNpb24gYXMgciwgcmV2MnRpY2tldCBhcyBydCAiCisgICAgICAgICAgICAgICAgICAgICAgICIgbGVmdCBqb2luIHRpY2tldF9jdXN0b20gYXMgYyAiCisgICAgICAgICAgICAgICAgICAgICAgICIgb24gICggYy5uYW1lID0gJ3JldncnIEFORCBjLnRpY2tldCA9IHQuaWQgKSAiCisjICAgICAgICAgICAgICAgICAgICAgICAiICwgdGlja2V0X2N1c3RvbSBhcyBjICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiB3aGVyZSB0LmlkID0gcnQudGlja2V0IGFuZCBydC5yZXYgPSByLnJldiBhbmQgci50aW1lID4gJXMgYW5kIHIudGltZSA8PSAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbmQgZXhpc3RzICggc2VsZWN0IG5jLnJldiBmcm9tIG5vZGVfY2hhbmdlIGFzIG5jIHdoZXJlIG5jLnJldj1yLnJldiBhbmQgbmMucGF0aCBsaWtlICVzICkgIgorICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIgYnkgdC5pZCIsIChzdHIob3RpbWUpLCBzdHIobnRpbWUpLCAob2xkX3BhdGggKyAiJSIpKSkKKyAgICAgICAgdGlja2V0ID0gMAorICAgICAgICBmb3IgdGt0LHN1bW0sb3ducixtaWxlc3RvbmUsc3RhdHVzLCByZXZ3IGluIGN1cnNvcjoKKyMgICAgICAgICAgICBwcmludCAiIHRrdCAlcyBzdW1tICVzIGZyb20gKCVkLSVkKSIgJSAodGt0LHN1bW0sIG90aW1lLCBudGltZSkKKyAgICAgICAgICAgIHRpY2tldCA9IHRpY2tldCArIDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9IHN1bW0KKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCBzdW1tLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49VHJ1ZSApCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50aHRtbCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9ICcnCisgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLm51bWJlcicgJSB0aWNrZXRdID0gdGt0CisgICAgICAgICAgICBhYSA9IE1hcmt1cCgiPGEgY2xhc3M9XCJuZXcgdGlja2V0XCIgaHJlZj1cIiVzXCIgdGl0bGU9XCJUaWNrZXQgeCAobmV3KVwiPiMlczwvYT4iJShyZXEuaHJlZi50aWNrZXQodGt0KSx0a3QpKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5odG1sJyAlIHRpY2tldF0gPSBhYQorICAgICAgICAgICAgYWEgPSBNYXJrdXAoIjxhIGNsYXNzPVwibmV3IHRpY2tldFwiIGhyZWY9XCIlc1wiIHRpdGxlPVwiVGlja2V0IHggKG5ldylcIj4jJXM8L2E+IiUocmVxLmhyZWYudGlja2V0KHRrdCksdGt0KSkKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQub3duZXInICUgdGlja2V0XSA9IG93bnIKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubWlsZXN0b25lJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCAibWlsZXN0b25lOiVzIiVtaWxlc3RvbmUgLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49RmFsc2UgKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5yZXZpZXdlcicgJSB0aWNrZXRdID0gcmV2dworICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5zdGF0dXNodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCAiIyVzIiUodGt0KSwgc2VsZi5lbnYsIGRiLCBzaG9ydGVuPUZhbHNlICkKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuaHRtbCcgJSB0aWNrZXRdID0gYWEKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IG5vcm1fdHIKKyAgICAgICAgICAgIGlmIHN0YXR1cyBhbmQgc3RhdHVzLnN0YXJ0c3dpdGgoJ2Nsb3NlZCcpOgorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IGNsb3NlZF90cgorICAgICAgICAgICAgaWYgKCBub3QgcmV2dyApIG9yIGxlbihyZXZ3KTwxOgorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IG5vcmV2X3RyCisgICAgICAgIAorICAgICAgICByZXR1cm4gJ3RrdGxpc3QuY3MnLCBjb250ZW50X3R5cGUKKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9saWNlbnNlLmh0bWwgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUwMjUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiPjwvbWV0YT4KKzx0aXRsZT5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBCR0NPTE9SPSIjZmZmZmZmIj4KKzxoMj5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L2gyPgorCis8cD5DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFPC9wPgorCis8cD4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDEwIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworPC9wPgorPHA+CitBbGwgcmlnaHRzIHJlc2VydmVkLgorPC9wPgorPHA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zCit0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcworcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgCitJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKK09SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis8L3A+Cis8cD4KK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbgordGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKzwvcD4KKworPGhyPgorPHA+PHNtYWxsPgorQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCis8L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvcmVhZG1lLnR4dCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ5ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNzQgQEAKK0lDVSBDb2RlIFRvb2xzIHBsdWdpbgorCitDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitTZWUgbGljZW5zZS5odG1sIGZvciB0aGUgbGljZW5zZSBmaWxlLiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUKK0lDVSBwcm9qZWN0IGFuZCBpcyB1bmRlciB0aGUgc2FtZSBsaWNlbnNlLgorCitSZXF1aXJlbWVudHM6CisJVHJhYyAoMC4xMSBvciAwLjEyKz8pCisJUmVwb3NpdG9yeQorCitJbnN0YWxsaW5nOgorCTEuIGluc3RhbGwgdGhlIHBsdWdpbiAtIGF0IGxlYXN0IHRoZSB0aWNrZXRtYW5hZ2VyIGFuZCByZXZpZXcgcG9ydGlvbi4KKworICAgICAgICAgYS4gVGhlcmUgaXMgbm8gc291cmNlIHJlbGVhc2UgYXQgdGhpcyB0aW1lOiBJIHJlY29tbWVuZAorICAgICAgICAgICAgIHRoYXQgeW91IGNoZWNrIG91dCB0aGlzIGNvZGUgd2l0aCBzdm4KKyAgICAgICAgICAgICBhbmQgaW4gdGhpcyBkaXJlY3RvcnksIHJ1bjogCisgICAgICAgICAgICAgICAgInB5dGhvbiBzZXR1cC5weSBkZXZlbG9wIgorCQorCSBiLiBJbiB0cmFjLmluaSB1bmRlciAnW2NvbXBvbmVudHNdJyBhZGQ6CisJCWljdWNvZGV0b29scy5yZXZpZXcucmV2aWV3bW9kdWxlID0gZW5hYmxlZAorCQlpY3Vjb2RldG9vbHMudGlja2V0bWdyLnRpY2tldG1hbmFnZXIgPSBlbmFibGVkCisJCisJTk9URTogRENVVCBhbmQgVEtUTElTVCBwYXJ0cyBhcmUgbm90IHdvcmtpbmcgeWV0LiAKKwlEb24ndCBib3RoZXIgdG8gZW5hYmxlIHRoZW0uCisKKwkyLiBpbiB5b3VyIHRyYWMuaW5pIGRlc2NyaWJlIGhvdyB5b3VyIGNoYW5nZXNldHMgZGVzY3JpYmUgYSB0aWNrZXQuIAorCU91ciBjaGFuZ2VzZXRzIGxvb2sgbGlrZSB0aGlzOiAgInRpY2tldDoxMjM0OiBmaXhlZCB0aGUgYnJva2VuIGNvZGUiCisJV2UgdXNlIHRoaXMgcmVnZXg6CisKKwkgICBbaWN1Y29kZXRvb2xzXQorCSAgIHRpY2tldF9wYXR0ZXJuID0gXnRpY2tldDooXGQrKQorCisJMy4geW91IG1heSBuZWVkIHRvIHJ1biB0cmFjLWFkbWluIDxlbnZpcm9ubWVudD4gdXBncmFkZSAKKworCTQuIEdyYW50IHBlcm1pc3Npb24gb2YgSUNVUkVWSUVXX1ZJRVcgdG8gd2hvbWV2ZXIgeW91IHdhbnQgdG8gCisJICAgYmUgYWJsZSB0byByZXZpZXcgdGlja2V0cy4gCisKKwk1LiBOb3csIGFueSB0aWNrZXQgd2lsbCBoYXZlIHNvbWV0aGluZyBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciB3aGljaCBzYXlzOgorCSAgICAgIk5vIGNvbW1pdHMiIC0gbm8gY29tbWl0cyBhZ2FpbnN0IHRoaXMgdGlja2V0CisKKwkgICAgICJSZXZpZXcgMSBjb21taXRzIiAgLSB0aGVyZSBpcyBvbmx5IG9uZSBjb21taXQuIENsaWNraW5nIHRoaXMgbGluaworCSAgICAgICAgICAgICB3aWxsIGp1c3QgdGFrZSB5b3UgdG8gdGhhdCBzaW5nbGUgY2hhbmdlc2V0LgorCisJICAgICAgIlJldmlldyBuIGNvbW1pdHMiICAtIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNvbW1pdHMgYWdhaW5zdCB0aGlzCisJICAgICAgICAgICAgIHRpY2tldC4KKworIAorVHJvdWJsZXNob290aW5nOgorCitROiBNeSBjb21taXRzIGFyZW4ndCBiZWluZyBmb3VuZCEKK0E6IENoZWNrIHRoZSBkZWJ1ZyBsb2cuIEl0IHdpbGwgbm90ZSBjb21taXRzIHdpdGggdW5wYXJzZWFibGUgbWVzc2FnZXMKKworUTogSG93IGRvIEkgcmVzeW5jIHRoZSBjb21taXRzPworQTogVW50aWwgd2UgaW1wbGVtZW50IHRyYWMgMC4xMiBjaGFuZ2VzZXQgbGlzdGVuZXJzLCB5b3UgY2FuIGRvIHRoaXM6CisKKyAgICAwLiAgYmFjayB1cCB5b3VyIHBhdGgvdG8vZW52L2RiL3RyYWMuZGIKKworICAgIDEuICQgc3FsaXRlMyAgcGF0aC90by9lbnYvZGIvdHJhYy5kYgorICAgIAorICAgIDIuIHNxbGl0ZT4gZGVsZXRlIGZyb20gcmV2MnRpY2tldDsKKworICAgIDMuIHNxbGl0ZT4gdXBkYXRlIHN5c3RlbSBzZXQgdmFsdWU9Jy0xJyB3aGVyZSBuYW1lPSdpY3VfdGt0bWdyX3lvdW5nZXN0JzsKKworICAgIDQuIHNxbGl0ZT4gIC5xdWl0CisKK05vdyB0aGUgdGlja2V0IG1hbmFnZXIgd2lsbCByZS1zeW5jIHRoZSBmaXJzdCB0aW1lIHlvdSBoaXQgYSB0aWNrZXQuCisKK0ZJTElORyBCVUdTL0ZFQVRVUkUgUkVRVUVTVFM6CisgLSBVc2UgSUNVJ3MgdHJhYyByZXBvc2l0b3J5IGF0IGh0dHA6Ly9idWdzLmljdS1wcm9qZWN0Lm9yZy90cmFjCisgLSBVc2UgdGhlICdpbmZyYXN0cnVjdHVyZScgY29tcG9uZW50IGFuZCBjbGVhcmx5IGlkZW50aWZ5IHRoZSAnSUNVIENvZGUgVG9vbHMKKyAgIGZvciBUcmFjJyB3aGVuIHlvdSBmaWxlIHRoZSBidWcuCisKKworCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLmNmZyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjNmMmIKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLmNmZwpAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKK1tlZ2dfaW5mb10KK3RhZ19idWlsZCA9IGRldgordGFnX3N2bl9yZXZpc2lvbiA9IHRydWUKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvc2V0dXAucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkYmRkMDMKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTIgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIGZpbmRfcGFja2FnZXMKKworUEFDS0FHRSA9ICdJY3VDb2RlVG9vbHMnCitWRVJTSU9OID0gJzAuMC4xJworCitzZXR1cCgKKyAgICBuYW1lPVBBQ0tBR0UsIHZlcnNpb249VkVSU0lPTiwKKyAgICBkZXNjcmlwdGlvbj0nTWlzY2VsbGFuZW91cyBJQ1UgRXh0ZW5zaW9ucyB0byBUcmFjJywKKyAgICBhdXRob3I9IlN0ZXZlbiBSLiBMb29taXMiLCBhdXRob3JfZW1haWw9InNybEBpY3UtcHJvamVjdC5vcmciLAorICAgIGxpY2Vuc2U9J0JTRCcsIHVybD0naHR0cDovL2ljdS1wcm9qZWN0Lm9yZycsCisgICAgcGFja2FnZXM9ZmluZF9wYWNrYWdlcyhleGNsdWRlPVsnZXpfc2V0dXAnLCAnKi50ZXN0cyonXSksCisgICAgcGFja2FnZV9kYXRhPXsKKyAgICAgICAgJ2ljdWNvZGV0b29scyc6IFsKKyAgICAgICAgICAgICdodGRvY3MvY3NzLyouY3NzJywKKyAgICAgICAgICAgICd0ZW1wbGF0ZXMvKi5odG1sJywKKyMjICAgICAgICAgICAgJ2h0ZG9jcy9pbWcvKi5wbmcnLAorICAgICAgICAgICAnaHRkb2NzL2pzLyouanMnLAorICAgICAgICBdCisgICAgfSwKKyAgICBlbnRyeV9wb2ludHMgPSB7CisgICAgICAgICd0cmFjLnBsdWdpbnMnOiBbCisgICAgICAgICAgICAnaWN1Y29kZXRvb2xzLnRpY2tldG1nciA9IGljdWNvZGV0b29scy50aWNrZXRtZ3InLAorICAgICAgICAgICAgJ2ljdWNvZGV0b29scy5yZXZpZXcgPSBpY3Vjb2RldG9vbHMucmV2aWV3JywKKyAgICAgICAgICAgICdpY3Vjb2RldG9vbHMudGt0bGlzdCA9IGljdWNvZGV0b29scy50a3RsaXN0JywKKyAgICAgICAgICAgICdpY3Vjb2RldG9vbHMuZGN1dCA9IGljdWNvZGV0b29scy5kY3V0JworICAgICAgICBdCisgICAgfQorKQpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZjY5MmIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42KQorcHJvamVjdChJQ1VfVU5JX1RPT0xTKQorIyBUaGlzIHJlcXVpcmVzIGFuIGljdWRlZnMudHh0IGZpbGUgd2l0aCBjb250ZW50cyBsaWtlIHRoZSBmb2xsb3dpbmc6CisjIExvY2F0aW9uICgtLXByZWZpeCkgb2Ygd2hlcmUgSUNVIHdhcyBpbnN0YWxsZWQuCisjc2V0KElDVV9JTlNUX0RJUiAvaG9tZS9tc2NoZXJlci9zdm4uaWN1L3RydW5rL2JsZGluc3QpCisjIExvY2F0aW9uIG9mIHRoZSBJQ1Ugc291cmNlIHRyZWUuCisjc2V0KElDVV9TUkNfRElSIC9ob21lL21zY2hlcmVyL3N2bi5pY3UvdHJ1bmsvc3JjKQoraW5jbHVkZShpY3VkZWZzLnR4dCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICR7SUNVX0lOU1RfRElSfS9pbmNsdWRlCisgICR7SUNVX1NSQ19ESVJ9L3NvdXJjZS9jb21tb24KKyAgJHtJQ1VfU1JDX0RJUn0vc291cmNlL2kxOG4KKyAgJHtJQ1VfU1JDX0RJUn0vc291cmNlL3Rvb2xzL3Rvb2x1dGlsKQorbGlua19kaXJlY3Rvcmllcygke0lDVV9JTlNUX0RJUn0vbGliKQorYWRkX3N1YmRpcmVjdG9yeShnZW5wcm9wcykKK2FkZF9zdWJkaXJlY3RvcnkoZ2VudWNhKQorYWRkX3N1YmRpcmVjdG9yeShnZW51dHM0NikKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wcm9wcy9DTWFrZUxpc3RzLnR4dCBiL3VuaWNvZGUvYy9nZW5wcm9wcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDk2YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIGNyZWF0ZWQgb246IDIwMTBqdW4wMworIyBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorIyBlZGl0ZWQgb246IDIwMTBqdWwyMAorIyBlZGl0ZWQgYnk6IFN0dWFydCBHLiBHaWxsCithZGRfZXhlY3V0YWJsZShnZW5wcm9wcyBnZW5wcm9wcy5jcHAKKyAgICAgICAgICAgICAgIHBuYW1lc2J1aWxkZXIuY3BwIGNvcmVwcm9wc2J1aWxkZXIuY3BwCisgICAgICAgICAgICAgICBiaWRpcHJvcHNidWlsZGVyLmNwcCBjYXNlcHJvcHNidWlsZGVyLmNwcAorICAgICAgICAgICAgICAgbmFtZXNwcm9wc2J1aWxkZXIuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGdlbnByb3BzIGljdXVjIGljdXR1KQpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL01ha2VmaWxlLmluIGIvdW5pY29kZS9jL2dlbnByb3BzL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTZlZGYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw5NyBAQAorIyMgTWFrZWZpbGUuaW4gZm9yIElDVSAtIHRvb2xzL2dlbnByb3BzCisjIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyMjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjIFN0ZXZlbiBSLiBMb29taXMKKworIyMgU291cmNlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKwordG9wX2J1aWxkZGlyID0gLi4vLi4KKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaWN1ZGVmcy5taworCisjIyBCdWlsZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N1YmRpciA9IHRvb2xzL2dlbnByb3BzCisKK1RBUkdFVF9TVFVCX05BTUUgPSBnZW5wcm9wcworCitTRUNUSU9OID0gOAorCisjTUFOX0ZJTEVTID0gJChUQVJHRVRfU1RVQl9OQU1FKS4kKFNFQ1RJT04pCisKKworIyMgRXh0cmEgZmlsZXMgdG8gcmVtb3ZlIGZvciAnbWFrZSBjbGVhbicKK0NMRUFORklMRVMgPSAqfiAkKERFUFMpICQoTUFOX0ZJTEVTKQorCisjIyBUYXJnZXQgaW5mb3JtYXRpb24KK1RBUkdFVCA9ICQoQklORElSKS8kKFRBUkdFVF9TVFVCX05BTUUpJChFWEVFWFQpCisKK2lmbmVxICgkKHRvcF9idWlsZGRpciksJCh0b3Bfc3JjZGlyKSkKK0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpL2NvbW1vbgorZW5kaWYKK0NQUEZMQUdTICs9IC1JJCh0b3Bfc3JjZGlyKS9jb21tb24gLUkkKHNyY2RpcikvLi4vdG9vbHV0aWwKK0xJQlMgPSAkKExJQklDVVRPT0xVVElMKSAkKExJQklDVUkxOE4pICQoTElCSUNVVUMpICQoREVGQVVMVF9MSUJTKSAkKExJQl9NKQorCitPQkpFQ1RTID0gZ2VucHJvcHMubyBwcm9wczIubyBzdG9yZS5vCisKK0RFUFMgPSAkKE9CSkVDVFM6Lm89LmQpCisKKyMjIExpc3Qgb2YgcGhvbnkgdGFyZ2V0cworLlBIT05ZIDogYWxsIGFsbC1sb2NhbCBpbnN0YWxsIGluc3RhbGwtbG9jYWwgY2xlYW4gY2xlYW4tbG9jYWwJXAorZGlzdGNsZWFuIGRpc3RjbGVhbi1sb2NhbCBkaXN0IGRpc3QtbG9jYWwgY2hlY2sgY2hlY2stbG9jYWwgaW5zdGFsbC1tYW4KKworIyMgQ2xlYXIgc3VmZml4IGxpc3QKKy5TVUZGSVhFUyA6CisKKyMjIExpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cworYWxsOiBhbGwtbG9jYWwKK2luc3RhbGw6IGluc3RhbGwtbG9jYWwKK2NsZWFuOiBjbGVhbi1sb2NhbAorZGlzdGNsZWFuIDogZGlzdGNsZWFuLWxvY2FsCitkaXN0OiBkaXN0LWxvY2FsCitjaGVjazogYWxsIGNoZWNrLWxvY2FsCisKK2FsbC1sb2NhbDogJChUQVJHRVQpICQoTUFOX0ZJTEVTKQorCitpbnN0YWxsLWxvY2FsOiBhbGwtbG9jYWwgaW5zdGFsbC1tYW4KKyMJJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChzYmluZGlyKQorIwkkKElOU1RBTEwpICQoVEFSR0VUKSAkKERFU1RESVIpJChzYmluZGlyKQorCitpbnN0YWxsLW1hbjogJChNQU5fRklMRVMpCisjCSQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQobWFuZGlyKS9tYW4kKFNFQ1RJT04pCisjCSQoSU5TVEFMTF9EQVRBKSAkPyAkKERFU1RESVIpJChtYW5kaXIpL21hbiQoU0VDVElPTikKKworZGlzdC1sb2NhbDoKKworY2xlYW4tbG9jYWw6CisJdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgJChSTVYpICQoQ0xFQU5GSUxFUykKKwkkKFJNVikgJChUQVJHRVQpICQoT0JKRUNUUykKKworZGlzdGNsZWFuLWxvY2FsOiBjbGVhbi1sb2NhbAorCSQoUk1WKSBNYWtlZmlsZQorCitjaGVjay1sb2NhbDogYWxsLWxvY2FsCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQoVEFSR0VUKSA6ICQoT0JKRUNUUykKKwkkKExJTksuY2MpICQoT1VUT1BUKSRAICReICQoTElCUykgCisJJChQT1NUX0JVSUxEX1NURVApCisKKworJS4kKFNFQ1RJT04pOiAkKHNyY2RpcikvJS4kKFNFQ1RJT04pLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKworaWZlcSAoLCQoTUFLRUNNREdPQUxTKSkKKy1pbmNsdWRlICQoREVQUykKK2Vsc2UKK2lmbmVxICgkKHBhdHN1YnN0ICVjbGVhbiwsJChNQUtFQ01ER09BTFMpKSwpCistaW5jbHVkZSAkKERFUFMpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL2JpZGlwcm9wc2J1aWxkZXIuY3BwIGIvdW5pY29kZS9jL2dlbnByb3BzL2JpZGlwcm9wc2J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZmJiY2UKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvYmlkaXByb3BzYnVpbGRlci5jcHAKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBiaWRpcHJvcHNidWlsZGVyLmNwcCAod2FzIGdlbmJpZGkvc3RvcmUuYykKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDA0ZGVjMzAKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFN0b3JlIFVuaWNvZGUgYmlkaS9zaGFwaW5nIHByb3BlcnRpZXMgZWZmaWNpZW50bHkgZm9yCisqICAgcmFuZG9tIGFjY2Vzcy4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2hhci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5pc2V0LmgiCisjaW5jbHVkZSAiY21lbW9yeS5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJwcHVjZC5oIgorI2luY2x1ZGUgInVhcnJzb3J0LmgiCisjaW5jbHVkZSAidW5pY29kZS91ZGF0YS5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAidXRyaWUyLmgiCisjaW5jbHVkZSAid3JpdGVzcmMuaCIKKyNpbmNsdWRlICJ1YmlkaV9wcm9wcy5oIgorI2luY2x1ZGUgImdlbnByb3BzLmgiCisKKy8qIFVuaWNvZGUgYmlkaS9zaGFwaW5nIHByb3BlcnRpZXMgZmlsZSBmb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmaWxlIGZvcm1hdCBwcmVwYXJlZCBhbmQgd3JpdHRlbiBoZXJlIGNvbnRhaW5zIHNldmVyYWwgZGF0YQorc3RydWN0dXJlcyB0aGF0IHN0b3JlIGluZGV4ZXMgb3IgZGF0YS4KKworQmVmb3JlIHRoZSBkYXRhIGNvbnRlbnRzIGRlc2NyaWJlZCBiZWxvdywgdGhlcmUgYXJlIHRoZSBoZWFkZXJzIHJlcXVpcmVkIGJ5Cit0aGUgdWRhdGEgQVBJIGZvciBsb2FkaW5nIElDVSBkYXRhLiBFc3BlY2lhbGx5LCBhIFVEYXRhSW5mbyBzdHJ1Y3R1cmUKK3ByZWNlZGVzIHRoZSBhY3R1YWwgZGF0YS4gSXQgY29udGFpbnMgcGxhdGZvcm0gcHJvcGVydGllcyB2YWx1ZXMgYW5kIHRoZQorZmlsZSBmb3JtYXQgdmVyc2lvbi4KKworVGhlIGZvbGxvd2luZyBpcyBhIGRlc2NyaXB0aW9uIG9mIGZvcm1hdCB2ZXJzaW9uIDIuMCAuCisKK1RoZSBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlczoKKworICAgIGNvbnN0IGludDMyX3QgaW5kZXhlc1tpMF0gd2l0aCB2YWx1ZXMgaTAsIGkxLCAuLi46CisgICAgKHNlZSBVQklESV9JWF8uLi4gY29uc3RhbnRzIGZvciBuYW1lcyBvZiBpbmRleGVzKQorCisgICAgaTAgaW5kZXhMZW5ndGg7IC0tIGxlbmd0aCBvZiBpbmRleGVzW10gKFVCSURJX0lYX1RPUCkKKyAgICBpMSBkYXRhTGVuZ3RoOyAtLSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHBvc3QtaGVhZGVyIGRhdGEgKGluY2wuIGluZGV4ZXNbXSkKKyAgICBpMiB0cmllU2l6ZTsgLS0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgYmlkaS9zaGFwaW5nIHByb3BlcnRpZXMgdHJpZQorICAgIGkzIG1pcnJvckxlbmd0aDsgLS0gbGVuZ3RoIGluIHVpbnQzMl90IG9mIHRoZSBiaWRpIG1pcnJvcmluZyBhcnJheQorCisgICAgaTQgamdTdGFydDsgLS0gZmlyc3QgY29kZSBwb2ludCB3aXRoIEpvaW5pbmdfR3JvdXAgZGF0YQorICAgIGk1IGpnTGltaXQ7IC0tIGxpbWl0IGNvZGUgcG9pbnQgZm9yIEpvaW5pbmdfR3JvdXAgZGF0YQorCisgICAgaTYuLmkxNCByZXNlcnZlZEluZGV4ZXM7IC0tIHJlc2VydmVkIHZhbHVlczsgMCBmb3Igbm93CisKKyAgICBpMTUgbWF4VmFsdWVzOyAtLSBtYXhpbXVtIGNvZGUgdmFsdWVzIGZvciBlbnVtZXJhdGVkIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICBiaXRzIDIzLi4xNiBjb250YWluIHRoZSBtYXggdmFsdWUgZm9yIEpvaW5pbmdfR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSBiaXRzIGFyZSB1c2VkIGxpa2UgZW51bSBmaWVsZHMgaW4gdGhlIHRyaWUgd29yZAorCisgICAgU2VyaWFsaXplZCB0cmllLCBzZWUgdXRyaWUyLmg7CisKKyAgICBjb25zdCB1aW50MzJfdCBtaXJyb3JzW21pcnJvckxlbmd0aF07CisKKyAgICBjb25zdCB1aW50OF90IGpnQXJyYXlbaTUtaTRdOyAtLSAoaTUtaTQpIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDQKKworVHJpZSBkYXRhIHdvcmQ6CitCaXRzCisxNS4uMTMgIHNpZ25lZCBkZWx0YSB0byBiaWRpIG1pcnJvcmluZyBjb2RlIHBvaW50CisgICAgICAgIChhZGQgZGVsdGEgdG8gaW5wdXQgY29kZSBwb2ludCkKKyAgICAgICAgMCBubyBzdWNoIGNvZGUgcG9pbnQgKHNvdXJjZSBtYXBzIHRvIGl0c2VsZikKKyAgICAgICAgLTMuLi0xLCAxLi4zIGRlbHRhCisgICAgICAgIC00IGxvb2sgaW4gbWlycm9ycyB0YWJsZQorICAgIDEyICBpcyBtaXJyb3JlZAorICAgIDExICBCaWRpX0NvbnRyb2wKKyAgICAxMCAgSm9pbl9Db250cm9sCisgOS4uIDggIHJlc2VydmVkIChzZXQgdG8gMCkKKyA3Li4gNSAgSm9pbmluZ19UeXBlCisgNC4uIDAgIEJpRGkgY2F0ZWdvcnkKKworCitNaXJyb3JzOgorU3RvcmVzIHNvbWUgb2YgdGhlIGJpZGkgbWlycm9yaW5nIGRhdGEsIHdoZXJlIGVhY2ggY29kZSBwb2ludCBtYXBzIHRvCithdCBtb3N0IG9uZSBvdGhlci4KK01vc3QgY29kZSBwb2ludHMgZG8gbm90IGhhdmUgYSBtaXJyb3JpbmcgY29kZSBwb2ludDsgbW9zdCB0aGF0IGRvIGhhdmUgYSBzaWduZWQKK2RlbHRhIHN0b3JlZCBpbiB0aGUgdHJpZSBkYXRhIHZhbHVlLiBPbmx5IHRob3NlIHdoZXJlIHRoZSBkZWx0YSBkb2VzIG5vdCBmaXQKK2ludG8gdGhlIHRyaWUgZGF0YSBhcmUgc3RvcmVkIGluIHRoaXMgdGFibGUuCisKK0xvZ2ljYWxseSwgdGhpcyBpcyBhIHR3by1jb2x1bW4gdGFibGUgd2l0aCBzb3VyY2UgYW5kIG1pcnJvciBjb2RlIHBvaW50cy4KKworUGh5c2ljYWxseSwgdGhlIHRhYmxlIGlzIGNvbXByZXNzZWQgYnkgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IGVhY2gKK21pcnJvciBjb2RlIHBvaW50IGlzIGFsc28gYSBzb3VyY2UgY29kZSBwb2ludAorKGVhY2ggb2YgdGhlbSBpcyBhIG1pcnJvciBvZiB0aGUgb3RoZXIpLgorVGhlcmVmb3JlLCBib3RoIGxvZ2ljYWwgY29sdW1ucyBjb250YWluIHRoZSBzYW1lIHNldCBvZiBjb2RlIHBvaW50cywgd2hpY2ggbmVlZHMKK3RvIGJlIHN0b3JlZCBvbmx5IG9uY2UuCisKK1RoZSB0YWJsZSBzdG9yZXMgc291cmNlIGNvZGUgcG9pbnRzLCBhbmQgYWxzbyBmb3IgZWFjaCB0aGUgaW5kZXggb2YgaXRzIG1pcnJvcgorY29kZSBwb2ludCBpbiB0aGUgc2FtZSB0YWJsZSwgaW4gYSBzaW1wbGUgYXJyYXkgb2YgdWludDMyX3QuCitCaXRzCiszMS4uMjEgIGluZGV4IHRvIG1pcnJvciBjb2RlIHBvaW50ICh1bnNpZ25lZCkKKzIwLi4gMCAgc291cmNlIGNvZGUgcG9pbnQKKworVGhlIHRhYmxlIGlzIHNvcnRlZCBieSBzb3VyY2UgY29kZSBwb2ludHMuCisKKworSm9pbmluZ19Hcm91cCBhcnJheToKK1RoZSBKb2luaW5nX0dyb3VwIHZhbHVlcyBkbyBub3QgZml0IGludG8gdGhlIDE2LWJpdCB0cmllLCBidXQgdGhlIGRhdGEgaXMgYWxzbworbGltaXRlZCB0byBhIHNtYWxsIHJhbmdlIG9mIGNvZGUgcG9pbnRzIChBcmFiaWMgYW5kIFN5cmlhYykgYW5kIG5vdAord2VsbCBjb21wcmVzc2libGUuCisKK1RoZSBzdGFydCBhbmQgbGltaXQgY29kZSBwb2ludHMgZm9yIHRoZSByYW5nZSBhcmUgc3RvcmVkIGluIHRoZSBpbmRleGVzW10KK2FycmF5LCBhbmQgdGhlIGpnQXJyYXlbXSBzdG9yZXMgYSBieXRlIGZvciBlYWNoIG9mIHRoZXNlIGNvZGUgcG9pbnRzLAorY29udGFpbmluZyB0aGUgSm9pbmluZ19Hcm91cCB2YWx1ZS4KKworQWxsIGNvZGUgcG9pbnRzIG91dHNpZGUgb2YgdGhpcyByYW5nZSBoYXZlIE5vX0pvaW5pbmdfR3JvdXAgKDApLgorCistLS0gQ2hhbmdlcyBpbiBmb3JtYXQgdmVyc2lvbiAyIC0tLQorCitDaGFuZ2UgZnJvbSBVVHJpZSB0byBVVHJpZTIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VfTkFNRVNQQUNFX1VTRQorCisvKiBVRGF0YUluZm8gY2YuIHVkYXRhLmggKi8KK3N0YXRpYyBVRGF0YUluZm8gZGF0YUluZm89eworICAgIHNpemVvZihVRGF0YUluZm8pLAorICAgIDAsCisKKyAgICBVX0lTX0JJR19FTkRJQU4sCisgICAgVV9DSEFSU0VUX0ZBTUlMWSwKKyAgICBVX1NJWkVPRl9VQ0hBUiwKKyAgICAwLAorCisgICAgLyogZGF0YUZvcm1hdD0iQmlEaSIgKi8KKyAgICB7IFVCSURJX0ZNVF8wLCBVQklESV9GTVRfMSwgVUJJRElfRk1UXzIsIFVCSURJX0ZNVF8zIH0sCisgICAgeyAyLCAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JtYXRWZXJzaW9uICovCisgICAgeyA2LCAwLCAwLCAwIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkYXRhVmVyc2lvbiAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQmlEaVByb3BzQnVpbGRlciA6IHB1YmxpYyBQcm9wc0J1aWxkZXIgeworcHVibGljOgorICAgIEJpRGlQcm9wc0J1aWxkZXIoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIH5CaURpUHJvcHNCdWlsZGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VW5pY29kZVZlcnNpb24oY29uc3QgVVZlcnNpb25JbmZvIHZlcnNpb24pOworICAgIHZpcnR1YWwgdm9pZCBzZXRQcm9wcyhjb25zdCBVbmlQcm9wcyAmLCBjb25zdCBVbmljb2RlU2V0ICZuZXdWYWx1ZXMsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdmlydHVhbCB2b2lkIGJ1aWxkKFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlQ1NvdXJjZUZpbGUoY29uc3QgY2hhciAqcGF0aCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVCaW5hcnlEYXRhKGNvbnN0IGNoYXIgKnBhdGgsIFVCb29sIHdpdGhDb3B5cmlnaHQsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBlbmNvZGVCaWRpTWlycm9yaW5nR2x5cGgoVUNoYXIzMiBzcmMsIFVDaGFyMzIgZW5kLCBVQ2hhcjMyIG1pcnJvciwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2b2lkIG1ha2VNaXJyb3IoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKworICAgIFVuaWNvZGVTZXQgcmVsZXZhbnRQcm9wczsKKyAgICBVVHJpZTIgKnBUcmllOworICAgIHVpbnQ4X3QgamdBcnJheVsweDMwMF07IC8qIGF0IG1vc3QgZm9yIFUrMDYwMC4uVSswOEZGICovCisgICAgVUNoYXIzMiBqZ1N0YXJ0OyAgLy8gRmlyc3QgY29kZSBwb2ludCB3aXRoIGEgSm9pbmluZ19Hcm91cC4KKyAgICBVQ2hhcjMyIGpnTGltaXQ7ICAvLyBPbmUgcGFzdCB0aGUgbGFzdCBvbmUuCisgICAgdWludDMyX3QgbWlycm9yc1tVQklESV9NQVhfTUlSUk9SX0lOREVYKzFdWzJdOworICAgIGludDMyX3QgbWlycm9yVG9wOworfTsKKworQmlEaVByb3BzQnVpbGRlcjo6QmlEaVByb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpCisgICAgICAgIDogcFRyaWUoTlVMTCksCisgICAgICAgICAgamdTdGFydCgwKSwgamdMaW1pdCgwKSwKKyAgICAgICAgICBtaXJyb3JUb3AoMCkgeworICAgIC8vIFRoaXMgYnVpbGRlciBlbmNvZGVzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcy4KKyAgICByZWxldmFudFByb3BzLgorICAgICAgICBhZGQoVUNIQVJfQklESV9DT05UUk9MKS4KKyAgICAgICAgYWRkKFVDSEFSX0JJRElfTUlSUk9SRUQpLgorICAgICAgICBhZGQoVUNIQVJfQklESV9DTEFTUykuCisgICAgICAgIGFkZChVQ0hBUl9CSURJX01JUlJPUklOR19HTFlQSCkuCisgICAgICAgIGFkZChVQ0hBUl9KT0lOX0NPTlRST0wpLgorICAgICAgICBhZGQoVUNIQVJfSk9JTklOR19HUk9VUCkuCisgICAgICAgIGFkZChVQ0hBUl9KT0lOSU5HX1RZUEUpOworICAgIHBUcmllPXV0cmllMl9vcGVuKDAsIDAsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IGJpZGlwcm9wc2J1aWxkZXIgdXRyaWUyX29wZW4oKSBmYWlsZWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICB9CisgICAgdXBydl9tZW1zZXQoamdBcnJheSwgVV9KR19OT19KT0lOSU5HX0dST1VQLCBzaXplb2YoamdBcnJheSkpOworfQorCitCaURpUHJvcHNCdWlsZGVyOjp+QmlEaVByb3BzQnVpbGRlcigpIHsKKyAgICB1dHJpZTJfY2xvc2UocFRyaWUpOworfQorCit2b2lkCitCaURpUHJvcHNCdWlsZGVyOjpzZXRVbmljb2RlVmVyc2lvbihjb25zdCBVVmVyc2lvbkluZm8gdmVyc2lvbikgeworICAgIHVwcnZfbWVtY3B5KGRhdGFJbmZvLmRhdGFWZXJzaW9uLCB2ZXJzaW9uLCA0KTsKK30KKworLyogYmlkaSBtaXJyb3JpbmcgdGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50MzJfdAorQmlEaVByb3BzQnVpbGRlcjo6ZW5jb2RlQmlkaU1pcnJvcmluZ0dseXBoKFVDaGFyMzIgc3JjLCBVQ2hhcjMyIGVuZCwgVUNoYXIzMiBtaXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkgfHwgbWlycm9yPDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKHNyYyE9ZW5kKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJnZW5wcm9wcyBlcnJvcjogcmFuZ2UgVSslMDRsWC4uVSslMDRsWCBhbGwgd2l0aCB0aGUgc2FtZSAiCisgICAgICAgICAgICAgICAgIkJpZGlfTWlycm9yaW5nX0dseXBoIFUrJTA0bFhcbiIsCisgICAgICAgICAgICAgICAgKGxvbmcpc3JjLCAobG9uZyllbmQsIChsb25nKW1pcnJvcik7CisgICAgICAgIGVycm9yQ29kZT1VX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQzMl90IGRlbHRhPW1pcnJvci1zcmM7CisgICAgaWYoZGVsdGE9PTApIHsKKyAgICAgICAgcmV0dXJuIDA7IC8qIG1hcHBpbmcgdG8gc2VsZj1ubyBtYXBwaW5nICovCisgICAgfQorCisgICAgaWYoZGVsdGE8VUJJRElfTUlOX01JUlJPUl9ERUxUQSB8fCBVQklESV9NQVhfTUlSUk9SX0RFTFRBPGRlbHRhKSB7CisgICAgICAgIC8qIGRlbHRhIGRvZXMgbm90IGZpdCBpbnRvIHRoZSB0cmllIHByb3BlcnRpZXMgdmFsdWUsIHN0b3JlIGluIHRoZSBtaXJyb3JzW10gdGFibGUgKi8KKyAgICAgICAgaWYobWlycm9yVG9wPT1MRU5HVEhPRihtaXJyb3JzKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJnZW5wcm9wcyBlcnJvcjogdG9vIG1hbnkgbG9uZy1kaXN0YW5jZSBCaWRpX01pcnJvcmluZ19HbHlwaCBtYXBwaW5nczsgIgorICAgICAgICAgICAgICAgICAgICAiVUJJRElfTUFYX01JUlJPUl9JTkRFWCBjYW4gb25seSBiZSBpbmNyZWFzZWQgYnkgIgorICAgICAgICAgICAgICAgICAgICAicmVkZXNpZ25pbmcgdGhlIHViaWRpLmljdSBkYXRhIGJpdCBmaWVsZHNcbiIpOworICAgICAgICAgICAgZXJyb3JDb2RlPVVfQlVGRkVSX09WRVJGTE9XX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBwb3NzaWJsZTogc2VhcmNoIHRoZSB0YWJsZSBzbyBmYXIgYW5kIHNlZSBpZiBzcmMgaXMgYWxyZWFkeSBsaXN0ZWQgKi8KKworICAgICAgICBtaXJyb3JzW21pcnJvclRvcF1bMF09KHVpbnQzMl90KXNyYzsKKyAgICAgICAgbWlycm9yc1ttaXJyb3JUb3BdWzFdPSh1aW50MzJfdCltaXJyb3I7CisgICAgICAgICsrbWlycm9yVG9wOworCisgICAgICAgIC8qIHNldCBhbiBlc2NhcGUgbWFya2VyIGluIHNyYydzIHByb3BlcnRpZXMgKi8KKyAgICAgICAgZGVsdGE9VUJJRElfRVNDX01JUlJPUl9ERUxUQTsKKyAgICB9CisgICAgcmV0dXJuIGRlbHRhOworfQorCit2b2lkCitCaURpUHJvcHNCdWlsZGVyOjpzZXRQcm9wcyhjb25zdCBVbmlQcm9wcyAmcHJvcHMsIGNvbnN0IFVuaWNvZGVTZXQgJm5ld1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpIHx8IG5ld1ZhbHVlcy5jb250YWluc05vbmUocmVsZXZhbnRQcm9wcykpIHsgcmV0dXJuOyB9CisKKyAgICBVQ2hhcjMyIHN0YXJ0PXByb3BzLnN0YXJ0OworICAgIFVDaGFyMzIgZW5kPXByb3BzLmVuZDsKKworICAgIGludDMyX3QgZGVsdGE9ZW5jb2RlQmlkaU1pcnJvcmluZ0dseXBoKHN0YXJ0LCBlbmQsIHByb3BzLmJtZywgZXJyb3JDb2RlKTsKKyAgICB1aW50MzJfdCB2YWx1ZT0odWludDMyX3QpZGVsdGE8PFVCSURJX01JUlJPUl9ERUxUQV9TSElGVDsKKyAgICBpZihwcm9wcy5iaW5Qcm9wc1tVQ0hBUl9CSURJX01JUlJPUkVEXSkgeworICAgICAgICB2YWx1ZXw9VV9NQVNLKFVCSURJX0lTX01JUlJPUkVEX1NISUZUKTsKKyAgICB9CisgICAgaWYocHJvcHMuYmluUHJvcHNbVUNIQVJfQklESV9DT05UUk9MXSkgeworICAgICAgICB2YWx1ZXw9VV9NQVNLKFVCSURJX0JJRElfQ09OVFJPTF9TSElGVCk7CisgICAgfQorICAgIGlmKHByb3BzLmJpblByb3BzW1VDSEFSX0pPSU5fQ09OVFJPTF0pIHsKKyAgICAgICAgdmFsdWV8PVVfTUFTSyhVQklESV9KT0lOX0NPTlRST0xfU0hJRlQpOworICAgIH0KKyAgICB2YWx1ZXw9KHVpbnQzMl90KXByb3BzLmdldEludFByb3AoVUNIQVJfSk9JTklOR19UWVBFKTw8VUJJRElfSlRfU0hJRlQ7CisgICAgdmFsdWV8PSh1aW50MzJfdClwcm9wcy5nZXRJbnRQcm9wKFVDSEFSX0JJRElfQ0xBU1MpOworICAgIHV0cmllMl9zZXRSYW5nZTMyKHBUcmllLCBzdGFydCwgZW5kLCB2YWx1ZSwgVFJVRSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogQmlEaVByb3BzQnVpbGRlciB1dHJpZTJfc2V0UmFuZ2UzMigpIGZhaWxlZCAtICVzXG4iLAorICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogc3RvcmUgSm9pbmluZ19Hcm91cCB2YWx1ZXMgZnJvbSB2ZWN0b3IgY29sdW1uIDEgaW4gYSBzaW1wbGUgYnl0ZSBhcnJheSAqLworICAgIGludDMyX3Qgamc9cHJvcHMuZ2V0SW50UHJvcChVQ0hBUl9KT0lOSU5HX0dST1VQKTsKKyAgICBpZihqZyE9VV9KR19OT19KT0lOSU5HX0dST1VQKSB7CisgICAgICAgIGlmKHN0YXJ0PDB4NjAwIHx8IDB4OGZmPGVuZCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogSm9pbmluZ19Hcm91cCBmb3Igb3V0LW9mLXJhbmdlIGNvZGUgcG9pbnRzIFUrJTA0bHguLlUrJTA0bHhcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nKXN0YXJ0LCAobG9uZyllbmQpOworICAgICAgICAgICAgZXJyb3JDb2RlPVVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZihzdGFydDxqZ1N0YXJ0IHx8IGpnU3RhcnQ9PTApIHsgamdTdGFydD1zdGFydDsgfQorICAgICAgICBpZihlbmQ+PWpnTGltaXQgfHwgamdMaW1pdD09MCkgeyBqZ0xpbWl0PWVuZCsxOyB9CisgICAgfQorICAgIC8vIE9uIHRoZSBvZmYtY2hhbmNlIHRoYXQgYSBibG9jayBpcyBkZWZpbmVkIHdpdGggYSBKb2luaW5nX0dyb3VwCisgICAgLy8gdGhhdCBpcyB0aGVuIG92ZXJyaWRkZW4gYnkgTm9fSm9pbmluZ19Hcm91cCwKKyAgICAvLyB3ZSBzZXQgdGhhdCB0b28sIGJ1dCBvbmx5IGluc2lkZSBVKzA2MDAuLlUrMDhGRi4KKyAgICBpZihlbmQ+PTB4NjAwICYmIHN0YXJ0PD0weDhmZikgeworICAgICAgICBpZihzdGFydDwweDYwMCkgeyBzdGFydD0weDYwMDsgfQorICAgICAgICBpZihlbmQ+MHg4ZmYpIHsgZW5kPTB4OGZmOyB9CisKKyAgICAgICAgLyogc2V0IEpvaW5pbmdfR3JvdXAgdmFsdWUgZm9yIHN0YXJ0Li5lbmQgKi8KKyAgICAgICAgZm9yKFVDaGFyMzIgYz1zdGFydDsgYzw9ZW5kOyArK2MpIHsKKyAgICAgICAgICAgIGpnQXJyYXlbYy0weDYwMF09KHVpbnQ4X3Qpamc7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIGdlbmVyYXRlIG91dHB1dCBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQzMl90IFVfQ0FMTENPTlYKK2NvbXBhcmVNaXJyb3IoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqbGVmdCwgY29uc3Qgdm9pZCAqcmlnaHQpIHsKKyAgICBVQ2hhcjMyIGwsIHI7CisKKyAgICBsPVVCSURJX0dFVF9NSVJST1JfQ09ERV9QT0lOVCgoKGNvbnN0IHVpbnQzMl90ICopbGVmdClbMF0pOworICAgIHI9VUJJRElfR0VUX01JUlJPUl9DT0RFX1BPSU5UKCgoY29uc3QgdWludDMyX3QgKilyaWdodClbMF0pOworICAgIHJldHVybiBsLXI7Cit9CisKK3ZvaWQKK0JpRGlQcm9wc0J1aWxkZXI6Om1ha2VNaXJyb3IoVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgLyogc29ydCB0aGUgbWlycm9yaW5nIHRhYmxlIGJ5IHNvdXJjZSBjb2RlIHBvaW50cyAqLworICAgIHVwcnZfc29ydEFycmF5KG1pcnJvcnMsIG1pcnJvclRvcCwgOCwKKyAgICAgICAgICAgICAgICAgICBjb21wYXJlTWlycm9yLCBOVUxMLCBGQUxTRSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICAvKgorICAgICAqIHJlZHVjZSB0aGUgMi1jb2x1bW4gdGFibGUgdG8gYSBzaW5nbGUgY29sdW1uCisgICAgICogYnkgcHV0dGluZyB0aGUgaW5kZXggdG8gdGhlIG1pcnJvciBlbnRyeSBpbnRvIHRoZSBzb3VyY2UgZW50cnkKKyAgICAgKgorICAgICAqIGZpcnN0OgorICAgICAqIGZpbmQgZWFjaCBtaXJyb3IgY29kZSBwb2ludCBpbiB0aGUgc291cmNlIGNvbHVtbiBhbmQgc2V0IGVhY2ggb3RoZXIncyBpbmRleGVzCisgICAgICoKKyAgICAgKiBzZWNvbmQ6CisgICAgICogcmVkdWNlIHRoZSB0YWJsZSwgY29tYmluZSB0aGUgc291cmNlIGNvZGUgcG9pbnRzIHdpdGggdGhlaXIgaW5kZXhlcworICAgICAqIGFuZCBzdG9yZSBhcyBhIHNpbXBsZSBhcnJheSBvZiB1aW50MzJfdAorICAgICAqLworICAgIGZvcihpbnQzMl90IGk9MDsgaTxtaXJyb3JUb3A7ICsraSkgeworICAgICAgICB1aW50MzJfdCBjPW1pcnJvcnNbaV1bMV07IC8qIG1pcnJvciBjb2RlIHBvaW50ICovCisgICAgICAgIGlmKGM+MHgxZmZmZmYpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB0aGlzIGVudHJ5IGFscmVhZHkgaGFzIGFuIGluZGV4ICovCisgICAgICAgIH0KKworICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBtaXJyb3IgY29kZSBwb2ludCBpbiB0aGUgc291cmNlIGNvbHVtbiAqLworICAgICAgICBpbnQzMl90IHN0YXJ0LCBsaW1pdCwgc3RlcDsKKyAgICAgICAgaWYoYzxtaXJyb3JzW2ldWzBdKSB7CisgICAgICAgICAgICAvKiBzZWFyY2ggYmVmb3JlIGkgKi8KKyAgICAgICAgICAgIHN0YXJ0PWktMTsKKyAgICAgICAgICAgIGxpbWl0PS0xOworICAgICAgICAgICAgc3RlcD0tMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0PWkrMTsKKyAgICAgICAgICAgIGxpbWl0PW1pcnJvclRvcDsKKyAgICAgICAgICAgIHN0ZXA9MTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpbnQzMl90IGo9c3RhcnQ7OyBqKz1zdGVwKSB7CisgICAgICAgICAgICBpZihqPT1saW1pdCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgImdlbnByb3BzIGVycm9yOiBiaWRpIG1pcnJvciBkb2VzIG5vdCByb3VuZHRyaXAgLSAlMDRseC0+JTA0bHgtPj9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyltaXJyb3JzW2ldWzBdLCAobG9uZyltaXJyb3JzW2ldWzFdKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGU9VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYz09bWlycm9yc1tqXVswXSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogZm91bmQgdGhlIG1pcnJvciBjb2RlIHBvaW50IGMgaW4gdGhlIHNvdXJjZSBjb2x1bW4sCisgICAgICAgICAgICAgICAgICogc2V0IGJvdGggZW50cmllcycgaW5kZXhlcyB0byBlYWNoIG90aGVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoVUJJRElfR0VUX01JUlJPUl9DT0RFX1BPSU5UKG1pcnJvcnNbaV1bMF0pIT1VQklESV9HRVRfTUlSUk9SX0NPREVfUE9JTlQobWlycm9yc1tqXVsxXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcm91bmR0cmlwIGNoZWNrIGZhaWxzICovCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5wcm9wcyBlcnJvcjogYmlkaSBtaXJyb3JzIGRvIG5vdCByb3VuZHRyaXAgLSAlMDRseC0+JTA0bHgtPiUwNGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKW1pcnJvcnNbaV1bMF0sIChsb25nKW1pcnJvcnNbaV1bMV0sIChsb25nKW1pcnJvcnNbal1bMV0pOworICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU9VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1pcnJvcnNbaV1bMV18PSh1aW50MzJfdClqPDxVQklESV9NSVJST1JfSU5ERVhfU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgIG1pcnJvcnNbal1bMV18PSh1aW50MzJfdClpPDxVQklESV9NSVJST1JfSU5ERVhfU0hJRlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogbm93IHRoZSBzZWNvbmQgc3RlcCwgdGhlIGFjdHVhbCByZWR1Y3Rpb24gb2YgdGhlIHRhYmxlICovCisgICAgdWludDMyX3QgKnJlZHVjZWRNaXJyb3I9bWlycm9yc1swXTsKKyAgICBmb3IoaW50MzJfdCBpPTA7IGk8bWlycm9yVG9wOyArK2kpIHsKKyAgICAgICAgcmVkdWNlZE1pcnJvcltpXT1taXJyb3JzW2ldWzBdfChtaXJyb3JzW2ldWzFdJn4weDFmZmZmZik7CisgICAgfQorfQorCitzdGF0aWMgaW50MzJfdCBpbmRleGVzW1VCSURJX0lYX1RPUF09eworICAgIFVCSURJX0lYX1RPUCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMAorfTsKKworc3RhdGljIHVpbnQ4X3QgdHJpZUJsb2NrWzQwMDAwXTsKK3N0YXRpYyBpbnQzMl90IHRyaWVTaXplOworCit2b2lkCitCaURpUHJvcHNCdWlsZGVyOjpidWlsZChVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBtYWtlTWlycm9yKGVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICB1dHJpZTJfZnJlZXplKHBUcmllLCBVVFJJRTJfMTZfVkFMVUVfQklUUywgJmVycm9yQ29kZSk7CisgICAgdHJpZVNpemU9dXRyaWUyX3NlcmlhbGl6ZShwVHJpZSwgdHJpZUJsb2NrLCBzaXplb2YodHJpZUJsb2NrKSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogdXRyaWUyX2ZyZWV6ZSgpK3V0cmllMl9zZXJpYWxpemUoKSBmYWlsZWQ6ICVzIChsZW5ndGggJWxkKVxuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpLCAobG9uZyl0cmllU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBmaW5pc2ggamdBcnJheSwgcGFkIHRvIG11bHRpcGxlIG9mIDQgKi8KKyAgICB3aGlsZSgoamdMaW1pdC1qZ1N0YXJ0KSYzKSB7CisgICAgICAgIC8vIFByZWZlciByb3VuZGluZyBkb3duIGpnU3RhcnQgYmVmb3JlIHJvdW5kaW5nIHVwIGpnTGltaXQKKyAgICAgICAgLy8gc28gdGhhdCB3ZSBhcmUgZ3VhcmFudGVlZCBub3QgdG8gaW5jcmVhc2UgamdMaW1pdCBiZXlvbmQgMHg5MDAKKyAgICAgICAgLy8gd2hpY2ggKGFmdGVyIHRoZSBvZmZzZXQpIGlzIHRoZSBlbmQgb2YgdGhlIGpnQXJyYXkuCisgICAgICAgIGlmKGpnU3RhcnQmMykgeyAtLWpnU3RhcnQ7IH0gZWxzZSB7ICsramdMaW1pdDsgfQorICAgIH0KKyAgICBpbmRleGVzW1VCSURJX0lYX0pHX1NUQVJUXT1qZ1N0YXJ0OworICAgIGluZGV4ZXNbVUJJRElfSVhfSkdfTElNSVRdPWpnTGltaXQ7CisKKyAgICBpbmRleGVzW1VCSURJX0lYX1RSSUVfU0laRV09dHJpZVNpemU7CisgICAgaW5kZXhlc1tVQklESV9JWF9NSVJST1JfTEVOR1RIXT1taXJyb3JUb3A7CisgICAgaW5kZXhlc1tVQklESV9JWF9MRU5HVEhdPQorICAgICAgICAoaW50MzJfdClzaXplb2YoaW5kZXhlcykrCisgICAgICAgIHRyaWVTaXplKworICAgICAgICA0Km1pcnJvclRvcCsKKyAgICAgICAgKGpnTGltaXQtamdTdGFydCk7CisKKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwdXRzKCIqIHViaWRpLmljdSBzdGF0cyAqIik7CisgICAgICAgIHByaW50ZigidHJpZSBzaXplIGluIGJ5dGVzOiAgICAgICAgICAgICAgICAgICAgJTVkXG4iLCAoaW50KXRyaWVTaXplKTsKKyAgICAgICAgcHJpbnRmKCJzaXplIGluIGJ5dGVzIG9mIG1pcnJvcmluZyB0YWJsZTogICAgICAlNWRcbiIsIChpbnQpKDQqbWlycm9yVG9wKSk7CisgICAgICAgIHByaW50ZigibGVuZ3RoIG9mIEpvaW5pbmdfR3JvdXAgYXJyYXk6ICAgICAgICAgJTVkIChVKyUwNHguLlUrJTA0eClcbiIsIChpbnQpKGpnTGltaXQtamdTdGFydCksIChpbnQpamdTdGFydCwgKGludCkoamdMaW1pdC0xKSk7CisgICAgICAgIHByaW50ZigiZGF0YSBzaXplOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTVkXG4iLCAoaW50KWluZGV4ZXNbVUJJRElfSVhfTEVOR1RIXSk7CisgICAgfQorCisgICAgaW5kZXhlc1tVQklESV9NQVhfVkFMVUVTX0lOREVYXT0KKyAgICAgICAgKChpbnQzMl90KVVfQ0hBUl9ESVJFQ1RJT05fQ09VTlQtMSl8CisgICAgICAgICgoKGludDMyX3QpVV9KVF9DT1VOVC0xKTw8VUJJRElfSlRfU0hJRlQpfAorICAgICAgICAoKChpbnQzMl90KVVfSkdfQ09VTlQtMSk8PFVCSURJX01BWF9KR19TSElGVCk7Cit9CisKK3ZvaWQKK0JpRGlQcm9wc0J1aWxkZXI6OndyaXRlQ1NvdXJjZUZpbGUoY29uc3QgY2hhciAqcGF0aCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICBGSUxFICpmPXVzcmNfY3JlYXRlKHBhdGgsICJ1YmlkaV9wcm9wc19kYXRhLmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgImljdS90b29scy91bmljb2RlL2MvZ2VucHJvcHMvYmlkaXByb3BzYnVpbGRlci5jcHAiKTsKKyAgICBpZihmPT1OVUxMKSB7CisgICAgICAgIGVycm9yQ29kZT1VX0ZJTEVfQUNDRVNTX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZwdXRzKCIjaWZuZGVmIElOQ0xVREVEX0ZST01fVUJJRElfUFJPUFNfQ1xuIgorICAgICAgICAgICIjICAgZXJyb3IgVGhpcyBmaWxlIG11c3QgYmUgI2luY2x1ZGVkIGZyb20gdWJpZGlfcHJvcHMuYyBvbmx5LlxuIgorICAgICAgICAgICIjZW5kaWZcblxuIiwgZik7CisgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICJzdGF0aWMgY29uc3QgVVZlcnNpb25JbmZvIHViaWRpX3Byb3BzX2RhdGFWZXJzaW9uPXsiLAorICAgICAgICBkYXRhSW5mby5kYXRhVmVyc2lvbiwgOCwgNCwKKyAgICAgICAgIn07XG5cbiIpOworICAgIHVzcmNfd3JpdGVBcnJheShmLAorICAgICAgICAic3RhdGljIGNvbnN0IGludDMyX3QgdWJpZGlfcHJvcHNfaW5kZXhlc1tVQklESV9JWF9UT1BdPXsiLAorICAgICAgICBpbmRleGVzLCAzMiwgVUJJRElfSVhfVE9QLAorICAgICAgICAifTtcblxuIik7CisgICAgdXNyY193cml0ZVVUcmllMkFycmF5cyhmLAorICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQxNl90IHViaWRpX3Byb3BzX3RyaWVJbmRleFslbGRdPXtcbiIsIE5VTEwsCisgICAgICAgIHBUcmllLAorICAgICAgICAiXG59O1xuXG4iKTsKKyAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgInN0YXRpYyBjb25zdCB1aW50MzJfdCB1YmlkaV9wcm9wc19taXJyb3JzWyVsZF09e1xuIiwKKyAgICAgICAgbWlycm9ycywgMzIsIG1pcnJvclRvcCwKKyAgICAgICAgIlxufTtcblxuIik7CisgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICJzdGF0aWMgY29uc3QgdWludDhfdCB1YmlkaV9wcm9wc19qZ0FycmF5WyVsZF09e1xuIiwKKyAgICAgICAgamdBcnJheSsoamdTdGFydC0weDYwMCksIDgsIGpnTGltaXQtamdTdGFydCwKKyAgICAgICAgIlxufTtcblxuIik7CisgICAgZnB1dHMoCisgICAgICAgICJzdGF0aWMgY29uc3QgVUJpRGlQcm9wcyB1YmlkaV9wcm9wc19zaW5nbGV0b249e1xuIgorICAgICAgICAiICBOVUxMLFxuIgorICAgICAgICAiICB1YmlkaV9wcm9wc19pbmRleGVzLFxuIgorICAgICAgICAiICB1YmlkaV9wcm9wc19taXJyb3JzLFxuIgorICAgICAgICAiICB1YmlkaV9wcm9wc19qZ0FycmF5LFxuIiwKKyAgICAgICAgZik7CisgICAgdXNyY193cml0ZVVUcmllMlN0cnVjdChmLAorICAgICAgICAiICB7XG4iLAorICAgICAgICBwVHJpZSwgInViaWRpX3Byb3BzX3RyaWVJbmRleCIsIE5VTEwsCisgICAgICAgICIgIH0sXG4iKTsKKyAgICB1c3JjX3dyaXRlQXJyYXkoZiwgIiAgeyAiLCBkYXRhSW5mby5mb3JtYXRWZXJzaW9uLCA4LCA0LCAiIH1cbiIpOworICAgIGZwdXRzKCJ9O1xuIiwgZik7CisgICAgZmNsb3NlKGYpOworfQorCit2b2lkCitCaURpUHJvcHNCdWlsZGVyOjp3cml0ZUJpbmFyeURhdGEoY29uc3QgY2hhciAqcGF0aCwgVUJvb2wgd2l0aENvcHlyaWdodCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICBVTmV3RGF0YU1lbW9yeSAqcERhdGE9dWRhdGFfY3JlYXRlKHBhdGgsIFVCSURJX0RBVEFfVFlQRSwgVUJJRElfREFUQV9OQU1FLCAmZGF0YUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ29weXJpZ2h0ID8gVV9DT1BZUklHSFRfU1RSSU5HIDogTlVMTCwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogdWRhdGFfY3JlYXRlKCVzLCB1YmlkaS5pY3UpIGZhaWxlZCAtICVzXG4iLAorICAgICAgICAgICAgICAgIHBhdGgsIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgaW5kZXhlcywgc2l6ZW9mKGluZGV4ZXMpKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCB0cmllQmxvY2ssIHRyaWVTaXplKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBtaXJyb3JzLCA0Km1pcnJvclRvcCk7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgamdBcnJheSsoamdTdGFydC0weDYwMCksIGpnTGltaXQtamdTdGFydCk7CisKKyAgICBsb25nIGRhdGFMZW5ndGg9dWRhdGFfZmluaXNoKHBEYXRhLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiBiaWRpcHJvcHNidWlsZGVyICVkIHdyaXRpbmcgdGhlIG91dHB1dCBmaWxlXG4iLCBlcnJvckNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoZGF0YUxlbmd0aCE9aW5kZXhlc1tVQklESV9JWF9MRU5HVEhdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1ZGF0YV9maW5pc2godWJpZGkuaWN1KSByZXBvcnRzICVsZCBieXRlcyB3cml0dGVuIGJ1dCBzaG91bGQgYmUgJWxkXG4iLAorICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgsIChsb25nKWluZGV4ZXNbVUJJRElfSVhfTEVOR1RIXSk7CisgICAgICAgIGVycm9yQ29kZT1VX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgfQorfQorCitQcm9wc0J1aWxkZXIgKgorY3JlYXRlQmlEaVByb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm4gTlVMTDsgfQorICAgIFByb3BzQnVpbGRlciAqcGI9bmV3IEJpRGlQcm9wc0J1aWxkZXIoZXJyb3JDb2RlKTsKKyAgICBpZihwYj09TlVMTCkgeworICAgICAgICBlcnJvckNvZGU9VV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHBiOworfQorCisvKgorICogSGV5LCBFbWFjcywgcGxlYXNlIHNldCB0aGUgZm9sbG93aW5nOgorICoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL2Nhc2Vwcm9wc2J1aWxkZXIuY3BwIGIvdW5pY29kZS9jL2dlbnByb3BzL2Nhc2Vwcm9wc2J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MWM1YTcKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvY2FzZXByb3BzYnVpbGRlci5jcHAKQEAgLTAsMCArMSwxMTk5IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwNC0yMDEyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgZmlsZSBuYW1lOiAgY2FzZXByb3BzYnVpbGRlci5jcHAgKHdhcyBnZW5jYXNlL3N0b3JlLmMpCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMjAwNGF1ZzI4CisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyoKKyogICBTdG9yZSBVbmljb2RlIGNhc2UgbWFwcGluZyBwcm9wZXJ0aWVzIGVmZmljaWVudGx5IGZvcgorKiAgIHJhbmRvbSBhY2Nlc3MuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvbG9jYWxwb2ludGVyLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2hhci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWRhdGEuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXNldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldGl0ZXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKKyNpbmNsdWRlICJjbWVtb3J5LmgiCisjaW5jbHVkZSAiY3N0cmluZy5oIgorI2luY2x1ZGUgImdlbnByb3BzLmgiCisjaW5jbHVkZSAicHB1Y2QuaCIKKyNpbmNsdWRlICJ1YXNzZXJ0LmgiCisjaW5jbHVkZSAidWFycnNvcnQuaCIKKyNpbmNsdWRlICJ1Y2FzZS5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAidXRyaWUyLmgiCisjaW5jbHVkZSAid3JpdGVzcmMuaCIKKworLyogVW5pY29kZSBjYXNlIG1hcHBpbmcgcHJvcGVydGllcyBmaWxlIGZvcm1hdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpbGUgZm9ybWF0IHByZXBhcmVkIGFuZCB3cml0dGVuIGhlcmUgY29udGFpbnMgc2V2ZXJhbCBkYXRhCitzdHJ1Y3R1cmVzIHRoYXQgc3RvcmUgaW5kZXhlcyBvciBkYXRhLgorCitCZWZvcmUgdGhlIGRhdGEgY29udGVudHMgZGVzY3JpYmVkIGJlbG93LCB0aGVyZSBhcmUgdGhlIGhlYWRlcnMgcmVxdWlyZWQgYnkKK3RoZSB1ZGF0YSBBUEkgZm9yIGxvYWRpbmcgSUNVIGRhdGEuIEVzcGVjaWFsbHksIGEgVURhdGFJbmZvIHN0cnVjdHVyZQorcHJlY2VkZXMgdGhlIGFjdHVhbCBkYXRhLiBJdCBjb250YWlucyBwbGF0Zm9ybSBwcm9wZXJ0aWVzIHZhbHVlcyBhbmQgdGhlCitmaWxlIGZvcm1hdCB2ZXJzaW9uLgorCitUaGUgZm9sbG93aW5nIGlzIGEgZGVzY3JpcHRpb24gb2YgZm9ybWF0IHZlcnNpb24gMy4wIC4KKworRm9ybWF0IHZlcnNpb24gMS4xIGFkZHMgZGF0YSBmb3IgY2FzZSBjbG9zdXJlLgorCitGb3JtYXQgdmVyc2lvbiAxLjIgYWRkcyBhbiBleGNlcHRpb24gYml0IGZvciBjYXNlLWlnbm9yYWJsZS4gTmVlZGVkIGJlY2F1c2UKK3RoZSBDYXNlZCBhbmQgQ2FzZV9JZ25vcmFibGUgcHJvcGVydGllcyBhcmUgbm90IGRpc2pvaW50LgorCitGb3JtYXQgdmVyc2lvbiAyLjAgY2hhbmdlcyBmcm9tIFVUcmllIHRvIFVUcmllMi4KKworRm9ybWF0IHZlcnNpb24gMy4wIChJQ1UgNDkpIHNodWZmbGVzIHRoZSB0cmllIGJpdHMgdG8gc2ltcGxpZnkgc29tZSBidWlsZGVyIGFuZCBydW50aW1lIGNvZGUuCitJdCBtb3ZlcyB0aGUgQ2FzZV9JZ25vcmFibGUgZmxhZyBmcm9tIHNvbWV0aW1lcy10cmllLWJpdCA2LCBzb21ldGltZXMtZXhjZXB0aW9uLWJpdCAxMQordG8gYWx3YXlzLXRyaWUtYml0IDIgYW5kIGFkanVzdHMgdGhlIGhpZ2hlciB0cmllIGJpdHMgYWNjb3JkaW5nbHkuCitFeGNlcHRpb24gaW5kZXggcmVkdWNlZCBmcm9tIDEyIGJpdHMgdG8gMTEsIHNpbXBsZSBjYXNlIG1hcHBpbmcgZGVsdGEgcmVkdWNlZCBmcm9tIDEwIGJpdHMgdG8gOS4KKworVGhlIGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzOgorCisgICAgY29uc3QgaW50MzJfdCBpbmRleGVzW2kwXSB3aXRoIHZhbHVlcyBpMCwgaTEsIC4uLjoKKyAgICAoc2VlIFVDQVNFX0lYXy4uLiBjb25zdGFudHMgZm9yIG5hbWVzIG9mIGluZGV4ZXMpCisKKyAgICBpMCBpbmRleExlbmd0aDsgLS0gbGVuZ3RoIG9mIGluZGV4ZXNbXSAoVUNBU0VfSVhfVE9QKQorICAgIGkxIGRhdGFMZW5ndGg7IC0tIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcG9zdC1oZWFkZXIgZGF0YSAoaW5jbC4gaW5kZXhlc1tdKQorICAgIGkyIHRyaWVTaXplOyAtLSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjYXNlIG1hcHBpbmcgcHJvcGVydGllcyB0cmllCisgICAgaTMgZXhjZXB0aW9uc0xlbmd0aDsgLS0gbGVuZ3RoIGluIHVpbnQxNl90IG9mIHRoZSBleGNlcHRpb25zIGFycmF5CisgICAgaTQgdW5mb2xkTGVuZ3RoOyAtLSBsZW5ndGggaW4gdWludDE2X3Qgb2YgdGhlIHJldmVyc2UtZm9sZGluZyBhcnJheSAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDEuMSkKKworICAgIGk1Li5pMTQgcmVzZXJ2ZWRJbmRleGVzOyAtLSByZXNlcnZlZCB2YWx1ZXM7IDAgZm9yIG5vdworCisgICAgaTE1IG1heEZ1bGxMZW5ndGg7IC0tIG1heGltdW0gbGVuZ3RoIG9mIGEgZnVsbCBjYXNlIG1hcHBpbmcvZm9sZGluZyBzdHJpbmcKKworCisgICAgU2VyaWFsaXplZCB0cmllLCBzZWUgdXRyaWUyLmg7CisKKyAgICBjb25zdCB1aW50MTZfdCBleGNlcHRpb25zW2V4Y2VwdGlvbnNMZW5ndGhdOworCisgICAgY29uc3QgVUNoYXIgdW5mb2xkW3VuZm9sZExlbmd0aF07CisKKworVHJpZSBkYXRhIHdvcmQ6CitCaXRzCitpZihleGNlcHRpb24pIHsKKyAgICAxNS4uNSAgIHVuc2lnbmVkIGV4Y2VwdGlvbiBpbmRleAorfSBlbHNlIHsKKyAgICBpZihub3QgdW5jYXNlZCkgeworICAgICAgICAxNS4uNyAgIHNpZ25lZCBkZWx0YSB0byBzaW1wbGUgY2FzZSBtYXBwaW5nIGNvZGUgcG9pbnQKKyAgICAgICAgICAgICAgICAoYWRkIGRlbHRhIHRvIGlucHV0IGNvZGUgcG9pbnQpCisgICAgfSBlbHNlIHsKKyAgICAgICAgMTUuLjcgICByZXNlcnZlZCwgMAorICAgIH0KKyAgICAgNi4uNSAgIDAgbm9ybWFsIGNoYXJhY3RlciB3aXRoIGNjPTAKKyAgICAgICAgICAgIDEgc29mdC1kb3R0ZWQgY2hhcmFjdGVyCisgICAgICAgICAgICAyIGNjPTIzMAorICAgICAgICAgICAgMyBvdGhlciBjYworICAgICAgICAgICAgVGhlIHJ1bnRpbWUgY29kZSByZWxpZXMgb24gdGhlc2UgdHdvIGJpdHMgdG8gYmUgYWRqYWNlbnQgd2l0aCB0aGlzIGVuY29kaW5nLgorfQorICAgIDQgICBleGNlcHRpb24KKyAgICAzICAgY2FzZS1zZW5zaXRpdmUKKyAgICAyICAgY2FzZS1pZ25vcmFibGUKKyAxLi4wICAgMCB1bmNhc2VkCisgICAgICAgIDEgbG93ZXJjYXNlCisgICAgICAgIDIgdXBwZXJjYXNlCisgICAgICAgIDMgdGl0bGVjYXNlCisgICAgICAgIFRoZSBydW50aW1lIGNvZGUgcmVsaWVzIG9uIHRoZSBjYXNlLWlnbm9yYWJsZSBhbmQgY2FzZSB0eXBlIGJpdHMgMi4uMAorICAgICAgICB0byBiZSB0aGUgbG93ZXN0IGJpdHMgd2l0aCB0aGlzIGVuY29kaW5nLgorCisKK0V4Y2VwdGlvbnM6CitBIHN1Yi1hcnJheSBvZiB0aGUgZXhjZXB0aW9ucyBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBleGNlcHRpb24gaW5kZXggaW4gYQordHJpZSB3b3JkLgorVGhlIHN1Yi1hcnJheSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAgICB1aW50MTZfdCBleGNXb3JkOworICAgIHVpbnQxNl90IG9wdGlvbmFsIHZhbHVlcyBbXTsKKyAgICBVVEYtMTYgc3RyaW5ncyBmb3IgZnVsbCAoc3RyaW5nKSBtYXBwaW5ncyBmb3IgbG93ZXJjYXNlLCBjYXNlIGZvbGRpbmcsIHVwcGVyY2FzZSwgdGl0bGVjYXNlCisKK2V4Y1dvcmQ6IChzZWUgVUNBU0VfRVhDXy4uLikKK0JpdHMKKyAgICAxNSAgY29uZGl0aW9uYWwgY2FzZSBmb2xkaW5nCisgICAgMTQgIGNvbmRpdGlvbmFsIHNwZWNpYWwgY2FzaW5nCisxMy4uMTIgIHNhbWUgYXMgbm9uLWV4Y2VwdGlvbiB0cmllIGRhdGEgYml0cyA2Li41CisgICAgICAgIG1vdmVkIGhlcmUgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIGluZGV4IG5lZWRzIG1vcmUgYml0cyB0aGFuIHRoZSBkZWx0YQorICAgICAgICAwIG5vcm1hbCBjaGFyYWN0ZXIgd2l0aCBjYz0wCisgICAgICAgIDEgc29mdC1kb3R0ZWQgY2hhcmFjdGVyCisgICAgICAgIDIgY2M9MjMwCisgICAgICAgIDMgb3RoZXIgY2MKKzExICAgICAgcmVzZXJ2ZWQKKyAgICAgICAgKHdhcyB1c2VkIGluIGZvcm1hdFZlcnNpb24gMS4yLi4yLjA6CisgICAgICAgICBjYXNlLWlnbm9yYWJsZSAodXNlZCB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgY2FzZWQgb3IgaGFzIGFub3RoZXIgZXhjZXB0aW9uKSkKKzEwLi4gOSAgcmVzZXJ2ZWQKKyAgICAgOCAgaWYgc2V0LCB0aGVuIGZvciBlYWNoIG9wdGlvbmFsLXZhbHVlIHNsb3QgdGhlcmUgYXJlIDIgdWludDE2X3QgdmFsdWVzCisgICAgICAgIChoaWdoIGFuZCBsb3cgcGFydHMgb2YgMzItYml0IHZhbHVlcykKKyAgICAgICAgaW5zdGVhZCBvZiBzaW5nbGUgb25lcworIDcuLiAwICBiaXRzIGZvciB3aGljaCBvcHRpb25hbCB2YWx1ZSBpcyBwcmVzZW50CisKK09wdGlvbmFsLXZhbHVlIHNsb3RzOgorMCAgIGxvd2VyY2FzZSBtYXBwaW5nIChjb2RlIHBvaW50KQorMSAgIGNhc2UgZm9sZGluZyAoY29kZSBwb2ludCkKKzIgICB1cHBlcmNhc2UgbWFwcGluZyAoY29kZSBwb2ludCkKKzMgICB0aXRsZWNhc2UgbWFwcGluZyAoY29kZSBwb2ludCkKKzQgICByZXNlcnZlZAorNSAgIHJlc2VydmVkCis2ICAgY2xvc3VyZSBtYXBwaW5ncyAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDEuMSkKKzcgICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZnVsbCAoc3RyaW5nKSBjYXNlIG1hcHBpbmcKKyAgICB0aGUgbGVuZ3RoIG9mIGVhY2ggaXMgZW5jb2RlZCBpbiBhIG5pYmJsZSBvZiB0aGlzIG9wdGlvbmFsIHZhbHVlLAorICAgIGFuZCB0aGUgc3RyaW5ncyBmb2xsb3cgdGhpcyBvcHRpb25hbCB2YWx1ZSBpbiB0aGUgc2FtZSBvcmRlcjoKKyAgICBsb3dlci9mb2xkL3VwcGVyL3RpdGxlCisKK1RoZSBvcHRpb25hbCBjbG9zdXJlIG1hcHBpbmdzIHZhbHVlIGlzIHVzZWQgYXMgZm9sbG93czoKK0JpdHMgMC4uMyBjb250YWluIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgb2YgY29kZSBwb2ludHMgZm9yIGNhc2UgY2xvc3VyZS4KK1RoZSBzdHJpbmcgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZnVsbCBjYXNlIG1hcHBpbmdzLCBvciB0aGUgY2xvc3VyZSB2YWx1ZQorc2xvdCBpZiB0aGVyZSBhcmUgbm8gZnVsbCBjYXNlIG1hcHBpbmdzLgorQml0cyA0Li4xNSBhcmUgcmVzZXJ2ZWQgYW5kIGNvdWxkIGJlIHVzZWQgaW4gdGhlIGZ1dHVyZSB0byBpbmRpY2F0ZSB0aGUKK251bWJlciBvZiBzdHJpbmdzIGZvciBjYXNlIGNsb3N1cmUuCitDb21wbGV0ZSBjYXNlIGNsb3N1cmUgZm9yIGEgY29kZSBwb2ludCBpcyBnaXZlbiBieSB0aGUgdW5pb24gb2YgYWxsIHNpbXBsZQorYW5kIGZ1bGwgY2FzZSBtYXBwaW5ncyBhbmQgZm9sZGluZ3MsIHBsdXMgdGhlIGNhc2UgY2xvc3VyZSBjb2RlIHBvaW50cworKGFuZCBwb3RlbnRpYWxseSwgaW4gdGhlIGZ1dHVyZSwgY2FzZSBjbG9zdXJlIHN0cmluZ3MpLgorCitGb3Igc3BhY2Ugc2F2aW5nLCBzb21lIHZhbHVlcyBhcmUgbm90IHN0b3JlZC4gTG9va3VwcyBhcmUgYXMgZm9sbG93czoKKy0gSWYgc3BlY2lhbCBjYXNpbmcgaXMgY29uZGl0aW9uYWwsIHRoZW4gbm8gZnVsbCBsb3dlci91cHBlci90aXRsZSBtYXBwaW5nCisgIHN0cmluZ3MgYXJlIHN0b3JlZC4KKy0gSWYgY2FzZSBmb2xkaW5nIGlzIGNvbmRpdGlvbmFsLCB0aGVuIG5vIHNpbXBsZSBvciBmdWxsIGNhc2UgZm9sZGluZ3MgYXJlCisgIHN0b3JlZC4KKy0gRmFsbCBiYWNrIGluIHRoaXMgb3JkZXI6CisgICAgZnVsbCAoc3RyaW5nKSBtYXBwaW5nIC0tIGlmIGZ1bGwgbWFwcGluZ3MgYXJlIHVzZWQKKyAgICBzaW1wbGUgKGNvZGUgcG9pbnQpIG1hcHBpbmcgb2YgdGhlIHNhbWUgdHlwZQorICAgIHNpbXBsZSBmb2xkLT5zaW1wbGUgbG93ZXIKKyAgICBzaW1wbGUgdGl0bGUtPnNpbXBsZSB1cHBlcgorICAgIGZpbmFsbHksIHRoZSBvcmlnaW5hbCBjb2RlIHBvaW50IChubyBtYXBwaW5nKQorCitUaGlzIGZhbGxiYWNrIG9yZGVyIGlzIHN0cmljdDoKK0luIHBhcnRpY3VsYXIsIHRoZSBmYWxsYmFjayBmcm9tIGZ1bGwgY2FzZSBmb2xkaW5nIGlzIHRvIHNpbXBsZSBjYXNlIGZvbGRpbmcsCitub3QgdG8gZnVsbCBsb3dlcmNhc2UgbWFwcGluZy4KKworUmV2ZXJzZSBjYXNlIGZvbGRpbmcgZGF0YSAoInVuZm9sZCIpIGFycmF5OiAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDEuMSkKKworVGhpcyBhcnJheSBzdG9yZXMgc29tZSBtaXNjZWxsYW5lb3VzIHZhbHVlcyBmb2xsb3dlZCBieSBhIHRhYmxlLiBUaGUgZGF0YSBtYXBzCitiYWNrIGZyb20gbXVsdGktY2hhcmFjdGVyIHN0cmluZ3MgdG8gdGhlaXIgb3JpZ2luYWwgY29kZSBwb2ludHMsIGZvciB1c2UKK2luIGNhc2UgY2xvc3VyZS4KKworVGhlIHRhYmxlIGNvbnRhaW5zIHR3byBjb2x1bW5zIG9mIHN0cmluZ3MuCitUaGUgc3RyaW5nIGluIHRoZSBmaXJzdCBjb2x1bW4gaXMgdGhlIGNhc2UgZm9sZGluZyBvZiBlYWNoIG9mIHRoZSBjb2RlIHBvaW50cworaW4gdGhlIHNlY29uZCBjb2x1bW4uIFRoZSBzdHJpbmdzIGFyZSB0ZXJtaW5hdGVkIHdpdGggTlVMIG9yIGJ5IHRoZSBlbmQgb2YgdGhlCitjb2x1bW4sIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKworVGhlIG1pc2NlbGxhbmVvdXMgZGF0YSB0YWtlcyB1cCBvbmUgcHNldWRvLXJvdyBhbmQgaW5jbHVkZXM6CistIG51bWJlciBvZiByb3dzCistIG51bWJlciBvZiBVQ2hhcnMgcGVyIHJvdworLSBudW1iZXIgb2YgVUNoYXJzIGluIHRoZSBsZWZ0IChmb2xkaW5nIHN0cmluZykgY29sdW1uCisKK1RoZSB0YWJsZSBpcyBzb3J0ZWQgYnkgaXRzIGZpcnN0IGNvbHVtbi4gVmFsdWVzIGluIHRoZSBmaXJzdCBjb2x1bW4gYXJlIHVuaXF1ZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworVV9OQU1FU1BBQ0VfVVNFCisKKy8qIFVEYXRhSW5mbyBjZi4gdWRhdGEuaCAqLworc3RhdGljIFVEYXRhSW5mbyBkYXRhSW5mbz17CisgICAgc2l6ZW9mKFVEYXRhSW5mbyksCisgICAgMCwKKworICAgIFVfSVNfQklHX0VORElBTiwKKyAgICBVX0NIQVJTRVRfRkFNSUxZLAorICAgIFVfU0laRU9GX1VDSEFSLAorICAgIDAsCisKKyAgICAvKiBkYXRhRm9ybWF0PSJjQXNFIiAqLworICAgIHsgVUNBU0VfRk1UXzAsIFVDQVNFX0ZNVF8xLCBVQ0FTRV9GTVRfMiwgVUNBU0VfRk1UXzMgfSwKKyAgICB7IDMsIDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcm1hdFZlcnNpb24gKi8KKyAgICB7IDYsIDAsIDAsIDAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRhdGFWZXJzaW9uICovCit9OworCisjZGVmaW5lIFVHRU5DQVNFX0VYQ19TSElGVCAgICAgMjAKKyNkZWZpbmUgVUdFTkNBU0VfRVhDX01BU0sgICAgICAweGZmZjAwMDAwCisKK2VudW0geworICAgIE1BWF9FWENfQ09VTlQ9KFVHRU5DQVNFX0VYQ19NQVNLPj5VR0VOQ0FTRV9FWENfU0hJRlQpKzEKK307CisKK3N0cnVjdCBFeGNQcm9wcyB7CisgICAgRXhjUHJvcHMoKQorICAgICAgICAgICAgOiBoYXNDb25kaXRpb25hbENhc2VNYXBwaW5ncyhGQUxTRSksIGhhc1R1cmtpY0Nhc2VGb2xkaW5nKEZBTFNFKSB7fQorICAgIEV4Y1Byb3BzKGNvbnN0IFVuaVByb3BzICZvdGhlclByb3BzKQorICAgICAgICAgICAgOiBwcm9wcyhvdGhlclByb3BzKSwKKyAgICAgICAgICAgICAgaGFzQ29uZGl0aW9uYWxDYXNlTWFwcGluZ3MoRkFMU0UpLCBoYXNUdXJraWNDYXNlRm9sZGluZyhGQUxTRSkge30KKworICAgIFVuaVByb3BzIHByb3BzOworICAgIFVuaWNvZGVTZXQgY2xvc3VyZTsKKyAgICBVQm9vbCBoYXNDb25kaXRpb25hbENhc2VNYXBwaW5nczsKKyAgICBVQm9vbCBoYXNUdXJraWNDYXNlRm9sZGluZzsKK307CisKKy8qCisgKiBWYWx1ZXMgZm9yIHRoZSB1Y2FzZS5pY3UgdW5mb2xkW10gZGF0YSBhcnJheS4KKyAqIFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB1Y2FzZS5pY3Ugc28gdGhhdCB0aGUgcnVudGltZSBjb2RlIHdpbGwgd29yayB3aXRoCisgKiBjaGFuZ2luZyB2YWx1ZXMsIGJ1dCB0aGV5IGFyZSBoYXJkY29kZWQgaGVyZSBmb3Igc2ltcGxpY2l0eS4KKyAqIFRoZXkgYXJlIG9wdGltaXplZCwgdGhhdCBpcywgcHJvdmlkZSBmb3IgbWluaW1hbCB0YWJsZSBjb2x1bW4gd2lkdGhzLAorICogZm9yIHRoZSBhY3R1YWwgVW5pY29kZSBkYXRhLCBzbyB0aGF0IHRoZSB0YWJsZSBzaXplIGlzIG1pbmltaXplZC4KKyAqIEZ1dHVyZSB2ZXJzaW9ucyBvZiBVbmljb2RlIG1heSByZXF1aXJlIGluY3JlYXNlcyBvZiBzb21lIG9mIHRoZXNlIHZhbHVlcy4KKyAqLworZW51bSB7CisgICAgVUdFTkNBU0VfVU5GT0xEX1NUUklOR19XSURUSD0zLAorICAgIFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSD0yLAorICAgIFVHRU5DQVNFX1VORk9MRF9XSURUSD1VR0VOQ0FTRV9VTkZPTERfU1RSSU5HX1dJRFRIK1VHRU5DQVNFX1VORk9MRF9DUF9XSURUSAorfTsKKworY2xhc3MgQ2FzZVByb3BzQnVpbGRlciA6IHB1YmxpYyBQcm9wc0J1aWxkZXIgeworcHVibGljOgorICAgIENhc2VQcm9wc0J1aWxkZXIoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIH5DYXNlUHJvcHNCdWlsZGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VW5pY29kZVZlcnNpb24oY29uc3QgVVZlcnNpb25JbmZvIHZlcnNpb24pOworICAgIHZpcnR1YWwgdm9pZCBzZXRQcm9wcyhjb25zdCBVbmlQcm9wcyAmLCBjb25zdCBVbmljb2RlU2V0ICZuZXdWYWx1ZXMsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdmlydHVhbCB2b2lkIGJ1aWxkKFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlQ1NvdXJjZUZpbGUoY29uc3QgY2hhciAqcGF0aCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVCaW5hcnlEYXRhKGNvbnN0IGNoYXIgKnBhdGgsIFVCb29sIHdpdGhDb3B5cmlnaHQsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbWFrZUV4Y1Byb3BzKFVDaGFyMzIgYywgdWludDMyX3QgdmFsdWUsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdm9pZCBhZGRVbmZvbGRpbmcoVUNoYXIzMiBjLCBjb25zdCBVbmljb2RlU3RyaW5nICZzLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpOworICAgIHZvaWQgbWFrZVVuZm9sZERhdGEoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2b2lkIGFkZENsb3N1cmVNYXBwaW5nKFVDaGFyMzIgc3JjLCBVQ2hhcjMyIGRlc3QsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgVUJvb2wgYWRkQ2xvc3VyZShVQ2hhcjMyIG9yaWcsIFVDaGFyMzIgcHJldjIsIFVDaGFyMzIgcHJldiwgVUNoYXIzMiBjLCB1aW50MzJfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdm9pZCBtYWtlQ2FzZUNsb3N1cmUoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICBpbnQzMl90IG1ha2VFeGNlcHRpb24oVUNoYXIzMiBjLCB1aW50MzJfdCB2YWx1ZSwgRXhjUHJvcHMgJmVwLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpOworICAgIHZvaWQgbWFrZUV4Y2VwdGlvbnMoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKworICAgIFVuaWNvZGVTZXQgcmVsZXZhbnRQcm9wczsKKyAgICAvKgorICAgICAqIFVuaWNvZGUgc2V0IGNvbGxlY3RpbmcgdGhlIGNhc2Utc2Vuc2l0aXZlIGNoYXJhY3RlcnM7CisgICAgICogc2VlIHVjaGFyLmggVUNIQVJfQ0FTRV9TRU5TSVRJVkUuCisgICAgICogQWRkIGNvZGUgcG9pbnRzIGZyb20gY2FzZSBtYXBwaW5ncy9mb2xkaW5ncyBpbgorICAgICAqIHRoZSByb290IGxvY2FsZSBhbmQgd2l0aCBkZWZhdWx0IG9wdGlvbnMuCisgICAgICovCisgICAgVW5pY29kZVNldCBjYXNlU2Vuc2l0aXZlOworICAgIC8qIHJldmVyc2UgY2FzZSBmb2xkaW5nICgidW5mb2xkIikgZGF0YSAqLworICAgIFVuaWNvZGVTdHJpbmcgdW5mb2xkOworICAgIFVuaWNvZGVTdHJpbmcgZXhjZXB0aW9uczsKKyAgICBFeGNQcm9wcyAqKmV4Y1Byb3BzOworICAgIGludDMyX3QgZXhjUHJvcHNDb3VudDsKKyAgICAvKiBiZWNvbWVzIGluZGV4ZXNbVUNBU0VfSVhfTUFYX0ZVTExfTEVOR1RIXSAqLworICAgIGludDMyX3QgbWF4RnVsbExlbmd0aDsKKyAgICBVVHJpZTIgKnBUcmllOworfTsKKworQ2FzZVByb3BzQnVpbGRlcjo6Q2FzZVByb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpCisgICAgICAgIDogZXhjUHJvcHMoTlVMTCksIGV4Y1Byb3BzQ291bnQoMCksIG1heEZ1bGxMZW5ndGgoVTE2X01BWF9MRU5HVEgpLCBwVHJpZShOVUxMKSB7CisgICAgLy8gVGhpcyBidWlsZGVyIGVuY29kZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLgorICAgIHJlbGV2YW50UHJvcHMuCisgICAgICAgIGFkZChVQ0hBUl9DQU5PTklDQUxfQ09NQklOSU5HX0NMQVNTKS4gIC8vIDAgdnMuIDIzMCB2cy4gb3RoZXIKKyAgICAgICAgYWRkKFVDSEFSX1NPRlRfRE9UVEVEKS4KKyAgICAgICAgYWRkKFVDSEFSX0xPV0VSQ0FTRSkuCisgICAgICAgIGFkZChVQ0hBUl9VUFBFUkNBU0UpLgorICAgICAgICBhZGQoVUNIQVJfQ0FTRV9JR05PUkFCTEUpLgorICAgICAgICBhZGQoVUNIQVJfU0lNUExFX0NBU0VfRk9MRElORykuCisgICAgICAgIGFkZChVQ0hBUl9TSU1QTEVfTE9XRVJDQVNFX01BUFBJTkcpLgorICAgICAgICBhZGQoVUNIQVJfU0lNUExFX1RJVExFQ0FTRV9NQVBQSU5HKS4KKyAgICAgICAgYWRkKFVDSEFSX1NJTVBMRV9VUFBFUkNBU0VfTUFQUElORykuCisgICAgICAgIGFkZChVQ0hBUl9DQVNFX0ZPTERJTkcpLgorICAgICAgICBhZGQoVUNIQVJfTE9XRVJDQVNFX01BUFBJTkcpLgorICAgICAgICBhZGQoVUNIQVJfVElUTEVDQVNFX01BUFBJTkcpLgorICAgICAgICBhZGQoVUNIQVJfVVBQRVJDQVNFX01BUFBJTkcpLgorICAgICAgICBhZGQoUFBVQ0RfQ09ORElUSU9OQUxfQ0FTRV9NQVBQSU5HUykuCisgICAgICAgIGFkZChQUFVDRF9UVVJLSUNfQ0FTRV9GT0xESU5HKTsKKyAgICAvLyBXcml0ZSAidW5mb2xkIiBtZXRhIGRhdGEgaW50byB0aGUgZmlyc3Qgcm93LiBNdXN0IGJlIFVHRU5DQVNFX1VORk9MRF9XSURUSCBVQ2hhcnMuCisgICAgdW5mb2xkLgorICAgICAgICBhcHBlbmQoMCkuCisgICAgICAgIGFwcGVuZCgoVUNoYXIpVUdFTkNBU0VfVU5GT0xEX1dJRFRIKS4KKyAgICAgICAgYXBwZW5kKChVQ2hhcilVR0VOQ0FTRV9VTkZPTERfU1RSSU5HX1dJRFRIKS4KKyAgICAgICAgYXBwZW5kKDApLgorICAgICAgICBhcHBlbmQoMCk7CisgICAgVV9BU1NFUlQodW5mb2xkLmxlbmd0aCgpPT1VR0VOQ0FTRV9VTkZPTERfV0lEVEgpOworICAgIHBUcmllPXV0cmllMl9vcGVuKDAsIDAsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IGNhc2Vwcm9wc2J1aWxkZXIgdXRyaWUyX29wZW4oKSBmYWlsZWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBleGNQcm9wcz1uZXcgRXhjUHJvcHMgKltNQVhfRVhDX0NPVU5UXTsKKyAgICBpZihleGNQcm9wcz09TlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiZ2VucHJvcHMgZXJyb3I6IGNhc2Vwcm9wc2J1aWxkZXIgb3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAidGhlIGFycmF5IG9mIGV4Y2VwdGlvbnMgcHJvcGVydGllc1xuIik7CisgICAgICAgIGVycm9yQ29kZT1VX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SOworICAgIH0KK30KKworQ2FzZVByb3BzQnVpbGRlcjo6fkNhc2VQcm9wc0J1aWxkZXIoKSB7CisgICAgdXRyaWUyX2Nsb3NlKHBUcmllKTsKKyAgICBmb3IoaW50MzJfdCBpPTA7IGk8ZXhjUHJvcHNDb3VudDsgKytpKSB7CisgICAgICAgIGRlbGV0ZSBleGNQcm9wc1tpXTsKKyAgICB9CisgICAgZGVsZXRlW10gZXhjUHJvcHM7Cit9CisKK3ZvaWQKK0Nhc2VQcm9wc0J1aWxkZXI6OnNldFVuaWNvZGVWZXJzaW9uKGNvbnN0IFVWZXJzaW9uSW5mbyB2ZXJzaW9uKSB7CisgICAgdXBydl9tZW1jcHkoZGF0YUluZm8uZGF0YVZlcnNpb24sIHZlcnNpb24sIDQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitDYXNlUHJvcHNCdWlsZGVyOjphZGRVbmZvbGRpbmcoVUNoYXIzMiBjLCBjb25zdCBVbmljb2RlU3RyaW5nICZzLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKworICAgIGludDMyX3QgbGVuZ3RoPXMubGVuZ3RoKCk7CisgICAgaWYobGVuZ3RoPlVHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogY2FzZSBmb2xkaW5nIHRvbyBsb25nIChsZW5ndGg9JWxkPiVkPVVHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEgpXG4iLAorICAgICAgICAgICAgICAgIChsb25nKWxlbmd0aCwgVUdFTkNBU0VfVU5GT0xEX1NUUklOR19XSURUSCk7CisgICAgICAgIGVycm9yQ29kZT1VX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgfQorICAgIHVuZm9sZC5hcHBlbmQocyk7CisgICAgd2hpbGUobGVuZ3RoPFVHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEgpIHsKKyAgICAgICAgdW5mb2xkLmFwcGVuZCgwKTsKKyAgICAgICAgKytsZW5ndGg7CisgICAgfQorCisgICAgdW5mb2xkLmFwcGVuZChjKTsKKyAgICBpZihVMTZfTEVOR1RIKGMpPFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSCkgeworICAgICAgICB1bmZvbGQuYXBwZW5kKDApOworICAgIH0KKworICAgIFVfQVNTRVJUKCh1bmZvbGQubGVuZ3RoKCklVUdFTkNBU0VfVU5GT0xEX1dJRFRIKT09MCk7Cit9CisKKy8qIHN0b3JlIGEgY2hhcmFjdGVyJ3MgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK0Nhc2VQcm9wc0J1aWxkZXI6OnNldFByb3BzKGNvbnN0IFVuaVByb3BzICZwcm9wcywgY29uc3QgVW5pY29kZVNldCAmbmV3VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkgfHwgbmV3VmFsdWVzLmNvbnRhaW5zTm9uZShyZWxldmFudFByb3BzKSkgeyByZXR1cm47IH0KKworICAgIFVDaGFyMzIgc3RhcnQ9cHJvcHMuc3RhcnQ7CisgICAgVUNoYXIzMiBlbmQ9cHJvcHMuZW5kOworCisgICAgLyogZGVmYXVsdDogbWFwIHRvIHNlbGYgKi8KKyAgICBpbnQzMl90IGRlbHRhPTA7CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGlmKHByb3BzLmJpblByb3BzW1VDSEFSX0xPV0VSQ0FTRV0pIHsKKyAgICAgICAgdHlwZT1VQ0FTRV9MT1dFUjsKKyAgICB9IGVsc2UgaWYocHJvcHMuYmluUHJvcHNbVUNIQVJfVVBQRVJDQVNFXSkgeworICAgICAgICB0eXBlPVVDQVNFX1VQUEVSOworICAgIH0gZWxzZSBpZihwcm9wcy5nZXRJbnRQcm9wKFVDSEFSX0dFTkVSQUxfQ0FURUdPUlkpPT1VX1RJVExFQ0FTRV9MRVRURVIpIHsKKyAgICAgICAgdHlwZT1VQ0FTRV9USVRMRTsKKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlPVVDQVNFX05PTkU7CisgICAgfQorICAgIHVpbnQzMl90IHZhbHVlPXR5cGU7CisKKyAgICBVQm9vbCBoYXNNYXBwaW5nPUZBTFNFOworICAgIGlmKHByb3BzLnN1Yz49MCkgeworICAgICAgICAvKiB1cHBlcmNhc2UgbWFwcGluZyBhcyBkZWx0YSBpZiB0aGUgY2hhcmFjdGVyIGlzIGxvd2VyY2FzZSAqLworICAgICAgICBoYXNNYXBwaW5nPVRSVUU7CisgICAgICAgIGlmKHR5cGU9PVVDQVNFX0xPV0VSKSB7CisgICAgICAgICAgICBkZWx0YT1wcm9wcy5zdWMtc3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZXw9VUNBU0VfRVhDRVBUSU9OOworICAgICAgICB9CisgICAgfQorICAgIGlmKHByb3BzLnNsYz49MCkgeworICAgICAgICAvKiBsb3dlcmNhc2UgbWFwcGluZyBhcyBkZWx0YSBpZiB0aGUgY2hhcmFjdGVyIGlzIHVwcGVyY2FzZSBvciB0aXRsZWNhc2UgKi8KKyAgICAgICAgaGFzTWFwcGluZz1UUlVFOworICAgICAgICBpZih0eXBlPj1VQ0FTRV9VUFBFUikgeworICAgICAgICAgICAgZGVsdGE9cHJvcHMuc2xjLXN0YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWV8PVVDQVNFX0VYQ0VQVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihwcm9wcy5zdGM+PTApIHsKKyAgICAgICAgaGFzTWFwcGluZz1UUlVFOworICAgIH0KKyAgICBpZihwcm9wcy5zdWMhPXByb3BzLnN0YykgeworICAgICAgICB2YWx1ZXw9VUNBU0VfRVhDRVBUSU9OOworICAgIH0KKyAgICBpZighcHJvcHMubGMuaXNFbXB0eSgpIHx8ICFwcm9wcy51Yy5pc0VtcHR5KCkgfHwgIXByb3BzLnRjLmlzRW1wdHkoKSB8fAorICAgICAgICBuZXdWYWx1ZXMuY29udGFpbnMoUFBVQ0RfQ09ORElUSU9OQUxfQ0FTRV9NQVBQSU5HUykKKyAgICApIHsKKyAgICAgICAgaGFzTWFwcGluZz1UUlVFOworICAgICAgICB2YWx1ZXw9VUNBU0VfRVhDRVBUSU9OOworICAgIH0KKyAgICBpZiggKHByb3BzLnNjZj49MCAmJiBwcm9wcy5zY2YhPXByb3BzLnNsYykgfHwKKyAgICAgICAgKCFwcm9wcy5jZi5pc0VtcHR5KCkgJiYgcHJvcHMuY2YhPVVuaWNvZGVTdHJpbmcocHJvcHMuc2NmKSkgfHwKKyAgICAgICAgbmV3VmFsdWVzLmNvbnRhaW5zKFBQVUNEX1RVUktJQ19DQVNFX0ZPTERJTkcpCisgICAgKSB7CisgICAgICAgIGhhc01hcHBpbmc9VFJVRTsKKyAgICAgICAgdmFsdWV8PVVDQVNFX0VYQ0VQVElPTjsKKyAgICB9CisKKyAgICBpZihkZWx0YTxVQ0FTRV9NSU5fREVMVEEgfHwgVUNBU0VfTUFYX0RFTFRBPGRlbHRhKSB7CisgICAgICAgIHZhbHVlfD1VQ0FTRV9FWENFUFRJT047CisgICAgfQorCisgICAgaWYocHJvcHMuYmluUHJvcHNbVUNIQVJfU09GVF9ET1RURURdKSB7CisgICAgICAgIHZhbHVlfD1VQ0FTRV9TT0ZUX0RPVFRFRDsKKyAgICB9CisgICAgaW50MzJfdCBjYz1wcm9wcy5nZXRJbnRQcm9wKFVDSEFSX0NBTk9OSUNBTF9DT01CSU5JTkdfQ0xBU1MpOworICAgIGlmKGNjIT0wKSB7CisgICAgICAgIGlmKHByb3BzLmJpblByb3BzW1VDSEFSX1NPRlRfRE9UVEVEXSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogYSBzb2Z0LWRvdHRlZCBjaGFyYWN0ZXIgaGFzIGNjYyE9MFxuIik7CisgICAgICAgICAgICBlcnJvckNvZGU9VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKGNjPT0yMzApIHsKKyAgICAgICAgICAgIHZhbHVlfD1VQ0FTRV9BQk9WRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbHVlfD1VQ0FTRV9PVEhFUl9BQ0NFTlQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwcm9wcy5iaW5Qcm9wc1tVQ0hBUl9DQVNFX0lHTk9SQUJMRV0pIHsKKyAgICAgICAgdmFsdWV8PVVDQVNFX0lHTk9SQUJMRTsKKyAgICB9CisKKyAgICBpZigoaGFzTWFwcGluZyB8fCAodmFsdWUmVUNBU0VfRVhDRVBUSU9OKSkgJiYgc3RhcnQhPWVuZCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiZ2VucHJvcHMgZXJyb3I6IHJhbmdlICUwNGxYLi4lMDRsWCBoYXMgY2FzZSBtYXBwaW5ncyAiCisgICAgICAgICAgICAgICAgIm9yIHJlYXNvbnMgZm9yIGRhdGEgc3RydWN0dXJlIGV4Y2VwdGlvbnNcbiIsCisgICAgICAgICAgICAgICAgKGxvbmcpc3RhcnQsIChsb25nKWVuZCk7CisgICAgICAgIGVycm9yQ29kZT1VX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBoYW5kbGUgZXhjZXB0aW9ucyAqLworICAgIGlmKHZhbHVlJlVDQVNFX0VYQ0VQVElPTikgeworICAgICAgICAvKiBzaW1wbHkgc3RvcmUgZXhjZXB0aW9ucyBmb3IgbGF0ZXIgcHJvY2Vzc2luZyBhbmQgZW5jb2RpbmcgKi8KKyAgICAgICAgaWYoZXhjUHJvcHNDb3VudD09TUFYX0VYQ19DT1VOVCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogY2FzZXByb3BzYnVpbGRlcjogdG9vIG1hbnkgZXhjZXB0aW9uc1xuIik7CisgICAgICAgICAgICBlcnJvckNvZGU9VV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBFeGNQcm9wcyAqbmV3RXhjUHJvcHM9bmV3IEV4Y1Byb3BzKHByb3BzKTsKKyAgICAgICAgaWYobmV3RXhjUHJvcHM9PU5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiZ2VucHJvcHMgZXJyb3I6IGNhc2Vwcm9wc2J1aWxkZXIgb3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgcHJvcGVydGllc1xuIik7CisgICAgICAgICAgICBlcnJvckNvZGU9VV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBuZXdFeGNQcm9wcy0+aGFzQ29uZGl0aW9uYWxDYXNlTWFwcGluZ3M9bmV3VmFsdWVzLmNvbnRhaW5zKFBQVUNEX0NPTkRJVElPTkFMX0NBU0VfTUFQUElOR1MpOworICAgICAgICBuZXdFeGNQcm9wcy0+aGFzVHVya2ljQ2FzZUZvbGRpbmc9bmV3VmFsdWVzLmNvbnRhaW5zKFBQVUNEX1RVUktJQ19DQVNFX0ZPTERJTkcpOworICAgICAgICB2YWx1ZXw9KHVpbnQzMl90KWV4Y1Byb3BzQ291bnQ8PFVHRU5DQVNFX0VYQ19TSElGVDsKKyAgICAgICAgZXhjUHJvcHNbZXhjUHJvcHNDb3VudCsrXT1uZXdFeGNQcm9wczsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBzdG9yZSB0aGUgc2ltcGxlIGNhc2UgbWFwcGluZyBkZWx0YSAqLworICAgICAgICB2YWx1ZXw9KCh1aW50MzJfdClkZWx0YTw8VUNBU0VfREVMVEFfU0hJRlQpJlVDQVNFX0RFTFRBX01BU0s7CisgICAgfQorCisgICAgdXRyaWUyX3NldFJhbmdlMzIocFRyaWUsIHN0YXJ0LCBlbmQsIHZhbHVlLCBUUlVFLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmFibGUgdG8gc2V0IGNhc2UgbWFwcGluZyB2YWx1ZXM6ICVzXG4iLAorICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoaGFzTWFwcGluZykgeworICAgICAgICAvKiB1cGRhdGUgdGhlIGNhc2Utc2Vuc2l0aXZlIHNldCAqLworICAgICAgICBjYXNlU2Vuc2l0aXZlLmFkZChzdGFydCk7CisgICAgICAgIGlmKHByb3BzLnNjZj49MCkgeyBjYXNlU2Vuc2l0aXZlLmFkZChwcm9wcy5zY2YpOyB9CisgICAgICAgIGlmKHByb3BzLnNsYz49MCkgeyBjYXNlU2Vuc2l0aXZlLmFkZChwcm9wcy5zbGMpOyB9CisgICAgICAgIGlmKHByb3BzLnN1Yz49MCkgeyBjYXNlU2Vuc2l0aXZlLmFkZChwcm9wcy5zdWMpOyB9CisgICAgICAgIGlmKHByb3BzLnN0Yz49MCkgeyBjYXNlU2Vuc2l0aXZlLmFkZChwcm9wcy5zdGMpOyB9CisgICAgICAgIGNhc2VTZW5zaXRpdmUuYWRkQWxsKHByb3BzLmNmKTsKKyAgICAgICAgY2FzZVNlbnNpdGl2ZS5hZGRBbGwocHJvcHMubGMpOworICAgICAgICBjYXNlU2Vuc2l0aXZlLmFkZEFsbChwcm9wcy51Yyk7CisgICAgICAgIGNhc2VTZW5zaXRpdmUuYWRkQWxsKHByb3BzLnRjKTsKKworICAgICAgICAvKiB1cGRhdGUgbWF4RnVsbExlbmd0aCAqLworICAgICAgICBpZihwcm9wcy5jZi5sZW5ndGgoKT5tYXhGdWxsTGVuZ3RoKSB7IG1heEZ1bGxMZW5ndGg9cHJvcHMuY2YubGVuZ3RoKCk7IH0KKyAgICAgICAgaWYocHJvcHMubGMubGVuZ3RoKCk+bWF4RnVsbExlbmd0aCkgeyBtYXhGdWxsTGVuZ3RoPXByb3BzLmxjLmxlbmd0aCgpOyB9CisgICAgICAgIGlmKHByb3BzLnVjLmxlbmd0aCgpPm1heEZ1bGxMZW5ndGgpIHsgbWF4RnVsbExlbmd0aD1wcm9wcy51Yy5sZW5ndGgoKTsgfQorICAgICAgICBpZihwcm9wcy50Yy5sZW5ndGgoKT5tYXhGdWxsTGVuZ3RoKSB7IG1heEZ1bGxMZW5ndGg9cHJvcHMudGMubGVuZ3RoKCk7IH0KKyAgICB9CisKKyAgICAvKiBhZGQgdGhlIG11bHRpLWNoYXJhY3RlciBjYXNlIGZvbGRpbmcgdG8gdGhlICJ1bmZvbGQiIGRhdGEgKi8KKyAgICBpZihwcm9wcy5jZi5oYXNNb3JlQ2hhcjMyVGhhbigwLCAweDdmZmZmZmZmLCAxKSkgeworICAgICAgICBhZGRVbmZvbGRpbmcoc3RhcnQsIHByb3BzLmNmLCBlcnJvckNvZGUpOworICAgIH0KK30KKwordWludDMyX3QKK0Nhc2VQcm9wc0J1aWxkZXI6Om1ha2VFeGNQcm9wcyhVQ2hhcjMyIGMsIHVpbnQzMl90IHZhbHVlLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm4gMDsgfQorICAgIGlmKGV4Y1Byb3BzQ291bnQ9PU1BWF9FWENfQ09VTlQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogY2FzZXByb3BzYnVpbGRlcjogdG9vIG1hbnkgZXhjZXB0aW9uc1xuIik7CisgICAgICAgIGVycm9yQ29kZT1VX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTG9jYWxQb2ludGVyPEV4Y1Byb3BzPiBuZXdFeGNQcm9wcyhuZXcgRXhjUHJvcHMpOworICAgIGlmKG5ld0V4Y1Byb3BzPT1OVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJnZW5wcm9wcyBlcnJvcjogY2FzZXByb3BzYnVpbGRlciBvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICJleGNlcHRpb25zIHByb3BlcnRpZXNcbiIpOworICAgICAgICBlcnJvckNvZGU9VV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYoKHZhbHVlJlVDQVNFX1RZUEVfTUFTSyk+VUNBU0VfTk9ORSkgeworICAgICAgICAvLyBEZWNvZGUgdGhlIHNpbXBsZSBjYXNlIG1hcHBpbmcuCisgICAgICAgIFVDaGFyMzIgbmV4dD1jK1VDQVNFX0dFVF9ERUxUQSh2YWx1ZSk7CisgICAgICAgIGlmKG5leHQhPWMpIHsKKyAgICAgICAgICAgIFVuaVByb3BzICZwPW5ld0V4Y1Byb3BzLT5wcm9wczsKKyAgICAgICAgICAgIGlmKCh2YWx1ZSZVQ0FTRV9UWVBFX01BU0spPT1VQ0FTRV9MT1dFUikgeworICAgICAgICAgICAgICAgIHAuc3VjPXAuc3RjPW5leHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHAuc2xjPW5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YWx1ZSY9fihVR0VOQ0FTRV9FWENfTUFTS3xVQ0FTRV9ERUxUQV9NQVNLKTsgLy8gcmVtb3ZlIHByZXZpb3VzIHNpbXBsZSBtYXBwaW5nCisgICAgdmFsdWV8PSh1aW50MzJfdClleGNQcm9wc0NvdW50PDxVR0VOQ0FTRV9FWENfU0hJRlQ7CisgICAgdmFsdWV8PVVDQVNFX0VYQ0VQVElPTjsKKyAgICBleGNQcm9wc1tleGNQcm9wc0NvdW50KytdPW5ld0V4Y1Byb3BzLm9ycGhhbigpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyogZmluYWxpemUgcmV2ZXJzZSBjYXNlIGZvbGRpbmcgKCJ1bmZvbGQiKSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludDMyX3QgVV9DQUxMQ09OVgorY29tcGFyZVVuZm9sZChjb25zdCB2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpsZWZ0LCBjb25zdCB2b2lkICpyaWdodCkgeworICAgIHJldHVybiB1X21lbWNtcCgoY29uc3QgVUNoYXIgKilsZWZ0LCAoY29uc3QgVUNoYXIgKilyaWdodCwgVUdFTkNBU0VfVU5GT0xEX1dJRFRIKTsKK30KKwordm9pZAorQ2FzZVByb3BzQnVpbGRlcjo6bWFrZVVuZm9sZERhdGEoVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICBVQ2hhciAqcCwgKnE7CisgICAgaW50MzJfdCBpLCBqLCBrOworCisgICAgLyogc29ydCB0aGUgZGF0YSAqLworICAgIGludDMyX3QgdW5mb2xkTGVuZ3RoPXVuZm9sZC5sZW5ndGgoKTsKKyAgICBpbnQzMl90IHVuZm9sZFJvd3M9dW5mb2xkTGVuZ3RoL1VHRU5DQVNFX1VORk9MRF9XSURUSC0xOworICAgIFVDaGFyICp1bmZvbGRCdWZmZXI9dW5mb2xkLmdldEJ1ZmZlcigtMSk7CisgICAgdXBydl9zb3J0QXJyYXkodW5mb2xkQnVmZmVyK1VHRU5DQVNFX1VORk9MRF9XSURUSCwgdW5mb2xkUm93cywgVUdFTkNBU0VfVU5GT0xEX1dJRFRIKjIsCisgICAgICAgICAgICAgICAgICAgY29tcGFyZVVuZm9sZCwgTlVMTCwgRkFMU0UsICZlcnJvckNvZGUpOworCisgICAgLyogbWFrZSB1bmlxdWUtc3RyaW5nIHJvd3MgYnkgbWVyZ2luZyBhZGphY2VudCBvbmVzJyBjb2RlIHBvaW50IGNvbHVtbnMgKi8KKworICAgIC8qIG1ha2UgcCBwb2ludCB0byByb3cgaS0xICovCisgICAgcD11bmZvbGRCdWZmZXIrVUdFTkNBU0VfVU5GT0xEX1dJRFRIOworCisgICAgZm9yKGk9MTsgaTx1bmZvbGRSb3dzOykgeworICAgICAgICBpZigwPT11X21lbWNtcChwLCBwK1VHRU5DQVNFX1VORk9MRF9XSURUSCwgVUdFTkNBU0VfVU5GT0xEX1NUUklOR19XSURUSCkpIHsKKyAgICAgICAgICAgIC8qIGNvbmNhdGVuYXRlIGNvZGUgcG9pbnQgY29sdW1ucyAqLworICAgICAgICAgICAgcT1wK1VHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEg7CisgICAgICAgICAgICBmb3Ioaj0xOyBqPFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSCAmJiBxW2pdIT0wOyArK2opIHt9CisgICAgICAgICAgICBmb3Ioaz0wOyBrPFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSCAmJiBxW1VHRU5DQVNFX1VORk9MRF9XSURUSCtrXSE9MDsgKytqLCArK2spIHsKKyAgICAgICAgICAgICAgICBxW2pdPXFbVUdFTkNBU0VfVU5GT0xEX1dJRFRIK2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoaj5VR0VOQ0FTRV9VTkZPTERfQ1BfV0lEVEgpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB0b28gbWFueSBjb2RlIHBvaW50cyBpbiB1bmZvbGRbXTogJWxkPiVkPVVHRU5DQVNFX1VORk9MRF9DUF9XSURUSFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKWosIFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSCk7CisgICAgICAgICAgICAgICAgZXJyb3JDb2RlPVVfQlVGRkVSX09WRVJGTE9XX0VSUk9SOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbW92ZSBmb2xsb3dpbmcgcm93cyB1cCBvbmUgKi8KKyAgICAgICAgICAgIC0tdW5mb2xkUm93czsKKyAgICAgICAgICAgIHVfbWVtbW92ZShwK1VHRU5DQVNFX1VORk9MRF9XSURUSCwgcCtVR0VOQ0FTRV9VTkZPTERfV0lEVEgqMiwgKHVuZm9sZFJvd3MtaSkqVUdFTkNBU0VfVU5GT0xEX1dJRFRIKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHArPVVHRU5DQVNFX1VORk9MRF9XSURUSDsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVuZm9sZEJ1ZmZlcltVQ0FTRV9VTkZPTERfUk9XU109KFVDaGFyKXVuZm9sZFJvd3M7CisKKyAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgcHV0cygidW5mb2xkIGRhdGE6Iik7CisKKyAgICAgICAgcD11bmZvbGRCdWZmZXI7CisgICAgICAgIGZvcihpPTA7IGk8dW5mb2xkUm93czsgKytpKSB7CisgICAgICAgICAgICBwKz1VR0VOQ0FTRV9VTkZPTERfV0lEVEg7CisgICAgICAgICAgICBwcmludGYoIlslMmRdICUwNHggJTA0eCAlMDR4IDwtICUwNHggJTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KWksIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0pOworICAgICAgICB9CisgICAgfQorCisgICAgdW5mb2xkLnJlbGVhc2VCdWZmZXIoKHVuZm9sZFJvd3MrMSkqVUdFTkNBU0VfVU5GT0xEX1dJRFRIKTsKK30KKworLyogY2FzZSBjbG9zdXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorQ2FzZVByb3BzQnVpbGRlcjo6YWRkQ2xvc3VyZU1hcHBpbmcoVUNoYXIzMiBzcmMsIFVDaGFyMzIgZGVzdCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJhZGQgY2xvc3VyZSBtYXBwaW5nIFUrJTA0bHgtPlUrJTA0bHhcbiIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc3JjLCAodW5zaWduZWQgbG9uZylkZXN0KTsKKyAgICB9CisKKyAgICB1aW50MzJfdCB2YWx1ZT11dHJpZTJfZ2V0MzIocFRyaWUsIHNyYyk7CisgICAgaWYoKHZhbHVlJlVDQVNFX0VYQ0VQVElPTik9PTApIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZGVjb2RlIHZhbHVlIGludG8gcDIgKGVub3VnaCBmb3IgbWFrZUV4Y2VwdGlvbigpIHRvIHdvcmsgcHJvcGVybHkpLAorICAgICAgICAgKiBhZGQgdGhlIGNsb3N1cmUgbWFwcGluZywKKyAgICAgICAgICogYW5kIHNldCB0aGUgbmV3IGV4Y2VwdGlvbiBmb3Igc3JjCisgICAgICAgICAqLworICAgICAgICB2YWx1ZT1tYWtlRXhjUHJvcHMoc3JjLCB2YWx1ZSwgZXJyb3JDb2RlKTsKKyAgICAgICAgdXRyaWUyX3NldDMyKHBUcmllLCBzcmMsIHZhbHVlLCAmZXJyb3JDb2RlKTsKKyAgICAgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IHVuYWJsZSB0byBzZXQgY2FzZSBtYXBwaW5nIHZhbHVlcywgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZXhjUHJvcHNbdmFsdWU+PlVHRU5DQVNFX0VYQ19TSElGVF0tPmNsb3N1cmUuYWRkKGRlc3QpOworfQorCisvKgorICogRmluZCBtaXNzaW5nIGNhc2UgbWFwcGluZyByZWxhdGlvbnNoaXBzIGFuZCBhZGQgbWFwcGluZ3MgZm9yIGNhc2UgY2xvc3VyZS4KKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIGZyb20gYW4gIm9yaWdpbmFsIiBjb2RlIHBvaW50IGFuZCByZWN1cnNpdmVseQorICogZmluZHMgaXRzIGNhc2UgbWFwcGluZ3MgYW5kIHRoZSBjYXNlIG1hcHBpbmdzIG9mIHdoZXJlIGl0IG1hcHMgdG8uCisgKgorICogVGhlIHJlY3Vyc2lvbiBkZXB0aCBpcyBjYXBwZWQgYXQgMyBuZXN0ZWQgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbi4KKyAqIEluIGVhY2ggY2FsbCwgdGhlIGN1cnJlbnQgY29kZSBwb2ludCBpcyBjLCBhbmQgdGhlIGZ1bmN0aW9uIGVudW1lcmF0ZXMKKyAqIGFsbCBvZiBjJ3Mgc2ltcGxlIChzaW5nbGUtY29kZSBwb2ludCkgY2FzZSBtYXBwaW5ncy4KKyAqIHByZXYgaXMgdGhlIGNvZGUgcG9pbnQgdGhhdCBjYXNlLW1hcHBlZCB0byBjLgorICogcHJldjIgaXMgdGhlIGNvZGUgcG9pbnQgdGhhdCBjYXNlLW1hcHBlZCB0byBwcmV2LgorICoKKyAqIFRoZSBpbml0aWFsIGZ1bmN0aW9uIGNhbGwgaGFzIHByZXYyPDAsIHByZXY8MCwgYW5kIGM9PW9yaWcKKyAqIChtYXJraW5nIG5vIGNvZGUgcG9pbnRzKS4KKyAqIEl0IGVudW1lcmF0ZXMgYydzIGNhc2UgbWFwcGluZ3MgYW5kIHJlY3Vyc2VzIHdpdGhvdXQgZnVydGhlciBhY3Rpb24uCisgKgorICogVGhlIHNlY29uZC1sZXZlbCBmdW5jdGlvbiBjYWxsIGhhcyBwcmV2MjwwLCBwcmV2PT1vcmlnLCBhbmQgYyBpcworICogdGhlIGRlc3RpbmF0aW9uIGNvZGUgcG9pbnQgb2Ygb25lIG9mIHByZXYncyBjYXNlIG1hcHBpbmdzLgorICogVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbnkgb2YgYydzIGNhc2UgbWFwcGluZ3MgZ28gYmFjayB0byBvcmlnCisgKiBhbmQgYWRkcyBhIGNsb3N1cmUgbWFwcGluZyBpZiBub3QuCisgKiBJbiBvdGhlciB3b3JkcywgaXQgdHVybnMgYSBjYXNlIG1hcHBpbmcgcmVsYXRpb25zaGlwIG9mCisgKiAgIG9yaWctPmMKKyAqIGludG8KKyAqICAgb3JpZzwtPmMKKyAqCisgKiBUaGUgdGhpcmQtbGV2ZWwgZnVuY3Rpb24gY2FsbCBoYXMgcHJldjI9PW9yaWcsIHByZXY+PTAsIGFuZCBjIGlzCisgKiB0aGUgZGVzdGluYXRpb24gY29kZSBwb2ludCBvZiBvbmUgb2YgcHJldidzIGNhc2UgbWFwcGluZ3MuCisgKiAoQW5kIHByZXYgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIG9uZSBvZiBwcmV2MidzIGNhc2UgbWFwcGluZ3MuKQorICogVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbnkgb2YgYydzIGNhc2UgbWFwcGluZ3MgZ28gYmFjayB0byBvcmlnCisgKiBhbmQgYWRkcyBhIGNsb3N1cmUgbWFwcGluZyBpZiBub3QuCisgKiBJbiBvdGhlciB3b3JkcywgaXQgdHVybnMgY2FzZSBtYXBwaW5nIHJlbGF0aW9uc2hpcHMgb2YKKyAqICAgb3JpZy0+cHJldi0+YyBvciBvcmlnLT5wcmV2PC0+YworICogaW50bworICogICBvcmlnLT5wcmV2LT5jLT5vcmlnIG9yIG9yaWctPnByZXY8LT5jLT5vcmlnCisgKiBldGMuCisgKiAoR3JhcGhpY2FsbHksIHRoaXMgY2xvc2VzIGEgdHJpYW5nbGUuKQorICoKKyAqIFdpdGggcmVwZWF0ZWQgYXBwbGljYXRpb24gb24gYWxsIGNvZGUgcG9pbnRzIHVudGlsIG5vIG1vcmUgY2xvc3VyZSBtYXBwaW5ncworICogYXJlIGFkZGVkLCBhbGwgY2FzZSBlcXVpdmFsZW5jZSBncm91cHMgZ2V0IGNvbXBsZXRlIG1hcHBpbmdzLgorICogVGhhdCBpcywgaW4gZWFjaCBncm91cCBvZiBjb2RlIHBvaW50cyB3aXRoIGNhc2UgcmVsYXRpb25zaGlwcworICogZWFjaCBjb2RlIHBvaW50IHdpbGwgaW4gdGhlIGVuZCBoYXZlIHNvbWUgbWFwcGluZyB0byBlYWNoIG90aGVyCisgKiBjb2RlIHBvaW50IGluIHRoZSBncm91cC4KKyAqCisgKiBAcmV0dXJuIFRSVUUgaWYgYSBjbG9zdXJlIG1hcHBpbmcgd2FzIGFkZGVkCisgKi8KK1VCb29sCitDYXNlUHJvcHNCdWlsZGVyOjphZGRDbG9zdXJlKFVDaGFyMzIgb3JpZywgVUNoYXIzMiBwcmV2MiwgVUNoYXIzMiBwcmV2LCBVQ2hhcjMyIGMsIHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm4gRkFMU0U7IH0KKworICAgIFVDaGFyMzIgbmV4dDsKKyAgICBVQm9vbCBzb21lTWFwcGluZ3NBZGRlZD1GQUxTRTsKKworICAgIGlmKGMhPW9yaWcpIHsKKyAgICAgICAgLyogZ2V0IHRoZSBwcm9wZXJ0aWVzIGZvciBjICovCisgICAgICAgIHZhbHVlPXV0cmllMl9nZXQzMihwVHJpZSwgYyk7CisgICAgfQorICAgIC8qIGVsc2UgaWYgYz09b3JpZyB0aGVuIGMncyB2YWx1ZSB3YXMgcGFzc2VkIGluICovCisKKyAgICBpZih2YWx1ZSZVQ0FTRV9FWENFUFRJT04pIHsKKyAgICAgICAgVW5pY29kZVNldCBzZXQ7CisKKyAgICAgICAgRXhjUHJvcHMgJmVwPSpleGNQcm9wc1t2YWx1ZT4+VUdFTkNBU0VfRVhDX1NISUZUXTsKKyAgICAgICAgVW5pUHJvcHMgJnA9ZXAucHJvcHM7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogbWFya2VyIGZvciB3aGV0aGVyIGFueSBvZiBjJ3MgbWFwcGluZ3MgZ29lcyB0byBvcmlnCisgICAgICAgICAqIGM9PW9yaWc6IHByZXZlbnQgYWRkaW5nIGEgY2xvc3VyZSBtYXBwaW5nIHdoZW4gZ2V0dGluZyBvcmlnJ3Mgb3duLCBkaXJlY3QgbWFwcGluZ3MKKyAgICAgICAgICovCisgICAgICAgIFVCb29sIG1hcHNUb09yaWc9KFVCb29sKShjPT1vcmlnKTsKKworICAgICAgICAvKiBjb2xsZWN0IGMncyBjYXNlIG1hcHBpbmcgZGVzdGluYXRpb25zIGluIHNldFtdICovCisgICAgICAgIGlmKChuZXh0PXAuc3VjKT49MCAmJiBuZXh0IT1jKSB7CisgICAgICAgICAgICBzZXQuYWRkKG5leHQpOworICAgICAgICB9CisgICAgICAgIGlmKChuZXh0PXAuc2xjKT49MCAmJiBuZXh0IT1jKSB7CisgICAgICAgICAgICBzZXQuYWRkKG5leHQpOworICAgICAgICB9CisgICAgICAgIGlmKHAuc3VjIT0obmV4dD1wLnN0YykgJiYgbmV4dCE9YykgeworICAgICAgICAgICAgc2V0LmFkZChuZXh0KTsKKyAgICAgICAgfQorICAgICAgICBpZigobmV4dD1wLnNjZik+PTAgJiYgbmV4dCE9YykgeworICAgICAgICAgICAgc2V0LmFkZChuZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFkZCBjJ3MgY3VycmVudCBjbG9zdXJlIG1hcHBpbmdzIHRvIHNldCAqLworICAgICAgICBzZXQuYWRkQWxsKGVwLmNsb3N1cmUpOworCisgICAgICAgIC8qIHByb2Nlc3MgYWxsIGNvZGUgcG9pbnRzIHRvIHdoaWNoIGMgY2FzZS1tYXBzICovCisgICAgICAgIFVuaWNvZGVTZXRJdGVyYXRvciBpdGVyKHNldCk7CisgICAgICAgIHdoaWxlKGl0ZXIubmV4dCgpKSB7CisgICAgICAgICAgICBuZXh0PWl0ZXIuZ2V0Q29kZXBvaW50KCk7IC8qIG5leHQhPWMgKi8KKworICAgICAgICAgICAgaWYobmV4dD09b3JpZykgeworICAgICAgICAgICAgICAgIG1hcHNUb09yaWc9VFJVRTsgLyogcmVtZW1iZXIgdGhhdCB3ZSBtYXAgdG8gb3JpZyAqLworICAgICAgICAgICAgfSBlbHNlIGlmKHByZXYyPDAgJiYgbmV4dCE9cHJldikgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogcmVjdXJzZSB1bmxlc3MKKyAgICAgICAgICAgICAgICAgKiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bSBkZXB0aCAocHJldjI+PTApIG9yCisgICAgICAgICAgICAgICAgICogdGhpcyBpcyBhIG1hcHBpbmcgdG8gb25lIG9mIHRoZSBwcmV2aW91cyBjb2RlIHBvaW50cyAob3JpZywgcHJldiwgYykKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzb21lTWFwcGluZ3NBZGRlZHw9YWRkQ2xvc3VyZShvcmlnLCBwcmV2LCBjLCBuZXh0LCAwLCBlcnJvckNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIW1hcHNUb09yaWcpIHsKKyAgICAgICAgICAgIGFkZENsb3N1cmVNYXBwaW5nKGMsIG9yaWcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCh2YWx1ZSZVQ0FTRV9UWVBFX01BU0spPlVDQVNFX05PTkUpIHsKKyAgICAgICAgICAgIC8qIG9uZSBzaW1wbGUgY2FzZSBtYXBwaW5nLCBkb24ndCBjYXJlIHdoaWNoIG9uZSAqLworICAgICAgICAgICAgbmV4dD1jK1VDQVNFX0dFVF9ERUxUQSh2YWx1ZSk7CisgICAgICAgICAgICBpZihuZXh0IT1jKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiByZWN1cnNlIHVubGVzcworICAgICAgICAgICAgICAgICAqIHdlIGhhdmUgcmVhY2hlZCBtYXhpbXVtIGRlcHRoIChwcmV2Mj49MCkgb3IKKyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGEgbWFwcGluZyB0byBvbmUgb2YgdGhlIHByZXZpb3VzIGNvZGUgcG9pbnRzIChvcmlnLCBwcmV2LCBjKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHByZXYyPDAgJiYgbmV4dCE9b3JpZyAmJiBuZXh0IT1wcmV2KSB7CisgICAgICAgICAgICAgICAgICAgIHNvbWVNYXBwaW5nc0FkZGVkfD1hZGRDbG9zdXJlKG9yaWcsIHByZXYsIGMsIG5leHQsIDAsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoYyE9b3JpZyAmJiBuZXh0IT1vcmlnKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGMgZG9lcyBub3QgbWFwIHRvIG9yaWcsIGFkZCBhIGNsb3N1cmUgbWFwcGluZyBjLT5vcmlnICovCisgICAgICAgICAgICAgICAgICAgIGFkZENsb3N1cmVNYXBwaW5nKGMsIG9yaWcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzb21lTWFwcGluZ3NBZGRlZDsKK30KKwordm9pZAorQ2FzZVByb3BzQnVpbGRlcjo6bWFrZUNhc2VDbG9zdXJlKFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7IHJldHVybjsgfQorCisgICAgLyoKKyAgICAgKiBmaW5hbGl6ZSB0aGUgInVuZm9sZCIgZGF0YSBiZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGl0IHRvIGFkZCBjbG9zdXJlIG1hcHBpbmdzCisgICAgICogZm9yIHNpdHVhdGlvbnMgbGlrZSBGQjA1LT4ic3QiPC1GQjA2CisgICAgICogd2hlcmUgd2Ugd291bGQgb3RoZXJ3aXNlIG1pc3MgdGhlIEZCMDU8LT5GQjA2IHJlbGF0aW9uc2hpcAorICAgICAqLworICAgIG1ha2VVbmZvbGREYXRhKGVycm9yQ29kZSk7CisKKyAgICAvKiB1c2UgdGhlICJ1bmZvbGQiIGRhdGEgdG8gYWRkIG1hcHBpbmdzICovCisKKyAgICAvKiBwIGFsd2F5cyBwb2ludHMgdG8gdGhlIGNvZGUgcG9pbnRzOyB0aGlzIGxvb3AgaWdub3JlcyB0aGUgc3RyaW5ncyBjb21wbGV0ZWx5ICovCisgICAgY29uc3QgVUNoYXIgKnA9dW5mb2xkLmdldEJ1ZmZlcigpK1VHRU5DQVNFX1VORk9MRF9XSURUSCtVR0VOQ0FTRV9VTkZPTERfU1RSSU5HX1dJRFRIOworICAgIGludDMyX3QgdW5mb2xkUm93cz11bmZvbGQubGVuZ3RoKCkvVUdFTkNBU0VfVU5GT0xEX1dJRFRILTE7CisKKyAgICBmb3IoaW50MzJfdCBpPTA7IGk8dW5mb2xkUm93czsgcCs9VUdFTkNBU0VfVU5GT0xEX1dJRFRILCArK2kpIHsKKyAgICAgICAgaW50MzJfdCBqPTA7CisgICAgICAgIFVDaGFyMzIgYzsKKyAgICAgICAgVTE2X05FWFRfVU5TQUZFKHAsIGosIGMpOworICAgICAgICB3aGlsZShqPFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSCAmJiBwW2pdIT0wKSB7CisgICAgICAgICAgICBVQ2hhcjMyIGMyOworICAgICAgICAgICAgVTE2X05FWFRfVU5TQUZFKHAsIGosIGMyKTsKKyAgICAgICAgICAgIGFkZENsb3N1cmUoYywgVV9TRU5USU5FTCwgYywgYzIsIDAsIGVycm9yQ29kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgcHV0cygiLS0tLSAtLS0tIC0tLS0gLS0tLSAoZG9uZSB3aXRoIGNsb3N1cmVzIGZyb20gdW5mb2xkaW5nKSIpOworICAgIH0KKworICAgIC8qIGFkZCBmdXJ0aGVyIGNsb3N1cmUgbWFwcGluZ3MgZnJvbSBhbmFseXppbmcgc2ltcGxlIG1hcHBpbmdzICovCisgICAgVUJvb2wgc29tZU1hcHBpbmdzQWRkZWQ7CisgICAgZG8geworICAgICAgICBzb21lTWFwcGluZ3NBZGRlZD1GQUxTRTsKKworICAgICAgICBmb3IoVUNoYXIzMiBjPTA7IGM8PTB4MTBmZmZmOyArK2MpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlPXV0cmllMl9nZXQzMihwVHJpZSwgYyk7CisgICAgICAgICAgICBpZih2YWx1ZSE9MCkgeworICAgICAgICAgICAgICAgIHNvbWVNYXBwaW5nc0FkZGVkfD1hZGRDbG9zdXJlKGMsIFVfU0VOVElORUwsIFVfU0VOVElORUwsIGMsIHZhbHVlLCBlcnJvckNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoYmVWZXJib3NlICYmIHNvbWVNYXBwaW5nc0FkZGVkKSB7CisgICAgICAgICAgICBwdXRzKCItLS0tIC0tLS0gLS0tLSAtLS0tIik7CisgICAgICAgIH0KKyAgICB9IHdoaWxlKHNvbWVNYXBwaW5nc0FkZGVkKTsKK30KKworLyogZXhjZXB0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIFVCb29sCitmdWxsTWFwcGluZ0VxdWFsc1NpbXBsZShjb25zdCBVbmljb2RlU3RyaW5nICZzLCBVQ2hhcjMyIHNpbXBsZSwgVUNoYXIzMiBjKSB7CisgICAgaWYoc2ltcGxlPD0wKSB7CisgICAgICAgIHNpbXBsZT1jOyAvKiBVQ0QgaGFzIG5vIHNpbXBsZSBtYXBwaW5nIGlmIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGNvZGUgcG9pbnQgaXRzZWxmICovCisgICAgfQorICAgIHJldHVybiBzLmxlbmd0aCgpPT1VMTZfTEVOR1RIKHNpbXBsZSkgJiYgcy5jaGFyMzJBdCgwKT09c2ltcGxlOworfQorCitpbnQzMl90CitDYXNlUHJvcHNCdWlsZGVyOjptYWtlRXhjZXB0aW9uKFVDaGFyMzIgYywgdWludDMyX3QgdmFsdWUsIEV4Y1Byb3BzICZlcCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuIDA7IH0KKworICAgIC8qIGV4Y2VwdGlvbnMubGVuZ3RoKCkgbWlnaHQgYmUgcmV0dXJuZWQgZm9yIHN0b3JpbmcgaW4gdGhlIHRyaWUgd29yZCAqLworICAgIGlmKGV4Y2VwdGlvbnMubGVuZ3RoKCk+PVVDQVNFX01BWF9FWENFUFRJT05TKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IGNhc2Vwcm9wc2J1aWxkZXI6IHRvbyBtYW55IGV4Y2VwdGlvbnMgd29yZHNcbiIpOworICAgICAgICBlcnJvckNvZGU9VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNvcHkgYW5kIHNoaWZ0IHRoZSBzb2Z0LWRvdHRlZCBiaXRzICovCisgICAgVUNoYXIgZXhjV29yZD0oVUNoYXIpKCh2YWx1ZSZVQ0FTRV9ET1RfTUFTSyk8PFVDQVNFX0VYQ19ET1RfU0hJRlQpOworCisgICAgVW5pUHJvcHMgJnA9ZXAucHJvcHM7CisKKyAgICAvKiBzZXQgdGhlIGJpdHMgZm9yIGNvbmRpdGlvbmFsIG1hcHBpbmdzICovCisgICAgaWYoZXAuaGFzQ29uZGl0aW9uYWxDYXNlTWFwcGluZ3MpIHsKKyAgICAgICAgZXhjV29yZHw9VUNBU0VfRVhDX0NPTkRJVElPTkFMX1NQRUNJQUw7CisgICAgICAgIHAubGMucmVtb3ZlKCk7CisgICAgICAgIHAudWMucmVtb3ZlKCk7CisgICAgICAgIHAudGMucmVtb3ZlKCk7CisgICAgfQorICAgIGlmKGVwLmhhc1R1cmtpY0Nhc2VGb2xkaW5nKSB7CisgICAgICAgIGV4Y1dvcmR8PVVDQVNFX0VYQ19DT05ESVRJT05BTF9GT0xEOworICAgICAgICBwLmNmLnJlbW92ZSgpOworICAgIH0KKworICAgIC8qIHJlbW92ZSByZWR1bmRhbnQgZGF0YSAqLworICAgIC8qIGRvIG5vdCBzdG9yZSBmdWxsIG1hcHBpbmdzIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBzaW1wbGUgb25lcyAqLworICAgIGlmKGZ1bGxNYXBwaW5nRXF1YWxzU2ltcGxlKHAubGMsIHAuc2xjLCBjKSkgeworICAgICAgICBwLmxjLnJlbW92ZSgpOworICAgIH0KKyAgICBpZihmdWxsTWFwcGluZ0VxdWFsc1NpbXBsZShwLnVjLCBwLnN1YywgYykpIHsKKyAgICAgICAgcC51Yy5yZW1vdmUoKTsKKyAgICB9CisgICAgaWYoZnVsbE1hcHBpbmdFcXVhbHNTaW1wbGUocC50YywgcC5zdGMsIGMpKSB7CisgICAgICAgIHAudGMucmVtb3ZlKCk7CisgICAgfQorICAgIGlmKGZ1bGxNYXBwaW5nRXF1YWxzU2ltcGxlKHAuY2YsIHAuc2NmLCBjKSkgeworICAgICAgICBwLmNmLnJlbW92ZSgpOworICAgIH0KKworICAgIC8qIHdyaXRlIHRoZSBvcHRpb25hbCBzbG90cyAqLworICAgIHVpbnQzMl90IHNsb3RzWzhdOworICAgIHVpbnQzMl90IHNsb3RCaXRzPTA7CisgICAgaW50MzJfdCBjb3VudD0wOworCisgICAgaWYocC5zbGM+PTApIHsKKyAgICAgICAgc2xvdHNbY291bnRdPSh1aW50MzJfdClwLnNsYzsKKyAgICAgICAgc2xvdEJpdHN8PXNsb3RzW2NvdW50XTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgICAgZXhjV29yZHw9VV9NQVNLKFVDQVNFX0VYQ19MT1dFUik7CisgICAgfQorICAgIGlmKCBwLnNjZj49MCAmJgorICAgICAgICAocC5zbGM+PTAgPworICAgICAgICAgICAgcC5zbGMhPXAuc2xjIDoKKyAgICAgICAgICAgIHAuc2xjIT1jKQorICAgICkgeworICAgICAgICBzbG90c1tjb3VudF09KHVpbnQzMl90KXAuc2NmOworICAgICAgICBzbG90Qml0c3w9c2xvdHNbY291bnRdOworICAgICAgICArK2NvdW50OworICAgICAgICBleGNXb3JkfD1VX01BU0soVUNBU0VfRVhDX0ZPTEQpOworICAgIH0KKyAgICBpZihwLnN1Yz49MCkgeworICAgICAgICBzbG90c1tjb3VudF09KHVpbnQzMl90KXAuc3VjOworICAgICAgICBzbG90Qml0c3w9c2xvdHNbY291bnRdOworICAgICAgICArK2NvdW50OworICAgICAgICBleGNXb3JkfD1VX01BU0soVUNBU0VfRVhDX1VQUEVSKTsKKyAgICB9CisgICAgaWYocC5zdWMhPXAuc3RjKSB7CisgICAgICAgIGlmKHAuc3RjPj0wKSB7CisgICAgICAgICAgICBzbG90c1tjb3VudF09KHVpbnQzMl90KXAuc3RjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2xvdHNbY291bnRdPSh1aW50MzJfdCljOworICAgICAgICB9CisgICAgICAgIHNsb3RCaXRzfD1zbG90c1tjb3VudF07CisgICAgICAgICsrY291bnQ7CisgICAgICAgIGV4Y1dvcmR8PVVfTUFTSyhVQ0FTRV9FWENfVElUTEUpOworICAgIH0KKworICAgIC8qIGxlbmd0aCBvZiBjYXNlIGNsb3N1cmUgKi8KKyAgICBVbmljb2RlU3RyaW5nIGNsb3N1cmVTdHJpbmc7CisgICAgaWYoIWVwLmNsb3N1cmUuaXNFbXB0eSgpKSB7CisgICAgICAgIFVuaWNvZGVTZXRJdGVyYXRvciBpdGVyKGVwLmNsb3N1cmUpOworICAgICAgICB3aGlsZShpdGVyLm5leHQoKSkgeyBjbG9zdXJlU3RyaW5nLmFwcGVuZChpdGVyLmdldENvZGVwb2ludCgpKTsgfQorICAgICAgICBpbnQzMl90IGxlbmd0aD1jbG9zdXJlU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBpZihsZW5ndGg+VUNBU0VfQ0xPU1VSRV9NQVhfTEVOR1RIKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgImdlbnByb3BzIGVycm9yOiBjYXNlIGNsb3N1cmUgZm9yIFUrJTA0bFggaGFzIGxlbmd0aCAlZCAiCisgICAgICAgICAgICAgICAgICAgICJ3aGljaCBleGNlZWRzIFVDQVNFX0NMT1NVUkVfTUFYX0xFTkdUSD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcpYywgKGludClsZW5ndGgsIChpbnQpVUNBU0VfQ0xPU1VSRV9NQVhfTEVOR1RIKTsKKyAgICAgICAgICAgIGVycm9yQ29kZT1VX0JVRkZFUl9PVkVSRkxPV19FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNsb3RzW2NvdW50XT0odWludDMyX3QpbGVuZ3RoOyAvKiBtdXN0IGJlIDEuLlVDQVNFX0NMT1NVUkVfTUFYX0xFTkdUSCAqLworICAgICAgICBzbG90Qml0c3w9c2xvdHNbY291bnRdOworICAgICAgICArK2NvdW50OworICAgICAgICBleGNXb3JkfD1VX01BU0soVUNBU0VfRVhDX0NMT1NVUkUpOworICAgIH0KKworICAgIC8qIGxlbmd0aHMgb2YgZnVsbCBjYXNlIG1hcHBpbmcgc3RyaW5ncywgc3RvcmVkIGluIHRoZSBsYXN0IHNsb3QgKi8KKyAgICBpbnQzMl90IGZ1bGxMZW5ndGhzPQorICAgICAgICBwLmxjLmxlbmd0aCgpfAorICAgICAgICAocC5jZi5sZW5ndGgoKTw8NCl8CisgICAgICAgIChwLnVjLmxlbmd0aCgpPDw4KXwKKyAgICAgICAgKHAudGMubGVuZ3RoKCk8PDEyKTsKKyAgICBpZihmdWxsTGVuZ3RocyE9MCkgeworICAgICAgICBzbG90c1tjb3VudF09KHVpbnQzMl90KWZ1bGxMZW5ndGhzOworICAgICAgICBzbG90Qml0c3w9c2xvdHNbY291bnRdOworICAgICAgICArK2NvdW50OworICAgICAgICBleGNXb3JkfD1VX01BU0soVUNBU0VfRVhDX0ZVTExfTUFQUElOR1MpOworICAgIH0KKworICAgIGlmKGNvdW50PT0wKSB7CisgICAgICAgIC8qIE5vIG9wdGlvbmFsIHNsb3RzOiBUcnkgdG8gc2hhcmUgZXhjV29yZCBlbnRyaWVzLiAqLworICAgICAgICBpbnQzMl90IGV4Y0luZGV4PWV4Y2VwdGlvbnMuaW5kZXhPZigoVUNoYXIpZXhjV29yZCk7CisgICAgICAgIGlmKGV4Y0luZGV4Pj0wKSB7CisgICAgICAgICAgICByZXR1cm4gZXhjSW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgLyogbm90IGZvdW5kICovCisgICAgICAgIGV4Y0luZGV4PWV4Y2VwdGlvbnMubGVuZ3RoKCk7CisgICAgICAgIGV4Y2VwdGlvbnMuYXBwZW5kKChVQ2hhcilleGNXb3JkKTsKKyAgICAgICAgcmV0dXJuIGV4Y0luZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHdyaXRlIHNsb3RzICovCisgICAgICAgIGludDMyX3QgZXhjSW5kZXg9ZXhjZXB0aW9ucy5sZW5ndGgoKTsKKyAgICAgICAgZXhjZXB0aW9ucy5hcHBlbmQoKFVDaGFyKTApOyAgLyogcGxhY2Vob2xkZXIgZm9yIGV4Y1dvcmQgd2hpY2ggd2lsbCBiZSBzdG9yZWQgYXQgZXhjSW5kZXggKi8KKworICAgICAgICBpZihzbG90Qml0czw9MHhmZmZmKSB7CisgICAgICAgICAgICBmb3IoaW50MzJfdCBpPTA7IGk8Y291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuYXBwZW5kKChVQ2hhcilzbG90c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleGNXb3JkfD1VQ0FTRV9FWENfRE9VQkxFX1NMT1RTOworICAgICAgICAgICAgZm9yKGludDMyX3QgaT0wOyBpPGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zLmFwcGVuZCgoVUNoYXIpKHNsb3RzW2ldPj4xNikpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuYXBwZW5kKChVQ2hhcilzbG90c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiB3cml0ZSB0aGUgZnVsbCBjYXNlIG1hcHBpbmcgc3RyaW5ncyAqLworICAgICAgICBleGNlcHRpb25zLmFwcGVuZChwLmxjKTsKKyAgICAgICAgZXhjZXB0aW9ucy5hcHBlbmQocC5jZik7CisgICAgICAgIGV4Y2VwdGlvbnMuYXBwZW5kKHAudWMpOworICAgICAgICBleGNlcHRpb25zLmFwcGVuZChwLnRjKTsKKworICAgICAgICAvKiB3cml0ZSB0aGUgY2xvc3VyZSBkYXRhICovCisgICAgICAgIGV4Y2VwdGlvbnMuYXBwZW5kKGNsb3N1cmVTdHJpbmcpOworCisgICAgICAgIC8qIHdyaXRlIHRoZSBtYWluIGV4Y2VwdGlvbnMgd29yZCAqLworICAgICAgICBleGNlcHRpb25zLnNldENoYXJBdChleGNJbmRleCwgKFVDaGFyKWV4Y1dvcmQpOworCisgICAgICAgIHJldHVybiBleGNJbmRleDsKKyAgICB9Cit9CisKK3ZvaWQKK0Nhc2VQcm9wc0J1aWxkZXI6Om1ha2VFeGNlcHRpb25zKFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7IHJldHVybjsgfQorCisgICAgLyoKKyAgICAgKiBFbmNvZGUgY2FzZS1pZ25vcmFibGUgYXMgZGVsdGE9PTEgb24gdW5jYXNlZCBjaGFyYWN0ZXJzLAorICAgICAqIGFuZCB3aXRoIGFuIGV4Y2VwdGlvbiBiaXQgb24gY2FzZWQgY2hhcmFjdGVycyBhbmQgY2hhcmFjdGVycyB3aXRoIGFub3RoZXIgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQ2hhbmdlIGZyb20gdGVtcG9yYXJ5IFVHRU5DQVNFX0VYQ19TSElGVCdlZCBpbmRleCBpbnRvIGV4Y1Byb3BzW10KKyAgICAgKiB0byBVQ0FTRV9FWENfU0hJRlQnZWQgaW5kZXggaW50byBlbmNvZGVkIGV4Y2VwdGlvbnNbXS4KKyAgICAgKi8KKyAgICBmb3IoVUNoYXIzMiBjPTA7IGM8PTB4MTBmZmZmOyArK2MpIHsKKyAgICAgICAgdWludDMyX3QgdmFsdWU9dXRyaWUyX2dldDMyKHBUcmllLCBjKTsKKyAgICAgICAgaWYodmFsdWUmVUNBU0VfRVhDRVBUSU9OKSB7CisgICAgICAgICAgICBpbnQzMl90IGV4Y0luZGV4PW1ha2VFeGNlcHRpb24oYywgdmFsdWUsICpleGNQcm9wc1t2YWx1ZT4+VUdFTkNBU0VfRVhDX1NISUZUXSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIHZhbHVlPSh2YWx1ZSZ+KFVHRU5DQVNFX0VYQ19NQVNLfFVDQVNFX0VYQ19NQVNLKSl8KCh1aW50MzJfdClleGNJbmRleDw8VUNBU0VfRVhDX1NISUZUKTsKKyAgICAgICAgICAgIHV0cmllMl9zZXQzMihwVHJpZSwgYywgdmFsdWUsICZlcnJvckNvZGUpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBnZW5lcmF0ZSBvdXRwdXQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50MzJfdCBpbmRleGVzW1VDQVNFX0lYX1RPUF09eworICAgIFVDQVNFX0lYX1RPUCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMAorfTsKKworc3RhdGljIHVpbnQ4X3QgdHJpZUJsb2NrWzQwMDAwXTsKK3N0YXRpYyBpbnQzMl90IHRyaWVTaXplOworCit2b2lkCitDYXNlUHJvcHNCdWlsZGVyOjpidWlsZChVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwdXRzKCIqIHVjYXNlLmljdSBzdGF0cyAqIik7CisgICAgfQorCisgICAgbWFrZUNhc2VDbG9zdXJlKGVycm9yQ29kZSk7CisgICAgbWFrZUV4Y2VwdGlvbnMoZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKworICAgIC8qCisgICAgICogQWRkIG9uZSBjb21wbGV4IG1hcHBpbmcgdG8gY2FzZVNlbnNpdGl2ZSB0aGF0IHdhcyBmaWx0ZXJlZCBvdXQgYWJvdmU6CisgICAgICogR3JlZWsgZmluYWwgU2lnbWEgaGFzIGEgY29uZGl0aW9uYWwgbWFwcGluZyBidXQgbm90IGxvY2FsZS1zZW5zaXRpdmUsCisgICAgICogYW5kIGl0IGlzIHRha2VuIHdoZW4gbG93ZXJjYXNpbmcganVzdCBVKzAzQTMgYWxvbmUuCisgICAgICogMDNBMzsgMDNDMjsgMDNBMzsgMDNBMzsgRmluYWxfU2lnbWE7ICMgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAgKi8KKyAgICBjYXNlU2Vuc2l0aXZlLmFkZCgweDNjMik7CisKKyAgICBVbmljb2RlU2V0SXRlcmF0b3IgaXRlcihjYXNlU2Vuc2l0aXZlKTsKKyAgICB3aGlsZShpdGVyLm5leHQoKSkgeworICAgICAgICBVQ2hhcjMyIGM9aXRlci5nZXRDb2RlcG9pbnQoKTsKKyAgICAgICAgdWludDMyX3QgdmFsdWU9dXRyaWUyX2dldDMyKHBUcmllLCBjKTsKKyAgICAgICAgaWYoKHZhbHVlJlVDQVNFX1NFTlNJVElWRSk9PTApIHsKKyAgICAgICAgICAgIHV0cmllMl9zZXQzMihwVHJpZSwgYywgdmFsdWV8VUNBU0VfU0VOU0lUSVZFLCAmZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmFibGUgdG8gc2V0IFVDQVNFX1NFTlNJVElWRTogJXNcbiIsCisgICAgICAgICAgICAgICAgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1dHJpZTJfZnJlZXplKHBUcmllLCBVVFJJRTJfMTZfVkFMVUVfQklUUywgJmVycm9yQ29kZSk7CisgICAgdHJpZVNpemU9dXRyaWUyX3NlcmlhbGl6ZShwVHJpZSwgdHJpZUJsb2NrLCBzaXplb2YodHJpZUJsb2NrKSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogdXRyaWUyX2ZyZWV6ZSgpK3V0cmllMl9zZXJpYWxpemUoKSBmYWlsZWQ6ICVzIChsZW5ndGggJWxkKVxuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpLCAobG9uZyl0cmllU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbmRleGVzW1VDQVNFX0lYX0VYQ19MRU5HVEhdPWV4Y2VwdGlvbnMubGVuZ3RoKCk7CisgICAgaW5kZXhlc1tVQ0FTRV9JWF9UUklFX1NJWkVdPXRyaWVTaXplOworICAgIGluZGV4ZXNbVUNBU0VfSVhfVU5GT0xEX0xFTkdUSF09dW5mb2xkLmxlbmd0aCgpOworICAgIGluZGV4ZXNbVUNBU0VfSVhfTEVOR1RIXT0oaW50MzJfdClzaXplb2YoaW5kZXhlcykrdHJpZVNpemUrMipleGNlcHRpb25zLmxlbmd0aCgpKzIqdW5mb2xkLmxlbmd0aCgpOworCisgICAgaW5kZXhlc1tVQ0FTRV9JWF9NQVhfRlVMTF9MRU5HVEhdPW1heEZ1bGxMZW5ndGg7CisKKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwcmludGYoInRyaWUgc2l6ZSBpbiBieXRlczogICAgICAgICAgICAgICAgICAgICU1ZFxuIiwgKGludCl0cmllU2l6ZSk7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIGNvZGUgcG9pbnRzIHdpdGggZXhjZXB0aW9uczogJTVkXG4iLCBleGNQcm9wc0NvdW50KTsKKyAgICAgICAgcHJpbnRmKCJzaXplIGluIGJ5dGVzIG9mIGV4Y2VwdGlvbnM6ICAgICAgICAgICAlNWRcbiIsIDIqZXhjZXB0aW9ucy5sZW5ndGgoKSk7CisgICAgICAgIHByaW50Zigic2l6ZSBpbiBieXRlcyBvZiByZXZlcnNlIGZvbGRpbmdzOiAgICAgJTVkXG4iLCAyKnVuZm9sZC5sZW5ndGgoKSk7CisgICAgICAgIHByaW50ZigiZGF0YSBzaXplOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTVkXG4iLCAoaW50KWluZGV4ZXNbVUNBU0VfSVhfTEVOR1RIXSk7CisgICAgfQorfQorCit2b2lkCitDYXNlUHJvcHNCdWlsZGVyOjp3cml0ZUNTb3VyY2VGaWxlKGNvbnN0IGNoYXIgKnBhdGgsIFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7IHJldHVybjsgfQorCisgICAgRklMRSAqZj11c3JjX2NyZWF0ZShwYXRoLCAidWNhc2VfcHJvcHNfZGF0YS5oIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpY3UvdG9vbHMvdW5pY29kZS9jL2dlbnByb3BzL2Nhc2Vwcm9wc2J1aWxkZXIuY3BwIik7CisgICAgaWYoZj09TlVMTCkgeworICAgICAgICBlcnJvckNvZGU9VV9GSUxFX0FDQ0VTU19FUlJPUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcHV0cygiI2lmbmRlZiBJTkNMVURFRF9GUk9NX1VDQVNFX0NQUFxuIgorICAgICAgICAgICIjICAgZXJyb3IgVGhpcyBmaWxlIG11c3QgYmUgI2luY2x1ZGVkIGZyb20gdWNhc2UuY3BwIG9ubHkuXG4iCisgICAgICAgICAgIiNlbmRpZlxuXG4iLCBmKTsKKyAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgInN0YXRpYyBjb25zdCBVVmVyc2lvbkluZm8gdWNhc2VfcHJvcHNfZGF0YVZlcnNpb249eyIsCisgICAgICAgIGRhdGFJbmZvLmRhdGFWZXJzaW9uLCA4LCA0LAorICAgICAgICAifTtcblxuIik7CisgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICJzdGF0aWMgY29uc3QgaW50MzJfdCB1Y2FzZV9wcm9wc19pbmRleGVzW1VDQVNFX0lYX1RPUF09eyIsCisgICAgICAgIGluZGV4ZXMsIDMyLCBVQ0FTRV9JWF9UT1AsCisgICAgICAgICJ9O1xuXG4iKTsKKyAgICB1c3JjX3dyaXRlVVRyaWUyQXJyYXlzKGYsCisgICAgICAgICJzdGF0aWMgY29uc3QgdWludDE2X3QgdWNhc2VfcHJvcHNfdHJpZUluZGV4WyVsZF09e1xuIiwgTlVMTCwKKyAgICAgICAgcFRyaWUsCisgICAgICAgICJcbn07XG5cbiIpOworICAgIHVzcmNfd3JpdGVBcnJheShmLAorICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQxNl90IHVjYXNlX3Byb3BzX2V4Y2VwdGlvbnNbJWxkXT17XG4iLAorICAgICAgICBleGNlcHRpb25zLmdldEJ1ZmZlcigpLCAxNiwgZXhjZXB0aW9ucy5sZW5ndGgoKSwKKyAgICAgICAgIlxufTtcblxuIik7CisgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICJzdGF0aWMgY29uc3QgdWludDE2X3QgdWNhc2VfcHJvcHNfdW5mb2xkWyVsZF09e1xuIiwKKyAgICAgICAgdW5mb2xkLmdldEJ1ZmZlcigpLCAxNiwgdW5mb2xkLmxlbmd0aCgpLAorICAgICAgICAiXG59O1xuXG4iKTsKKyAgICBmcHV0cygKKyAgICAgICAgInN0YXRpYyBjb25zdCBVQ2FzZVByb3BzIHVjYXNlX3Byb3BzX3NpbmdsZXRvbj17XG4iCisgICAgICAgICIgIE5VTEwsXG4iCisgICAgICAgICIgIHVjYXNlX3Byb3BzX2luZGV4ZXMsXG4iCisgICAgICAgICIgIHVjYXNlX3Byb3BzX2V4Y2VwdGlvbnMsXG4iCisgICAgICAgICIgIHVjYXNlX3Byb3BzX3VuZm9sZCxcbiIsCisgICAgICAgIGYpOworICAgIHVzcmNfd3JpdGVVVHJpZTJTdHJ1Y3QoZiwKKyAgICAgICAgIiAge1xuIiwKKyAgICAgICAgcFRyaWUsICJ1Y2FzZV9wcm9wc190cmllSW5kZXgiLCBOVUxMLAorICAgICAgICAiICB9LFxuIik7CisgICAgdXNyY193cml0ZUFycmF5KGYsICIgIHsgIiwgZGF0YUluZm8uZm9ybWF0VmVyc2lvbiwgOCwgNCwgIiB9XG4iKTsKKyAgICBmcHV0cygifTtcbiIsIGYpOworICAgIGZjbG9zZShmKTsKK30KKwordm9pZAorQ2FzZVByb3BzQnVpbGRlcjo6d3JpdGVCaW5hcnlEYXRhKGNvbnN0IGNoYXIgKnBhdGgsIFVCb29sIHdpdGhDb3B5cmlnaHQsIFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7IHJldHVybjsgfQorCisgICAgVU5ld0RhdGFNZW1vcnkgKnBEYXRhPXVkYXRhX2NyZWF0ZShwYXRoLCAiaWN1IiwgInVjYXNlIiwgJmRhdGFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENvcHlyaWdodCA/IFVfQ09QWVJJR0hUX1NUUklORyA6IE5VTEwsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHVkYXRhX2NyZWF0ZSglcywgdWNhc2UuaWN1KSBmYWlsZWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICBwYXRoLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGluZGV4ZXMsIHNpemVvZihpbmRleGVzKSk7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgdHJpZUJsb2NrLCB0cmllU2l6ZSk7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgZXhjZXB0aW9ucy5nZXRCdWZmZXIoKSwgMipleGNlcHRpb25zLmxlbmd0aCgpKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCB1bmZvbGQuZ2V0QnVmZmVyKCksIDIqdW5mb2xkLmxlbmd0aCgpKTsKKworICAgIC8qIGZpbmlzaCB1cCAqLworICAgIGxvbmcgZGF0YUxlbmd0aD11ZGF0YV9maW5pc2gocERhdGEsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IGNhc2Vwcm9wc2J1aWxkZXIgZXJyb3IgJWQgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGVcbiIsIGVycm9yQ29kZSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICBpZihkYXRhTGVuZ3RoIT1pbmRleGVzW1VDQVNFX0lYX0xFTkdUSF0pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVkYXRhX2ZpbmlzaCh1Y2FzZS5pY3UpIHJlcG9ydHMgJWxkIGJ5dGVzIHdyaXR0ZW4gYnV0IHNob3VsZCBiZSAlbGRcbiIsCisgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCwgKGxvbmcpaW5kZXhlc1tVQ0FTRV9JWF9MRU5HVEhdKTsKKyAgICAgICAgZXJyb3JDb2RlPVVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUjsKKyAgICB9Cit9CisKK1Byb3BzQnVpbGRlciAqCitjcmVhdGVDYXNlUHJvcHNCdWlsZGVyKFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7IHJldHVybiBOVUxMOyB9CisgICAgUHJvcHNCdWlsZGVyICpwYj1uZXcgQ2FzZVByb3BzQnVpbGRlcihlcnJvckNvZGUpOworICAgIGlmKHBiPT1OVUxMKSB7CisgICAgICAgIGVycm9yQ29kZT1VX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gcGI7Cit9CisKKy8qCisgKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CisgKgorICogTG9jYWwgVmFyaWFibGVzOgorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvY29yZXByb3BzYnVpbGRlci5jcHAgYi91bmljb2RlL2MvZ2VucHJvcHMvY29yZXByb3BzYnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzYTYxZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9jb3JlcHJvcHNidWlsZGVyLmNwcApAQCAtMCwwICsxLDgyOSBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIGNvcmVwcm9wc2J1aWxkZXIuY3BwICh3YXMgc3RvcmUuYyAmIHByb3BzMi5jcHApCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMTk5OWRlYzExCisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyoKKyogICBTdG9yZSBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGVmZmljaWVudGx5IGZvcgorKiAgIHJhbmRvbSBhY2Nlc3MuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNoYXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VkYXRhLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldGl0ZXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzY3JpcHQuaCIKKyNpbmNsdWRlICJjbWVtb3J5LmgiCisjaW5jbHVkZSAiY3N0cmluZy5oIgorI2luY2x1ZGUgImdlbnByb3BzLmgiCisjaW5jbHVkZSAicHJvcHN2ZWMuaCIKKyNpbmNsdWRlICJ1YXNzZXJ0LmgiCisjaW5jbHVkZSAidW5ld2RhdGEuaCIKKyNpbmNsdWRlICJ1cHJvcHMuaCIKKyNpbmNsdWRlICJ1dHJpZTIuaCIKKyNpbmNsdWRlICJ3cml0ZXNyYy5oIgorCisvKiBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGZpbGUgZm9ybWF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlsZSBmb3JtYXQgcHJlcGFyZWQgYW5kIHdyaXR0ZW4gaGVyZSBjb250YWlucyBzZXZlcmFsIGRhdGEKK3N0cnVjdHVyZXMgdGhhdCBzdG9yZSBpbmRleGVzIG9yIGRhdGEuCisKK0JlZm9yZSB0aGUgZGF0YSBjb250ZW50cyBkZXNjcmliZWQgYmVsb3csIHRoZXJlIGFyZSB0aGUgaGVhZGVycyByZXF1aXJlZCBieQordGhlIHVkYXRhIEFQSSBmb3IgbG9hZGluZyBJQ1UgZGF0YS4gRXNwZWNpYWxseSwgYSBVRGF0YUluZm8gc3RydWN0dXJlCitwcmVjZWRlcyB0aGUgYWN0dWFsIGRhdGEuIEl0IGNvbnRhaW5zIHBsYXRmb3JtIHByb3BlcnRpZXMgdmFsdWVzIGFuZCB0aGUKK2ZpbGUgZm9ybWF0IHZlcnNpb24uCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiBmb3JtYXQgdmVyc2lvbiA3IC4KKworRGF0YSBjb250ZW50czoKKworVGhlIGNvbnRlbnRzIGlzIGEgcGFyc2VkLCBiaW5hcnkgZm9ybSBvZiBzZXZlcmFsIFVuaWNvZGUgY2hhcmFjdGVyCitkYXRhYmFzZSBmaWxlcywgbW9zdCBwcm9taW5lbnRseSBVbmljb2RlRGF0YS50eHQuCisKK0FueSBVbmljb2RlIGNvZGUgcG9pbnQgZnJvbSAwIHRvIDB4MTBmZmZmIGNhbiBiZSBsb29rZWQgdXAgdG8gZ2V0Cit0aGUgcHJvcGVydGllcywgaWYgYW55LCBmb3IgdGhhdCBjb2RlIHBvaW50LiBUaGlzIG1lYW5zIHRoYXQgdGhlIGlucHV0Cit0byB0aGUgbG9va3VwIGFyZSAyMS1iaXQgdW5zaWduZWQgaW50ZWdlcnMsIHdpdGggbm90IGFsbCBvZiB0aGUKKzIxLWJpdCByYW5nZSB1c2VkLgorCitJdCBpcyBhc3N1bWVkIHRoYXQgY2xpZW50IGNvZGUga2VlcHMgYSB1aW50MzJfdCBwb2ludGVyCit0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhOgorCisgICAgY29uc3QgdWludDMyX3QgKnAzMjsKKworRm9ybWFsbHksIHRoZSBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlczoKKworICAgIGNvbnN0IGludDMyX3QgaW5kZXhlc1sxNl0gd2l0aCB2YWx1ZXMgaTAuLmkxNToKKworICBpMCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgbWFpbiB0cmllLgorICBpMC4uaTMgYWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgaW4gZm9ybWF0IHZlcnNpb25zIDQuMCBhbmQgaGlnaGVyOworICAgICAgICAgdGhlIHJlbGF0ZWQgcHJvcHMzMltdIGFuZCBleGNlcHRpb25zW10gYW5kIHVjaGFyc1tdIHdlcmUgdXNlZCBpbiBmb3JtYXQgdmVyc2lvbiAzCisKKyAgICBpMCBwcm9wc0luZGV4OyAtLSAzMi1iaXQgdW5pdCBpbmRleCB0byB0aGUgdGFibGUgb2YgMzItYml0IHByb3BlcnRpZXMgd29yZHMKKyAgICBpMSBleGNlcHRpb25zSW5kZXg7ICAtLSAzMi1iaXQgdW5pdCBpbmRleCB0byB0aGUgdGFibGUgb2YgMzItYml0IGV4Y2VwdGlvbiB3b3JkcworICAgIGkyIGV4Y2VwdGlvbnNUb3BJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIGFycmF5IG9mIFVDaGFycyBmb3Igc3BlY2lhbCBtYXBwaW5ncworCisgICAgaTMgYWRkaXRpb25hbFRyaWVJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIGFkZGl0aW9uYWwgdHJpZSBmb3IgbW9yZSBwcm9wZXJ0aWVzCisgICAgaTQgYWRkaXRpb25hbFZlY3RvcnNJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIHRhYmxlIG9mIHByb3BlcnRpZXMgdmVjdG9ycworICAgIGk1IGFkZGl0aW9uYWxWZWN0b3JzQ29sdW1uczsgLS0gbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyBwZXIgcHJvcGVydGllcyB2ZWN0b3IKKworICAgIGk2IHNjcmlwdEV4dGVuc2lvbnNJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIFNjcmlwdF9FeHRlbnNpb25zIGRhdGEKKyAgICBpNyByZXNlcnZlZEluZGV4NzsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIHRvcCBvZiB0aGUgU2NyaXB0X0V4dGVuc2lvbnMgZGF0YQorICAgIGk4IHJlc2VydmVkSW5kZXg4OyAtLSBmb3Igbm93OiBpNywgaTggYW5kIGk5IGhhdmUgdGhlIHNhbWUgdmFsdWVzCisgICAgaTkgZGF0YVRvcEluZGV4OyAtLSBzaXplIG9mIHRoZSBkYXRhIGZpbGUgKG51bWJlciBvZiAzMi1iaXQgdW5pdHMgYWZ0ZXIgdGhlIGhlYWRlcikKKworICAgIGkxMCBtYXhWYWx1ZXM7IC0tIG1heGltdW0gY29kZSB2YWx1ZXMgZm9yIHZlY3RvciB3b3JkIDAsIHNlZSB1cHJvcHMuaCAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDMuMSspCisgICAgaTExIG1heFZhbHVlczI7IC0tIG1heGltdW0gY29kZSB2YWx1ZXMgZm9yIHZlY3RvciB3b3JkIDIsIHNlZSB1cHJvcHMuaCAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDMuMikKKyAgICBpMTIuLmkxNSByZXNlcnZlZEluZGV4ZXM7IC0tIHJlc2VydmVkIHZhbHVlczsgMCBmb3Igbm93CisKKyAgICBQVCBzZXJpYWxpemVkIHByb3BlcnRpZXMgdHJpZSwgc2VlIHV0cmllMi5oIChieXRlIHNpemU6IDQqKGkwLTE2KSkKKworICBQLCBFLCBhbmQgVSBhcmUgbm90IHVzZWQgKGVtcHR5KSBpbiBmb3JtYXQgdmVyc2lvbnMgNCBhbmQgYWJvdmUKKworICAgIFAgIGNvbnN0IHVpbnQzMl90IHByb3BzMzJbaTEtaTBdOworICAgIEUgIGNvbnN0IHVpbnQzMl90IGV4Y2VwdGlvbnNbaTItaTFdOworICAgIFUgIGNvbnN0IFVDaGFyIHVjaGFyc1syKihpMy1pMildOworCisgICAgQVQgc2VyaWFsaXplZCB0cmllIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgKGJ5dGUgc2l6ZTogNCooaTQtaTMpKQorICAgIFBWIGNvbnN0IHVpbnQzMl90IHByb3BzVmVjdG9yc1soaTYtaTQpL2k1XVtpNV09PXVpbnQzMl90IHByb3BzVmVjdG9yc1tpNi1pNF07CisKKyAgICBTQ1ggY29uc3QgdWludDE2X3Qgc2NyaXB0RXh0ZW5zaW9uc1syKihpNy1pNildOworCisgICAgICBTQ1ggY29udGFpbnMgU2NyaXB0X0V4dGVuc2lvbnMgbGlzdHMgYW5kIChTY3JpcHQgY29kZSwgU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXgpIHBhaXJzLgorICAgICAgQSBTY3JpcHRfRXh0ZW5zaW9ucyBsaXN0IGlzIGEgc2VxdWVuY2Ugb2YgVVNjcmlwdENvZGUgdmFsdWVzIGluIGFzY2VuZGluZyBvcmRlciwKKyAgICAgIHdpdGggdGhlIGxhc3QgY29kZSBoYXZpbmcgYml0IDE1IHNldCBmb3IgdGVybWluYXRpb24uCisgICAgICBBIChTY3JpcHQgY29kZSwgU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXgpIHBhaXIgaXMgdGhlIG1haW4gVVNjcmlwdENvZGUgKFNjcmlwdCB2YWx1ZSkKKyAgICAgIGZvbGxvd2VkIGJ5IHRoZSBpbmRleCBvZiB0aGUgU2NyaXB0X0V4dGVuc2lvbnMgbGlzdC4KKyAgICAgIElmIHRoZSBwcm9wc1ZlY3RvcnNbXSBjb2x1bW4gMCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgU2NyaXB0X0V4dGVuc2lvbnMsCisgICAgICB0aGVuIHRoZSBVUFJPUFNfU0NSSVBUX01BU0sgYml0IGZpZWxkIGlzIGFuIGluZGV4IHRvIGVpdGhlciBhIGxpc3Qgb3IgYSBwYWlyIGluIFNDWCwKKyAgICAgIHJhdGhlciB0aGFuIHRoZSBTY3JpcHQgaXRzZWxmLiBUaGUgaGlnaCBiaXRzIGluIHRoZSBVUFJPUFNfU0NSSVBUX1hfTUFTSyBmaWVsZHMKKyAgICAgIGluZGljYXRlIHdoZXRoZXIgdGhlIG1haW4gU2NyaXB0IHZhbHVlIGlzIENvbW1vbiBvciBJbmhlcml0ZWQgKGFuZCB0aGUgaW5kZXggaXMgdG8gYSBsaXN0KQorICAgICAgdnMuIGFub3RoZXIgdmFsdWUgKGFuZCB0aGUgaW5kZXggaXMgdG8gYSBwYWlyKS4KKyAgICAgIChTZWUgVVBST1BTX1NDUklQVF9YX1dJVEhfQ09NTU9OIGV0Yy4gaW4gdXByb3BzLmguKQorCitUcmllIGxvb2t1cCBhbmQgcHJvcGVydGllczoKKworSW4gb3JkZXIgdG8gY29uZGVuc2UgdGhlIGRhdGEgZm9yIHRoZSAyMS1iaXQgY29kZSBzcGFjZSwgc2V2ZXJhbCBwcm9wZXJ0aWVzIG9mCit0aGUgVW5pY29kZSBjb2RlIGFzc2lnbm1lbnQgYXJlIGV4cGxvaXRlZDoKKy0gVGhlIGNvZGUgc3BhY2UgaXMgc3BhcnNlLgorLSBUaGVyZSBhcmUgc2V2ZXJhbCAxMGsgb2YgY29uc2VjdXRpdmUgY29kZXMgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzLgorLSBDaGFyYWN0ZXJzIGFuZCBzY3JpcHRzIGFyZSBhbGxvY2F0ZWQgaW4gZ3JvdXBzIG9mIDE2IGNvZGUgcG9pbnRzLgorLSBJbnNpZGUgYmxvY2tzIGZvciBzY3JpcHRzIHRoZSBwcm9wZXJ0aWVzIGFyZSBvZnRlbiByZXBldGl0aXZlLgorLSBUaGUgMjEtYml0IHNwYWNlIGlzIG5vdCBmdWxseSB1c2VkIGZvciBVbmljb2RlLgorCitUaGUgbG9va3VwIG9mIHByb3BlcnRpZXMgZm9yIGEgZ2l2ZW4gY29kZSBwb2ludCBpcyBkb25lIHdpdGggYSB0cmllIGxvb2t1cCwKK3VzaW5nIHRoZSBVVHJpZSBpbXBsZW1lbnRhdGlvbi4KK1RoZSB0cmllIGxvb2t1cCByZXN1bHQgaXMgYSAxNi1iaXQgcHJvcGVydGllcyB3b3JkLgorCitXaXRoIGEgZ2l2ZW4gVW5pY29kZSBjb2RlIHBvaW50CisKKyAgICBVQ2hhcjMyIGM7CisKK2FuZCAwPD1jPDB4MTEwMDAwLCB0aGUgbG9va3VwIGlzIGRvbmUgbGlrZSB0aGlzOgorCisgICAgdWludDE2X3QgcHJvcHM7CisgICAgVVRSSUVfR0VUMTYodHJpZSwgYywgcHJvcHMpOworCitFYWNoIDE2LWJpdCBwcm9wZXJ0aWVzIHdvcmQgY29udGFpbnM6CisKKyAwLi4gNCAgZ2VuZXJhbCBjYXRlZ29yeQorICAgICA1ICByZXNlcnZlZAorIDYuLjE1ICBudW1lcmljIHR5cGUgYW5kIHZhbHVlIChudHYpCisKK0VuY29kaW5nIG9mIG51bWVyaWMgdHlwZSBhbmQgdmFsdWUgaW4gdGhlIDEwLWJpdCBudHYgZmllbGQ6CisgICAgbnR2ICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICB2YWx1ZQorICAgIDAgICAgICAgICAgICAgICBVX05UX05PTkUgICAgICAgMAorICAgIDEuLjEwICAgICAgICAgICBVX05UX0RFQ0lNQUwgICAgMC4uOQorICAgIDExLi4yMCAgICAgICAgICBVX05UX0RJR0lUICAgICAgMC4uOQorICAgIDIxLi4weDJmZiAgICAgICBVX05UX05VTUVSSUMgICAgc2VlIGJlbG93CisgICAgMHgzMDAuLjB4M2ZmICAgIHJlc2VydmVkCisKKyAgICBGb3IgVV9OVF9OVU1FUklDOgorICAgIG50diAgICAgICAgICAgICB2YWx1ZQorICAgIDIxLi4weGFmICAgICAgICBpbnRlZ2VyICAgICAwLi4xNTQKKyAgICAweGIwLi4weDFkZiAgICAgZnJhY3Rpb24gICAgKChudHY+PjQpLTEyKSAvICgobnR2JjB4ZikrMSkgPSAtMS4uMTcgLyAxLi4xNgorICAgIDB4MWUwLi4weDJmZiAgICBsYXJnZSBpbnQgICAoKG50dj4+NSktMTQpICogMTBeKChudHYmMHgxZikrMikgPSAoMS4uOSkqKDEwXjIuLjEwXjMzKQorICAgICAgICAgICAgICAgICAgICAob25seSBvbmUgc2lnbmlmaWNhbnQgZGVjaW1hbCBkaWdpdCkKKworLS0tIEFkZGl0aW9uYWwgcHJvcGVydGllcyAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDIuMSkgLS0tCisKK1RoZSBzZWNvbmQgdHJpZSBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIChBVCkgaXMgYWxzbyBhIFVUcmllIHdpdGggMTYtYml0IGRhdGEuCitUaGUgZGF0YSB3b3JkcyBjb25zaXN0IG9mIDMyLWJpdCB1bml0IGluZGV4ZXMgKG5vdCByb3cgaW5kZXhlcyEpIGludG8gdGhlCit0YWJsZSBvZiB1bmlxdWUgcHJvcGVydGllcyB2ZWN0b3JzIChQVikuCitFYWNoIHZlY3RvciBjb250YWlucyBhIHNldCBvZiBwcm9wZXJ0aWVzLgorVGhlIHdpZHRoIG9mIGEgdmVjdG9yIChudW1iZXIgb2YgdWludDMyX3QgcGVyIHJvdykgbWF5IGNoYW5nZQord2l0aCB0aGUgZm9ybWF0VmVyc2lvbiwgaXQgaXMgc3RvcmVkIGluIGk1LgorCitDdXJyZW50IHByb3BlcnRpZXM6IHNlZSBpY3Uvc291cmNlL2NvbW1vbi91cHJvcHMuaAorCistLS0gQ2hhbmdlcyBpbiBmb3JtYXQgdmVyc2lvbiAzLjEgLS0tCisKK1NlZSBpMTAgbWF4VmFsdWVzIGFib3ZlLCBjb250YWlucyBvbmx5IFVCTE9DS19DT1VOVCBhbmQgVVNDUklQVF9DT0RFX0xJTUlULgorCistLS0gQ2hhbmdlcyBpbiBmb3JtYXQgdmVyc2lvbiAzLjIgLS0tCisKKy0gVGhlIHRyaWVzIHVzZSBsaW5lYXIgTGF0aW4tMSByYW5nZXMuCistIFRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYml0cyBzdG9yZSBmdWxsIHByb3BlcnRpZXMgWFlaIGluc3RlYWQKKyAgb2YgcGFydGlhbCBPdGhlcl9YWVosIHNvIHRoYXQgY2hhbmdlcyBpbiB0aGUgZGVyaXZhdGlvbiBmb3JtdWxhcworICBuZWVkIG5vdCBiZSB0cmFja2VkIGluIHJ1bnRpbWUgbGlicmFyeSBjb2RlLgorLSBKb2luaW5nIFR5cGUgYW5kIExpbmUgQnJlYWsgYXJlIGFsc28gc3RvcmVkIGNvbXBsZXRlbHksIHNvIHRoYXQgdXByb3BzLmMKKyAgbmVlZHMgbm8gcnVudGltZSBmb3JtdWxhcyBmb3IgZW51bWVyYXRlZCBwcm9wZXJ0aWVzIGVpdGhlci4KKy0gU3RvcmUgdGhlIGNhc2Utc2Vuc2l0aXZlIGZsYWcgaW4gdGhlIG1haW4gcHJvcGVydGllcyB3b3JkLgorLSBpMTAgYWxzbyBjb250YWlucyBVX0xCX0NPVU5UIGFuZCBVX0VBX0NPVU5ULgorLSBpMTEgY29udGFpbnMgbWF4VmFsdWVzMiBmb3IgdmVjdG9yIHdvcmQgMi4KKworLS0tIENoYW5nZXMgaW4gZm9ybWF0IHZlcnNpb24gNCAtLS0KKworVGhlIGZvcm1hdCBjaGFuZ2VzIGJldHdlZW4gdmVyc2lvbiAzIGFuZCA0IGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0bworY2FzZSBtYXBwaW5ncyBhbmQgYmlkaS9zaGFwaW5nIGFyZSBwdWxsZWQgb3V0IGludG8gc2VwYXJhdGUgZmlsZXMKK2ZvciBtb2R1bGFyaXphdGlvbi4KK0luIG9yZGVyIHRvIHJlZHVjZSB0aGUgbmVlZCBmb3IgY29kZSBjaGFuZ2VzLCBzb21lIG9mIHRoZSBwcmV2aW91cyBkYXRhCitzdHJ1Y3R1cmVzIGFyZSBvbWl0dGVkLCByYXRoZXIgdGhhbiByZWFycmFuZ2luZyBldmVyeXRoaW5nLgorCisoVGhlIGNoYW5nZSB0byBmb3JtYXQgdmVyc2lvbiA0IGlzIGZvciBJQ1UgMy40LiBUaGUgbGFzdCBDVlMgcmV2aXNpb24gb2YKK2dlbnByb3BzL3N0b3JlLmMgZm9yIGZvcm1hdCB2ZXJzaW9uIDMuMiBpcyAxLjQ4LikKKworVGhlIG1haW4gdHJpZSdzIGRhdGEgaXMgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkOgorLSBUaGUgdHJpZSdzIDE2LWJpdCBkYXRhIHdvcmQgaXMgdXNlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGFzIGFuIGluZGV4CisgIGludG8gcHJvcHMzMltdLgorLSBUaGUgdHJpZSB1c2VzIHRoZSBkZWZhdWx0IHRyaWUgZm9sZGluZyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBjdXN0b20gb25lcy4KKy0gTnVtZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgdHJpZSBkYXRhIHdvcmQsIHdpdGggc3BlY2lhbAorICBlbmNvZGluZ3MuCistIE5vIG1vcmUgZXhjZXB0aW9uIGRhdGEgKHRoZSBkYXRhIHRoYXQgbmVlZGVkIGl0IHdhcyBwdWxsZWQgb3V0LCBvciwgaW4gdGhlCisgIGNhc2Ugb2YgbnVtZXJpYyB2YWx1ZXMsIGVuY29kZWQgZGlmZmVyZW50bHkpLgorLSBObyBtb3JlIHN0cmluZyBkYXRhIChwdWxsZWQgb3V0IC0gd2FzIGZvciBjYXNlIG1hcHBpbmdzKS4KKworQWxzbywgc29tZSBvZiB0aGUgcHJldmlvdXNseSB1c2VkIHByb3BlcnRpZXMgdmVjdG9yIGJpdHMgYXJlIHJlc2VydmVkIGFnYWluLgorCitUaGUgaW5kZXhlc1tdIHZhbHVlcyBmb3IgdGhlIG9taXR0ZWQgc3RydWN0dXJlcyBhcmUgc3RpbGwgZmlsbGVkIGluCisoaW5kaWNhdGluZyB6ZXJvLWxlbmd0aCBhcnJheXMpIHNvIHRoYXQgdGhlIHN3YXBwZXIgY29kZSByZW1haW5zIHVuY2hhbmdlZC4KKworLS0tIENoYW5nZXMgaW4gZm9ybWF0IHZlcnNpb24gNSAtLS0KKworRm9ybWF0IHZlcnNpb24gNSBiZWNhbWUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGJpdCBmaWVsZCBmb3Igc2NyaXB0IGNvZGVzCitvdmVyZmxvd2VkLiBUaGUgY2hhbmdlcyBhcmUgaW5jb21wYXRpYmxlIGJlY2F1c2UKK29sZCBjb2RlIHdvdWxkIGhhdmUgc2VlbiBub25zZW5zaWNhbGx5IGxvdyB2YWx1ZXMgZm9yIG5ldywgaGlnaGVyIHNjcmlwdCBjb2Rlcy4KKworUmVhcnJhbmdlZCBiaXQgZmllbGRzIGluIHRoZSBzZWNvbmQgdHJpZSAoQVQpIGFuZCB3aWRlbmVkIHRocmVlIChTY3JpcHQsIEJsb2NrLAorV29yZF9CcmVhaykgYnkgb25lIGJpdCBlYWNoLgorCitNb2RpZmllZCBiaXQgZmllbGRzIGluIGljdS9zb3VyY2UvY29tbW9uL3Vwcm9wcy5oCisKKy0tLSBDaGFuZ2VzIGluIGZvcm1hdCB2ZXJzaW9uIDYgLS0tCisKK0Zvcm1hdCB2ZXJzaW9uIDYgYmVjYW1lIG5lY2Vzc2FyeSBiZWNhdXNlIFVuaWNvZGUgNS4yIGFkZHMgZnJhY3Rpb25zIHdpdGgKK2Rlbm9taW5hdG9ycyA5LCAxMCBhbmQgMTYsIGFuZCBpdCB3YXMgZWFzaWVyIHRvIHJlZGVzaWduIHRoZSBlbmNvZGluZyBvZiBudW1lcmljCit0eXBlcyBhbmQgdmFsdWVzIHJhdGhlciB0aGFuIGFkZCBhbm90aGVyIHZhcmlhbnQgdG8gdGhlIHByZXZpb3VzIGZvcm1hdC4KKworLS0tIENoYW5nZXMgaW4gZm9ybWF0IHZlcnNpb24gNyAtLS0KKworVW5pY29kZSA2LjAgYWRkcyBTY3JpcHRfRXh0ZW5zaW9ucy4gRm9yIGNoYXJhY3RlcnMgd2l0aCBzY3JpcHQgZXh0ZW5zaW9ucyBkYXRhLAordGhlIHNjcmlwdCBjb2RlIGJpdHMgYXJlIGFuIGluZGV4IGludG8gdGhlIG5ldyBTY3JpcHRfRXh0ZW5zaW9ucyBhcnJheSByYXRoZXIKK3RoYW4gYSBzY3JpcHQgY29kZS4KKworQ2hhbmdlIGZyb20gVVRyaWUgdG8gVVRyaWUyLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVX05BTUVTUEFDRV9VU0UKKworLyogVURhdGFJbmZvIGNmLiB1ZGF0YS5oICovCitzdGF0aWMgVURhdGFJbmZvIGRhdGFJbmZvPXsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgVV9TSVpFT0ZfVUNIQVIsCisgICAgMCwKKworICAgIHsgMHg1NSwgMHg1MCwgMHg3MiwgMHg2ZiB9LCAgICAgICAgICAgICAgICAgLyogZGF0YUZvcm1hdD0iVVBybyIgKi8KKyAgICB7IDcsIDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcm1hdFZlcnNpb24gKi8KKyAgICB7IDYsIDAsIDAsIDAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRhdGFWZXJzaW9uICovCit9OworCitjbGFzcyBDb3JlUHJvcHNCdWlsZGVyIDogcHVibGljIFByb3BzQnVpbGRlciB7CitwdWJsaWM6CisgICAgQ29yZVByb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpOworICAgIHZpcnR1YWwgfkNvcmVQcm9wc0J1aWxkZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRVbmljb2RlVmVyc2lvbihjb25zdCBVVmVyc2lvbkluZm8gdmVyc2lvbik7CisgICAgdmlydHVhbCB2b2lkIHNldFByb3BzKGNvbnN0IFVuaVByb3BzICYsIGNvbnN0IFVuaWNvZGVTZXQgJm5ld1ZhbHVlcywgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgYnVpbGQoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVDU291cmNlRmlsZShjb25zdCBjaGFyICpwYXRoLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZUJpbmFyeURhdGEoY29uc3QgY2hhciAqcGF0aCwgVUJvb2wgd2l0aENvcHlyaWdodCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNldEdjQW5kTnVtZXJpYyhjb25zdCBVbmlQcm9wcyAmLCBjb25zdCBVbmljb2RlU2V0ICZuZXdWYWx1ZXMsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisKKyAgICBVVHJpZTIgKnBUcmllOworICAgIFVUcmllMiAqcHJvcHMyVHJpZTsKKyAgICBVUHJvcHNWZWN0b3JzICpwdjsKKyAgICBVbmljb2RlU3RyaW5nIHNjcmlwdEV4dGVuc2lvbnM7Cit9OworCitDb3JlUHJvcHNCdWlsZGVyOjpDb3JlUHJvcHNCdWlsZGVyKFVFcnJvckNvZGUgJmVycm9yQ29kZSkKKyAgICAgICAgOiBwVHJpZShOVUxMKSwgcHJvcHMyVHJpZShOVUxMKSwgcHYoTlVMTCkgeworICAgIHBUcmllPXV0cmllMl9vcGVuKDAsIDAsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IGNvcmVwcm9wc2J1aWxkZXIgdXRyaWUyX29wZW4oKSBmYWlsZWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICB9CisgICAgcHY9dXB2ZWNfb3BlbihVUFJPUFNfVkVDVE9SX1dPUkRTLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiBjb3JlcHJvcHNidWlsZGVyIHVwdmVjX29wZW4oKSBmYWlsZWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICB9Cit9CisKK0NvcmVQcm9wc0J1aWxkZXI6On5Db3JlUHJvcHNCdWlsZGVyKCkgeworICAgIHV0cmllMl9jbG9zZShwVHJpZSk7CisgICAgdXRyaWUyX2Nsb3NlKHByb3BzMlRyaWUpOworICAgIHVwdmVjX2Nsb3NlKHB2KTsKK30KKwordm9pZAorQ29yZVByb3BzQnVpbGRlcjo6c2V0VW5pY29kZVZlcnNpb24oY29uc3QgVVZlcnNpb25JbmZvIHZlcnNpb24pIHsKKyAgICB1cHJ2X21lbWNweShkYXRhSW5mby5kYXRhVmVyc2lvbiwgdmVyc2lvbiwgNCk7Cit9CisKKy8vIEZvciBudD1VX05UX05VTUVSSUMuCitzdGF0aWMgaW50MzJfdAorZW5jb2RlTnVtZXJpY1ZhbHVlKFVDaGFyMzIgc3RhcnQsIGNvbnN0IGNoYXIgKnMsIFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIC8qIGdldCBhIHBvc3NpYmxlIG1pbnVzIHNpZ24gKi8KKyAgICBVQm9vbCBpc05lZ2F0aXZlOworICAgIGlmKCpzPT0nLScpIHsKKyAgICAgICAgaXNOZWdhdGl2ZT1UUlVFOworICAgICAgICArK3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXNOZWdhdGl2ZT1GQUxTRTsKKyAgICB9CisKKyAgICBpbnQzMl90IHZhbHVlPTAsIGRlbj0wLCBleHA9MCwgbnR2PTA7CisgICAgY2hhciAqbnVtYmVyTGltaXQ7CisgICAgLyogdHJ5IGxhcmdlLCBzaW5nbGUtc2lnbmlmaWNhbnQtZGlnaXQgbnVtYmVycywgbWF5IG90aGVyd2lzZSBvdmVyZmxvdyBzdHJ0b3VsKCkgKi8KKyAgICBpZignMSc8PXNbMF0gJiYgc1swXTw9JzknICYmIHNbMV09PScwJyAmJiBzWzJdPT0nMCcpIHsKKyAgICAgICAgdmFsdWU9c1swXS0nMCc7CisgICAgICAgIG51bWJlckxpbWl0PWNvbnN0X2Nhc3Q8Y2hhciAqPihzKTsKKyAgICAgICAgd2hpbGUoKigrK251bWJlckxpbWl0KT09JzAnKSB7CisgICAgICAgICAgICArK2V4cDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vcm1hbCBudW1iZXIgcGFyc2luZyAqLworICAgICAgICB1bnNpZ25lZCBsb25nIHVsPXVwcnZfc3RydG91bChzLCAmbnVtYmVyTGltaXQsIDEwKTsKKyAgICAgICAgaWYodWw+MHg3ZmZmZmZmZikgeworICAgICAgICAgICAgbnR2PS0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWU9KGludDMyX3QpdWw7CisgICAgICAgIH0KKyAgICAgICAgaWYoczxudW1iZXJMaW1pdCAmJiAqbnVtYmVyTGltaXQ9PScvJykgeworICAgICAgICAgICAgLyogZnJhY3Rpb25hbCB2YWx1ZSwgZ2V0IHRoZSBkZW5vbWluYXRvciAqLworICAgICAgICAgICAgdWw9dXBydl9zdHJ0b3VsKG51bWJlckxpbWl0KzEsICZudW1iZXJMaW1pdCwgMTApOworICAgICAgICAgICAgaWYodWw9PTAgfHwgdWw+MHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgIG50dj0tMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVuPShpbnQzMl90KXVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmKGlzTmVnYXRpdmUpIHsKKyAgICAgICAgdmFsdWU9LShpbnQzMl90KXZhbHVlOworICAgIH0KKworICAgIGlmKG50djwwKSB7CisgICAgICAgIC8vIHBhc3MKKyAgICB9IGVsc2UgaWYoZGVuPT0wICYmIHZhbHVlPj0wKSB7CisgICAgICAgIGlmKGV4cD09MiAmJiAodmFsdWUqMTAwKTw9VVBST1BTX05UVl9NQVhfU01BTExfSU5UKSB7CisgICAgICAgICAgICAvKiBzbWFsbCBpbnRlZ2VyIHBhcnNlZCBsaWtlIGEgbGFyZ2Ugb25lICovCisgICAgICAgICAgICBudHY9VVBST1BTX05UVl9OVU1FUklDX1NUQVJUK3ZhbHVlKjEwMDsKKyAgICAgICAgfSBlbHNlIGlmKGV4cD09MCkgeworICAgICAgICAgICAgaWYodmFsdWU8PVVQUk9QU19OVFZfTUFYX1NNQUxMX0lOVCkgeworICAgICAgICAgICAgICAgIC8qIHNtYWxsIGludGVnZXIgKi8KKyAgICAgICAgICAgICAgICBudHY9VVBST1BTX05UVl9OVU1FUklDX1NUQVJUK3ZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBsYXJnZSBpbnRlZ2VyIHBhcnNlZCBsaWtlIGEgc21hbGwgb25lICovCisgICAgICAgICAgICAgICAgLyogc3BsaXQgdGhlIHZhbHVlIGludG8gbWFudGlzc2EgYW5kIGV4cG9uZW50LCBiYXNlIDEwICovCisgICAgICAgICAgICAgICAgaW50MzJfdCBtYW50PXZhbHVlOworICAgICAgICAgICAgICAgIHdoaWxlKChtYW50JTEwKT09MCkgeworICAgICAgICAgICAgICAgICAgICBtYW50Lz0xMDsKKyAgICAgICAgICAgICAgICAgICAgKytleHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKG1hbnQ8PTkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnR2PSgobWFudCsxNCk8PDUpKyhleHAtMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYoMjw9ZXhwICYmIGV4cDw9MzMgJiYgMTw9dmFsdWUgJiYgdmFsdWU8PTkpIHsKKyAgICAgICAgICAgIC8qIGxhcmdlLCBzaW5nbGUtc2lnbmlmaWNhbnQtZGlnaXQgaW50ZWdlciAqLworICAgICAgICAgICAgbnR2PSgodmFsdWUrMTQpPDw1KSsoZXhwLTIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmKGV4cD09MCkgeworICAgICAgICBpZigtMTw9dmFsdWUgJiYgdmFsdWU8PTE3ICYmIDE8PWRlbiAmJiBkZW48PTE2KSB7CisgICAgICAgICAgICAvKiBmcmFjdGlvbiAqLworICAgICAgICAgICAgbnR2PSgodmFsdWUrMTIpPDw0KSsoZGVuLTEpOworICAgICAgICB9CisgICAgfQorICAgIGlmKG50djwwIHx8ICpudW1iZXJMaW1pdCE9MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmFibGUgdG8gZW5jb2RlIG51bWVyaWMgdmFsdWUgbnY9JXNcbiIsIHMpOworICAgICAgICBlcnJvckNvZGU9VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gbnR2OworfQorCit2b2lkCitDb3JlUHJvcHNCdWlsZGVyOjpzZXRHY0FuZE51bWVyaWMoY29uc3QgVW5pUHJvcHMgJnByb3BzLCBjb25zdCBVbmljb2RlU2V0ICZuZXdWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisgICAgVUNoYXIzMiBzdGFydD1wcm9wcy5zdGFydDsKKyAgICBVQ2hhcjMyIGVuZD1wcm9wcy5lbmQ7CisKKyAgICBpbnQzMl90IHR5cGU9cHJvcHMuZ2V0SW50UHJvcChVQ0hBUl9OVU1FUklDX1RZUEUpOworICAgIGNvbnN0IGNoYXIgKm52U3RyaW5nPXByb3BzLm51bWVyaWNWYWx1ZTsKKyAgICBpZih0eXBlIT1VX05UX05PTkUgJiYgbnZTdHJpbmc9PU5VTEwgJiYgc3RhcnQ9PWVuZCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiBjcCBsaW5lIGhhcyBOdW1lcmljX1R5cGUgYnV0IG5vIE51bWVyaWNfVmFsdWVcbiIpOworICAgICAgICBlcnJvckNvZGU9VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoIW5ld1ZhbHVlcy5jb250YWlucyhVQ0hBUl9HRU5FUkFMX0NBVEVHT1JZKSAmJiAhbmV3VmFsdWVzLmNvbnRhaW5zKFVDSEFSX05VTUVSSUNfVkFMVUUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IG50dj1VUFJPUFNfTlRWX05PTkU7ICAvLyBudW1lcmljIHR5cGUgJiB2YWx1ZQorICAgIGlmKG52U3RyaW5nIT1OVUxMKSB7CisgICAgICAgIGludDMyX3QgZGlnaXRWYWx1ZT1wcm9wcy5kaWdpdFZhbHVlOworICAgICAgICBpZiggdHlwZTw9VV9OVF9OT05FIHx8IFVfTlRfTlVNRVJJQzx0eXBlIHx8CisgICAgICAgICAgICAoKHR5cGU9PVVfTlRfREVDSU1BTCB8fCB0eXBlPT1VX05UX0RJR0lUKSAmJiBkaWdpdFZhbHVlPDApCisgICAgICAgICkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogbnQ9JWQgYnV0IG52PSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAoaW50KXR5cGUsIG52U3RyaW5nPT1OVUxMID8gIk5VTEwiIDogbnZTdHJpbmcpOworICAgICAgICAgICAgZXJyb3JDb2RlPVVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgVV9OVF9OT05FOgorICAgICAgICAgICAgbnR2PVVQUk9QU19OVFZfTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVfTlRfREVDSU1BTDoKKyAgICAgICAgICAgIG50dj1VUFJPUFNfTlRWX0RFQ0lNQUxfU1RBUlQrZGlnaXRWYWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVfTlRfRElHSVQ6CisgICAgICAgICAgICBudHY9VVBST1BTX05UVl9ESUdJVF9TVEFSVCtkaWdpdFZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVV9OVF9OVU1FUklDOgorICAgICAgICAgICAgaWYoZGlnaXRWYWx1ZT49MCkgeworICAgICAgICAgICAgICAgIG50dj1VUFJPUFNfTlRWX05VTUVSSUNfU1RBUlQrZGlnaXRWYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbnR2PWVuY29kZU51bWVyaWNWYWx1ZShzdGFydCwgbnZTdHJpbmcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gdW5yZWFjaGFibGUKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQzMl90IHZhbHVlPQorICAgICAgICAodWludDMyX3QpcHJvcHMuZ2V0SW50UHJvcChVQ0hBUl9HRU5FUkFMX0NBVEVHT1JZKSB8CisgICAgICAgIChudHY8PFVQUk9QU19OVU1FUklDX1RZUEVfVkFMVUVfU0hJRlQpOworICAgIGlmKHN0YXJ0PT1lbmQpIHsKKyAgICAgICAgdXRyaWUyX3NldDMyKHBUcmllLCBzdGFydCwgdmFsdWUsICZlcnJvckNvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHV0cmllMl9zZXRSYW5nZTMyKHBUcmllLCBzdGFydCwgZW5kLCB2YWx1ZSwgVFJVRSwgJmVycm9yQ29kZSk7CisgICAgfQorICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHV0cmllMl9zZXRSYW5nZTMyKHByb3BlcnRpZXMgdHJpZSAlMDRsWC4uJTA0bFgpIGZhaWxlZCAtICVzXG4iLAorICAgICAgICAgICAgICAgIChsb25nKXN0YXJ0LCAobG9uZyllbmQsIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgIH0KK30KKworc3RydWN0IFByb3BUb0JpbmFyeSB7CisgICAgaW50MzJfdCBwcm9wOyAgLy8gVVByb3BlcnR5CisgICAgaW50MzJfdCB2ZWNXb3JkLCB2ZWNTaGlmdDsKK307CisKK3N0YXRpYyBjb25zdCBQcm9wVG9CaW5hcnkKK3Byb3BUb0JpbmFyaWVzW109eworICAgIHsgVUNIQVJfV0hJVEVfU1BBQ0UsICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfV0hJVEVfU1BBQ0UgfSwKKyAgICB7IFVDSEFSX0RBU0gsICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0RBU0ggfSwKKyAgICAvLyBOb3RlOiBUaGUgSHlwaGVuIHByb3BlcnR5IGlzIHN0YWJpbGl6ZWQgc2luY2UgVW5pY29kZSA0LjAKKyAgICAvLyBhbmQgZGVwcmVjYXRlZCBzaW5jZSBVbmljb2RlIDYuMC4KKyAgICB7IFVDSEFSX0hZUEhFTiwgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0hZUEhFTiB9LAorICAgIHsgVUNIQVJfUVVPVEFUSU9OX01BUkssICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfUVVPVEFUSU9OX01BUksgfSwKKyAgICB7IFVDSEFSX1RFUk1JTkFMX1BVTkNUVUFUSU9OLCAgICAgICAgICAgMSwgVVBST1BTX1RFUk1JTkFMX1BVTkNUVUFUSU9OIH0sCisgICAgLy8gTm90ZTogVGhlIEhleF9EaWdpdCBhbmQgQVNDSUlfSGV4X0RpZ2l0IHByb3BlcnRpZXMgYXJlIHByb2JhYmx5IHN0YWJsZSBlbm91Z2gKKyAgICAvLyBzbyB0aGF0IHRoZXkgY291bGQgYmUgaGFyZGNvZGVkLgorICAgIHsgVUNIQVJfSEVYX0RJR0lULCAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfSEVYX0RJR0lUIH0sCisgICAgeyBVQ0hBUl9BU0NJSV9IRVhfRElHSVQsICAgICAgICAgICAgICAgIDEsIFVQUk9QU19BU0NJSV9IRVhfRElHSVQgfSwKKyAgICB7IFVDSEFSX0lERU9HUkFQSElDLCAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0lERU9HUkFQSElDIH0sCisgICAgeyBVQ0hBUl9ESUFDUklUSUMsICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19ESUFDUklUSUMgfSwKKyAgICB7IFVDSEFSX0VYVEVOREVSLCAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0VYVEVOREVSIH0sCisgICAgLy8gTm90ZTogVGhlIE5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50IHByb3BlcnR5IGlzIHByb2JhYmx5IHN0YWJsZSBlbm91Z2gKKyAgICAvLyBzbyB0aGF0IGl0IGNvdWxkIGJlIGhhcmRjb2RlZC4KKyAgICB7IFVDSEFSX05PTkNIQVJBQ1RFUl9DT0RFX1BPSU5ULCAgICAgICAgMSwgVVBST1BTX05PTkNIQVJBQ1RFUl9DT0RFX1BPSU5UIH0sCisgICAgLy8gTm90ZTogVGhlIEdyYXBoZW1lX0xpbmsgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBzaW5jZSBVbmljb2RlIDUuMAorICAgIC8vIGJlY2F1c2UgaXQgaXMgYSAiRHVwbGljYXRpb24gb2YgY2NjPTkiIChVQVggIzQ0KS4KKyAgICB7IFVDSEFSX0dSQVBIRU1FX0xJTkssICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0dSQVBIRU1FX0xJTksgfSwKKyAgICB7IFVDSEFSX0lEU19CSU5BUllfT1BFUkFUT1IsICAgICAgICAgICAgMSwgVVBST1BTX0lEU19CSU5BUllfT1BFUkFUT1IgfSwKKyAgICB7IFVDSEFSX0lEU19UUklOQVJZX09QRVJBVE9SLCAgICAgICAgICAgMSwgVVBST1BTX0lEU19UUklOQVJZX09QRVJBVE9SIH0sCisgICAgeyBVQ0hBUl9SQURJQ0FMLCAgICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19SQURJQ0FMIH0sCisgICAgeyBVQ0hBUl9VTklGSUVEX0lERU9HUkFQSCwgICAgICAgICAgICAgIDEsIFVQUk9QU19VTklGSUVEX0lERU9HUkFQSCB9LAorICAgIHsgVUNIQVJfREVQUkVDQVRFRCwgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfREVQUkVDQVRFRCB9LAorICAgIHsgVUNIQVJfTE9HSUNBTF9PUkRFUl9FWENFUFRJT04sICAgICAgICAxLCBVUFJPUFNfTE9HSUNBTF9PUkRFUl9FWENFUFRJT04gfSwKKyAgICB7IFVDSEFSX1NfVEVSTSwgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX1NfVEVSTSB9LAorICAgIHsgVUNIQVJfVkFSSUFUSU9OX1NFTEVDVE9SLCAgICAgICAgICAgICAxLCBVUFJPUFNfVkFSSUFUSU9OX1NFTEVDVE9SIH0sCisgICAgLy8gTm90ZTogUGF0dGVybl9TeW50YXggJiBQYXR0ZXJuX1doaXRlX1NwYWNlIGFyZSBhdmFpbGFibGUgdmlhCisgICAgLy8gdGhlIGludGVybmFsIFBhdHRlcm5Qcm9wcyBjbGFzcyBhbmQgbmVlZCBub3QgYmUgc3RvcmVkIGhlcmUgYW55IG1vcmUuCisgICAgeyBVQ0hBUl9QQVRURVJOX1NZTlRBWCwgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19QQVRURVJOX1NZTlRBWCB9LAorICAgIHsgVUNIQVJfUEFUVEVSTl9XSElURV9TUEFDRSwgICAgICAgICAgICAxLCBVUFJPUFNfUEFUVEVSTl9XSElURV9TUEFDRSB9LAorICAgIHsgVUNIQVJfWElEX1NUQVJULCAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfWElEX1NUQVJUIH0sCisgICAgeyBVQ0hBUl9YSURfQ09OVElOVUUsICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19YSURfQ09OVElOVUUgfSwKKyAgICB7IFVDSEFSX01BVEgsICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX01BVEggfSwKKyAgICB7IFVDSEFSX0FMUEhBQkVUSUMsICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0FMUEhBQkVUSUMgfSwKKyAgICB7IFVDSEFSX0dSQVBIRU1FX0VYVEVORCwgICAgICAgICAgICAgICAgMSwgVVBST1BTX0dSQVBIRU1FX0VYVEVORCB9LAorICAgIHsgVUNIQVJfREVGQVVMVF9JR05PUkFCTEVfQ09ERV9QT0lOVCwgICAxLCBVUFJPUFNfREVGQVVMVF9JR05PUkFCTEVfQ09ERV9QT0lOVCB9LAorICAgIHsgVUNIQVJfSURfU1RBUlQsICAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfSURfU1RBUlQgfSwKKyAgICB7IFVDSEFSX0lEX0NPTlRJTlVFLCAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0lEX0NPTlRJTlVFIH0sCisgICAgeyBVQ0hBUl9HUkFQSEVNRV9CQVNFLCAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19HUkFQSEVNRV9CQVNFIH0sCit9OworCitzdHJ1Y3QgUHJvcFRvRW51bSB7CisgICAgaW50MzJfdCBwcm9wOyAgLy8gVVByb3BlcnR5CisgICAgaW50MzJfdCB2ZWNXb3JkLCB2ZWNTaGlmdDsKKyAgICB1aW50MzJfdCB2ZWNNYXNrOworfTsKKworc3RhdGljIGNvbnN0IFByb3BUb0VudW0KK3Byb3BUb0VudW1zW109eworICAgIC8vIFVzZSBVUFJPUFNfU0NSSVBUX1hfTUFTSyBub3QgVVBST1BTX1NDUklQVF9NQVNLOgorICAgIC8vIFdoZW4gd3JpdGluZyBhIFNjcmlwdCBjb2RlLCByZW1vdmUgU2NyaXB0X0V4dGVuc2lvbnMgYml0cyBhcyB3ZWxsLgorICAgIC8vIElmIG5lZWRlZCwgdGhleSB3aWxsIGdldCB3cml0dGVuIGFnYWluLgorICAgIHsgVUNIQVJfU0NSSVBULCAgICAgICAgICAgICAgICAgICAgIDAsIDAsIFVQUk9QU19TQ1JJUFRfWF9NQVNLIH0sCisgICAgeyBVQ0hBUl9CTE9DSywgICAgICAgICAgICAgICAgICAgICAgMCwgVVBST1BTX0JMT0NLX1NISUZULCBVUFJPUFNfQkxPQ0tfTUFTSyB9LAorICAgIHsgVUNIQVJfRUFTVF9BU0lBTl9XSURUSCwgICAgICAgICAgIDAsIFVQUk9QU19FQV9TSElGVCwgVVBST1BTX0VBX01BU0sgfSwKKyAgICB7IFVDSEFSX0RFQ09NUE9TSVRJT05fVFlQRSwgICAgICAgICAyLCAwLCBVUFJPUFNfRFRfTUFTSyB9LAorICAgIHsgVUNIQVJfR1JBUEhFTUVfQ0xVU1RFUl9CUkVBSywgICAgIDIsIFVQUk9QU19HQ0JfU0hJRlQsIFVQUk9QU19HQ0JfTUFTSyB9LAorICAgIHsgVUNIQVJfV09SRF9CUkVBSywgICAgICAgICAgICAgICAgIDIsIFVQUk9QU19XQl9TSElGVCwgVVBST1BTX1dCX01BU0sgfSwKKyAgICB7IFVDSEFSX1NFTlRFTkNFX0JSRUFLLCAgICAgICAgICAgICAyLCBVUFJPUFNfU0JfU0hJRlQsIFVQUk9QU19TQl9NQVNLIH0sCisgICAgeyBVQ0hBUl9MSU5FX0JSRUFLLCAgICAgICAgICAgICAgICAgMiwgVVBST1BTX0xCX1NISUZULCBVUFJPUFNfTEJfTUFTSyB9LAorfTsKKwordm9pZAorQ29yZVByb3BzQnVpbGRlcjo6c2V0UHJvcHMoY29uc3QgVW5pUHJvcHMgJnByb3BzLCBjb25zdCBVbmljb2RlU2V0ICZuZXdWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBzZXRHY0FuZE51bWVyaWMocHJvcHMsIG5ld1ZhbHVlcywgZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKworICAgIFVDaGFyMzIgc3RhcnQ9cHJvcHMuc3RhcnQ7CisgICAgVUNoYXIzMiBlbmQ9cHJvcHMuZW5kOworICAgIGlmKHN0YXJ0PT0wICYmIGVuZD09MHgxMGZmZmYpIHsKKyAgICAgICAgLy8gQWxzbyBzZXQgYml0cyBmb3IgaW5pdGlhbFZhbHVlIGFuZCBlcnJvclZhbHVlLgorICAgICAgICBlbmQ9VVBWRUNfTUFYX0NQOworICAgIH0KKyAgICBpZihuZXdWYWx1ZXMuY29udGFpbnNTb21lKDAsIFVDSEFSX0JJTkFSWV9MSU1JVC0xKSkgeworICAgICAgICBmb3IoaW50MzJfdCBpPTA7IGk8TEVOR1RIT0YocHJvcFRvQmluYXJpZXMpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IFByb3BUb0JpbmFyeSAmcDJiPXByb3BUb0JpbmFyaWVzW2ldOworICAgICAgICAgICAgVV9BU1NFUlQocDJiLnZlY1NoaWZ0PDMyKTsKKyAgICAgICAgICAgIGlmKG5ld1ZhbHVlcy5jb250YWlucyhwMmIucHJvcCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrPVVfTUFTSyhwMmIudmVjU2hpZnQpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlPSBwcm9wcy5iaW5Qcm9wc1twMmIucHJvcF0gPyBtYXNrIDogMDsKKyAgICAgICAgICAgICAgICB1cHZlY19zZXRWYWx1ZShwdiwgc3RhcnQsIGVuZCwgcDJiLnZlY1dvcmQsIHZhbHVlLCBtYXNrLCAmZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZihuZXdWYWx1ZXMuY29udGFpbnNTb21lKFVDSEFSX0lOVF9TVEFSVCwgVUNIQVJfSU5UX0xJTUlULTEpKSB7CisgICAgICAgIGZvcihpbnQzMl90IGk9MDsgaTxMRU5HVEhPRihwcm9wVG9FbnVtcyk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgUHJvcFRvRW51bSAmcDJlPXByb3BUb0VudW1zW2ldOworICAgICAgICAgICAgVV9BU1NFUlQocDJlLnZlY1NoaWZ0PDMyKTsKKyAgICAgICAgICAgIGlmKG5ld1ZhbHVlcy5jb250YWlucyhwMmUucHJvcCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrPXAyZS52ZWNNYXNrOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlPSh1aW50MzJfdCkocHJvcHMuZ2V0SW50UHJvcChwMmUucHJvcCk8PHAyZS52ZWNTaGlmdCk7CisgICAgICAgICAgICAgICAgVV9BU1NFUlQoKHZhbHVlJm1hc2spPT12YWx1ZSk7CisgICAgICAgICAgICAgICAgdXB2ZWNfc2V0VmFsdWUocHYsIHN0YXJ0LCBlbmQsIHAyZS52ZWNXb3JkLCB2YWx1ZSwgbWFzaywgJmVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYobmV3VmFsdWVzLmNvbnRhaW5zKFVDSEFSX0FHRSkpIHsKKyAgICAgICAgaWYocHJvcHMuYWdlWzBdPjE1IHx8IHByb3BzLmFnZVsxXT4xNSB8fCBwcm9wcy5hZ2VbMl0hPTAgfHwgcHJvcHMuYWdlWzNdIT0wKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZmZlcltVX01BWF9WRVJTSU9OX1NUUklOR19MRU5HVEhdOworICAgICAgICAgICAgdV92ZXJzaW9uVG9TdHJpbmcocHJvcHMuYWdlLCBidWZmZXIpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogYWdlICVzIGNhbm5vdCBiZSBlbmNvZGVkXG4iLCBidWZmZXIpOworICAgICAgICAgICAgZXJyb3JDb2RlPVVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCB2ZXJzaW9uPShwcm9wcy5hZ2VbMF08PDQpfHByb3BzLmFnZVsxXTsKKyAgICAgICAgdXB2ZWNfc2V0VmFsdWUocHYsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIHZlcnNpb248PFVQUk9QU19BR0VfU0hJRlQsIFVQUk9QU19BR0VfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yQ29kZSk7CisgICAgfQorICAgIC8vIFdyaXRlIGEgbmV3IChTY3JpcHQsIFNjcmlwdF9FeHRlbnNpb25zKSB2YWx1ZSBpZiB0aGVyZSBhcmUgU2NyaXB0X0V4dGVuc2lvbnMKKyAgICAvLyBhbmQgZWl0aGVyIFNjcmlwdCBvciBTY3JpcHRfRXh0ZW5zaW9ucyBhcmUgbmV3IG9uIHRoZSBjdXJyZW50IGxpbmUuCisgICAgLy8gKElmIG9ubHkgU2NyaXB0IGlzIG5ldywgdGhlbiBpdCBqdXN0IGNsb2JiZXJlZCB0aGUgcmVsZXZhbnQgYml0cy4pCisgICAgaWYoICFwcm9wcy5zY3guaXNFbXB0eSgpICYmCisgICAgICAgIChuZXdWYWx1ZXMuY29udGFpbnMoVUNIQVJfU0NSSVBUKSB8fCBuZXdWYWx1ZXMuY29udGFpbnMoVUNIQVJfU0NSSVBUX0VYVEVOU0lPTlMpKQorICAgICkgeworICAgICAgICBVbmljb2RlU3RyaW5nIGNvZGVzOyAgLy8gdmVjdG9yIG9mIDE2LWJpdCBVU2NyaXB0Q29kZSB2YWx1ZXMKKyAgICAgICAgVW5pY29kZVNldEl0ZXJhdG9yIGl0ZXIocHJvcHMuc2N4KTsKKyAgICAgICAgd2hpbGUoaXRlci5uZXh0KCkpIHsgY29kZXMuYXBwZW5kKChVQ2hhcilpdGVyLmdldENvZGVwb2ludCgpKTsgfQorCisgICAgICAgIC8vIFNldCBiaXQgMTUgb24gdGhlIGxhc3Qgc2NyaXB0IGNvZGUsIGZvciB0ZXJtaW5hdGlvbi4KKyAgICAgICAgaW50MzJfdCBsZW5ndGg9Y29kZXMubGVuZ3RoKCk7CisgICAgICAgIGNvZGVzLnNldENoYXJBdChsZW5ndGgtMSwgKFVDaGFyKShjb2Rlc1tsZW5ndGgtMV18MHg4MDAwKSk7CisgICAgICAgIC8vIEZpbmQgdGhpcyBsaXN0IG9mIGNvZGVzIGluIHRoZSBTY3JpcHRfRXh0ZW5zaW9ucyBkYXRhIHNvIGZhciwgb3IgYWRkIHRoaXMgbGlzdC4KKyAgICAgICAgaW50MzJfdCBpbmRleD1zY3JpcHRFeHRlbnNpb25zLmluZGV4T2YoY29kZXMpOworICAgICAgICBpZihpbmRleDwwKSB7CisgICAgICAgICAgICBpbmRleD1zY3JpcHRFeHRlbnNpb25zLmxlbmd0aCgpOworICAgICAgICAgICAgc2NyaXB0RXh0ZW5zaW9ucy5hcHBlbmQoY29kZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5jb2RlIHRoZSAoU2NyaXB0LCBTY3JpcHRfRXh0ZW5zaW9ucyBpbmRleCkgcGFpci4KKyAgICAgICAgaW50MzJfdCBzY3JpcHQ9cHJvcHMuZ2V0SW50UHJvcChVQ0hBUl9TQ1JJUFQpOworICAgICAgICB1aW50MzJfdCBzY3JpcHRYOworICAgICAgICBpZihzY3JpcHQ9PVVTQ1JJUFRfQ09NTU9OKSB7CisgICAgICAgICAgICBzY3JpcHRYPVVQUk9QU19TQ1JJUFRfWF9XSVRIX0NPTU1PTnwodWludDMyX3QpaW5kZXg7CisgICAgICAgIH0gZWxzZSBpZihzY3JpcHQ9PVVTQ1JJUFRfSU5IRVJJVEVEKSB7CisgICAgICAgICAgICBzY3JpcHRYPVVQUk9QU19TQ1JJUFRfWF9XSVRIX0lOSEVSSVRFRHwodWludDMyX3QpaW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTdG9yZSBhbiBhZGRpdGlvbmFsIHBhaXIgb2YgMTYtYml0IHVuaXRzIGZvciBhbiB1bnVzdWFsIG1haW4gU2NyaXB0IGNvZGUKKyAgICAgICAgICAgIC8vIHRvZ2V0aGVyIHdpdGggdGhlIFNjcmlwdF9FeHRlbnNpb25zIGluZGV4LgorICAgICAgICAgICAgVW5pY29kZVN0cmluZyBjb2RlSW5kZXhQYWlyOworICAgICAgICAgICAgY29kZUluZGV4UGFpci5hcHBlbmQoKFVDaGFyKXNjcmlwdCkuYXBwZW5kKChVQ2hhcilpbmRleCk7CisgICAgICAgICAgICBpbmRleD1zY3JpcHRFeHRlbnNpb25zLmluZGV4T2YoY29kZUluZGV4UGFpcik7CisgICAgICAgICAgICBpZihpbmRleDwwKSB7CisgICAgICAgICAgICAgICAgaW5kZXg9c2NyaXB0RXh0ZW5zaW9ucy5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBzY3JpcHRFeHRlbnNpb25zLmFwcGVuZChjb2RlSW5kZXhQYWlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjcmlwdFg9VVBST1BTX1NDUklQVF9YX1dJVEhfT1RIRVJ8KHVpbnQzMl90KWluZGV4OworICAgICAgICB9CisgICAgICAgIGlmKGluZGV4PlVQUk9QU19TQ1JJUFRfTUFTSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXhlcyBvdmVyZmxvdyBiaXQgZmllbGRcbiIpOworICAgICAgICAgICAgZXJyb3JDb2RlPVVfQlVGRkVSX09WRVJGTE9XX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHVwdmVjX3NldFZhbHVlKHB2LCBzdGFydCwgZW5kLCAwLCBzY3JpcHRYLCBVUFJPUFNfU0NSSVBUX1hfTUFTSywgJmVycm9yQ29kZSk7CisgICAgfQorICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IHVuYWJsZSB0byBzZXQgcHJvcHMyIHZhbHVlcyBmb3IgJTA0bFguLiUwNGxYOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAobG9uZylzdGFydCwgKGxvbmcpZW5kLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90IGluZGV4ZXNbVVBST1BTX0lOREVYX0NPVU5UXT17CisgICAgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMAorfTsKKworc3RhdGljIHVpbnQ4X3QgdHJpZUJsb2NrWzQwMDAwXTsKK3N0YXRpYyBpbnQzMl90IHRyaWVTaXplOworc3RhdGljIHVpbnQ4X3QgcHJvcHMyVHJpZUJsb2NrWzEwMDAwMF07CitzdGF0aWMgaW50MzJfdCBwcm9wczJUcmllU2l6ZTsKKworc3RhdGljIGludDMyX3QgdG90YWxTaXplOworCit2b2lkCitDb3JlUHJvcHNCdWlsZGVyOjpidWlsZChVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKworICAgIHV0cmllMl9mcmVlemUocFRyaWUsIFVUUklFMl8xNl9WQUxVRV9CSVRTLCAmZXJyb3JDb2RlKTsKKyAgICB0cmllU2l6ZT11dHJpZTJfc2VyaWFsaXplKHBUcmllLCB0cmllQmxvY2ssIHNpemVvZih0cmllQmxvY2spLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiZ2VucHJvcHMgZXJyb3I6IHV0cmllMl9mcmVlemUobWFpbiB0cmllKSt1dHJpZTJfc2VyaWFsaXplKCkgIgorICAgICAgICAgICAgICAgICJmYWlsZWQ6ICVzIChsZW5ndGggJWxkKVxuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpLCAobG9uZyl0cmllU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcm9wczJUcmllPXVwdmVjX2NvbXBhY3RUb1VUcmllMldpdGhSb3dJbmRleGVzKHB2LCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmFibGUgdG8gYnVpbGQgdHJpZSBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb3BzMlRyaWVTaXplPXV0cmllMl9zZXJpYWxpemUocHJvcHMyVHJpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzMlRyaWVCbG9jaywgKGludDMyX3Qpc2l6ZW9mKHByb3BzMlRyaWVCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiZ2VucHJvcHMgZXJyb3I6IHV0cmllMl9mcmVlemUoYWRkaXRpb25hbCBwcm9wZXJ0aWVzKSt1dHJpZTJfc2VyaWFsaXplKCkgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgcHZSb3dzOworICAgIGNvbnN0IHVpbnQzMl90ICpwdkFycmF5PXVwdmVjX2dldEFycmF5KHB2LCAmcHZSb3dzLCBOVUxMKTsKKyAgICBpbnQzMl90IHB2Q291bnQ9cHZSb3dzKlVQUk9QU19WRUNUT1JfV09SRFM7CisKKyAgICAvKiByb3VuZCB1cCBzY3JpcHRFeHRlbnNpb25zIHRvIG11bHRpcGxlIG9mIDQgYnl0ZXMgKi8KKyAgICBpZihzY3JpcHRFeHRlbnNpb25zLmxlbmd0aCgpJjEpIHsKKyAgICAgICAgc2NyaXB0RXh0ZW5zaW9ucy5hcHBlbmQoKFVDaGFyKTApOworICAgIH0KKworICAgIC8qIHNldCBpbmRleGVzICovCisgICAgaW50MzJfdCBvZmZzZXQ9c2l6ZW9mKGluZGV4ZXMpLzQ7ICAgICAgIC8qIHVpbnQzMl90IG9mZnNldCB0byB0aGUgcHJvcGVydGllcyB0cmllICovCisgICAgb2Zmc2V0Kz10cmllU2l6ZT4+MjsKKyAgICBpbmRleGVzW1VQUk9QU19QUk9QUzMyX0lOREVYXT0gICAgICAgICAgLyogc2V0IGluZGV4ZXMgdG8gdGhlIHNhbWUgb2Zmc2V0cyBmb3IgZW1wdHkgKi8KKyAgICBpbmRleGVzW1VQUk9QU19FWENFUFRJT05TX0lOREVYXT0gICAgICAgLyogc3RydWN0dXJlcyBmcm9tIHRoZSBvbGQgZm9ybWF0IHZlcnNpb24gMyAqLworICAgIGluZGV4ZXNbVVBST1BTX0VYQ0VQVElPTlNfVE9QX0lOREVYXT0gICAvKiBzbyB0aGF0IGxlc3MgcnVudGltZSBjb2RlIGhhcyB0byBiZSBjaGFuZ2VkICovCisgICAgaW5kZXhlc1tVUFJPUFNfQURESVRJT05BTF9UUklFX0lOREVYXT1vZmZzZXQ7CisKKyAgICBvZmZzZXQrPXByb3BzMlRyaWVTaXplLzQ7CisgICAgaW5kZXhlc1tVUFJPUFNfQURESVRJT05BTF9WRUNUT1JTX0lOREVYXT1vZmZzZXQ7CisgICAgaW5kZXhlc1tVUFJPUFNfQURESVRJT05BTF9WRUNUT1JTX0NPTFVNTlNfSU5ERVhdPVVQUk9QU19WRUNUT1JfV09SRFM7CisgICAgb2Zmc2V0Kz1wdkNvdW50OworICAgIGluZGV4ZXNbVVBST1BTX1NDUklQVF9FWFRFTlNJT05TX0lOREVYXT1vZmZzZXQ7CisgICAgb2Zmc2V0Kz1zY3JpcHRFeHRlbnNpb25zLmxlbmd0aCgpLzI7CisgICAgaW5kZXhlc1tVUFJPUFNfUkVTRVJWRURfSU5ERVhfN109b2Zmc2V0OworICAgIGluZGV4ZXNbVVBST1BTX1JFU0VSVkVEX0lOREVYXzhdPW9mZnNldDsKKyAgICBpbmRleGVzW1VQUk9QU19EQVRBX1RPUF9JTkRFWF09b2Zmc2V0OworICAgIHRvdGFsU2l6ZT00Km9mZnNldDsKKworICAgIGluZGV4ZXNbVVBST1BTX01BWF9WQUxVRVNfSU5ERVhdPQorICAgICAgICAoKChpbnQzMl90KVVfRUFfQ09VTlQtMSk8PFVQUk9QU19FQV9TSElGVCl8CisgICAgICAgICgoKGludDMyX3QpVUJMT0NLX0NPVU5ULTEpPDxVUFJPUFNfQkxPQ0tfU0hJRlQpfAorICAgICAgICAoKChpbnQzMl90KVVTQ1JJUFRfQ09ERV9MSU1JVC0xKSZVUFJPUFNfU0NSSVBUX01BU0spOworICAgIGluZGV4ZXNbVVBST1BTX01BWF9WQUxVRVNfMl9JTkRFWF09CisgICAgICAgICgoKGludDMyX3QpVV9MQl9DT1VOVC0xKTw8VVBST1BTX0xCX1NISUZUKXwKKyAgICAgICAgKCgoaW50MzJfdClVX1NCX0NPVU5ULTEpPDxVUFJPUFNfU0JfU0hJRlQpfAorICAgICAgICAoKChpbnQzMl90KVVfV0JfQ09VTlQtMSk8PFVQUk9QU19XQl9TSElGVCl8CisgICAgICAgICgoKGludDMyX3QpVV9HQ0JfQ09VTlQtMSk8PFVQUk9QU19HQ0JfU0hJRlQpfAorICAgICAgICAoKGludDMyX3QpVV9EVF9DT1VOVC0xKTsKKworICAgIGlmKCFiZVF1aWV0KSB7CisgICAgICAgIHB1dHMoIiogdXByb3BzLmljdSBzdGF0cyAqIik7CisgICAgICAgIHByaW50ZigidHJpZSBzaXplIGluIGJ5dGVzOiAgICAgICAgICAgICAgICAgICAgJTV1XG4iLCAoaW50KXRyaWVTaXplKTsKKyAgICAgICAgcHJpbnRmKCJzaXplIGluIGJ5dGVzIG9mIGFkZGl0aW9uYWwgcHJvcHMgdHJpZTolNXVcbiIsIChpbnQpcHJvcHMyVHJpZVNpemUpOworICAgICAgICBwcmludGYoIm51bWJlciBvZiBhZGRpdGlvbmFsIHByb3BzIHZlY3RvcnM6ICAgICU1dVxuIiwgKGludClwdlJvd3MpOworICAgICAgICBwcmludGYoIm51bWJlciBvZiAzMi1iaXQgd29yZHMgcGVyIHZlY3RvcjogICAgICU1dVxuIiwgVVBST1BTX1ZFQ1RPUl9XT1JEUyk7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIDE2LWJpdCBzY3JpcHRFeHRlbnNpb25zOiAgICAgJTV1XG4iLCAoaW50KXNjcmlwdEV4dGVuc2lvbnMubGVuZ3RoKCkpOworICAgICAgICBwcmludGYoImRhdGEgc2l6ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJTZsZFxuIiwgKGxvbmcpdG90YWxTaXplKTsKKyAgICB9Cit9CisKK3ZvaWQKK0NvcmVQcm9wc0J1aWxkZXI6OndyaXRlQ1NvdXJjZUZpbGUoY29uc3QgY2hhciAqcGF0aCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICBpbnQzMl90IHB2Um93czsKKyAgICBjb25zdCB1aW50MzJfdCAqcHZBcnJheT11cHZlY19nZXRBcnJheShwdiwgJnB2Um93cywgTlVMTCk7CisgICAgaW50MzJfdCBwdkNvdW50PXB2Um93cypVUFJPUFNfVkVDVE9SX1dPUkRTOworCisgICAgRklMRSAqZj11c3JjX2NyZWF0ZShwYXRoLCAidWNoYXJfcHJvcHNfZGF0YS5oIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpY3UvdG9vbHMvdW5pY29kZS9jL2dlbnByb3BzL2NvcmVwcm9wc2J1aWxkZXIuY3BwIik7CisgICAgaWYoZj09TlVMTCkgeworICAgICAgICBlcnJvckNvZGU9VV9GSUxFX0FDQ0VTU19FUlJPUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcHV0cygiI2lmbmRlZiBJTkNMVURFRF9GUk9NX1VDSEFSX0NcbiIKKyAgICAgICAgICAiIyAgIGVycm9yIFRoaXMgZmlsZSBtdXN0IGJlICNpbmNsdWRlZCBmcm9tIHVjaGFyLmMgb25seS5cbiIKKyAgICAgICAgICAiI2VuZGlmXG5cbiIsIGYpOworICAgIHVzcmNfd3JpdGVBcnJheShmLAorICAgICAgICAic3RhdGljIGNvbnN0IFVWZXJzaW9uSW5mbyBkYXRhVmVyc2lvbj17IiwKKyAgICAgICAgZGF0YUluZm8uZGF0YVZlcnNpb24sIDgsIDQsCisgICAgICAgICJ9O1xuXG4iKTsKKyAgICB1c3JjX3dyaXRlVVRyaWUyQXJyYXlzKGYsCisgICAgICAgICJzdGF0aWMgY29uc3QgdWludDE2X3QgcHJvcHNUcmllX2luZGV4WyVsZF09e1xuIiwgTlVMTCwKKyAgICAgICAgcFRyaWUsCisgICAgICAgICJcbn07XG5cbiIpOworICAgIHVzcmNfd3JpdGVVVHJpZTJTdHJ1Y3QoZiwKKyAgICAgICAgInN0YXRpYyBjb25zdCBVVHJpZTIgcHJvcHNUcmllPXtcbiIsCisgICAgICAgIHBUcmllLCAicHJvcHNUcmllX2luZGV4IiwgTlVMTCwKKyAgICAgICAgIn07XG5cbiIpOworCisgICAgdXNyY193cml0ZVVUcmllMkFycmF5cyhmLAorICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQxNl90IHByb3BzVmVjdG9yc1RyaWVfaW5kZXhbJWxkXT17XG4iLCBOVUxMLAorICAgICAgICBwcm9wczJUcmllLAorICAgICAgICAiXG59O1xuXG4iKTsKKyAgICB1c3JjX3dyaXRlVVRyaWUyU3RydWN0KGYsCisgICAgICAgICJzdGF0aWMgY29uc3QgVVRyaWUyIHByb3BzVmVjdG9yc1RyaWU9e1xuIiwKKyAgICAgICAgcHJvcHMyVHJpZSwgInByb3BzVmVjdG9yc1RyaWVfaW5kZXgiLCBOVUxMLAorICAgICAgICAifTtcblxuIik7CisKKyAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgInN0YXRpYyBjb25zdCB1aW50MzJfdCBwcm9wc1ZlY3RvcnNbJWxkXT17XG4iLAorICAgICAgICBwdkFycmF5LCAzMiwgcHZDb3VudCwKKyAgICAgICAgIn07XG5cbiIpOworICAgIGZwcmludGYoZiwgInN0YXRpYyBjb25zdCBpbnQzMl90IGNvdW50UHJvcHNWZWN0b3JzPSVsZDtcbiIsIChsb25nKXB2Q291bnQpOworICAgIGZwcmludGYoZiwgInN0YXRpYyBjb25zdCBpbnQzMl90IHByb3BzVmVjdG9yc0NvbHVtbnM9JWxkO1xuIiwgKGxvbmcpVVBST1BTX1ZFQ1RPUl9XT1JEUyk7CisKKyAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgInN0YXRpYyBjb25zdCB1aW50MTZfdCBzY3JpcHRFeHRlbnNpb25zWyVsZF09e1xuIiwKKyAgICAgICAgc2NyaXB0RXh0ZW5zaW9ucy5nZXRCdWZmZXIoKSwgMTYsIHNjcmlwdEV4dGVuc2lvbnMubGVuZ3RoKCksCisgICAgICAgICJ9O1xuXG4iKTsKKworICAgIHVzcmNfd3JpdGVBcnJheShmLAorICAgICAgICAic3RhdGljIGNvbnN0IGludDMyX3QgaW5kZXhlc1tVUFJPUFNfSU5ERVhfQ09VTlRdPXsiLAorICAgICAgICBpbmRleGVzLCAzMiwgVVBST1BTX0lOREVYX0NPVU5ULAorICAgICAgICAifTtcblxuIik7CisgICAgZmNsb3NlKGYpOworfQorCit2b2lkCitDb3JlUHJvcHNCdWlsZGVyOjp3cml0ZUJpbmFyeURhdGEoY29uc3QgY2hhciAqcGF0aCwgVUJvb2wgd2l0aENvcHlyaWdodCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICBpbnQzMl90IHB2Um93czsKKyAgICBjb25zdCB1aW50MzJfdCAqcHZBcnJheT11cHZlY19nZXRBcnJheShwdiwgJnB2Um93cywgTlVMTCk7CisgICAgaW50MzJfdCBwdkNvdW50PXB2Um93cypVUFJPUFNfVkVDVE9SX1dPUkRTOworCisgICAgVU5ld0RhdGFNZW1vcnkgKnBEYXRhPXVkYXRhX2NyZWF0ZShwYXRoLCAiaWN1IiwgInVwcm9wcyIsICZkYXRhSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDb3B5cmlnaHQgPyBVX0NPUFlSSUdIVF9TVFJJTkcgOiBOVUxMLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiB1ZGF0YV9jcmVhdGUoJXMsIHVwcm9wcy5pY3UpIGZhaWxlZCAtICVzXG4iLAorICAgICAgICAgICAgICAgIHBhdGgsIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgaW5kZXhlcywgc2l6ZW9mKGluZGV4ZXMpKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCB0cmllQmxvY2ssIHRyaWVTaXplKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBwcm9wczJUcmllQmxvY2ssIHByb3BzMlRyaWVTaXplKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBwdkFycmF5LCBwdkNvdW50KjQpOworICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIHNjcmlwdEV4dGVuc2lvbnMuZ2V0QnVmZmVyKCksIHNjcmlwdEV4dGVuc2lvbnMubGVuZ3RoKCkqMik7CisKKyAgICBsb25nIGRhdGFMZW5ndGg9dWRhdGFfZmluaXNoKHBEYXRhLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiBlcnJvciAlcyB3cml0aW5nIHRoZSBvdXRwdXQgZmlsZVxuIiwgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihkYXRhTGVuZ3RoIT0obG9uZyl0b3RhbFNpemUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVkYXRhX2ZpbmlzaCh1cHJvcHMuaWN1KSByZXBvcnRzICVsZCBieXRlcyB3cml0dGVuIGJ1dCBzaG91bGQgYmUgJWxkXG4iLAorICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgsIChsb25nKXRvdGFsU2l6ZSk7CisgICAgICAgIGVycm9yQ29kZT1VX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgfQorfQorCitQcm9wc0J1aWxkZXIgKgorY3JlYXRlQ29yZVByb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm4gTlVMTDsgfQorICAgIFByb3BzQnVpbGRlciAqcGI9bmV3IENvcmVQcm9wc0J1aWxkZXIoZXJyb3JDb2RlKTsKKyAgICBpZihwYj09TlVMTCkgeworICAgICAgICBlcnJvckNvZGU9VV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHBiOworfQorCisvKgorICogSGV5LCBFbWFjcywgcGxlYXNlIHNldCB0aGUgZm9sbG93aW5nOgorICoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLmNwcCBiL3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlODQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcy5jcHAKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW5wcm9wcy5jcHAKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAxOTk5ZGVjMDgKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFRoaXMgcHJvZ3JhbSBwYXJzZXMgdGhlIHBwdWNkLnR4dCBwcmVwYXJzZWQgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UgZmlsZQorKiAgIGFuZCB3cml0ZXMgc2V2ZXJhbCBzb3VyY2UgYW5kIGJpbmFyeSBmaWxlcyBpbnRvIHRoZSBJQ1Ugc291cmNlIHRyZWUuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvbG9jYWxwb2ludGVyLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgorI2luY2x1ZGUgImNoYXJzdHIuaCIKKyNpbmNsdWRlICJnZW5wcm9wcy5oIgorI2luY2x1ZGUgInBwdWNkLmgiCisjaW5jbHVkZSAidG9vbHV0aWwuaCIKKyNpbmNsdWRlICJ1b3B0aW9ucy5oIgorCitVX05BTUVTUEFDRV9VU0UKKworVUJvb2wgYmVWZXJib3NlPUZBTFNFOworVUJvb2wgYmVRdWlldD1GQUxTRTsKKworUHJvcHNCdWlsZGVyOjpQcm9wc0J1aWxkZXIoKSB7fQorUHJvcHNCdWlsZGVyOjp+UHJvcHNCdWlsZGVyKCkge30KK3ZvaWQgUHJvcHNCdWlsZGVyOjpzZXRVbmljb2RlVmVyc2lvbihjb25zdCBVVmVyc2lvbkluZm8pIHt9Cit2b2lkIFByb3BzQnVpbGRlcjo6c2V0QWxnTmFtZXNSYW5nZShVQ2hhcjMyLCBVQ2hhcjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFVFcnJvckNvZGUgJikge30KK3ZvaWQgUHJvcHNCdWlsZGVyOjpzZXRQcm9wcyhjb25zdCBVbmlQcm9wcyAmLCBjb25zdCBVbmljb2RlU2V0ICYsIFVFcnJvckNvZGUgJikge30KK3ZvaWQgUHJvcHNCdWlsZGVyOjpidWlsZChVRXJyb3JDb2RlICYpIHt9Cit2b2lkIFByb3BzQnVpbGRlcjo6d3JpdGVDU291cmNlRmlsZShjb25zdCBjaGFyICosIFVFcnJvckNvZGUgJikge30KK3ZvaWQgUHJvcHNCdWlsZGVyOjp3cml0ZUJpbmFyeURhdGEoY29uc3QgY2hhciAqLCBVQm9vbCwgVUVycm9yQ29kZSAmKSB7fQorCitlbnVtIHsKKyAgICBIRUxQX0gsCisgICAgSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFZFUkJPU0UsCisgICAgUVVJRVQsCisgICAgQ09QWVJJR0hUCit9OworCisvKiBLZWVwIHRoZXNlIHZhbHVlcyBpbiBzeW5jIHdpdGggdGhlIGFib3ZlIGVudW1zICovCitzdGF0aWMgVU9wdGlvbiBvcHRpb25zW109eworICAgIFVPUFRJT05fSEVMUF9ILAorICAgIFVPUFRJT05fSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFVPUFRJT05fVkVSQk9TRSwKKyAgICBVT1BUSU9OX1FVSUVULAorICAgIFVPUFRJT05fQ09QWVJJR0hUCit9OworCitleHRlcm4gaW50CittYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBVX01BSU5fSU5JVF9BUkdTKGFyZ2MsIGFyZ3YpOworICAgIGFyZ2M9dV9wYXJzZUFyZ3MoYXJnYywgYXJndiwgTEVOR1RIT0Yob3B0aW9ucyksIG9wdGlvbnMpOworCisgICAgLyogZXJyb3IgaGFuZGxpbmcsIHByaW50aW5nIHVzYWdlIG1lc3NhZ2UgKi8KKyAgICBpZihhcmdjPDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiZXJyb3IgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50IFwiJXNcIlxuIiwKKyAgICAgICAgICAgIGFyZ3ZbLWFyZ2NdKTsKKyAgICB9CisgICAgaWYoYXJnYzwyIHx8IG9wdGlvbnNbSEVMUF9IXS5kb2VzT2NjdXIgfHwgb3B0aW9uc1tIRUxQX1FVRVNUSU9OX01BUktdLmRvZXNPY2N1cikgeworICAgICAgICAvKgorICAgICAgICAgKiBCcm9rZW4gaW50byBjaHVua3MgYmVjYXVzZSB0aGUgQzg5IHN0YW5kYXJkIHNheXMgdGhlIG1pbmltdW0KKyAgICAgICAgICogcmVxdWlyZWQgc3VwcG9ydGVkIHN0cmluZyBsZW5ndGggaXMgNTA5IGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVXNhZ2U6ICVzIFstb3B0aW9uc10gcGF0aC90by9JQ1Uvc3JjL3Jvb3RcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJSZWFkcyB0aGUgcHJlcGFyc2VkIFVDRCBmaWxlIHBhdGgvdG8vSUNVL3NyYy9yb290L3NvdXJjZS9kYXRhL3VuaWRhdGEvcHB1Y2QudHh0IGFuZFxuIgorICAgICAgICAgICAgIndyaXRlcyBzb3VyY2UgYW5kIGJpbmFyeSBkYXRhIGZpbGVzIHdpdGggdGhlIGNoYXJhY3RlciBwcm9wZXJ0aWVzLlxuIgorICAgICAgICAgICAgIihVQ0Q9VW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UpXG4iCisgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgYXJndlswXSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAgICAiXHQtaCBvciAtPyBvciAtLWhlbHAgIHRoaXMgdXNhZ2UgdGV4dFxuIgorICAgICAgICAgICAgIlx0LXYgb3IgLS12ZXJib3NlICAgICB2ZXJib3NlIG91dHB1dFxuIgorICAgICAgICAgICAgIlx0LXEgb3IgLS1xdWlldCAgICAgICBubyBvdXRwdXRcbiIKKyAgICAgICAgICAgICJcdC1jIG9yIC0tY29weXJpZ2h0ICAgaW5jbHVkZSBhIGNvcHlyaWdodCBub3RpY2VcbiIpOworICAgICAgICByZXR1cm4gYXJnYzwyID8gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIDogVV9aRVJPX0VSUk9SOworICAgIH0KKworICAgIC8qIGdldCB0aGUgb3B0aW9ucyB2YWx1ZXMgKi8KKyAgICBiZVZlcmJvc2U9b3B0aW9uc1tWRVJCT1NFXS5kb2VzT2NjdXI7CisgICAgYmVRdWlldD1vcHRpb25zW1FVSUVUXS5kb2VzT2NjdXI7CisKKyAgICAvKiBpbml0aWFsaXplICovCisgICAgSWN1VG9vbEVycm9yQ29kZSBlcnJvckNvZGUoImdlbnByb3BzIik7CisgICAgTG9jYWxQb2ludGVyPFBOYW1lc0J1aWxkZXI+IHBuYW1lc0J1aWxkZXIoY3JlYXRlUE5hbWVzQnVpbGRlcihlcnJvckNvZGUpKTsKKyAgICBMb2NhbFBvaW50ZXI8UHJvcHNCdWlsZGVyPiBjb3JlUHJvcHNCdWlsZGVyKGNyZWF0ZUNvcmVQcm9wc0J1aWxkZXIoZXJyb3JDb2RlKSk7CisgICAgTG9jYWxQb2ludGVyPFByb3BzQnVpbGRlcj4gYmlkaVByb3BzQnVpbGRlcihjcmVhdGVCaURpUHJvcHNCdWlsZGVyKGVycm9yQ29kZSkpOworICAgIExvY2FsUG9pbnRlcjxQcm9wc0J1aWxkZXI+IGNhc2VQcm9wc0J1aWxkZXIoY3JlYXRlQ2FzZVByb3BzQnVpbGRlcihlcnJvckNvZGUpKTsKKyAgICBMb2NhbFBvaW50ZXI8UHJvcHNCdWlsZGVyPiBuYW1lc1Byb3BzQnVpbGRlcihjcmVhdGVOYW1lc1Byb3BzQnVpbGRlcihlcnJvckNvZGUpKTsKKyAgICBpZihlcnJvckNvZGUuaXNGYWlsdXJlKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogdW5hYmxlIHRvIGNyZWF0ZSBQcm9wc0J1aWxkZXJzIC0gJXNcbiIsIGVycm9yQ29kZS5lcnJvck5hbWUoKSk7CisgICAgICAgIHJldHVybiBlcnJvckNvZGUucmVzZXQoKTsKKyAgICB9CisKKyAgICBDaGFyU3RyaW5nIGljdVNyY1Jvb3QoYXJndlsxXSwgZXJyb3JDb2RlKTsKKworICAgIENoYXJTdHJpbmcgaWN1U291cmNlKGljdVNyY1Jvb3QsIGVycm9yQ29kZSk7CisgICAgaWN1U291cmNlLmFwcGVuZFBhdGhQYXJ0KCJzb3VyY2UiLCBlcnJvckNvZGUpOworCisgICAgQ2hhclN0cmluZyBpY3VTb3VyY2VEYXRhKGljdVNvdXJjZSwgZXJyb3JDb2RlKTsKKyAgICBpY3VTb3VyY2VEYXRhLmFwcGVuZFBhdGhQYXJ0KCJkYXRhIiwgZXJyb3JDb2RlKTsKKworICAgIENoYXJTdHJpbmcgcHB1Y2RQYXRoKGljdVNvdXJjZURhdGEsIGVycm9yQ29kZSk7CisgICAgcHB1Y2RQYXRoLmFwcGVuZFBhdGhQYXJ0KCJ1bmlkYXRhIiwgZXJyb3JDb2RlKTsKKyAgICBwcHVjZFBhdGguYXBwZW5kUGF0aFBhcnQoInBwdWNkLnR4dCIsIGVycm9yQ29kZSk7CisKKyAgICBQcmVwYXJzZWRVQ0QgcHB1Y2QocHB1Y2RQYXRoLmRhdGEoKSwgZXJyb3JDb2RlKTsKKyAgICBpZihlcnJvckNvZGUuaXNGYWlsdXJlKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogdW5hYmxlIHRvIG9wZW4gJXMgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICBwcHVjZFBhdGguZGF0YSgpLCBlcnJvckNvZGUuZXJyb3JOYW1lKCkpOworICAgICAgICByZXR1cm4gZXJyb3JDb2RlLnJlc2V0KCk7CisgICAgfQorCisgICAgLy8gVGhlIFBOYW1lc0J1aWxkZXIgdXNlcyBwcmVwYXJzZWQgcG5hbWVzX2RhdGEuaC4KKyAgICBwbmFtZXNCdWlsZGVyLT5idWlsZChlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IFBOYW1lc0J1aWxkZXI6OmJ1aWxkKCkgZmFpbGVkIC0gJXNcbiIsCisgICAgICAgICAgICAgICAgZXJyb3JDb2RlLmVycm9yTmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIGVycm9yQ29kZS5yZXNldCgpOworICAgIH0KKyAgICBwcHVjZC5zZXRQcm9wZXJ0eU5hbWVzKHBuYW1lc0J1aWxkZXItPmdldFByb3BlcnR5TmFtZXMoKSk7CisKKyAgICBQcmVwYXJzZWRVQ0Q6OkxpbmVUeXBlIGxpbmVUeXBlOworICAgIFVuaWNvZGVTZXQgbmV3VmFsdWVzOworICAgIHdoaWxlKChsaW5lVHlwZT1wcHVjZC5yZWFkTGluZShlcnJvckNvZGUpKSE9UHJlcGFyc2VkVUNEOjpOT19MSU5FKSB7CisgICAgICAgIGlmKHBwdWNkLmxpbmVIYXNQcm9wZXJ0eVZhbHVlcygpKSB7CisgICAgICAgICAgICBjb25zdCBVbmlQcm9wcyAqcHJvcHM9cHB1Y2QuZ2V0UHJvcHMobmV3VmFsdWVzLCBlcnJvckNvZGUpOworICAgICAgICAgICAgY29yZVByb3BzQnVpbGRlci0+c2V0UHJvcHMoKnByb3BzLCBuZXdWYWx1ZXMsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBiaWRpUHJvcHNCdWlsZGVyLT5zZXRQcm9wcygqcHJvcHMsIG5ld1ZhbHVlcywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGNhc2VQcm9wc0J1aWxkZXItPnNldFByb3BzKCpwcm9wcywgbmV3VmFsdWVzLCBlcnJvckNvZGUpOworICAgICAgICAgICAgbmFtZXNQcm9wc0J1aWxkZXItPnNldFByb3BzKCpwcm9wcywgbmV3VmFsdWVzLCBlcnJvckNvZGUpOworICAgICAgICB9IGVsc2UgaWYobGluZVR5cGU9PVByZXBhcnNlZFVDRDo6VU5JQ09ERV9WRVJTSU9OX0xJTkUpIHsKKyAgICAgICAgICAgIGNvbnN0IFVWZXJzaW9uSW5mbyAmdmVyc2lvbj1wcHVjZC5nZXRVbmljb2RlVmVyc2lvbigpOworICAgICAgICAgICAgY29yZVByb3BzQnVpbGRlci0+c2V0VW5pY29kZVZlcnNpb24odmVyc2lvbik7CisgICAgICAgICAgICBiaWRpUHJvcHNCdWlsZGVyLT5zZXRVbmljb2RlVmVyc2lvbih2ZXJzaW9uKTsKKyAgICAgICAgICAgIGNhc2VQcm9wc0J1aWxkZXItPnNldFVuaWNvZGVWZXJzaW9uKHZlcnNpb24pOworICAgICAgICAgICAgbmFtZXNQcm9wc0J1aWxkZXItPnNldFVuaWNvZGVWZXJzaW9uKHZlcnNpb24pOworICAgICAgICB9IGVsc2UgaWYobGluZVR5cGU9PVByZXBhcnNlZFVDRDo6QUxHX05BTUVTX1JBTkdFX0xJTkUpIHsKKyAgICAgICAgICAgIFVDaGFyMzIgc3RhcnQsIGVuZDsKKyAgICAgICAgICAgIGlmKHBwdWNkLmdldFJhbmdlRm9yQWxnTmFtZXMoc3RhcnQsIGVuZCwgZXJyb3JDb2RlKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGU9cHB1Y2QubmV4dEZpZWxkKCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJlZml4PXBwdWNkLm5leHRGaWVsZCgpOyAgLy8gTlVMTCBpZiB0eXBlPT1oYW5ndWwKKyAgICAgICAgICAgICAgICBuYW1lc1Byb3BzQnVpbGRlci0+c2V0QWxnTmFtZXNSYW5nZShzdGFydCwgZW5kLCB0eXBlLCBwcmVmaXgsIGVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoZXJyb3JDb2RlLmlzRmFpbHVyZSgpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgImdlbnByb3BzOiBlcnJvciBwYXJzaW5nIG9yIHNldHRpbmcgdmFsdWVzIGZyb20gcHB1Y2QudHh0IGxpbmUgJWxkIC0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nKXBwdWNkLmdldExpbmVOdW1iZXIoKSwgZXJyb3JDb2RlLmVycm9yTmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJvckNvZGUucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvcmVQcm9wc0J1aWxkZXItPmJ1aWxkKGVycm9yQ29kZSk7CisgICAgYmlkaVByb3BzQnVpbGRlci0+YnVpbGQoZXJyb3JDb2RlKTsKKyAgICBjYXNlUHJvcHNCdWlsZGVyLT5idWlsZChlcnJvckNvZGUpOworICAgIG5hbWVzUHJvcHNCdWlsZGVyLT5idWlsZChlcnJvckNvZGUpOworICAgIGlmKGVycm9yQ29kZS5pc0ZhaWx1cmUoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiBmYWlsdXJlIGZpbmFsaXppbmcgdGhlIGRhdGEgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUuZXJyb3JOYW1lKCkpOworICAgICAgICByZXR1cm4gZXJyb3JDb2RlLnJlc2V0KCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIGZpbGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkYXRhLgorICAgIENoYXJTdHJpbmcgc291cmNlQ29tbW9uKGljdVNvdXJjZSwgZXJyb3JDb2RlKTsKKyAgICBzb3VyY2VDb21tb24uYXBwZW5kUGF0aFBhcnQoImNvbW1vbiIsIGVycm9yQ29kZSk7CisKKyAgICBDaGFyU3RyaW5nIHNvdXJjZURhdGFJbihpY3VTb3VyY2VEYXRhLCBlcnJvckNvZGUpOworICAgIHNvdXJjZURhdGFJbi5hcHBlbmRQYXRoUGFydCgiaW4iLCBlcnJvckNvZGUpOworCisgICAgVUJvb2wgd2l0aENvcHlyaWdodD1vcHRpb25zW0NPUFlSSUdIVF0uZG9lc09jY3VyOworCisgICAgcG5hbWVzQnVpbGRlci0+d3JpdGVDU291cmNlRmlsZShzb3VyY2VDb21tb24uZGF0YSgpLCBlcnJvckNvZGUpOworICAgIHBuYW1lc0J1aWxkZXItPndyaXRlQmluYXJ5RGF0YShzb3VyY2VEYXRhSW4uZGF0YSgpLCB3aXRoQ29weXJpZ2h0LCBlcnJvckNvZGUpOworICAgIGNvcmVQcm9wc0J1aWxkZXItPndyaXRlQ1NvdXJjZUZpbGUoc291cmNlQ29tbW9uLmRhdGEoKSwgZXJyb3JDb2RlKTsKKyAgICBjb3JlUHJvcHNCdWlsZGVyLT53cml0ZUJpbmFyeURhdGEoc291cmNlRGF0YUluLmRhdGEoKSwgd2l0aENvcHlyaWdodCwgZXJyb3JDb2RlKTsKKyAgICBiaWRpUHJvcHNCdWlsZGVyLT53cml0ZUNTb3VyY2VGaWxlKHNvdXJjZUNvbW1vbi5kYXRhKCksIGVycm9yQ29kZSk7CisgICAgYmlkaVByb3BzQnVpbGRlci0+d3JpdGVCaW5hcnlEYXRhKHNvdXJjZURhdGFJbi5kYXRhKCksIHdpdGhDb3B5cmlnaHQsIGVycm9yQ29kZSk7CisgICAgY2FzZVByb3BzQnVpbGRlci0+d3JpdGVDU291cmNlRmlsZShzb3VyY2VDb21tb24uZGF0YSgpLCBlcnJvckNvZGUpOworICAgIGNhc2VQcm9wc0J1aWxkZXItPndyaXRlQmluYXJ5RGF0YShzb3VyY2VEYXRhSW4uZGF0YSgpLCB3aXRoQ29weXJpZ2h0LCBlcnJvckNvZGUpOworICAgIG5hbWVzUHJvcHNCdWlsZGVyLT53cml0ZUJpbmFyeURhdGEoc291cmNlRGF0YUluLmRhdGEoKSwgd2l0aENvcHlyaWdodCwgZXJyb3JDb2RlKTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CisKKy8qCisgKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CisgKgorICogTG9jYWwgVmFyaWFibGVzOgorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvZ2VucHJvcHMuaCBiL3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZWYwYzgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvZ2VucHJvcHMuaApAQCAtMCwwICsxLDU2IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMTk5OS0yMDEyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgZmlsZSBuYW1lOiAgZ2VucHJvcHMuaAorKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisqICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246NAorKgorKiAgIGNyZWF0ZWQgb246IDE5OTlkZWMxMworKiAgIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisqLworCisjaWZuZGVmIF9fR0VOUFJPUFNfSF9fCisjZGVmaW5lIF9fR0VOUFJPUFNfSF9fCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJwcHVjZC5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisKKyNkZWZpbmUgTEVOR1RIT0YoYXJyYXkpIChpbnQzMl90KShzaXplb2YoYXJyYXkpL3NpemVvZigoYXJyYXkpWzBdKSkKKworY2xhc3MgUHJvcHNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICBQcm9wc0J1aWxkZXIoKTsKKyAgICB2aXJ0dWFsIH5Qcm9wc0J1aWxkZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VW5pY29kZVZlcnNpb24oY29uc3QgVVZlcnNpb25JbmZvIHZlcnNpb24pOworICAgIHZpcnR1YWwgdm9pZCBzZXRBbGdOYW1lc1JhbmdlKFVDaGFyMzIgc3RhcnQsIFVDaGFyMzIgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnByZWZpeCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJvcHMoY29uc3QgaWN1OjpVbmlQcm9wcyAmcHJvcHMsIGNvbnN0IGljdTo6VW5pY29kZVNldCAmbmV3VmFsdWVzLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpOworICAgIHZpcnR1YWwgdm9pZCBidWlsZChVRXJyb3JDb2RlICZlcnJvckNvZGUpOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZUNTb3VyY2VGaWxlKGNvbnN0IGNoYXIgKnBhdGgsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdmlydHVhbCB2b2lkIHdyaXRlQmluYXJ5RGF0YShjb25zdCBjaGFyICpwYXRoLCBVQm9vbCB3aXRoQ29weXJpZ2h0LCBVRXJyb3JDb2RlICZlcnJvckNvZGUpOworfTsKKworY2xhc3MgUE5hbWVzQnVpbGRlciA6IHB1YmxpYyBQcm9wc0J1aWxkZXIgeworcHVibGljOgorICAgIHZpcnR1YWwgY29uc3QgUHJvcGVydHlOYW1lcyAqZ2V0UHJvcGVydHlOYW1lcygpID0gMDsKK307CisKK1BOYW1lc0J1aWxkZXIgKmNyZWF0ZVBOYW1lc0J1aWxkZXIoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKK1Byb3BzQnVpbGRlciAqY3JlYXRlQ29yZVByb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpOworUHJvcHNCdWlsZGVyICpjcmVhdGVCaURpUHJvcHNCdWlsZGVyKFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CitQcm9wc0J1aWxkZXIgKmNyZWF0ZUNhc2VQcm9wc0J1aWxkZXIoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKK1Byb3BzQnVpbGRlciAqY3JlYXRlTmFtZXNQcm9wc0J1aWxkZXIoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKworLyogZ2xvYmFsIGZsYWdzICovCitleHRlcm4gVUJvb2wgYmVWZXJib3NlOworZXh0ZXJuIFVCb29sIGJlUXVpZXQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLnZjcHJvaiBiL3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxYWJmMwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcy52Y3Byb2oKQEAgLTAsMCArMSw0MjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LjAwIgorCU5hbWU9ImdlbnByb3BzIgorCVByb2plY3RHVUlEPSJ7NkY3NDQ2NDgtRDE1Ri00NzhBLTkwQzYtNThFMzUzQjVEREIzfSIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0ieDY0IgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XFJlbGVhc2UvZ2VucHJvcHMudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnByb3BzLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDg2XFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDg2XFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg4NlxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4ODZcUmVsZWFzZS9nZW5wcm9wcy5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnByb3BzLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4NlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XERlYnVnL2dlbnByb3BzLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxEZWJ1Zy9nZW5wcm9wcy5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg4NlxEZWJ1Zy8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg4NlxEZWJ1Zy8iCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4ODZcRGVidWcvZ2VucHJvcHMuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDg2XERlYnVnL2dlbnByb3BzLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCQlVc2VGQVQzMldvcmthcm91bmQ9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg2NFxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg2NFxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluNjQmI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluNjRcJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDY0XFJlbGVhc2UvZ2VucHJvcHMudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjY0O1dJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbnByb3BzLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDY0XFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg2NFxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4NjRcUmVsZWFzZS9nZW5wcm9wcy5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbnByb3BzLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg2NFxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4NjRcRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcRGVidWcvZ2VucHJvcHMudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU42NDtXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XERlYnVnL2dlbnByb3BzLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDY0XERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXHg2NFxEZWJ1Zy8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDY0XERlYnVnLyIKKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg2NFxEZWJ1Zy9nZW5wcm9wcy5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4NjRcRGVidWcvZ2VucHJvcHMucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkJVXNlRkFUMzJXb3JrYXJvdW5kPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjO2NwcDtyYyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdlbnByb3BzLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccHJvcHMyLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3RvcmUuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCisJCQlGaWx0ZXI9ImgiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnZW5wcm9wcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisJCQk+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkY29weS5weSBiL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZGNvcHkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjA3ZjU0MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZGNvcHkucHkKQEAgLTAsMCArMSwxODIgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMi40CisjIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgICBmaWxlIG5hbWU6ICB1Y2Rjb3B5LnB5CisjICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyMgICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyMgICBpbmRlbnRhdGlvbjo0CisjCisjICAgY3JlYXRlZCBvbjogMjAwOWF1ZzA0CisjICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyMKKyMgQ29weSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSAodWNkKSBmaWxlcyBmcm9tIGEgdHJlZQorIyBvZiBmaWxlcyBkb3dubG9hZGVkIGZyb20gZnRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy81LjIuMC8KKyMgdG8gYSBmb2xkZXIgbGlrZSBJQ1UncyBzb3VyY2UvZGF0YS91bmlkYXRhLworIyBhbmQgbW9kaWZ5IHNvbWUgb2YgdGhlIGZpbGVzIHRvIG1ha2UgdGhlbSBtb3JlIGNvbXBhY3QuCisjCisjIEludm9rZSB3aXRoIHR3byBjb21tYW5kLWxpbmUgcGFyYW1ldGVycywgZm9yIHRoZSBzb3VyY2UKKyMgYW5kIGRlc3RpbmF0aW9uIGZvbGRlcnMuCisKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCByZQoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworCitfc3RyaXBfcmUgPSByZS5jb21waWxlKCJeKFswLTlhLWZBLUZdKy4rPykgKiMuKiIpCitfY29kZV9wb2ludF9yZSA9IHJlLmNvbXBpbGUoIlxzKihbMC05YS1mQS1GXSspXHMqOyIpCisKK2RlZiBDb3B5QW5kU3RyaXBXaXRoT3B0aW9uYWxNZXJnZShzLCB0LCBkb19tZXJnZSk6CisgIGluX2ZpbGUgPSBvcGVuKHMsICJyIikKKyAgb3V0X2ZpbGUgPSBvcGVuKHQsICJ3IikKKyAgZmlyc3QgPSAtMSAgIyBGaXJzdCBjb2RlIHBvaW50IHdpdGggZmlyc3RfZGF0YS4KKyAgbGFzdCA9IC0xICAjIExhc3QgY29kZSBwb2ludCB3aXRoIGZpcnN0X2RhdGEuCisgIGZpcnN0X2RhdGEgPSAiIiAgIyBDb21tb24gZGF0YSBmb3IgY29kZSBwb2ludHMgW2ZpcnN0Li5sYXN0XS4KKyAgZm9yIGxpbmUgaW4gaW5fZmlsZToKKyAgICBtYXRjaCA9IF9zdHJpcF9yZS5tYXRjaChsaW5lKQorICAgIGlmIG1hdGNoOgorICAgICAgbGluZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgZWxzZToKKyAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgICAgaWYgZG9fbWVyZ2U6CisgICAgICBtYXRjaCA9IF9jb2RlX3BvaW50X3JlLm1hdGNoKGxpbmUpCisgICAgICBpZiBtYXRjaDoKKyAgICAgICAgYyA9IGludChtYXRjaC5ncm91cCgxKSwgMTYpCisgICAgICAgIGRhdGEgPSBsaW5lW21hdGNoLmVuZCgpIC0gMTpdCisgICAgICBlbHNlOgorICAgICAgICBjID0gLTEKKyAgICAgICAgZGF0YSA9ICIiCisgICAgICBpZiBsYXN0ID49IDAgYW5kIChjICE9IChsYXN0ICsgMSkgb3IgZGF0YSAhPSBmaXJzdF9kYXRhKToKKyAgICAgICAgIyBvdXRwdXQgdGhlIGN1cnJlbnQgcmFuZ2UKKyAgICAgICAgaWYgZmlyc3QgPT0gbGFzdDoKKyAgICAgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WCVzXG4iICUgKGZpcnN0LCBmaXJzdF9kYXRhKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WC4uJTA0WCVzXG4iICUgKGZpcnN0LCBsYXN0LCBmaXJzdF9kYXRhKSkKKyAgICAgICAgZmlyc3QgPSAtMQorICAgICAgICBsYXN0ID0gLTEKKyAgICAgICAgZmlyc3RfZGF0YSA9ICIiCisgICAgICBpZiBjIDwgMDoKKyAgICAgICAgIyBubyBkYXRhIG9uIHRoaXMgbGluZSwgb3V0cHV0IGFzIGlzCisgICAgICAgIG91dF9maWxlLndyaXRlKGxpbmUpCisgICAgICAgIG91dF9maWxlLndyaXRlKCJcbiIpCisgICAgICBlbHNlOgorICAgICAgICAjIGRhdGEgb24gdGhpcyBsaW5lLCBzdG9yZSBmb3IgcG9zc2libGUgcmFuZ2UgY29tcGFjdGlvbgorICAgICAgICBpZiBsYXN0IDwgMDoKKyAgICAgICAgICAjIHNldCBhcyB0aGUgZmlyc3QgbGluZSBpbiBhIHBvc3NpYmxlIHJhbmdlCisgICAgICAgICAgZmlyc3QgPSBjCisgICAgICAgICAgbGFzdCA9IGMKKyAgICAgICAgICBmaXJzdF9kYXRhID0gZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICMgbXVzdCBiZSBjID09IChsYXN0ICsgMSkgYW5kIGRhdGEgPT0gZmlyc3RfZGF0YQorICAgICAgICAgICMgYmVjYXVzZSBvZiBwcmV2aW91cyBjb25kaXRpb25zCisgICAgICAgICAgIyBjb250aW51ZSB3aXRoIHRoZSBjdXJyZW50IHJhbmdlCisgICAgICAgICAgbGFzdCA9IGMKKyAgICBlbHNlOgorICAgICAgIyBPbmx5IHN0cmlwLCBkb24ndCBtZXJnZToganVzdCBvdXRwdXQgdGhlIHN0cmlwcGVkIGxpbmUuCisgICAgICBvdXRfZmlsZS53cml0ZShsaW5lKQorICAgICAgb3V0X2ZpbGUud3JpdGUoIlxuIikKKyAgaWYgZG9fbWVyZ2UgYW5kIGxhc3QgPj0gMDoKKyAgICAjIG91dHB1dCB0aGUgbGFzdCByYW5nZSBpbiB0aGUgZmlsZQorICAgIGlmIGZpcnN0ID09IGxhc3Q6CisgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WCVzXG4iICUgKGZpcnN0LCBmaXJzdF9kYXRhKSkKKyAgICBlbHNlOgorICAgICAgb3V0X2ZpbGUud3JpdGUoIiUwNFguLiUwNFglc1xuIiAlIChmaXJzdCwgbGFzdCwgZmlyc3RfZGF0YSkpCisgICAgZmlyc3QgPSAtMQorICAgIGxhc3QgPSAtMQorICAgIGZpcnN0X2RhdGEgPSAiIgorICBpbl9maWxlLmNsb3NlKCkKKyAgb3V0X2ZpbGUuZmx1c2goKQorICBvdXRfZmlsZS5jbG9zZSgpCisKKworZGVmIENvcHlBbmRTdHJpcChzLCB0KToKKyAgIiIiQ29waWVzIGEgZmlsZSBhbmQgcmVtb3ZlcyBjb21tZW50cyBiZWhpbmQgZGF0YSBsaW5lcyBidXQgbm90IGluIG90aGVycy4iIiIKKyAgQ29weUFuZFN0cmlwV2l0aE9wdGlvbmFsTWVyZ2UocywgdCwgRmFsc2UpCisKKworZGVmIENvcHlBbmRTdHJpcEFuZE1lcmdlKHMsIHQpOgorICAiIiJDb3BpZXMgYW5kIHN0cmlwcyBhIGZpbGUgYW5kIG1lcmdlcyBsaW5lcy4KKworICBDb3BpZXMgYSBmaWxlLCByZW1vdmVzIGNvbW1lbnRzLCBhbmQKKyAgbWVyZ2VzIGxpbmVzIHdpdGggYWRqYWNlbnQgY29kZSBwb2ludCByYW5nZXMgYW5kIGlkZW50aWNhbCBwZXItY29kZSBwb2ludAorICBkYXRhIGxpbmVzIGludG8gb25lIGxpbmUgd2l0aCByYW5nZSBzeW50YXguCisgICIiIgorICBDb3B5QW5kU3RyaXBXaXRoT3B0aW9uYWxNZXJnZShzLCB0LCBUcnVlKQorCisKK19maWxlcyA9IHsKKyAgIyBTaW1wbHkgY29weSB0aGVzZSBmaWxlcy4KKyAgIkJpZGlNaXJyb3JpbmcudHh0Ijogc2h1dGlsLmNvcHksCisgICJCaWRpVGVzdC50eHQiOiAoc2h1dGlsLmNvcHksICJ0ZXN0ZGF0YSIpLAorICAiQmxvY2tzLnR4dCI6IHNodXRpbC5jb3B5LAorICAiQ2FzZUZvbGRpbmcudHh0Ijogc2h1dGlsLmNvcHksCisgICJEZXJpdmVkQWdlLnR4dCI6IHNodXRpbC5jb3B5LAorICAiRGVyaXZlZEJpZGlDbGFzcy50eHQiOiBzaHV0aWwuY29weSwKKyAgIkRlcml2ZWRKb2luaW5nR3JvdXAudHh0Ijogc2h1dGlsLmNvcHksCisgICJEZXJpdmVkSm9pbmluZ1R5cGUudHh0Ijogc2h1dGlsLmNvcHksCisgICJEZXJpdmVkTnVtZXJpY1ZhbHVlcy50eHQiOiBzaHV0aWwuY29weSwKKyAgIkdyYXBoZW1lQnJlYWtUZXN0LnR4dCI6IChzaHV0aWwuY29weSwgInRlc3RkYXRhIiksCisgICJMaW5lQnJlYWtUZXN0LnR4dCI6IChzaHV0aWwuY29weSwgInRlc3RkYXRhIiksCisgICJOYW1lQWxpYXNlcy50eHQiOiBzaHV0aWwuY29weSwKKyAgIk5vcm1hbGl6YXRpb25Db3JyZWN0aW9ucy50eHQiOiBzaHV0aWwuY29weSwKKyAgIlByb3BlcnR5QWxpYXNlcy50eHQiOiBzaHV0aWwuY29weSwKKyAgIlByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCI6IHNodXRpbC5jb3B5LAorICAiU2VudGVuY2VCcmVha1Rlc3QudHh0IjogKHNodXRpbC5jb3B5LCAidGVzdGRhdGEiKSwKKyAgIlNjcmlwdEV4dGVuc2lvbnMudHh0Ijogc2h1dGlsLmNvcHksCisgICJTcGVjaWFsQ2FzaW5nLnR4dCI6IHNodXRpbC5jb3B5LAorICAiVW5pY29kZURhdGEudHh0Ijogc2h1dGlsLmNvcHksCisgICJXb3JkQnJlYWtUZXN0LnR4dCI6IChzaHV0aWwuY29weSwgInRlc3RkYXRhIiksCisKKyAgIyBDb3B5IHRoZXNlIGZpbGVzIGFuZCByZW1vdmUgY29tbWVudHMgYmVoaW5kIGRhdGEgbGluZXMgYnV0IG5vdCBpbiBvdGhlcnMuCisgICJEZXJpdmVkQ29yZVByb3BlcnRpZXMudHh0IjogQ29weUFuZFN0cmlwLAorICAiRGVyaXZlZE5vcm1hbGl6YXRpb25Qcm9wcy50eHQiOiBDb3B5QW5kU3RyaXAsCisgICJHcmFwaGVtZUJyZWFrUHJvcGVydHkudHh0IjogQ29weUFuZFN0cmlwLAorICAiTm9ybWFsaXphdGlvblRlc3QudHh0IjogQ29weUFuZFN0cmlwLAorICAiUHJvcExpc3QudHh0IjogQ29weUFuZFN0cmlwLAorICAiU2NyaXB0cy50eHQiOiBDb3B5QW5kU3RyaXAsCisgICJTZW50ZW5jZUJyZWFrUHJvcGVydHkudHh0IjogQ29weUFuZFN0cmlwLAorICAiV29yZEJyZWFrUHJvcGVydHkudHh0IjogQ29weUFuZFN0cmlwLAorCisgICMgQWxzbyBtZXJnZSBsaW5lcyB3aXRoIGFkamFjZW50IGNvZGUgcG9pbnQgcmFuZ2VzLgorICAiRWFzdEFzaWFuV2lkdGgudHh0IjogQ29weUFuZFN0cmlwQW5kTWVyZ2UsCisgICJMaW5lQnJlYWsudHh0IjogQ29weUFuZFN0cmlwQW5kTWVyZ2UKK30KKworX2ZpbGVfdmVyc2lvbl9yZSA9IHJlLmNvbXBpbGUoIl4oW2EtekEtWjAtOV0rKSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1bMC05XSg/OlxcLlswLTldKSooPzpkWzAtOV0rKT8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoXFwuW2Etel0rKSQiKQorCitkZWYgbWFpbigpOgorICBzb3VyY2Vfcm9vdCA9IHN5cy5hcmd2WzFdCisgIGRlc3Rfcm9vdCA9IHN5cy5hcmd2WzJdCisgIHNvdXJjZV9maWxlcyA9IFtdCisgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNvdXJjZV9yb290KToKKyAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgIHNvdXJjZV9maWxlcy5hcHBlbmQob3MucGF0aC5qb2luKHJvb3QsIGZpbGUpKQorICBmaWxlc19wcm9jZXNzZWQgPSBzZXQoKQorICBmb3Igc291cmNlX2ZpbGUgaW4gc291cmNlX2ZpbGVzOgorICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzb3VyY2VfZmlsZSkKKyAgICBtYXRjaCA9IF9maWxlX3ZlcnNpb25fcmUubWF0Y2goYmFzZW5hbWUpCisgICAgaWYgbWF0Y2g6CisgICAgICBiYXNlbmFtZSA9IG1hdGNoLmdyb3VwKDEpICsgbWF0Y2guZ3JvdXAoMikKKyAgICAgIHByaW50IGJhc2VuYW1lCisgICAgaWYgYmFzZW5hbWUgaW4gX2ZpbGVzOgorICAgICAgaWYgYmFzZW5hbWUgaW4gZmlsZXNfcHJvY2Vzc2VkOgorICAgICAgICBwcmludCAiZHVwbGljYXRlIGZpbGUgYmFzZW5hbWUgJXMhIiAlIGJhc2VuYW1lCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgICBmaWxlc19wcm9jZXNzZWQuYWRkKGJhc2VuYW1lKQorICAgICAgYWN0aW9uID0gX2ZpbGVzW2Jhc2VuYW1lXQorICAgICAgaWYgaXNpbnN0YW5jZShhY3Rpb24sIHR1cGxlKToKKyAgICAgICAgZGVzdF9mb2xkZXIgPSBhY3Rpb25bMV0KKyAgICAgICAgYWN0aW9uID0gYWN0aW9uWzBdCisgICAgICBlbHNlOgorICAgICAgICBkZXN0X2ZvbGRlciA9ICJ1bmlkYXRhIgorICAgICAgZGVzdF9wYXRoID0gb3MucGF0aC5qb2luKGRlc3Rfcm9vdCwgZGVzdF9mb2xkZXIpCisgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGVzdF9wYXRoKTogb3MubWFrZWRpcnMoZGVzdF9wYXRoKQorICAgICAgZGVzdF9maWxlID0gb3MucGF0aC5qb2luKGRlc3RfcGF0aCwgYmFzZW5hbWUpCisgICAgICBhY3Rpb24oc291cmNlX2ZpbGUsIGRlc3RfZmlsZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZG1lcmdlLmMgYi91bmljb2RlL2MvZ2VucHJvcHMvbWlzYy91Y2RtZXJnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjY4NTAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvbWlzYy91Y2RtZXJnZS5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIHVjZG1lcmdlLmMKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDAzZmViMjAKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFNpbXBsZSB0b29sIGZvciBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBmaWxlcyB3aXRoIHNlbWljb2xvbi1kZWxpbWl0ZWQgZmllbGRzLgorKiAgIE1lcmdlcyBhZGphY2VudCwgaWRlbnRpY2FsIHBlci1jb2RlIHBvaW50IGRhdGEgbGluZXMgaW50byBvbmUgbGluZSB3aXRoIHJhbmdlIHN5bnRheC4KKyoKKyogICBUbyBjb21waWxlLCBqdXN0IGNhbGwgYSBDIGNvbXBpbGVyL2xpbmtlciB3aXRoIHRoaXMgc291cmNlIGZpbGUuCisqICAgT24gV2luZG93czogY2wgdWNkbWVyZ2UuYworKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NraXBXaGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMpIHsKKyAgICB3aGlsZSgqcz09JyAnIHx8ICpzPT0nXHQnKSB7CisgICAgICAgICsrczsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKy8qIHJldHVybiB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGRhdGEgKi8KK3N0YXRpYyBjaGFyICoKK2VuZE9mRGF0YShjb25zdCBjaGFyICpsKSB7CisgICAgY2hhciAqZW5kOworICAgIGNoYXIgYzsKKworICAgIGVuZD1zdHJjaHIobCwgJyMnKTsKKyAgICBpZihlbmQhPU5VTEwpIHsKKyAgICAgICAgLyogaWdub3JlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBjb21tZW50ICovCisgICAgICAgIHdoaWxlKGwhPWVuZCAmJiAoKGM9KihlbmQtMSkpPT0nICcgfHwgYz09J1x0JykpIHsKKyAgICAgICAgICAgIC0tZW5kOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW5kPXN0cmNocihsLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGVuZDsKK30KKworc3RhdGljIGludAorc2FtZURhdGEoY29uc3QgY2hhciAqbDEsIGNvbnN0IGNoYXIgKmwyKSB7CisgICAgY2hhciAqZW5kMSwgKmVuZDI7CisgICAgaW50IGxlbmd0aDsKKworICAgIC8qIGZpbmQgdGhlIGZpcnN0IHNlbWljb2xvbiBpbiBlYWNoIGxpbmUgLSB0aGVyZSBtdXN0IGJlIG9uZSAqLworICAgIGwxPXN0cmNocihsMSwgJzsnKSsxOworICAgIGwyPXN0cmNocihsMiwgJzsnKSsxOworCisgICAgLyogZmluZCB0aGUgZW5kIG9mIGRhdGE6IGVuZCBvZiBzdHJpbmcgb3Igc3RhcnQgb2YgY29tbWVudCAqLworICAgIGVuZDE9ZW5kT2ZEYXRhKGwxKTsKKyAgICBlbmQyPWVuZE9mRGF0YShsMik7CisKKyAgICAvKiBjb21wYXJlIHRoZSBsaW5lIGRhdGEgcG9ydGlvbnMgKi8KKyAgICBsZW5ndGg9ZW5kMS1sMTsKKyAgICByZXR1cm4gbGVuZ3RoPT0oZW5kMi1sMikgJiYgMD09bWVtY21wKGwxLCBsMiwgbGVuZ3RoKTsKK30KKworZXh0ZXJuIGludAorbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgICAgc3RhdGljIGNoYXIgbGluZVsyMDAwXSwgZmlyc3RMaW5lWzIwMDBdLCBsYXN0TGluZVsyMDAwXTsKKyAgICBjaGFyICplbmQ7CisgICAgbG9uZyBmaXJzdCwgbGFzdCwgYzsKKyAgICBpbnQgZmluaXNoZWQ7CisKKyAgICBmaXJzdD1sYXN0PS0xOworICAgIGZpbmlzaGVkPTA7CisKKyAgICBmb3IoOzspIHsKKyAgICAgICAgaWYoZ2V0cyhsaW5lKSE9TlVMTCkgeworICAgICAgICAgICAgLyogcGFyc2UgdGhlIGluaXRpYWwgY29kZSBwb2ludCwgaWYgYW55ICovCisgICAgICAgICAgICBjPXN0cnRvbChsaW5lLCAmZW5kLCAxNik7CisgICAgICAgICAgICBpZihlbmQhPWxpbmUgJiYgKnNraXBXaGl0ZXNwYWNlKGVuZCk9PSc7JykgeworICAgICAgICAgICAgICAgIC8qIHNpbmdsZSBjb2RlIHBvaW50IGZvbGxvd2VkIGJ5IHNlbWljb2xvbiBhbmQgZGF0YSwga2VlcCBjICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGM9LTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lWzBdPTA7CisgICAgICAgICAgICBjPS0xOworICAgICAgICAgICAgZmluaXNoZWQ9MTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxhc3Q+PTAgJiYgKGMhPShsYXN0KzEpIHx8ICFzYW1lRGF0YShmaXJzdExpbmUsIGxpbmUpKSkgeworICAgICAgICAgICAgLyogb3V0cHV0IHRoZSBjdXJyZW50IHJhbmdlICovCisgICAgICAgICAgICBpZihmaXJzdD09bGFzdCkgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBubyByYW5nZSwganVzdCBvdXRwdXQgdGhlIG9uZSBsaW5lIHdlIGZvdW5kICovCisgICAgICAgICAgICAgICAgcHV0cyhmaXJzdExpbmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSB3YXMgYSByZWFsIHJhbmdlLCBtZXJnZSB0aGVpciBsaW5lcyAqLworICAgICAgICAgICAgICAgIGVuZD1zdHJjaHIobGFzdExpbmUsICcjJyk7CisgICAgICAgICAgICAgICAgaWYoZW5kPT1OVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG5vIGNvbW1lbnQgaW4gc2Vjb25kIGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDRsWC4uJTA0bFglc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCwgbGFzdCwgICAgICAgICAgICAvKiBjb2RlIHBvaW50IHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2hyKGZpcnN0TGluZSwgJzsnKSk7LyogZmlyc3QgbGluZSBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCA7ICovCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHN0cmNocihmaXJzdExpbmUsICcjJyk9PU5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbm8gY29tbWVudCBpbiBmaXJzdCBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTA0bFguLiUwNGxYJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCwgbGFzdCwgICAgICAgICAgICAvKiBjb2RlIHBvaW50IHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2hyKGZpcnN0TGluZSwgJzsnKSwgLyogZmlyc3QgbGluZSBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCA7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKTsgICAgICAgICAgICAgICAgICAgLyogY29tbWVudCBmcm9tIHNlY29uZCBsaW5lICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgY29tbWVudHMgZnJvbSBib3RoIGxpbmVzICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJTA0bFguLiUwNGxYJXMuLiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0LCAgICAgICAgICAgIC8qIGNvZGUgcG9pbnQgcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjaHIoZmlyc3RMaW5lLCAnOycpLCAvKiBmaXJzdCBsaW5lIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IDsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwV2hpdGVzcGFjZShlbmQrMSkpOyAvKiBjb21tZW50IGZyb20gc2Vjb25kIGxpbmUsIGFmdGVyICMgYW5kIHNwYWNlcyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0PWxhc3Q9LTE7CisgICAgICAgIH0KKworICAgICAgICBpZihjPDApIHsKKyAgICAgICAgICAgIGlmKGZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG5vIGRhdGEgb24gdGhpcyBsaW5lLCBvdXRwdXQgYXMgaXMgKi8KKyAgICAgICAgICAgIHB1dHMobGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBkYXRhIG9uIHRoaXMgbGluZSwgc3RvcmUgZm9yIHBvc3NpYmxlIHJhbmdlIGNvbXBhY3Rpb24gKi8KKyAgICAgICAgICAgIGlmKGxhc3Q8MCkgeworICAgICAgICAgICAgICAgIC8qIHNldCBhcyB0aGUgZmlyc3QgbGluZSBpbiBhIHBvc3NpYmxlIHJhbmdlICovCisgICAgICAgICAgICAgICAgZmlyc3Q9bGFzdD1jOworICAgICAgICAgICAgICAgIHN0cmNweShmaXJzdExpbmUsIGxpbmUpOworICAgICAgICAgICAgICAgIGxhc3RMaW5lWzBdPTA7CisgICAgICAgICAgICB9IGVsc2UgLyogbXVzdCBiZSBjPT0obGFzdCsxKSAmJiBzYW1lRGF0YSgpIGJlY2F1c2Ugb2YgcHJldmlvdXMgY29uZGl0aW9ucyAqLyB7CisgICAgICAgICAgICAgICAgLyogY29udGludWUgd2l0aCB0aGUgY3VycmVudCByYW5nZSAqLworICAgICAgICAgICAgICAgIGxhc3Q9YzsKKyAgICAgICAgICAgICAgICBzdHJjcHkobGFzdExpbmUsIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvbWlzYy91Y2RzdHJpcC5jIGIvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkc3RyaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VmNTNmCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkc3RyaXAuYwpAQCAtMCwwICsxLDU5IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIHVjZHN0cmlwLmMKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDAzZmViMjAKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFNpbXBsZSB0b29sIGZvciBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBmaWxlcyB3aXRoIHNlbWljb2xvbi1kZWxpbWl0ZWQgZmllbGRzLgorKiAgIFJlbW92ZXMgY29tbWVudHMgYmVoaW5kIGRhdGEgbGluZXMgYnV0IG5vdCBpbiBvdGhlcnMuCisqCisqICAgVG8gY29tcGlsZSwganVzdCBjYWxsIGEgQyBjb21waWxlci9saW5rZXIgd2l0aCB0aGlzIHNvdXJjZSBmaWxlLgorKiAgIE9uIFdpbmRvd3M6IGNsIHVjZHN0cmlwLmMKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiByZXR1cm4gdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBhZnRlciB0aGUgZW5kIG9mIHRoZSBkYXRhICovCitzdGF0aWMgY2hhciAqCitlbmRPZkRhdGEoY29uc3QgY2hhciAqbCkgeworICAgIGNoYXIgKmVuZDsKKyAgICBjaGFyIGM7CisKKyAgICBlbmQ9c3RyY2hyKGwsICcjJyk7CisgICAgaWYoZW5kIT1OVUxMKSB7CisgICAgICAgIC8qIGlnbm9yZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgY29tbWVudCAqLworICAgICAgICB3aGlsZShsIT1lbmQgJiYgKChjPSooZW5kLTEpKT09JyAnIHx8IGM9PSdcdCcpKSB7CisgICAgICAgICAgICAtLWVuZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVuZD1zdHJjaHIobCwgMCk7CisgICAgfQorICAgIHJldHVybiBlbmQ7Cit9CisKK2V4dGVybiBpbnQKK21haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICAgIHN0YXRpYyBjaGFyIGxpbmVbMjAwMF07CisgICAgY2hhciAqZW5kOworCisgICAgd2hpbGUoZ2V0cyhsaW5lKSE9TlVMTCkgeworICAgICAgICBpZihzdHJ0b2wobGluZSwgJmVuZCwgMTYpPj0wICYmIGVuZCE9bGluZSkgeworICAgICAgICAgICAgLyogY29kZSBwb2ludCBvciByYW5nZSBmb2xsb3dlZCBieSBzZW1pY29sb24gYW5kIGRhdGEsIHJlbW92ZSBjb21tZW50ICovCisgICAgICAgICAgICAqZW5kT2ZEYXRhKGxpbmUpPTA7CisgICAgICAgIH0KKyAgICAgICAgcHV0cyhsaW5lKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZHN0cmlwLnBsIGIvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkc3RyaXAucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjEwOTc3MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZHN0cmlwLnBsCkBAIC0wLDAgKzEsNyBAQAorIyEvdXNyL2xpYi9wZXJsIC1wCisjIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgU2ltcGxlIHRvb2wgZm9yIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlIGZpbGVzIHdpdGggc2VtaWNvbG9uLWRlbGltaXRlZCBmaWVsZHMuCisjIFJlbW92ZXMgY29tbWVudHMgYmVoaW5kIGRhdGEgbGluZXMgYnV0IG5vdCBpbiBvdGhlcnMuCisjIFRoZSBQZXJsIG9wdGlvbiAtcCBhYm92ZSBydW5zIGEgd2hpbGUoPD4pIGxvb3AgYW5kIHByaW50cyB0aGUgZXhwcmVzc2lvbiBvdXRwdXQuCitzL14oWzAtOWEtZkEtRl0rLis/KSAqIy4qL1wxLzsKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wcm9wcy9uYW1lc3Byb3BzYnVpbGRlci5jcHAgYi91bmljb2RlL2MvZ2VucHJvcHMvbmFtZXNwcm9wc2J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjU4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvbmFtZXNwcm9wc2J1aWxkZXIuY3BwCkBAIC0wLDAgKzEsMTEzNyBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIG5hbWVzcHJvcHNidWlsZGVyLmNwcCAod2FzIGdlbm5hbWVzL2dlbm5hbWVzLmMpCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMTk5OXNlcDMwCisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyoKKyogICBUaGlzIGJ1aWxkZXIgcmVhZHMgVW5pY29kZSBjaGFyYWN0ZXIgbmFtZXMgYW5kIGFsaWFzZXMsCisqICAgdG9rZW5pemVzIGFuZCBjb21wcmVzc2VzIHRoZW0sIGFuZCBidWlsZHMKKyogICBjb21wYWN0IGJpbmFyeSB0YWJsZXMgZm9yIHJhbmRvbS1hY2Nlc3MgbG9va3VwCisqICAgaW4gYSB1X2NoYXJOYW1lKCkgQVBJIGZ1bmN0aW9uLgorKgorKiB1bmFtZXMuaWN1IGZpbGUgZm9ybWF0IChhZnRlciBVRGF0YUluZm8gaGVhZGVyIGV0Yy4gLSBzZWUgdWRhdGEuYykKKyogKGFsbCBkYXRhIGlzIHN0YXRpYyBjb25zdCkKKyoKKyogVURhdGFJbmZvIGZpZWxkczoKKyogICBkYXRhRm9ybWF0ICJ1bmFtIgorKiAgIGZvcm1hdFZlcnNpb24gMS4wCisqICAgZGF0YVZlcnNpb24gPSBVbmljb2RlIHZlcnNpb24gZnJvbSAtdSBvciAtLXVuaWNvZGUgY29tbWFuZCBsaW5lIG9wdGlvbiwgZGVmYXVsdHMgdG8gMy4wLjAKKyoKKyogLS0gZGF0YS1iYXNlZCBuYW1lcworKiB1aW50MzJfdCB0b2tlblN0cmluZ09mZnNldCwKKyogICAgICAgICAgZ3JvdXBzT2Zmc2V0LAorKiAgICAgICAgICBncm91cFN0cmluZ09mZnNldCwKKyogICAgICAgICAgYWxnTmFtZXNPZmZzZXQ7CisqCisqIHVpbnQxNl90IHRva2VuQ291bnQ7CisqIHVpbnQxNl90IHRva2VuVGFibGVbdG9rZW5Db3VudF07CisqCisqIGNoYXIgICAgIHRva2VuU3RyaW5nc1tdOyAtLSBwYWRkZWQgdG8gZXZlbiBjb3VudAorKgorKiAtLSBzdHJpbmdzIChncm91cFN0cmluZ3MpIGFyZSB0b2tlbml6ZWQgYXMgZm9sbG93czoKKyogICBmb3IgZWFjaCBjaGFyYWN0ZXIgYworKiAgICAgICBpZihjPj10b2tlbkNvdW50KSB3cml0ZSB0aGF0IGNoYXJhY3RlciBjIGRpcmVjdGx5CisqICAgZWxzZQorKiAgICAgICB0b2tlbj10b2tlblRhYmxlW2NdOworKiAgICAgICBpZih0b2tlbj09MHhmZmZlKSAtLSBsZWFkIGJ5dGUgb2YgZG91YmxlLWJ5dGUgdG9rZW4KKyogICAgICAgICAgIHRva2VuPXRva2VuVGFibGVbYzw8OHxuZXh0IGNoYXJhY3Rlcl07CisqICAgICAgIGlmKHRva2VuPT0tMSkKKyogICAgICAgICAgIHdyaXRlIGMgZGlyZWN0bHkKKyogICAgICAgZWxzZQorKiAgICAgICAgICAgdG9rZW5TdHJpbmc9dG9rZW5TdHJpbmdzK3Rva2VuOyAodG9rZW5TdHJpbmdzPXN0YXJ0IG9mIG5hbWVzIGRhdGEgKyB0b2tlblN0cmluZ09mZnNldDspCisqICAgICAgICAgICBhcHBlbmQgemVyby10ZXJtaW5hdGVkIHRva2VuU3RyaW5nOworKgorKiAgICBEaWZmZXJlbnQgc3RyaW5ncyBmb3IgYSBjb2RlIHBvaW50IC0gbm9ybWFsIG5hbWUsIDEuMCBuYW1lLCBhbmQgSVNPIGNvbW1lbnQgLQorKiAgICBhcmUgc2VwYXJhdGVkIGJ5ICc7Jy4KKyoKKyogdWludDE2X3QgZ3JvdXBDb3VudDsKKyogc3RydWN0IHsKKyogICB1aW50MTZfdCBncm91cE1TQjsgLS0gZm9yIGEgZ3JvdXAgb2YgMzIgY2hhcmFjdGVyIG5hbWVzIHN0b3JlZCwgdGhpcyBpcyBjb2RlIHBvaW50Pj41CisqICAgdWludDE2X3Qgb2Zmc2V0SGlnaDsgLS0gZ3JvdXAgc3RyaW5ncyBhcmUgYXQgc3RhcnQgb2YgbmFtZXMgZGF0YSArIGdyb3VwU3RyaW5nc09mZnNldCArIHRoaXMgMzIgYml0LW9mZnNldAorKiAgIHVpbnQxNl90IG9mZnNldExvdzsKKyogfSBncm91cFRhYmxlW2dyb3VwQ291bnRdOworKgorKiBjaGFyICAgICBncm91cFN0cmluZ3NbXTsgLS0gcGFkZGVkIHRvIDQtY291bnQKKyoKKyogLS0gVGhlIGFjdHVhbCwgdG9rZW5pemVkIGdyb3VwIHN0cmluZ3MgYXJlIG5vdCB6ZXJvLXRlcm1pbmF0ZWQgYmVjYXVzZQorKiAgIHRoYXQgd291bGQgdGFrZSB1cCB0b28gbXVjaCBzcGFjZS4KKyogICBJbnN0ZWFkLCB0aGV5IGFyZSBwcmVjZWVkZWQgYnkgdGhlaXIgbGVuZ3RoLCB3cml0dGVuIGluIGEgdmFyaWFibGUtbGVuZ3RoIHNlcXVlbmNlOgorKiAgIEZvciBlYWNoIG9mIHRoZSAzMiBncm91cCBzdHJpbmdzLCBvbmUgb3IgdHdvIG5pYmJsZXMgYXJlIHN0b3JlZCBmb3IgaXRzIGxlbmd0aC4KKyogICBOaWJibGVzICg0LWJpdCB2YWx1ZXMsIGhhbGYtYnl0ZXMpIGFyZSByZWFkIE1TQiBmaXJzdC4KKyogICBBIG5pYmJsZSB3aXRoIGEgdmFsdWUgb2YgMC4uMTEgZGlyZWN0bHkgaW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgc3RyaW5nLgorKiAgIEEgbmliYmxlIG4gd2l0aCBhIHZhbHVlIG9mIDEyLi4xNSBpcyBhIGxlYWQgbmliYmxlIGFuZCBmb3JtcyBhIHZhbHVlIHdpdGggdGhlIGZvbGxvd2luZyBuaWJibGUgbQorKiAgIGJ5ICgoKG4tMTIpPDw0KXxtKSsxMiwgcmVhY2hpbmcgdmFsdWVzIG9mIDEyLi43NS4KKyogICBUaGVzZSBsZW5ndGhzIGFyZSBzZXF1ZW50aWFsbHkgZm9yIGVhY2ggdG9rZW5pemVkIHN0cmluZywgbm90IGZvciB0aGUgZGUtdG9rZW5pemVkIHJlc3VsdC4KKyogICBGb3IgdGhlIGRlLXRva2VuaXppbmcsIHNlZSB0b2tlbiBkZXNjcmlwdGlvbiBhYm92ZTsgdGhlIHN0cmluZ3MgaW1tZWRpYXRlbHkgZm9sbG93IHRoZQorKiAgIDMyIGxlbmd0aHMuCisqCisqIC0tIGFsZ29yaXRobWljIG5hbWVzCisqCisqIHR5cGVkZWYgc3RydWN0IEFsZ29yaXRobWljUmFuZ2UgeworKiAgICAgdWludDMyX3QgcmFuZ2VTdGFydCwgcmFuZ2VFbmQ7CisqICAgICB1aW50OF90IGFsZ29yaXRobVR5cGUsIGFsZ29yaXRobVZhcmlhbnQ7CisqICAgICB1aW50MTZfdCByYW5nZVNpemU7CisqIH0gQWxnb3JpdGhtaWNSYW5nZTsKKyoKKyogdWludDMyX3QgYWxnUmFuZ2VzQ291bnQ7IC0tIG51bWJlciBvZiBkYXRhIGJsb2NrcyBmb3IgcmFuZ2VzIG9mCisqICAgICAgICAgICAgICAgYWxnb3JpdGhtaWMgbmFtZXMgKFVuaWNvZGUgMy4wLjA6IDMsIGhhcmRjb2RlZCBpbiBnZW5uYW1lcykKKyoKKyogc3RydWN0IHsKKyogICAgIEFsZ29yaXRobWljUmFuZ2UgYWxnUmFuZ2U7CisqICAgICB1aW50OF90IGFsZ1JhbmdlRGF0YVtdOyAtLSBwYWRkZWQgdG8gNC1jb3VudCBleGNlcHQgaW4gbGFzdCByYW5nZQorKiB9IGFsZ1Jhbmdlc1thbGdOYW1lc0NvdW50XTsKKyogLS0gbm90IGEgcmVhbCBhcnJheSBiZWNhdXNlIGVhY2ggcGFydCBoYXMgYSBkaWZmZXJlbnQgc2l6ZQorKiAgICBvZiBhbGdSYW5nZS5yYW5nZVNpemUgKGluY2x1ZGluZyBBbGdvcml0aG1pY1JhbmdlKQorKgorKiAtLSBhbGdvcml0aG1pYyByYW5nZSB0eXBlczoKKyoKKyogMCBOYW1lcyBhcmUgZm9ybWVkIGZyb20gYSBzdHJpbmcgcHJlZml4IHRoYXQgaXMgc3RvcmVkIGluCisqICAgdGhlIGFsZ1JhbmdlRGF0YSAoemVyby10ZXJtaW5hdGVkKSwgZm9sbG93ZWQgYnkgdGhlIFVuaWNvZGUgY29kZSBwb2ludAorKiAgIG9mIHRoZSBjaGFyYWN0ZXIgaW4gaGV4YWRlY2ltYWwgZGlnaXRzOworKiAgIGFsZ1JhbmdlLmFsZ29yaXRobVZhcmlhbnQgZGlnaXRzIGFyZSB3cml0dGVuCisqCisqIDEgTmFtZXMgYXJlIGZvcm1lZCBieSBjYWxjdWxhdGluZyBtb2R1bG8tZmFjdG9ycyBvZiB0aGUgY29kZSBwb2ludCB2YWx1ZSBhcyBmb2xsb3dzOgorKiAgIGFsZ1JhbmdlLmFsZ29yaXRobVZhcmlhbnQgaXMgdGhlIGNvdW50IG9mIG1vZHVsbyBmYWN0b3JzCisqICAgYWxnUmFuZ2VEYXRhIGNvbnRhaW5zCisqICAgICAgIHVpbnQxNl90IGZhY3RvcnNbYWxnUmFuZ2UuYWxnb3JpdGhtVmFyaWFudF07CisqICAgICAgIGNoYXIgc3RyaW5nc1tdOworKiAgIHRoZSBmaXJzdCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIGlzIHdyaXR0ZW4gYXMgdGhlIHByZWZpeDsgdGhlbjoKKyoKKyogICBUaGUgcmFuZ2VTdGFydCBpcyBzdWJ0cmFjdGVkOyB3aXRoIHRoZSBkaWZmZXJlbmNlLCBoZXJlICJjb2RlIjoKKyogICBmb3IoaT1hbGdSYW5nZS5hbGdvcml0aG1WYXJpYW50LTEgdG8gMCBzdGVwIC0xKQorKiAgICAgICBpbmRleFtpXT1jb2RlJWZhY3RvcltpXTsKKyogICAgICAgY29kZS89ZmFjdG9yW2ldOworKgorKiAgIFRoZSBzdHJpbmdzIGFmdGVyIHRoZSBwcmVmaXggYXJlIHNob3J0IHBpZWNlcyB0aGF0IGFyZSB0aGVuIGFwcGVuZGVkIHRvIHRoZSByZXN1bHQKKyogICBhY2NvcmRpbmcgdG8gaW5kZXhbMC4uYWxnUmFuZ2UuYWxnb3JpdGhtVmFyaWFudC0xXS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS9wdXRpbC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWRhdGEuaCIKKyNpbmNsdWRlICJjaGFyc3RyLmgiCisjaW5jbHVkZSAiY21lbW9yeS5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJnZW5wcm9wcy5oIgorI2luY2x1ZGUgInBwdWNkLmgiCisjaW5jbHVkZSAidWFycnNvcnQuaCIKKyNpbmNsdWRlICJ1YXNzZXJ0LmgiCisjaW5jbHVkZSAidW5ld2RhdGEuaCIKKyNpbmNsdWRlICJ1b3B0aW9ucy5oIgorCisjZGVmaW5lIFNUUklOR19TVE9SRV9TSVpFIDEwMDAwMDAKKyNkZWZpbmUgR1JPVVBfU1RPUkVfU0laRSA1MDAwCisKKyNkZWZpbmUgR1JPVVBfU0hJRlQgNQorI2RlZmluZSBMSU5FU19QRVJfR1JPVVAgKDFVTDw8R1JPVVBfU0hJRlQpCisjZGVmaW5lIEdST1VQX01BU0sgKExJTkVTX1BFUl9HUk9VUC0xKQorCisjZGVmaW5lIE1BWF9MSU5FX0NPVU5UIDUwMDAwCisjZGVmaW5lIE1BWF9XT1JEX0NPVU5UIDIwMDAwCisjZGVmaW5lIE1BWF9HUk9VUF9DT1VOVCA1MDAwCisKKyNkZWZpbmUgTkFNRV9TRVBBUkFUT1JfQ0hBUiAnOycKKworLyogZ2VuZXJhdG9yIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworVV9OQU1FU1BBQ0VfVVNFCisKKy8qIFVEYXRhSW5mbyBjZi4gdWRhdGEuaCAqLworc3RhdGljIFVEYXRhSW5mbyBkYXRhSW5mbz17CisgICAgc2l6ZW9mKFVEYXRhSW5mbyksCisgICAgMCwKKworICAgIFVfSVNfQklHX0VORElBTiwKKyAgICBVX0NIQVJTRVRfRkFNSUxZLAorICAgIHNpemVvZihVQ2hhciksCisgICAgMCwKKworICAgIHsweDc1LCAweDZlLCAweDYxLCAweDZkfSwgICAgIC8qIGRhdGFGb3JtYXQ9InVuYW0iICovCisgICAgezEsIDAsIDAsIDB9LCAgICAgICAgICAgICAgICAgLyogZm9ybWF0VmVyc2lvbiAqLworICAgIHszLCAwLCAwLCAwfSAgICAgICAgICAgICAgICAgIC8qIGRhdGFWZXJzaW9uICovCit9OworCitzdGF0aWMgdWludDhfdCBzdHJpbmdTdG9yZVtTVFJJTkdfU1RPUkVfU0laRV0sCisgICAgICAgICAgICAgICBncm91cFN0b3JlW0dST1VQX1NUT1JFX1NJWkVdLAorICAgICAgICAgICAgICAgbGluZUxlbmd0aHNbTElORVNfUEVSX0dST1VQXTsKKworc3RhdGljIHVpbnQzMl90IGxpbmVUb3A9MCwgZ3JvdXBCb3R0b20sIHdvcmRCb3R0b209U1RSSU5HX1NUT1JFX1NJWkUsIGxpbmVMZW5ndGhzVG9wOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgY29kZTsKKyAgICBpbnQxNl90IGxlbmd0aDsKKyAgICB1aW50OF90ICpzOworfSBMaW5lOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCB3ZWlnaHQ7IC8qIC0oY29zdCBmb3IgdG9rZW4pICsgKG51bWJlciBvZiBvY2N1cmVuY2VzKSAqIChsZW5ndGgtMSkgKi8KKyAgICBpbnQxNl90IGNvdW50OworICAgIGludDE2X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgKnM7Cit9IFdvcmQ7CisKK3N0YXRpYyBMaW5lIGxpbmVzW01BWF9MSU5FX0NPVU5UXTsKK3N0YXRpYyBXb3JkIHdvcmRzW01BWF9XT1JEX0NPVU5UXTsKKworc3RhdGljIHVpbnQzMl90IGxpbmVDb3VudD0wLCB3b3JkQ291bnQ9MDsKKworc3RhdGljIGludDE2X3QgbGVhZEJ5dGVDb3VudDsKKworI2RlZmluZSBMRUFEQllURV9MSU1JVCAxNgorCitzdGF0aWMgaW50MTZfdCB0b2tlbnNbTEVBREJZVEVfTElNSVQqMjU2XTsKK3N0YXRpYyB1aW50MzJfdCB0b2tlbkNvdW50OworCisvKiB0aGUgc3RydWN0dXJlIGZvciBhbGdvcml0aG1pYyBuYW1lcyBuZWVkcyB0byBiZSA0LWFsaWduZWQgKi8KK3N0cnVjdCBBbGdvcml0aG1pY1JhbmdlIHsKKyAgICBVQ2hhcjMyIHN0YXJ0LCBlbmQ7CisgICAgdWludDhfdCB0eXBlLCB2YXJpYW50OworICAgIHVpbnQxNl90IHNpemU7Cit9OworCitjbGFzcyBOYW1lc1Byb3BzQnVpbGRlciA6IHB1YmxpYyBQcm9wc0J1aWxkZXIgeworcHVibGljOgorICAgIE5hbWVzUHJvcHNCdWlsZGVyKFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisgICAgdmlydHVhbCB+TmFtZXNQcm9wc0J1aWxkZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRVbmljb2RlVmVyc2lvbihjb25zdCBVVmVyc2lvbkluZm8gdmVyc2lvbik7CisgICAgdmlydHVhbCB2b2lkIHNldFByb3BzKGNvbnN0IFVuaVByb3BzICYsIGNvbnN0IFVuaWNvZGVTZXQgJm5ld1ZhbHVlcywgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgYnVpbGQoVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVCaW5hcnlEYXRhKGNvbnN0IGNoYXIgKnBhdGgsIFVCb29sIHdpdGhDb3B5cmlnaHQsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIHNldEFsZ05hbWVzUmFuZ2UoVUNoYXIzMiBzdGFydCwgVUNoYXIzMiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqcHJlZml4LCBVRXJyb3JDb2RlICZlcnJvckNvZGUpOworCisgICAgQ2hhclN0cmluZyBhbGdSYW5nZXM7CisgICAgaW50MzJfdCBjb3VudEFsZ1JhbmdlczsKK307CisKK05hbWVzUHJvcHNCdWlsZGVyOjpOYW1lc1Byb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpCisgICAgICAgIDogY291bnRBbGdSYW5nZXMoMCkgeworICAgIGZvcihpbnQgaT0wOyBpPDI1NjsgKytpKSB7CisgICAgICAgIHRva2Vuc1tpXT0wOworICAgIH0KK30KKworTmFtZXNQcm9wc0J1aWxkZXI6On5OYW1lc1Byb3BzQnVpbGRlcigpIHsKK30KKwordm9pZAorTmFtZXNQcm9wc0J1aWxkZXI6OnNldFVuaWNvZGVWZXJzaW9uKGNvbnN0IFVWZXJzaW9uSW5mbyB2ZXJzaW9uKSB7CisgICAgdXBydl9tZW1jcHkoZGF0YUluZm8uZGF0YVZlcnNpb24sIHZlcnNpb24sIDQpOworfQorCisvKiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorcGFyc2VOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludDE2X3QgbGVuZ3RoKTsKKworc3RhdGljIGludDE2X3QKK3NraXBOb2lzZShjb25zdCBjaGFyICpsaW5lLCBpbnQxNl90IHN0YXJ0LCBpbnQxNl90IGxpbWl0KTsKKworc3RhdGljIGludDE2X3QKK2dldFdvcmQoY29uc3QgY2hhciAqbGluZSwgaW50MTZfdCBzdGFydCwgaW50MTZfdCBsaW1pdCk7CisKK3N0YXRpYyB2b2lkCitjb21wcmVzcyhVRXJyb3JDb2RlICZlcnJvckNvZGUpOworCitzdGF0aWMgdm9pZAorY29tcHJlc3NMaW5lcyh2b2lkKTsKKworc3RhdGljIGludDE2X3QKK2NvbXByZXNzTGluZSh1aW50OF90ICpzLCBpbnQxNl90IGxlbmd0aCwgaW50MTZfdCAqcEdyb3VwVG9wKTsKKworc3RhdGljIGludDMyX3QKK2NvbXBhcmVXb3Jkcyhjb25zdCB2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICp3b3JkMSwgY29uc3Qgdm9pZCAqd29yZDIpOworCitzdGF0aWMgaW50MTZfdAorZmluZFRva2VuKHVpbnQ4X3QgKnMsIGludDE2X3QgbGVuZ3RoKTsKKworc3RhdGljIFdvcmQgKgorZmluZFdvcmQoY29uc3QgY2hhciAqcywgaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgV29yZCAqCithZGRXb3JkKGNvbnN0IGNoYXIgKnMsIGludDE2X3QgbGVuZ3RoKTsKKworc3RhdGljIHZvaWQKK2NvdW50V29yZChXb3JkICp3b3JkKTsKKworc3RhdGljIHZvaWQKK2FkZExpbmUoVUNoYXIzMiBjb2RlLCBjb25zdCBjaGFyICpuYW1lc1tdLCBpbnQxNl90IGxlbmd0aHNbXSwgaW50MTZfdCBjb3VudCk7CisKK3N0YXRpYyB2b2lkCithZGRHcm91cCh1aW50MzJfdCBncm91cE1TQiwgdWludDhfdCAqc3RyaW5ncywgaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgdWludDMyX3QKK2FkZFRva2VuKHVpbnQ4X3QgKnMsIGludDE2X3QgbGVuZ3RoKTsKKworc3RhdGljIHZvaWQKK2FwcGVuZExpbmVMZW5ndGgoaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgdm9pZAorYXBwZW5kTGluZUxlbmd0aE5pYmJsZSh1aW50OF90IG5pYmJsZSk7CisKK3N0YXRpYyB1aW50OF90ICoKK2FsbG9jTGluZShpbnQzMl90IGxlbmd0aCk7CisKK3N0YXRpYyB1aW50OF90ICoKK2FsbG9jV29yZCh1aW50MzJfdCBsZW5ndGgpOworCisvKiBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitOYW1lc1Byb3BzQnVpbGRlcjo6c2V0UHJvcHMoY29uc3QgVW5pUHJvcHMgJnByb3BzLCBjb25zdCBVbmljb2RlU2V0ICZuZXdWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisgICAgaWYoIW5ld1ZhbHVlcy5jb250YWlucyhVQ0hBUl9OQU1FKSAmJiAhbmV3VmFsdWVzLmNvbnRhaW5zKFBQVUNEX05BTUVfQUxJQVMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBVX0FTU0VSVChwcm9wcy5zdGFydD09cHJvcHMuZW5kKTsKKworICAgIGNvbnN0IGNoYXIgKm5hbWVzWzRdPXsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICAgIGludDE2X3QgbGVuZ3Roc1s0XT17IDAsIDAsIDAsIDAgfTsKKworICAgIC8qIGdldCB0aGUgY2hhcmFjdGVyIG5hbWUgKi8KKyAgICBpZihwcm9wcy5uYW1lIT1OVUxMKSB7CisgICAgICAgIG5hbWVzWzBdPXByb3BzLm5hbWU7CisgICAgICAgIGxlbmd0aHNbMF09KGludDE2X3QpdXBydl9zdHJsZW4ocHJvcHMubmFtZSk7CisgICAgICAgIHBhcnNlTmFtZShuYW1lc1swXSwgbGVuZ3Roc1swXSk7CisgICAgfQorCisgICAgQ2hhclN0cmluZyBidWZmZXI7CisgICAgaWYocHJvcHMubmFtZUFsaWFzIT1OVUxMKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIE9ubHkgdXNlICJjb3JyZWN0aW9uIiBhbGlhc2VzIGZvciBub3csIGZyb20gVW5pY29kZSA2LjEgTmFtZUFsaWFzZXMudHh0IHdpdGggMyBmaWVsZHMgcGVyIGxpbmUuCisgICAgICAgICAqIFRPRE86IFdvcmsgb24gdGlja2V0ICM4OTYzIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSB0eXBlOmFsaWFzIHBhaXJzIHBlciBjaGFyYWN0ZXIuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBjaGFyICpjb3JyPXVwcnZfc3Ryc3RyKHByb3BzLm5hbWVBbGlhcywgImNvcnJlY3Rpb249Iik7CisgICAgICAgIGlmKGNvcnIhPU5VTEwpIHsKKyAgICAgICAgICAgIGNvcnIrPTExOyAgLy8gc2tpcCAiY29ycmVjdGlvbj0iCisgICAgICAgICAgICBjb25zdCBjaGFyICpsaW1pdD11cHJ2X3N0cmNocihjb3JyLCAnLCcpOworICAgICAgICAgICAgaWYobGltaXQhPU5VTEwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvcnIsIGxpbWl0LWNvcnIsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgbmFtZXNbM109YnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgICAgICBsZW5ndGhzWzNdPShpbnQxNl90KShsaW1pdC1jb3JyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmFtZXNbM109Y29ycjsKKyAgICAgICAgICAgICAgICBsZW5ndGhzWzNdPShpbnQxNl90KXVwcnZfc3RybGVuKGNvcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyc2VOYW1lKG5hbWVzWzNdLCBsZW5ndGhzWzNdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFkZExpbmUocHJvcHMuc3RhcnQsIG5hbWVzLCBsZW5ndGhzLCBMRU5HVEhPRihuYW1lcykpOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludDE2X3QgbGVuZ3RoKSB7CisgICAgaW50MTZfdCBzdGFydD0wLCBsaW1pdCwgd29yZExlbmd0aC8qLCBwcmV2U3RhcnQ9LTEqLzsKKyAgICBXb3JkICp3b3JkOworCisgICAgd2hpbGUoc3RhcnQ8bGVuZ3RoKSB7CisgICAgICAgIC8qIHNraXAgYW55ICJub2lzZSIgY2hhcmFjdGVycyAqLworICAgICAgICBsaW1pdD1za2lwTm9pc2UobmFtZSwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgIGlmKHN0YXJ0PGxpbWl0KSB7CisgICAgICAgICAgICAvKnByZXZTdGFydD0tMTsqLworICAgICAgICAgICAgc3RhcnQ9bGltaXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3RhcnQ9PWxlbmd0aCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgYSB3b3JkIGFuZCBhZGQgaXQgaWYgaXQgaXMgbG9uZ2VyIHRoYW4gMSAqLworICAgICAgICBsaW1pdD1nZXRXb3JkKG5hbWUsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICB3b3JkTGVuZ3RoPShpbnQxNl90KShsaW1pdC1zdGFydCk7CisgICAgICAgIGlmKHdvcmRMZW5ndGg+MSkgeworICAgICAgICAgICAgd29yZD1maW5kV29yZChuYW1lK3N0YXJ0LCB3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmKHdvcmQ9PU5VTEwpIHsKKyAgICAgICAgICAgICAgICB3b3JkPWFkZFdvcmQobmFtZStzdGFydCwgd29yZExlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudFdvcmQod29yZCk7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlcmUgd2FzIGEgd29yZCBiZWZvcmUgdGhpcworICAgICAgICAgKiAod2l0aCBubyBub2lzZSBpbiBiZXR3ZWVuKSwgdGhlbiBhZGQgdGhlIHBhaXIgb2Ygd29yZHMsIHRvbworICAgICAgICAgKi8KKyAgICAgICAgaWYocHJldlN0YXJ0IT0tMSkgeworICAgICAgICAgICAgd29yZExlbmd0aD1saW1pdC1wcmV2U3RhcnQ7CisgICAgICAgICAgICB3b3JkPWZpbmRXb3JkKG5hbWUrcHJldlN0YXJ0LCB3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmKHdvcmQ9PU5VTEwpIHsKKyAgICAgICAgICAgICAgICB3b3JkPWFkZFdvcmQobmFtZStwcmV2U3RhcnQsIHdvcmRMZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291bnRXb3JkKHdvcmQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvKnByZXZTdGFydD1zdGFydDsqLworICAgICAgICBzdGFydD1saW1pdDsKKyAgICB9Cit9CisKK3N0YXRpYyBVQm9vbAoraXNXb3JkQ2hhcihjaGFyIGMpIHsKKyAgICByZXR1cm4gKCdBJzw9YyAmJiBjPD0nSScpIHx8IC8qIEVCQ0RJQy1zYWZlIGNoZWNrIGZvciBsZXR0ZXJzICovCisgICAgICAgICAgICgnSic8PWMgJiYgYzw9J1InKSB8fAorICAgICAgICAgICAoJ1MnPD1jICYmIGM8PSdaJykgfHwKKworICAgICAgICAgICAoJzAnPD1jICYmIGM8PSc5Jyk7Cit9CisKK3N0YXRpYyBpbnQxNl90Citza2lwTm9pc2UoY29uc3QgY2hhciAqbGluZSwgaW50MTZfdCBzdGFydCwgaW50MTZfdCBsaW1pdCkgeworICAgIC8qIHNraXAgYW55dGhpbmcgdGhhdCBpcyBub3QgcGFydCBvZiBhIHdvcmQgaW4gdGhpcyBzZW5zZSAqLworICAgIHdoaWxlKHN0YXJ0PGxpbWl0ICYmICFpc1dvcmRDaGFyKGxpbmVbc3RhcnRdKSkgeworICAgICAgICArK3N0YXJ0OworICAgIH0KKworICAgIHJldHVybiBzdGFydDsKK30KKworc3RhdGljIGludDE2X3QKK2dldFdvcmQoY29uc3QgY2hhciAqbGluZSwgaW50MTZfdCBzdGFydCwgaW50MTZfdCBsaW1pdCkgeworICAgIGNoYXIgYz0wOyAvKiBpbml0aWFsaXplIHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZyBhbHRob3VnaCB0aGUgY29kZSB3YXMgc2FmZSAqLworCisgICAgLyogYSB1bmljb2RlIGNoYXJhY3RlciBuYW1lIHdvcmQgY29uc2lzdHMgb2YgQS1aMC05ICovCisgICAgd2hpbGUoc3RhcnQ8bGltaXQgJiYgaXNXb3JkQ2hhcihsaW5lW3N0YXJ0XSkpIHsKKyAgICAgICAgKytzdGFydDsKKyAgICB9CisKKyAgICAvKiBpbmNsdWRlIGEgZm9sbG93aW5nIHNwYWNlIG9yIGRhc2ggKi8KKyAgICBpZihzdGFydDxsaW1pdCAmJiAoKGM9bGluZVtzdGFydF0pPT0nICcgfHwgYz09Jy0nKSkgeworICAgICAgICArK3N0YXJ0OworICAgIH0KKworICAgIHJldHVybiBzdGFydDsKK30KKwordm9pZAorTmFtZXNQcm9wc0J1aWxkZXI6OnNldEFsZ05hbWVzUmFuZ2UoVUNoYXIzMiBzdGFydCwgVUNoYXIzMiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJlZml4LCAgLy8gbnVtYmVyIG9mIGhleCBkaWdpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIC8qIG1vZHVsbyBmYWN0b3JzLCBtYXhpbXVtIDggKi8KKyAgICAvKiAzIGZhY3RvcnM6IDE5LCAyMSwgMjgsIG1vc3QtdG8tbGVhc3Qtc2lnbmlmaWNhbnQgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgaGFuZ3VsRmFjdG9yc1szXT17CisgICAgICAgIDE5LCAyMSwgMjgKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgamFtb1tdPQorICAgICAgICAiSEFOR1VMIFNZTExBQkxFIFwwIgorCisgICAgICAgICJHXDBHR1wwTlwwRFwwRERcMFJcME1cMEJcMEJCXDAiCisgICAgICAgICJTXDBTU1wwXDBKXDBKSlwwQ1wwS1wwVFwwUFwwSFwwIgorCisgICAgICAgICJBXDBBRVwwWUFcMFlBRVwwRU9cMEVcMFlFT1wwWUVcME9cMCIKKyAgICAgICAgIldBXDBXQUVcME9FXDBZT1wwVVwwV0VPXDBXRVwwV0lcMCIKKyAgICAgICAgIllVXDBFVVwwWUlcMElcMCIKKworICAgICAgICAiXDBHXDBHR1wwR1NcME5cME5KXDBOSFwwRFwwTFwwTEdcMExNXDAiCisgICAgICAgICJMQlwwTFNcMExUXDBMUFwwTEhcME1cMEJcMEJTXDAiCisgICAgICAgICJTXDBTU1wwTkdcMEpcMENcMEtcMFRcMFBcMEgiOworCisgICAgaW50MzJfdCBwcmVmaXhMZW5ndGg9MDsKKyAgICBBbGdvcml0aG1pY1JhbmdlIHJhbmdlOworICAgIHVwcnZfbWVtc2V0KCZyYW5nZSwgMCwgc2l6ZW9mKEFsZ29yaXRobWljUmFuZ2UpKTsKKyAgICBpbnQzMl90IHJhbmdlU2l6ZT0oaW50MzJfdClzaXplb2YoQWxnb3JpdGhtaWNSYW5nZSk7CisgICAgcmFuZ2Uuc3RhcnQ9c3RhcnQ7CisgICAgcmFuZ2UuZW5kPWVuZDsKKyAgICBpZigwPT11cHJ2X3N0cmNtcCh0eXBlLCAiaGFuIikpIHsKKyAgICAgICAgcmFuZ2UudHlwZT0wOworICAgICAgICByYW5nZS52YXJpYW50PSBlbmQ8PTB4ZmZmZiA/IDQgOiA1OworICAgICAgICBwcmVmaXhMZW5ndGg9dXBydl9zdHJsZW4ocHJlZml4KSsxOworICAgICAgICByYW5nZVNpemUrPXByZWZpeExlbmd0aDsKKyAgICB9IGVsc2UgaWYoMD09dXBydl9zdHJjbXAodHlwZSwgImhhbmd1bCIpKSB7CisgICAgICAgIHJhbmdlLnR5cGU9MTsKKyAgICAgICAgcmFuZ2UudmFyaWFudD0odWludDhfdClMRU5HVEhPRihoYW5ndWxGYWN0b3JzKTsKKyAgICAgICAgcmFuZ2VTaXplKz0oaW50MzJfdClzaXplb2YoaGFuZ3VsRmFjdG9ycyk7CisgICAgICAgIHJhbmdlU2l6ZSs9KGludDMyX3Qpc2l6ZW9mKGphbW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IHVua25vd24gYWxnbmFtZXNyYW5nZSB0eXBlICclcydcbiIsIHByZWZpeCk7CisgICAgICAgIGVycm9yQ29kZT1VX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBwYWRkaW5nTGVuZ3RoPXBhZGRpbmdMZW5ndGg9cmFuZ2VTaXplJjM7CisgICAgaWYocGFkZGluZ0xlbmd0aCkgeworICAgICAgICBwYWRkaW5nTGVuZ3RoPTQtcGFkZGluZ0xlbmd0aDsKKyAgICAgICAgcmFuZ2VTaXplKz1wYWRkaW5nTGVuZ3RoOworICAgIH0KKyAgICByYW5nZS5zaXplPSh1aW50MTZfdClyYW5nZVNpemU7CisgICAgYWxnUmFuZ2VzLmFwcGVuZCgoY2hhciAqKSZyYW5nZSwgKGludDMyX3Qpc2l6ZW9mKEFsZ29yaXRobWljUmFuZ2UpLCBlcnJvckNvZGUpOworICAgIGlmKHJhbmdlLnR5cGU9PTApIHsgIC8vIGhhbgorICAgICAgICBhbGdSYW5nZXMuYXBwZW5kKHByZWZpeCwgcHJlZml4TGVuZ3RoLCBlcnJvckNvZGUpOworICAgIH0gZWxzZSAvKiB0eXBlPT0xICovIHsgIC8vIGhhbmd1bAorICAgICAgICBhbGdSYW5nZXMuYXBwZW5kKChjaGFyICopaGFuZ3VsRmFjdG9ycywgKGludDMyX3Qpc2l6ZW9mKGhhbmd1bEZhY3RvcnMpLCBlcnJvckNvZGUpOworICAgICAgICBhbGdSYW5nZXMuYXBwZW5kKGphbW8sIChpbnQzMl90KXNpemVvZihqYW1vKSwgZXJyb3JDb2RlKTsKKyAgICB9CisgICAgd2hpbGUocGFkZGluZ0xlbmd0aCkgeworICAgICAgICBhbGdSYW5nZXMuYXBwZW5kKChjaGFyKTB4YWEsIGVycm9yQ29kZSk7CisgICAgICAgIC0tcGFkZGluZ0xlbmd0aDsKKyAgICB9CisgICAgKytjb3VudEFsZ1JhbmdlczsKK30KKworLyogY29tcHJlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK2NvbXByZXNzKFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIHVpbnQzMl90IGksIGxldHRlckNvdW50OworICAgIGludDE2X3Qgd29yZE51bWJlcjsKKworICAgIC8qIHNvcnQgdGhlIHdvcmRzIGluIHJldmVyc2Ugb3JkZXIgYnkgd2VpZ2h0ICovCisgICAgdXBydl9zb3J0QXJyYXkod29yZHMsIHdvcmRDb3VudCwgc2l6ZW9mKFdvcmQpLAorICAgICAgICAgICAgICAgICAgIGNvbXBhcmVXb3JkcywgTlVMTCwgRkFMU0UsICZlcnJvckNvZGUpOworCisgICAgLyogcmVtb3ZlIHRoZSB3b3JkcyB0aGF0IGRvIG5vdCBzYXZlIGFueXRoaW5nICovCisgICAgd2hpbGUod29yZENvdW50PjAgJiYgd29yZHNbd29yZENvdW50LTFdLndlaWdodDwxKSB7CisgICAgICAgIC0td29yZENvdW50OworICAgIH0KKworICAgIC8qIGNvdW50IHRoZSBsZXR0ZXJzIGluIHRoZSB0b2tlbiByYW5nZSAqLworICAgIGxldHRlckNvdW50PTA7CisgICAgZm9yKGk9TEVBREJZVEVfTElNSVQ7IGk8MjU2OyArK2kpIHsKKyAgICAgICAgaWYodG9rZW5zW2ldPT0tMSkgeworICAgICAgICAgICAgKytsZXR0ZXJDb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwcmludGYoIm51bWJlciBvZiBsZXR0ZXJzIHVzZWQgaW4gdGhlIG5hbWVzOiAlZFxuIiwgKGludClsZXR0ZXJDb3VudCk7CisgICAgfQorCisgICAgLyogZG8gd2UgbmVlZCBkb3VibGUtYnl0ZSB0b2tlbnM/ICovCisgICAgaWYod29yZENvdW50K2xldHRlckNvdW50PD0yNTYpIHsKKyAgICAgICAgLyogbm8sIHNpbmdsZS1ieXRlIHRva2VucyBhcmUgZW5vdWdoICovCisgICAgICAgIGxlYWRCeXRlQ291bnQ9MDsKKyAgICAgICAgZm9yKGk9MCwgd29yZE51bWJlcj0wOyB3b3JkTnVtYmVyPChpbnQxNl90KXdvcmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZih0b2tlbnNbaV0hPS0xKSB7CisgICAgICAgICAgICAgICAgdG9rZW5zW2ldPXdvcmROdW1iZXI7CisgICAgICAgICAgICAgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigidG9rZW5zWzB4JTAzeF06IHdvcmQlOGxkIFwiJS4qc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpaSwgKGxvbmcpd29yZHNbd29yZE51bWJlcl0ud2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzW3dvcmROdW1iZXJdLmxlbmd0aCwgd29yZHNbd29yZE51bWJlcl0ucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrd29yZE51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b2tlbkNvdW50PWk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHRva2VucyB0aGF0IG5lZWQgdHdvIHRva2VuIGJ5dGVzCisgICAgICAgICAqIGdldCB0aGVpciB3ZWlnaHQgcmVkdWNlZCBieSB0aGVpciBjb3VudAorICAgICAgICAgKiBiZWNhdXNlIHRoZXkgc2F2ZSBsZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgdG9rZW5Db3VudD0yNTYtbGV0dGVyQ291bnQ7CisgICAgICAgIGZvcihpPXRva2VuQ291bnQ7IGk8d29yZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHdvcmRzW2ldLndlaWdodC09d29yZHNbaV0uY291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzb3J0IHRoZXNlIHdvcmRzIGluIHJldmVyc2Ugb3JkZXIgYnkgd2VpZ2h0ICovCisgICAgICAgIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgICAgIHVwcnZfc29ydEFycmF5KHdvcmRzK3Rva2VuQ291bnQsIHdvcmRDb3VudC10b2tlbkNvdW50LCBzaXplb2YoV29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlV29yZHMsIE5VTEwsIEZBTFNFLCAmZXJyb3JDb2RlKTsKKworICAgICAgICAvKiByZW1vdmUgdGhlIHdvcmRzIHRoYXQgZG8gbm90IHNhdmUgYW55dGhpbmcgKi8KKyAgICAgICAgd2hpbGUod29yZENvdW50PjAgJiYgd29yZHNbd29yZENvdW50LTFdLndlaWdodDwxKSB7CisgICAgICAgICAgICAtLXdvcmRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGhvdyBtYW55IHRva2VucyBhbmQgbGVhZCBieXRlcyBkbyB3ZSBoYXZlIG5vdz8gKi8KKyAgICAgICAgdG9rZW5Db3VudD13b3JkQ291bnQrbGV0dGVyQ291bnQrKExFQURCWVRFX0xJTUlULTEpOworICAgICAgICAvKgorICAgICAgICAgKiBhZGp1c3QgdXB3YXJkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGF0CisgICAgICAgICAqIGRvdWJsZS1ieXRlIHRva2VucyBtdXN0IG5vdAorICAgICAgICAgKiB1c2UgTkFNRV9TRVBBUkFUT1JfQ0hBUiBhcyBhIHNlY29uZCBieXRlCisgICAgICAgICAqLworICAgICAgICB0b2tlbkNvdW50Kz0odG9rZW5Db3VudC0yNTYrMjU0KS8yNTU7CisKKyAgICAgICAgbGVhZEJ5dGVDb3VudD0oaW50MTZfdCkodG9rZW5Db3VudD4+OCk7CisgICAgICAgIGlmKGxlYWRCeXRlQ291bnQ8TEVBREJZVEVfTElNSVQpIHsKKyAgICAgICAgICAgIC8qIGFkanVzdCBmb3IgdGhlIHJlYWwgbnVtYmVyIG9mIGxlYWQgYnl0ZXMgKi8KKyAgICAgICAgICAgIHRva2VuQ291bnQtPShMRUFEQllURV9MSU1JVC0xKS1sZWFkQnl0ZUNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbGltaXQgdGhlIG51bWJlciBvZiBsZWFkIGJ5dGVzICovCisgICAgICAgICAgICBsZWFkQnl0ZUNvdW50PUxFQURCWVRFX0xJTUlULTE7CisgICAgICAgICAgICB0b2tlbkNvdW50PUxFQURCWVRFX0xJTUlUKjI1NjsKKyAgICAgICAgICAgIHdvcmRDb3VudD10b2tlbkNvdW50LWxldHRlckNvdW50LShMRUFEQllURV9MSU1JVC0xKTsKKyAgICAgICAgICAgIC8qIGFkanVzdCBhZ2FpbiB0byBza2lwIGRvdWJsZS1ieXRlIHRva2VucyB3aXRoICc7JyAqLworICAgICAgICAgICAgd29yZENvdW50LT0odG9rZW5Db3VudC0yNTYrMjU0KS8yNTU7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdG9rZW4gMCB0byB3b3JkIDAgKi8KKyAgICAgICAgdG9rZW5zWzBdPTA7CisgICAgICAgIGlmKGJlVmVyYm9zZSkgeworICAgICAgICAgICAgcHJpbnRmKCJ0b2tlbnNbMHgwMDBdOiB3b3JkJThsZCBcIiUuKnNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcpd29yZHNbMF0ud2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICB3b3Jkc1swXS5sZW5ndGgsIHdvcmRzWzBdLnMpOworICAgICAgICB9CisgICAgICAgIHdvcmROdW1iZXI9MTsKKworICAgICAgICAvKiBzZXQgdGhlIGxlYWQgYnl0ZSB0b2tlbnMgKi8KKyAgICAgICAgZm9yKGk9MTsgKGludDE2X3QpaTw9bGVhZEJ5dGVDb3VudDsgKytpKSB7CisgICAgICAgICAgICB0b2tlbnNbaV09LTI7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdGhlIHRva2VucyAqLworICAgICAgICBmb3IoOyBpPDI1NjsgKytpKSB7CisgICAgICAgICAgICAvKiBpZiBzdG9yZTEwTmFtZXMgdGhlbiB0aGUgcGFyc2VyIHNldCB0b2tlbnNbTkFNRV9TRVBBUkFUT1JfQ0hBUl09LTEgKi8KKyAgICAgICAgICAgIGlmKHRva2Vuc1tpXSE9LTEpIHsKKyAgICAgICAgICAgICAgICB0b2tlbnNbaV09d29yZE51bWJlcjsKKyAgICAgICAgICAgICAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0b2tlbnNbMHglMDN4XTogd29yZCU4bGQgXCIlLipzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClpLCAobG9uZyl3b3Jkc1t3b3JkTnVtYmVyXS53ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNbd29yZE51bWJlcl0ubGVuZ3RoLCB3b3Jkc1t3b3JkTnVtYmVyXS5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKyt3b3JkTnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogY29udGludWUgYWJvdmUgMjU1IHdoZXJlIHRoZXJlIGFyZSBubyBsZXR0ZXJzICovCisgICAgICAgIGZvcig7ICh1aW50MzJfdCl3b3JkTnVtYmVyPHdvcmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZigoaSYweGZmKT09TkFNRV9TRVBBUkFUT1JfQ0hBUikgeworICAgICAgICAgICAgICAgIHRva2Vuc1tpXT0tMTsgLyogZG8gbm90IHVzZSBOQU1FX1NFUEFSQVRPUl9DSEFSIGFzIGEgc2Vjb25kIHRva2VuIGJ5dGUgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9rZW5zW2ldPXdvcmROdW1iZXI7CisgICAgICAgICAgICAgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigidG9rZW5zWzB4JTAzeF06IHdvcmQlOGxkIFwiJS4qc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpaSwgKGxvbmcpd29yZHNbd29yZE51bWJlcl0ud2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzW3dvcmROdW1iZXJdLmxlbmd0aCwgd29yZHNbd29yZE51bWJlcl0ucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrd29yZE51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b2tlbkNvdW50PWk7IC8qIHNob3VsZCBiZSBhbHJlYWR5IHRva2VuQ291bnQ9e2kgb3IgaSsxfSAqLworICAgIH0KKworICAgIGlmKCFiZVF1aWV0KSB7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIGxlYWQgYnl0ZXM6ICVkXG4iLCBsZWFkQnl0ZUNvdW50KTsKKyAgICAgICAgcHJpbnRmKCJudW1iZXIgb2Ygc2luZ2xlLWJ5dGUgdG9rZW5zOiAlbHVcbiIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZykyNTYtbGV0dGVyQ291bnQtbGVhZEJ5dGVDb3VudCk7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIHRva2VuczogJWx1XG4iLCAodW5zaWduZWQgbG9uZyl0b2tlbkNvdW50KTsKKyAgICB9CisKKyAgICBjb21wcmVzc0xpbmVzKCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb21wcmVzc0xpbmVzKCkgeworICAgIExpbmUgKmxpbmU9TlVMTDsKKyAgICB1aW50MzJfdCBpPTAsIGluTGluZSwgb3V0TGluZT0weGZmZmZmZmZmIC8qICh1aW50MzJfdCkoLTEpICovLAorICAgICAgICAgICAgIGdyb3VwTVNCPTB4ZmZmZiwgbGluZUNvdW50MjsKKyAgICBpbnQxNl90IGdyb3VwVG9wPTA7CisKKyAgICAvKiBzdG9yZSB0aGUgZ3JvdXBzIGxpa2UgbGluZXMsIHdpdGggY29tcHJlc3NlZCBkYXRhIGFmdGVyIHJhdyBzdHJpbmdzICovCisgICAgZ3JvdXBCb3R0b209bGluZVRvcDsKKyAgICBsaW5lQ291bnQyPWxpbmVDb3VudDsKKyAgICBsaW5lQ291bnQ9MDsKKworICAgIC8qIGxvb3Agb3ZlciBhbGwgbGluZXMgKi8KKyAgICB3aGlsZShpPGxpbmVDb3VudDIpIHsKKyAgICAgICAgbGluZT1saW5lcytpKys7CisgICAgICAgIGluTGluZT1saW5lLT5jb2RlOworCisgICAgICAgIC8qIHNlZ21lbnQgdGhlIGxpbmVzIHRvIGdyb3VwcyBvZiAzMiAqLworICAgICAgICBpZihpbkxpbmU+PkdST1VQX1NISUZUIT1ncm91cE1TQikgeworICAgICAgICAgICAgLyogZmluaXNoIHRoZSBjdXJyZW50IGdyb3VwIHdpdGggZW1wdHkgbGluZXMgKi8KKyAgICAgICAgICAgIHdoaWxlKCgrK291dExpbmUmR1JPVVBfTUFTSykhPTApIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTGVuZ3RoKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZ3JvdXAgbGlrZSBhIGxpbmUgKi8KKyAgICAgICAgICAgIGlmKGdyb3VwVG9wPjApIHsKKyAgICAgICAgICAgICAgICBpZihncm91cFRvcD5HUk9VUF9TVE9SRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IGdyb3VwIHN0b3JlIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZEdyb3VwKGdyb3VwTVNCLCBncm91cFN0b3JlLCBncm91cFRvcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHN0YXJ0IHRoZSBuZXcgZ3JvdXAgKi8KKyAgICAgICAgICAgIGxpbmVMZW5ndGhzVG9wPTA7CisgICAgICAgICAgICBncm91cFRvcD0wOworICAgICAgICAgICAgZ3JvdXBNU0I9aW5MaW5lPj5HUk9VUF9TSElGVDsKKyAgICAgICAgICAgIG91dExpbmU9KGluTGluZSZ+R1JPVVBfTUFTSyktMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdyaXRlIGVtcHR5IGxpbmVzIGJldHdlZW4gdGhlIHByZXZpb3VzIGxpbmUgaW4gdGhlIGdyb3VwIGFuZCB0aGlzIG9uZSAqLworICAgICAgICB3aGlsZSgrK291dExpbmU8aW5MaW5lKSB7CisgICAgICAgICAgICBhcHBlbmRMaW5lTGVuZ3RoKDApOworICAgICAgICB9CisKKyAgICAgICAgLyogd3JpdGUgY2hhcmFjdGVycyBhbmQgdG9rZW5zIGZvciB0aGlzIGxpbmUgKi8KKyAgICAgICAgYXBwZW5kTGluZUxlbmd0aChjb21wcmVzc0xpbmUobGluZS0+cywgbGluZS0+bGVuZ3RoLCAmZ3JvdXBUb3ApKTsKKyAgICB9CisKKyAgICAvKiBmaW5pc2ggYW5kIHN0b3JlIHRoZSBsYXN0IGdyb3VwICovCisgICAgaWYobGluZSAmJiBncm91cE1TQiE9MHhmZmZmKSB7CisgICAgICAgIC8qIGZpbmlzaCB0aGUgY3VycmVudCBncm91cCB3aXRoIGVtcHR5IGxpbmVzICovCisgICAgICAgIHdoaWxlKCgrK291dExpbmUmR1JPVVBfTUFTSykhPTApIHsKKyAgICAgICAgICAgIGFwcGVuZExpbmVMZW5ndGgoMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdG9yZSB0aGUgZ3JvdXAgbGlrZSBhIGxpbmUgKi8KKyAgICAgICAgaWYoZ3JvdXBUb3A+MCkgeworICAgICAgICAgICAgaWYoZ3JvdXBUb3A+R1JPVVBfU1RPUkVfU0laRSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IGdyb3VwIHN0b3JlIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZEdyb3VwKGdyb3VwTVNCLCBncm91cFN0b3JlLCBncm91cFRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwcmludGYoIm51bWJlciBvZiBncm91cHM6ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpbGluZUNvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQxNl90Citjb21wcmVzc0xpbmUodWludDhfdCAqcywgaW50MTZfdCBsZW5ndGgsIGludDE2X3QgKnBHcm91cFRvcCkgeworICAgIGludDE2X3Qgc3RhcnQsIGxpbWl0LCB0b2tlbiwgZ3JvdXBUb3A9KnBHcm91cFRvcDsKKworICAgIHN0YXJ0PTA7CisgICAgZG8geworICAgICAgICAvKiB3cml0ZSBhbnkgIm5vaXNlIiBjaGFyYWN0ZXJzICovCisgICAgICAgIGxpbWl0PXNraXBOb2lzZSgoY2hhciAqKXMsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICB3aGlsZShzdGFydDxsaW1pdCkgeworICAgICAgICAgICAgZ3JvdXBTdG9yZVtncm91cFRvcCsrXT1zW3N0YXJ0KytdOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3RhcnQ9PWxlbmd0aCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiB3cml0ZSBhIHdvcmQsIGFzIHRva2VuIG9yIGRpcmVjdGx5ICovCisgICAgICAgIGxpbWl0PWdldFdvcmQoKGNoYXIgKilzLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgaWYobGltaXQtc3RhcnQ9PTEpIHsKKyAgICAgICAgICAgIGdyb3VwU3RvcmVbZ3JvdXBUb3ArK109c1tzdGFydCsrXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRva2VuPWZpbmRUb2tlbihzK3N0YXJ0LCAoaW50MTZfdCkobGltaXQtc3RhcnQpKTsKKyAgICAgICAgICAgIGlmKHRva2VuIT0tMSkgeworICAgICAgICAgICAgICAgIGlmKHRva2VuPjB4ZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBTdG9yZVtncm91cFRvcCsrXT0odWludDhfdCkodG9rZW4+PjgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncm91cFN0b3JlW2dyb3VwVG9wKytdPSh1aW50OF90KXRva2VuOworICAgICAgICAgICAgICAgIHN0YXJ0PWxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZShzdGFydDxsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBncm91cFN0b3JlW2dyb3VwVG9wKytdPXNbc3RhcnQrK107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZShzdGFydDxsZW5ndGgpOworCisgICAgbGVuZ3RoPShpbnQxNl90KShncm91cFRvcC0qcEdyb3VwVG9wKTsKKyAgICAqcEdyb3VwVG9wPWdyb3VwVG9wOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQzMl90Citjb21wYXJlV29yZHMoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqd29yZDEsIGNvbnN0IHZvaWQgKndvcmQyKSB7CisgICAgLyogcmV2ZXJzZSBzb3J0IGJ5IHdvcmQgd2VpZ2h0ICovCisgICAgcmV0dXJuICgoV29yZCAqKXdvcmQyKS0+d2VpZ2h0LSgoV29yZCAqKXdvcmQxKS0+d2VpZ2h0OworfQorCit2b2lkCitOYW1lc1Byb3BzQnVpbGRlcjo6YnVpbGQoVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsgcmV0dXJuOyB9CisKKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwdXRzKCIqIHVuYW1lcy5pY3Ugc3RhdHMgKiIpOworICAgICAgICBwcmludGYoInNpemUgb2YgYWxsIG5hbWVzIGluIHRoZSBkYXRhYmFzZTogJWx1XG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbGluZVRvcCk7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIG5hbWVkIFVuaWNvZGUgY2hhcmFjdGVyczogJWx1XG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbGluZUNvdW50KTsKKyAgICAgICAgcHJpbnRmKCJudW1iZXIgb2Ygd29yZHMgaW4gdGhlIGRpY3Rpb25hcnkgZnJvbSB0aGVzZSBuYW1lczogJWx1XG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpd29yZENvdW50KTsKKyAgICB9CisgICAgY29tcHJlc3MoZXJyb3JDb2RlKTsKK30KKworLyogZ2VuZXJhdGUgb3V0cHV0IGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorTmFtZXNQcm9wc0J1aWxkZXI6OndyaXRlQmluYXJ5RGF0YShjb25zdCBjaGFyICpwYXRoLCBVQm9vbCB3aXRoQ29weXJpZ2h0LCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKworICAgIFVOZXdEYXRhTWVtb3J5ICpwRGF0YT11ZGF0YV9jcmVhdGUocGF0aCwgImljdSIsICJ1bmFtZXMiLCAmZGF0YUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ29weXJpZ2h0ID8gVV9DT1BZUklHSFRfU1RSSU5HIDogTlVMTCwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogdWRhdGFfY3JlYXRlKCVzLCB1bmFtZXMuaWN1KSBmYWlsZWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICBwYXRoLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQxNl90IGdyb3VwV29yZHNbM107CisgICAgdWludDMyX3QgaSwgZ3JvdXBUb3A9bGluZVRvcCwgc2l6ZSwKKyAgICAgICAgICAgICB0b2tlblN0cmluZ09mZnNldCwgZ3JvdXBzT2Zmc2V0LCBncm91cFN0cmluZ09mZnNldCwgYWxnTmFtZXNPZmZzZXQ7CisgICAgbG9uZyBkYXRhTGVuZ3RoOworICAgIGludDE2X3QgdG9rZW47CisKKyAgICAvKiBmaXJzdCwgc2VlIGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQsIGFuZCBwcmVwYXJlIHRoZSB0b2tlbiBzdHJpbmdzICovCisgICAgZm9yKGk9MDsgaTx0b2tlbkNvdW50OyArK2kpIHsKKyAgICAgICAgdG9rZW49dG9rZW5zW2ldOworICAgICAgICBpZih0b2tlbiE9LTEgJiYgdG9rZW4hPS0yKSB7CisgICAgICAgICAgICB0b2tlbnNbaV09KGludDE2X3QpKGFkZFRva2VuKHdvcmRzW3Rva2VuXS5zLCB3b3Jkc1t0b2tlbl0ubGVuZ3RoKS1ncm91cFRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlcXVpcmVkIHBhZGRpbmcgZm9yIGRhdGEgc3dhcHBpbmc6CisgICAgICogVGhlIHRva2VuIHRhYmxlIHVuZGVyZ29lcyBhIHBlcm11dGF0aW9uIGR1cmluZyBkYXRhIHN3YXBwaW5nIHdoZW4gdGhlCisgICAgICogaW5wdXQgYW5kIG91dHB1dCBjaGFyc2V0cyBhcmUgZGlmZmVyZW50LgorICAgICAqIFRoZSB0b2tlbiB0YWJsZSBjYW5ub3QgZ3JvdyBkdXJpbmcgc3dhcHBpbmcsIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiB0aGUgdGFibGUgaXMgbG9uZyBlbm91Z2ggZm9yIHN1Y2Nlc3NmdWwgaW4tcGxhY2UgcGVybXV0YXRpb24uCisgICAgICoKKyAgICAgKiBXZSBzaW1wbHkgcm91bmQgdXAgdG9rZW5Db3VudCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiAyNTYgdG8gYWNjb3VudCBmb3IKKyAgICAgKiBhbGwgcG9zc2libGUgcGVybXV0YXRpb25zLgorICAgICAqCisgICAgICogQW4gb3B0aW1pemF0aW9uIGlzIHBvc3NpYmxlIGlmIHdlIG9ubHkgZXZlciBzd2FwIGJldHdlZW4gQVNDSUkgYW5kIEVCQ0RJQzoKKyAgICAgKgorICAgICAqIElmIHRva2VuQ291bnQ+MjU2LCB0aGVuIGEgc2VtaWNvbG9uIChOQU1FX1NFUEFSQVRPUl9DSEFSKSBpcyB1c2VkCisgICAgICogYW5kIHdpbGwgYmUgc3dhcHBlZCBiZXR3ZWVuIEFTQ0lJIGFuZCBFQkNESUMgYmV0d2VlbgorICAgICAqIHBvc2l0aW9ucyAweDNiIChBU0NJSSBzZW1pY29sb24pIGFuZCAweDVlIChFQkNESUMgc2VtaWNvbG9uKS4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSB0aGUgb25seSAtMSBlbnRyeSBpbiB0b2tlbnNbMjU2Li41MTFdIG9uIHdoaWNoIHRoZSBkYXRhCisgICAgICogc3dhcHBlciBiYXNlcyBpdHMgdHJhaWwgYnl0ZSBwZXJtdXRhdGlvbiBtYXAgKHRyYWlsTWFwW10pLgorICAgICAqCisgICAgICogSXQgd291bGQgYmUgc3VmZmljaWVudCB0byBpbmNyZWFzZSB0b2tlbkNvdW50IHNvIHRoYXQgaXRzIGxvd2VyIDggYml0cworICAgICAqIGFyZSBhdCBsZWFzdCAweDVlKzEgdG8gbWFrZSByb29tIGZvciBzd2FwcGluZyBiZXR3ZWVuIHRoZSB0d28gc2VtaWNvbG9ucy4KKyAgICAgKiBGb3IgdmFsdWVzIGhpZ2hlciB0aGFuIDB4NWUsIHRoZSB0cmFpbCBieXRlIHBlcm11dGF0aW9uIG1hcCAodHJhaWxNYXBbXSkKKyAgICAgKiBzaG91bGQgYWx3YXlzIGJlIGFuIGlkZW50aXR5IG1hcCwgd2hlcmUgd2UgZG8gbm90IG5lZWQgYWRkaXRpb25hbCByb29tLgorICAgICAqLworICAgIGk9dG9rZW5Db3VudDsKKyAgICB0b2tlbkNvdW50PSh0b2tlbkNvdW50KzB4ZmYpJn4weGZmOworICAgIGlmKCFiZVF1aWV0ICYmIGk8dG9rZW5Db3VudCkgeworICAgICAgICBwcmludGYoIm51bWJlciBvZiB0b2tlbnNbXSBwYWRkaW5nIGVudHJpZXMgZm9yIGRhdGEgc3dhcHBpbmc6ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpKHRva2VuQ291bnQtaSkpOworICAgIH0KKyAgICBmb3IoOyBpPHRva2VuQ291bnQ7ICsraSkgeworICAgICAgICBpZigoaSYweGZmKT09TkFNRV9TRVBBUkFUT1JfQ0hBUikgeworICAgICAgICAgICAgdG9rZW5zW2ldPS0xOyAvKiBkbyBub3QgdXNlIE5BTUVfU0VQQVJBVE9SX0NIQVIgYXMgYSBzZWNvbmQgdG9rZW4gYnl0ZSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9rZW5zW2ldPTA7IC8qIHVudXNlZCB0b2tlbiBmb3IgcGFkZGluZyAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgaW5jbHVkaW5nOgorICAgICAqIC0gdGhlIG9mZnNldCB0byB0aGUgdG9rZW4gc3RyaW5ncywgdWludDMyX3QgKDQpCisgICAgICogLSB0aGUgb2Zmc2V0IHRvIHRoZSBncm91cCB0YWJsZSwgdWludDMyX3QgKDQpCisgICAgICogLSB0aGUgb2Zmc2V0IHRvIHRoZSBncm91cCBzdHJpbmdzLCB1aW50MzJfdCAoNCkKKyAgICAgKiAtIHRoZSBvZmZzZXQgdG8gdGhlIGFsZ29yaXRobWljIG5hbWVzLCB1aW50MzJfdCAoNCkKKyAgICAgKgorICAgICAqIC0gdGhlIG51bWJlciBvZiB0b2tlbnMsIHVpbnQxNl90ICgyKQorICAgICAqIC0gdGhlIHRva2VuIHRhYmxlLCB1aW50MTZfdFt0b2tlbkNvdW50XSAoMip0b2tlbkNvdW50KQorICAgICAqCisgICAgICogLSB0aGUgdG9rZW4gc3RyaW5ncywgZWFjaCB6ZXJvLXRlcm1pbmF0ZWQgKHRva2VuU2l6ZT0obGluZVRvcC1ncm91cFRvcCkpLCAyLXBhZGRlZAorICAgICAqCisgICAgICogLSB0aGUgbnVtYmVyIG9mIGdyb3VwcywgdWludDE2X3QgKDIpCisgICAgICogLSB0aGUgZ3JvdXAgdGFibGUsIHsgdWludDE2X3QgZ3JvdXBNU0IsIHVpbnQxNl90IG9mZnNldEhpZ2gsIHVpbnQxNl90IG9mZnNldExvdyB9WzYqZ3JvdXBDb3VudF0KKyAgICAgKgorICAgICAqIC0gdGhlIGdyb3VwIHN0cmluZ3MgKGdyb3VwVG9wLWdyb3VwQm90dG9tKSwgMi1wYWRkZWQKKyAgICAgKgorICAgICAqIC0gdGhlIHNpemUgb2YgdGhlIGRhdGEgZm9yIHRoZSBhbGdvcml0aG1pYyBuYW1lcworICAgICAqLworICAgIHRva2VuU3RyaW5nT2Zmc2V0PTQrNCs0KzQrMisyKnRva2VuQ291bnQ7CisgICAgZ3JvdXBzT2Zmc2V0PSh0b2tlblN0cmluZ09mZnNldCsobGluZVRvcC1ncm91cFRvcCkrMSkmfjE7CisgICAgZ3JvdXBTdHJpbmdPZmZzZXQ9Z3JvdXBzT2Zmc2V0KzIrNipsaW5lQ291bnQ7CisgICAgYWxnTmFtZXNPZmZzZXQ9KGdyb3VwU3RyaW5nT2Zmc2V0Kyhncm91cFRvcC1ncm91cEJvdHRvbSkrMykmfjM7CisKKyAgICBzaXplPWFsZ05hbWVzT2Zmc2V0KzQrYWxnUmFuZ2VzLmxlbmd0aCgpOworCisgICAgaWYoIWJlUXVpZXQpIHsKKyAgICAgICAgcHJpbnRmKCJzaXplIG9mIHRoZSBVbmljb2RlIE5hbWVzIGRhdGE6XG4iCisgICAgICAgICAgICAgICAidG90YWwgZGF0YSBsZW5ndGggJWx1LCB0b2tlbiBzdHJpbmdzICVsdSwgY29tcHJlc3NlZCBzdHJpbmdzICVsdSwgYWxnb3JpdGhtaWMgbmFtZXMgJWx1XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNpemUsICh1bnNpZ25lZCBsb25nKShsaW5lVG9wLWdyb3VwVG9wKSwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoZ3JvdXBUb3AtZ3JvdXBCb3R0b20pLCAodW5zaWduZWQgbG9uZykoNCthbGdSYW5nZXMubGVuZ3RoKCkpKTsKKyAgICB9CisKKyAgICAvKiB3cml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZSAqLworICAgIC8qIG9mZnNldHMgKi8KKyAgICB1ZGF0YV93cml0ZTMyKHBEYXRhLCB0b2tlblN0cmluZ09mZnNldCk7CisgICAgdWRhdGFfd3JpdGUzMihwRGF0YSwgZ3JvdXBzT2Zmc2V0KTsKKyAgICB1ZGF0YV93cml0ZTMyKHBEYXRhLCBncm91cFN0cmluZ09mZnNldCk7CisgICAgdWRhdGFfd3JpdGUzMihwRGF0YSwgYWxnTmFtZXNPZmZzZXQpOworCisgICAgLyogdG9rZW4gdGFibGUgKi8KKyAgICB1ZGF0YV93cml0ZTE2KHBEYXRhLCAodWludDE2X3QpdG9rZW5Db3VudCk7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgdG9rZW5zLCAyKnRva2VuQ291bnQpOworCisgICAgLyogdG9rZW4gc3RyaW5ncyAqLworICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIHN0cmluZ1N0b3JlK2dyb3VwVG9wLCBsaW5lVG9wLWdyb3VwVG9wKTsKKyAgICBpZigobGluZVRvcC1ncm91cFRvcCkmMSkgeworICAgICAgICAvKiAyLXBhZGRpbmcgKi8KKyAgICAgICAgdWRhdGFfd3JpdGVQYWRkaW5nKHBEYXRhLCAxKTsKKyAgICB9CisKKyAgICAvKiBncm91cCB0YWJsZSAqLworICAgIHVkYXRhX3dyaXRlMTYocERhdGEsICh1aW50MTZfdClsaW5lQ291bnQpOworICAgIGZvcihpPTA7IGk8bGluZUNvdW50OyArK2kpIHsKKyAgICAgICAgLyogZ3JvdXBNU0IgKi8KKyAgICAgICAgZ3JvdXBXb3Jkc1swXT0odWludDE2X3QpbGluZXNbaV0uY29kZTsKKworICAgICAgICAvKiBvZmZzZXQgKi8KKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gKHVpbnQzMl90KSgobGluZXNbaV0ucyAtIHN0cmluZ1N0b3JlKS1ncm91cEJvdHRvbSk7CisgICAgICAgIGdyb3VwV29yZHNbMV09KHVpbnQxNl90KShvZmZzZXQ+PjE2KTsKKyAgICAgICAgZ3JvdXBXb3Jkc1syXT0odWludDE2X3QpKG9mZnNldCk7CisgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGdyb3VwV29yZHMsIDYpOworICAgIH0KKworICAgIC8qIGdyb3VwIHN0cmluZ3MgKi8KKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBzdHJpbmdTdG9yZStncm91cEJvdHRvbSwgZ3JvdXBUb3AtZ3JvdXBCb3R0b20pOworCisgICAgLyogNC1hbGlnbiB0aGUgYWxnb3JpdGhtaWMgbmFtZXMgZGF0YSAqLworICAgIHVkYXRhX3dyaXRlUGFkZGluZyhwRGF0YSwgYWxnTmFtZXNPZmZzZXQtKGdyb3VwU3RyaW5nT2Zmc2V0Kyhncm91cFRvcC1ncm91cEJvdHRvbSkpKTsKKworICAgIHVkYXRhX3dyaXRlMzIocERhdGEsIGNvdW50QWxnUmFuZ2VzKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBhbGdSYW5nZXMuZGF0YSgpLCBhbGdSYW5nZXMubGVuZ3RoKCkpOworCisgICAgLyogZmluaXNoIHVwICovCisgICAgZGF0YUxlbmd0aD11ZGF0YV9maW5pc2gocERhdGEsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IGVycm9yICVkIHdyaXRpbmcgdGhlIG91dHB1dCBmaWxlXG4iLCBlcnJvckNvZGUpOworICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgfQorCisgICAgaWYoZGF0YUxlbmd0aCE9KGxvbmcpc2l6ZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzOiBkYXRhIGxlbmd0aCAlbGQgIT0gY2FsY3VsYXRlZCBzaXplICVsdVxuIiwKK2RhdGFMZW5ndGgsICh1bnNpZ25lZCBsb25nKXNpemUpOworICAgICAgICBleGl0KFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUik7CisgICAgfQorfQorCisvKiBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50MTZfdAorZmluZFRva2VuKHVpbnQ4X3QgKnMsIGludDE2X3QgbGVuZ3RoKSB7CisgICAgaW50MTZfdCBpLCB0b2tlbjsKKworICAgIGZvcihpPTA7IGk8KGludDE2X3QpdG9rZW5Db3VudDsgKytpKSB7CisgICAgICAgIHRva2VuPXRva2Vuc1tpXTsKKyAgICAgICAgaWYodG9rZW4+PTAgJiYgbGVuZ3RoPT13b3Jkc1t0b2tlbl0ubGVuZ3RoICYmIDA9PXVwcnZfbWVtY21wKHMsIHdvcmRzW3Rva2VuXS5zLCBsZW5ndGgpKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIFdvcmQgKgorZmluZFdvcmQoY29uc3QgY2hhciAqcywgaW50MTZfdCBsZW5ndGgpIHsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yKGk9MDsgaTx3b3JkQ291bnQ7ICsraSkgeworICAgICAgICBpZihsZW5ndGg9PXdvcmRzW2ldLmxlbmd0aCAmJiAwPT11cHJ2X21lbWNtcChzLCB3b3Jkc1tpXS5zLCBsZW5ndGgpKSB7CisgICAgICAgICAgICByZXR1cm4gd29yZHMraTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgV29yZCAqCithZGRXb3JkKGNvbnN0IGNoYXIgKnMsIGludDE2X3QgbGVuZ3RoKSB7CisgICAgdWludDhfdCAqc3RyaW5nU3RhcnQ7CisgICAgV29yZCAqd29yZDsKKworICAgIGlmKHdvcmRDb3VudD09TUFYX1dPUkRfQ09VTlQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogdG9vIG1hbnkgd29yZHNcbiIpOworICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKKyAgICB9CisKKyAgICBzdHJpbmdTdGFydD1hbGxvY1dvcmQobGVuZ3RoKTsKKyAgICB1cHJ2X21lbWNweShzdHJpbmdTdGFydCwgcywgbGVuZ3RoKTsKKworICAgIHdvcmQ9d29yZHMrd29yZENvdW50OworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSB3ZWlnaHQgd2l0aCB0aGUgY29zdHMgZm9yIHRoaXMgdG9rZW46CisgICAgICogYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIGFuZCBhIDE2LWJpdCBvZmZzZXQuCisgICAgICovCisgICAgd29yZC0+d2VpZ2h0PS0obGVuZ3RoKzErMik7CisgICAgd29yZC0+Y291bnQ9MDsKKyAgICB3b3JkLT5sZW5ndGg9bGVuZ3RoOworICAgIHdvcmQtPnM9c3RyaW5nU3RhcnQ7CisKKyAgICArK3dvcmRDb3VudDsKKworICAgIHJldHVybiB3b3JkOworfQorCitzdGF0aWMgdm9pZAorY291bnRXb3JkKFdvcmQgKndvcmQpIHsKKyAgICAvKiBhZGQgdG8gdGhlIHdlaWdodCB0aGUgc2F2aW5nczogdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBtaW51cyAxIGJ5dGUgZm9yIHRoZSB0b2tlbiAqLworICAgIHdvcmQtPndlaWdodCs9d29yZC0+bGVuZ3RoLTE7CisgICAgKyt3b3JkLT5jb3VudDsKK30KKworc3RhdGljIHZvaWQKK2FkZExpbmUoVUNoYXIzMiBjb2RlLCBjb25zdCBjaGFyICpuYW1lc1tdLCBpbnQxNl90IGxlbmd0aHNbXSwgaW50MTZfdCBjb3VudCkgeworICAgIHVpbnQ4X3QgKnN0cmluZ1N0YXJ0OworICAgIExpbmUgKmxpbmU7CisgICAgaW50MTZfdCBpLCBsZW5ndGg7CisKKyAgICBpZihsaW5lQ291bnQ9PU1BWF9MSU5FX0NPVU5UKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IHRvbyBtYW55IGxpbmVzXG4iKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorCisgICAgLyogZmluZCB0aGUgbGFzdCBub24tZW1wdHkgbmFtZSAqLworICAgIHdoaWxlKGNvdW50PjAgJiYgbGVuZ3Roc1tjb3VudC0xXT09MCkgeworICAgICAgICAtLWNvdW50OworICAgIH0KKyAgICBpZihjb3VudD09MCkgeworICAgICAgICByZXR1cm47IC8qIHNob3VsZCBub3Qgb2NjdXI6IGNhbGxlciBzaG91bGQgbm90IGhhdmUgY2FsbGVkICovCisgICAgfQorCisgICAgLyogdGhlcmUgd2lsbCBiZSAoY291bnQtMSkgc2VwYXJhdG9yIGNoYXJhY3RlcnMgKi8KKyAgICBpPWNvdW50OworICAgIGxlbmd0aD1jb3VudC0xOworCisgICAgLyogYWRkIGxlbmd0aHMgb2Ygc3RyaW5ncyAqLworICAgIHdoaWxlKGk+MCkgeworICAgICAgICBsZW5ndGgrPWxlbmd0aHNbLS1pXTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBsaW5lIG1lbW9yeSAqLworICAgIHN0cmluZ1N0YXJ0PWFsbG9jTGluZShsZW5ndGgpOworCisgICAgLyogY29weSBhbGwgc3RyaW5ncyBpbnRvIHRoZSBsaW5lIG1lbW9yeSAqLworICAgIGxlbmd0aD0wOyAvKiBudW1iZXIgb2YgY2hhcnMgY29waWVkIHNvIGZhciAqLworICAgIGZvcihpPTA7IGk8Y291bnQ7ICsraSkgeworICAgICAgICBpZihpPjApIHsKKyAgICAgICAgICAgIHN0cmluZ1N0YXJ0W2xlbmd0aCsrXT1OQU1FX1NFUEFSQVRPUl9DSEFSOworICAgICAgICB9CisgICAgICAgIGlmKGxlbmd0aHNbaV0+MCkgeworICAgICAgICAgICAgdXBydl9tZW1jcHkoc3RyaW5nU3RhcnQrbGVuZ3RoLCBuYW1lc1tpXSwgbGVuZ3Roc1tpXSk7CisgICAgICAgICAgICBsZW5ndGgrPWxlbmd0aHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsaW5lPWxpbmVzK2xpbmVDb3VudDsKKworICAgIGxpbmUtPmNvZGU9Y29kZTsKKyAgICBsaW5lLT5sZW5ndGg9bGVuZ3RoOworICAgIGxpbmUtPnM9c3RyaW5nU3RhcnQ7CisKKyAgICArK2xpbmVDb3VudDsKKworICAgIC8qIHByZXZlbnQgYSBjaGFyYWN0ZXIgdmFsdWUgdGhhdCBpcyBhY3R1YWxseSBpbiBhIG5hbWUgZnJvbSBiZWNvbWluZyBhIHRva2VuICovCisgICAgd2hpbGUobGVuZ3RoPjApIHsKKyAgICAgICAgdG9rZW5zW3N0cmluZ1N0YXJ0Wy0tbGVuZ3RoXV09LTE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkR3JvdXAodWludDMyX3QgZ3JvdXBNU0IsIHVpbnQ4X3QgKnN0cmluZ3MsIGludDE2X3QgbGVuZ3RoKSB7CisgICAgdWludDhfdCAqc3RyaW5nU3RhcnQ7CisgICAgTGluZSAqbGluZTsKKworICAgIGlmKGxpbmVDb3VudD09TUFYX0xJTkVfQ09VTlQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogdG9vIG1hbnkgZ3JvdXBzXG4iKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorCisgICAgLyogc3RvcmUgdGhlIGxpbmUgbGVuZ3RocyBmaXJzdCwgdGhlbiB0aGUgc3RyaW5ncyAqLworICAgIGxpbmVMZW5ndGhzVG9wPShsaW5lTGVuZ3Roc1RvcCsxKS8yOworICAgIHN0cmluZ1N0YXJ0PWFsbG9jTGluZShsaW5lTGVuZ3Roc1RvcCtsZW5ndGgpOworICAgIHVwcnZfbWVtY3B5KHN0cmluZ1N0YXJ0LCBsaW5lTGVuZ3RocywgbGluZUxlbmd0aHNUb3ApOworICAgIHVwcnZfbWVtY3B5KHN0cmluZ1N0YXJ0K2xpbmVMZW5ndGhzVG9wLCBzdHJpbmdzLCBsZW5ndGgpOworCisgICAgbGluZT1saW5lcytsaW5lQ291bnQ7CisKKyAgICBsaW5lLT5jb2RlPWdyb3VwTVNCOworICAgIGxpbmUtPmxlbmd0aD1sZW5ndGg7CisgICAgbGluZS0+cz1zdHJpbmdTdGFydDsKKworICAgICsrbGluZUNvdW50OworfQorCitzdGF0aWMgdWludDMyX3QKK2FkZFRva2VuKHVpbnQ4X3QgKnMsIGludDE2X3QgbGVuZ3RoKSB7CisgICAgdWludDhfdCAqc3RyaW5nU3RhcnQ7CisKKyAgICBzdHJpbmdTdGFydD1hbGxvY0xpbmUobGVuZ3RoKzEpOworICAgIHVwcnZfbWVtY3B5KHN0cmluZ1N0YXJ0LCBzLCBsZW5ndGgpOworICAgIHN0cmluZ1N0YXJ0W2xlbmd0aF09MDsKKworICAgIHJldHVybiAodWludDMyX3QpKHN0cmluZ1N0YXJ0IC0gc3RyaW5nU3RvcmUpOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kTGluZUxlbmd0aChpbnQxNl90IGxlbmd0aCkgeworICAgIGlmKGxlbmd0aD49NzYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogY29tcHJlc3NlZCBsaW5lIHRvbyBsb25nXG4iKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorICAgIGlmKGxlbmd0aD49MTIpIHsKKyAgICAgICAgbGVuZ3RoLT0xMjsKKyAgICAgICAgYXBwZW5kTGluZUxlbmd0aE5pYmJsZSgodWludDhfdCkoKGxlbmd0aD4+NCl8MTIpKTsKKyAgICB9CisgICAgYXBwZW5kTGluZUxlbmd0aE5pYmJsZSgodWludDhfdClsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kTGluZUxlbmd0aE5pYmJsZSh1aW50OF90IG5pYmJsZSkgeworICAgIGlmKChsaW5lTGVuZ3Roc1RvcCYxKT09MCkgeworICAgICAgICBsaW5lTGVuZ3Roc1tsaW5lTGVuZ3Roc1RvcC8yXT0odWludDhfdCkobmliYmxlPDw0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaW5lTGVuZ3Roc1tsaW5lTGVuZ3Roc1RvcC8yXXw9bmliYmxlJjB4ZjsKKyAgICB9CisgICAgKytsaW5lTGVuZ3Roc1RvcDsKK30KKworc3RhdGljIHVpbnQ4X3QgKgorYWxsb2NMaW5lKGludDMyX3QgbGVuZ3RoKSB7CisgICAgdWludDMyX3QgdG9wPWxpbmVUb3ArbGVuZ3RoOworICAgIHVpbnQ4X3QgKnA7CisKKyAgICBpZih0b3A+d29yZEJvdHRvbSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgZXhpdChVX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICB9CisgICAgcD1zdHJpbmdTdG9yZStsaW5lVG9wOworICAgIGxpbmVUb3A9dG9wOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgdWludDhfdCAqCithbGxvY1dvcmQodWludDMyX3QgbGVuZ3RoKSB7CisgICAgdWludDMyX3QgYm90dG9tPXdvcmRCb3R0b20tbGVuZ3RoOworCisgICAgaWYobGluZVRvcD5ib3R0b20pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgIGV4aXQoVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgfQorICAgIHdvcmRCb3R0b209Ym90dG9tOworICAgIHJldHVybiBzdHJpbmdTdG9yZStib3R0b207Cit9CisKK1Byb3BzQnVpbGRlciAqCitjcmVhdGVOYW1lc1Byb3BzQnVpbGRlcihVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm4gTlVMTDsgfQorICAgIFByb3BzQnVpbGRlciAqcGI9bmV3IE5hbWVzUHJvcHNCdWlsZGVyKGVycm9yQ29kZSk7CisgICAgaWYocGI9PU5VTEwpIHsKKyAgICAgICAgZXJyb3JDb2RlPVVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBwYjsKK30KKworLyoKKyAqIEhleSwgRW1hY3MsIHBsZWFzZSBzZXQgdGhlIGZvbGxvd2luZzoKKyAqCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqCisgKi8KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wcm9wcy9wbmFtZXNfZGF0YS5oIGIvdW5pY29kZS9jL2dlbnByb3BzL3BuYW1lc19kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5MzZmZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9wbmFtZXNfZGF0YS5oCkBAIC0wLDAgKzEsMTAwMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBtYWNoaW5lLWdlbmVyYXRlZCBieTogaWN1L3Rvb2xzL3VuaWNvZGUvcHkvcHJlcGFyc2V1Y2QucHkKKyAqLworCisjZGVmaW5lIFVOSUNPREVfVkVSU0lPTiB7IDYsIDEsIDAsIDAgfQorCitzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX2JpbnByb3BbMl0gPSB7CisgICAgVmFsdWUoMCwgIk4gTm8gRiBGYWxzZSIpLAorICAgIFZhbHVlKDEsICJZIFllcyBUIFRydWUiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfYmNbMTldID0geworICAgIFZhbHVlKFVfTEVGVF9UT19SSUdIVCwgIkwgTGVmdF9Ub19SaWdodCIpLAorICAgIFZhbHVlKFVfUklHSFRfVE9fTEVGVCwgIlIgUmlnaHRfVG9fTGVmdCIpLAorICAgIFZhbHVlKFVfRVVST1BFQU5fTlVNQkVSLCAiRU4gRXVyb3BlYW5fTnVtYmVyIiksCisgICAgVmFsdWUoVV9FVVJPUEVBTl9OVU1CRVJfU0VQQVJBVE9SLCAiRVMgRXVyb3BlYW5fU2VwYXJhdG9yIiksCisgICAgVmFsdWUoVV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUiwgIkVUIEV1cm9wZWFuX1Rlcm1pbmF0b3IiKSwKKyAgICBWYWx1ZShVX0FSQUJJQ19OVU1CRVIsICJBTiBBcmFiaWNfTnVtYmVyIiksCisgICAgVmFsdWUoVV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiwgIkNTIENvbW1vbl9TZXBhcmF0b3IiKSwKKyAgICBWYWx1ZShVX0JMT0NLX1NFUEFSQVRPUiwgIkIgUGFyYWdyYXBoX1NlcGFyYXRvciIpLAorICAgIFZhbHVlKFVfU0VHTUVOVF9TRVBBUkFUT1IsICJTIFNlZ21lbnRfU2VwYXJhdG9yIiksCisgICAgVmFsdWUoVV9XSElURV9TUEFDRV9ORVVUUkFMLCAiV1MgV2hpdGVfU3BhY2UiKSwKKyAgICBWYWx1ZShVX09USEVSX05FVVRSQUwsICJPTiBPdGhlcl9OZXV0cmFsIiksCisgICAgVmFsdWUoVV9MRUZUX1RPX1JJR0hUX0VNQkVERElORywgIkxSRSBMZWZ0X1RvX1JpZ2h0X0VtYmVkZGluZyIpLAorICAgIFZhbHVlKFVfTEVGVF9UT19SSUdIVF9PVkVSUklERSwgIkxSTyBMZWZ0X1RvX1JpZ2h0X092ZXJyaWRlIiksCisgICAgVmFsdWUoVV9SSUdIVF9UT19MRUZUX0FSQUJJQywgIkFMIEFyYWJpY19MZXR0ZXIiKSwKKyAgICBWYWx1ZShVX1JJR0hUX1RPX0xFRlRfRU1CRURESU5HLCAiUkxFIFJpZ2h0X1RvX0xlZnRfRW1iZWRkaW5nIiksCisgICAgVmFsdWUoVV9SSUdIVF9UT19MRUZUX09WRVJSSURFLCAiUkxPIFJpZ2h0X1RvX0xlZnRfT3ZlcnJpZGUiKSwKKyAgICBWYWx1ZShVX1BPUF9ESVJFQ1RJT05BTF9GT1JNQVQsICJQREYgUG9wX0RpcmVjdGlvbmFsX0Zvcm1hdCIpLAorICAgIFZhbHVlKFVfRElSX05PTl9TUEFDSU5HX01BUkssICJOU00gTm9uc3BhY2luZ19NYXJrIiksCisgICAgVmFsdWUoVV9CT1VOREFSWV9ORVVUUkFMLCAiQk4gQm91bmRhcnlfTmV1dHJhbCIpLAorfTsKKworc3RhdGljIGNvbnN0IFZhbHVlIFZBTFVFU19ibGtbMjIxXSA9IHsKKyAgICBWYWx1ZShVQkxPQ0tfTk9fQkxPQ0ssICJOQiBOb19CbG9jayIpLAorICAgIFZhbHVlKFVCTE9DS19CQVNJQ19MQVRJTiwgIkFTQ0lJIEJhc2ljX0xhdGluIiksCisgICAgVmFsdWUoVUJMT0NLX0xBVElOXzFfU1VQUExFTUVOVCwgIkxhdGluXzFfU3VwIExhdGluXzFfU3VwcGxlbWVudCBMYXRpbl8xIiksCisgICAgVmFsdWUoVUJMT0NLX0xBVElOX0VYVEVOREVEX0EsICJMYXRpbl9FeHRfQSBMYXRpbl9FeHRlbmRlZF9BIiksCisgICAgVmFsdWUoVUJMT0NLX0xBVElOX0VYVEVOREVEX0IsICJMYXRpbl9FeHRfQiBMYXRpbl9FeHRlbmRlZF9CIiksCisgICAgVmFsdWUoVUJMT0NLX0lQQV9FWFRFTlNJT05TLCAiSVBBX0V4dCBJUEFfRXh0ZW5zaW9ucyIpLAorICAgIFZhbHVlKFVCTE9DS19TUEFDSU5HX01PRElGSUVSX0xFVFRFUlMsICJNb2RpZmllcl9MZXR0ZXJzIFNwYWNpbmdfTW9kaWZpZXJfTGV0dGVycyIpLAorICAgIFZhbHVlKFVCTE9DS19DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1MsICJEaWFjcml0aWNhbHMgQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzIiksCisgICAgVmFsdWUoVUJMT0NLX0dSRUVLLCAiR3JlZWsgR3JlZWtfQW5kX0NvcHRpYyIpLAorICAgIFZhbHVlKFVCTE9DS19DWVJJTExJQywgIkN5cmlsbGljIEN5cmlsbGljIiksCisgICAgVmFsdWUoVUJMT0NLX0FSTUVOSUFOLCAiQXJtZW5pYW4gQXJtZW5pYW4iKSwKKyAgICBWYWx1ZShVQkxPQ0tfSEVCUkVXLCAiSGVicmV3IEhlYnJldyIpLAorICAgIFZhbHVlKFVCTE9DS19BUkFCSUMsICJBcmFiaWMgQXJhYmljIiksCisgICAgVmFsdWUoVUJMT0NLX1NZUklBQywgIlN5cmlhYyBTeXJpYWMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfVEhBQU5BLCAiVGhhYW5hIFRoYWFuYSIpLAorICAgIFZhbHVlKFVCTE9DS19ERVZBTkFHQVJJLCAiRGV2YW5hZ2FyaSBEZXZhbmFnYXJpIiksCisgICAgVmFsdWUoVUJMT0NLX0JFTkdBTEksICJCZW5nYWxpIEJlbmdhbGkiKSwKKyAgICBWYWx1ZShVQkxPQ0tfR1VSTVVLSEksICJHdXJtdWtoaSBHdXJtdWtoaSIpLAorICAgIFZhbHVlKFVCTE9DS19HVUpBUkFUSSwgIkd1amFyYXRpIEd1amFyYXRpIiksCisgICAgVmFsdWUoVUJMT0NLX09SSVlBLCAiT3JpeWEgT3JpeWEiKSwKKyAgICBWYWx1ZShVQkxPQ0tfVEFNSUwsICJUYW1pbCBUYW1pbCIpLAorICAgIFZhbHVlKFVCTE9DS19URUxVR1UsICJUZWx1Z3UgVGVsdWd1IiksCisgICAgVmFsdWUoVUJMT0NLX0tBTk5BREEsICJLYW5uYWRhIEthbm5hZGEiKSwKKyAgICBWYWx1ZShVQkxPQ0tfTUFMQVlBTEFNLCAiTWFsYXlhbGFtIE1hbGF5YWxhbSIpLAorICAgIFZhbHVlKFVCTE9DS19TSU5IQUxBLCAiU2luaGFsYSBTaW5oYWxhIiksCisgICAgVmFsdWUoVUJMT0NLX1RIQUksICJUaGFpIFRoYWkiKSwKKyAgICBWYWx1ZShVQkxPQ0tfTEFPLCAiTGFvIExhbyIpLAorICAgIFZhbHVlKFVCTE9DS19USUJFVEFOLCAiVGliZXRhbiBUaWJldGFuIiksCisgICAgVmFsdWUoVUJMT0NLX01ZQU5NQVIsICJNeWFubWFyIE15YW5tYXIiKSwKKyAgICBWYWx1ZShVQkxPQ0tfR0VPUkdJQU4sICJHZW9yZ2lhbiBHZW9yZ2lhbiIpLAorICAgIFZhbHVlKFVCTE9DS19IQU5HVUxfSkFNTywgIkphbW8gSGFuZ3VsX0phbW8iKSwKKyAgICBWYWx1ZShVQkxPQ0tfRVRISU9QSUMsICJFdGhpb3BpYyBFdGhpb3BpYyIpLAorICAgIFZhbHVlKFVCTE9DS19DSEVST0tFRSwgIkNoZXJva2VlIENoZXJva2VlIiksCisgICAgVmFsdWUoVUJMT0NLX1VOSUZJRURfQ0FOQURJQU5fQUJPUklHSU5BTF9TWUxMQUJJQ1MsICJVQ0FTIFVuaWZpZWRfQ2FuYWRpYW5fQWJvcmlnaW5hbF9TeWxsYWJpY3MgQ2FuYWRpYW5fU3lsbGFiaWNzIiksCisgICAgVmFsdWUoVUJMT0NLX09HSEFNLCAiT2doYW0gT2doYW0iKSwKKyAgICBWYWx1ZShVQkxPQ0tfUlVOSUMsICJSdW5pYyBSdW5pYyIpLAorICAgIFZhbHVlKFVCTE9DS19LSE1FUiwgIktobWVyIEtobWVyIiksCisgICAgVmFsdWUoVUJMT0NLX01PTkdPTElBTiwgIk1vbmdvbGlhbiBNb25nb2xpYW4iKSwKKyAgICBWYWx1ZShVQkxPQ0tfTEFUSU5fRVhURU5ERURfQURESVRJT05BTCwgIkxhdGluX0V4dF9BZGRpdGlvbmFsIExhdGluX0V4dGVuZGVkX0FkZGl0aW9uYWwiKSwKKyAgICBWYWx1ZShVQkxPQ0tfR1JFRUtfRVhURU5ERUQsICJHcmVla19FeHQgR3JlZWtfRXh0ZW5kZWQiKSwKKyAgICBWYWx1ZShVQkxPQ0tfR0VORVJBTF9QVU5DVFVBVElPTiwgIlB1bmN0dWF0aW9uIEdlbmVyYWxfUHVuY3R1YXRpb24iKSwKKyAgICBWYWx1ZShVQkxPQ0tfU1VQRVJTQ1JJUFRTX0FORF9TVUJTQ1JJUFRTLCAiU3VwZXJfQW5kX1N1YiBTdXBlcnNjcmlwdHNfQW5kX1N1YnNjcmlwdHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ1VSUkVOQ1lfU1lNQk9MUywgIkN1cnJlbmN5X1N5bWJvbHMgQ3VycmVuY3lfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19DT01CSU5JTkdfTUFSS1NfRk9SX1NZTUJPTFMsICJEaWFjcml0aWNhbHNfRm9yX1N5bWJvbHMgQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX0Zvcl9TeW1ib2xzIENvbWJpbmluZ19NYXJrc19Gb3JfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19MRVRURVJMSUtFX1NZTUJPTFMsICJMZXR0ZXJsaWtlX1N5bWJvbHMgTGV0dGVybGlrZV9TeW1ib2xzIiksCisgICAgVmFsdWUoVUJMT0NLX05VTUJFUl9GT1JNUywgIk51bWJlcl9Gb3JtcyBOdW1iZXJfRm9ybXMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQVJST1dTLCAiQXJyb3dzIEFycm93cyIpLAorICAgIFZhbHVlKFVCTE9DS19NQVRIRU1BVElDQUxfT1BFUkFUT1JTLCAiTWF0aF9PcGVyYXRvcnMgTWF0aGVtYXRpY2FsX09wZXJhdG9ycyIpLAorICAgIFZhbHVlKFVCTE9DS19NSVNDRUxMQU5FT1VTX1RFQ0hOSUNBTCwgIk1pc2NfVGVjaG5pY2FsIE1pc2NlbGxhbmVvdXNfVGVjaG5pY2FsIiksCisgICAgVmFsdWUoVUJMT0NLX0NPTlRST0xfUElDVFVSRVMsICJDb250cm9sX1BpY3R1cmVzIENvbnRyb2xfUGljdHVyZXMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfT1BUSUNBTF9DSEFSQUNURVJfUkVDT0dOSVRJT04sICJPQ1IgT3B0aWNhbF9DaGFyYWN0ZXJfUmVjb2duaXRpb24iKSwKKyAgICBWYWx1ZShVQkxPQ0tfRU5DTE9TRURfQUxQSEFOVU1FUklDUywgIkVuY2xvc2VkX0FscGhhbnVtIEVuY2xvc2VkX0FscGhhbnVtZXJpY3MiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQk9YX0RSQVdJTkcsICJCb3hfRHJhd2luZyBCb3hfRHJhd2luZyIpLAorICAgIFZhbHVlKFVCTE9DS19CTE9DS19FTEVNRU5UUywgIkJsb2NrX0VsZW1lbnRzIEJsb2NrX0VsZW1lbnRzIiksCisgICAgVmFsdWUoVUJMT0NLX0dFT01FVFJJQ19TSEFQRVMsICJHZW9tZXRyaWNfU2hhcGVzIEdlb21ldHJpY19TaGFwZXMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfTUlTQ0VMTEFORU9VU19TWU1CT0xTLCAiTWlzY19TeW1ib2xzIE1pc2NlbGxhbmVvdXNfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19ESU5HQkFUUywgIkRpbmdiYXRzIERpbmdiYXRzIiksCisgICAgVmFsdWUoVUJMT0NLX0JSQUlMTEVfUEFUVEVSTlMsICJCcmFpbGxlIEJyYWlsbGVfUGF0dGVybnMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ0pLX1JBRElDQUxTX1NVUFBMRU1FTlQsICJDSktfUmFkaWNhbHNfU3VwIENKS19SYWRpY2Fsc19TdXBwbGVtZW50IiksCisgICAgVmFsdWUoVUJMT0NLX0tBTkdYSV9SQURJQ0FMUywgIkthbmd4aSBLYW5neGlfUmFkaWNhbHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfSURFT0dSQVBISUNfREVTQ1JJUFRJT05fQ0hBUkFDVEVSUywgIklEQyBJZGVvZ3JhcGhpY19EZXNjcmlwdGlvbl9DaGFyYWN0ZXJzIiksCisgICAgVmFsdWUoVUJMT0NLX0NKS19TWU1CT0xTX0FORF9QVU5DVFVBVElPTiwgIkNKS19TeW1ib2xzIENKS19TeW1ib2xzX0FuZF9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKFVCTE9DS19ISVJBR0FOQSwgIkhpcmFnYW5hIEhpcmFnYW5hIiksCisgICAgVmFsdWUoVUJMT0NLX0tBVEFLQU5BLCAiS2F0YWthbmEgS2F0YWthbmEiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQk9QT01PRk8sICJCb3BvbW9mbyBCb3BvbW9mbyIpLAorICAgIFZhbHVlKFVCTE9DS19IQU5HVUxfQ09NUEFUSUJJTElUWV9KQU1PLCAiQ29tcGF0X0phbW8gSGFuZ3VsX0NvbXBhdGliaWxpdHlfSmFtbyIpLAorICAgIFZhbHVlKFVCTE9DS19LQU5CVU4sICJLYW5idW4gS2FuYnVuIiksCisgICAgVmFsdWUoVUJMT0NLX0JPUE9NT0ZPX0VYVEVOREVELCAiQm9wb21vZm9fRXh0IEJvcG9tb2ZvX0V4dGVuZGVkIiksCisgICAgVmFsdWUoVUJMT0NLX0VOQ0xPU0VEX0NKS19MRVRURVJTX0FORF9NT05USFMsICJFbmNsb3NlZF9DSksgRW5jbG9zZWRfQ0pLX0xldHRlcnNfQW5kX01vbnRocyIpLAorICAgIFZhbHVlKFVCTE9DS19DSktfQ09NUEFUSUJJTElUWSwgIkNKS19Db21wYXQgQ0pLX0NvbXBhdGliaWxpdHkiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ0pLX1VOSUZJRURfSURFT0dSQVBIU19FWFRFTlNJT05fQSwgIkNKS19FeHRfQSBDSktfVW5pZmllZF9JZGVvZ3JhcGhzX0V4dGVuc2lvbl9BIiksCisgICAgVmFsdWUoVUJMT0NLX0NKS19VTklGSUVEX0lERU9HUkFQSFMsICJDSksgQ0pLX1VuaWZpZWRfSWRlb2dyYXBocyIpLAorICAgIFZhbHVlKFVCTE9DS19ZSV9TWUxMQUJMRVMsICJZaV9TeWxsYWJsZXMgWWlfU3lsbGFibGVzIiksCisgICAgVmFsdWUoVUJMT0NLX1lJX1JBRElDQUxTLCAiWWlfUmFkaWNhbHMgWWlfUmFkaWNhbHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfSEFOR1VMX1NZTExBQkxFUywgIkhhbmd1bCBIYW5ndWxfU3lsbGFibGVzIiksCisgICAgVmFsdWUoVUJMT0NLX0hJR0hfU1VSUk9HQVRFUywgIkhpZ2hfU3Vycm9nYXRlcyBIaWdoX1N1cnJvZ2F0ZXMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfSElHSF9QUklWQVRFX1VTRV9TVVJST0dBVEVTLCAiSGlnaF9QVV9TdXJyb2dhdGVzIEhpZ2hfUHJpdmF0ZV9Vc2VfU3Vycm9nYXRlcyIpLAorICAgIFZhbHVlKFVCTE9DS19MT1dfU1VSUk9HQVRFUywgIkxvd19TdXJyb2dhdGVzIExvd19TdXJyb2dhdGVzIiksCisgICAgVmFsdWUoVUJMT0NLX1BSSVZBVEVfVVNFX0FSRUEsICJQVUEgUHJpdmF0ZV9Vc2VfQXJlYSBQcml2YXRlX1VzZSIpLAorICAgIFZhbHVlKFVCTE9DS19DSktfQ09NUEFUSUJJTElUWV9JREVPR1JBUEhTLCAiQ0pLX0NvbXBhdF9JZGVvZ3JhcGhzIENKS19Db21wYXRpYmlsaXR5X0lkZW9ncmFwaHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQUxQSEFCRVRJQ19QUkVTRU5UQVRJT05fRk9STVMsICJBbHBoYWJldGljX1BGIEFscGhhYmV0aWNfUHJlc2VudGF0aW9uX0Zvcm1zIiksCisgICAgVmFsdWUoVUJMT0NLX0FSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQSwgIkFyYWJpY19QRl9BIEFyYWJpY19QcmVzZW50YXRpb25fRm9ybXNfQSBBcmFiaWNfUHJlc2VudGF0aW9uX0Zvcm1zLUEiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ09NQklOSU5HX0hBTEZfTUFSS1MsICJIYWxmX01hcmtzIENvbWJpbmluZ19IYWxmX01hcmtzIiksCisgICAgVmFsdWUoVUJMT0NLX0NKS19DT01QQVRJQklMSVRZX0ZPUk1TLCAiQ0pLX0NvbXBhdF9Gb3JtcyBDSktfQ29tcGF0aWJpbGl0eV9Gb3JtcyIpLAorICAgIFZhbHVlKFVCTE9DS19TTUFMTF9GT1JNX1ZBUklBTlRTLCAiU21hbGxfRm9ybXMgU21hbGxfRm9ybV9WYXJpYW50cyIpLAorICAgIFZhbHVlKFVCTE9DS19BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0IsICJBcmFiaWNfUEZfQiBBcmFiaWNfUHJlc2VudGF0aW9uX0Zvcm1zX0IiKSwKKyAgICBWYWx1ZShVQkxPQ0tfU1BFQ0lBTFMsICJTcGVjaWFscyBTcGVjaWFscyIpLAorICAgIFZhbHVlKFVCTE9DS19IQUxGV0lEVEhfQU5EX0ZVTExXSURUSF9GT1JNUywgIkhhbGZfQW5kX0Z1bGxfRm9ybXMgSGFsZndpZHRoX0FuZF9GdWxsd2lkdGhfRm9ybXMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfT0xEX0lUQUxJQywgIk9sZF9JdGFsaWMgT2xkX0l0YWxpYyIpLAorICAgIFZhbHVlKFVCTE9DS19HT1RISUMsICJHb3RoaWMgR290aGljIiksCisgICAgVmFsdWUoVUJMT0NLX0RFU0VSRVQsICJEZXNlcmV0IERlc2VyZXQiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQllaQU5USU5FX01VU0lDQUxfU1lNQk9MUywgIkJ5emFudGluZV9NdXNpYyBCeXphbnRpbmVfTXVzaWNhbF9TeW1ib2xzIiksCisgICAgVmFsdWUoVUJMT0NLX01VU0lDQUxfU1lNQk9MUywgIk11c2ljIE11c2ljYWxfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19NQVRIRU1BVElDQUxfQUxQSEFOVU1FUklDX1NZTUJPTFMsICJNYXRoX0FscGhhbnVtIE1hdGhlbWF0aWNhbF9BbHBoYW51bWVyaWNfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19DSktfVU5JRklFRF9JREVPR1JBUEhTX0VYVEVOU0lPTl9CLCAiQ0pLX0V4dF9CIENKS19VbmlmaWVkX0lkZW9ncmFwaHNfRXh0ZW5zaW9uX0IiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ0pLX0NPTVBBVElCSUxJVFlfSURFT0dSQVBIU19TVVBQTEVNRU5ULCAiQ0pLX0NvbXBhdF9JZGVvZ3JhcGhzX1N1cCBDSktfQ29tcGF0aWJpbGl0eV9JZGVvZ3JhcGhzX1N1cHBsZW1lbnQiKSwKKyAgICBWYWx1ZShVQkxPQ0tfVEFHUywgIlRhZ3MgVGFncyIpLAorICAgIFZhbHVlKFVCTE9DS19DWVJJTExJQ19TVVBQTEVNRU5ULCAiQ3lyaWxsaWNfU3VwIEN5cmlsbGljX1N1cHBsZW1lbnQgQ3lyaWxsaWNfU3VwcGxlbWVudGFyeSIpLAorICAgIFZhbHVlKFVCTE9DS19UQUdBTE9HLCAiVGFnYWxvZyBUYWdhbG9nIiksCisgICAgVmFsdWUoVUJMT0NLX0hBTlVOT08sICJIYW51bm9vIEhhbnVub28iKSwKKyAgICBWYWx1ZShVQkxPQ0tfQlVISUQsICJCdWhpZCBCdWhpZCIpLAorICAgIFZhbHVlKFVCTE9DS19UQUdCQU5XQSwgIlRhZ2JhbndhIFRhZ2JhbndhIiksCisgICAgVmFsdWUoVUJMT0NLX01JU0NFTExBTkVPVVNfTUFUSEVNQVRJQ0FMX1NZTUJPTFNfQSwgIk1pc2NfTWF0aF9TeW1ib2xzX0EgTWlzY2VsbGFuZW91c19NYXRoZW1hdGljYWxfU3ltYm9sc19BIiksCisgICAgVmFsdWUoVUJMT0NLX1NVUFBMRU1FTlRBTF9BUlJPV1NfQSwgIlN1cF9BcnJvd3NfQSBTdXBwbGVtZW50YWxfQXJyb3dzX0EiKSwKKyAgICBWYWx1ZShVQkxPQ0tfU1VQUExFTUVOVEFMX0FSUk9XU19CLCAiU3VwX0Fycm93c19CIFN1cHBsZW1lbnRhbF9BcnJvd3NfQiIpLAorICAgIFZhbHVlKFVCTE9DS19NSVNDRUxMQU5FT1VTX01BVEhFTUFUSUNBTF9TWU1CT0xTX0IsICJNaXNjX01hdGhfU3ltYm9sc19CIE1pc2NlbGxhbmVvdXNfTWF0aGVtYXRpY2FsX1N5bWJvbHNfQiIpLAorICAgIFZhbHVlKFVCTE9DS19TVVBQTEVNRU5UQUxfTUFUSEVNQVRJQ0FMX09QRVJBVE9SUywgIlN1cF9NYXRoX09wZXJhdG9ycyBTdXBwbGVtZW50YWxfTWF0aGVtYXRpY2FsX09wZXJhdG9ycyIpLAorICAgIFZhbHVlKFVCTE9DS19LQVRBS0FOQV9QSE9ORVRJQ19FWFRFTlNJT05TLCAiS2F0YWthbmFfRXh0IEthdGFrYW5hX1Bob25ldGljX0V4dGVuc2lvbnMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfVkFSSUFUSU9OX1NFTEVDVE9SUywgIlZTIFZhcmlhdGlvbl9TZWxlY3RvcnMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfU1VQUExFTUVOVEFSWV9QUklWQVRFX1VTRV9BUkVBX0EsICJTdXBfUFVBX0EgU3VwcGxlbWVudGFyeV9Qcml2YXRlX1VzZV9BcmVhX0EiKSwKKyAgICBWYWx1ZShVQkxPQ0tfU1VQUExFTUVOVEFSWV9QUklWQVRFX1VTRV9BUkVBX0IsICJTdXBfUFVBX0IgU3VwcGxlbWVudGFyeV9Qcml2YXRlX1VzZV9BcmVhX0IiKSwKKyAgICBWYWx1ZShVQkxPQ0tfTElNQlUsICJMaW1idSBMaW1idSIpLAorICAgIFZhbHVlKFVCTE9DS19UQUlfTEUsICJUYWlfTGUgVGFpX0xlIiksCisgICAgVmFsdWUoVUJMT0NLX0tITUVSX1NZTUJPTFMsICJLaG1lcl9TeW1ib2xzIEtobWVyX1N5bWJvbHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfUEhPTkVUSUNfRVhURU5TSU9OUywgIlBob25ldGljX0V4dCBQaG9uZXRpY19FeHRlbnNpb25zIiksCisgICAgVmFsdWUoVUJMT0NLX01JU0NFTExBTkVPVVNfU1lNQk9MU19BTkRfQVJST1dTLCAiTWlzY19BcnJvd3MgTWlzY2VsbGFuZW91c19TeW1ib2xzX0FuZF9BcnJvd3MiKSwKKyAgICBWYWx1ZShVQkxPQ0tfWUlKSU5HX0hFWEFHUkFNX1NZTUJPTFMsICJZaWppbmcgWWlqaW5nX0hleGFncmFtX1N5bWJvbHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfTElORUFSX0JfU1lMTEFCQVJZLCAiTGluZWFyX0JfU3lsbGFiYXJ5IExpbmVhcl9CX1N5bGxhYmFyeSIpLAorICAgIFZhbHVlKFVCTE9DS19MSU5FQVJfQl9JREVPR1JBTVMsICJMaW5lYXJfQl9JZGVvZ3JhbXMgTGluZWFyX0JfSWRlb2dyYW1zIiksCisgICAgVmFsdWUoVUJMT0NLX0FFR0VBTl9OVU1CRVJTLCAiQWVnZWFuX051bWJlcnMgQWVnZWFuX051bWJlcnMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfVUdBUklUSUMsICJVZ2FyaXRpYyBVZ2FyaXRpYyIpLAorICAgIFZhbHVlKFVCTE9DS19TSEFWSUFOLCAiU2hhdmlhbiBTaGF2aWFuIiksCisgICAgVmFsdWUoVUJMT0NLX09TTUFOWUEsICJPc21hbnlhIE9zbWFueWEiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ1lQUklPVF9TWUxMQUJBUlksICJDeXByaW90X1N5bGxhYmFyeSBDeXByaW90X1N5bGxhYmFyeSIpLAorICAgIFZhbHVlKFVCTE9DS19UQUlfWFVBTl9KSU5HX1NZTUJPTFMsICJUYWlfWHVhbl9KaW5nIFRhaV9YdWFuX0ppbmdfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19WQVJJQVRJT05fU0VMRUNUT1JTX1NVUFBMRU1FTlQsICJWU19TdXAgVmFyaWF0aW9uX1NlbGVjdG9yc19TdXBwbGVtZW50IiksCisgICAgVmFsdWUoVUJMT0NLX0FOQ0lFTlRfR1JFRUtfTVVTSUNBTF9OT1RBVElPTiwgIkFuY2llbnRfR3JlZWtfTXVzaWMgQW5jaWVudF9HcmVla19NdXNpY2FsX05vdGF0aW9uIiksCisgICAgVmFsdWUoVUJMT0NLX0FOQ0lFTlRfR1JFRUtfTlVNQkVSUywgIkFuY2llbnRfR3JlZWtfTnVtYmVycyBBbmNpZW50X0dyZWVrX051bWJlcnMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQVJBQklDX1NVUFBMRU1FTlQsICJBcmFiaWNfU3VwIEFyYWJpY19TdXBwbGVtZW50IiksCisgICAgVmFsdWUoVUJMT0NLX0JVR0lORVNFLCAiQnVnaW5lc2UgQnVnaW5lc2UiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ0pLX1NUUk9LRVMsICJDSktfU3Ryb2tlcyBDSktfU3Ryb2tlcyIpLAorICAgIFZhbHVlKFVCTE9DS19DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1NfU1VQUExFTUVOVCwgIkRpYWNyaXRpY2Fsc19TdXAgQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX1N1cHBsZW1lbnQiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ09QVElDLCAiQ29wdGljIENvcHRpYyIpLAorICAgIFZhbHVlKFVCTE9DS19FVEhJT1BJQ19FWFRFTkRFRCwgIkV0aGlvcGljX0V4dCBFdGhpb3BpY19FeHRlbmRlZCIpLAorICAgIFZhbHVlKFVCTE9DS19FVEhJT1BJQ19TVVBQTEVNRU5ULCAiRXRoaW9waWNfU3VwIEV0aGlvcGljX1N1cHBsZW1lbnQiKSwKKyAgICBWYWx1ZShVQkxPQ0tfR0VPUkdJQU5fU1VQUExFTUVOVCwgIkdlb3JnaWFuX1N1cCBHZW9yZ2lhbl9TdXBwbGVtZW50IiksCisgICAgVmFsdWUoVUJMT0NLX0dMQUdPTElUSUMsICJHbGFnb2xpdGljIEdsYWdvbGl0aWMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfS0hBUk9TSFRISSwgIktoYXJvc2h0aGkgS2hhcm9zaHRoaSIpLAorICAgIFZhbHVlKFVCTE9DS19NT0RJRklFUl9UT05FX0xFVFRFUlMsICJNb2RpZmllcl9Ub25lX0xldHRlcnMgTW9kaWZpZXJfVG9uZV9MZXR0ZXJzIiksCisgICAgVmFsdWUoVUJMT0NLX05FV19UQUlfTFVFLCAiTmV3X1RhaV9MdWUgTmV3X1RhaV9MdWUiKSwKKyAgICBWYWx1ZShVQkxPQ0tfT0xEX1BFUlNJQU4sICJPbGRfUGVyc2lhbiBPbGRfUGVyc2lhbiIpLAorICAgIFZhbHVlKFVCTE9DS19QSE9ORVRJQ19FWFRFTlNJT05TX1NVUFBMRU1FTlQsICJQaG9uZXRpY19FeHRfU3VwIFBob25ldGljX0V4dGVuc2lvbnNfU3VwcGxlbWVudCIpLAorICAgIFZhbHVlKFVCTE9DS19TVVBQTEVNRU5UQUxfUFVOQ1RVQVRJT04sICJTdXBfUHVuY3R1YXRpb24gU3VwcGxlbWVudGFsX1B1bmN0dWF0aW9uIiksCisgICAgVmFsdWUoVUJMT0NLX1NZTE9USV9OQUdSSSwgIlN5bG90aV9OYWdyaSBTeWxvdGlfTmFncmkiKSwKKyAgICBWYWx1ZShVQkxPQ0tfVElGSU5BR0gsICJUaWZpbmFnaCBUaWZpbmFnaCIpLAorICAgIFZhbHVlKFVCTE9DS19WRVJUSUNBTF9GT1JNUywgIlZlcnRpY2FsX0Zvcm1zIFZlcnRpY2FsX0Zvcm1zIiksCisgICAgVmFsdWUoVUJMT0NLX05LTywgIk5LbyBOS28iKSwKKyAgICBWYWx1ZShVQkxPQ0tfQkFMSU5FU0UsICJCYWxpbmVzZSBCYWxpbmVzZSIpLAorICAgIFZhbHVlKFVCTE9DS19MQVRJTl9FWFRFTkRFRF9DLCAiTGF0aW5fRXh0X0MgTGF0aW5fRXh0ZW5kZWRfQyIpLAorICAgIFZhbHVlKFVCTE9DS19MQVRJTl9FWFRFTkRFRF9ELCAiTGF0aW5fRXh0X0QgTGF0aW5fRXh0ZW5kZWRfRCIpLAorICAgIFZhbHVlKFVCTE9DS19QSEFHU19QQSwgIlBoYWdzX1BhIFBoYWdzX1BhIiksCisgICAgVmFsdWUoVUJMT0NLX1BIT0VOSUNJQU4sICJQaG9lbmljaWFuIFBob2VuaWNpYW4iKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ1VORUlGT1JNLCAiQ3VuZWlmb3JtIEN1bmVpZm9ybSIpLAorICAgIFZhbHVlKFVCTE9DS19DVU5FSUZPUk1fTlVNQkVSU19BTkRfUFVOQ1RVQVRJT04sICJDdW5laWZvcm1fTnVtYmVycyBDdW5laWZvcm1fTnVtYmVyc19BbmRfUHVuY3R1YXRpb24iKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ09VTlRJTkdfUk9EX05VTUVSQUxTLCAiQ291bnRpbmdfUm9kIENvdW50aW5nX1JvZF9OdW1lcmFscyIpLAorICAgIFZhbHVlKFVCTE9DS19TVU5EQU5FU0UsICJTdW5kYW5lc2UgU3VuZGFuZXNlIiksCisgICAgVmFsdWUoVUJMT0NLX0xFUENIQSwgIkxlcGNoYSBMZXBjaGEiKSwKKyAgICBWYWx1ZShVQkxPQ0tfT0xfQ0hJS0ksICJPbF9DaGlraSBPbF9DaGlraSIpLAorICAgIFZhbHVlKFVCTE9DS19DWVJJTExJQ19FWFRFTkRFRF9BLCAiQ3lyaWxsaWNfRXh0X0EgQ3lyaWxsaWNfRXh0ZW5kZWRfQSIpLAorICAgIFZhbHVlKFVCTE9DS19WQUksICJWYWkgVmFpIiksCisgICAgVmFsdWUoVUJMT0NLX0NZUklMTElDX0VYVEVOREVEX0IsICJDeXJpbGxpY19FeHRfQiBDeXJpbGxpY19FeHRlbmRlZF9CIiksCisgICAgVmFsdWUoVUJMT0NLX1NBVVJBU0hUUkEsICJTYXVyYXNodHJhIFNhdXJhc2h0cmEiKSwKKyAgICBWYWx1ZShVQkxPQ0tfS0FZQUhfTEksICJLYXlhaF9MaSBLYXlhaF9MaSIpLAorICAgIFZhbHVlKFVCTE9DS19SRUpBTkcsICJSZWphbmcgUmVqYW5nIiksCisgICAgVmFsdWUoVUJMT0NLX0NIQU0sICJDaGFtIENoYW0iKSwKKyAgICBWYWx1ZShVQkxPQ0tfQU5DSUVOVF9TWU1CT0xTLCAiQW5jaWVudF9TeW1ib2xzIEFuY2llbnRfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19QSEFJU1RPU19ESVNDLCAiUGhhaXN0b3MgUGhhaXN0b3NfRGlzYyIpLAorICAgIFZhbHVlKFVCTE9DS19MWUNJQU4sICJMeWNpYW4gTHljaWFuIiksCisgICAgVmFsdWUoVUJMT0NLX0NBUklBTiwgIkNhcmlhbiBDYXJpYW4iKSwKKyAgICBWYWx1ZShVQkxPQ0tfTFlESUFOLCAiTHlkaWFuIEx5ZGlhbiIpLAorICAgIFZhbHVlKFVCTE9DS19NQUhKT05HX1RJTEVTLCAiTWFoam9uZyBNYWhqb25nX1RpbGVzIiksCisgICAgVmFsdWUoVUJMT0NLX0RPTUlOT19USUxFUywgIkRvbWlubyBEb21pbm9fVGlsZXMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfU0FNQVJJVEFOLCAiU2FtYXJpdGFuIFNhbWFyaXRhbiIpLAorICAgIFZhbHVlKFVCTE9DS19VTklGSUVEX0NBTkFESUFOX0FCT1JJR0lOQUxfU1lMTEFCSUNTX0VYVEVOREVELCAiVUNBU19FeHQgVW5pZmllZF9DYW5hZGlhbl9BYm9yaWdpbmFsX1N5bGxhYmljc19FeHRlbmRlZCIpLAorICAgIFZhbHVlKFVCTE9DS19UQUlfVEhBTSwgIlRhaV9UaGFtIFRhaV9UaGFtIiksCisgICAgVmFsdWUoVUJMT0NLX1ZFRElDX0VYVEVOU0lPTlMsICJWZWRpY19FeHQgVmVkaWNfRXh0ZW5zaW9ucyIpLAorICAgIFZhbHVlKFVCTE9DS19MSVNVLCAiTGlzdSBMaXN1IiksCisgICAgVmFsdWUoVUJMT0NLX0JBTVVNLCAiQmFtdW0gQmFtdW0iKSwKKyAgICBWYWx1ZShVQkxPQ0tfQ09NTU9OX0lORElDX05VTUJFUl9GT1JNUywgIkluZGljX051bWJlcl9Gb3JtcyBDb21tb25fSW5kaWNfTnVtYmVyX0Zvcm1zIiksCisgICAgVmFsdWUoVUJMT0NLX0RFVkFOQUdBUklfRVhURU5ERUQsICJEZXZhbmFnYXJpX0V4dCBEZXZhbmFnYXJpX0V4dGVuZGVkIiksCisgICAgVmFsdWUoVUJMT0NLX0hBTkdVTF9KQU1PX0VYVEVOREVEX0EsICJKYW1vX0V4dF9BIEhhbmd1bF9KYW1vX0V4dGVuZGVkX0EiKSwKKyAgICBWYWx1ZShVQkxPQ0tfSkFWQU5FU0UsICJKYXZhbmVzZSBKYXZhbmVzZSIpLAorICAgIFZhbHVlKFVCTE9DS19NWUFOTUFSX0VYVEVOREVEX0EsICJNeWFubWFyX0V4dF9BIE15YW5tYXJfRXh0ZW5kZWRfQSIpLAorICAgIFZhbHVlKFVCTE9DS19UQUlfVklFVCwgIlRhaV9WaWV0IFRhaV9WaWV0IiksCisgICAgVmFsdWUoVUJMT0NLX01FRVRFSV9NQVlFSywgIk1lZXRlaV9NYXllayBNZWV0ZWlfTWF5ZWsiKSwKKyAgICBWYWx1ZShVQkxPQ0tfSEFOR1VMX0pBTU9fRVhURU5ERURfQiwgIkphbW9fRXh0X0IgSGFuZ3VsX0phbW9fRXh0ZW5kZWRfQiIpLAorICAgIFZhbHVlKFVCTE9DS19JTVBFUklBTF9BUkFNQUlDLCAiSW1wZXJpYWxfQXJhbWFpYyBJbXBlcmlhbF9BcmFtYWljIiksCisgICAgVmFsdWUoVUJMT0NLX09MRF9TT1VUSF9BUkFCSUFOLCAiT2xkX1NvdXRoX0FyYWJpYW4gT2xkX1NvdXRoX0FyYWJpYW4iKSwKKyAgICBWYWx1ZShVQkxPQ0tfQVZFU1RBTiwgIkF2ZXN0YW4gQXZlc3RhbiIpLAorICAgIFZhbHVlKFVCTE9DS19JTlNDUklQVElPTkFMX1BBUlRISUFOLCAiSW5zY3JpcHRpb25hbF9QYXJ0aGlhbiBJbnNjcmlwdGlvbmFsX1BhcnRoaWFuIiksCisgICAgVmFsdWUoVUJMT0NLX0lOU0NSSVBUSU9OQUxfUEFITEFWSSwgIkluc2NyaXB0aW9uYWxfUGFobGF2aSBJbnNjcmlwdGlvbmFsX1BhaGxhdmkiKSwKKyAgICBWYWx1ZShVQkxPQ0tfT0xEX1RVUktJQywgIk9sZF9UdXJraWMgT2xkX1R1cmtpYyIpLAorICAgIFZhbHVlKFVCTE9DS19SVU1JX05VTUVSQUxfU1lNQk9MUywgIlJ1bWkgUnVtaV9OdW1lcmFsX1N5bWJvbHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfS0FJVEhJLCAiS2FpdGhpIEthaXRoaSIpLAorICAgIFZhbHVlKFVCTE9DS19FR1lQVElBTl9ISUVST0dMWVBIUywgIkVneXB0aWFuX0hpZXJvZ2x5cGhzIEVneXB0aWFuX0hpZXJvZ2x5cGhzIiksCisgICAgVmFsdWUoVUJMT0NLX0VOQ0xPU0VEX0FMUEhBTlVNRVJJQ19TVVBQTEVNRU5ULCAiRW5jbG9zZWRfQWxwaGFudW1fU3VwIEVuY2xvc2VkX0FscGhhbnVtZXJpY19TdXBwbGVtZW50IiksCisgICAgVmFsdWUoVUJMT0NLX0VOQ0xPU0VEX0lERU9HUkFQSElDX1NVUFBMRU1FTlQsICJFbmNsb3NlZF9JZGVvZ3JhcGhpY19TdXAgRW5jbG9zZWRfSWRlb2dyYXBoaWNfU3VwcGxlbWVudCIpLAorICAgIFZhbHVlKFVCTE9DS19DSktfVU5JRklFRF9JREVPR1JBUEhTX0VYVEVOU0lPTl9DLCAiQ0pLX0V4dF9DIENKS19VbmlmaWVkX0lkZW9ncmFwaHNfRXh0ZW5zaW9uX0MiKSwKKyAgICBWYWx1ZShVQkxPQ0tfTUFOREFJQywgIk1hbmRhaWMgTWFuZGFpYyIpLAorICAgIFZhbHVlKFVCTE9DS19CQVRBSywgIkJhdGFrIEJhdGFrIiksCisgICAgVmFsdWUoVUJMT0NLX0VUSElPUElDX0VYVEVOREVEX0EsICJFdGhpb3BpY19FeHRfQSBFdGhpb3BpY19FeHRlbmRlZF9BIiksCisgICAgVmFsdWUoVUJMT0NLX0JSQUhNSSwgIkJyYWhtaSBCcmFobWkiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQkFNVU1fU1VQUExFTUVOVCwgIkJhbXVtX1N1cCBCYW11bV9TdXBwbGVtZW50IiksCisgICAgVmFsdWUoVUJMT0NLX0tBTkFfU1VQUExFTUVOVCwgIkthbmFfU3VwIEthbmFfU3VwcGxlbWVudCIpLAorICAgIFZhbHVlKFVCTE9DS19QTEFZSU5HX0NBUkRTLCAiUGxheWluZ19DYXJkcyBQbGF5aW5nX0NhcmRzIiksCisgICAgVmFsdWUoVUJMT0NLX01JU0NFTExBTkVPVVNfU1lNQk9MU19BTkRfUElDVE9HUkFQSFMsICJNaXNjX1BpY3RvZ3JhcGhzIE1pc2NlbGxhbmVvdXNfU3ltYm9sc19BbmRfUGljdG9ncmFwaHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfRU1PVElDT05TLCAiRW1vdGljb25zIEVtb3RpY29ucyIpLAorICAgIFZhbHVlKFVCTE9DS19UUkFOU1BPUlRfQU5EX01BUF9TWU1CT0xTLCAiVHJhbnNwb3J0X0FuZF9NYXAgVHJhbnNwb3J0X0FuZF9NYXBfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19BTENIRU1JQ0FMX1NZTUJPTFMsICJBbGNoZW1pY2FsIEFsY2hlbWljYWxfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19DSktfVU5JRklFRF9JREVPR1JBUEhTX0VYVEVOU0lPTl9ELCAiQ0pLX0V4dF9EIENKS19VbmlmaWVkX0lkZW9ncmFwaHNfRXh0ZW5zaW9uX0QiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQVJBQklDX0VYVEVOREVEX0EsICJBcmFiaWNfRXh0X0EgQXJhYmljX0V4dGVuZGVkX0EiKSwKKyAgICBWYWx1ZShVQkxPQ0tfQVJBQklDX01BVEhFTUFUSUNBTF9BTFBIQUJFVElDX1NZTUJPTFMsICJBcmFiaWNfTWF0aCBBcmFiaWNfTWF0aGVtYXRpY2FsX0FscGhhYmV0aWNfU3ltYm9scyIpLAorICAgIFZhbHVlKFVCTE9DS19DSEFLTUEsICJDaGFrbWEgQ2hha21hIiksCisgICAgVmFsdWUoVUJMT0NLX01FRVRFSV9NQVlFS19FWFRFTlNJT05TLCAiTWVldGVpX01heWVrX0V4dCBNZWV0ZWlfTWF5ZWtfRXh0ZW5zaW9ucyIpLAorICAgIFZhbHVlKFVCTE9DS19NRVJPSVRJQ19DVVJTSVZFLCAiTWVyb2l0aWNfQ3Vyc2l2ZSBNZXJvaXRpY19DdXJzaXZlIiksCisgICAgVmFsdWUoVUJMT0NLX01FUk9JVElDX0hJRVJPR0xZUEhTLCAiTWVyb2l0aWNfSGllcm9nbHlwaHMgTWVyb2l0aWNfSGllcm9nbHlwaHMiKSwKKyAgICBWYWx1ZShVQkxPQ0tfTUlBTywgIk1pYW8gTWlhbyIpLAorICAgIFZhbHVlKFVCTE9DS19TSEFSQURBLCAiU2hhcmFkYSBTaGFyYWRhIiksCisgICAgVmFsdWUoVUJMT0NLX1NPUkFfU09NUEVORywgIlNvcmFfU29tcGVuZyBTb3JhX1NvbXBlbmciKSwKKyAgICBWYWx1ZShVQkxPQ0tfU1VOREFORVNFX1NVUFBMRU1FTlQsICJTdW5kYW5lc2VfU3VwIFN1bmRhbmVzZV9TdXBwbGVtZW50IiksCisgICAgVmFsdWUoVUJMT0NLX1RBS1JJLCAiVGFrcmkgVGFrcmkiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfY2NjWzU2XSA9IHsKKyAgICBWYWx1ZSgwLCAiTlIgTm90X1Jlb3JkZXJlZCIpLAorICAgIFZhbHVlKDEsICJPViBPdmVybGF5IiksCisgICAgVmFsdWUoNywgIk5LIE51a3RhIiksCisgICAgVmFsdWUoOCwgIktWIEthbmFfVm9pY2luZyIpLAorICAgIFZhbHVlKDksICJWUiBWaXJhbWEiKSwKKyAgICBWYWx1ZSgxMCwgIkNDQzEwIENDQzEwIiksCisgICAgVmFsdWUoMTEsICJDQ0MxMSBDQ0MxMSIpLAorICAgIFZhbHVlKDEyLCAiQ0NDMTIgQ0NDMTIiKSwKKyAgICBWYWx1ZSgxMywgIkNDQzEzIENDQzEzIiksCisgICAgVmFsdWUoMTQsICJDQ0MxNCBDQ0MxNCIpLAorICAgIFZhbHVlKDE1LCAiQ0NDMTUgQ0NDMTUiKSwKKyAgICBWYWx1ZSgxNiwgIkNDQzE2IENDQzE2IiksCisgICAgVmFsdWUoMTcsICJDQ0MxNyBDQ0MxNyIpLAorICAgIFZhbHVlKDE4LCAiQ0NDMTggQ0NDMTgiKSwKKyAgICBWYWx1ZSgxOSwgIkNDQzE5IENDQzE5IiksCisgICAgVmFsdWUoMjAsICJDQ0MyMCBDQ0MyMCIpLAorICAgIFZhbHVlKDIxLCAiQ0NDMjEgQ0NDMjEiKSwKKyAgICBWYWx1ZSgyMiwgIkNDQzIyIENDQzIyIiksCisgICAgVmFsdWUoMjMsICJDQ0MyMyBDQ0MyMyIpLAorICAgIFZhbHVlKDI0LCAiQ0NDMjQgQ0NDMjQiKSwKKyAgICBWYWx1ZSgyNSwgIkNDQzI1IENDQzI1IiksCisgICAgVmFsdWUoMjYsICJDQ0MyNiBDQ0MyNiIpLAorICAgIFZhbHVlKDI3LCAiQ0NDMjcgQ0NDMjciKSwKKyAgICBWYWx1ZSgyOCwgIkNDQzI4IENDQzI4IiksCisgICAgVmFsdWUoMjksICJDQ0MyOSBDQ0MyOSIpLAorICAgIFZhbHVlKDMwLCAiQ0NDMzAgQ0NDMzAiKSwKKyAgICBWYWx1ZSgzMSwgIkNDQzMxIENDQzMxIiksCisgICAgVmFsdWUoMzIsICJDQ0MzMiBDQ0MzMiIpLAorICAgIFZhbHVlKDMzLCAiQ0NDMzMgQ0NDMzMiKSwKKyAgICBWYWx1ZSgzNCwgIkNDQzM0IENDQzM0IiksCisgICAgVmFsdWUoMzUsICJDQ0MzNSBDQ0MzNSIpLAorICAgIFZhbHVlKDM2LCAiQ0NDMzYgQ0NDMzYiKSwKKyAgICBWYWx1ZSg4NCwgIkNDQzg0IENDQzg0IiksCisgICAgVmFsdWUoOTEsICJDQ0M5MSBDQ0M5MSIpLAorICAgIFZhbHVlKDEwMywgIkNDQzEwMyBDQ0MxMDMiKSwKKyAgICBWYWx1ZSgxMDcsICJDQ0MxMDcgQ0NDMTA3IiksCisgICAgVmFsdWUoMTE4LCAiQ0NDMTE4IENDQzExOCIpLAorICAgIFZhbHVlKDEyMiwgIkNDQzEyMiBDQ0MxMjIiKSwKKyAgICBWYWx1ZSgxMjksICJDQ0MxMjkgQ0NDMTI5IiksCisgICAgVmFsdWUoMTMwLCAiQ0NDMTMwIENDQzEzMCIpLAorICAgIFZhbHVlKDEzMiwgIkNDQzEzMyBDQ0MxMzMiKSwKKyAgICBWYWx1ZSgyMDAsICJBVEJMIEF0dGFjaGVkX0JlbG93X0xlZnQiKSwKKyAgICBWYWx1ZSgyMDIsICJBVEIgQXR0YWNoZWRfQmVsb3ciKSwKKyAgICBWYWx1ZSgyMTQsICJBVEEgQXR0YWNoZWRfQWJvdmUiKSwKKyAgICBWYWx1ZSgyMTYsICJBVEFSIEF0dGFjaGVkX0Fib3ZlX1JpZ2h0IiksCisgICAgVmFsdWUoMjE4LCAiQkwgQmVsb3dfTGVmdCIpLAorICAgIFZhbHVlKDIyMCwgIkIgQmVsb3ciKSwKKyAgICBWYWx1ZSgyMjIsICJCUiBCZWxvd19SaWdodCIpLAorICAgIFZhbHVlKDIyNCwgIkwgTGVmdCIpLAorICAgIFZhbHVlKDIyNiwgIlIgUmlnaHQiKSwKKyAgICBWYWx1ZSgyMjgsICJBTCBBYm92ZV9MZWZ0IiksCisgICAgVmFsdWUoMjMwLCAiQSBBYm92ZSIpLAorICAgIFZhbHVlKDIzMiwgIkFSIEFib3ZlX1JpZ2h0IiksCisgICAgVmFsdWUoMjMzLCAiREIgRG91YmxlX0JlbG93IiksCisgICAgVmFsdWUoMjM0LCAiREEgRG91YmxlX0Fib3ZlIiksCisgICAgVmFsdWUoMjQwLCAiSVMgSW90YV9TdWJzY3JpcHQiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfZHRbMThdID0geworICAgIFZhbHVlKFVfRFRfTk9ORSwgIk5vbmUgTm9uZSBub25lIiksCisgICAgVmFsdWUoVV9EVF9DQU5PTklDQUwsICJDYW4gQ2Fub25pY2FsIGNhbiIpLAorICAgIFZhbHVlKFVfRFRfQ09NUEFULCAiQ29tIENvbXBhdCBjb20iKSwKKyAgICBWYWx1ZShVX0RUX0NJUkNMRSwgIkVuYyBDaXJjbGUgZW5jIiksCisgICAgVmFsdWUoVV9EVF9GSU5BTCwgIkZpbiBGaW5hbCBmaW4iKSwKKyAgICBWYWx1ZShVX0RUX0ZPTlQsICJGb250IEZvbnQgZm9udCIpLAorICAgIFZhbHVlKFVfRFRfRlJBQ1RJT04sICJGcmEgRnJhY3Rpb24gZnJhIiksCisgICAgVmFsdWUoVV9EVF9JTklUSUFMLCAiSW5pdCBJbml0aWFsIGluaXQiKSwKKyAgICBWYWx1ZShVX0RUX0lTT0xBVEVELCAiSXNvIElzb2xhdGVkIGlzbyIpLAorICAgIFZhbHVlKFVfRFRfTUVESUFMLCAiTWVkIE1lZGlhbCBtZWQiKSwKKyAgICBWYWx1ZShVX0RUX05BUlJPVywgIk5hciBOYXJyb3cgbmFyIiksCisgICAgVmFsdWUoVV9EVF9OT0JSRUFLLCAiTmIgTm9icmVhayBuYiIpLAorICAgIFZhbHVlKFVfRFRfU01BTEwsICJTbWwgU21hbGwgc21sIiksCisgICAgVmFsdWUoVV9EVF9TUVVBUkUsICJTcXIgU3F1YXJlIHNxciIpLAorICAgIFZhbHVlKFVfRFRfU1VCLCAiU3ViIFN1YiBzdWIiKSwKKyAgICBWYWx1ZShVX0RUX1NVUEVSLCAiU3VwIFN1cGVyIHN1cCIpLAorICAgIFZhbHVlKFVfRFRfVkVSVElDQUwsICJWZXJ0IFZlcnRpY2FsIHZlcnQiKSwKKyAgICBWYWx1ZShVX0RUX1dJREUsICJXaWRlIFdpZGUgd2lkZSIpLAorfTsKKworc3RhdGljIGNvbnN0IFZhbHVlIFZBTFVFU19lYVs2XSA9IHsKKyAgICBWYWx1ZShVX0VBX05FVVRSQUwsICJOIE5ldXRyYWwiKSwKKyAgICBWYWx1ZShVX0VBX0FNQklHVU9VUywgIkEgQW1iaWd1b3VzIiksCisgICAgVmFsdWUoVV9FQV9IQUxGV0lEVEgsICJIIEhhbGZ3aWR0aCIpLAorICAgIFZhbHVlKFVfRUFfRlVMTFdJRFRILCAiRiBGdWxsd2lkdGgiKSwKKyAgICBWYWx1ZShVX0VBX05BUlJPVywgIk5hIE5hcnJvdyIpLAorICAgIFZhbHVlKFVfRUFfV0lERSwgIlcgV2lkZSIpLAorfTsKKworc3RhdGljIGNvbnN0IFZhbHVlIFZBTFVFU19nY1szMF0gPSB7CisgICAgVmFsdWUoVV9HRU5FUkFMX09USEVSX1RZUEVTLCAiQ24gVW5hc3NpZ25lZCIpLAorICAgIFZhbHVlKFVfVVBQRVJDQVNFX0xFVFRFUiwgIkx1IFVwcGVyY2FzZV9MZXR0ZXIiKSwKKyAgICBWYWx1ZShVX0xPV0VSQ0FTRV9MRVRURVIsICJMbCBMb3dlcmNhc2VfTGV0dGVyIiksCisgICAgVmFsdWUoVV9USVRMRUNBU0VfTEVUVEVSLCAiTHQgVGl0bGVjYXNlX0xldHRlciIpLAorICAgIFZhbHVlKFVfTU9ESUZJRVJfTEVUVEVSLCAiTG0gTW9kaWZpZXJfTGV0dGVyIiksCisgICAgVmFsdWUoVV9PVEhFUl9MRVRURVIsICJMbyBPdGhlcl9MZXR0ZXIiKSwKKyAgICBWYWx1ZShVX05PTl9TUEFDSU5HX01BUkssICJNbiBOb25zcGFjaW5nX01hcmsiKSwKKyAgICBWYWx1ZShVX0VOQ0xPU0lOR19NQVJLLCAiTWUgRW5jbG9zaW5nX01hcmsiKSwKKyAgICBWYWx1ZShVX0NPTUJJTklOR19TUEFDSU5HX01BUkssICJNYyBTcGFjaW5nX01hcmsiKSwKKyAgICBWYWx1ZShVX0RFQ0lNQUxfRElHSVRfTlVNQkVSLCAiTmQgRGVjaW1hbF9OdW1iZXIgZGlnaXQiKSwKKyAgICBWYWx1ZShVX0xFVFRFUl9OVU1CRVIsICJObCBMZXR0ZXJfTnVtYmVyIiksCisgICAgVmFsdWUoVV9PVEhFUl9OVU1CRVIsICJObyBPdGhlcl9OdW1iZXIiKSwKKyAgICBWYWx1ZShVX1NQQUNFX1NFUEFSQVRPUiwgIlpzIFNwYWNlX1NlcGFyYXRvciIpLAorICAgIFZhbHVlKFVfTElORV9TRVBBUkFUT1IsICJabCBMaW5lX1NlcGFyYXRvciIpLAorICAgIFZhbHVlKFVfUEFSQUdSQVBIX1NFUEFSQVRPUiwgIlpwIFBhcmFncmFwaF9TZXBhcmF0b3IiKSwKKyAgICBWYWx1ZShVX0NPTlRST0xfQ0hBUiwgIkNjIENvbnRyb2wgY250cmwiKSwKKyAgICBWYWx1ZShVX0ZPUk1BVF9DSEFSLCAiQ2YgRm9ybWF0IiksCisgICAgVmFsdWUoVV9QUklWQVRFX1VTRV9DSEFSLCAiQ28gUHJpdmF0ZV9Vc2UiKSwKKyAgICBWYWx1ZShVX1NVUlJPR0FURSwgIkNzIFN1cnJvZ2F0ZSIpLAorICAgIFZhbHVlKFVfREFTSF9QVU5DVFVBVElPTiwgIlBkIERhc2hfUHVuY3R1YXRpb24iKSwKKyAgICBWYWx1ZShVX1NUQVJUX1BVTkNUVUFUSU9OLCAiUHMgT3Blbl9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKFVfRU5EX1BVTkNUVUFUSU9OLCAiUGUgQ2xvc2VfUHVuY3R1YXRpb24iKSwKKyAgICBWYWx1ZShVX0NPTk5FQ1RPUl9QVU5DVFVBVElPTiwgIlBjIENvbm5lY3Rvcl9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKFVfT1RIRVJfUFVOQ1RVQVRJT04sICJQbyBPdGhlcl9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKFVfTUFUSF9TWU1CT0wsICJTbSBNYXRoX1N5bWJvbCIpLAorICAgIFZhbHVlKFVfQ1VSUkVOQ1lfU1lNQk9MLCAiU2MgQ3VycmVuY3lfU3ltYm9sIiksCisgICAgVmFsdWUoVV9NT0RJRklFUl9TWU1CT0wsICJTayBNb2RpZmllcl9TeW1ib2wiKSwKKyAgICBWYWx1ZShVX09USEVSX1NZTUJPTCwgIlNvIE90aGVyX1N5bWJvbCIpLAorICAgIFZhbHVlKFVfSU5JVElBTF9QVU5DVFVBVElPTiwgIlBpIEluaXRpYWxfUHVuY3R1YXRpb24iKSwKKyAgICBWYWx1ZShVX0ZJTkFMX1BVTkNUVUFUSU9OLCAiUGYgRmluYWxfUHVuY3R1YXRpb24iKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfamdbNThdID0geworICAgIFZhbHVlKFVfSkdfTk9fSk9JTklOR19HUk9VUCwgIk5vX0pvaW5pbmdfR3JvdXAgTm9fSm9pbmluZ19Hcm91cCIpLAorICAgIFZhbHVlKFVfSkdfQUlOLCAiQWluIEFpbiIpLAorICAgIFZhbHVlKFVfSkdfQUxBUEgsICJBbGFwaCBBbGFwaCIpLAorICAgIFZhbHVlKFVfSkdfQUxFRiwgIkFsZWYgQWxlZiIpLAorICAgIFZhbHVlKFVfSkdfQkVILCAiQmVoIEJlaCIpLAorICAgIFZhbHVlKFVfSkdfQkVUSCwgIkJldGggQmV0aCIpLAorICAgIFZhbHVlKFVfSkdfREFMLCAiRGFsIERhbCIpLAorICAgIFZhbHVlKFVfSkdfREFMQVRIX1JJU0gsICJEYWxhdGhfUmlzaCBEYWxhdGhfUmlzaCIpLAorICAgIFZhbHVlKFVfSkdfRSwgIkUgRSIpLAorICAgIFZhbHVlKFVfSkdfRkVILCAiRmVoIEZlaCIpLAorICAgIFZhbHVlKFVfSkdfRklOQUxfU0VNS0FUSCwgIkZpbmFsX1NlbWthdGggRmluYWxfU2Vta2F0aCIpLAorICAgIFZhbHVlKFVfSkdfR0FGLCAiR2FmIEdhZiIpLAorICAgIFZhbHVlKFVfSkdfR0FNQUwsICJHYW1hbCBHYW1hbCIpLAorICAgIFZhbHVlKFVfSkdfSEFILCAiSGFoIEhhaCIpLAorICAgIFZhbHVlKFVfSkdfVEVIX01BUkJVVEFfR09BTCwgIlRlaF9NYXJidXRhX0dvYWwgSGFtemFfT25fSGVoX0dvYWwiKSwKKyAgICBWYWx1ZShVX0pHX0hFLCAiSGUgSGUiKSwKKyAgICBWYWx1ZShVX0pHX0hFSCwgIkhlaCBIZWgiKSwKKyAgICBWYWx1ZShVX0pHX0hFSF9HT0FMLCAiSGVoX0dvYWwgSGVoX0dvYWwiKSwKKyAgICBWYWx1ZShVX0pHX0hFVEgsICJIZXRoIEhldGgiKSwKKyAgICBWYWx1ZShVX0pHX0tBRiwgIkthZiBLYWYiKSwKKyAgICBWYWx1ZShVX0pHX0tBUEgsICJLYXBoIEthcGgiKSwKKyAgICBWYWx1ZShVX0pHX0tOT1RURURfSEVILCAiS25vdHRlZF9IZWggS25vdHRlZF9IZWgiKSwKKyAgICBWYWx1ZShVX0pHX0xBTSwgIkxhbSBMYW0iKSwKKyAgICBWYWx1ZShVX0pHX0xBTUFESCwgIkxhbWFkaCBMYW1hZGgiKSwKKyAgICBWYWx1ZShVX0pHX01FRU0sICJNZWVtIE1lZW0iKSwKKyAgICBWYWx1ZShVX0pHX01JTSwgIk1pbSBNaW0iKSwKKyAgICBWYWx1ZShVX0pHX05PT04sICJOb29uIE5vb24iKSwKKyAgICBWYWx1ZShVX0pHX05VTiwgIk51biBOdW4iKSwKKyAgICBWYWx1ZShVX0pHX1BFLCAiUGUgUGUiKSwKKyAgICBWYWx1ZShVX0pHX1FBRiwgIlFhZiBRYWYiKSwKKyAgICBWYWx1ZShVX0pHX1FBUEgsICJRYXBoIFFhcGgiKSwKKyAgICBWYWx1ZShVX0pHX1JFSCwgIlJlaCBSZWgiKSwKKyAgICBWYWx1ZShVX0pHX1JFVkVSU0VEX1BFLCAiUmV2ZXJzZWRfUGUgUmV2ZXJzZWRfUGUiKSwKKyAgICBWYWx1ZShVX0pHX1NBRCwgIlNhZCBTYWQiKSwKKyAgICBWYWx1ZShVX0pHX1NBREhFLCAiU2FkaGUgU2FkaGUiKSwKKyAgICBWYWx1ZShVX0pHX1NFRU4sICJTZWVuIFNlZW4iKSwKKyAgICBWYWx1ZShVX0pHX1NFTUtBVEgsICJTZW1rYXRoIFNlbWthdGgiKSwKKyAgICBWYWx1ZShVX0pHX1NISU4sICJTaGluIFNoaW4iKSwKKyAgICBWYWx1ZShVX0pHX1NXQVNIX0tBRiwgIlN3YXNoX0thZiBTd2FzaF9LYWYiKSwKKyAgICBWYWx1ZShVX0pHX1NZUklBQ19XQVcsICJTeXJpYWNfV2F3IFN5cmlhY19XYXciKSwKKyAgICBWYWx1ZShVX0pHX1RBSCwgIlRhaCBUYWgiKSwKKyAgICBWYWx1ZShVX0pHX1RBVywgIlRhdyBUYXciKSwKKyAgICBWYWx1ZShVX0pHX1RFSF9NQVJCVVRBLCAiVGVoX01hcmJ1dGEgVGVoX01hcmJ1dGEiKSwKKyAgICBWYWx1ZShVX0pHX1RFVEgsICJUZXRoIFRldGgiKSwKKyAgICBWYWx1ZShVX0pHX1dBVywgIldhdyBXYXciKSwKKyAgICBWYWx1ZShVX0pHX1lFSCwgIlllaCBZZWgiKSwKKyAgICBWYWx1ZShVX0pHX1lFSF9CQVJSRUUsICJZZWhfQmFycmVlIFllaF9CYXJyZWUiKSwKKyAgICBWYWx1ZShVX0pHX1lFSF9XSVRIX1RBSUwsICJZZWhfV2l0aF9UYWlsIFllaF9XaXRoX1RhaWwiKSwKKyAgICBWYWx1ZShVX0pHX1lVREgsICJZdWRoIFl1ZGgiKSwKKyAgICBWYWx1ZShVX0pHX1lVREhfSEUsICJZdWRoX0hlIFl1ZGhfSGUiKSwKKyAgICBWYWx1ZShVX0pHX1pBSU4sICJaYWluIFphaW4iKSwKKyAgICBWYWx1ZShVX0pHX0ZFLCAiRmUgRmUiKSwKKyAgICBWYWx1ZShVX0pHX0tIQVBILCAiS2hhcGggS2hhcGgiKSwKKyAgICBWYWx1ZShVX0pHX1pIQUlOLCAiWmhhaW4gWmhhaW4iKSwKKyAgICBWYWx1ZShVX0pHX0JVUlVTSEFTS0lfWUVIX0JBUlJFRSwgIkJ1cnVzaGFza2lfWWVoX0JhcnJlZSBCdXJ1c2hhc2tpX1llaF9CYXJyZWUiKSwKKyAgICBWYWx1ZShVX0pHX0ZBUlNJX1lFSCwgIkZhcnNpX1llaCBGYXJzaV9ZZWgiKSwKKyAgICBWYWx1ZShVX0pHX05ZQSwgIk55YSBOeWEiKSwKKyAgICBWYWx1ZShVX0pHX1JPSElOR1lBX1lFSCwgIlJvaGluZ3lhX1llaCBSb2hpbmd5YV9ZZWgiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfanRbNl0gPSB7CisgICAgVmFsdWUoVV9KVF9OT05fSk9JTklORywgIlUgTm9uX0pvaW5pbmciKSwKKyAgICBWYWx1ZShVX0pUX0pPSU5fQ0FVU0lORywgIkMgSm9pbl9DYXVzaW5nIiksCisgICAgVmFsdWUoVV9KVF9EVUFMX0pPSU5JTkcsICJEIER1YWxfSm9pbmluZyIpLAorICAgIFZhbHVlKFVfSlRfTEVGVF9KT0lOSU5HLCAiTCBMZWZ0X0pvaW5pbmciKSwKKyAgICBWYWx1ZShVX0pUX1JJR0hUX0pPSU5JTkcsICJSIFJpZ2h0X0pvaW5pbmciKSwKKyAgICBWYWx1ZShVX0pUX1RSQU5TUEFSRU5ULCAiVCBUcmFuc3BhcmVudCIpLAorfTsKKworc3RhdGljIGNvbnN0IFZhbHVlIFZBTFVFU19sYlszOV0gPSB7CisgICAgVmFsdWUoVV9MQl9VTktOT1dOLCAiWFggVW5rbm93biIpLAorICAgIFZhbHVlKFVfTEJfQU1CSUdVT1VTLCAiQUkgQW1iaWd1b3VzIiksCisgICAgVmFsdWUoVV9MQl9BTFBIQUJFVElDLCAiQUwgQWxwaGFiZXRpYyIpLAorICAgIFZhbHVlKFVfTEJfQlJFQUtfQk9USCwgIkIyIEJyZWFrX0JvdGgiKSwKKyAgICBWYWx1ZShVX0xCX0JSRUFLX0FGVEVSLCAiQkEgQnJlYWtfQWZ0ZXIiKSwKKyAgICBWYWx1ZShVX0xCX0JSRUFLX0JFRk9SRSwgIkJCIEJyZWFrX0JlZm9yZSIpLAorICAgIFZhbHVlKFVfTEJfTUFOREFUT1JZX0JSRUFLLCAiQksgTWFuZGF0b3J5X0JyZWFrIiksCisgICAgVmFsdWUoVV9MQl9DT05USU5HRU5UX0JSRUFLLCAiQ0IgQ29udGluZ2VudF9CcmVhayIpLAorICAgIFZhbHVlKFVfTEJfQ0xPU0VfUFVOQ1RVQVRJT04sICJDTCBDbG9zZV9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKFVfTEJfQ09NQklOSU5HX01BUkssICJDTSBDb21iaW5pbmdfTWFyayIpLAorICAgIFZhbHVlKFVfTEJfQ0FSUklBR0VfUkVUVVJOLCAiQ1IgQ2FycmlhZ2VfUmV0dXJuIiksCisgICAgVmFsdWUoVV9MQl9FWENMQU1BVElPTiwgIkVYIEV4Y2xhbWF0aW9uIiksCisgICAgVmFsdWUoVV9MQl9HTFVFLCAiR0wgR2x1ZSIpLAorICAgIFZhbHVlKFVfTEJfSFlQSEVOLCAiSFkgSHlwaGVuIiksCisgICAgVmFsdWUoVV9MQl9JREVPR1JBUEhJQywgIklEIElkZW9ncmFwaGljIiksCisgICAgVmFsdWUoVV9MQl9JTlNFUEFSQUJMRSwgIklOIEluc2VwYXJhYmxlIEluc2VwZXJhYmxlIiksCisgICAgVmFsdWUoVV9MQl9JTkZJWF9OVU1FUklDLCAiSVMgSW5maXhfTnVtZXJpYyIpLAorICAgIFZhbHVlKFVfTEJfTElORV9GRUVELCAiTEYgTGluZV9GZWVkIiksCisgICAgVmFsdWUoVV9MQl9OT05TVEFSVEVSLCAiTlMgTm9uc3RhcnRlciIpLAorICAgIFZhbHVlKFVfTEJfTlVNRVJJQywgIk5VIE51bWVyaWMiKSwKKyAgICBWYWx1ZShVX0xCX09QRU5fUFVOQ1RVQVRJT04sICJPUCBPcGVuX1B1bmN0dWF0aW9uIiksCisgICAgVmFsdWUoVV9MQl9QT1NURklYX05VTUVSSUMsICJQTyBQb3N0Zml4X051bWVyaWMiKSwKKyAgICBWYWx1ZShVX0xCX1BSRUZJWF9OVU1FUklDLCAiUFIgUHJlZml4X051bWVyaWMiKSwKKyAgICBWYWx1ZShVX0xCX1FVT1RBVElPTiwgIlFVIFF1b3RhdGlvbiIpLAorICAgIFZhbHVlKFVfTEJfQ09NUExFWF9DT05URVhULCAiU0EgQ29tcGxleF9Db250ZXh0IiksCisgICAgVmFsdWUoVV9MQl9TVVJST0dBVEUsICJTRyBTdXJyb2dhdGUiKSwKKyAgICBWYWx1ZShVX0xCX1NQQUNFLCAiU1AgU3BhY2UiKSwKKyAgICBWYWx1ZShVX0xCX0JSRUFLX1NZTUJPTFMsICJTWSBCcmVha19TeW1ib2xzIiksCisgICAgVmFsdWUoVV9MQl9aV1NQQUNFLCAiWlcgWldTcGFjZSIpLAorICAgIFZhbHVlKFVfTEJfTkVYVF9MSU5FLCAiTkwgTmV4dF9MaW5lIiksCisgICAgVmFsdWUoVV9MQl9XT1JEX0pPSU5FUiwgIldKIFdvcmRfSm9pbmVyIiksCisgICAgVmFsdWUoVV9MQl9IMiwgIkgyIEgyIiksCisgICAgVmFsdWUoVV9MQl9IMywgIkgzIEgzIiksCisgICAgVmFsdWUoVV9MQl9KTCwgIkpMIEpMIiksCisgICAgVmFsdWUoVV9MQl9KVCwgIkpUIEpUIiksCisgICAgVmFsdWUoVV9MQl9KViwgIkpWIEpWIiksCisgICAgVmFsdWUoVV9MQl9DTE9TRV9QQVJFTlRIRVNJUywgIkNQIENsb3NlX1BhcmVudGhlc2lzIiksCisgICAgVmFsdWUoVV9MQl9DT05ESVRJT05BTF9KQVBBTkVTRV9TVEFSVEVSLCAiQ0ogQ29uZGl0aW9uYWxfSmFwYW5lc2VfU3RhcnRlciIpLAorICAgIFZhbHVlKFVfTEJfSEVCUkVXX0xFVFRFUiwgIkhMIEhlYnJld19MZXR0ZXIiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfbnRbNF0gPSB7CisgICAgVmFsdWUoVV9OVF9OT05FLCAiTm9uZSBOb25lIiksCisgICAgVmFsdWUoVV9OVF9ERUNJTUFMLCAiRGUgRGVjaW1hbCIpLAorICAgIFZhbHVlKFVfTlRfRElHSVQsICJEaSBEaWdpdCIpLAorICAgIFZhbHVlKFVfTlRfTlVNRVJJQywgIk51IE51bWVyaWMiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfc2NbMTU5XSA9IHsKKyAgICBWYWx1ZShVU0NSSVBUX0NPTU1PTiwgIlp5eXkgQ29tbW9uIiksCisgICAgVmFsdWUoVVNDUklQVF9JTkhFUklURUQsICJaaW5oIEluaGVyaXRlZCBRYWFpIiksCisgICAgVmFsdWUoVVNDUklQVF9BUkFCSUMsICJBcmFiIEFyYWJpYyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfQVJNRU5JQU4sICJBcm1uIEFybWVuaWFuIiksCisgICAgVmFsdWUoVVNDUklQVF9CRU5HQUxJLCAiQmVuZyBCZW5nYWxpIiksCisgICAgVmFsdWUoVVNDUklQVF9CT1BPTU9GTywgIkJvcG8gQm9wb21vZm8iKSwKKyAgICBWYWx1ZShVU0NSSVBUX0NIRVJPS0VFLCAiQ2hlciBDaGVyb2tlZSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfQ09QVElDLCAiQ29wdCBDb3B0aWMgUWFhYyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfQ1lSSUxMSUMsICJDeXJsIEN5cmlsbGljIiksCisgICAgVmFsdWUoVVNDUklQVF9ERVNFUkVULCAiRHNydCBEZXNlcmV0IiksCisgICAgVmFsdWUoVVNDUklQVF9ERVZBTkFHQVJJLCAiRGV2YSBEZXZhbmFnYXJpIiksCisgICAgVmFsdWUoVVNDUklQVF9FVEhJT1BJQywgIkV0aGkgRXRoaW9waWMiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0dFT1JHSUFOLCAiR2VvciBHZW9yZ2lhbiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfR09USElDLCAiR290aCBHb3RoaWMiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0dSRUVLLCAiR3JlayBHcmVlayIpLAorICAgIFZhbHVlKFVTQ1JJUFRfR1VKQVJBVEksICJHdWpyIEd1amFyYXRpIiksCisgICAgVmFsdWUoVVNDUklQVF9HVVJNVUtISSwgIkd1cnUgR3VybXVraGkiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0hBTiwgIkhhbmkgSGFuIiksCisgICAgVmFsdWUoVVNDUklQVF9IQU5HVUwsICJIYW5nIEhhbmd1bCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfSEVCUkVXLCAiSGViciBIZWJyZXciKSwKKyAgICBWYWx1ZShVU0NSSVBUX0hJUkFHQU5BLCAiSGlyYSBIaXJhZ2FuYSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfS0FOTkFEQSwgIktuZGEgS2FubmFkYSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfS0FUQUtBTkEsICJLYW5hIEthdGFrYW5hIiksCisgICAgVmFsdWUoVVNDUklQVF9LSE1FUiwgIktobXIgS2htZXIiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0xBTywgIkxhb28gTGFvIiksCisgICAgVmFsdWUoVVNDUklQVF9MQVRJTiwgIkxhdG4gTGF0aW4iKSwKKyAgICBWYWx1ZShVU0NSSVBUX01BTEFZQUxBTSwgIk1seW0gTWFsYXlhbGFtIiksCisgICAgVmFsdWUoVVNDUklQVF9NT05HT0xJQU4sICJNb25nIE1vbmdvbGlhbiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTVlBTk1BUiwgIk15bXIgTXlhbm1hciIpLAorICAgIFZhbHVlKFVTQ1JJUFRfT0dIQU0sICJPZ2FtIE9naGFtIiksCisgICAgVmFsdWUoVVNDUklQVF9PTERfSVRBTElDLCAiSXRhbCBPbGRfSXRhbGljIiksCisgICAgVmFsdWUoVVNDUklQVF9PUklZQSwgIk9yeWEgT3JpeWEiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1JVTklDLCAiUnVuciBSdW5pYyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfU0lOSEFMQSwgIlNpbmggU2luaGFsYSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfU1lSSUFDLCAiU3lyYyBTeXJpYWMiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1RBTUlMLCAiVGFtbCBUYW1pbCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfVEVMVUdVLCAiVGVsdSBUZWx1Z3UiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1RIQUFOQSwgIlRoYWEgVGhhYW5hIiksCisgICAgVmFsdWUoVVNDUklQVF9USEFJLCAiVGhhaSBUaGFpIiksCisgICAgVmFsdWUoVVNDUklQVF9USUJFVEFOLCAiVGlidCBUaWJldGFuIiksCisgICAgVmFsdWUoVVNDUklQVF9DQU5BRElBTl9BQk9SSUdJTkFMLCAiQ2FucyBDYW5hZGlhbl9BYm9yaWdpbmFsIiksCisgICAgVmFsdWUoVVNDUklQVF9ZSSwgIllpaWkgWWkiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1RBR0FMT0csICJUZ2xnIFRhZ2Fsb2ciKSwKKyAgICBWYWx1ZShVU0NSSVBUX0hBTlVOT08sICJIYW5vIEhhbnVub28iKSwKKyAgICBWYWx1ZShVU0NSSVBUX0JVSElELCAiQnVoZCBCdWhpZCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfVEFHQkFOV0EsICJUYWdiIFRhZ2JhbndhIiksCisgICAgVmFsdWUoVVNDUklQVF9CUkFJTExFLCAiQnJhaSBCcmFpbGxlIiksCisgICAgVmFsdWUoVVNDUklQVF9DWVBSSU9ULCAiQ3BydCBDeXByaW90IiksCisgICAgVmFsdWUoVVNDUklQVF9MSU1CVSwgIkxpbWIgTGltYnUiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0xJTkVBUl9CLCAiTGluYiBMaW5lYXJfQiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfT1NNQU5ZQSwgIk9zbWEgT3NtYW55YSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfU0hBVklBTiwgIlNoYXcgU2hhdmlhbiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfVEFJX0xFLCAiVGFsZSBUYWlfTGUiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1VHQVJJVElDLCAiVWdhciBVZ2FyaXRpYyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfS0FUQUtBTkFfT1JfSElSQUdBTkEsICJIcmt0IEthdGFrYW5hX09yX0hpcmFnYW5hIiksCisgICAgVmFsdWUoVVNDUklQVF9CVUdJTkVTRSwgIkJ1Z2kgQnVnaW5lc2UiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0dMQUdPTElUSUMsICJHbGFnIEdsYWdvbGl0aWMiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0tIQVJPU0hUSEksICJLaGFyIEtoYXJvc2h0aGkiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1NZTE9USV9OQUdSSSwgIlN5bG8gU3lsb3RpX05hZ3JpIiksCisgICAgVmFsdWUoVVNDUklQVF9ORVdfVEFJX0xVRSwgIlRhbHUgTmV3X1RhaV9MdWUiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1RJRklOQUdILCAiVGZuZyBUaWZpbmFnaCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfT0xEX1BFUlNJQU4sICJYcGVvIE9sZF9QZXJzaWFuIiksCisgICAgVmFsdWUoVVNDUklQVF9CQUxJTkVTRSwgIkJhbGkgQmFsaW5lc2UiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0JBVEFLLCAiQmF0ayBCYXRhayIpLAorICAgIFZhbHVlKFVTQ1JJUFRfQkxJU1NZTUJPTFMsICJCbGlzIEJsaXMiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0JSQUhNSSwgIkJyYWggQnJhaG1pIiksCisgICAgVmFsdWUoVVNDUklQVF9DSEFNLCAiQ2hhbSBDaGFtIiksCisgICAgVmFsdWUoVVNDUklQVF9DSVJUSCwgIkNpcnQgQ2lydCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfT0xEX0NIVVJDSF9TTEFWT05JQ19DWVJJTExJQywgIkN5cnMgQ3lycyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfREVNT1RJQ19FR1lQVElBTiwgIkVneWQgRWd5ZCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfSElFUkFUSUNfRUdZUFRJQU4sICJFZ3loIEVneWgiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0VHWVBUSUFOX0hJRVJPR0xZUEhTLCAiRWd5cCBFZ3lwdGlhbl9IaWVyb2dseXBocyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfS0hVVFNVUkksICJHZW9rIEdlb2siKSwKKyAgICBWYWx1ZShVU0NSSVBUX1NJTVBMSUZJRURfSEFOLCAiSGFucyBIYW5zIiksCisgICAgVmFsdWUoVVNDUklQVF9UUkFESVRJT05BTF9IQU4sICJIYW50IEhhbnQiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1BBSEFXSF9ITU9ORywgIkhtbmcgSG1uZyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfT0xEX0hVTkdBUklBTiwgIkh1bmcgSHVuZyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfSEFSQVBQQU5fSU5EVVMsICJJbmRzIEluZHMiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0pBVkFORVNFLCAiSmF2YSBKYXZhbmVzZSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfS0FZQUhfTEksICJLYWxpIEtheWFoX0xpIiksCisgICAgVmFsdWUoVVNDUklQVF9MQVRJTl9GUkFLVFVSLCAiTGF0ZiBMYXRmIiksCisgICAgVmFsdWUoVVNDUklQVF9MQVRJTl9HQUVMSUMsICJMYXRnIExhdGciKSwKKyAgICBWYWx1ZShVU0NSSVBUX0xFUENIQSwgIkxlcGMgTGVwY2hhIiksCisgICAgVmFsdWUoVVNDUklQVF9MSU5FQVJfQSwgIkxpbmEgTGluYSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTUFOREFJQywgIk1hbmQgTWFuZGFpYyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTUFZQU5fSElFUk9HTFlQSFMsICJNYXlhIE1heWEiKSwKKyAgICBWYWx1ZShVU0NSSVBUX01FUk9JVElDX0hJRVJPR0xZUEhTLCAiTWVybyBNZXJvaXRpY19IaWVyb2dseXBocyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTktPLCAiTmtvbyBOa28iKSwKKyAgICBWYWx1ZShVU0NSSVBUX09SS0hPTiwgIk9ya2ggT2xkX1R1cmtpYyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfT0xEX1BFUk1JQywgIlBlcm0gUGVybSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfUEhBR1NfUEEsICJQaGFnIFBoYWdzX1BhIiksCisgICAgVmFsdWUoVVNDUklQVF9QSE9FTklDSUFOLCAiUGhueCBQaG9lbmljaWFuIiksCisgICAgVmFsdWUoVVNDUklQVF9QSE9ORVRJQ19QT0xMQVJELCAiUGxyZCBNaWFvIiksCisgICAgVmFsdWUoVVNDUklQVF9ST05HT1JPTkdPLCAiUm9ybyBSb3JvIiksCisgICAgVmFsdWUoVVNDUklQVF9TQVJBVEksICJTYXJhIFNhcmEiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0VTVFJBTkdFTE9fU1lSSUFDLCAiU3lyZSBTeXJlIiksCisgICAgVmFsdWUoVVNDUklQVF9XRVNURVJOX1NZUklBQywgIlN5cmogU3lyaiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfRUFTVEVSTl9TWVJJQUMsICJTeXJuIFN5cm4iKSwKKyAgICBWYWx1ZShVU0NSSVBUX1RFTkdXQVIsICJUZW5nIFRlbmciKSwKKyAgICBWYWx1ZShVU0NSSVBUX1ZBSSwgIlZhaWkgVmFpIiksCisgICAgVmFsdWUoVVNDUklQVF9WSVNJQkxFX1NQRUVDSCwgIlZpc3AgVmlzcCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfQ1VORUlGT1JNLCAiWHN1eCBDdW5laWZvcm0iKSwKKyAgICBWYWx1ZShVU0NSSVBUX1VOV1JJVFRFTl9MQU5HVUFHRVMsICJaeHh4IFp4eHgiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1VOS05PV04sICJaenp6IFVua25vd24iKSwKKyAgICBWYWx1ZShVU0NSSVBUX0NBUklBTiwgIkNhcmkgQ2FyaWFuIiksCisgICAgVmFsdWUoVVNDUklQVF9KQVBBTkVTRSwgIkpwYW4gSnBhbiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTEFOTkEsICJMYW5hIFRhaV9UaGFtIiksCisgICAgVmFsdWUoVVNDUklQVF9MWUNJQU4sICJMeWNpIEx5Y2lhbiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTFlESUFOLCAiTHlkaSBMeWRpYW4iKSwKKyAgICBWYWx1ZShVU0NSSVBUX09MX0NISUtJLCAiT2xjayBPbF9DaGlraSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfUkVKQU5HLCAiUmpuZyBSZWphbmciKSwKKyAgICBWYWx1ZShVU0NSSVBUX1NBVVJBU0hUUkEsICJTYXVyIFNhdXJhc2h0cmEiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1NJR05fV1JJVElORywgIlNnbncgU2dudyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfU1VOREFORVNFLCAiU3VuZCBTdW5kYW5lc2UiKSwKKyAgICBWYWx1ZShVU0NSSVBUX01PT04sICJNb29uIE1vb24iKSwKKyAgICBWYWx1ZShVU0NSSVBUX01FSVRFSV9NQVlFSywgIk10ZWkgTWVldGVpX01heWVrIiksCisgICAgVmFsdWUoVVNDUklQVF9JTVBFUklBTF9BUkFNQUlDLCAiQXJtaSBJbXBlcmlhbF9BcmFtYWljIiksCisgICAgVmFsdWUoVVNDUklQVF9BVkVTVEFOLCAiQXZzdCBBdmVzdGFuIiksCisgICAgVmFsdWUoVVNDUklQVF9DSEFLTUEsICJDYWttIENoYWttYSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfS09SRUFOLCAiS29yZSBLb3JlIiksCisgICAgVmFsdWUoVVNDUklQVF9LQUlUSEksICJLdGhpIEthaXRoaSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTUFOSUNIQUVBTiwgIk1hbmkgTWFuaSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfSU5TQ1JJUFRJT05BTF9QQUhMQVZJLCAiUGhsaSBJbnNjcmlwdGlvbmFsX1BhaGxhdmkiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1BTQUxURVJfUEFITEFWSSwgIlBobHAgUGhscCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfQk9PS19QQUhMQVZJLCAiUGhsdiBQaGx2IiksCisgICAgVmFsdWUoVVNDUklQVF9JTlNDUklQVElPTkFMX1BBUlRISUFOLCAiUHJ0aSBJbnNjcmlwdGlvbmFsX1BhcnRoaWFuIiksCisgICAgVmFsdWUoVVNDUklQVF9TQU1BUklUQU4sICJTYW1yIFNhbWFyaXRhbiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfVEFJX1ZJRVQsICJUYXZ0IFRhaV9WaWV0IiksCisgICAgVmFsdWUoVVNDUklQVF9NQVRIRU1BVElDQUxfTk9UQVRJT04sICJabXRoIFptdGgiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1NZTUJPTFMsICJac3ltIFpzeW0iKSwKKyAgICBWYWx1ZShVU0NSSVBUX0JBTVVNLCAiQmFtdSBCYW11bSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTElTVSwgIkxpc3UgTGlzdSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTkFLSElfR0VCQSwgIk5rZ2IgTmtnYiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfT0xEX1NPVVRIX0FSQUJJQU4sICJTYXJiIE9sZF9Tb3V0aF9BcmFiaWFuIiksCisgICAgVmFsdWUoVVNDUklQVF9CQVNTQV9WQUgsICJCYXNzIEJhc3MiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0RVUExPWUFOX1NIT1JUQU5ELCAiRHVwbCBEdXBsIiksCisgICAgVmFsdWUoVVNDUklQVF9FTEJBU0FOLCAiRWxiYSBFbGJhIiksCisgICAgVmFsdWUoVVNDUklQVF9HUkFOVEhBLCAiR3JhbiBHcmFuIiksCisgICAgVmFsdWUoVVNDUklQVF9LUEVMTEUsICJLcGVsIEtwZWwiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0xPTUEsICJMb21hIExvbWEiKSwKKyAgICBWYWx1ZShVU0NSSVBUX01FTkRFLCAiTWVuZCBNZW5kIiksCisgICAgVmFsdWUoVVNDUklQVF9NRVJPSVRJQ19DVVJTSVZFLCAiTWVyYyBNZXJvaXRpY19DdXJzaXZlIiksCisgICAgVmFsdWUoVVNDUklQVF9PTERfTk9SVEhfQVJBQklBTiwgIk5hcmIgTmFyYiIpLAorICAgIFZhbHVlKFVTQ1JJUFRfTkFCQVRBRUFOLCAiTmJhdCBOYmF0IiksCisgICAgVmFsdWUoVVNDUklQVF9QQUxNWVJFTkUsICJQYWxtIFBhbG0iKSwKKyAgICBWYWx1ZShVU0NSSVBUX1NJTkRISSwgIlNpbmQgU2luZCIpLAorICAgIFZhbHVlKFVTQ1JJUFRfV0FSQU5HX0NJVEksICJXYXJhIFdhcmEiKSwKKyAgICBWYWx1ZShVU0NSSVBUX0FGQUtBLCAiQWZhayBBZmFrIiksCisgICAgVmFsdWUoVVNDUklQVF9KVVJDSEVOLCAiSnVyYyBKdXJjIiksCisgICAgVmFsdWUoVVNDUklQVF9NUk8sICJNcm9vIE1yb28iKSwKKyAgICBWYWx1ZShVU0NSSVBUX05VU0hVLCAiTnNodSBOc2h1IiksCisgICAgVmFsdWUoVVNDUklQVF9TSEFSQURBLCAiU2hyZCBTaGFyYWRhIiksCisgICAgVmFsdWUoVVNDUklQVF9TT1JBX1NPTVBFTkcsICJTb3JhIFNvcmFfU29tcGVuZyIpLAorICAgIFZhbHVlKFVTQ1JJUFRfVEFLUkksICJUYWtyIFRha3JpIiksCisgICAgVmFsdWUoVVNDUklQVF9UQU5HVVQsICJUYW5nIFRhbmciKSwKKyAgICBWYWx1ZShVU0NSSVBUX1dPTEVBSSwgIldvbGUgV29sZSIpLAorICAgIFZhbHVlKFVTQ1JJUFRfQU5BVE9MSUFOX0hJRVJPR0xZUEhTLCAiSGx1dyBIbHV3IiksCisgICAgVmFsdWUoVVNDUklQVF9LSE9KS0ksICJLaG9qIEtob2oiKSwKKyAgICBWYWx1ZShVU0NSSVBUX1RJUkhVVEEsICJUaXJoIFRpcmgiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfaHN0WzZdID0geworICAgIFZhbHVlKFVfSFNUX05PVF9BUFBMSUNBQkxFLCAiTkEgTm90X0FwcGxpY2FibGUiKSwKKyAgICBWYWx1ZShVX0hTVF9MRUFESU5HX0pBTU8sICJMIExlYWRpbmdfSmFtbyIpLAorICAgIFZhbHVlKFVfSFNUX1ZPV0VMX0pBTU8sICJWIFZvd2VsX0phbW8iKSwKKyAgICBWYWx1ZShVX0hTVF9UUkFJTElOR19KQU1PLCAiVCBUcmFpbGluZ19KYW1vIiksCisgICAgVmFsdWUoVV9IU1RfTFZfU1lMTEFCTEUsICJMViBMVl9TeWxsYWJsZSIpLAorICAgIFZhbHVlKFVfSFNUX0xWVF9TWUxMQUJMRSwgIkxWVCBMVlRfU3lsbGFibGUiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfTkZEX1FDWzJdID0geworICAgIFZhbHVlKFVOT1JNX05PLCAiTiBObyIpLAorICAgIFZhbHVlKFVOT1JNX1lFUywgIlkgWWVzIiksCit9OworCitzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX05GS0RfUUNbMl0gPSB7CisgICAgVmFsdWUoVU5PUk1fTk8sICJOIE5vIiksCisgICAgVmFsdWUoVU5PUk1fWUVTLCAiWSBZZXMiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfTkZDX1FDWzNdID0geworICAgIFZhbHVlKFVOT1JNX05PLCAiTiBObyIpLAorICAgIFZhbHVlKFVOT1JNX1lFUywgIlkgWWVzIiksCisgICAgVmFsdWUoVU5PUk1fTUFZQkUsICJNIE1heWJlIiksCit9OworCitzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX05GS0NfUUNbM10gPSB7CisgICAgVmFsdWUoVU5PUk1fTk8sICJOIE5vIiksCisgICAgVmFsdWUoVU5PUk1fWUVTLCAiWSBZZXMiKSwKKyAgICBWYWx1ZShVTk9STV9NQVlCRSwgIk0gTWF5YmUiKSwKK307CisKK3N0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfbGNjY1s1Nl0gPSB7CisgICAgVmFsdWUoMCwgIk5SIE5vdF9SZW9yZGVyZWQiKSwKKyAgICBWYWx1ZSgxLCAiT1YgT3ZlcmxheSIpLAorICAgIFZhbHVlKDcsICJOSyBOdWt0YSIpLAorICAgIFZhbHVlKDgsICJLViBLYW5hX1ZvaWNpbmciKSwKKyAgICBWYWx1ZSg5LCAiVlIgVmlyYW1hIiksCisgICAgVmFsdWUoMTAsICJDQ0MxMCBDQ0MxMCIpLAorICAgIFZhbHVlKDExLCAiQ0NDMTEgQ0NDMTEiKSwKKyAgICBWYWx1ZSgxMiwgIkNDQzEyIENDQzEyIiksCisgICAgVmFsdWUoMTMsICJDQ0MxMyBDQ0MxMyIpLAorICAgIFZhbHVlKDE0LCAiQ0NDMTQgQ0NDMTQiKSwKKyAgICBWYWx1ZSgxNSwgIkNDQzE1IENDQzE1IiksCisgICAgVmFsdWUoMTYsICJDQ0MxNiBDQ0MxNiIpLAorICAgIFZhbHVlKDE3LCAiQ0NDMTcgQ0NDMTciKSwKKyAgICBWYWx1ZSgxOCwgIkNDQzE4IENDQzE4IiksCisgICAgVmFsdWUoMTksICJDQ0MxOSBDQ0MxOSIpLAorICAgIFZhbHVlKDIwLCAiQ0NDMjAgQ0NDMjAiKSwKKyAgICBWYWx1ZSgyMSwgIkNDQzIxIENDQzIxIiksCisgICAgVmFsdWUoMjIsICJDQ0MyMiBDQ0MyMiIpLAorICAgIFZhbHVlKDIzLCAiQ0NDMjMgQ0NDMjMiKSwKKyAgICBWYWx1ZSgyNCwgIkNDQzI0IENDQzI0IiksCisgICAgVmFsdWUoMjUsICJDQ0MyNSBDQ0MyNSIpLAorICAgIFZhbHVlKDI2LCAiQ0NDMjYgQ0NDMjYiKSwKKyAgICBWYWx1ZSgyNywgIkNDQzI3IENDQzI3IiksCisgICAgVmFsdWUoMjgsICJDQ0MyOCBDQ0MyOCIpLAorICAgIFZhbHVlKDI5LCAiQ0NDMjkgQ0NDMjkiKSwKKyAgICBWYWx1ZSgzMCwgIkNDQzMwIENDQzMwIiksCisgICAgVmFsdWUoMzEsICJDQ0MzMSBDQ0MzMSIpLAorICAgIFZhbHVlKDMyLCAiQ0NDMzIgQ0NDMzIiKSwKKyAgICBWYWx1ZSgzMywgIkNDQzMzIENDQzMzIiksCisgICAgVmFsdWUoMzQsICJDQ0MzNCBDQ0MzNCIpLAorICAgIFZhbHVlKDM1LCAiQ0NDMzUgQ0NDMzUiKSwKKyAgICBWYWx1ZSgzNiwgIkNDQzM2IENDQzM2IiksCisgICAgVmFsdWUoODQsICJDQ0M4NCBDQ0M4NCIpLAorICAgIFZhbHVlKDkxLCAiQ0NDOTEgQ0NDOTEiKSwKKyAgICBWYWx1ZSgxMDMsICJDQ0MxMDMgQ0NDMTAzIiksCisgICAgVmFsdWUoMTA3LCAiQ0NDMTA3IENDQzEwNyIpLAorICAgIFZhbHVlKDExOCwgIkNDQzExOCBDQ0MxMTgiKSwKKyAgICBWYWx1ZSgxMjIsICJDQ0MxMjIgQ0NDMTIyIiksCisgICAgVmFsdWUoMTI5LCAiQ0NDMTI5IENDQzEyOSIpLAorICAgIFZhbHVlKDEzMCwgIkNDQzEzMCBDQ0MxMzAiKSwKKyAgICBWYWx1ZSgxMzIsICJDQ0MxMzMgQ0NDMTMzIiksCisgICAgVmFsdWUoMjAwLCAiQVRCTCBBdHRhY2hlZF9CZWxvd19MZWZ0IiksCisgICAgVmFsdWUoMjAyLCAiQVRCIEF0dGFjaGVkX0JlbG93IiksCisgICAgVmFsdWUoMjE0LCAiQVRBIEF0dGFjaGVkX0Fib3ZlIiksCisgICAgVmFsdWUoMjE2LCAiQVRBUiBBdHRhY2hlZF9BYm92ZV9SaWdodCIpLAorICAgIFZhbHVlKDIxOCwgIkJMIEJlbG93X0xlZnQiKSwKKyAgICBWYWx1ZSgyMjAsICJCIEJlbG93IiksCisgICAgVmFsdWUoMjIyLCAiQlIgQmVsb3dfUmlnaHQiKSwKKyAgICBWYWx1ZSgyMjQsICJMIExlZnQiKSwKKyAgICBWYWx1ZSgyMjYsICJSIFJpZ2h0IiksCisgICAgVmFsdWUoMjI4LCAiQUwgQWJvdmVfTGVmdCIpLAorICAgIFZhbHVlKDIzMCwgIkEgQWJvdmUiKSwKKyAgICBWYWx1ZSgyMzIsICJBUiBBYm92ZV9SaWdodCIpLAorICAgIFZhbHVlKDIzMywgIkRCIERvdWJsZV9CZWxvdyIpLAorICAgIFZhbHVlKDIzNCwgIkRBIERvdWJsZV9BYm92ZSIpLAorICAgIFZhbHVlKDI0MCwgIklTIElvdGFfU3Vic2NyaXB0IiksCit9OworCitzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX3RjY2NbNTZdID0geworICAgIFZhbHVlKDAsICJOUiBOb3RfUmVvcmRlcmVkIiksCisgICAgVmFsdWUoMSwgIk9WIE92ZXJsYXkiKSwKKyAgICBWYWx1ZSg3LCAiTksgTnVrdGEiKSwKKyAgICBWYWx1ZSg4LCAiS1YgS2FuYV9Wb2ljaW5nIiksCisgICAgVmFsdWUoOSwgIlZSIFZpcmFtYSIpLAorICAgIFZhbHVlKDEwLCAiQ0NDMTAgQ0NDMTAiKSwKKyAgICBWYWx1ZSgxMSwgIkNDQzExIENDQzExIiksCisgICAgVmFsdWUoMTIsICJDQ0MxMiBDQ0MxMiIpLAorICAgIFZhbHVlKDEzLCAiQ0NDMTMgQ0NDMTMiKSwKKyAgICBWYWx1ZSgxNCwgIkNDQzE0IENDQzE0IiksCisgICAgVmFsdWUoMTUsICJDQ0MxNSBDQ0MxNSIpLAorICAgIFZhbHVlKDE2LCAiQ0NDMTYgQ0NDMTYiKSwKKyAgICBWYWx1ZSgxNywgIkNDQzE3IENDQzE3IiksCisgICAgVmFsdWUoMTgsICJDQ0MxOCBDQ0MxOCIpLAorICAgIFZhbHVlKDE5LCAiQ0NDMTkgQ0NDMTkiKSwKKyAgICBWYWx1ZSgyMCwgIkNDQzIwIENDQzIwIiksCisgICAgVmFsdWUoMjEsICJDQ0MyMSBDQ0MyMSIpLAorICAgIFZhbHVlKDIyLCAiQ0NDMjIgQ0NDMjIiKSwKKyAgICBWYWx1ZSgyMywgIkNDQzIzIENDQzIzIiksCisgICAgVmFsdWUoMjQsICJDQ0MyNCBDQ0MyNCIpLAorICAgIFZhbHVlKDI1LCAiQ0NDMjUgQ0NDMjUiKSwKKyAgICBWYWx1ZSgyNiwgIkNDQzI2IENDQzI2IiksCisgICAgVmFsdWUoMjcsICJDQ0MyNyBDQ0MyNyIpLAorICAgIFZhbHVlKDI4LCAiQ0NDMjggQ0NDMjgiKSwKKyAgICBWYWx1ZSgyOSwgIkNDQzI5IENDQzI5IiksCisgICAgVmFsdWUoMzAsICJDQ0MzMCBDQ0MzMCIpLAorICAgIFZhbHVlKDMxLCAiQ0NDMzEgQ0NDMzEiKSwKKyAgICBWYWx1ZSgzMiwgIkNDQzMyIENDQzMyIiksCisgICAgVmFsdWUoMzMsICJDQ0MzMyBDQ0MzMyIpLAorICAgIFZhbHVlKDM0LCAiQ0NDMzQgQ0NDMzQiKSwKKyAgICBWYWx1ZSgzNSwgIkNDQzM1IENDQzM1IiksCisgICAgVmFsdWUoMzYsICJDQ0MzNiBDQ0MzNiIpLAorICAgIFZhbHVlKDg0LCAiQ0NDODQgQ0NDODQiKSwKKyAgICBWYWx1ZSg5MSwgIkNDQzkxIENDQzkxIiksCisgICAgVmFsdWUoMTAzLCAiQ0NDMTAzIENDQzEwMyIpLAorICAgIFZhbHVlKDEwNywgIkNDQzEwNyBDQ0MxMDciKSwKKyAgICBWYWx1ZSgxMTgsICJDQ0MxMTggQ0NDMTE4IiksCisgICAgVmFsdWUoMTIyLCAiQ0NDMTIyIENDQzEyMiIpLAorICAgIFZhbHVlKDEyOSwgIkNDQzEyOSBDQ0MxMjkiKSwKKyAgICBWYWx1ZSgxMzAsICJDQ0MxMzAgQ0NDMTMwIiksCisgICAgVmFsdWUoMTMyLCAiQ0NDMTMzIENDQzEzMyIpLAorICAgIFZhbHVlKDIwMCwgIkFUQkwgQXR0YWNoZWRfQmVsb3dfTGVmdCIpLAorICAgIFZhbHVlKDIwMiwgIkFUQiBBdHRhY2hlZF9CZWxvdyIpLAorICAgIFZhbHVlKDIxNCwgIkFUQSBBdHRhY2hlZF9BYm92ZSIpLAorICAgIFZhbHVlKDIxNiwgIkFUQVIgQXR0YWNoZWRfQWJvdmVfUmlnaHQiKSwKKyAgICBWYWx1ZSgyMTgsICJCTCBCZWxvd19MZWZ0IiksCisgICAgVmFsdWUoMjIwLCAiQiBCZWxvdyIpLAorICAgIFZhbHVlKDIyMiwgIkJSIEJlbG93X1JpZ2h0IiksCisgICAgVmFsdWUoMjI0LCAiTCBMZWZ0IiksCisgICAgVmFsdWUoMjI2LCAiUiBSaWdodCIpLAorICAgIFZhbHVlKDIyOCwgIkFMIEFib3ZlX0xlZnQiKSwKKyAgICBWYWx1ZSgyMzAsICJBIEFib3ZlIiksCisgICAgVmFsdWUoMjMyLCAiQVIgQWJvdmVfUmlnaHQiKSwKKyAgICBWYWx1ZSgyMzMsICJEQiBEb3VibGVfQmVsb3ciKSwKKyAgICBWYWx1ZSgyMzQsICJEQSBEb3VibGVfQWJvdmUiKSwKKyAgICBWYWx1ZSgyNDAsICJJUyBJb3RhX1N1YnNjcmlwdCIpLAorfTsKKworc3RhdGljIGNvbnN0IFZhbHVlIFZBTFVFU19HQ0JbMTJdID0geworICAgIFZhbHVlKFVfR0NCX09USEVSLCAiWFggT3RoZXIiKSwKKyAgICBWYWx1ZShVX0dDQl9DT05UUk9MLCAiQ04gQ29udHJvbCIpLAorICAgIFZhbHVlKFVfR0NCX0NSLCAiQ1IgQ1IiKSwKKyAgICBWYWx1ZShVX0dDQl9FWFRFTkQsICJFWCBFeHRlbmQiKSwKKyAgICBWYWx1ZShVX0dDQl9MLCAiTCBMIiksCisgICAgVmFsdWUoVV9HQ0JfTEYsICJMRiBMRiIpLAorICAgIFZhbHVlKFVfR0NCX0xWLCAiTFYgTFYiKSwKKyAgICBWYWx1ZShVX0dDQl9MVlQsICJMVlQgTFZUIiksCisgICAgVmFsdWUoVV9HQ0JfVCwgIlQgVCIpLAorICAgIFZhbHVlKFVfR0NCX1YsICJWIFYiKSwKKyAgICBWYWx1ZShVX0dDQl9TUEFDSU5HX01BUkssICJTTSBTcGFjaW5nTWFyayIpLAorICAgIFZhbHVlKFVfR0NCX1BSRVBFTkQsICJQUCBQcmVwZW5kIiksCit9OworCitzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX1NCWzE1XSA9IHsKKyAgICBWYWx1ZShVX1NCX09USEVSLCAiWFggT3RoZXIiKSwKKyAgICBWYWx1ZShVX1NCX0FURVJNLCAiQVQgQVRlcm0iKSwKKyAgICBWYWx1ZShVX1NCX0NMT1NFLCAiQ0wgQ2xvc2UiKSwKKyAgICBWYWx1ZShVX1NCX0ZPUk1BVCwgIkZPIEZvcm1hdCIpLAorICAgIFZhbHVlKFVfU0JfTE9XRVIsICJMTyBMb3dlciIpLAorICAgIFZhbHVlKFVfU0JfTlVNRVJJQywgIk5VIE51bWVyaWMiKSwKKyAgICBWYWx1ZShVX1NCX09MRVRURVIsICJMRSBPTGV0dGVyIiksCisgICAgVmFsdWUoVV9TQl9TRVAsICJTRSBTZXAiKSwKKyAgICBWYWx1ZShVX1NCX1NQLCAiU1AgU3AiKSwKKyAgICBWYWx1ZShVX1NCX1NURVJNLCAiU1QgU1Rlcm0iKSwKKyAgICBWYWx1ZShVX1NCX1VQUEVSLCAiVVAgVXBwZXIiKSwKKyAgICBWYWx1ZShVX1NCX0NSLCAiQ1IgQ1IiKSwKKyAgICBWYWx1ZShVX1NCX0VYVEVORCwgIkVYIEV4dGVuZCIpLAorICAgIFZhbHVlKFVfU0JfTEYsICJMRiBMRiIpLAorICAgIFZhbHVlKFVfU0JfU0NPTlRJTlVFLCAiU0MgU0NvbnRpbnVlIiksCit9OworCitzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX1dCWzEzXSA9IHsKKyAgICBWYWx1ZShVX1dCX09USEVSLCAiWFggT3RoZXIiKSwKKyAgICBWYWx1ZShVX1dCX0FMRVRURVIsICJMRSBBTGV0dGVyIiksCisgICAgVmFsdWUoVV9XQl9GT1JNQVQsICJGTyBGb3JtYXQiKSwKKyAgICBWYWx1ZShVX1dCX0tBVEFLQU5BLCAiS0EgS2F0YWthbmEiKSwKKyAgICBWYWx1ZShVX1dCX01JRExFVFRFUiwgIk1MIE1pZExldHRlciIpLAorICAgIFZhbHVlKFVfV0JfTUlETlVNLCAiTU4gTWlkTnVtIiksCisgICAgVmFsdWUoVV9XQl9OVU1FUklDLCAiTlUgTnVtZXJpYyIpLAorICAgIFZhbHVlKFVfV0JfRVhURU5ETlVNTEVULCAiRVggRXh0ZW5kTnVtTGV0IiksCisgICAgVmFsdWUoVV9XQl9DUiwgIkNSIENSIiksCisgICAgVmFsdWUoVV9XQl9FWFRFTkQsICJFeHRlbmQgRXh0ZW5kIiksCisgICAgVmFsdWUoVV9XQl9MRiwgIkxGIExGIiksCisgICAgVmFsdWUoVV9XQl9NSUROVU1MRVQsICJNQiBNaWROdW1MZXQiKSwKKyAgICBWYWx1ZShVX1dCX05FV0xJTkUsICJOTCBOZXdsaW5lIiksCit9OworCitzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX2djbVszOF0gPSB7CisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19DX01BU0ssICJDIE90aGVyIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19DQ19NQVNLLCAiQ2MgQ29udHJvbCBjbnRybCIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfQ0ZfTUFTSywgIkNmIEZvcm1hdCIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfQ05fTUFTSywgIkNuIFVuYXNzaWduZWQiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX0NPX01BU0ssICJDbyBQcml2YXRlX1VzZSIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfQ1NfTUFTSywgIkNzIFN1cnJvZ2F0ZSIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfTF9NQVNLLCAiTCBMZXR0ZXIiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX0xDX01BU0ssICJMQyBDYXNlZF9MZXR0ZXIiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX0xMX01BU0ssICJMbCBMb3dlcmNhc2VfTGV0dGVyIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19MTV9NQVNLLCAiTG0gTW9kaWZpZXJfTGV0dGVyIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19MT19NQVNLLCAiTG8gT3RoZXJfTGV0dGVyIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19MVF9NQVNLLCAiTHQgVGl0bGVjYXNlX0xldHRlciIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfTFVfTUFTSywgIkx1IFVwcGVyY2FzZV9MZXR0ZXIiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX01fTUFTSywgIk0gTWFyayBDb21iaW5pbmdfTWFyayIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfTUNfTUFTSywgIk1jIFNwYWNpbmdfTWFyayIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfTUVfTUFTSywgIk1lIEVuY2xvc2luZ19NYXJrIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19NTl9NQVNLLCAiTW4gTm9uc3BhY2luZ19NYXJrIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19OX01BU0ssICJOIE51bWJlciIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfTkRfTUFTSywgIk5kIERlY2ltYWxfTnVtYmVyIGRpZ2l0IiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19OTF9NQVNLLCAiTmwgTGV0dGVyX051bWJlciIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfTk9fTUFTSywgIk5vIE90aGVyX051bWJlciIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfUF9NQVNLLCAiUCBQdW5jdHVhdGlvbiBwdW5jdCIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfUENfTUFTSywgIlBjIENvbm5lY3Rvcl9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfUERfTUFTSywgIlBkIERhc2hfUHVuY3R1YXRpb24iKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX1BFX01BU0ssICJQZSBDbG9zZV9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfUEZfTUFTSywgIlBmIEZpbmFsX1B1bmN0dWF0aW9uIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19QSV9NQVNLLCAiUGkgSW5pdGlhbF9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfUE9fTUFTSywgIlBvIE90aGVyX1B1bmN0dWF0aW9uIiksCisgICAgVmFsdWUoKGludDMyX3QpVV9HQ19QU19NQVNLLCAiUHMgT3Blbl9QdW5jdHVhdGlvbiIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfU19NQVNLLCAiUyBTeW1ib2wiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX1NDX01BU0ssICJTYyBDdXJyZW5jeV9TeW1ib2wiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX1NLX01BU0ssICJTayBNb2RpZmllcl9TeW1ib2wiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX1NNX01BU0ssICJTbSBNYXRoX1N5bWJvbCIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfU09fTUFTSywgIlNvIE90aGVyX1N5bWJvbCIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfWl9NQVNLLCAiWiBTZXBhcmF0b3IiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX1pMX01BU0ssICJabCBMaW5lX1NlcGFyYXRvciIpLAorICAgIFZhbHVlKChpbnQzMl90KVVfR0NfWlBfTUFTSywgIlpwIFBhcmFncmFwaF9TZXBhcmF0b3IiKSwKKyAgICBWYWx1ZSgoaW50MzJfdClVX0dDX1pTX01BU0ssICJacyBTcGFjZV9TZXBhcmF0b3IiKSwKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eSBQUk9QRVJUSUVTWzk0XSA9IHsKKyAgICBQcm9wZXJ0eShVQ0hBUl9BTFBIQUJFVElDLCAiQWxwaGEgQWxwaGFiZXRpYyIpLAorICAgIFByb3BlcnR5KFVDSEFSX0FTQ0lJX0hFWF9ESUdJVCwgIkFIZXggQVNDSUlfSGV4X0RpZ2l0IiksCisgICAgUHJvcGVydHkoVUNIQVJfQklESV9DT05UUk9MLCAiQmlkaV9DIEJpZGlfQ29udHJvbCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0JJRElfTUlSUk9SRUQsICJCaWRpX00gQmlkaV9NaXJyb3JlZCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0RBU0gsICJEYXNoIERhc2giKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9ERUZBVUxUX0lHTk9SQUJMRV9DT0RFX1BPSU5ULCAiREkgRGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0RFUFJFQ0FURUQsICJEZXAgRGVwcmVjYXRlZCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0RJQUNSSVRJQywgIkRpYSBEaWFjcml0aWMiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9FWFRFTkRFUiwgIkV4dCBFeHRlbmRlciIpLAorICAgIFByb3BlcnR5KFVDSEFSX0ZVTExfQ09NUE9TSVRJT05fRVhDTFVTSU9OLCAiQ29tcF9FeCBGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbiIpLAorICAgIFByb3BlcnR5KFVDSEFSX0dSQVBIRU1FX0JBU0UsICJHcl9CYXNlIEdyYXBoZW1lX0Jhc2UiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9HUkFQSEVNRV9FWFRFTkQsICJHcl9FeHQgR3JhcGhlbWVfRXh0ZW5kIiksCisgICAgUHJvcGVydHkoVUNIQVJfR1JBUEhFTUVfTElOSywgIkdyX0xpbmsgR3JhcGhlbWVfTGluayIpLAorICAgIFByb3BlcnR5KFVDSEFSX0hFWF9ESUdJVCwgIkhleCBIZXhfRGlnaXQiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9IWVBIRU4sICJIeXBoZW4gSHlwaGVuIiksCisgICAgUHJvcGVydHkoVUNIQVJfSURfQ09OVElOVUUsICJJREMgSURfQ29udGludWUiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9JRF9TVEFSVCwgIklEUyBJRF9TdGFydCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0lERU9HUkFQSElDLCAiSWRlbyBJZGVvZ3JhcGhpYyIpLAorICAgIFByb3BlcnR5KFVDSEFSX0lEU19CSU5BUllfT1BFUkFUT1IsICJJRFNCIElEU19CaW5hcnlfT3BlcmF0b3IiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9JRFNfVFJJTkFSWV9PUEVSQVRPUiwgIklEU1QgSURTX1RyaW5hcnlfT3BlcmF0b3IiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9KT0lOX0NPTlRST0wsICJKb2luX0MgSm9pbl9Db250cm9sIiksCisgICAgUHJvcGVydHkoVUNIQVJfTE9HSUNBTF9PUkRFUl9FWENFUFRJT04sICJMT0UgTG9naWNhbF9PcmRlcl9FeGNlcHRpb24iKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9MT1dFUkNBU0UsICJMb3dlciBMb3dlcmNhc2UiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9NQVRILCAiTWF0aCBNYXRoIiksCisgICAgUHJvcGVydHkoVUNIQVJfTk9OQ0hBUkFDVEVSX0NPREVfUE9JTlQsICJOQ2hhciBOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludCIpLAorICAgIFByb3BlcnR5KFVDSEFSX1FVT1RBVElPTl9NQVJLLCAiUU1hcmsgUXVvdGF0aW9uX01hcmsiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9SQURJQ0FMLCAiUmFkaWNhbCBSYWRpY2FsIiksCisgICAgUHJvcGVydHkoVUNIQVJfU09GVF9ET1RURUQsICJTRCBTb2Z0X0RvdHRlZCIpLAorICAgIFByb3BlcnR5KFVDSEFSX1RFUk1JTkFMX1BVTkNUVUFUSU9OLCAiVGVybSBUZXJtaW5hbF9QdW5jdHVhdGlvbiIpLAorICAgIFByb3BlcnR5KFVDSEFSX1VOSUZJRURfSURFT0dSQVBILCAiVUlkZW8gVW5pZmllZF9JZGVvZ3JhcGgiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9VUFBFUkNBU0UsICJVcHBlciBVcHBlcmNhc2UiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9XSElURV9TUEFDRSwgIldTcGFjZSBXaGl0ZV9TcGFjZSBzcGFjZSIpLAorICAgIFByb3BlcnR5KFVDSEFSX1hJRF9DT05USU5VRSwgIlhJREMgWElEX0NvbnRpbnVlIiksCisgICAgUHJvcGVydHkoVUNIQVJfWElEX1NUQVJULCAiWElEUyBYSURfU3RhcnQiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9DQVNFX1NFTlNJVElWRSwgIlNlbnNpdGl2ZSBDYXNlX1NlbnNpdGl2ZSIpLAorICAgIFByb3BlcnR5KFVDSEFSX1NfVEVSTSwgIlNUZXJtIFNUZXJtIiksCisgICAgUHJvcGVydHkoVUNIQVJfVkFSSUFUSU9OX1NFTEVDVE9SLCAiVlMgVmFyaWF0aW9uX1NlbGVjdG9yIiksCisgICAgUHJvcGVydHkoVUNIQVJfTkZEX0lORVJULCAibmZkaW5lcnQgTkZEX0luZXJ0IiksCisgICAgUHJvcGVydHkoVUNIQVJfTkZLRF9JTkVSVCwgIm5ma2RpbmVydCBORktEX0luZXJ0IiksCisgICAgUHJvcGVydHkoVUNIQVJfTkZDX0lORVJULCAibmZjaW5lcnQgTkZDX0luZXJ0IiksCisgICAgUHJvcGVydHkoVUNIQVJfTkZLQ19JTkVSVCwgIm5ma2NpbmVydCBORktDX0luZXJ0IiksCisgICAgUHJvcGVydHkoVUNIQVJfU0VHTUVOVF9TVEFSVEVSLCAic2Vnc3RhcnQgU2VnbWVudF9TdGFydGVyIiksCisgICAgUHJvcGVydHkoVUNIQVJfUEFUVEVSTl9TWU5UQVgsICJQYXRfU3luIFBhdHRlcm5fU3ludGF4IiksCisgICAgUHJvcGVydHkoVUNIQVJfUEFUVEVSTl9XSElURV9TUEFDRSwgIlBhdF9XUyBQYXR0ZXJuX1doaXRlX1NwYWNlIiksCisgICAgUHJvcGVydHkoVUNIQVJfUE9TSVhfQUxOVU0sICIgYWxudW0iKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9QT1NJWF9CTEFOSywgIiBibGFuayIpLAorICAgIFByb3BlcnR5KFVDSEFSX1BPU0lYX0dSQVBILCAiIGdyYXBoIiksCisgICAgUHJvcGVydHkoVUNIQVJfUE9TSVhfUFJJTlQsICIgcHJpbnQiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9QT1NJWF9YRElHSVQsICIgeGRpZ2l0IiksCisgICAgUHJvcGVydHkoVUNIQVJfQ0FTRUQsICJDYXNlZCBDYXNlZCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0NBU0VfSUdOT1JBQkxFLCAiQ0kgQ2FzZV9JZ25vcmFibGUiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9DSEFOR0VTX1dIRU5fTE9XRVJDQVNFRCwgIkNXTCBDaGFuZ2VzX1doZW5fTG93ZXJjYXNlZCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0NIQU5HRVNfV0hFTl9VUFBFUkNBU0VELCAiQ1dVIENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkIiksCisgICAgUHJvcGVydHkoVUNIQVJfQ0hBTkdFU19XSEVOX1RJVExFQ0FTRUQsICJDV1QgQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9DSEFOR0VTX1dIRU5fQ0FTRUZPTERFRCwgIkNXQ0YgQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWQiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9DSEFOR0VTX1dIRU5fQ0FTRU1BUFBFRCwgIkNXQ00gQ2hhbmdlc19XaGVuX0Nhc2VtYXBwZWQiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9DSEFOR0VTX1dIRU5fTkZLQ19DQVNFRk9MREVELCAiQ1dLQ0YgQ2hhbmdlc19XaGVuX05GS0NfQ2FzZWZvbGRlZCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0JJRElfQ0xBU1MsICJiYyBCaWRpX0NsYXNzIiwgVkFMVUVTX2JjLCAxOSksCisgICAgUHJvcGVydHkoVUNIQVJfQkxPQ0ssICJibGsgQmxvY2siLCBWQUxVRVNfYmxrLCAyMjEpLAorICAgIFByb3BlcnR5KFVDSEFSX0NBTk9OSUNBTF9DT01CSU5JTkdfQ0xBU1MsICJjY2MgQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzcyIsIFZBTFVFU19jY2MsIDU2KSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9ERUNPTVBPU0lUSU9OX1RZUEUsICJkdCBEZWNvbXBvc2l0aW9uX1R5cGUiLCBWQUxVRVNfZHQsIDE4KSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9FQVNUX0FTSUFOX1dJRFRILCAiZWEgRWFzdF9Bc2lhbl9XaWR0aCIsIFZBTFVFU19lYSwgNiksCisgICAgUHJvcGVydHkoVUNIQVJfR0VORVJBTF9DQVRFR09SWSwgImdjIEdlbmVyYWxfQ2F0ZWdvcnkiLCBWQUxVRVNfZ2MsIDMwKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9KT0lOSU5HX0dST1VQLCAiamcgSm9pbmluZ19Hcm91cCIsIFZBTFVFU19qZywgNTgpLAorICAgIFByb3BlcnR5KFVDSEFSX0pPSU5JTkdfVFlQRSwgImp0IEpvaW5pbmdfVHlwZSIsIFZBTFVFU19qdCwgNiksCisgICAgUHJvcGVydHkoVUNIQVJfTElORV9CUkVBSywgImxiIExpbmVfQnJlYWsiLCBWQUxVRVNfbGIsIDM5KSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9OVU1FUklDX1RZUEUsICJudCBOdW1lcmljX1R5cGUiLCBWQUxVRVNfbnQsIDQpLAorICAgIFByb3BlcnR5KFVDSEFSX1NDUklQVCwgInNjIFNjcmlwdCIsIFZBTFVFU19zYywgMTU5KSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9IQU5HVUxfU1lMTEFCTEVfVFlQRSwgImhzdCBIYW5ndWxfU3lsbGFibGVfVHlwZSIsIFZBTFVFU19oc3QsIDYpLAorICAgIFByb3BlcnR5KFVDSEFSX05GRF9RVUlDS19DSEVDSywgIk5GRF9RQyBORkRfUXVpY2tfQ2hlY2siLCBWQUxVRVNfTkZEX1FDLCAyKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9ORktEX1FVSUNLX0NIRUNLLCAiTkZLRF9RQyBORktEX1F1aWNrX0NoZWNrIiwgVkFMVUVTX05GS0RfUUMsIDIpLAorICAgIFByb3BlcnR5KFVDSEFSX05GQ19RVUlDS19DSEVDSywgIk5GQ19RQyBORkNfUXVpY2tfQ2hlY2siLCBWQUxVRVNfTkZDX1FDLCAzKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9ORktDX1FVSUNLX0NIRUNLLCAiTkZLQ19RQyBORktDX1F1aWNrX0NoZWNrIiwgVkFMVUVTX05GS0NfUUMsIDMpLAorICAgIFByb3BlcnR5KFVDSEFSX0xFQURfQ0FOT05JQ0FMX0NPTUJJTklOR19DTEFTUywgImxjY2MgTGVhZF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIiwgVkFMVUVTX2xjY2MsIDU2KSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9UUkFJTF9DQU5PTklDQUxfQ09NQklOSU5HX0NMQVNTLCAidGNjYyBUcmFpbF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIiwgVkFMVUVTX3RjY2MsIDU2KSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9HUkFQSEVNRV9DTFVTVEVSX0JSRUFLLCAiR0NCIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsiLCBWQUxVRVNfR0NCLCAxMiksCisgICAgUHJvcGVydHkoVUNIQVJfU0VOVEVOQ0VfQlJFQUssICJTQiBTZW50ZW5jZV9CcmVhayIsIFZBTFVFU19TQiwgMTUpLAorICAgIFByb3BlcnR5KFVDSEFSX1dPUkRfQlJFQUssICJXQiBXb3JkX0JyZWFrIiwgVkFMVUVTX1dCLCAxMyksCisgICAgUHJvcGVydHkoVUNIQVJfR0VORVJBTF9DQVRFR09SWV9NQVNLLCAiZ2NtIEdlbmVyYWxfQ2F0ZWdvcnlfTWFzayIsIFZBTFVFU19nY20sIDM4KSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9OVU1FUklDX1ZBTFVFLCAibnYgTnVtZXJpY19WYWx1ZSIpLAorICAgIFByb3BlcnR5KFVDSEFSX0FHRSwgImFnZSBBZ2UiKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9CSURJX01JUlJPUklOR19HTFlQSCwgImJtZyBCaWRpX01pcnJvcmluZ19HbHlwaCIpLAorICAgIFByb3BlcnR5KFVDSEFSX0NBU0VfRk9MRElORywgImNmIENhc2VfRm9sZGluZyIpLAorICAgIFByb3BlcnR5KFVDSEFSX0lTT19DT01NRU5ULCAiaXNjIElTT19Db21tZW50IiksCisgICAgUHJvcGVydHkoVUNIQVJfTE9XRVJDQVNFX01BUFBJTkcsICJsYyBMb3dlcmNhc2VfTWFwcGluZyIpLAorICAgIFByb3BlcnR5KFVDSEFSX05BTUUsICJuYSBOYW1lIiksCisgICAgUHJvcGVydHkoVUNIQVJfU0lNUExFX0NBU0VfRk9MRElORywgInNjZiBTaW1wbGVfQ2FzZV9Gb2xkaW5nIHNmYyIpLAorICAgIFByb3BlcnR5KFVDSEFSX1NJTVBMRV9MT1dFUkNBU0VfTUFQUElORywgInNsYyBTaW1wbGVfTG93ZXJjYXNlX01hcHBpbmciKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9TSU1QTEVfVElUTEVDQVNFX01BUFBJTkcsICJzdGMgU2ltcGxlX1RpdGxlY2FzZV9NYXBwaW5nIiksCisgICAgUHJvcGVydHkoVUNIQVJfU0lNUExFX1VQUEVSQ0FTRV9NQVBQSU5HLCAic3VjIFNpbXBsZV9VcHBlcmNhc2VfTWFwcGluZyIpLAorICAgIFByb3BlcnR5KFVDSEFSX1RJVExFQ0FTRV9NQVBQSU5HLCAidGMgVGl0bGVjYXNlX01hcHBpbmciKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9VTklDT0RFXzFfTkFNRSwgIm5hMSBVbmljb2RlXzFfTmFtZSIpLAorICAgIFByb3BlcnR5KFVDSEFSX1VQUEVSQ0FTRV9NQVBQSU5HLCAidWMgVXBwZXJjYXNlX01hcHBpbmciKSwKKyAgICBQcm9wZXJ0eShVQ0hBUl9TQ1JJUFRfRVhURU5TSU9OUywgInNjeCBTY3JpcHRfRXh0ZW5zaW9ucyIpLAorfTsKKworY29uc3QgaW50MzJfdCBNQVhfQUxJQVNFUyA9IDQ7CmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvcG5hbWVzYnVpbGRlci5jcHAgYi91bmljb2RlL2MvZ2VucHJvcHMvcG5hbWVzYnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzODA4NwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9wbmFtZXNidWlsZGVyLmNwcApAQCAtMCwwICsxLDYwMCBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMTAvMTEvMDIgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCisqICAgMjAxMG5vdjE5ICAgTWFya3VzIFNjaGVyZXIgIFJld3JpdGUgZm9yIGZvcm1hdFZlcnNpb24gMi4KKyogICAyMDExZGVjMTggICBNYXJrdXMgU2NoZXJlciAgTW92ZWQgZ2VucG5hbWUvZ2VucG5hbWUuY3BwIHRvIGdlbnByb3BzL3BuYW1lc2J1aWxkZXIuY3BwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS9ieXRlc3RyaWUuaCIKKyNpbmNsdWRlICJ1bmljb2RlL2J5dGVzdHJpZWJ1aWxkZXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3B1dGlsLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2xlYW4uaCIKKyNpbmNsdWRlICJjaGFyc3RyLmgiCisjaW5jbHVkZSAiY3N0cmluZy5oIgorI2luY2x1ZGUgImRlbnNlcmFuZ2VzLmgiCisjaW5jbHVkZSAiZ2VucHJvcHMuaCIKKyNpbmNsdWRlICJwcm9wbmFtZS5oIgorI2luY2x1ZGUgInRvb2x1dGlsLmgiCisjaW5jbHVkZSAidWhhc2guaCIKKyNpbmNsdWRlICJ1aW52Y2hhci5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAidXZlY3RyMzIuaCIKKyNpbmNsdWRlICJ3cml0ZXNyYy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gV2UgdGVzdCBmb3IgQVNDSUkgZGVsaW1pdGVycyBhbmQgV2hpdGVfU3BhY2UsIGFuZCBidWlsZCBBU0NJSSBzdHJpbmcgQnl0ZXNUcmllcy4KKyNpZiBVX0NIQVJTRVRfRkFNSUxZIT1VX0FTQ0lJX0ZBTUlMWQorIyAgIGVycm9yIFRoaXMgYnVpbGRlciByZXF1aXJlcyBVX0NIQVJTRVRfRkFNSUxZPT1VX0FTQ0lJX0ZBTUlMWS4KKyNlbmRpZgorCitVX05BTUVTUEFDRV9VU0UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCRUdJTiBEQVRBCisvLyAKKy8vIFRoaXMgaXMgdGhlIHJhdyBkYXRhIHRvIGJlIG91dHB1dC4gIFdlIGRlZmluZSB0aGUgZGF0YSBzdHJ1Y3R1cmUsCisvLyB0aGVuIGluY2x1ZGUgYSBtYWNoaW5lLWdlbmVyYXRlZCBoZWFkZXIgdGhhdCBjb250YWlucyB0aGUgYWN0dWFsCisvLyBkYXRhLgorCisjaW5jbHVkZSAidW5pY29kZS91Y2hhci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5vcm0yLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2NyaXB0LmgiCisKKy8vIERpbGVtbWE6IFdlIHdhbnQgdG8gdXNlIE1BWF9BTElBU0VTIHRvIGRlZmluZSBmaWVsZHMgaW4gdGhlIFZhbHVlIGNsYXNzLgorLy8gSG93ZXZlciwgd2UgbmVlZCB0byBkZWZpbmUgdGhlIGNsYXNzIGJlZm9yZSBpbmNsdWRpbmcgdGhlIGRhdGEgaGVhZGVyCisvLyBhbmQgd2UgY2FuIHVzZSBNQVhfQUxJQVNFUyBvbmx5IGFmdGVyIGluY2x1ZGluZyBpdC4KKy8vIFNvIHdlIGRlZmluZSBhIHNlY29uZCBjb25zdGFudCBhbmQgYXQgcnVudGltZSBjaGVjayB0aGF0IGl0J3MgPj1NQVhfQUxJQVNFUy4KK3N0YXRpYyBjb25zdCBpbnQzMl90IFZBTFVFX01BWF9BTElBU0VTPTQ7CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IEpPSU5FRF9BTElBU0VTX0NBUEFDSVRZPTEwMDsKKworY2xhc3MgVmFsdWUgeworcHVibGljOgorICAgIFZhbHVlKGludDMyX3QgZW51bVZhbHVlLCBjb25zdCBjaGFyICpqb2luZWRBbGlhc2VzKQorICAgICAgICAgICAgOiBlbnVtVmFsdWUoZW51bVZhbHVlKSwgam9pbmVkQWxpYXNlcyhqb2luZWRBbGlhc2VzKSwgY291bnQoMCkgeworICAgICAgICBpZih1cHJ2X3N0cmxlbihqb2luZWRBbGlhc2VzKT49Sk9JTkVEX0FMSUFTRVNfQ0FQQUNJVFkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiZ2VucHJvcHMgZXJyb3I6IHBuYW1lc2J1aWxkZXIuY3BwIFZhbHVlOjpWYWx1ZSglbGQsIFwiJXNcIik6ICIKKyAgICAgICAgICAgICAgICAgICAgImpvaW5lZCBhbGlhc2VzIHRvbyBsb25nOiAiCisgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZSBKT0lORURfQUxJQVNFU19DQVBBQ0lUWSwgdG8gYXQgbGVhc3QgJWxkXG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZyllbnVtVmFsdWUsIGpvaW5lZEFsaWFzZXMsIHVwcnZfc3RybGVuKGpvaW5lZEFsaWFzZXMpKzEpOworICAgICAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29weSB0aGUgc3BhY2Utc2VwYXJhdGVkIGFsaWFzZXMgaW50byBOVUwtc2VwYXJhdGVkIG9uZXMgYW5kIGNvdW50IHRoZW0uCisgICAgICAgIC8vIFdyaXRlIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIGVhY2ggb25lLgorICAgICAgICBjb25zdCBjaGFyICpqPWpvaW5lZEFsaWFzZXM7CisgICAgICAgIGNoYXIgKmE9YWxpYXNlc0J1ZmZlcjsKKyAgICAgICAgY2hhciAqbj1ub3JtYWxpemVkQnVmZmVyOworICAgICAgICBjaGFyIGM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGFsaWFzZXNbY291bnRdPWE7CisgICAgICAgICAgICBub3JtYWxpemVkW2NvdW50KytdPW47CisgICAgICAgICAgICB3aGlsZSgoYz0qaisrKSE9JyAnICYmIGMhPTApIHsKKyAgICAgICAgICAgICAgICAqYSsrPWM7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGRlbGltaXRlcnMgJy0nIGFuZCAnXycuCisgICAgICAgICAgICAgICAgaWYoIShjPT0nLScgfHwgYz09J18nKSkgeworICAgICAgICAgICAgICAgICAgICAqbisrPXVwcnZfdG9sb3dlcihjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqYSsrPTA7CisgICAgICAgICAgICAqbisrPTA7CisgICAgICAgIH0gd2hpbGUoYyE9MCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGF0IG1vc3QgTUFYX0FMSUFTRVMgcG9pbnRlcnMgZm9yIHVuaXF1ZSBub3JtYWxpemVkIGFsaWFzZXMKKyAgICAgKiAobm8gZW1wdHkgc3RyaW5ncykgdG8gZGVzdCBhbmQgcmV0dXJucyBob3cgbWFueSB0aGVyZSBhcmUuCisgICAgICovCisgICAgaW50MzJfdCBnZXRVbmlxdWVOb3JtYWxpemVkQWxpYXNlcyhjb25zdCBjaGFyICpkZXN0W10pIGNvbnN0IHsKKyAgICAgICAgaW50MzJfdCBudW1VbmlxdWU9MDsKKyAgICAgICAgZm9yKGludDMyX3QgaT0wOyBpPGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnM9bm9ybWFsaXplZFtpXTsKKyAgICAgICAgICAgIGlmKCpzIT0wKSB7ICAvLyBPbWl0IGVtcHR5IHN0cmluZ3MuCisgICAgICAgICAgICAgICAgZm9yKGludDMyX3Qgaj0wOzsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGo9PW51bVVuaXF1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBpcyBhIG5ldyB1bmlxdWUgYWxpYXMuCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W251bVVuaXF1ZSsrXT1zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoMD09dXBydl9zdHJjbXAocywgZGVzdFtqXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgaXMgZXF1YWwgb3IgZXF1aXZhbGVudCB0byBhbiBlYXJsaWVyIGFsaWFzLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bVVuaXF1ZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGVudW1WYWx1ZTsKKyAgICBjb25zdCBjaGFyICpqb2luZWRBbGlhc2VzOworICAgIGNoYXIgYWxpYXNlc0J1ZmZlcltKT0lORURfQUxJQVNFU19DQVBBQ0lUWV07CisgICAgY2hhciBub3JtYWxpemVkQnVmZmVyW0pPSU5FRF9BTElBU0VTX0NBUEFDSVRZXTsKKyAgICBjb25zdCBjaGFyICphbGlhc2VzW1ZBTFVFX01BWF9BTElBU0VTXTsKKyAgICBjb25zdCBjaGFyICpub3JtYWxpemVkW1ZBTFVFX01BWF9BTElBU0VTXTsKKyAgICBpbnQzMl90IGNvdW50OworfTsKKworY2xhc3MgUHJvcGVydHkgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICAgIC8vIEEgcHJvcGVydHkgd2l0aCBhIHZhbHVlcyBhcnJheS4KKyAgICBQcm9wZXJ0eShpbnQzMl90IGVudW1WYWx1ZSwgY29uc3QgY2hhciAqam9pbmVkQWxpYXNlcywKKyAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqdmFsdWVzLCBpbnQzMl90IHZhbHVlQ291bnQpCisgICAgICAgICAgICA6IFZhbHVlKGVudW1WYWx1ZSwgam9pbmVkQWxpYXNlcyksCisgICAgICAgICAgICAgIHZhbHVlcyh2YWx1ZXMpLCB2YWx1ZUNvdW50KHZhbHVlQ291bnQpIHt9CisgICAgLy8gQSBiaW5hcnkgcHJvcGVydHkgKGVudW1WYWx1ZTxVQ0hBUl9CSU5BUllfTElNSVQpLCBvciBvbmUgd2l0aG91dCB2YWx1ZXMuCisgICAgUHJvcGVydHkoaW50MzJfdCBlbnVtVmFsdWUsIGNvbnN0IGNoYXIgKmpvaW5lZEFsaWFzZXMpOworCisgICAgY29uc3QgVmFsdWUgKnZhbHVlczsKKyAgICBpbnQzMl90IHZhbHVlQ291bnQ7Cit9OworCisvLyAqKiogSW5jbHVkZSB0aGUgZGF0YSBoZWFkZXIgKioqCisjaW5jbHVkZSAicG5hbWVzX2RhdGEuaCIKKworUHJvcGVydHk6OlByb3BlcnR5KGludDMyX3QgZW51bVZhbHVlLCBjb25zdCBjaGFyICpqb2luZWRBbGlhc2VzKQorICAgICAgICA6IFZhbHVlKGVudW1WYWx1ZSwgam9pbmVkQWxpYXNlcyksCisgICAgICAgICAgdmFsdWVzKGVudW1WYWx1ZTxVQ0hBUl9CSU5BUllfTElNSVQgPyBWQUxVRVNfYmlucHJvcCA6IE5VTEwpLAorICAgICAgICAgIHZhbHVlQ291bnQoZW51bVZhbHVlPFVDSEFSX0JJTkFSWV9MSU1JVCA/IDIgOiAwKSB7fQorCisvLyBFTkQgREFUQQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBOYW1lc1Byb3BlcnR5TmFtZXMgOiBwdWJsaWMgUHJvcGVydHlOYW1lcyB7CitwdWJsaWM6CisgICAgUE5hbWVzUHJvcGVydHlOYW1lcygpCisgICAgICAgICAgICA6IHZhbHVlTWFwcyhOVUxMKSwgYnl0ZXNUcmllcyhOVUxMKSB7fQorICAgIHZvaWQgaW5pdChjb25zdCBpbnQzMl90ICp2bSwgY29uc3QgdWludDhfdCAqYnQpIHsKKyAgICAgICAgdmFsdWVNYXBzPXZtOworICAgICAgICBieXRlc1RyaWVzPWJ0OworICAgIH0KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0UHJvcGVydHlFbnVtKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRQcm9wZXJ0eVZhbHVlRW51bShpbnQzMl90IHByb3BlcnR5LCBjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKK3ByaXZhdGU6CisgICAgaW50MzJfdCBmaW5kUHJvcGVydHkoaW50MzJfdCBwcm9wZXJ0eSkgY29uc3Q7CisgICAgVUJvb2wgY29udGFpbnNOYW1lKEJ5dGVzVHJpZSAmdHJpZSwgY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRQcm9wZXJ0eU9yVmFsdWVFbnVtKGludDMyX3QgYnl0ZXNUcmllT2Zmc2V0LCBjb25zdCBjaGFyICphbGlhcykgY29uc3Q7CisKKyAgICBjb25zdCBpbnQzMl90ICp2YWx1ZU1hcHM7CisgICAgY29uc3QgdWludDhfdCAqYnl0ZXNUcmllczsKK307CisKK2NsYXNzIFBOYW1lc0J1aWxkZXJJbXBsIDogcHVibGljIFBOYW1lc0J1aWxkZXIgeworcHVibGljOgorICAgIFBOYW1lc0J1aWxkZXJJbXBsKFVFcnJvckNvZGUgJmVycm9yQ29kZSkKKyAgICAgICAgICAgIDogdmFsdWVNYXBzKGVycm9yQ29kZSksIGJ0YihlcnJvckNvZGUpLCBtYXhOYW1lTGVuZ3RoKDApLAorICAgICAgICAgICAgICBuYW1lR3JvdXBUb09mZnNldChOVUxMKSB7fQorCisgICAgflBOYW1lc0J1aWxkZXJJbXBsKCkgeworICAgICAgICB1aGFzaF9jbG9zZShuYW1lR3JvdXBUb09mZnNldCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGJ1aWxkKFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgICAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKyAgICAgICAgaWYoVkFMVUVfTUFYX0FMSUFTRVM8TUFYX0FMSUFTRVMpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiZ2VucHJvcHMgZXJyb3I6IHBuYW1lc2J1aWxkZXIuY3BwIFZBTFVFX01BWF9BTElBU0VTPSVkPCVkPU1BWF9BTElBU0VTIC0tICIKKyAgICAgICAgICAgICAgICAgICAgIm5lZWQgdG8gY2hhbmdlIFZBTFVFX01BWF9BTElBU0VTIHRvIGF0IGxlYXN0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAoaW50KVZBTFVFX01BWF9BTElBU0VTLCAoaW50KU1BWF9BTElBU0VTLCAoaW50KU1BWF9BTElBU0VTKTsKKyAgICAgICAgICAgIGVycm9yQ29kZT1VX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbmFtZUdyb3VwVG9PZmZzZXQ9dWhhc2hfb3Blbih1aGFzaF9oYXNoQ2hhcnMsIHVoYXNoX2NvbXBhcmVDaGFycywgTlVMTCwgJmVycm9yQ29kZSk7CisgICAgICAgIC8vIEJ1aWxkIG1haW4gcHJvcGVydHkgYWxpYXNlcyB2YWx1ZSBtYXAgYXQgdmFsdWUgbWFwIG9mZnNldCAwLAorICAgICAgICAvLyBzbyB0aGF0IHdlIG5lZWQgbm90IHN0b3JlIGFub3RoZXIgb2Zmc2V0IGZvciBpdC4KKyAgICAgICAgVVZlY3RvcjMyIHByb3BFbnVtcyhlcnJvckNvZGUpOworICAgICAgICBpbnQzMl90IHByb3BJbmRleDsKKyAgICAgICAgZm9yKHByb3BJbmRleD0wOyBwcm9wSW5kZXg8TEVOR1RIT0YoUFJPUEVSVElFUyk7ICsrcHJvcEluZGV4KSB7CisgICAgICAgICAgICBwcm9wRW51bXMuc29ydGVkSW5zZXJ0KFBST1BFUlRJRVNbcHJvcEluZGV4XS5lbnVtVmFsdWUsIGVycm9yQ29kZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCByYW5nZXNbMTBdWzJdOworICAgICAgICBpbnQzMl90IG51bVByb3BSYW5nZXM9dXBydl9tYWtlRGVuc2VSYW5nZXMocHJvcEVudW1zLmdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVOR1RIT0YoUFJPUEVSVElFUyksIDB4MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLCBMRU5HVEhPRihyYW5nZXMpKTsKKyAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQobnVtUHJvcFJhbmdlcywgZXJyb3JDb2RlKTsKKyAgICAgICAgaW50MzJfdCBpLCBqOworICAgICAgICBmb3IoaT0wOyBpPG51bVByb3BSYW5nZXM7ICsraSkgeworICAgICAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQocmFuZ2VzW2ldWzBdLCBlcnJvckNvZGUpOworICAgICAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQocmFuZ2VzW2ldWzFdKzEsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBmb3Ioaj1yYW5nZXNbaV1bMF07IGo8PXJhbmdlc1tpXVsxXTsgKytqKSB7CisgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZSB0d28gc2xvdHMgcGVyIHByb3BlcnR5IGZvciB0aGUgbmFtZSBncm91cCBvZmZzZXQgYW5kIHRoZSB2YWx1ZS1tYXAgb2Zmc2V0LgorICAgICAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KDAsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQoMCwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1aWxkIHRoZSBwcm9wZXJ0aWVzIHRyaWUgZmlyc3QsIGF0IEJ5dGVzVHJpZSBvZmZzZXQgMCwKKyAgICAgICAgLy8gc28gdGhhdCB3ZSBuZWVkIG5vdCBzdG9yZSBhbm90aGVyIG9mZnNldCBmb3IgaXQuCisgICAgICAgIGJ1aWxkUHJvcGVydGllc0J5dGVzVHJpZShQUk9QRVJUSUVTLCBMRU5HVEhPRihQUk9QRVJUSUVTKSwgZXJyb3JDb2RlKTsKKworICAgICAgICAvLyBCdWlsZCB0aGUgbmFtZSBncm91cCBmb3IgdGhlIGZpcnN0IHByb3BlcnR5LCBhdCBuYW1lR3JvdXBzIG9mZnNldCAwLgorICAgICAgICAvLyBOYW1lIGdyb3VwcyBmb3IgKnZhbHVlKiBhbGlhc2VzIG11c3Qgbm90IHN0YXJ0IGF0IG9mZnNldCAwCisgICAgICAgIC8vIGJlY2F1c2UgdGhhdCBpcyBhIG1pc3NpbmctdmFsdWUgbWFya2VyIGZvciBzcGFyc2UgdmFsdWUgcmFuZ2VzLgorICAgICAgICBzZXRQcm9wZXJ0eUludChQUk9QRVJUSUVTWzBdLmVudW1WYWx1ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZUFsaWFzZXMoUFJPUEVSVElFU1swXSwgZXJyb3JDb2RlKSk7CisKKyAgICAgICAgLy8gQnVpbGQgdGhlIGtub3duLXJlcGVhdGVkIGJpbmFyeSBwcm9wZXJ0aWVzIG9uY2UuCisgICAgICAgIGludDMyX3QgYmluUHJvcHNWYWx1ZU1hcE9mZnNldD12YWx1ZU1hcHMuc2l6ZSgpOworICAgICAgICBpbnQzMl90IGJ5dGVzVHJpZU9mZnNldD1idWlsZFZhbHVlc0J5dGVzVHJpZShWQUxVRVNfYmlucHJvcCwgMiwgZXJyb3JDb2RlKTsKKyAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQoYnl0ZXNUcmllT2Zmc2V0LCBlcnJvckNvZGUpOworICAgICAgICBidWlsZFZhbHVlTWFwKFZBTFVFU19iaW5wcm9wLCAyLCBlcnJvckNvZGUpOworCisgICAgICAgIC8vIE5vdGU6IEl0IGlzIHNsaWdodGx5IHdhc3RlZnVsIHRvIHN0b3JlIGJpbmFyeSBwcm9wZXJ0aWVzIGxpa2UgYWxsIG90aGVycy4KKyAgICAgICAgLy8gU2luY2Ugd2Uga25vdyB0aGF0IHRoZXkgYXJlIGluIHRoZSBsb3dlc3QgcmFuZ2Ugb2YgcHJvcGVydHkgZW51bSB2YWx1ZXMKKyAgICAgICAgLy8gYW5kIHNoYXJlIHRoZSBzYW1lIG5hbWUgZ3JvdXAgYW5kIEJ5dGVzVHJpZSwKKyAgICAgICAgLy8gd2UgY291bGQganVzdCBzdG9yZSB0aG9zZSB0d28gaW5kZXhlcyBvbmNlLgorICAgICAgICAvLyAoVGhpcyB3b3VsZCBzYXZlIDggYnl0ZXMgcGVyIGJpbmFyeSBwcm9wZXJ0eSwgb3IgYWJvdXQgaGFsZiBhIGtpbG9ieXRlLikKKworICAgICAgICAvLyBCdWlsZCB0aGUga25vd24tcmVwZWF0ZWQgY2Fub25pY2FsIGNvbWJpbmluZyBjbGFzcyBwcm9wZXJ0aWVzIG9uY2UuCisgICAgICAgIGludDMyX3QgY2NjVmFsdWVNYXBPZmZzZXQ9dmFsdWVNYXBzLnNpemUoKTsKKyAgICAgICAgYnl0ZXNUcmllT2Zmc2V0PWJ1aWxkVmFsdWVzQnl0ZXNUcmllKFZBTFVFU19jY2MsIExFTkdUSE9GKFZBTFVFU19jY2MpLCBlcnJvckNvZGUpOworICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudChieXRlc1RyaWVPZmZzZXQsIGVycm9yQ29kZSk7CisgICAgICAgIGJ1aWxkVmFsdWVNYXAoVkFMVUVTX2NjYywgTEVOR1RIT0YoVkFMVUVTX2NjYyksIGVycm9yQ29kZSk7CisKKyAgICAgICAgLy8gQnVpbGQgdGhlIHJlc3Qgb2YgdGhlIGRhdGEuCisgICAgICAgIGZvcihwcm9wSW5kZXg9MDsgcHJvcEluZGV4PExFTkdUSE9GKFBST1BFUlRJRVMpOyArK3Byb3BJbmRleCkgeworICAgICAgICAgICAgaWYocHJvcEluZGV4PjApIHsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZVZhbHVlQWxpYXNlcyhQUk9QRVJUSUVTWzBdLCAuLi4pIGFscmVhZHkgZG9uZQorICAgICAgICAgICAgICAgIHNldFByb3BlcnR5SW50KFBST1BFUlRJRVNbcHJvcEluZGV4XS5lbnVtVmFsdWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZUFsaWFzZXMoUFJPUEVSVElFU1twcm9wSW5kZXhdLCBlcnJvckNvZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgdmFsdWVDb3VudD1QUk9QRVJUSUVTW3Byb3BJbmRleF0udmFsdWVDb3VudDsKKyAgICAgICAgICAgIGlmKHZhbHVlQ291bnQ+MCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWVNYXBPZmZzZXQ7CisgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKnZhbHVlcz1QUk9QRVJUSUVTW3Byb3BJbmRleF0udmFsdWVzOworICAgICAgICAgICAgICAgIGlmKHZhbHVlcz09VkFMVUVTX2JpbnByb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBPZmZzZXQ9YmluUHJvcHNWYWx1ZU1hcE9mZnNldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYodmFsdWVzPT1WQUxVRVNfY2NjIHx8IHZhbHVlcz09VkFMVUVTX2xjY2MgfHwgdmFsdWVzPT1WQUxVRVNfdGNjYykgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZU1hcE9mZnNldD1jY2NWYWx1ZU1hcE9mZnNldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZU1hcE9mZnNldD12YWx1ZU1hcHMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBieXRlc1RyaWVPZmZzZXQ9YnVpbGRWYWx1ZXNCeXRlc1RyaWUodmFsdWVzLCB2YWx1ZUNvdW50LCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudChieXRlc1RyaWVPZmZzZXQsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkVmFsdWVNYXAodmFsdWVzLCB2YWx1ZUNvdW50LCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eUludChQUk9QRVJUSUVTW3Byb3BJbmRleF0uZW51bVZhbHVlLCAxLCB2YWx1ZU1hcE9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXhlcy4KKyAgICAgICAgaW50MzJfdCBvZmZzZXQ9KGludDMyX3Qpc2l6ZW9mKGluZGV4ZXMpOworICAgICAgICBpbmRleGVzW1Byb3BOYW1lRGF0YTo6SVhfVkFMVUVfTUFQU19PRkZTRVRdPW9mZnNldDsKKyAgICAgICAgb2Zmc2V0Kz12YWx1ZU1hcHMuc2l6ZSgpKjQ7CisgICAgICAgIGluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9CWVRFX1RSSUVTX09GRlNFVF09b2Zmc2V0OworICAgICAgICBvZmZzZXQrPWJ5dGVzVHJpZXMubGVuZ3RoKCk7CisgICAgICAgIGluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9OQU1FX0dST1VQU19PRkZTRVRdPW9mZnNldDsKKyAgICAgICAgb2Zmc2V0Kz1uYW1lR3JvdXBzLmxlbmd0aCgpOworICAgICAgICBmb3IoaT1Qcm9wTmFtZURhdGE6OklYX1JFU0VSVkVEM19PRkZTRVQ7IGk8PVByb3BOYW1lRGF0YTo6SVhfVE9UQUxfU0laRTsgKytpKSB7CisgICAgICAgICAgICBpbmRleGVzW2ldPW9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpbmRleGVzW1Byb3BOYW1lRGF0YTo6SVhfTUFYX05BTUVfTEVOR1RIXT1tYXhOYW1lTGVuZ3RoOworICAgICAgICBmb3IoaT1Qcm9wTmFtZURhdGE6OklYX1JFU0VSVkVENzsgaTxQcm9wTmFtZURhdGE6OklYX0NPVU5UOyArK2kpIHsKKyAgICAgICAgICAgIGluZGV4ZXNbaV09MDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCFiZVF1aWV0KSB7CisgICAgICAgICAgICBwdXRzKCIqIHBuYW1lcy5pY3Ugc3RhdHMgKiIpOworICAgICAgICAgICAgcHJpbnRmKCJsZW5ndGggb2YgYWxsIHZhbHVlIG1hcHM6ICAlNmxkXG4iLCAobG9uZyl2YWx1ZU1hcHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHByaW50ZigibGVuZ3RoIG9mIGFsbCBCeXRlc1RyaWVzOiAgJTZsZFxuIiwgKGxvbmcpYnl0ZXNUcmllcy5sZW5ndGgoKSk7CisgICAgICAgICAgICBwcmludGYoImxlbmd0aCBvZiBhbGwgbmFtZSBncm91cHM6ICU2bGRcbiIsIChsb25nKW5hbWVHcm91cHMubGVuZ3RoKCkpOworICAgICAgICAgICAgcHJpbnRmKCJsZW5ndGggb2YgcG5hbWVzLmljdSBkYXRhOiAlNmxkXG4iLCAobG9uZylpbmRleGVzW1Byb3BOYW1lRGF0YTo6SVhfVE9UQUxfU0laRV0pOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHdyaXRlQ1NvdXJjZUZpbGUoY29uc3QgY2hhciAqcGF0aCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVCaW5hcnlEYXRhKGNvbnN0IGNoYXIgKnBhdGgsIFVCb29sIHdpdGhDb3B5cmlnaHQsIFVFcnJvckNvZGUgJmVycm9yQ29kZSk7CisKKyAgICBpbnQzMl90IHdyaXRlVmFsdWVBbGlhc2VzKGNvbnN0IFZhbHVlICZ2YWx1ZSwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgICAgIGludDMyX3QgbmFtZU9mZnNldD11aGFzaF9nZXRpKG5hbWVHcm91cFRvT2Zmc2V0LCAodm9pZCAqKXZhbHVlLmpvaW5lZEFsaWFzZXMpOworICAgICAgICBpZihuYW1lT2Zmc2V0IT0wKSB7CisgICAgICAgICAgICAvLyBUaGUgc2FtZSBsaXN0IG9mIGFsaWFzZXMgaGFzIGJlZW4gd3JpdHRlbiBhbHJlYWR5LgorICAgICAgICAgICAgcmV0dXJuIG5hbWVPZmZzZXQtMTsgIC8vIFdhcyBpbmNyZW1lbnRlZCB0byByZXNlcnZlIDAgZm9yICJub3QgZm91bmQiLgorICAgICAgICB9CisgICAgICAgIC8vIFdyaXRlIHRoaXMgbm90LXlldC1zZWVuIGxpc3Qgb2YgYWxpYXNlcy4KKyAgICAgICAgbmFtZU9mZnNldD1uYW1lR3JvdXBzLmxlbmd0aCgpOworICAgICAgICB1aGFzaF9wdXRpKG5hbWVHcm91cFRvT2Zmc2V0LCAodm9pZCAqKXZhbHVlLmpvaW5lZEFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgbmFtZU9mZnNldCsxLCAmZXJyb3JDb2RlKTsKKyAgICAgICAgLy8gVGhlIGZpcnN0IGJ5dGUgdGVsbHMgdXMgaG93IG1hbnkgYWxpYXNlcyB0aGVyZSBhcmUuCisgICAgICAgIC8vIFdlIHVzZSBvbmx5IHZhbHVlcyAwLi4weDFmIGluIHRoZSBmaXJzdCBieXRlIGJlY2F1c2Ugd2hlbiB3ZSB3cml0ZQorICAgICAgICAvLyB0aGUgbmFtZSBncm91cHMgYXMgYW4gaW52YXJpYW50LWNoYXJhY3RlciBzdHJpbmcgaW50byBhIHNvdXJjZSBmaWxlLAorICAgICAgICAvLyB0aG9zZSB2YWx1ZXMgKEMwIGNvbnRyb2wgY29kZXMpIGFyZSB3cml0dGVuIGFzIG51bWJlcnMgcmF0aGVyIHRoYW4gYXMgY2hhcmFjdGVycy4KKyAgICAgICAgaW50MzJfdCBjb3VudD12YWx1ZS5jb3VudDsKKyAgICAgICAgaWYoY291bnQ+PTB4MjApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFRvbyBtYW55IGFsaWFzZXMgaW4gXCIlc1wiXG4iLCB2YWx1ZS5qb2luZWRBbGlhc2VzKTsKKyAgICAgICAgICAgIGV4aXQoVV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgbmFtZUdyb3Vwcy5hcHBlbmQoKGNoYXIpY291bnQsIGVycm9yQ29kZSk7CisgICAgICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IGEgc2hvcnQgbmFtZSAoc29tZXRpbWVzIGVtcHR5KSBhbmQgYSBsb25nIG5hbWUuIChjb3VudD49MikKKyAgICAgICAgLy8gTm90ZTogU29tZXRpbWVzIHRoZSBzaG9ydCBhbmQgbG9uZyBuYW1lcyBhcmUgdGhlIHNhbWUuCisgICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBjb3VsZCBzZXQgYSBmbGFnIGFuZCBvbWl0IHRoZSBkdXBsaWNhdGUsCisgICAgICAgIC8vIGJ1dCB0aGF0IHdvdWxkIHNhdmUgb25seSBhYm91dCAxLjM1JSBvZiB0b3RhbCBkYXRhIHNpemUgKFVuaWNvZGUgNi4wL0lDVSA0LjYpCisgICAgICAgIC8vIHdoaWNoIGlzIG5vdCB3b3J0aCB0aGUgdHJvdWJsZS4KKyAgICAgICAgLy8gTm90ZTogSW4gVW5pY29kZSA2LjEsIHRoZXJlIGFyZSBtb3JlIGR1cGxpY2F0ZXMgZHVlIHRvIG5ld2x5IGFkZGVkCisgICAgICAgIC8vIHNob3J0IG5hbWVzIGZvciBibG9ja3MgYW5kIG90aGVyIHByb3BlcnRpZXMuCisgICAgICAgIC8vIEl0IG1pZ2h0IG5vdyBiZSB3b3J0aCBjaGFuZ2luZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuCisgICAgICAgIGZvcihpbnQzMl90IGk9MDsgaTxjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzPXZhbHVlLmFsaWFzZXNbaV07CisgICAgICAgICAgICBpbnQzMl90IHNMZW5ndGg9dXBydl9zdHJsZW4ocykrMTsKKyAgICAgICAgICAgIGlmKHNMZW5ndGg+bWF4TmFtZUxlbmd0aCkgeworICAgICAgICAgICAgICAgIG1heE5hbWVMZW5ndGg9c0xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVHcm91cHMuYXBwZW5kKHMsIHNMZW5ndGgsIGVycm9yQ29kZSk7ICAvLyBpbmNsdWRpbmcgTlVMCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVPZmZzZXQ7CisgICAgfQorCisgICAgdm9pZCBidWlsZFZhbHVlTWFwKGNvbnN0IFZhbHVlIHZhbHVlc1tdLCBpbnQzMl90IGxlbmd0aCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgICAgIFVWZWN0b3IzMiBzb3J0ZWRWYWx1ZXMoZXJyb3JDb2RlKTsKKyAgICAgICAgVVZlY3RvcjMyIG5hbWVPZmZzZXRzKGVycm9yQ29kZSk7ICAvLyBQYXJhbGxlbCB0byB2YWx1ZXNbXS4KKyAgICAgICAgaW50MzJfdCBpOworICAgICAgICBmb3IoaT0wOyBpPGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBzb3J0ZWRWYWx1ZXMuc29ydGVkSW5zZXJ0KHZhbHVlc1tpXS5lbnVtVmFsdWUsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBuYW1lT2Zmc2V0cy5hZGRFbGVtZW50KHdyaXRlVmFsdWVBbGlhc2VzKHZhbHVlc1tpXSwgZXJyb3JDb2RlKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHJhbmdlc1sxMF1bMl07CisgICAgICAgIGludDMyX3QgbnVtUmFuZ2VzPXVwcnZfbWFrZURlbnNlUmFuZ2VzKHNvcnRlZFZhbHVlcy5nZXRCdWZmZXIoKSwgbGVuZ3RoLCAweGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMsIExFTkdUSE9GKHJhbmdlcykpOworICAgICAgICBpZihudW1SYW5nZXM+MCkgeworICAgICAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQobnVtUmFuZ2VzLCBlcnJvckNvZGUpOworICAgICAgICAgICAgZm9yKGk9MDsgaTxudW1SYW5nZXM7ICsraSkgeworICAgICAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KHJhbmdlc1tpXVswXSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudChyYW5nZXNbaV1bMV0rMSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCBqPXJhbmdlc1tpXVswXTsgajw9cmFuZ2VzW2ldWzFdOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJhbmdlIG1pZ2h0IG5vdCBiZSBjb21wbGV0ZWx5IGRlbnNlLCBzbyBqIG1pZ2h0IG5vdCBoYXZlIGFuIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIHdyaXRlIGEgbmFtZU9mZnNldCBvZiAwLgorICAgICAgICAgICAgICAgICAgICAvLyBSZWFsIG5hbWVPZmZzZXRzIGZvciBwcm9wZXJ0eSB2YWx1ZXMgYXJlIG5ldmVyIDAuCisgICAgICAgICAgICAgICAgICAgIC8vIChUaGUgZmlyc3QgbmFtZSBncm91cCBpcyBmb3IgdGhlIGZpcnN0IHByb3BlcnR5IG5hbWUuKQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlSW5kZXg9dmFsdWVzSW5kZXhPZih2YWx1ZXMsIGxlbmd0aCwgaik7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbmFtZU9mZnNldD0gdmFsdWVJbmRleD49MCA/IG5hbWVPZmZzZXRzLmVsZW1lbnRBdGkodmFsdWVJbmRleCkgOiAwOworICAgICAgICAgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudChuYW1lT2Zmc2V0LCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIGRlbnNlIHJhbmdlcy4KKyAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KDB4MTArbGVuZ3RoLCBlcnJvckNvZGUpOworICAgICAgICAgICAgZm9yKGk9MDsgaTxsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KHNvcnRlZFZhbHVlcy5lbGVtZW50QXRpKGkpLCBlcnJvckNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKGk9MDsgaTxsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICBuYW1lT2Zmc2V0cy5lbGVtZW50QXRpKAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzSW5kZXhPZih2YWx1ZXMsIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFZhbHVlcy5lbGVtZW50QXRpKGkpKSksIGVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgaW50MzJfdCB2YWx1ZXNJbmRleE9mKGNvbnN0IFZhbHVlIHZhbHVlc1tdLCBpbnQzMl90IGxlbmd0aCwgaW50MzJfdCB2YWx1ZSkgeworICAgICAgICBmb3IoaW50MzJfdCBpPTA7OyArK2kpIHsKKyAgICAgICAgICAgIGlmKHZhbHVlc1tpXS5lbnVtVmFsdWU9PXZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZvaWQgc2V0UHJvcGVydHlJbnQoaW50MzJfdCBwcm9wLCBpbnQzMl90IHN1YkluZGV4LCBpbnQzMl90IHZhbHVlKSB7CisgICAgICAgIC8vIEFzc3VtZSB0aGF0IHByb3AgaXMgaW4gdGhlIHZhbHVlTWFwcy5lbGVtZW50QXRpKDApIHJhbmdlcy4KKyAgICAgICAgaW50MzJfdCBpbmRleD0xOworICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgIGludDMyX3QgcmFuZ2VTdGFydD12YWx1ZU1hcHMuZWxlbWVudEF0aShpbmRleCk7CisgICAgICAgICAgICBpbnQzMl90IHJhbmdlTGltaXQ9dmFsdWVNYXBzLmVsZW1lbnRBdGkoaW5kZXgrMSk7CisgICAgICAgICAgICBpbmRleCs9MjsKKyAgICAgICAgICAgIGlmKHJhbmdlU3RhcnQ8PXByb3AgJiYgcHJvcDxyYW5nZUxpbWl0KSB7CisgICAgICAgICAgICAgICAgdmFsdWVNYXBzLnNldEVsZW1lbnRBdCh2YWx1ZSwgaW5kZXgrMioocHJvcC1yYW5nZVN0YXJ0KStzdWJJbmRleCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCs9MioocmFuZ2VMaW1pdC1yYW5nZVN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWRkVmFsdWVUb0J5dGVzVHJpZShjb25zdCBWYWx1ZSAmdmFsdWUsIFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgICAgICBjb25zdCBjaGFyICphbGlhc2VzW01BWF9BTElBU0VTXTsKKyAgICAgICAgaW50MzJfdCBudW1BbGlhc2VzPXZhbHVlLmdldFVuaXF1ZU5vcm1hbGl6ZWRBbGlhc2VzKGFsaWFzZXMpOworICAgICAgICBmb3IoaW50MzJfdCBpPTA7IGk8bnVtQWxpYXNlczsgKytpKSB7CisgICAgICAgICAgICBidGIuYWRkKGFsaWFzZXNbaV0sIHZhbHVlLmVudW1WYWx1ZSwgZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgYnVpbGRWYWx1ZXNCeXRlc1RyaWUoY29uc3QgVmFsdWUgdmFsdWVzW10sIGludDMyX3QgbGVuZ3RoLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICAgICAgYnRiLmNsZWFyKCk7CisgICAgICAgIGZvcihpbnQzMl90IGk9MDsgaTxsZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYWRkVmFsdWVUb0J5dGVzVHJpZSh2YWx1ZXNbaV0sIGVycm9yQ29kZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBieXRlc1RyaWVPZmZzZXQ9Ynl0ZXNUcmllcy5sZW5ndGgoKTsKKyAgICAgICAgYnl0ZXNUcmllcy5hcHBlbmQoYnRiLmJ1aWxkU3RyaW5nUGllY2UoVVNUUklOR1RSSUVfQlVJTERfU01BTEwsIGVycm9yQ29kZSksIGVycm9yQ29kZSk7CisgICAgICAgIHJldHVybiBieXRlc1RyaWVPZmZzZXQ7CisgICAgfQorCisgICAgLy8gVmFyaWFudCBvZiBidWlsZFZhbHVlc0J5dGVzVHJpZSgpIGZvciBQcm9wZXJ0eS4KKyAgICAvLyBQcm9wZXJ0eSBpcy1hIFZhbHVlLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGlzIHRoZSBzYW1lLAorICAgIC8vIGJ1dCB3aGVuIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkgd2UgbmVlZCB0byBpbmNyZW1lbnQgYnkgdGhlIHJpZ2h0IG9iamVjdCBzaXplLgorICAgIGludDMyX3QgYnVpbGRQcm9wZXJ0aWVzQnl0ZXNUcmllKGNvbnN0IFByb3BlcnR5IHByb3BlcnRpZXNbXSwgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgICAgIGJ0Yi5jbGVhcigpOworICAgICAgICBmb3IoaW50MzJfdCBpPTA7IGk8bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFkZFZhbHVlVG9CeXRlc1RyaWUocHJvcGVydGllc1tpXSwgZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGJ5dGVzVHJpZU9mZnNldD1ieXRlc1RyaWVzLmxlbmd0aCgpOworICAgICAgICBieXRlc1RyaWVzLmFwcGVuZChidGIuYnVpbGRTdHJpbmdQaWVjZShVU1RSSU5HVFJJRV9CVUlMRF9TTUFMTCwgZXJyb3JDb2RlKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVzVHJpZU9mZnNldDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IFByb3BlcnR5TmFtZXMgKmdldFByb3BlcnR5TmFtZXMoKSB7CisgICAgICAgIHBuYW1lcy5pbml0KHZhbHVlTWFwcy5nZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KGJ5dGVzVHJpZXMuZGF0YSgpKSk7CisgICAgICAgIHJldHVybiAmcG5hbWVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQzMl90IGluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9DT1VOVF07CisgICAgVVZlY3RvcjMyIHZhbHVlTWFwczsKKyAgICBCeXRlc1RyaWVCdWlsZGVyIGJ0YjsKKyAgICBDaGFyU3RyaW5nIGJ5dGVzVHJpZXM7CisgICAgQ2hhclN0cmluZyBuYW1lR3JvdXBzOworICAgIGludDMyX3QgbWF4TmFtZUxlbmd0aDsKKyAgICBQTmFtZXNQcm9wZXJ0eU5hbWVzIHBuYW1lczsKKyAgICBVSGFzaHRhYmxlICpuYW1lR3JvdXBUb09mZnNldDsKK307CisKKy8qIFVEYXRhSW5mbyBjZi4gdWRhdGEuaCAqLworc3RhdGljIGNvbnN0IFVEYXRhSW5mbyBkYXRhSW5mbyA9IHsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgc2l6ZW9mKFVDaGFyKSwKKyAgICAwLAorCisgICAgeyBQTkFNRV9TSUdfMCwgUE5BTUVfU0lHXzEsIFBOQU1FX1NJR18yLCBQTkFNRV9TSUdfMyB9LAorICAgIHsgMiwgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgLyogZm9ybWF0VmVyc2lvbiAqLworICAgIFVOSUNPREVfVkVSU0lPTgorfTsKKwordm9pZAorUE5hbWVzQnVpbGRlckltcGw6OndyaXRlQmluYXJ5RGF0YShjb25zdCBjaGFyICpwYXRoLCBVQm9vbCB3aXRoQ29weXJpZ2h0LCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKyAgICBVTmV3RGF0YU1lbW9yeSAqcGRhdGE9dWRhdGFfY3JlYXRlKHBhdGgsIFBOQU1FX0RBVEFfVFlQRSwgUE5BTUVfREFUQV9OQU1FLCAmZGF0YUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ29weXJpZ2h0ID8gVV9DT1BZUklHSFRfU1RSSU5HIDogMCwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogdWRhdGFfY3JlYXRlKCVzLCBwbmFtZXMuaWN1KSBmYWlsZWQgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICBwYXRoLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVkYXRhX3dyaXRlQmxvY2socGRhdGEsIGluZGV4ZXMsIFByb3BOYW1lRGF0YTo6SVhfQ09VTlQqNCk7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwZGF0YSwgdmFsdWVNYXBzLmdldEJ1ZmZlcigpLCB2YWx1ZU1hcHMuc2l6ZSgpKjQpOworICAgIHVkYXRhX3dyaXRlQmxvY2socGRhdGEsIGJ5dGVzVHJpZXMuZGF0YSgpLCBieXRlc1RyaWVzLmxlbmd0aCgpKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBkYXRhLCBuYW1lR3JvdXBzLmRhdGEoKSwgbmFtZUdyb3Vwcy5sZW5ndGgoKSk7CisKKyAgICBpbnQzMl90IGRhdGFMZW5ndGg9KGludDMyX3QpdWRhdGFfZmluaXNoKHBkYXRhLCAmZXJyb3JDb2RlKTsKKyAgICBpZihkYXRhTGVuZ3RoIT1pbmRleGVzW1Byb3BOYW1lRGF0YTo6SVhfVE9UQUxfU0laRV0pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVkYXRhX2ZpbmlzaChwbmFtZXMuaWN1KSByZXBvcnRzICVsZCBieXRlcyB3cml0dGVuIGJ1dCBzaG91bGQgYmUgJWxkXG4iLAorICAgICAgICAgICAgICAgIChsb25nKWRhdGFMZW5ndGgsIChsb25nKWluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9UT1RBTF9TSVpFXSk7CisgICAgICAgIGVycm9yQ29kZT1VX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgfQorfQorCit2b2lkCitQTmFtZXNCdWlsZGVySW1wbDo6d3JpdGVDU291cmNlRmlsZShjb25zdCBjaGFyICpwYXRoLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeyByZXR1cm47IH0KKyAgICBGSUxFICpmPXVzcmNfY3JlYXRlKHBhdGgsICJwcm9wbmFtZV9kYXRhLmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgImljdS90b29scy91bmljb2RlL2MvZ2VucHJvcHMvcG5hbWVzYnVpbGRlci5jcHAiKTsKKyAgICBpZihmPT1OVUxMKSB7CisgICAgICAgIGVycm9yQ29kZT1VX0ZJTEVfQUNDRVNTX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnB1dHMoIiNpZm5kZWYgSU5DTFVERURfRlJPTV9QUk9QTkFNRV9DUFBcbiIKKyAgICAgICAgICAiIyAgIGVycm9yIFRoaXMgZmlsZSBtdXN0IGJlICNpbmNsdWRlZCBmcm9tIHByb3BuYW1lLmNwcCBvbmx5LlxuIgorICAgICAgICAgICIjZW5kaWZcblxuIiwgZik7CisKKyAgICBmcHV0cygiVV9OQU1FU1BBQ0VfQkVHSU5cblxuIiwgZik7CisKKyAgICB1c3JjX3dyaXRlQXJyYXkoZiwgImNvbnN0IGludDMyX3QgUHJvcE5hbWVEYXRhOjppbmRleGVzWyVsZF09eyIsCisgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMsIDMyLCBQcm9wTmFtZURhdGE6OklYX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAifTtcblxuIik7CisgICAgdXNyY193cml0ZUFycmF5KGYsICJjb25zdCBpbnQzMl90IFByb3BOYW1lRGF0YTo6dmFsdWVNYXBzWyVsZF09e1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBzLmdldEJ1ZmZlcigpLCAzMiwgdmFsdWVNYXBzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgIlxufTtcblxuIik7CisgICAgdXNyY193cml0ZUFycmF5KGYsICJjb25zdCB1aW50OF90IFByb3BOYW1lRGF0YTo6Ynl0ZXNUcmllc1slbGRdPXtcbiIsCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzVHJpZXMuZGF0YSgpLCA4LCBieXRlc1RyaWVzLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAiXG59O1xuXG4iKTsKKyAgICB1c3JjX3dyaXRlQXJyYXlPZk1vc3RseUludkNoYXJzKAorICAgICAgICBmLCAiY29uc3QgY2hhciBQcm9wTmFtZURhdGE6Om5hbWVHcm91cHNbJWxkXT17XG4iLAorICAgICAgICBuYW1lR3JvdXBzLmRhdGEoKSwgbmFtZUdyb3Vwcy5sZW5ndGgoKSwKKyAgICAgICAgIlxufTtcblxuIik7CisKKyAgICBmcHV0cygiVV9OQU1FU1BBQ0VfRU5EXG4iLCBmKTsKKworICAgIGZjbG9zZShmKTsKK30KKworUE5hbWVzQnVpbGRlciAqCitjcmVhdGVQTmFtZXNCdWlsZGVyKFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7IHJldHVybiBOVUxMOyB9CisgICAgUE5hbWVzQnVpbGRlciAqcGI9bmV3IFBOYW1lc0J1aWxkZXJJbXBsKGVycm9yQ29kZSk7CisgICAgaWYocGI9PU5VTEwpIHsKKyAgICAgICAgZXJyb3JDb2RlPVVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBwYjsKK30KKworLy8gTm90ZTogVGhlIGZvbGxvd2luZyBpcyBhIHBhcnRpYWwgY29weSBvZiBydW50aW1lIHByb3BuYW1lLmNwcCBjb2RlLgorLy8gQ29uc2lkZXIgY2hhbmdpbmcgdGhhdCBpbnRvIGEgc2VtaS1wdWJsaWMgQVBJIHRvIGF2b2lkIGR1cGxpY2F0aW9uLgorCitpbnQzMl90IFBOYW1lc1Byb3BlcnR5TmFtZXM6OmZpbmRQcm9wZXJ0eShpbnQzMl90IHByb3BlcnR5KSBjb25zdCB7CisgICAgaW50MzJfdCBpPTE7ICAvLyB2YWx1ZU1hcHMgaW5kZXgsIGluaXRpYWxseSBhZnRlciBudW1SYW5nZXMKKyAgICBmb3IoaW50MzJfdCBudW1SYW5nZXM9dmFsdWVNYXBzWzBdOyBudW1SYW5nZXM+MDsgLS1udW1SYW5nZXMpIHsKKyAgICAgICAgLy8gUmVhZCBhbmQgc2tpcCB0aGUgc3RhcnQgYW5kIGxpbWl0IG9mIHRoaXMgcmFuZ2UuCisgICAgICAgIGludDMyX3Qgc3RhcnQ9dmFsdWVNYXBzW2ldOworICAgICAgICBpbnQzMl90IGxpbWl0PXZhbHVlTWFwc1tpKzFdOworICAgICAgICBpKz0yOworICAgICAgICBpZihwcm9wZXJ0eTxzdGFydCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYocHJvcGVydHk8bGltaXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpKyhwcm9wZXJ0eS1zdGFydCkqMjsKKyAgICAgICAgfQorICAgICAgICBpKz0obGltaXQtc3RhcnQpKjI7ICAvLyBTa2lwIGFsbCBlbnRyaWVzIGZvciB0aGlzIHJhbmdlLgorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworVUJvb2wgUE5hbWVzUHJvcGVydHlOYW1lczo6Y29udGFpbnNOYW1lKEJ5dGVzVHJpZSAmdHJpZSwgY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIGlmKG5hbWU9PU5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBVU3RyaW5nVHJpZVJlc3VsdCByZXN1bHQ9VVNUUklOR1RSSUVfTk9fVkFMVUU7CisgICAgY2hhciBjOworICAgIHdoaWxlKChjPSpuYW1lKyspIT0wKSB7CisgICAgICAgIGM9dXBydl9pbnZDaGFyVG9Mb3dlcmNhc2VBc2NpaShjKTsKKyAgICAgICAgLy8gSWdub3JlIGRlbGltaXRlcnMgJy0nLCAnXycsIGFuZCBBU0NJSSBXaGl0ZV9TcGFjZS4KKyAgICAgICAgaWYoYz09MHgyZCB8fCBjPT0weDVmIHx8IGM9PTB4MjAgfHwgKDB4MDk8PWMgJiYgYzw9MHgwZCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCFVU1RSSU5HVFJJRV9IQVNfTkVYVChyZXN1bHQpKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0PXRyaWUubmV4dCgodWludDhfdCljKTsKKyAgICB9CisgICAgcmV0dXJuIFVTVFJJTkdUUklFX0hBU19WQUxVRShyZXN1bHQpOworfQorCitpbnQzMl90IFBOYW1lc1Byb3BlcnR5TmFtZXM6OmdldFByb3BlcnR5T3JWYWx1ZUVudW0oaW50MzJfdCBieXRlc1RyaWVPZmZzZXQsIGNvbnN0IGNoYXIgKmFsaWFzKSBjb25zdCB7CisgICAgQnl0ZXNUcmllIHRyaWUoYnl0ZXNUcmllcytieXRlc1RyaWVPZmZzZXQpOworICAgIGlmKGNvbnRhaW5zTmFtZSh0cmllLCBhbGlhcykpIHsKKyAgICAgICAgcmV0dXJuIHRyaWUuZ2V0VmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVUNIQVJfSU5WQUxJRF9DT0RFOworICAgIH0KK30KKworaW50MzJfdAorUE5hbWVzUHJvcGVydHlOYW1lczo6Z2V0UHJvcGVydHlFbnVtKGNvbnN0IGNoYXIgKmFsaWFzKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByb3BlcnR5T3JWYWx1ZUVudW0oMCwgYWxpYXMpOworfQorCitpbnQzMl90CitQTmFtZXNQcm9wZXJ0eU5hbWVzOjpnZXRQcm9wZXJ0eVZhbHVlRW51bShpbnQzMl90IHByb3BlcnR5LCBjb25zdCBjaGFyICphbGlhcykgY29uc3QgeworICAgIGludDMyX3QgdmFsdWVNYXBJbmRleD1maW5kUHJvcGVydHkocHJvcGVydHkpOworICAgIGlmKHZhbHVlTWFwSW5kZXg9PTApIHsKKyAgICAgICAgcmV0dXJuIFVDSEFSX0lOVkFMSURfQ09ERTsgIC8vIE5vdCBhIGtub3duIHByb3BlcnR5LgorICAgIH0KKyAgICB2YWx1ZU1hcEluZGV4PXZhbHVlTWFwc1t2YWx1ZU1hcEluZGV4KzFdOworICAgIGlmKHZhbHVlTWFwSW5kZXg9PTApIHsKKyAgICAgICAgcmV0dXJuIFVDSEFSX0lOVkFMSURfQ09ERTsgIC8vIFRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIG5hbWVkIHZhbHVlcy4KKyAgICB9CisgICAgLy8gdmFsdWVNYXBJbmRleCBpcyB0aGUgc3RhcnQgb2YgdGhlIHByb3BlcnR5J3MgdmFsdWVNYXAsCisgICAgLy8gd2hlcmUgdGhlIGZpcnN0IHdvcmQgaXMgdGhlIEJ5dGVzVHJpZSBvZmZzZXQuCisgICAgcmV0dXJuIGdldFByb3BlcnR5T3JWYWx1ZUVudW0odmFsdWVNYXBzW3ZhbHVlTWFwSW5kZXhdLCBhbGlhcyk7Cit9CmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudWNhL0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL2dlbnVjYS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQ3NTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisjIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBjcmVhdGVkIG9uOiAyMDEwanVuMDMKKyMgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyMgZWRpdGVkIG9uOiAyMDEwanVsMjAKKyMgZWRpdGVkIGJ5OiBTdHVhcnQgRy4gR2lsbAorYWRkX2V4ZWN1dGFibGUoZ2VudWNhIGdlbnVjYS5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2VudWNhIGljdXVjIGljdWkxOG4gaWN1dHUpCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudWNhL01ha2VmaWxlLmluIGIvdW5pY29kZS9jL2dlbnVjYS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjEzOGUyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDk2IEBACisjIyBNYWtlZmlsZS5pbiBmb3IgSUNVIC0gdG9vbHMvZ2VudWNhCisjIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyMjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIyMgU291cmNlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKwordG9wX2J1aWxkZGlyID0gLi4vLi4KKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaWN1ZGVmcy5taworCisjIyBCdWlsZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N1YmRpciA9IHRvb2xzL2dlbnVjYQorCitUQVJHRVRfU1RVQl9OQU1FID0gZ2VudWNhCisKK1NFQ1RJT04gPSA4CisKK01BTl9GSUxFUyA9ICQoVEFSR0VUX1NUVUJfTkFNRSkuJChTRUNUSU9OKQorCisKKyMjIEV4dHJhIGZpbGVzIHRvIHJlbW92ZSBmb3IgJ21ha2UgY2xlYW4nCitDTEVBTkZJTEVTID0gKn4gJChERVBTKSAkKE1BTl9GSUxFUykKKworIyMgVGFyZ2V0IGluZm9ybWF0aW9uCitUQVJHRVQgPSAkKEJJTkRJUikvJChUQVJHRVRfU1RVQl9OQU1FKSQoRVhFRVhUKQorCitpZm5lcSAoJCh0b3BfYnVpbGRkaXIpLCQodG9wX3NyY2RpcikpCitDUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKS9jb21tb24KK2VuZGlmCitDUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvY29tbW9uIC1JJCh0b3Bfc3JjZGlyKS9pMThuIC1JJChzcmNkaXIpLy4uL3Rvb2x1dGlsCitMSUJTID0gJChMSUJJQ1VUT09MVVRJTCkgJChMSUJJQ1VJMThOKSAkKExJQklDVVVDKSAkKERFRkFVTFRfTElCUykgJChMSUJfTSkKKworT0JKRUNUUyA9IGdlbnVjYS5vIAorCitERVBTID0gJChPQkpFQ1RTOi5vPS5kKQorCisjIyBMaXN0IG9mIHBob255IHRhcmdldHMKKy5QSE9OWSA6IGFsbCBhbGwtbG9jYWwgaW5zdGFsbCBpbnN0YWxsLWxvY2FsIGNsZWFuIGNsZWFuLWxvY2FsCVwKK2Rpc3RjbGVhbiBkaXN0Y2xlYW4tbG9jYWwgZGlzdCBkaXN0LWxvY2FsIGNoZWNrIGNoZWNrLWxvY2FsIGluc3RhbGwtbWFuCisKKyMjIENsZWFyIHN1ZmZpeCBsaXN0CisuU1VGRklYRVMgOgorCisjIyBMaXN0IG9mIHN0YW5kYXJkIHRhcmdldHMKK2FsbDogYWxsLWxvY2FsCitpbnN0YWxsOiBpbnN0YWxsLWxvY2FsCitjbGVhbjogY2xlYW4tbG9jYWwKK2Rpc3RjbGVhbiA6IGRpc3RjbGVhbi1sb2NhbAorZGlzdDogZGlzdC1sb2NhbAorY2hlY2s6IGFsbCBjaGVjay1sb2NhbAorCithbGwtbG9jYWw6ICQoVEFSR0VUKSAkKE1BTl9GSUxFUykKKworaW5zdGFsbC1sb2NhbDogYWxsLWxvY2FsIGluc3RhbGwtbWFuCisJJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChzYmluZGlyKQorCSQoSU5TVEFMTCkgJChUQVJHRVQpICQoREVTVERJUikkKHNiaW5kaXIpCisKK2luc3RhbGwtbWFuOiAkKE1BTl9GSUxFUykKKwkkKE1LSU5TVEFMTERJUlMpICQoREVTVERJUikkKG1hbmRpcikvbWFuJChTRUNUSU9OKQorCSQoSU5TVEFMTF9EQVRBKSAkPyAkKERFU1RESVIpJChtYW5kaXIpL21hbiQoU0VDVElPTikKKworZGlzdC1sb2NhbDoKKworY2xlYW4tbG9jYWw6CisJdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgJChSTVYpICQoQ0xFQU5GSUxFUykKKwkkKFJNVikgJChUQVJHRVQpICQoT0JKRUNUUykKKworZGlzdGNsZWFuLWxvY2FsOiBjbGVhbi1sb2NhbAorCSQoUk1WKSBNYWtlZmlsZQorCitjaGVjay1sb2NhbDogYWxsLWxvY2FsCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQoVEFSR0VUKSA6ICQoT0JKRUNUUykKKwkkKExJTksuY2MpICQoT1VUT1BUKSRAICReICQoTElCUykgCisJJChQT1NUX0JVSUxEX1NURVApCisKKworJS4kKFNFQ1RJT04pOiAkKHNyY2RpcikvJS4kKFNFQ1RJT04pLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKworaWZlcSAoLCQoTUFLRUNNREdPQUxTKSkKKy1pbmNsdWRlICQoREVQUykKK2Vsc2UKK2lmbmVxICgkKHBhdHN1YnN0ICVjbGVhbiwsJChNQUtFQ01ER09BTFMpKSwpCistaW5jbHVkZSAkKERFUFMpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnVjYS9nZW50ZXN0c3R1Yi5weSBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudGVzdHN0dWIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNmZGU4NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudGVzdHN0dWIucHkKQEAgLTAsMCArMSw1MyBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMgICBDb3B5cmlnaHQgKEMpIDIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgICBmaWxlIG5hbWU6ICBnZW50ZXN0c3R1Yi5weQorIyAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisjICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisjICAgaW5kZW50YXRpb246MgorCitfX2F1dGhvcl9fID0gIkNsYWlyZSBIbyIKKworaW1wb3J0IHN5cworCisjIHJlYWQgZmlsZQorcHJpbnQgImNvbW1hbmQ6ICBweXRob24gZ2VudGVzdHN0dWIucHkgPGlucHV0RmlsZU5hbWUudHh0PiAgPG91dHB1dEZpbGVOYW1lLnR4dD4iCitwcmludCAiaWYgdGhlIGZpbGVOYW1lLnR4dCBpcyBvbWl0dGVkLCB0aGUgZGVmYXVsdCBkYXRhIGZpbGUgaXMgQ29sbGF0aW9uVGVzdF9OT05fSUdOT1JBQkxFX1NIT1JULnR4dCIKK2lmIGxlbihzeXMuYXJndikgPj0gMjoKKyAgZm5hbWU9c3lzLmFyZ3ZbMV0KK2Vsc2UgOgorICBmbmFtZT0iQ29sbGF0aW9uVGVzdF9OT05fSUdOT1JBQkxFX1NIT1JULnR4dCIKK29wZW5maWxlID0gb3BlbihmbmFtZSwgJ3InKTsKKworI291dHB1dCBmaWxlIG5hbWUKK2V4dD1mbmFtZS5maW5kKCIudHh0Iik7CitpZiBsZW4oc3lzLmFyZ3YpID49MyA6CisgIHdGbmFtZSA9IHN5cy5hcmd2WzJdCitlbGlmIChleHQ+MCkgOgorICB3Rm5hbWUgPSBmbmFtZVs6ZXh0KzFdKyJfU1RVQi50eHQiCitlbHNlIDoKKyAgd0ZuYW1lID0gIm91dC50eHQiCit3cmZpbGUgPSBvcGVuKHdGbmFtZSwndycpCisKK3ByaW50ICJSZWFkaW5nIGZpbGU6ICIrZm5hbWUrIiAuLi4iCitwcmludCAiV3JpdGluZyBmaWxlOiAiK3dGbmFtZSsiIC4uLiIKK2NvdW50PTEwCitmb3IgbGluZSBpbiBvcGVuZmlsZS5yZWFkbGluZXMoKToKKyAgcG9zID0gbGluZS5maW5kKCIjIikKKyAgaWYgcG9zID09IDA6CisgICAgIyBwcmludCB0aGUgaGVhZGVyCisgICAgd3JmaWxlLndyaXRlKGxpbmUucnN0cmlwKCkrIlxuIikKKyAgICBjb250aW51ZQorICBpZiBwb3MgPj0gMDogbGluZSA9IGxpbmVbOnBvc10KKyAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgaWYgbGluZToKKyAgICBpZiAoY291bnQ9PTEwKToKKyAgICAgIHdyZmlsZS53cml0ZShsaW5lKyJcbiIpCisgICAgICBjb3VudD0wCisgICAgY291bnQ9Y291bnQrMQoraWYgY291bnQhPTE6CisgIGlmIGxpbmU6CisgICAgd3JmaWxlLndyaXRlKGxpbmUrIlxuIikgICMgd3JpdGUgdGhlIGxhc3QgY2FzZQord3JmaWxlLmNsb3NlKCkKK29wZW5maWxlLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLjguaW4gYi91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWIyN2QKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS44LmluCkBAIC0wLDAgKzEsOTQgQEAKKy5cIiBIZXksIEVtYWNzISBUaGlzIGlzIC0qLW5yb2ZmLSotIHlvdSBrbm93Li4uCisuXCIKKy5cIiBnZW51Y2EuODogbWFudWFsIHBhZ2UgZm9yIHRoZSBnZW51Y2EgdXRpbGl0eQorLlwiCisuXCIgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgSUJNLCBJbmMuIGFuZCBvdGhlcnMuCisuXCIKKy5USCBHRU5VQ0EgOCAiMjIgRmVicnVhcnkgMjAwMSIgIklDVSBNQU5QQUdFIiAiSUNVIEBWRVJTSU9OQCBNYW51YWwiCisuU0ggTkFNRQorLkIgZ2VudWNhCitcLSBjcmVhdGUgdGhlIFVDQSBkYXRhIHRhYmxlCisuU0ggU1lOT1BTSVMKKy5CIGdlbnVjYQorWworLkJSICJcLWhcZlAsIFxmQlwtP1xmUCwgXGZCXC1cLWhlbHAiCitdCitbCisuQlIgIlwtVlxmUCwgXGZCXC1cLXZlcnNpb24iCitdCitbCisuQlIgIlwtdlxmUCwgXGZCXC1cLXZlcmJvc2UiCitdCitbCisuQkkgIlwtY1xmUCwgXGZCXC1cLWNvcHlyaWdodCIKK10KK1sKKy5CSSAiXC1zXGZQLCBcZkJcLVwtc291cmNlZGlyIiAiIHNvdXJjZSIKK10KK1sKKy5CSSAiXC1kXGZQLCBcZkJcLVwtZGVzdGRpciIgIiBkZXN0aW5hdGlvbiIKK10KK1sKKy5JUiBmaWxlCitdCisuU0ggREVTQ1JJUFRJT04KKy5CIGdlbnVjYQorY29tcGlsZXMgdGhlIFVuaWNvZGUgQ29sbGF0aW9uIEFsZ29yaXRobSAoVUNBKSBkYXRhIGZyb20KKy5JIGZpbGUKKyhvciBmcm9tCisuQiBGcmFjdGlvbmFsVUNBLnR4dAoraWYKKy5JIGZpbGUKK2lzIG9taXR0ZWQpIGludG8gaXRzIGJpbmFyeSBmb3JtLCB0aGUgZmlsZXMKKy5CIHVjYWRhdGEuZGF0CithbmQKKy5CUiBpbnZ1Y2EuZGF0IC4KK1RoZXNlIGJpbmFyeSBmaWxlcyBjYW4gdGhlbiBiZSByZWFkIGRpcmVjdGx5IGJ5IElDVSwgb3IgdXNlZCBieQorLkJSIHBrZ2RhdGEgKDgpCitmb3IgaW5jb3Jwb3JhdGlvbiBpbnRvIGEgbGFyZ2VyIGFyY2hpdmUgb3IgbGlicmFyeS4KKy5TSCBPUFRJT05TCisuVFAKKy5CUiAiXC1oXGZQLCBcZkJcLT9cZlAsIFxmQlwtXC1oZWxwIgorUHJpbnQgaGVscCBhYm91dCB1c2FnZSBhbmQgZXhpdC4KKy5UUAorLkJSICJcLVZcZlAsIFxmQlwtXC12ZXJzaW9uIgorUHJpbnQgdGhlIHZlcnNpb24gb2YKKy5CIGdlbnVjYQorYW5kIGV4aXQuCisuVFAKKy5CUiAiXC12XGZQLCBcZkJcLVwtdmVyYm9zZSIKK0Rpc3BsYXkgZXh0cmEgaW5mb3JtYXRpdmUgbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKy5UUAorLkJJICJcLWNcZlAsIFxmQlwtXC1jb3B5cmlnaHQiCitJbmNsdWRlIGEgY29weXJpZ2h0IG5vdGljZSBpbnRvIHRoZSBiaW5hcnkgZGF0YS4KKy5UUAorLkJJICJcLXNcZlAsIFxmQlwtXC1zb3VyY2VkaXIiICIgc291cmNlIgorU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRvCisuSVIgc291cmNlIC4KK1RoZSBkZWZhdWx0IHNvdXJjZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLkJSIElDVV9EQVRBIC4KKy5UUAorLkJJICJcLWRcZlAsIFxmQlwtXC1kZXN0ZGlyIiAiIGRlc3RpbmF0aW9uIgorU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgdG8KKy5JUiBkZXN0aW5hdGlvbiAuCitUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLkJSIElDVV9EQVRBIC4KKy5TSCBFTlZJUk9OTUVOVAorLlRQIDEwCisuQiBJQ1VfREFUQQorU3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBJQ1UgZGF0YS4gRGVmYXVsdHMgdG8KKy5CUiBAdGhlcGtnaWN1ZGF0YWRpckAvQFBBQ0tBR0VAL0BWRVJTSU9OQC8gLgorU29tZSB0b29scyBpbiBJQ1UgZGVwZW5kIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgdHJhaWxpbmcgc2xhc2guIEl0IGlzIHRodXMKK2ltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBwcmVzZW50IGlmCisuQiBJQ1VfREFUQQoraXMgc2V0LgorLlNIIEZJTEVTCisuVFAgMTUKKy5CIEZyYWN0aW9uYWxVQ0EudHh0CitNYWNoaW5lLXJlYWRhYmxlIGZpbGUgY29udGFpbmluZyBkYXRhIGZvciB0aGUgVW5pY29kZSBjb2xsYXRpb24gYWxnb3JpdGhtLgorLlNIIFZFUlNJT04KK0BWRVJTSU9OQAorLlNIIENPUFlSSUdIVAorQ29weXJpZ2h0IChDKSAyMDAxIElCTSwgSW5jLiBhbmQgb3RoZXJzLgorLlNIIFNFRSBBTFNPCisuQlIgcGtnZGF0YSAoOCkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLmNwcCBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTZlZWFhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9nZW51Y2EuY3BwCkBAIC0wLDAgKzEsMTYzMSBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIGdlbnVjYS5jcHAKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgWFggY2VudHVyeQorKiAgIGNyZWF0ZWQgYnk6IFZsYWRpbWlyIFdlaW5zdGVpbgorKgorKiAgIFRoaXMgcHJvZ3JhbSByZWFkcyB0aGUgRnJhbmN0aW9uYWwgVUNBIHRhYmxlIGFuZCBnZW5lcmF0ZXMKKyogICBpbnRlcm5hbCBmb3JtYXQgZm9yIFVDQSB0YWJsZSBhcyB3ZWxsIGFzIGludmVyc2UgVUNBIHRhYmxlLgorKiAgIEl0IHRoZW4gd3JpdGVzIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHRoZSBkYXRhOiB1Y2FkYXRhLmRhdCAKKyogICAmIGludnVjYS5kYXQKKyogICBDaGFuZ2UgaGlzdG9yeToKKyogICAwMi8yMy8yMDAxICBncmhvdGVuICAgICAgICAgICAgICAgICBNYWRlIGl0IGludG8gYSB0b29sCisqICAgMDIvMjMvMjAwMSAgd2VpdiAgICAgICAgICAgICAgICAgICAgTW92ZWQgZWxlbWVudCAmIHRhYmxlIGhhbmRsaW5nIGNvZGUgdG8gaTE4bgorKiAgIDA1LzA5LzIwMDEgIHdlaXYgICAgICAgICAgICAgICAgICAgIENhc2UgYml0cyBhcmUgbm93IGluIHRoZSBDRXMsIG5vdCBpbiBmcm9udAorKiAgIDEwLzI2LzIwMTAgIHNnaWxsICAgICAgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIHJlb3JkZXJpbmcgY29kZXMKKyovCisKKyNkZWZpbmUgVV9OT19ERUZBVUxUX0lOQ0xVREVfVVRGX0hFQURFUlMgMQorCisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3B1dGlsLmgiCisjaW5jbHVkZSAidW5pY29kZS91ZGF0YS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2NyaXB0LmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZS91dGYxNi5oIgorI2luY2x1ZGUgImNoYXJzdHIuaCIKKyNpbmNsdWRlICJ1Y29sX2JsZC5oIgorI2luY2x1ZGUgInVjb2xfaW1wLmgiCisjaW5jbHVkZSAiZ2VudWNhLmgiCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1cGFyc2UuaCIKKyNpbmNsdWRlICJ0b29sdXRpbC5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAiY3N0cmluZy5oIgorI2luY2x1ZGUgImNtZW1vcnkuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTEVOR1RIT0YoYXJyYXkpIChpbnQzMl90KShzaXplb2YoYXJyYXkpL3NpemVvZigoYXJyYXkpWzBdKSkKKworLyoqIFRoZSBtYXhpbXVtIFVURi0xNiBsZW5ndGggKG51bWJlciBvZiBVQ2hhcnMpIGluIGEgVUNBIGNvbnRyYWN0aW9uLiAqLworc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1VDQV9DT05UUkFDVElPTl9MRU5HVEg9NDsKKworLy8gc2NyaXB0IHJlb3JkZXJpbmcgc3RydWN0dXJlcwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IHJlb3JkZXJDb2RlOworICAgIHVpbnQxNl90IG9mZnNldDsKK30gUmVvcmRlckluZGV4OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgTEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhfTEVOR1RIOworICAgIHVpbnQxNl90KiBMRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWDsKKyAgICB1aW50MTZfdCBMRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX0xFTkdUSDsKKyAgICB1aW50MTZfdCogTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQTsKKyAgICB1aW50MTZfdCBMRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVDsKKyAgICAKKyAgICB1aW50MTZfdCBTQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9MRU5HVEg7CisgICAgUmVvcmRlckluZGV4KiBTQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWDsKKyAgICB1aW50MTZfdCBTQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVDsKKyAgICB1aW50MTZfdCBTQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX0xFTkdUSDsKKyAgICB1aW50MTZfdCogU0NSSVBUX1RPX0xFQURfQllURVNfREFUQTsKKyAgICB1aW50MTZfdCBTQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVDsKK30gTGVhZEJ5dGVDb25zdGFudHM7CisKK2ludCBSZW9yZGVySW5kZXhDb21wYXJlcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVvcmRlckluZGV4Kj4oYSktPnJlb3JkZXJDb2RlIC0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZW9yZGVySW5kZXgqPihiKS0+cmVvcmRlckNvZGU7ICAgIAorfQorCisvKgorICogR2xvYmFsIC0gdmVyYm9zaXR5CisgKi8KK1VCb29sIGJlVmVyYm9zZSA9IEZBTFNFOworCitzdGF0aWMgVVZlcnNpb25JbmZvIFVDQVZlcnNpb247CisKKyNpZiBVQ09ORklHX05PX0NPTExBVElPTgorCisvKiBkdW1teSBVRGF0YUluZm8gY2YuIHVkYXRhLmggKi8KK3N0YXRpYyBVRGF0YUluZm8gZHVtbXlEYXRhSW5mbyA9IHsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgVV9TSVpFT0ZfVUNIQVIsCisgICAgMCwKKworICAgIHsgMCwgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgLyogZHVtbXkgZGF0YUZvcm1hdCAqLworICAgIHsgMCwgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgLyogZHVtbXkgZm9ybWF0VmVyc2lvbiAqLworICAgIHsgMCwgMCwgMCwgMCB9ICAgICAgICAgICAgICAgICAgLyogZHVtbXkgZGF0YVZlcnNpb24gKi8KK307CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdCBVRGF0YUluZm8gdWNhRGF0YUluZm89eworICAgIHNpemVvZihVRGF0YUluZm8pLAorICAgIDAsCisKKyAgICBVX0lTX0JJR19FTkRJQU4sCisgICAgVV9DSEFSU0VUX0ZBTUlMWSwKKyAgICBzaXplb2YoVUNoYXIpLAorICAgIDAsCisKKyAgICB7VUNBX0RBVEFfRk9STUFUXzAsIFVDQV9EQVRBX0ZPUk1BVF8xLCBVQ0FfREFUQV9GT1JNQVRfMiwgVUNBX0RBVEFfRk9STUFUXzN9LCAgICAgLyogZGF0YUZvcm1hdD0iVUNvbCIgICAgICAgICAgICAqLworICAgIC8qIDAzLzI2LzIwMDIgYnVtcGVkIHVwIHZlcnNpb24gc2luY2UgZm9ybWF0IGhhcyBjaGFuZ2VkICovCisgICAgLyogMDkvMTYvMjAwMiBidW1wZWQgdXAgdmVyc2lvbiBzaW5jZSB3ZSB3ZW50IGZyb20gVUNvbEF0dHJpYnV0ZVZhbHVlICovCisgICAgLyogICAgICAgICAgICB0byBpbnQzMl90IGluIFVDb2xPcHRpb25TZXQgKi8KKyAgICAvKiAwNS8xMy8yMDAzIFRoaXMgb25lIGFsc28gdXBkYXRlZCBzaW5jZSB3ZSBhZGRlZCBVQ0EgYW5kIFVDRCB2ZXJzaW9ucyAqLworICAgIC8qICAgICAgICAgICAgdG8gaGVhZGVyICovCisgICAgLyogMDkvMTEvMjAwMyBBZGRpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgZGF0YSBzd2FwcGVyICovCisgICAge1VDQV9GT1JNQVRfVkVSU0lPTl8wLCBVQ0FfRk9STUFUX1ZFUlNJT05fMSwgVUNBX0ZPUk1BVF9WRVJTSU9OXzIsIFVDQV9GT1JNQVRfVkVSU0lPTl8zfSwgICAgICAgICAgICAgICAgIC8qIGZvcm1hdFZlcnNpb24gICAgICAgICAgICAgICAgKi8KKyAgICB7MCwgMCwgMCwgMH0gICAgICAgICAgICAgICAgICAvKiBkYXRhVmVyc2lvbiA9IFVuaWNvZGUgVmVyc2lvbiovCit9OworCitzdGF0aWMgY29uc3QgVURhdGFJbmZvIGludlVjYURhdGFJbmZvPXsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgc2l6ZW9mKFVDaGFyKSwKKyAgICAwLAorCisgICAge0lOVlVDQV9EQVRBX0ZPUk1BVF8wLCBJTlZVQ0FfREFUQV9GT1JNQVRfMSwgSU5WVUNBX0RBVEFfRk9STUFUXzIsIElOVlVDQV9EQVRBX0ZPUk1BVF8zfSwgICAgIC8qIGRhdGFGb3JtYXQ9IkludkMiICAgICAgICAgICAgKi8KKyAgICAvKiAwMy8yNi8yMDAyIGJ1bXBlZCB1cCB2ZXJzaW9uIHNpbmNlIGZvcm1hdCBoYXMgY2hhbmdlZCAqLworICAgIC8qIDA0LzI5LzIwMDMgMi4xIGZvcm1hdCAtIHdlIGhhdmUgYWRkZWQgVUNBIHZlcnNpb24gdG8gaGVhZGVyICovCisgICAge0lOVlVDQV9GT1JNQVRfVkVSU0lPTl8wLCBJTlZVQ0FfRk9STUFUX1ZFUlNJT05fMSwgSU5WVUNBX0ZPUk1BVF9WRVJTSU9OXzIsIElOVlVDQV9GT1JNQVRfVkVSU0lPTl8zfSwgICAgICAgICAgICAgICAgIC8qIGZvcm1hdFZlcnNpb24gICAgICAgICAgICAgICAgKi8KKyAgICB7MCwgMCwgMCwgMH0gICAgICAgICAgICAgICAgICAvKiBkYXRhVmVyc2lvbiA9IFVuaWNvZGUgVmVyc2lvbiovCit9OworCitVQ0FFbGVtZW50cyBsZTsKKworLy8gcmV0dXJucyBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkCitpbnQzMl90IHJlYWRFbGVtZW50KGNoYXIgKipmcm9tLCBjaGFyICp0bywgY2hhciBzZXBhcmF0b3IsIFVFcnJvckNvZGUgKnN0YXR1cykgeworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgaW50MzJfdCBpID0gMDsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgY2hhciBjID0gKipmcm9tOworICAgICAgICBpZihjID09IHNlcGFyYXRvciB8fCAoc2VwYXJhdG9yID09ICcgJyAmJiBjID09ICdcdCcpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnXDAnKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZihjICE9ICcgJykgeworICAgICAgICAgICAgKihidWZmZXIraSsrKSA9IGM7CisgICAgICAgIH0KKyAgICAgICAgKCpmcm9tKSsrOworICAgIH0KKyAgICAoKmZyb20pKys7CisgICAgKihidWZmZXIgKyBpKSA9IDA7CisgICAgLy8qdG8gPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oYnVmZmVyKSsxKTsKKyAgICBzdHJjcHkodG8sIGJ1ZmZlcik7CisgICAgcmV0dXJuIGk7Cit9CisKK2ludDMyX3Qgc2tpcFVudGlsV2hpdGVTcGFjZShjaGFyICoqZnJvbSwgVUVycm9yQ29kZSAqc3RhdHVzKSB7CisgICAgaWYgKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50MzJfdCBjb3VudCA9IDA7CisgICAgd2hpbGUgKCoqZnJvbSAhPSAnICcgJiYgKipmcm9tICE9ICdcdCcgJiYgKipmcm9tICE9ICdcMCcpIHsKKyAgICAgICAgKCpmcm9tKSsrOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludDMyX3Qgc2tpcFdoaXRlU3BhY2UoY2hhciAqKmZyb20sIFVFcnJvckNvZGUgKnN0YXR1cykgeworICAgIGlmIChVX0ZBSUxVUkUoKnN0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludDMyX3QgY291bnQgPSAwOworICAgIHdoaWxlICgqKmZyb20gPT0gJyAnIHx8ICoqZnJvbSA9PSAnXHQnKSB7CisgICAgICAgICgqZnJvbSkrKzsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCit1aW50MzJfdCBnZXRTaW5nbGVDRVZhbHVlKGNoYXIgKnByaW1hcnksIGNoYXIgKnNlY29uZGFyeSwgY2hhciAqdGVydGlhcnksIFVFcnJvckNvZGUgKnN0YXR1cykgeworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdWludDMyX3QgdmFsdWUgPSAwOworICAgIGNoYXIgcHJpbXNhdmUgPSAnXDAnOworICAgIGNoYXIgc2Vjc2F2ZSA9ICdcMCc7CisgICAgY2hhciB0ZXJzYXZlID0gJ1wwJzsKKyAgICBjaGFyICpwcmltZW5kID0gcHJpbWFyeSs0OworICAgIGlmKHN0cmxlbihwcmltYXJ5KSA+IDQpIHsKKyAgICAgICAgcHJpbXNhdmUgPSAqcHJpbWVuZDsKKyAgICAgICAgKnByaW1lbmQgPSAnXDAnOworICAgIH0KKyAgICBjaGFyICpzZWNlbmQgPSBzZWNvbmRhcnkrMjsKKyAgICBpZihzdHJsZW4oc2Vjb25kYXJ5KSA+IDIpIHsKKyAgICAgICAgc2Vjc2F2ZSA9ICpzZWNlbmQ7CisgICAgICAgICpzZWNlbmQgPSAnXDAnOworICAgIH0KKyAgICBjaGFyICp0ZXJlbmQgPSB0ZXJ0aWFyeSsyOworICAgIGlmKHN0cmxlbih0ZXJ0aWFyeSkgPiAyKSB7CisgICAgICAgIHRlcnNhdmUgPSAqdGVyZW5kOworICAgICAgICAqdGVyZW5kID0gJ1wwJzsKKyAgICB9CisgICAgdWludDMyX3QgcHJpbXZhbHVlID0gKHVpbnQzMl90KSgoKnByaW1hcnkhPSdcMCcpP3N0cnRvdWwocHJpbWFyeSwgJnByaW1lbmQsIDE2KTowKTsKKyAgICB1aW50MzJfdCBzZWN2YWx1ZSA9ICh1aW50MzJfdCkoKCpzZWNvbmRhcnkhPSdcMCcpP3N0cnRvdWwoc2Vjb25kYXJ5LCAmc2VjZW5kLCAxNik6MCk7CisgICAgdWludDMyX3QgdGVydmFsdWUgPSAodWludDMyX3QpKCgqdGVydGlhcnkhPSdcMCcpP3N0cnRvdWwodGVydGlhcnksICZ0ZXJlbmQsIDE2KTowKTsKKyAgICBpZihwcmltdmFsdWUgPD0gMHhGRikgeworICAgICAgcHJpbXZhbHVlIDw8PSA4OworICAgIH0KKworICAgIHZhbHVlID0gKChwcmltdmFsdWU8PFVDT0xfUFJJTUFSWU9SREVSU0hJRlQpJlVDT0xfUFJJTUFSWU9SREVSTUFTSyl8CisgICAgICAgICgoc2VjdmFsdWU8PFVDT0xfU0VDT05EQVJZT1JERVJTSElGVCkmVUNPTF9TRUNPTkRBUllPUkRFUk1BU0spfAorICAgICAgICAodGVydmFsdWUmVUNPTF9URVJUSUFSWU9SREVSTUFTSyk7CisKKyAgICBpZihwcmltc2F2ZSE9J1wwJykgeworICAgICAgICAqcHJpbWVuZCA9IHByaW1zYXZlOworICAgIH0KKyAgICBpZihzZWNzYXZlIT0nXDAnKSB7CisgICAgICAgICpzZWNlbmQgPSBzZWNzYXZlOworICAgIH0KKyAgICBpZih0ZXJzYXZlIT0nXDAnKSB7CisgICAgICAgICp0ZXJlbmQgPSB0ZXJzYXZlOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBpbnZlcnNlVGFibGVbMHhGRkZGXVszXTsKK3N0YXRpYyB1aW50MzJfdCBpbnZlcnNlUG9zID0gMDsKK3N0YXRpYyBVQ2hhciBzdHJpbmdDb250aW51ZVsweEZGRkZdOworc3RhdGljIHVpbnQzMl90IHNDb250UG9zID0gMDsKKworc3RhdGljIHZvaWQgYWRkTmV3SW52ZXJzZShVQ0FFbGVtZW50cyAqZWxlbWVudCwgVUVycm9yQ29kZSAqc3RhdHVzKSB7CisgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZihiZVZlcmJvc2UgJiYgaXNDb250aW51YXRpb24oZWxlbWVudC0+Q0VzWzFdKSkgeworICAgIC8vcHJpbnRmKCIrIik7CisgIH0KKyAgaW52ZXJzZVBvcysrOworICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMF0gPSBlbGVtZW50LT5DRXNbMF07CisgIGlmKGVsZW1lbnQtPm5vT2ZDRXMgPiAxICYmIGlzQ29udGludWF0aW9uKGVsZW1lbnQtPkNFc1sxXSkpIHsKKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMV0gPSBlbGVtZW50LT5DRXNbMV07CisgIH0gZWxzZSB7CisgICAgaW52ZXJzZVRhYmxlW2ludmVyc2VQb3NdWzFdID0gMDsKKyAgfQorICBpZihlbGVtZW50LT5jU2l6ZSA8IDIpIHsKKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMl0gPSBlbGVtZW50LT5jUG9pbnRzWzBdOworICB9IGVsc2UgeyAvKiBhZGQgYSBuZXcgc3RvcmUgb2YgY3J1ZnQgKi8KKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMl0gPSAoKGVsZW1lbnQtPmNTaXplKzEpIDw8IFVDT0xfSU5WX1NISUZUVkFMVUUpIHwgc0NvbnRQb3M7CisgICAgbWVtY3B5KHN0cmluZ0NvbnRpbnVlK3NDb250UG9zLCBlbGVtZW50LT5jUG9pbnRzLCBlbGVtZW50LT5jU2l6ZSpzaXplb2YoVUNoYXIpKTsKKyAgICBzQ29udFBvcyArPSBlbGVtZW50LT5jU2l6ZSsxOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydEludmVyc2UoVUNBRWxlbWVudHMgKmVsZW1lbnQsIHVpbnQzMl90IHBvc2l0aW9uLCBVRXJyb3JDb2RlICpzdGF0dXMpIHsKKyAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoYmVWZXJib3NlICYmIGlzQ29udGludWF0aW9uKGVsZW1lbnQtPkNFc1sxXSkpIHsKKyAgICAvL3ByaW50ZigiKyIpOworICB9CisgIGlmKHBvc2l0aW9uIDw9IGludmVyc2VQb3MpIHsKKyAgICAvKm1vdmUgc3R1ZmYgYXJvdW5kICovCisgICAgdWludDMyX3QgYW1vdW50VG9Nb3ZlID0gKGludmVyc2VQb3MgLSBwb3NpdGlvbisxKSpzaXplb2YoaW52ZXJzZVRhYmxlWzBdKTsKKyAgICB1cHJ2X21lbW1vdmUoaW52ZXJzZVRhYmxlW3Bvc2l0aW9uKzFdLCBpbnZlcnNlVGFibGVbcG9zaXRpb25dLCBhbW91bnRUb01vdmUpOworICB9CisgIGludmVyc2VUYWJsZVtwb3NpdGlvbl1bMF0gPSBlbGVtZW50LT5DRXNbMF07CisgIGlmKGVsZW1lbnQtPm5vT2ZDRXMgPiAxICYmIGlzQ29udGludWF0aW9uKGVsZW1lbnQtPkNFc1sxXSkpIHsKKyAgICBpbnZlcnNlVGFibGVbcG9zaXRpb25dWzFdID0gZWxlbWVudC0+Q0VzWzFdOworICB9IGVsc2UgeworICAgIGludmVyc2VUYWJsZVtwb3NpdGlvbl1bMV0gPSAwOworICB9CisgIGlmKGVsZW1lbnQtPmNTaXplIDwgMikgeworICAgIGludmVyc2VUYWJsZVtwb3NpdGlvbl1bMl0gPSBlbGVtZW50LT5jUG9pbnRzWzBdOworICB9IGVsc2UgeyAvKiBhZGQgYSBuZXcgc3RvcmUgb2YgY3J1ZnQgKi8KKyAgICBpbnZlcnNlVGFibGVbcG9zaXRpb25dWzJdID0gKChlbGVtZW50LT5jU2l6ZSsxKSA8PCBVQ09MX0lOVl9TSElGVFZBTFVFKSB8IHNDb250UG9zOworICAgIG1lbWNweShzdHJpbmdDb250aW51ZStzQ29udFBvcywgZWxlbWVudC0+Y1BvaW50cywgZWxlbWVudC0+Y1NpemUqc2l6ZW9mKFVDaGFyKSk7CisgICAgc0NvbnRQb3MgKz0gZWxlbWVudC0+Y1NpemUrMTsKKyAgfQorICBpbnZlcnNlUG9zKys7Cit9CisKK3N0YXRpYyB2b2lkIGFkZFRvRXhpc3RpbmdJbnZlcnNlKFVDQUVsZW1lbnRzICplbGVtZW50LCB1aW50MzJfdCBwb3NpdGlvbiwgVUVycm9yQ29kZSAqc3RhdHVzKSB7CisKKyAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgICAgIGlmKChpbnZlcnNlVGFibGVbcG9zaXRpb25dWzJdICYgVUNPTF9JTlZfU0laRU1BU0spID09IDApIHsgLyogc2luZ2xlIGVsZW1lbnQsIGhhdmUgdG8gbWFrZSBuZXcgZXh0ZW5zaW9uIHBsYWNlIGFuZCBwdXQgYm90aCBndXlzIHRoZXJlICovCisgICAgICAgIHN0cmluZ0NvbnRpbnVlW3NDb250UG9zXSA9IChVQ2hhcilpbnZlcnNlVGFibGVbcG9zaXRpb25dWzJdOworICAgICAgICBpbnZlcnNlVGFibGVbcG9zaXRpb25dWzJdID0gKChlbGVtZW50LT5jU2l6ZSszKSA8PCBVQ09MX0lOVl9TSElGVFZBTFVFKSB8IHNDb250UG9zOworICAgICAgICBzQ29udFBvcysrOworICAgICAgICBzdHJpbmdDb250aW51ZVtzQ29udFBvcysrXSA9IDB4RkZGRjsKKyAgICAgICAgbWVtY3B5KHN0cmluZ0NvbnRpbnVlK3NDb250UG9zLCBlbGVtZW50LT5jUG9pbnRzLCBlbGVtZW50LT5jU2l6ZSpzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgc0NvbnRQb3MgKz0gZWxlbWVudC0+Y1NpemU7CisgICAgICAgIHN0cmluZ0NvbnRpbnVlW3NDb250UG9zKytdID0gMHhGRkZFOworICAgICAgfSBlbHNlIHsgLyogYWRkaW5nIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGNvbnRpbnVpbmcgdGFibGUgKi8KKyAgICAgICAgdWludDMyX3QgY29udEluZGV4ID0gaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXVsyXSAmIFVDT0xfSU5WX09GRlNFVE1BU0s7CisgICAgICAgIHVpbnQzMl90IGNvbnRTaXplID0gKGludmVyc2VUYWJsZVtwb3NpdGlvbl1bMl0gJiBVQ09MX0lOVl9TSVpFTUFTSykgPj4gVUNPTF9JTlZfU0hJRlRWQUxVRTsKKworICAgICAgICBpZihjb250SW5kZXgrY29udFNpemUgPCBzQ29udFBvcykgeworICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICIuIiwgc0NvbnRQb3MsIGNvbnRJbmRleCtjb250U2l6ZSk7Ki8KKyAgICAgICAgICBtZW1jcHkoc3RyaW5nQ29udGludWUrY29udEluZGV4K2NvbnRTaXplK2VsZW1lbnQtPmNTaXplKzEsIHN0cmluZ0NvbnRpbnVlK2NvbnRJbmRleCtjb250U2l6ZSwgKGVsZW1lbnQtPmNTaXplKzEpKnNpemVvZihVQ2hhcikpOworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nQ29udGludWVbY29udEluZGV4K2NvbnRTaXplLTFdID0gMHhGRkZGOworICAgICAgICBtZW1jcHkoc3RyaW5nQ29udGludWUrY29udEluZGV4K2NvbnRTaXplLCBlbGVtZW50LT5jUG9pbnRzLCBlbGVtZW50LT5jU2l6ZSpzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgc0NvbnRQb3MgKz0gZWxlbWVudC0+Y1NpemUrMTsKKyAgICAgICAgc3RyaW5nQ29udGludWVbY29udEluZGV4K2NvbnRTaXplK2VsZW1lbnQtPmNTaXplXSA9IDB4RkZGRTsKKworICAgICAgICBpbnZlcnNlVGFibGVbcG9zaXRpb25dWzJdID0gKChjb250U2l6ZStlbGVtZW50LT5jU2l6ZSsxKSA8PCBVQ09MX0lOVl9TSElGVFZBTFVFKSB8IGNvbnRJbmRleDsKKyAgICAgIH0KK30KKworLyogCisgKiBUYWtlcyB0d28gQ0VzIChsZWFkIGFuZCBjb250aW51YXRpb24pIGFuZCAKKyAqIGNvbXBhcmVzIHRoZW0gYXMgQ0VzIHNob3VsZCBiZSBjb21wYXJlZDoKKyAqIHByaW1hcnkgdnMuIHByaW1hcnksIHNlY29uZGFyeSB2cy4gc2Vjb25kYXJ5CisgKiB0ZXJ0aWFyeSB2cy4gdGVydGlhcnkKKyAqLworc3RhdGljIGludDMyX3QgY29tcGFyZUNFcyh1aW50MzJfdCAqc291cmNlLCB1aW50MzJfdCAqdGFyZ2V0KSB7CisgIHVpbnQzMl90IHMxID0gc291cmNlWzBdLCBzMiwgdDEgPSB0YXJnZXRbMF0sIHQyOworICBpZihpc0NvbnRpbnVhdGlvbihzb3VyY2VbMV0pKSB7CisgICAgczIgPSBzb3VyY2VbMV07CisgIH0gZWxzZSB7CisgICAgczIgPSAwOworICB9CisgIGlmKGlzQ29udGludWF0aW9uKHRhcmdldFsxXSkpIHsKKyAgICB0MiA9IHRhcmdldFsxXTsKKyAgfSBlbHNlIHsKKyAgICB0MiA9IDA7CisgIH0KKyAgCisgIHVpbnQzMl90IHMgPSAwLCB0ID0gMDsKKyAgaWYoczEgPT0gdDEgJiYgczIgPT0gdDIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzID0gKHMxICYgMHhGRkZGMDAwMCl8KChzMiAmIDB4RkZGRjAwMDApPj4xNik7IAorICB0ID0gKHQxICYgMHhGRkZGMDAwMCl8KCh0MiAmIDB4RkZGRjAwMDApPj4xNik7IAorICBpZihzIDwgdCkgeworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmKHMgPiB0KSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcyA9IChzMSAmIDB4MDAwMEZGMDApIHwgKHMyICYgMHgwMDAwRkYwMCk+Pjg7CisgICAgdCA9ICh0MSAmIDB4MDAwMEZGMDApIHwgKHQyICYgMHgwMDAwRkYwMCk+Pjg7CisgICAgaWYocyA8IHQpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYocyA+IHQpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICBzID0gKHMxICYgMHgwMDAwMDBGRik8PDggfCAoczIgJiAweDAwMDAwMEZGKTsKKyAgICAgIHQgPSAodDEgJiAweDAwMDAwMEZGKTw8OCB8ICh0MiAmIDB4MDAwMDAwRkYpOworICAgICAgaWYocyA8IHQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB1aW50MzJfdCBhZGRUb0ludmVyc2UoVUNBRWxlbWVudHMgKmVsZW1lbnQsIFVFcnJvckNvZGUgKnN0YXR1cykgeworICB1aW50MzJfdCBwb3NpdGlvbiA9IGludmVyc2VQb3M7CisgIHVpbnQzMl90IHNhdmVFbGVtZW50ID0gZWxlbWVudC0+Q0VzWzBdOworICBpbnQzMl90IGNvbXBSZXN1bHQgPSAwOworICBlbGVtZW50LT5DRXNbMF0gJj0gMHhGRkZGRkYzRjsKKyAgaWYoZWxlbWVudC0+bm9PZkNFcyA9PSAxKSB7CisgICAgZWxlbWVudC0+Q0VzWzFdID0gMDsKKyAgfQorICBpZihpbnZlcnNlUG9zID09IDApIHsKKyAgICBpbnZlcnNlVGFibGVbMF1bMF0gPSBpbnZlcnNlVGFibGVbMF1bMV0gPSBpbnZlcnNlVGFibGVbMF1bMl0gPSAwOworICAgIGFkZE5ld0ludmVyc2UoZWxlbWVudCwgc3RhdHVzKTsKKyAgfSBlbHNlIGlmKGNvbXBhcmVDRXMoaW52ZXJzZVRhYmxlW2ludmVyc2VQb3NdLCBlbGVtZW50LT5DRXMpID4gMCkgeworICAgIHdoaWxlKChjb21wUmVzdWx0ID0gY29tcGFyZUNFcyhpbnZlcnNlVGFibGVbLS1wb3NpdGlvbl0sIGVsZW1lbnQtPkNFcykpID4gMCk7CisgICAgaWYoYmVWZXJib3NlKSB7IHByaW50ZigicDoldSAiLCAoaW50KXBvc2l0aW9uKTsgfQorICAgIGlmKGNvbXBSZXN1bHQgPT0gMCkgeworICAgICAgYWRkVG9FeGlzdGluZ0ludmVyc2UoZWxlbWVudCwgcG9zaXRpb24sIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluc2VydEludmVyc2UoZWxlbWVudCwgcG9zaXRpb24rMSwgc3RhdHVzKTsKKyAgICB9CisgIH0gZWxzZSBpZihjb21wYXJlQ0VzKGludmVyc2VUYWJsZVtpbnZlcnNlUG9zXSwgZWxlbWVudC0+Q0VzKSA9PSAwKSB7CisgICAgYWRkVG9FeGlzdGluZ0ludmVyc2UoZWxlbWVudCwgaW52ZXJzZVBvcywgc3RhdHVzKTsKKyAgfSBlbHNlIHsKKyAgICBhZGROZXdJbnZlcnNlKGVsZW1lbnQsIHN0YXR1cyk7CisgIH0KKyAgZWxlbWVudC0+Q0VzWzBdID0gc2F2ZUVsZW1lbnQ7CisgIGlmKGJlVmVyYm9zZSkgeyBwcmludGYoIisiKTsgfQorICByZXR1cm4gaW52ZXJzZVBvczsKK30KKworc3RhdGljIEludmVyc2VVQ0FUYWJsZUhlYWRlciAqYXNzZW1ibGVJbnZlcnNlVGFibGUoVUVycm9yQ29kZSAqc3RhdHVzKQoreworICBJbnZlcnNlVUNBVGFibGVIZWFkZXIgKnJlc3VsdCA9IE5VTEw7CisgIHVpbnQzMl90IGhlYWRlckJ5dGVTaXplID0gcGFkZGVkc2l6ZShzaXplb2YoSW52ZXJzZVVDQVRhYmxlSGVhZGVyKSk7CisgIHVpbnQzMl90IGludmVyc2VUYWJsZUJ5dGVTaXplID0gKGludmVyc2VQb3MrMikqc2l6ZW9mKHVpbnQzMl90KSozOworICB1aW50MzJfdCBjb250c0J5dGVTaXplID0gc0NvbnRQb3MgKiBzaXplb2YoVUNoYXIpOworICB1aW50MzJfdCBpID0gMDsKKworICByZXN1bHQgPSAoSW52ZXJzZVVDQVRhYmxlSGVhZGVyICopdXBydl9tYWxsb2MoaGVhZGVyQnl0ZVNpemUgKyBpbnZlcnNlVGFibGVCeXRlU2l6ZSArIGNvbnRzQnl0ZVNpemUpOworICB1cHJ2X21lbXNldChyZXN1bHQsIDAsIGhlYWRlckJ5dGVTaXplICsgaW52ZXJzZVRhYmxlQnl0ZVNpemUgKyBjb250c0J5dGVTaXplKTsKKyAgaWYocmVzdWx0ICE9IE5VTEwpIHsKKyAgICByZXN1bHQtPmJ5dGVTaXplID0gaGVhZGVyQnl0ZVNpemUgKyBpbnZlcnNlVGFibGVCeXRlU2l6ZSArIGNvbnRzQnl0ZVNpemU7CisKKyAgICBpbnZlcnNlUG9zKys7CisgICAgaW52ZXJzZVRhYmxlW2ludmVyc2VQb3NdWzBdID0gMHhGRkZGRkZGRjsKKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMV0gPSAweEZGRkZGRkZGOworICAgIGludmVyc2VUYWJsZVtpbnZlcnNlUG9zXVsyXSA9IDB4MDAwMEZGRkY7CisgICAgaW52ZXJzZVBvcysrOworCisgICAgZm9yKGkgPSAyOyBpPGludmVyc2VQb3M7IGkrKykgeworICAgICAgaWYoY29tcGFyZUNFcyhpbnZlcnNlVGFibGVbaS0xXSwgaW52ZXJzZVRhYmxlW2ldKSA+IDApIHsgCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgYXQgJWk6ICUwOFggJiAlMDhYXG4iLCAoaW50KWksIChpbnQpaW52ZXJzZVRhYmxlW2ktMV1bMF0sIChpbnQpaW52ZXJzZVRhYmxlW2ldWzBdKTsKKyAgICAgIH0gZWxzZSBpZihpbnZlcnNlVGFibGVbaS0xXVswXSA9PSBpbnZlcnNlVGFibGVbaV1bMF0gJiYgIShpbnZlcnNlVGFibGVbaS0xXVsxXSA8IGludmVyc2VUYWJsZVtpXVsxXSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb250aW51YXRpb24gZXJyb3IgYXQgJWk6ICUwOFggJTA4WCAmICUwOFggJTA4WFxuIiwgKGludClpLCAoaW50KWludmVyc2VUYWJsZVtpLTFdWzBdLCAoaW50KWludmVyc2VUYWJsZVtpLTFdWzFdLCAoaW50KWludmVyc2VUYWJsZVtpXVswXSwgKGludClpbnZlcnNlVGFibGVbaV1bMV0pOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdC0+dGFibGVTaXplID0gaW52ZXJzZVBvczsKKyAgICByZXN1bHQtPmNvbnRzU2l6ZSA9IHNDb250UG9zOworCisgICAgcmVzdWx0LT50YWJsZSA9IGhlYWRlckJ5dGVTaXplOworICAgIHJlc3VsdC0+Y29udHMgPSBoZWFkZXJCeXRlU2l6ZSArIGludmVyc2VUYWJsZUJ5dGVTaXplOworCisgICAgbWVtY3B5KCh1aW50OF90ICopcmVzdWx0ICsgcmVzdWx0LT50YWJsZSwgaW52ZXJzZVRhYmxlLCBpbnZlcnNlVGFibGVCeXRlU2l6ZSk7CisgICAgbWVtY3B5KCh1aW50OF90ICopcmVzdWx0ICsgcmVzdWx0LT5jb250cywgc3RyaW5nQ29udGludWUsIGNvbnRzQnl0ZVNpemUpOworCisgIH0gZWxzZSB7CisgICAgKnN0YXR1cyA9IFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmVzdWx0OyAKK30KKworCitzdGF0aWMgdm9pZCB3cml0ZU91dEludmVyc2VEYXRhKEludmVyc2VVQ0FUYWJsZUhlYWRlciAqZGF0YSwgCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREaXIsIAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29weXJpZ2h0LAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKQoreworICAgIFVOZXdEYXRhTWVtb3J5ICpwRGF0YTsKKyAgICAKKyAgICBsb25nIGRhdGFMZW5ndGg7CisKKyAgICBVRGF0YUluZm8gaW52VWNhSW5mbzsKKyAgICB1cHJ2X21lbWNweSgmaW52VWNhSW5mbywgJmludlVjYURhdGFJbmZvLCBzaXplb2YoVURhdGFJbmZvKSk7CisgICAgdV9nZXRVbmljb2RlVmVyc2lvbihpbnZVY2FJbmZvLmRhdGFWZXJzaW9uKTsKKworICAgIHBEYXRhPXVkYXRhX2NyZWF0ZShvdXRwdXREaXIsIElOVkNfREFUQV9UWVBFLCBJTlZDX0RBVEFfTkFNRSwgJmludlVjYUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvcHlyaWdodCwgc3RhdHVzKTsKKworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB1bmFibGUgdG8gY3JlYXRlICVzIklOVkNfREFUQV9OQU1FIiwgZXJyb3IgJXNcbiIsIG91dHB1dERpciwgdV9lcnJvck5hbWUoKnN0YXR1cykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUgKi8KKyAgICBpZiAoYmVWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiV3JpdGluZyBvdXQgaW52ZXJzZSBVQ0EgdGFibGU6ICVzJWMlcy4lc1xuIiwgb3V0cHV0RGlyLCBVX0ZJTEVfU0VQX0NIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQ19EQVRBX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQ19EQVRBX1RZUEUpOworICAgIH0KKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBkYXRhLCBkYXRhLT5ieXRlU2l6ZSk7CisKKyAgICAvKiBmaW5pc2ggdXAgKi8KKyAgICBkYXRhTGVuZ3RoPXVkYXRhX2ZpbmlzaChwRGF0YSwgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogZXJyb3IgJWQgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGVcbiIsICpzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0aWMgaW50MzJfdCBoZXgybnVtKGNoYXIgaGV4KSB7CisgICAgaWYoaGV4Pj0nMCcgJiYgaGV4IDw9JzknKSB7CisgICAgICAgIHJldHVybiBoZXgtJzAnOworICAgIH0gZWxzZSBpZihoZXg+PSdhJyAmJiBoZXg8PSdmJykgeworICAgICAgICByZXR1cm4gaGV4LSdhJysxMDsKKyAgICB9IGVsc2UgaWYoaGV4Pj0nQScgJiYgaGV4PD0nRicpIHsKKyAgICAgICAgcmV0dXJuIGhleC0nQScrMTA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvLyBzdGF0aWMgY2hhciogQ0hBUkFDVEVSX0NBVEVHT1JZX1JFT1JERVJfQ09ERVNbXSA9IHsKKy8vICAgICAiWnMiLCAiTmQiLCAiU2MiCisvLyB9OworLy8gc3RhdGljIGNvbnN0IHVpbnQxNl90IENIQVJBQ1RFUl9DQVRFR09SWV9SRU9SREVSX0NPREVfT0ZGU0VUID0gMHgxMDAwOworLy8gc3RhdGljIHVpbnQxNl90IENIQVJBQ1RFUl9DQVRFR09SWV9SRU9SREVSX0NPREVTX1ZBTFVFW10gPSB7CisvLyAgICAgVV9TUEFDRV9TRVBBUkFUT1IgKyBDSEFSQUNURVJfQ0FURUdPUllfUkVPUkRFUl9DT0RFX09GRlNFVCwKKy8vICAgICBVX0RFQ0lNQUxfRElHSVRfTlVNQkVSICsgQ0hBUkFDVEVSX0NBVEVHT1JZX1JFT1JERVJfQ09ERV9PRkZTRVQsIAorLy8gICAgIFVfQ1VSUkVOQ1lfU1lNQk9MICsgQ0hBUkFDVEVSX0NBVEVHT1JZX1JFT1JERVJfQ09ERV9PRkZTRVQKKy8vIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50MzJfdCBjb2RlOworfSBzcGVjaWFsUmVvcmRlclRva2Vuc1tdID0geworICAgIHsgIlRFUk1JTkFUT1IiLCAtMiB9LCAgLy8gLTIgbWVhbnMgImlnbm9yZSIKKyAgICB7ICJMRVZFTC1TRVBBUkFUT1IiLCAtMiB9LAorICAgIHsgIkZJRUxELVNFUEFSQVRPUiIsIC0yIH0sCisgICAgeyAiQ09NUFJFU1MiLCAtMiB9LCAgLy8gVE9ETzogV2Ugc2hvdWxkIHBhcnNlL3N0b3JlIHdoaWNoIGxlYWQgYnl0ZXMgYXJlIGNvbXByZXNzaWJsZTsgdGhlcmUgaXMgYSB0aWNrZXQgZm9yIHRoYXQuCisgICAgeyAiUFVOQ1RVQVRJT04iLCBVQ09MX1JFT1JERVJfQ09ERV9QVU5DVFVBVElPTiB9LAorICAgIHsgIklNUExJQ0lUIiwgVVNDUklQVF9IQU4gfSwgIC8vIEltcGxpY2l0IHdlaWdodHMgYXJlIHVzdWFsbHkgZm9yIEhhbiBjaGFyYWN0ZXJzLiBIYW4gJiB1bmFzc2lnbmVkIHNoYXJlIGEgbGVhZCBieXRlLgorICAgIHsgIlRSQUlMSU5HIiwgLTIgfSwgIC8vIFdlIGRvIG5vdCByZW9yZGVyIHRyYWlsaW5nIHdlaWdodHMgKHRob3NlIGFmdGVyIGltcGxpY2l0cykuCisgICAgeyAiU1BFQ0lBTCIsIC0yIH0gIC8vIFdlIG11c3QgbmV2ZXIgcmVvcmRlciBpbnRlcm5hbCwgc3BlY2lhbCBDRSBsZWFkIGJ5dGVzLgorfTsKKworaW50MzJfdCBnZXRSZW9yZGVyQ29kZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgaW50MzJfdCBjb2RlID0gdWNvbF9maW5kUmVvcmRlcmluZ0VudHJ5KG5hbWUpOworICAgIGlmIChjb2RlID49IDApIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorICAgIGNvZGUgPSB1X2dldFByb3BlcnR5VmFsdWVFbnVtKFVDSEFSX1NDUklQVCwgbmFtZSk7CisgICAgaWYgKGNvZGUgPj0gMCkgeworICAgICAgICByZXR1cm4gY29kZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgTEVOR1RIT0Yoc3BlY2lhbFJlb3JkZXJUb2tlbnMpOyArK2kpIHsKKyAgICAgICAgaWYgKDAgPT0gc3RyY21wKG5hbWUsIHNwZWNpYWxSZW9yZGVyVG9rZW5zW2ldLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gc3BlY2lhbFJlb3JkZXJUb2tlbnNbaV0uY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7ICAvLyBTYW1lIGFzIFVDSEFSX0lOVkFMSURfQ09ERSBvciBVU0NSSVBUX0lOVkFMSURfQ09ERS4KK30KKworVUNBRWxlbWVudHMgKnJlYWRBbkVsZW1lbnQoRklMRSAqZGF0YSwgdGVtcFVDQVRhYmxlICp0LCBVQ0FDb25zdGFudHMgKmNvbnN0cywgTGVhZEJ5dGVDb25zdGFudHMgKmxlYWRCeXRlQ29uc3RhbnRzLCBVRXJyb3JDb2RlICpzdGF0dXMpIHsKKyAgICBzdGF0aWMgaW50IGl0ZW1zVG9EYXRhQmxvY2sgPSAwOworICAgIHN0YXRpYyBpbnQgc2NyaXB0RGF0YVdyaXR0ZW4gPSAwOworICAgIGNoYXIgYnVmZmVyWzIwNDhdLCBwcmltYXJ5WzEwMF0sIHNlY29uZGFyeVsxMDBdLCB0ZXJ0aWFyeVsxMDBdOworICAgIFVDaGFyIHVCdWZmZXJbMjA0OF07CisgICAgVUNoYXIgdUJ1ZmZlcjJbMjA0OF07CisgICAgVUNoYXIgbGVhZEJ5dGVbMTAwXSwgc2NyaXB0Q29kZVsxMDBdOworICAgIGludDMyX3QgaSA9IDA7CisgICAgdW5zaWduZWQgaW50IHRoZVZhbHVlOworICAgIGNoYXIgKnBvaW50ZXIgPSBOVUxMOworICAgIGNoYXIgKmNvbW1lbnRTdGFydCA9IE5VTEw7CisgICAgY2hhciAqc3RhcnRDb2RlUG9pbnQgPSBOVUxMOworICAgIGNoYXIgKmVuZENvZGVQb2ludCA9IE5VTEw7CisgICAgY2hhciAqcmVzdWx0ID0gZmdldHMoYnVmZmVyLCAyMDQ4LCBkYXRhKTsKKyAgICBpbnQzMl90IGJ1ZmxlbiA9IChpbnQzMl90KXVwcnZfc3RybGVuKGJ1ZmZlcik7CisgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcHJpbWFyeSA9ICpzZWNvbmRhcnkgPSAqdGVydGlhcnkgPSAnXDAnOworICAgICpsZWFkQnl0ZSA9ICpzY3JpcHRDb2RlID0gJ1wwJzsKKyAgICBpZihyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBpZihmZW9mKGRhdGEpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZW1wdHkgbGluZSBidXQgbm8gRU9GIVxuIik7CisgICAgICAgICAgICAqc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlKGJ1Zmxlbj4wICYmIChidWZmZXJbYnVmbGVuLTFdID09ICdccicgfHwgYnVmZmVyW2J1Zmxlbi0xXSA9PSAnXG4nKSkgeworICAgICAgYnVmZmVyWy0tYnVmbGVuXSA9IDA7CisgICAgfQorCisgICAgaWYoYnVmZmVyWzBdID09IDAgfHwgYnVmZmVyWzBdID09ICcjJykgeworICAgICAgICByZXR1cm4gTlVMTDsgLy8ganVzdCBhIGNvbW1lbnQsIHNraXAgd2hvbGUgbGluZQorICAgIH0KKworICAgIFVDQUVsZW1lbnRzICplbGVtZW50ID0gJmxlOworICAgIG1lbXNldChlbGVtZW50LCAwLCBzaXplb2YoKmVsZW1lbnQpKTsKKworICAgIGVudW0gQWN0aW9uVHlwZSB7CisgICAgICBSRUFEQ0UsCisgICAgICBSRUFESEVYMSwKKyAgICAgIFJFQURIRVgyLAorICAgICAgUkVBRFVDQVZFUlNJT04sCisgICAgICBSRUFETEVBREJZVEVUT1NDUklQVFMsCisgICAgICBSRUFEU0NSSVBUVE9MRUFEQllURVMsCisgICAgICBJR05PUkUsCisgICAgfTsKKworICAgIC8vIERpcmVjdGl2ZXMuCisgICAgaWYoYnVmZmVyWzBdID09ICdbJykgeworICAgICAgdWludDMyX3QgY250ID0gMDsKKyAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjaGFyIG5hbWVbMTI4XTsKKyAgICAgICAgdWludDMyX3QgKndoYXQ7CisgICAgICAgIEFjdGlvblR5cGUgd2hhdF90b19kbzsKKyAgICAgIH0gdnRbXSAgPSB7IHsiW2ZpcnN0IHRlcnRpYXJ5IGlnbm9yYWJsZSIsICBjb25zdHMtPlVDQV9GSVJTVF9URVJUSUFSWV9JR05PUkFCTEUsICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbbGFzdCB0ZXJ0aWFyeSBpZ25vcmFibGUiLCAgIGNvbnN0cy0+VUNBX0xBU1RfVEVSVElBUllfSUdOT1JBQkxFLCAgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltmaXJzdCBzZWNvbmRhcnkgaWdub3JhYmxlIiwgY29uc3RzLT5VQ0FfRklSU1RfU0VDT05EQVJZX0lHTk9SQUJMRSwgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2xhc3Qgc2Vjb25kYXJ5IGlnbm9yYWJsZSIsICBjb25zdHMtPlVDQV9MQVNUX1NFQ09OREFSWV9JR05PUkFCTEUsICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbZmlyc3QgcHJpbWFyeSBpZ25vcmFibGUiLCAgIGNvbnN0cy0+VUNBX0ZJUlNUX1BSSU1BUllfSUdOT1JBQkxFLCAgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltsYXN0IHByaW1hcnkgaWdub3JhYmxlIiwgICAgY29uc3RzLT5VQ0FfTEFTVF9QUklNQVJZX0lHTk9SQUJMRSwgICAgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpcnN0IHZhcmlhYmxlIiwgICAgICAgICAgICBjb25zdHMtPlVDQV9GSVJTVF9WQVJJQUJMRSwgICAgICAgICAgICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbbGFzdCB2YXJpYWJsZSIsICAgICAgICAgICAgIGNvbnN0cy0+VUNBX0xBU1RfVkFSSUFCTEUsICAgICAgICAgICAgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltmaXJzdCByZWd1bGFyIiwgICAgICAgICAgICAgY29uc3RzLT5VQ0FfRklSU1RfTk9OX1ZBUklBQkxFLCAgICAgICAgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2xhc3QgcmVndWxhciIsICAgICAgICAgICAgICBjb25zdHMtPlVDQV9MQVNUX05PTl9WQVJJQUJMRSwgICAgICAgICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbZmlyc3QgaW1wbGljaXQiLCAgICAgICAgICAgIGNvbnN0cy0+VUNBX0ZJUlNUX0lNUExJQ0lULCAgICAgICAgICAgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltsYXN0IGltcGxpY2l0IiwgICAgICAgICAgICAgY29uc3RzLT5VQ0FfTEFTVF9JTVBMSUNJVCwgICAgICAgICAgICAgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpcnN0IHRyYWlsaW5nIiwgICAgICAgICAgICBjb25zdHMtPlVDQV9GSVJTVF9UUkFJTElORywgICAgICAgICAgICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbbGFzdCB0cmFpbGluZyIsICAgICAgICAgICAgIGNvbnN0cy0+VUNBX0xBU1RfVFJBSUxJTkcsICAgICAgICAgICAgIFJFQURDRX0sCisKKyAgICAgICAgICAgICAgICAgIHsiW2ZpeGVkIHRvcCIsICAgICAgICAgICAgICAgICAgICAmY29uc3RzLT5VQ0FfUFJJTUFSWV9UT1BfTUlOLCAgICAgICBSRUFESEVYMX0sCisgICAgICAgICAgICAgICAgICB7IltmaXhlZCBmaXJzdCBpbXBsaWNpdCBieXRlIiwgICAgJmNvbnN0cy0+VUNBX1BSSU1BUllfSU1QTElDSVRfTUlOLCAgUkVBREhFWDF9LAorICAgICAgICAgICAgICAgICAgeyJbZml4ZWQgbGFzdCBpbXBsaWNpdCBieXRlIiwgICAgICZjb25zdHMtPlVDQV9QUklNQVJZX0lNUExJQ0lUX01BWCwgIFJFQURIRVgxfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpeGVkIGZpcnN0IHRyYWlsIGJ5dGUiLCAgICAgICAmY29uc3RzLT5VQ0FfUFJJTUFSWV9UUkFJTElOR19NSU4sICBSRUFESEVYMX0sCisgICAgICAgICAgICAgICAgICB7IltmaXhlZCBsYXN0IHRyYWlsIGJ5dGUiLCAgICAgICAgJmNvbnN0cy0+VUNBX1BSSU1BUllfVFJBSUxJTkdfTUFYLCAgUkVBREhFWDF9LAorICAgICAgICAgICAgICAgICAgeyJbZml4ZWQgZmlyc3Qgc3BlY2lhbCBieXRlIiwgICAgICZjb25zdHMtPlVDQV9QUklNQVJZX1NQRUNJQUxfTUlOLCAgIFJFQURIRVgxfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpeGVkIGxhc3Qgc3BlY2lhbCBieXRlIiwgICAgICAmY29uc3RzLT5VQ0FfUFJJTUFSWV9TUEVDSUFMX01BWCwgICBSRUFESEVYMX0sCisgICAgICAgICAgICAgICAgICB7Ilt2YXJpYWJsZSB0b3AgPSAiLCAgICAgICAgICAgICAgJnQtPm9wdGlvbnMtPnZhcmlhYmxlVG9wVmFsdWUsICAgICAgUkVBREhFWDJ9LAorICAgICAgICAgICAgICAgICAgeyJbVUNBIHZlcnNpb24gPSAiLCAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURVQ0FWRVJTSU9OfSwKKyAgICAgICAgICAgICAgICAgIHsiW3RvcF9ieXRlIiwgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFETEVBREJZVEVUT1NDUklQVFN9LAorICAgICAgICAgICAgICAgICAgeyJbcmVvcmRlcmluZ1Rva2VucyIsICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURTQ1JJUFRUT0xFQURCWVRFU30sCisgICAgICAgICAgICAgICAgICB7IltjYXRlZ29yaWVzIiwgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdOT1JFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpcnN0IHRlcnRpYXJ5IGluIHNlY29uZGFyeSBub24taWdub3JhYmxlIiwgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHTk9SRX0sCisgICAgICAgICAgICAgICAgICB7IltsYXN0IHRlcnRpYXJ5IGluIHNlY29uZGFyeSBub24taWdub3JhYmxlIiwgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHTk9SRX0sCisgICAgICAgICAgICAgICAgICB7IltmaXJzdCBzZWNvbmRhcnkgaW4gcHJpbWFyeSBub24taWdub3JhYmxlIiwgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHTk9SRX0sCisgICAgICAgICAgICAgICAgICB7IltsYXN0IHNlY29uZGFyeSBpbiBwcmltYXJ5IG5vbi1pZ25vcmFibGUiLCAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdOT1JFfSwKKyAgICAgIH07CisgICAgICBmb3IgKGNudCA9IDA7IGNudDxzaXplb2YodnQpL3NpemVvZih2dFswXSk7IGNudCsrKSB7CisgICAgICAgIHVpbnQzMl90IHZ0TGVuID0gKHVpbnQzMl90KXVwcnZfc3RybGVuKHZ0W2NudF0ubmFtZSk7CisgICAgICAgIGlmKHVwcnZfc3RybmNtcChidWZmZXIsIHZ0W2NudF0ubmFtZSwgdnRMZW4pID09IDApIHsKKyAgICAgICAgICAgIEFjdGlvblR5cGUgd2hhdF90b19kbyA9IHZ0W2NudF0ud2hhdF90b19kbzsKKyAgICAgICAgICAgIGlmICh3aGF0X3RvX2RvID09IElHTk9SRSkgeyAvL3Z0W2NudF0ud2hhdF90b19kbyA9PSBJR05PUkUKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZih3aGF0X3RvX2RvID09IFJFQURIRVgxIHx8IHdoYXRfdG9fZG8gPT0gUkVBREhFWDIpIHsKKyAgICAgICAgICAgICAgcG9pbnRlciA9IGJ1ZmZlcit2dExlbjsKKyAgICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IHJlYWRFbGVtZW50KCZwb2ludGVyLCBwcmltYXJ5LCAnXScsIHN0YXR1cykgLyAyOworICAgICAgICAgICAgICBpZihudW1CeXRlcyAhPSAod2hhdF90b19kbyA9PSBSRUFESEVYMSA/IDEgOiAyKSkgeworICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJWYWx1ZSBvZiBcIiVzXCIgaGFzIHVuZXhwZWN0ZWQgbnVtYmVyIG9mICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIChpbnQpbnVtQnl0ZXMpOworICAgICAgICAgICAgICAgICAgLy8qc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICoodnRbY250XS53aGF0KSA9ICh1aW50MzJfdCl1cHJ2X3N0cnRvdWwocHJpbWFyeSwgJnBvaW50ZXIsIDE2KTsKKyAgICAgICAgICAgICAgaWYoKnBvaW50ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJWYWx1ZSBvZiBcIiVzXCIgaXMgbm90IGEgaGV4YWRlY2ltYWwgbnVtYmVyXG4iLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgLy8qc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXRfdG9fZG8gPT0gUkVBRENFKSB7CisgICAgICAgICAgICAgIC8vIFRPRE86IGNvbWJpbmUgJiBjbGVhbiB1cCB0aGUgdHdvIENFIHBhcnNlcnMKKyAgICAgICAgICAgICAgcG9pbnRlciA9IHN0cmNocihidWZmZXIrdnRMZW4sICdbJyk7CisgICAgICAgICAgICAgIGlmKHBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyKys7CisgICAgICAgICAgICAgICAgZWxlbWVudC0+c2l6ZVByaW1bMF09cmVhZEVsZW1lbnQoJnBvaW50ZXIsIHByaW1hcnksICcsJywgc3RhdHVzKSAvIDI7CisgICAgICAgICAgICAgICAgZWxlbWVudC0+c2l6ZVNlY1swXT1yZWFkRWxlbWVudCgmcG9pbnRlciwgc2Vjb25kYXJ5LCAnLCcsIHN0YXR1cykgLyAyOworICAgICAgICAgICAgICAgIGVsZW1lbnQtPnNpemVUZXJbMF09cmVhZEVsZW1lbnQoJnBvaW50ZXIsIHRlcnRpYXJ5LCAnXScsIHN0YXR1cykgLyAyOworICAgICAgICAgICAgICAgIHZ0W2NudF0ud2hhdFswXSA9IGdldFNpbmdsZUNFVmFsdWUocHJpbWFyeSwgc2Vjb25kYXJ5LCB0ZXJ0aWFyeSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBpZihlbGVtZW50LT5zaXplUHJpbVswXSA+IDIgfHwgZWxlbWVudC0+c2l6ZVNlY1swXSA+IDEgfHwgZWxlbWVudC0+c2l6ZVRlclswXSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENFaSA9IDE7CisgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IFVDT0xfQ09OVElOVUFUSU9OX01BUktFUjsgLyogQ29udGludWF0aW9uIG1hcmtlciAqLworICAgICAgICAgICAgICAgICAgICBpZigyKkNFaTxlbGVtZW50LT5zaXplUHJpbVtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCoocHJpbWFyeSs0KkNFaSkpJjB4Rik8PDI4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHByaW1hcnkrNCpDRWkrMSkpJjB4Rik8PDI0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKDIqQ0VpKzE8ZWxlbWVudC0+c2l6ZVByaW1baV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHByaW1hcnkrNCpDRWkrMikpJjB4Rik8PDIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHByaW1hcnkrNCpDRWkrMykpJjB4Rik8PDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKENFaTxlbGVtZW50LT5zaXplU2VjW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoKGhleDJudW0oKihzZWNvbmRhcnkrMipDRWkpKSYweEYpPDwxMik7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoKGhleDJudW0oKihzZWNvbmRhcnkrMipDRWkrMSkpJjB4Rik8PDgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoQ0VpPGVsZW1lbnQtPnNpemVUZXJbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHRlcnRpYXJ5KzIqQ0VpKSkmMHgzKTw8NCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoaGV4Mm51bSgqKHRlcnRpYXJ5KzIqQ0VpKzEpKSYweEYpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ0VpKys7CisKKyAgICAgICAgICAgICAgICAgICAgdnRbY250XS53aGF0WzFdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIC8vZWxlbWVudC0+Q0VzW0NFaW5kZXgrK10gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdnRbY250XS53aGF0WzFdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCBhIENFIGZyb20gbGluZSAlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0X3RvX2RvID09IFJFQURVQ0FWRVJTSU9OKSB7IC8vdnRbY250XS53aGF0X3RvX2RvID09IFJFQURVQ0FWRVJTSU9OCisgICAgICAgICAgICAgIHVfdmVyc2lvbkZyb21TdHJpbmcoVUNBVmVyc2lvbiwgYnVmZmVyK3Z0TGVuKTsKKyAgICAgICAgICAgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgY2hhciB1Y2FbVV9NQVhfVkVSU0lPTl9TVFJJTkdfTEVOR1RIXTsKKyAgICAgICAgICAgICAgICB1X3ZlcnNpb25Ub1N0cmluZyhVQ0FWZXJzaW9uLCB1Y2EpOworICAgICAgICAgICAgICAgIHByaW50ZigiVUNBIHZlcnNpb24gJXNcbiIsIHVjYSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgVVZlcnNpb25JbmZvIFVDRFZlcnNpb247CisgICAgICAgICAgICAgIHVfZ2V0VW5pY29kZVZlcnNpb24oVUNEVmVyc2lvbik7CisgICAgICAgICAgICAgIGlmIChVQ0FWZXJzaW9uWzBdICE9IFVDRFZlcnNpb25bMF0gfHwgVUNBVmVyc2lvblsxXSAhPSBVQ0RWZXJzaW9uWzFdKSB7CisgICAgICAgICAgICAgICAgY2hhciB1Y2FbVV9NQVhfVkVSU0lPTl9TVFJJTkdfTEVOR1RIXTsKKyAgICAgICAgICAgICAgICBjaGFyIHVjZFtVX01BWF9WRVJTSU9OX1NUUklOR19MRU5HVEhdOworICAgICAgICAgICAgICAgIHVfdmVyc2lvblRvU3RyaW5nKFVDQVZlcnNpb24sIHVjYSk7CisgICAgICAgICAgICAgICAgdV92ZXJzaW9uVG9TdHJpbmcoVUNEVmVyc2lvbiwgdWNkKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBVQ0EgdmVyc2lvbiAlcyAhPSBVQ0QgdmVyc2lvbiAlcyAodGVtcG9yYXJpbHkgY2hhbmdlIHRoZSBGcmFjdGlvbmFsVUNBLnR4dCBVQ0EgdmVyc2lvbiBkdXJpbmcgVW5pY29kZSB2ZXJzaW9uIHVwZ3JhZGUpXG4iLCB1Y2EsIHVjZCk7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IFVfSU5WQUxJRF9GT1JNQVRfRVJST1I7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdF90b19kbyA9PSBSRUFETEVBREJZVEVUT1NDUklQVFMpIHsgLy92dFtjbnRdLndoYXRfdG9fZG8gPT0gUkVBRExFQURCWVRFVE9TQ1JJUFRTCisgICAgICAgICAgICAgICAgcG9pbnRlciA9IGJ1ZmZlciArIHZ0TGVuOworICAgICAgICAgICAgICAgIHNraXBXaGl0ZVNwYWNlKCZwb2ludGVyLCBzdGF0dXMpOworCisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVhZEJ5dGUgPSAoaGV4Mm51bSgqcG9pbnRlcisrKSAqIDE2KSArIGhleDJudW0oKnBvaW50ZXIrKyk7CisgICAgICAgICAgICAgICAgLy9wcmludGYoIn5+fn4gcHJvY2Vzc2luZyBsZWFkIGJ5dGUgPSAlMDJ4XG4iLCBsZWFkQnl0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxlYWRCeXRlID49IGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJMZWFkIGJ5dGUgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIHRhYmxlISIpOworICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc3RhdHVzIGFuZCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNraXBXaGl0ZVNwYWNlKCZwb2ludGVyLCBzdGF0dXMpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCByZW9yZGVyQ29kZUFycmF5WzEwMF07CisgICAgICAgICAgICAgICAgdWludDMyX3QgcmVvcmRlckNvZGVBcnJheUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaGFyIHNjcmlwdE5hbWVbMTAwXTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGVsZW1lbnRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICgoZWxlbWVudExlbmd0aCA9IHJlYWRFbGVtZW50KCZwb2ludGVyLCBzY3JpcHROYW1lLCAnICcsIHN0YXR1cykpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0TmFtZVswXSA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVvcmRlckNvZGUgPSBnZXRSZW9yZGVyQ29kZShzY3JpcHROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJDb2RlID09IC0yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8vIElnbm9yZSAiVEVSTUlOQVRPUiIgZXRjLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyQ29kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU3ludGF4IGVycm9yOiB1bmFibGUgdG8gcGFyc2UgcmVvcmRlciBjb2RlIGZyb20gJyVzJ1xuIiwgc2NyaXB0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyQ29kZUFycmF5Q291bnQgPj0gTEVOR1RIT0YocmVvcmRlckNvZGVBcnJheSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigicmVvcmRlciBjb2RlIGFycmF5IGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBhbGxvY2F0ZWQgc2l6ZSFcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJDb2RlQXJyYXlbcmVvcmRlckNvZGVBcnJheUNvdW50KytdID0gcmVvcmRlckNvZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJyZW9yZGVyQ29kZUFycmF5Q291bnQgPSAlZFxuIiwgcmVvcmRlckNvZGVBcnJheUNvdW50KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlb3JkZXJDb2RlQXJyYXlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhbbGVhZEJ5dGVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPID0gbW92ZSAweDgwMDAgaW50byBkZWZpbmVkIGNvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhbbGVhZEJ5dGVdID0gMHg4MDAwIHwgcmVvcmRlckNvZGVBcnJheVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJDb2RlQXJyYXlDb3VudCArIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCA+IGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX0xFTkdUSCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYW2xlYWRCeXRlXSA9IGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBW2xlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCsrXSA9IHJlb3JkZXJDb2RlQXJyYXlDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJlb3JkZXJDb2RlSW5kZXggPSAwOyByZW9yZGVyQ29kZUluZGV4IDwgcmVvcmRlckNvZGVBcnJheUNvdW50OyByZW9yZGVyQ29kZUluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQVtsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9PRkZTRVQrK10gPSByZW9yZGVyQ29kZUFycmF5W3Jlb3JkZXJDb2RlSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdF90b19kbyA9PSBSRUFEU0NSSVBUVE9MRUFEQllURVMpIHsgLy92dFtjbnRdLndoYXRfdG9fZG8gPT0gUkVBRFNDUklQVFRPTEVBREJZVEVTCisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVhZEJ5dGVBcnJheVsxMDBdOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlYWRCeXRlQXJyYXlDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgY2hhciBzY3JpcHROYW1lWzEwMF07CisKKyAgICAgICAgICAgICAgICBwb2ludGVyID0gYnVmZmVyICsgdnRMZW47CisgICAgICAgICAgICAgICAgc2tpcFdoaXRlU3BhY2UoJnBvaW50ZXIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2NyaXB0TmFtZUxlbmd0aCA9IHJlYWRFbGVtZW50KCZwb2ludGVyLCBzY3JpcHROYW1lLCAnXHQnLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGludDMyX3QgcmVvcmRlckNvZGUgPSBnZXRSZW9yZGVyQ29kZShzY3JpcHROYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocmVvcmRlckNvZGUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXl5eIHByb2Nlc3NpbmcgcmVvcmRlciBjb2RlID0gJTA0eCAoJXMpXG4iLCByZW9yZGVyQ29kZSwgc2NyaXB0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHNraXBXaGl0ZVNwYWNlKCZwb2ludGVyLCBzdGF0dXMpOworCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZWxlbWVudExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgbGVhZEJ5dGVTdHJpbmdbMTAwXTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChlbGVtZW50TGVuZ3RoID0gcmVhZEVsZW1lbnQoJnBvaW50ZXIsIGxlYWRCeXRlU3RyaW5nLCAnPScsIHN0YXR1cykpID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdGxlYWRCeXRlQXJyYXlDb3VudCA9ICVkLCBlbGVtZW50TGVuZ3RoID0gJWQsIGxlYWRCeXRlU3RyaW5nID0gJXNcbiIsIGxlYWRCeXRlQXJyYXlDb3VudCwgZWxlbWVudExlbmd0aCwgbGVhZEJ5dGVTdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVhZEJ5dGUgPSAoaGV4Mm51bShsZWFkQnl0ZVN0cmluZ1swXSkgKiAxNikgKyBoZXgybnVtKGxlYWRCeXRlU3RyaW5nWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQXJyYXlbbGVhZEJ5dGVBcnJheUNvdW50KytdID0gKHVpbnQxNl90KSBsZWFkQnl0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBVbnRpbFdoaXRlU3BhY2UoJnBvaW50ZXIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UID49IGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdEVycm9yIGNvbmRpdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXHRpbmRleCBjb3VudCA9ICVkLCB0b3RhbCBpbmRleCBzaXplID0gJWRcbiIsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCwgc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWCkgLyBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYWzBdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0dXMgPSBVX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UXS5yZW9yZGVyQ29kZSA9IHJlb3JkZXJDb2RlOworCisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdGxlYWQgYnl0ZSBjb3VudCA9ICVkXG4iLCBsZWFkQnl0ZUFycmF5Q291bnQpOworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXHRsZWFkIGJ5dGUgYXJyYXkgPSAiKTsKKyAgICAgICAgICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGxlYWRCeXRlQXJyYXlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHByaW50ZigiJTAyeCwgIiwgbGVhZEJ5dGVBcnJheVtpXSk7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXG4iKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGxlYWRCeXRlQXJyYXlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFtsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlRdLm9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA9IG1vdmUgMHg4MDAwIGludG8gZGVmaW5lZCBjb25zdGFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdCsrKysrIGxlYWQgYnl0ZSA9ICZ4XG4iLCBsZWFkQnl0ZUFycmF5WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UXS5vZmZzZXQgPSAweDgwMDAgfCBsZWFkQnl0ZUFycmF5WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXHQrKysrKyBsZWFkIGJ5dGVzIHdyaXR0ZW4gdG8gZGF0YSBibG9jayAtICVkXG4iLCBpdGVtc1RvRGF0YUJsb2NrKyspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdGxlYWQgYnl0ZXMgPSAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgbGVhZEJ5dGVBcnJheUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwcmludGYoIiUwMngsICIsIGxlYWRCeXRlQXJyYXlbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdEJFRk9SRSBkYXRhIGJ5dGVzID0gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcHJpbnRmKCIlMDJ4LCAiLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIlx0ZGF0YSBvZmZzZXQgPSAlZCwgZGF0YSBsZW5ndGggPSAlZFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VULCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9MRU5HVEgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVhZEJ5dGVBcnJheUNvdW50ICsgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUKSA+IGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX0xFTkdUSCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXHRFcnJvciBjb25kaXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFtsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlRdLm9mZnNldCA9IGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQVtsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQrK10gPSBsZWFkQnl0ZUFycmF5Q291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGF0YVdyaXR0ZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBW2xlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQXJyYXksIGxlYWRCeXRlQXJyYXlDb3VudCAqIHNpemVvZihsZWFkQnl0ZUFycmF5WzBdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGF0YVdyaXR0ZW4gKz0gbGVhZEJ5dGVBcnJheUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdGxlYWQgYnl0ZSBkYXRhIHdyaXR0ZW4gPSAlZFxuIiwgc2NyaXB0RGF0YVdyaXR0ZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJcdGN1cnJlbnRJbmRleC5yZW9yZGVyQ29kZSA9ICUwNHgsIGN1cnJlbnRJbmRleC5vZmZzZXQgPSAlMDR4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQucmVvcmRlckNvZGUsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVC5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCArPSBsZWFkQnl0ZUFycmF5Q291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIlx0ZGF0YSBvZmZzZXQgPSAlZFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXHRBRlRFUiBkYXRhIGJ5dGVzID0gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcHJpbnRmKCIlMDJ4LCAiLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9pZiAocmVvcmRlckNvZGUgPj0gMHgxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAvLyAgIHByaW50ZigiQEBAQCByZW9yZGVyQ29kZSA9ICV4LCBvZmZzZXQgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYW2xlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVF0ucmVvcmRlckNvZGUsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFtsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlRdLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAvLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHByaW50ZigiJTAyeCwgIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFbaV0pOworICAgICAgICAgICAgICAgICAgICAgLy8gICB9CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBidWZmZXIpOworICAgICAgLy8qc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0YXJ0Q29kZVBvaW50ID0gYnVmZmVyOworICAgIGVuZENvZGVQb2ludCA9IHN0cmNocihzdGFydENvZGVQb2ludCwgJzsnKTsKKworICAgIGlmKGVuZENvZGVQb2ludCA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgLSBsaW5lIHdpdGggbm8gY29kZSBwb2ludCFcbiIpOworICAgICAgICAqc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsgLyogTm8gY29kZSBwb2ludCAtIGNvdWxkIGJlIGFuIGVycm9yLCBidXQgcHJvYmFibHkgb25seSBhbiBlbXB0eSBsaW5lICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgICooZW5kQ29kZVBvaW50KSA9IDA7CisgICAgfQorCisgICAgY2hhciAqcGlwZVBvaW50ZXIgPSBzdHJjaHIoYnVmZmVyLCAnfCcpOworICAgIGlmIChwaXBlUG9pbnRlciAhPSBOVUxMKSB7CisgICAgICAgIC8vIFJlYWQgdGhlIHByZWZpeCBzdHJpbmcgd2hpY2ggcHJlY2VkZXMgdGhlIGFjdHVhbCBzdHJpbmcuCisgICAgICAgICpwaXBlUG9pbnRlciA9IDA7CisgICAgICAgIGVsZW1lbnQtPnByZWZpeFNpemUgPQorICAgICAgICAgICAgdV9wYXJzZVN0cmluZyhzdGFydENvZGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC0+cHJlZml4Q2hhcnMsIExFTkdUSE9GKGVsZW1lbnQtPnByZWZpeENoYXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc3RhdHVzKTsKKyAgICAgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIC0gcGFyc2luZyBvZiBwcmVmaXggXCIlc1wiIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29kZVBvaW50LCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgICAgICAqc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsZW1lbnQtPnByZWZpeCA9IGVsZW1lbnQtPnByZWZpeENoYXJzOworICAgICAgICBzdGFydENvZGVQb2ludCA9IHBpcGVQb2ludGVyICsgMTsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBzdHJpbmcgd2hpY2ggZ2V0cyB0aGUgQ0UocykgYXNzaWduZWQuCisgICAgZWxlbWVudC0+Y1NpemUgPQorICAgICAgICB1X3BhcnNlU3RyaW5nKHN0YXJ0Q29kZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtPnVjaGFycywgTEVOR1RIT0YoZWxlbWVudC0+dWNoYXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIC0gcGFyc2luZyBvZiBjb2RlIHBvaW50KHMpIFwiJXNcIiBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIHN0YXJ0Q29kZVBvaW50LCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgICpzdGF0dXMgPSBVX0lOVkFMSURfRk9STUFUX0VSUk9SOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxlbWVudC0+Y1BvaW50cyA9IGVsZW1lbnQtPnVjaGFyczsKKworICAgIHN0YXJ0Q29kZVBvaW50ID0gZW5kQ29kZVBvaW50KzE7CisKKyAgICBjb21tZW50U3RhcnQgPSBzdHJjaHIoc3RhcnRDb2RlUG9pbnQsICcjJyk7CisgICAgaWYoY29tbWVudFN0YXJ0ID09IE5VTEwpIHsKKyAgICAgICAgY29tbWVudFN0YXJ0ID0gc3RybGVuKHN0YXJ0Q29kZVBvaW50KSArIHN0YXJ0Q29kZVBvaW50OworICAgIH0KKworICAgIGkgPSAwOworICAgIHVpbnQzMl90IENFaW5kZXggPSAwOworICAgIGVsZW1lbnQtPm5vT2ZDRXMgPSAwOworICAgIGZvcig7OykgeworICAgICAgICBlbmRDb2RlUG9pbnQgPSBzdHJjaHIoc3RhcnRDb2RlUG9pbnQsICddJyk7CisgICAgICAgIGlmKGVuZENvZGVQb2ludCA9PSBOVUxMIHx8IGVuZENvZGVQb2ludCA+PSBjb21tZW50U3RhcnQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBvaW50ZXIgPSBzdHJjaHIoc3RhcnRDb2RlUG9pbnQsICdbJyk7CisgICAgICAgIHBvaW50ZXIrKzsKKworICAgICAgICBlbGVtZW50LT5zaXplUHJpbVtpXT1yZWFkRWxlbWVudCgmcG9pbnRlciwgcHJpbWFyeSwgJywnLCBzdGF0dXMpIC8gMjsKKyAgICAgICAgZWxlbWVudC0+c2l6ZVNlY1tpXT1yZWFkRWxlbWVudCgmcG9pbnRlciwgc2Vjb25kYXJ5LCAnLCcsIHN0YXR1cykgLyAyOworICAgICAgICBlbGVtZW50LT5zaXplVGVyW2ldPXJlYWRFbGVtZW50KCZwb2ludGVyLCB0ZXJ0aWFyeSwgJ10nLCBzdGF0dXMpIC8gMjsKKworCisgICAgICAgIC8qIEkgd2FudCB0byBnZXQgdGhlIENFcyBlbnRlcmVkIHJpZ2h0IGhlcmUsIGluY2x1ZGluZyBjb250aW51YXRpb24gKi8KKyAgICAgICAgZWxlbWVudC0+Q0VzW0NFaW5kZXgrK10gPSBnZXRTaW5nbGVDRVZhbHVlKHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnksIHN0YXR1cyk7CisKKyAgICAgICAgdWludDMyX3QgQ0VpID0gMTsKKyAgICAgICAgd2hpbGUoMipDRWk8ZWxlbWVudC0+c2l6ZVByaW1baV0gfHwgQ0VpPGVsZW1lbnQtPnNpemVTZWNbaV0gfHwgQ0VpPGVsZW1lbnQtPnNpemVUZXJbaV0pIHsKKyAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IFVDT0xfQ09OVElOVUFUSU9OX01BUktFUjsgLyogQ29udGludWF0aW9uIG1hcmtlciAqLworICAgICAgICAgICAgaWYoMipDRWk8ZWxlbWVudC0+c2l6ZVByaW1baV0pIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoKGhleDJudW0oKihwcmltYXJ5KzQqQ0VpKSkmMHhGKTw8MjgpOworICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHByaW1hcnkrNCpDRWkrMSkpJjB4Rik8PDI0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoMipDRWkrMTxlbGVtZW50LT5zaXplUHJpbVtpXSkgeworICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHByaW1hcnkrNCpDRWkrMikpJjB4Rik8PDIwKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoKGhleDJudW0oKihwcmltYXJ5KzQqQ0VpKzMpKSYweEYpPDwxNik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKENFaTxlbGVtZW50LT5zaXplU2VjW2ldKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCooc2Vjb25kYXJ5KzIqQ0VpKSkmMHhGKTw8MTIpOworICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHNlY29uZGFyeSsyKkNFaSsxKSkmMHhGKTw8OCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKENFaTxlbGVtZW50LT5zaXplVGVyW2ldKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCoodGVydGlhcnkrMipDRWkpKSYweDMpPDw0KTsKKyAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoaGV4Mm51bSgqKHRlcnRpYXJ5KzIqQ0VpKzEpKSYweEYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDRWkrKzsKKworICAgICAgICAgICAgZWxlbWVudC0+Q0VzW0NFaW5kZXgrK10gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICBzdGFydENvZGVQb2ludCA9IGVuZENvZGVQb2ludCsxOworICAgICAgaSsrOworICAgIH0KKyAgICBlbGVtZW50LT5ub09mQ0VzID0gQ0VpbmRleDsKKyNpZiAwCisgICAgZWxlbWVudC0+aXNUaGFpID0gVUNPTF9JU1RIQUlQUkVWT1dFTChlbGVtZW50LT5jUG9pbnRzWzBdKTsKKyNlbmRpZgorICAgIC8vIHdlIGRvbid0IHdhbnQgYW55IHN0cmFuZ2Ugc3R1ZmYgYWZ0ZXIgdXNlZnVsIGRhdGEhCisgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgICAvKiBodWg/IERpZCB3ZSBnZXQgJ10nIHdpdGhvdXQgdGhlICdbJz8gUGFpciB5b3VyIGJyYWNrZXRzISAqLworICAgICAgICAqc3RhdHVzPVVfSU5WQUxJRF9GT1JNQVRfRVJST1I7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3aGlsZShwb2ludGVyIDwgY29tbWVudFN0YXJ0KSAgeworICAgICAgICAgICAgaWYoKnBvaW50ZXIgIT0gJyAnICYmICpwb2ludGVyICE9ICdcdCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnN0YXR1cz1VX0lOVkFMSURfRk9STUFUX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9pbnRlcisrOworICAgICAgICB9CisgICAgfQorICAgIGlmKGVsZW1lbnQtPmNTaXplID09IDEgJiYgZWxlbWVudC0+Y1BvaW50c1swXSA9PSAweGZmZmUpIHsKKyAgICAgICAgLy8gVUNBIDYuMCBnaXZlcyBVK0ZGRkUgYSBzcGVjaWFsIG1pbmltdW0gd2VpZ2h0IHVzaW5nIHRoZQorICAgICAgICAvLyBieXRlIDAyIHdoaWNoIGlzIHRoZSBtZXJnZS1zb3J0LWtleSBzZXBhcmF0b3IgYW5kIGlsbGVnYWwgZm9yIGFueQorICAgICAgICAvLyBvdGhlciBjaGFyYWN0ZXJzLgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJ1ZGltZW50YXJ5IGNoZWNrIGZvciB2YWxpZCBieXRlcyBpbiBDRSB3ZWlnaHRzLgorICAgICAgICAvLyBGb3IgYSBtb3JlIGNvbXByZWhlbnNpdmUgY2hlY2sgc2VlIGNpbnRsdHN0IC90c2NvbGwvY2l0ZXJ0c3QvVGVzdENFVmFsaWRpdHkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQzMl90KUNFaW5kZXg7ICsraSkgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWUgPSBlbGVtZW50LT5DRXNbaV07CisgICAgICAgICAgICB1aW50OF90IGJ5dGVzWzRdID0geworICAgICAgICAgICAgICAgICh1aW50OF90KSh2YWx1ZSA+PiAyNCksCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHZhbHVlID4+IDE2KSwKKyAgICAgICAgICAgICAgICAodWludDhfdCkodmFsdWUgPj4gOCksCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHZhbHVlICYgVUNPTF9ORVdfVEVSVElBUllPUkRFUk1BU0spCisgICAgICAgICAgICB9OworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoMCAhPSBieXRlc1tqXSAmJiBieXRlc1tqXSA8IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIFVDQSB3ZWlnaHQgYnl0ZSAlMDJYIGZvciAlc1xuIiwgYnl0ZXNbal0sIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFByaW1hcnkgc2Vjb25kIGJ5dGVzIDAzIGFuZCBGRiBhcmUgY29tcHJlc3Npb24gdGVybWluYXRvcnMuCisgICAgICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uKHZhbHVlKSAmJiAoYnl0ZXNbMV0gPT0gMyB8fCBieXRlc1sxXSA9PSAweEZGKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBVQ0EgcHJpbWFyeSBzZWNvbmQgd2VpZ2h0IGJ5dGUgJTAyWCBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1sxXSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gcHV0dGluZyBzdHVmZiBpbiBoYXNoIHRhYmxlICVzXG4iLCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgICpzdGF0dXMgPSBVX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworfQorCisKK3ZvaWQgd3JpdGVPdXREYXRhKFVDQVRhYmxlSGVhZGVyICpkYXRhLAorICAgICAgICAgICAgICAgICAgVUNBQ29uc3RhbnRzICpjb25zdHMsCisgICAgICAgICAgICAgICAgICBMZWFkQnl0ZUNvbnN0YW50cyAqbGVhZEJ5dGVDb25zdGFudHMsCisgICAgICAgICAgICAgICAgICBVQ2hhciBjb250cmFjdGlvbnNbXVtNQVhfVUNBX0NPTlRSQUNUSU9OX0xFTkdUSF0sCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub09mY29udHJhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGlyLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29weXJpZ2h0LAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKQoreworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3Qgc2l6ZSA9IGRhdGEtPnNpemU7CisKKyAgICBkYXRhLT5VQ0FDb25zdHMgPSBkYXRhLT5zaXplOworICAgIGRhdGEtPnNpemUgKz0gcGFkZGVkc2l6ZShzaXplb2YoVUNBQ29uc3RhbnRzKSk7CisKKyAgICBpZihub09mY29udHJhY3Rpb25zICE9IDApIHsKKyAgICAgIHVwcnZfbWVtc2V0KCZjb250cmFjdGlvbnNbbm9PZmNvbnRyYWN0aW9uc11bMF0sIDAsIE1BWF9VQ0FfQ09OVFJBQ1RJT05fTEVOR1RIKlVfU0laRU9GX1VDSEFSKTsKKyAgICAgIG5vT2Zjb250cmFjdGlvbnMrKzsKKworCisgICAgICBkYXRhLT5jb250cmFjdGlvblVDQUNvbWJvcyA9IGRhdGEtPnNpemU7CisgICAgICBkYXRhLT5jb250cmFjdGlvblVDQUNvbWJvc1dpZHRoID0gKHVpbnQ4X3QpTUFYX1VDQV9DT05UUkFDVElPTl9MRU5HVEg7CisgICAgICBkYXRhLT5jb250cmFjdGlvblVDQUNvbWJvc1NpemUgPSBub09mY29udHJhY3Rpb25zOworICAgICAgZGF0YS0+c2l6ZSArPSBwYWRkZWRzaXplKChub09mY29udHJhY3Rpb25zKk1BWF9VQ0FfQ09OVFJBQ1RJT05fTEVOR1RIKlVfU0laRU9GX1VDSEFSKSk7CisgICAgfQorICAgIGRhdGEtPnNjcmlwdFRvTGVhZEJ5dGUgPSBkYXRhLT5zaXplOworICAgIC8vcHJpbnRmKCJAQEBAIHNjcmlwdCB0byBsZWFkIGJ5dGUgb2Zmc2V0ID0gMHgleCAoJWQpXG4iLCBkYXRhLT5zaXplLCBkYXRhLT5zaXplKTsKKyAgICBkYXRhLT5zaXplICs9CisgICAgICAgIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggdGFibGUgaGVhZGVyCisgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCAqIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbMF0pICsgICAgLy8gaW5kZXggdGFibGUKKyAgICAgICAgc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIGhlYWRlcgorICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQgKiBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFbMF0pOyAgICAgICAgLy8gZGF0YSB0YWJsZQorICAgIGRhdGEtPmxlYWRCeXRlVG9TY3JpcHQgPSBkYXRhLT5zaXplOworICAgIC8vcHJpbnRmKCJAQEBAIGxlYWQgYnl0ZSB0byBzY3JpcHQgb2Zmc2V0ID0gMHgleCAoJWQpXG4iLCBkYXRhLT5zaXplLCBkYXRhLT5zaXplKTsKKyAgICBkYXRhLT5zaXplICs9CisgICAgICAgIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhfTEVOR1RIKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggdGFibGUgaGVhZGVyCisgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEggKiBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYWzBdKSArICAgLy8gaW5kZXggdGFibGUKKyAgICAgICAgc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRhYmxlIGhlYWRlcgorICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9PRkZTRVQgKiBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEFbMF0pOyAgICAgICAgLy8gZGF0YSB0YWJsZQorCisgICAgVU5ld0RhdGFNZW1vcnkgKnBEYXRhOworICAgIAorICAgIGxvbmcgZGF0YUxlbmd0aDsKKyAgICBVRGF0YUluZm8gdWNhSW5mbzsKKyAgICB1cHJ2X21lbWNweSgmdWNhSW5mbywgJnVjYURhdGFJbmZvLCBzaXplb2YoVURhdGFJbmZvKSk7CisgICAgdV9nZXRVbmljb2RlVmVyc2lvbih1Y2FJbmZvLmRhdGFWZXJzaW9uKTsKKworICAgIHBEYXRhPXVkYXRhX2NyZWF0ZShvdXRwdXREaXIsIFVDQV9EQVRBX1RZUEUsIFVDQV9EQVRBX05BTUUsICZ1Y2FJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBjb3B5cmlnaHQsIHN0YXR1cyk7CisKKyAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogdW5hYmxlIHRvIGNyZWF0ZSAlcyJVQ0FfREFUQV9OQU1FIiwgZXJyb3IgJXNcbiIsIG91dHB1dERpciwgdV9lcnJvck5hbWUoKnN0YXR1cykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUgKi8KKyAgICBpZiAoYmVWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiV3JpdGluZyBvdXQgVUNBIHRhYmxlOiAlcyVjJXMuJXNcbiIsIG91dHB1dERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVV9GSUxFX1NFUF9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVX0lDVURBVEFfTkFNRSAiXyIgVUNBX0RBVEFfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNBX0RBVEFfVFlQRSk7CisgICAgfQorICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGRhdGEsIHNpemUpOworCisgICAgLy8gb3V0cHV0IHRoZSBjb25zdGFudHMgaGVyZQorICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGNvbnN0cywgc2l6ZW9mKFVDQUNvbnN0YW50cykpOworCisgICAgaWYgKGJlVmVyYm9zZSkgeworICAgICAgICBwcmludGYoImZpcnN0IHRlcnRpYXJ5IGlnbm9yYWJsZSA9ICV4ICV4XG4iLCBjb25zdHMtPlVDQV9GSVJTVF9URVJUSUFSWV9JR05PUkFCTEVbMF0sIGNvbnN0cy0+VUNBX0ZJUlNUX1RFUlRJQVJZX0lHTk9SQUJMRVsxXSk7CisgICAgICAgIHByaW50ZigibGFzdCB0ZXJ0aWFyeSBpZ25vcmFibGUgPSAleCAleFxuIiwgY29uc3RzLT5VQ0FfTEFTVF9URVJUSUFSWV9JR05PUkFCTEVbMF0sIGNvbnN0cy0+VUNBX0xBU1RfVEVSVElBUllfSUdOT1JBQkxFWzFdKTsKKyAgICAgICAgcHJpbnRmKCJmaXJzdCBzZWNvbmRhcnkgaWdub3JhYmxlID0gJXggJXhcbiIsIGNvbnN0cy0+VUNBX0ZJUlNUX1NFQ09OREFSWV9JR05PUkFCTEVbMF0sIGNvbnN0cy0+VUNBX0ZJUlNUX1NFQ09OREFSWV9JR05PUkFCTEVbMV0pOworICAgICAgICBwcmludGYoImNvbnRyYWN0aW9uVUNBQ29tYm9zU2l6ZSA9ICVkXG4iLCBkYXRhLT5jb250cmFjdGlvblVDQUNvbWJvc1NpemUpOworICAgICAgICBwcmludGYoImNvbnRyYWN0aW9uU2l6ZSA9ICVkXG4iLCBkYXRhLT5jb250cmFjdGlvblNpemUpOworICAgICAgICBwcmludGYoIm51bWJlciBvZiBVQ0EgY29udHJhY3Rpb25zID0gJWRcbiIsIG5vT2Zjb250cmFjdGlvbnMpOworICAgIH0KKyAgICAKKyAgICBpZihub09mY29udHJhY3Rpb25zICE9IDApIHsKKyAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGNvbnRyYWN0aW9ucywgbm9PZmNvbnRyYWN0aW9ucypNQVhfVUNBX0NPTlRSQUNUSU9OX0xFTkdUSCpVX1NJWkVPRl9VQ0hBUik7CisgICAgICB1ZGF0YV93cml0ZVBhZGRpbmcocERhdGEsIHBhZGRlZHNpemUoKG5vT2Zjb250cmFjdGlvbnMqTUFYX1VDQV9DT05UUkFDVElPTl9MRU5HVEgqVV9TSVpFT0ZfVUNIQVIpKSAtIG5vT2Zjb250cmFjdGlvbnMqTUFYX1VDQV9DT05UUkFDVElPTl9MRU5HVEgqVV9TSVpFT0ZfVUNIQVIpOworICAgIH0KKworICAgIC8vIG91dHB1dCB0aGUgc2NyaXB0IHRvIGxlYWQgYnl0ZXMgdGFibGUgaGVyZQorICAgIGlmIChiZVZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJXcml0aW5nIFNjcmlwdCB0byBMZWFkIEJ5dGUgRGF0YVxuIik7CisgICAgICAgIHByaW50ZigiXHRpbmRleCB0YWJsZSBzaXplID0gJXhcbiIsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCk7CisgICAgICAgIHByaW50ZigiXHRkYXRhIGJsb2NrIHNpemUgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUKTsKKyAgICB9CisgICAgdWRhdGFfd3JpdGUxNihwRGF0YSwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UKTsKKyAgICB1ZGF0YV93cml0ZTE2KHBEYXRhLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQpOworLy8gICAgIHByaW50ZigiIyMjIyBTY3JpcHQgdG8gTGVhZCBCeXRlIEluZGV4IEJlZm9yZSBTb3J0XG4iKTsKKy8vICAgICBmb3IgKGludCByZW9yZGVyQ29kZUluZGV4ID0gMDsgcmVvcmRlckNvZGVJbmRleCA8IGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVDsgcmVvcmRlckNvZGVJbmRleCsrKSB7CisvLyAgICAgICAgIHByaW50ZigiXHQlMDR4ID0gJTA0eFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYW3Jlb3JkZXJDb2RlSW5kZXhdLnJlb3JkZXJDb2RlLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbcmVvcmRlckNvZGVJbmRleF0ub2Zmc2V0KTsKKy8vICAgICB9CisgICAgcXNvcnQobGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQsIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbMF0pLCBSZW9yZGVySW5kZXhDb21wYXJlcik7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQgKiBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYWzBdKSk7CisvLyAgICAgcHJpbnRmKCIjIyMjIFNjcmlwdCB0byBMZWFkIEJ5dGUgSW5kZXggQWZ0ZXIgU29ydFxuIik7CisvLyAgICAgZm9yIChpbnQgcmVvcmRlckNvZGVJbmRleCA9IDA7IHJlb3JkZXJDb2RlSW5kZXggPCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQ7IHJlb3JkZXJDb2RlSW5kZXgrKykgeworLy8gICAgICAgICBwcmludGYoIlx0JTA0eCA9ICUwNHhcbiIsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFtyZW9yZGVyQ29kZUluZGV4XS5yZW9yZGVyQ29kZSwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYW3Jlb3JkZXJDb2RlSW5kZXhdLm9mZnNldCk7CisvLyAgICAgfQorICAgIAorICAgIC8vIHdyaXRlIG91dCB0aGUgc2NyaXB0IHRvIGxlYWQgYnl0ZXMgZGF0YSBibG9jaworICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQgKiBzaXplb2YoKmxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBKSk7CisgICAgCisgICAgaWYgKGJlVmVyYm9zZSkgeworICAgICAgICBwcmludGYoIldyaXRpbmcgTGVhZCBCeXRlIFRvIFNjcmlwdCBEYXRhXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcdGluZGV4IHRhYmxlIHNpemUgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYX0xFTkdUSCk7CisgICAgICAgIHByaW50ZigiXHRkYXRhIGJsb2NrIHNpemUgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEFfT0ZGU0VUKTsKKyAgICB9CisgICAgLy8gb3V0cHV0IHRoZSBoZWFkZXIgaW5mbworICAgIHVkYXRhX3dyaXRlMTYocERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEgpOworICAgIHVkYXRhX3dyaXRlMTYocERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCk7CisgICAgCisgICAgLy8gb3V0cHV0IHRoZSBpbmRleCB0YWJsZQorICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWCwgCisgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEggKiBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYKVswXSk7CisvLyAgICAgZm9yIChpbnQgbGVhZEJ5dGUgPSAwOyBsZWFkQnl0ZSA8IGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEg7IGxlYWRCeXRlKyspIHsKKy8vICAgICAgICAgcHJpbnRmKCJcdCUwMnggPSAlMDR4XG4iLCBsZWFkQnl0ZSwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYW2xlYWRCeXRlXSk7CisvLyAgICAgfQorCisgICAgLy8gb3V0cHV0IHRoZSBkYXRhCisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEEsIAorICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9PRkZTRVQgKiBzaXplb2YoKmxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBKSk7CisKKyAgICAKKyAgICAvKiBmaW5pc2ggdXAgKi8KKyAgICBkYXRhTGVuZ3RoPXVkYXRhX2ZpbmlzaChwRGF0YSwgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogZXJyb3IgJWQgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGVcbiIsICpzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitlbnVtIHsKKyAgICAvKgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIFVDQSBjb250cmFjdGlvbnMgd2UgY2FuIHN0b3JlLgorICAgICAqIE1heSBuZWVkIHRvIGJlIGluY3JlYXNlZCBmb3IgYSBuZXcgVW5pY29kZSB2ZXJzaW9uLgorICAgICAqLworICAgIE1BWF9VQ0FfQ09OVFJBQ1RJT05TPTIwNDgKK307CisKK3N0YXRpYyBpbnQzMl90Cit3cml0ZV91Y2FfdGFibGUoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGlyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvcHlyaWdodCwKKyAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpCit7CisgICAgRklMRSAqZGF0YSA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmKGRhdGEgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IG9wZW4gZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB1aW50MzJfdCBsaW5lID0gMDsKKyAgICBVQ0FFbGVtZW50cyAqZWxlbWVudCA9IE5VTEw7CisgICAgVUNBVGFibGVIZWFkZXIgKm15RCA9IChVQ0FUYWJsZUhlYWRlciAqKXVwcnZfbWFsbG9jKHNpemVvZihVQ0FUYWJsZUhlYWRlcikpOworICAgIC8qIHRlc3QgZm9yIE5VTEwgKi8KKyAgICBpZihteUQgPT0gTlVMTCkgeworICAgICAgICAqc3RhdHVzID0gVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKKyAgICAgICAgZmNsb3NlKGRhdGEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdXBydl9tZW1zZXQobXlELCAwLCBzaXplb2YoVUNBVGFibGVIZWFkZXIpKTsKKyAgICBVQ29sT3B0aW9uU2V0ICpvcHRzID0gKFVDb2xPcHRpb25TZXQgKil1cHJ2X21hbGxvYyhzaXplb2YoVUNvbE9wdGlvblNldCkpOworICAgIC8qIHRlc3QgZm9yIE5VTEwgKi8KKyAgICBpZihvcHRzID09IE5VTEwpIHsKKyAgICAgICAgKnN0YXR1cyA9IFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgICAgIHVwcnZfZnJlZShteUQpOworICAgICAgICBmY2xvc2UoZGF0YSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB1cHJ2X21lbXNldChvcHRzLCAwLCBzaXplb2YoVUNvbE9wdGlvblNldCkpOworICAgIFVDaGFyIGNvbnRyYWN0aW9uc1tNQVhfVUNBX0NPTlRSQUNUSU9OU11bTUFYX1VDQV9DT05UUkFDVElPTl9MRU5HVEhdOworICAgIHVwcnZfbWVtc2V0KGNvbnRyYWN0aW9ucywgMCwgc2l6ZW9mKGNvbnRyYWN0aW9ucykpOworICAgIHVpbnQzMl90IG5vT2ZDb250cmFjdGlvbnMgPSAwOworICAgIFVDQUNvbnN0YW50cyBjb25zdHM7CisgICAgdXBydl9tZW1zZXQoJmNvbnN0cywgMCwgc2l6ZW9mKGNvbnN0cykpOworI2lmIDAKKyAgICBVQ0FDb25zdGFudHMgY29uc3RzID0geworICAgICAgVUNPTF9SRVNFVF9UT1BfVkFMVUUsCisgICAgICBVQ09MX0ZJUlNUX1BSSU1BUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9MQVNUX1BSSU1BUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9MQVNUX1BSSU1BUllfSUdOT1JBQkxFX0NPTlQsCisgICAgICBVQ09MX0ZJUlNUX1NFQ09OREFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX0xBU1RfU0VDT05EQVJZX0lHTk9SQUJMRSwKKyAgICAgIFVDT0xfRklSU1RfVEVSVElBUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9MQVNUX1RFUlRJQVJZX0lHTk9SQUJMRSwKKyAgICAgIFVDT0xfRklSU1RfVkFSSUFCTEUsCisgICAgICBVQ09MX0xBU1RfVkFSSUFCTEUsCisgICAgICBVQ09MX0ZJUlNUX05PTl9WQVJJQUJMRSwKKyAgICAgIFVDT0xfTEFTVF9OT05fVkFSSUFCTEUsCisKKyAgICAgIFVDT0xfTkVYVF9UT1BfVkFMVUUsCisvKgorICAgICAgVUNPTF9ORVhUX0ZJUlNUX1BSSU1BUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9ORVhUX0xBU1RfUFJJTUFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX05FWFRfRklSU1RfU0VDT05EQVJZX0lHTk9SQUJMRSwKKyAgICAgIFVDT0xfTkVYVF9MQVNUX1NFQ09OREFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX05FWFRfRklSU1RfVEVSVElBUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9ORVhUX0xBU1RfVEVSVElBUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9ORVhUX0ZJUlNUX1ZBUklBQkxFLAorICAgICAgVUNPTF9ORVhUX0xBU1RfVkFSSUFCTEUsCisqLworCisgICAgICBQUklNQVJZX0lNUExJQ0lUX01JTiwKKyAgICAgIFBSSU1BUllfSU1QTElDSVRfTUFYCisgICAgfTsKKyNlbmRpZgorCisgICAgLy9wcmludGYoIkFsbG9jYXRpbmcgTGVhZEJ5dGVDb25zdGFudHNcbiIpOworICAgIExlYWRCeXRlQ29uc3RhbnRzIGxlYWRCeXRlQ29uc3RhbnRzOworICAgIHVwcnZfbWVtc2V0KCZsZWFkQnl0ZUNvbnN0YW50cywgMHgwMCwgc2l6ZW9mKExlYWRCeXRlQ29uc3RhbnRzKSk7CisgICAgCisgICAgbGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfTEVOR1RIID0gMjU2OworICAgIGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYID0gKFJlb3JkZXJJbmRleCopIHVwcnZfbWFsbG9jKGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0xFTkdUSCAqIHNpemVvZihSZW9yZGVySW5kZXgpKTsKKyAgICB1cHJ2X21lbXNldChsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWCwgMHgwMCwgbGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfTEVOR1RIICogc2l6ZW9mKFJlb3JkZXJJbmRleCkpOworICAgIGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfTEVOR1RIID0gMTAyNDsKKyAgICBsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBID0gKHVpbnQxNl90KikgdXBydl9tYWxsb2MobGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9MRU5HVEggKiBzaXplb2YodWludDE2X3QpKTsKKyAgICB1cHJ2X21lbXNldChsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBLCAweDAwLCBsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX0xFTkdUSCAqIHNpemVvZih1aW50MTZfdCkpOworICAgIC8vcHJpbnRmKCJcdEZpbmlzaGVkIEFsbG9jYXRpbmcgTGVhZEJ5dGVDb25zdGFudHNcbiIpOworICAgIAorICAgIGxlYWRCeXRlQ29uc3RhbnRzLkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYX0xFTkdUSCA9IDI1NjsKKyAgICBsZWFkQnl0ZUNvbnN0YW50cy5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWCA9ICh1aW50MTZfdCopIHVwcnZfbWFsbG9jKGxlYWRCeXRlQ29uc3RhbnRzLkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYX0xFTkdUSCAqIHNpemVvZih1aW50MTZfdCkpOworICAgIHVwcnZfbWVtc2V0KGxlYWRCeXRlQ29uc3RhbnRzLkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYLCAweDgwMDAgfCBVU0NSSVBUX0lOVkFMSURfQ09ERSwgbGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhfTEVOR1RIICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgbGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9MRU5HVEggPSAxMDI0OworICAgIGxlYWRCeXRlQ29uc3RhbnRzLkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEFfT0ZGU0VUID0gMTsgICAgIC8vIG9mZnNldCBieSAxIHRvIGxlYXZlIHplcm8gbG9jYXRpb24gZm9yIHRob3NlIGxlYWQgYnl0ZXMgd2l0aCBubyByZW9yZGVyIGNvZGVzCisgICAgbGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQSA9ICh1aW50MTZfdCopIHVwcnZfbWFsbG9jKGxlYWRCeXRlQ29uc3RhbnRzLkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEFfTEVOR1RIICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgdXBydl9tZW1zZXQobGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQSwgMHgwMCwgbGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9MRU5HVEggKiBzaXplb2YodWludDE2X3QpKTsKKworICAgIHVwcnZfbWVtc2V0KGludmVyc2VUYWJsZSwgMHhEQSwgc2l6ZW9mKGludDMyX3QpKjMqMHhGRkZGKTsKKworICAgIG9wdHMtPnZhcmlhYmxlVG9wVmFsdWUgPSAwOworICAgIG9wdHMtPnN0cmVuZ3RoID0gVUNPTF9URVJUSUFSWTsKKyAgICBvcHRzLT5mcmVuY2hDb2xsYXRpb24gPSBVQ09MX09GRjsKKyAgICBvcHRzLT5hbHRlcm5hdGVIYW5kbGluZyA9IFVDT0xfTk9OX0lHTk9SQUJMRTsgLyogYXR0cmlidXRlIGZvciBoYW5kbGluZyB2YXJpYWJsZSBlbGVtZW50cyovCisgICAgb3B0cy0+Y2FzZUZpcnN0ID0gVUNPTF9PRkY7ICAgICAgICAgLyogd2hvIGdvZXMgZmlyc3QsIGxvd2VyIGNhc2Ugb3IgdXBwZXJjYXNlICovCisgICAgb3B0cy0+Y2FzZUxldmVsID0gVUNPTF9PRkY7ICAgICAgICAgLyogZG8gd2UgaGF2ZSBhbiBleHRyYSBjYXNlIGxldmVsICovCisgICAgb3B0cy0+bm9ybWFsaXphdGlvbk1vZGUgPSBVQ09MX09GRjsgLyogYXR0cmlidXRlIGZvciBub3JtYWxpemF0aW9uICovCisgICAgb3B0cy0+aGlyYWdhbmFRID0gVUNPTF9PRkY7IC8qIGF0dHJpYnV0ZSBmb3IgSklTIFggNDA2MSwgdXNlZCBvbmx5IGluIEphcGFuZXNlICovCisgICAgb3B0cy0+bnVtZXJpY0NvbGxhdGlvbiA9IFVDT0xfT0ZGOworICAgIG15RC0+amFtb1NwZWNpYWwgPSBGQUxTRTsKKworICAgIHRlbXBVQ0FUYWJsZSAqdCA9IHVwcnZfdWNhX2luaXRUZW1wVGFibGUobXlELCBvcHRzLCBOVUxMLCBJTVBMSUNJVF9UQUcsIExFQURfU1VSUk9HQVRFX1RBRywgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBpbml0IFVDQSB0ZW1wIHRhYmxlOiAlc1xuIiwgdV9lcnJvck5hbWUoKnN0YXR1cykpOworICAgICAgICB1cHJ2X2ZyZWUob3B0cyk7CisgICAgICAgIHVwcnZfZnJlZShteUQpOworICAgICAgICBmY2xvc2UoZGF0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyAqIHNldCB0byB6ZXJvCisgICAgc3RydWN0IHsKKyAgICAgICAgVUNoYXIzMiBzdGFydDsKKyAgICAgICAgVUNoYXIzMiBlbmQ7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgfSByYW5nZXNbXSA9CisgICAgeworICAgICAgICB7MHhBQzAwLCAweEQ3QjAsIFVDT0xfU1BFQ0lBTF9GTEFHIHwgKEhBTkdVTF9TWUxMQUJMRV9UQUcgPDwgMjQpIH0sICAvLzAgSEFOR1VMX1NZTExBQkxFX1RBRywvKiBBQzAwLUQ3QUYqLworICAgICAgICAvL3sweEQ4MDAsIDB4REMwMCwgVUNPTF9TUEVDSUFMX0ZMQUcgfCAoTEVBRF9TVVJST0dBVEVfVEFHIDw8IDI0KSAgfSwgIC8vMSBMRUFEX1NVUlJPR0FURV9UQUcsIGFscmVhZHkgc2V0IGluIHV0cmllX29wZW4oKSAvKiBEODAwLURCRkYqLworICAgICAgICB7MHhEQzAwLCAweEUwMDAsIFVDT0xfU1BFQ0lBTF9GTEFHIHwgKFRSQUlMX1NVUlJPR0FURV9UQUcgPDwgMjQpIH0sICAvLzIgVFJBSUxfU1VSUk9HQVRFIERDMDAtREZGRgorICAgICAgICAvLyBOb3cgZGlyZWN0bHkgaGFuZGxlZCBpbiB0aGUgY29sbGF0aW9uIGNvZGUgYnkgdGhlIHN3YXBDSksgZnVuY3Rpb24uCisgICAgICAgIC8vezB4MzQwMCwgMHg0REI2LCBVQ09MX1NQRUNJQUxfRkxBRyB8IChDSktfSU1QTElDSVRfVEFHIDw8IDI0KSAgICB9LCAgLy8zIENKS19JTVBMSUNJVF9UQUcsICAgLyogMHgzNDAwLTB4NERCNSovCisgICAgICAgIC8vezB4NEUwMCwgMHg5RkE2LCBVQ09MX1NQRUNJQUxfRkxBRyB8IChDSktfSU1QTElDSVRfVEFHIDw8IDI0KSAgICB9LCAgLy80IENKS19JTVBMSUNJVF9UQUcsICAgLyogMHg0RTAwLTB4OUZBNSovCisgICAgICAgIC8vezB4RjkwMCwgMHhGQTJFLCBVQ09MX1NQRUNJQUxfRkxBRyB8IChDSktfSU1QTElDSVRfVEFHIDw8IDI0KSAgICB9LCAgLy81IENKS19JTVBMSUNJVF9UQUcsICAgLyogMHhGOTAwLTB4RkEyRCovCisgICAgICAgIC8vezB4MjAwMDAsIDB4MkE2RDcsIFVDT0xfU1BFQ0lBTF9GTEFHIHwgKENKS19JTVBMSUNJVF9UQUcgPDwgMjQpICB9LCAgLy82IENKS19JTVBMSUNJVF9UQUcsICAgLyogMHgyMDAwMC0weDJBNkQ2Ki8KKyAgICAgICAgLy97MHgyRjgwMCwgMHgyRkExRSwgVUNPTF9TUEVDSUFMX0ZMQUcgfCAoQ0pLX0lNUExJQ0lUX1RBRyA8PCAyNCkgIH0sICAvLzcgQ0pLX0lNUExJQ0lUX1RBRywgICAvKiAweDJGODAwLTB4MkZBMUQqLworICAgIH07CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGk8c2l6ZW9mKHJhbmdlcykvc2l6ZW9mKHJhbmdlc1swXSk7IGkrKykgeworICAgICAgLyp1Y21wZTMyX3NldFJhbmdlMzIodC0+bWFwcGluZywgcmFuZ2VzW2ldLnN0YXJ0LCByYW5nZXNbaV0uZW5kLCByYW5nZXNbaV0udmFsdWUpOyAqLworICAgICAgdXRyaWVfc2V0UmFuZ2UzMih0LT5tYXBwaW5nLCByYW5nZXNbaV0uc3RhcnQsIHJhbmdlc1tpXS5lbmQsIHJhbmdlc1tpXS52YWx1ZSwgVFJVRSk7CisgICAgfQorCisKKyAgICBpbnQzMl90IHN1cnJvZ2F0ZUNvdW50ID0gMDsKKyAgICB3aGlsZSghZmVvZihkYXRhKSkgeworICAgICAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU29tZXRoaW5nIHJldHVybmVkIGFuIGVycm9yICVpICglcykgd2hpbGUgcHJvY2Vzc2luZyBsaW5lICV1IG9mICVzLiBFeGl0aW5nLi4uXG4iLAorICAgICAgICAgICAgICAgICpzdGF0dXMsIHVfZXJyb3JOYW1lKCpzdGF0dXMpLCAoaW50KWxpbmUsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGV4aXQoKnN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBsaW5lKys7CisgICAgICAgIGlmKGJlVmVyYm9zZSkgeworICAgICAgICAgIHByaW50ZigiJXUgIiwgKGludClsaW5lKTsKKyAgICAgICAgfQorICAgICAgICBlbGVtZW50ID0gcmVhZEFuRWxlbWVudChkYXRhLCB0LCAmY29uc3RzLCAmbGVhZEJ5dGVDb25zdGFudHMsIHN0YXR1cyk7CisgICAgICAgIGlmKGVsZW1lbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gd2UgaGF2ZSByZWFkIHRoZSBsaW5lLCBub3cgZG8gc29tZXRoaW5nIHNlbnNpYmxlIHdpdGggdGhlIHJlYWQgZGF0YSEKKworICAgICAgICAgICAgLy8gaWYgZWxlbWVudCBpcyBhIGNvbnRyYWN0aW9uLCB3ZSB3YW50IHRvIGFkZCBpdCB0byBjb250cmFjdGlvbnNbXQorICAgICAgICAgICAgaW50MzJfdCBsZW5ndGggPSAoaW50MzJfdCllbGVtZW50LT5jU2l6ZTsKKyAgICAgICAgICAgIGlmKGxlbmd0aCA+IDEgJiYgZWxlbWVudC0+Y1BvaW50c1swXSAhPSAweEZERDApIHsgLy8gdGhpcyBpcyBhIGNvbnRyYWN0aW9uCisgICAgICAgICAgICAgIGlmKFUxNl9JU19MRUFEKGVsZW1lbnQtPmNQb2ludHNbMF0pICYmIFUxNl9JU19UUkFJTChlbGVtZW50LT5jUG9pbnRzWzFdKSAmJiBsZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgIHN1cnJvZ2F0ZUNvdW50Kys7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYobm9PZkNvbnRyYWN0aW9ucz49TUFYX1VDQV9DT05UUkFDVElPTlMpIHsKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5Nb3JlIHRoYW4gJWQgY29udHJhY3Rpb25zLiBQbGVhc2UgaW5jcmVhc2UgTUFYX1VDQV9DT05UUkFDVElPTlMgaW4gZ2VudWNhLmNwcC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdGluZy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClNQVhfVUNBX0NPTlRSQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobGVuZ3RoID4gTUFYX1VDQV9DT05UUkFDVElPTl9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5MaW5lICVkOiBDb250cmFjdGlvbiBvZiBsZW5ndGggJWQgaXMgdG9vIGxvbmcuIFBsZWFzZSBpbmNyZWFzZSBNQVhfVUNBX0NPTlRSQUNUSU9OX0xFTkdUSCBpbiBnZW51Y2EuY3BwLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0aW5nLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWxpbmUsIChpbnQpbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgIGV4aXQoVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBVQ2hhciAqdCA9ICZjb250cmFjdGlvbnNbbm9PZkNvbnRyYWN0aW9uc11bMF07CisgICAgICAgICAgICAgICAgdV9tZW1jcHkodCwgZWxlbWVudC0+Y1BvaW50cywgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB0ICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBmb3IoOyBsZW5ndGggPCBNQVhfVUNBX0NPTlRSQUNUSU9OX0xFTkdUSDsgKytsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgKnQrKyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vT2ZDb250cmFjdGlvbnMrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAoY2xhaXJlaG8pOiBkb2VzIHRoaXMgd29yaz8gTmVlZCBtb3JlIHRlc3RzCisgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHRvIGhhbmRsZSB0aGUgVUNBIHByZS1jb250ZXh0IHJ1bGVzCisgICAgICAgICAgICAgICAgLy8gZm9yIEwvbCB3aXRoIG1pZGRsZSBkb3QuIFdlIHNoYXJlIHRoZSBzdHJ1Y3R1cmVzIGZvciBjb250cmFjdGlvbkNvbWJvcy4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZm9ybWF0IGZvciBwcmUtY29udGV4dCBjaGFyYWN0ZXIgaXMKKyAgICAgICAgICAgICAgICAvLyBjb250cmFjdGlvbnNbMF06IGNvZGVwb2ludCBpbiBlbGVtZW50LT5jUG9pbnRzWzBdCisgICAgICAgICAgICAgICAgLy8gY29udHJhY3Rpb25zWzFdOiAnXDAnIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhIGNvbnRyYWN0aW9uCisgICAgICAgICAgICAgICAgLy8gY29udHJhY3Rpb25zWzJdOiBwcmVmaXggY2hhcgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LT5wcmVmaXhTaXplPjApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobGVuZ3RoID4gMSB8fCBlbGVtZW50LT5wcmVmaXhTaXplID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbkxpbmUgJWQ6IENoYXJhY3RlciB3aXRoIHByZWZpeCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWl0aGVyIHRvbyBtYW55IGNoYXJhY3RlcnMgb3IgcHJlZml4IHRvbyBsb25nLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihub09mQ29udHJhY3Rpb25zPj1NQVhfVUNBX0NPTlRSQUNUSU9OUykgeworICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuTW9yZSB0aGFuICVkIGNvbnRyYWN0aW9ucy4gUGxlYXNlIGluY3JlYXNlIE1BWF9VQ0FfQ09OVFJBQ1RJT05TIGluIGdlbnVjYS5jcHAuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGl0aW5nLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClNQVhfVUNBX0NPTlRSQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVUNoYXIgKnQgPSAmY29udHJhY3Rpb25zW25vT2ZDb250cmFjdGlvbnNdWzBdOworICAgICAgICAgICAgICAgICAgICB0WzBdPWVsZW1lbnQtPmNQb2ludHNbMF07CisgICAgICAgICAgICAgICAgICAgIHRbMV09MDsKKyAgICAgICAgICAgICAgICAgICAgdFsyXT1lbGVtZW50LT5wcmVmaXhDaGFyc1swXTsKKyAgICAgICAgICAgICAgICAgICAgdCArPSAzOworICAgICAgICAgICAgICAgICAgICBmb3IobGVuZ3RoID0gMzsgbGVuZ3RoIDwgTUFYX1VDQV9DT05UUkFDVElPTl9MRU5HVEg7ICsrbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdCsrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub09mQ29udHJhY3Rpb25zKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB3ZSdyZSBmaXJzdCBhZGRpbmcgdG8gaW52ZXJzZSwgYmVjYXVzZSBhZGRBbkVsZW1lbnQgd2lsbCByZXZlcnNlIHRoZSBvcmRlciAqLworICAgICAgICAgICAgLyogb2YgY29kZSBwb2ludHMgYW5kIHN0dWZmLi4uIHdlIGRvbid0IHdhbnQgdGhhdCB0byBoYXBwZW4gKi8KKyAgICAgICAgICAgIGlmKChlbGVtZW50LT5DRXNbMF0gPj4gMjQpICE9IDIpIHsKKyAgICAgICAgICAgICAgICAvLyBBZGQgZXZlcnkgZWxlbWVudCBleGNlcHQgZm9yIHRoZSBzcGVjaWFsIG1pbmltdW0td2VpZ2h0IGNoYXJhY3RlciBVK0ZGRkUKKyAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgMDIgd2VpZ2h0cy4KKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYWQgMDIgd2VpZ2h0cyBpbiB0aGUgaW52dWNhIHRhYmxlLCB0aGVuIHRhaWxvcmluZyBwcmltYXJ5CisgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgYW4gaWdub3JhYmxlIHdvdWxkIHRyeSB0byBwdXQgYSB3ZWlnaHQgYmVmb3JlIDAyIHdoaWNoIGlzIG5vdCB2YWxpZC4KKyAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCBmaXggdGhpcyBpbiBhIGNvbXBsaWNhdGVkIHdheSBpbiB0aGUgZnJvbS1ydWxlLXN0cmluZyBidWlsZGVyLAorICAgICAgICAgICAgICAgIC8vIGJ1dCBvbWl0dGluZyB0aGlzIHNwZWNpYWwgZWxlbWVudCBmcm9tIGludnVjYSBpcyBzaW1wbGUgYW5kIGVmZmVjdGl2ZS4KKyAgICAgICAgICAgICAgICBhZGRUb0ludmVyc2UoZWxlbWVudCwgc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCEobGVuZ3RoID4gMSAmJiBlbGVtZW50LT5jUG9pbnRzWzBdID09IDB4RkREMCkpIHsKKyAgICAgICAgICAgICAgdXBydl91Y2FfYWRkQW5FbGVtZW50KHQsIGVsZW1lbnQsIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihVQ0FWZXJzaW9uWzBdID09IDAgJiYgVUNBVmVyc2lvblsxXSA9PSAwICYmIFVDQVZlcnNpb25bMl0gPT0gMCAmJiBVQ0FWZXJzaW9uWzNdID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVQ0EgdmVyc2lvbiBub3Qgc3BlY2lmaWVkLiBDYW5ub3QgY3JlYXRlIGRhdGEgZmlsZSFcbiIpOworICAgICAgICB1cHJ2X3VjYV9jbG9zZVRlbXBUYWJsZSh0KTsKKyAgICAgICAgdXBydl9mcmVlKG9wdHMpOworICAgICAgICB1cHJ2X2ZyZWUobXlEKTsKKyAgICAgICAgZmNsb3NlKGRhdGEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorLyogICAgeworICAgICAgICB1aW50MzJfdCB0cmllV29yZCA9IHV0cmllX2dldDMyKHQtPm1hcHBpbmcsIDB4REMwMSwgTlVMTCk7CisgICAgfSovCisKKyAgICBpZiAoYmVWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiXG5MaW5lcyByZWFkOiAldVxuIiwgKGludClsaW5lKTsKKyAgICAgICAgcHJpbnRmKCJTdXJyb2dhdGUgY291bnQ6ICVpXG4iLCAoaW50KXN1cnJvZ2F0ZUNvdW50KTsKKyAgICAgICAgcHJpbnRmKCJSYXcgZGF0YSBicmVha2Rvd246XG4iKTsKKyAgICAgICAgLypwcmludGYoIkNvbXBhY3QgYXJyYXkgc3RhZ2UxIHRvcDogJWksIHN0YWdlMiB0b3A6ICVpXG4iLCB0LT5tYXBwaW5nLT5zdGFnZTFUb3AsIHQtPm1hcHBpbmctPnN0YWdlMlRvcCk7Ki8KKyAgICAgICAgcHJpbnRmKCJOdW1iZXIgb2YgY29udHJhY3Rpb25zOiAldVxuIiwgKGludClub09mQ29udHJhY3Rpb25zKTsKKyAgICAgICAgcHJpbnRmKCJDb250cmFjdGlvbiBpbWFnZSBzaXplOiAldVxuIiwgKGludCl0LT5pbWFnZS0+Y29udHJhY3Rpb25TaXplKTsKKyAgICAgICAgcHJpbnRmKCJFeHBhbnNpb25zIHNpemU6ICVpXG4iLCAoaW50KXQtPmV4cGFuc2lvbnMtPnBvc2l0aW9uKTsKKyAgICB9CisKKworICAgIC8qIHByb2R1Y2UgY2Fub25pY2FsIGNsb3N1cmUgZm9yIHRhYmxlICovCisgICAgLyogZmlyc3Qgc2V0IHVwIGNvbnN0YW50cyBmb3IgaW1wbGljaXQgY2FsY3VsYXRpb24gKi8KKyAgICB1cHJ2X3VjYV9pbml0SW1wbGljaXRDb25zdGFudHMoc3RhdHVzKTsKKyAgICAvKiBkbyB0aGUgY2xvc3VyZSAqLworICAgIFVuaWNvZGVTZXQgY2xvc2VkOworICAgIGludDMyX3Qgbm9PZkNsb3N1cmVzID0gdXBydl91Y2FfY2Fub25pY2FsQ2xvc3VyZSh0LCBOVUxMLCAmY2xvc2VkLCBzdGF0dXMpOworICAgIGlmKG5vT2ZDbG9zdXJlcyAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogJWkgY2Fub25pY2FsIGNsb3N1cmVzIG9jY3VyZWQhXG4iLCAoaW50KW5vT2ZDbG9zdXJlcyk7CisgICAgICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKKyAgICAgICAgc3RkOjpzdHJpbmcgdXRmODsKKyAgICAgICAgY2xvc2VkLnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKS50b1VURjhTdHJpbmcodXRmOCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVVRGLTggcGF0dGVybiBzdHJpbmc6ICVzXG4iLCB1dGY4LmNfc3RyKCkpOworICAgIH0KKworICAgIC8qIHRlc3QgKi8KKyAgICBVQ0FUYWJsZUhlYWRlciAqbXlEYXRhID0gdXBydl91Y2FfYXNzZW1ibGVUYWJsZSh0LCBzdGF0dXMpOyAgCisKKyAgICBpZiAoYmVWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiQ29tcGFjdGVkIGRhdGEgYnJlYWtkb3duOlxuIik7CisgICAgICAgIC8qcHJpbnRmKCJDb21wYWN0IGFycmF5IHN0YWdlMSB0b3A6ICVpLCBzdGFnZTIgdG9wOiAlaVxuIiwgdC0+bWFwcGluZy0+c3RhZ2UxVG9wLCB0LT5tYXBwaW5nLT5zdGFnZTJUb3ApOyovCisgICAgICAgIHByaW50ZigiTnVtYmVyIG9mIGNvbnRyYWN0aW9uczogJXVcbiIsIChpbnQpbm9PZkNvbnRyYWN0aW9ucyk7CisgICAgICAgIHByaW50ZigiQ29udHJhY3Rpb24gaW1hZ2Ugc2l6ZTogJXVcbiIsIChpbnQpdC0+aW1hZ2UtPmNvbnRyYWN0aW9uU2l6ZSk7CisgICAgICAgIHByaW50ZigiRXhwYW5zaW9ucyBzaXplOiAlaVxuIiwgKGludCl0LT5leHBhbnNpb25zLT5wb3NpdGlvbik7CisgICAgfQorCisgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgdGFibGU6ICVzXG4iLCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgIHVwcnZfdWNhX2Nsb3NlVGVtcFRhYmxlKHQpOworICAgICAgICB1cHJ2X2ZyZWUob3B0cyk7CisgICAgICAgIHVwcnZfZnJlZShteUQpOworICAgICAgICBmY2xvc2UoZGF0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBwb3B1bGF0ZSB0aGUgdmVyc2lvbiBpbmZvIHN0cnVjdCB3aXRoIHZlcnNpb24gaW5mbyovCisgICAgbXlEYXRhLT52ZXJzaW9uWzBdID0gVUNPTF9CVUlMREVSX1ZFUlNJT047CisgICAgbXlEYXRhLT52ZXJzaW9uWzFdID0gVUNBVmVyc2lvblswXTsKKyAgICBteURhdGEtPnZlcnNpb25bMl0gPSBVQ0FWZXJzaW9uWzFdOworICAgIG15RGF0YS0+dmVyc2lvblszXSA9IFVDQVZlcnNpb25bMl07CisgICAgLypUT0RPOlRoZSBmcmFjdGlvbmFsIHJ1bGVzIHZlcnNpb24gc2hvdWxkIGJlIHRha2VuIGZyb20gRnJhY3Rpb25hbFVDQS50eHQqLworICAgIC8vIFJlbW92ZWQgdGhpcyBtYWNyby4gSW5zdGVhZCwgd2UgdXNlIHRoZSBmaWVsZHMgYmVsb3cKKyAgICAvL215RC0+dmVyc2lvblsxXSA9IFVDT0xfRlJBQ1RJT05BTF9VQ0FfVkVSU0lPTjsKKyAgICAvL215RC0+VUNBVmVyc2lvbiA9IFVDQVZlcnNpb247IC8vIG91dCBvZiBGcmFjdGlvbmFsVUNBLnR4dAorICAgIHVwcnZfbWVtY3B5KG15RGF0YS0+VUNBVmVyc2lvbiwgVUNBVmVyc2lvbiwgc2l6ZW9mKFVWZXJzaW9uSW5mbykpOworICAgIHVfZ2V0VW5pY29kZVZlcnNpb24obXlEYXRhLT5VQ0RWZXJzaW9uKTsKKworICAgIHdyaXRlT3V0RGF0YShteURhdGEsICZjb25zdHMsICZsZWFkQnl0ZUNvbnN0YW50cywgY29udHJhY3Rpb25zLCBub09mQ29udHJhY3Rpb25zLCBvdXRwdXREaXIsIGNvcHlyaWdodCwgc3RhdHVzKTsKKworICAgIEludmVyc2VVQ0FUYWJsZUhlYWRlciAqaW52ZXJzZSA9IGFzc2VtYmxlSW52ZXJzZVRhYmxlKHN0YXR1cyk7CisgICAgdXBydl9tZW1jcHkoaW52ZXJzZS0+VUNBVmVyc2lvbiwgVUNBVmVyc2lvbiwgc2l6ZW9mKFVWZXJzaW9uSW5mbykpOworICAgIHdyaXRlT3V0SW52ZXJzZURhdGEoaW52ZXJzZSwgb3V0cHV0RGlyLCBjb3B5cmlnaHQsIHN0YXR1cyk7CisKKyAgICB1cHJ2X3VjYV9jbG9zZVRlbXBUYWJsZSh0KTsKKyAgICB1cHJ2X2ZyZWUobXlEKTsKKyAgICB1cHJ2X2ZyZWUob3B0cyk7CisKKyAgICB1cHJ2X2ZyZWUobXlEYXRhKTsKKyAgICB1cHJ2X2ZyZWUoaW52ZXJzZSk7CisgICAgCisgICAgdXBydl9mcmVlKGxlYWRCeXRlQ29uc3RhbnRzLkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYKTsKKyAgICB1cHJ2X2ZyZWUobGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQSk7CisgICAgdXBydl9mcmVlKGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYKTsKKyAgICB1cHJ2X2ZyZWUobGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfREFUQSk7CisgICAgCisgICAgZmNsb3NlKGRhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAjaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OICovCisKK2VudW0geworICAgIEhFTFBfSCwKKyAgICBIRUxQX1FVRVNUSU9OX01BUkssCisgICAgQ09QWVJJR0hULAorICAgIFZFUlNJT04sCisgICAgVkVSQk9TRSwKKyAgICBJQ1VEQVRBRElSCit9OworCisvKiBLZWVwIHRoZXNlIHZhbHVlcyBpbiBzeW5jIHdpdGggdGhlIGFib3ZlIGVudW1zICovCitzdGF0aWMgVU9wdGlvbiBvcHRpb25zW109eworICAgIFVPUFRJT05fSEVMUF9ILAorICAgIFVPUFRJT05fSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFVPUFRJT05fQ09QWVJJR0hULAorICAgIFVPUFRJT05fVkVSU0lPTiwKKyAgICBVT1BUSU9OX1ZFUkJPU0UsCisgICAgVU9QVElPTl9JQ1VEQVRBRElSCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgdXBydl9tZW1zZXQoJlVDQVZlcnNpb24sIDAsIDQpOworCisgICAgVV9NQUlOX0lOSVRfQVJHUyhhcmdjLCBhcmd2KTsKKyAgICBhcmdjPXVfcGFyc2VBcmdzKGFyZ2MsIGFyZ3YsIExFTkdUSE9GKG9wdGlvbnMpLCBvcHRpb25zKTsKKworICAgIC8qIGVycm9yIGhhbmRsaW5nLCBwcmludGluZyB1c2FnZSBtZXNzYWdlICovCisgICAgaWYoYXJnYzwwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgImVycm9yIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudCBcIiVzXCJcbiIsCisgICAgICAgICAgICBhcmd2Wy1hcmdjXSk7CisgICAgfQorICAgIGlmKGFyZ2M8MiB8fCBvcHRpb25zW0hFTFBfSF0uZG9lc09jY3VyIHx8IG9wdGlvbnNbSEVMUF9RVUVTVElPTl9NQVJLXS5kb2VzT2NjdXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAidXNhZ2U6ICVzIFstb3B0aW9uc10gcGF0aC90by9JQ1Uvc3JjL3Jvb3RcbiIKKyAgICAgICAgICAgICJcdFJlYWQgaW4gVUNBIGNvbGxhdGlvbiB0ZXh0IGRhdGEgYW5kIHdyaXRlIG91dCB0aGUgYmluYXJ5IGNvbGxhdGlvbiBkYXRhXG4iCisgICAgICAgICAgICAib3B0aW9uczpcbiIKKyAgICAgICAgICAgICJcdC1oIG9yIC0/IG9yIC0taGVscCAgdGhpcyB1c2FnZSB0ZXh0XG4iCisgICAgICAgICAgICAiXHQtViBvciAtLXZlcnNpb24gICAgIHNob3cgYSB2ZXJzaW9uIG1lc3NhZ2VcbiIKKyAgICAgICAgICAgICJcdC1jIG9yIC0tY29weXJpZ2h0ICAgaW5jbHVkZSBhIGNvcHlyaWdodCBub3RpY2VcbiIKKyAgICAgICAgICAgICJcdC12IG9yIC0tdmVyYm9zZSAgICAgdHVybiBvbiB2ZXJib3NlIG91dHB1dFxuIgorICAgICAgICAgICAgIlx0LWkgb3IgLS1pY3VkYXRhZGlyICBkaXJlY3RvcnkgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgaW50ZXJtZWRpYXRlIGRhdGEgZmlsZXMsXG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHBhdGgsIGRlZmF1bHRzIHRvICVzXG4iLAorICAgICAgICAgICAgYXJndlswXSwgdV9nZXREYXRhRGlyZWN0b3J5KCkpOworICAgICAgICByZXR1cm4gYXJnYzwyID8gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIDogVV9aRVJPX0VSUk9SOworICAgIH0KKyAgICBpZihvcHRpb25zW1ZFUlNJT05dLmRvZXNPY2N1cikgeworICAgICAgICBwcmludGYoImdlbnVjYSB2ZXJzaW9uICVodS4laHUsIElDVSB0b29sIHRvIHJlYWQgVUNBIHRleHQgZGF0YSBhbmQgY3JlYXRlIFVDQSBkYXRhIHRhYmxlcyBmb3IgY29sbGF0aW9uLlxuIiwKKyNpZiBVQ09ORklHX05PX0NPTExBVElPTgorICAgICAgICAgICAgMCwgMAorI2Vsc2UKKyAgICAgICAgICAgIFVDQV9GT1JNQVRfVkVSU0lPTl8wLCBVQ0FfRk9STUFUX1ZFUlNJT05fMQorI2VuZGlmCisgICAgICAgICAgICApOworICAgICAgICBwcmludGYoVV9DT1BZUklHSFRfU1RSSU5HIlxuIik7CisgICAgICAgIGV4aXQoMCk7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBvcHRpb25zIHZhbHVlcyAqLworICAgIGJlVmVyYm9zZSA9IG9wdGlvbnNbVkVSQk9TRV0uZG9lc09jY3VyOworCisgICAgY29uc3QgY2hhciAqY29weXJpZ2h0ID0gTlVMTDsKKyAgICBpZiAob3B0aW9uc1tDT1BZUklHSFRdLmRvZXNPY2N1cikgeworICAgICAgICBjb3B5cmlnaHQgPSBVX0NPUFlSSUdIVF9TVFJJTkc7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnNbSUNVREFUQURJUl0uZG9lc09jY3VyKSB7CisgICAgICAgIHVfc2V0RGF0YURpcmVjdG9yeShvcHRpb25zW0lDVURBVEFESVJdLnZhbHVlKTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBJQ1UgKi8KKyAgICBJY3VUb29sRXJyb3JDb2RlIGVycm9yQ29kZSgiZ2VudWNhIik7CisgICAgdV9pbml0KGVycm9yQ29kZSk7CisgICAgaWYgKGVycm9yQ29kZS5pc0ZhaWx1cmUoKSAmJiBlcnJvckNvZGUuZ2V0KCkgIT0gVV9GSUxFX0FDQ0VTU19FUlJPUikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4gbm90IGluaXRpYWxpemUgSUNVLiAgc3RhdHVzID0gJXNcbiIsCisgICAgICAgICAgICBhcmd2WzBdLCBlcnJvckNvZGUuZXJyb3JOYW1lKCkpOworICAgICAgICBleGl0KGVycm9yQ29kZS5yZXNldCgpKTsKKyAgICB9CisgICAgZXJyb3JDb2RlLnJlc2V0KCk7CisKKyAgICBDaGFyU3RyaW5nIGljdVNyY1Jvb3QoYXJndlsxXSwgZXJyb3JDb2RlKTsKKworICAgIENoYXJTdHJpbmcgaWN1U291cmNlRGF0YShpY3VTcmNSb290LCBlcnJvckNvZGUpOworICAgIGljdVNvdXJjZURhdGEuYXBwZW5kUGF0aFBhcnQoInNvdXJjZSIsIGVycm9yQ29kZSk7CisgICAgaWN1U291cmNlRGF0YS5hcHBlbmRQYXRoUGFydCgiZGF0YSIsIGVycm9yQ29kZSk7CisKKyAgICBDaGFyU3RyaW5nIHNyY0RpcihpY3VTb3VyY2VEYXRhLCBlcnJvckNvZGUpOworICAgIHNyY0Rpci5hcHBlbmRQYXRoUGFydCgidW5pZGF0YSIsIGVycm9yQ29kZSk7CisKKyAgICBDaGFyU3RyaW5nIGRlc3REaXIoaWN1U291cmNlRGF0YSwgZXJyb3JDb2RlKTsKKyAgICBkZXN0RGlyLmFwcGVuZFBhdGhQYXJ0KCJpbiIsIGVycm9yQ29kZSk7CisgICAgZGVzdERpci5hcHBlbmRQYXRoUGFydCgiY29sbCIsIGVycm9yQ29kZSk7CisKKyAgICBDaGFyU3RyaW5nIHVjYUZpbGUoc3JjRGlyLCBlcnJvckNvZGUpOworICAgIHVjYUZpbGUuYXBwZW5kUGF0aFBhcnQoIkZyYWN0aW9uYWxVQ0EudHh0IiwgZXJyb3JDb2RlKTsKKworICAgIGlmKGVycm9yQ29kZS5pc0ZhaWx1cmUoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnVjYTogdW5hYmxlIHRvIGJ1aWxkIGZpbGUgcGF0aHMgLSAlc1xuIiwKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUuZXJyb3JOYW1lKCkpOworICAgICAgICByZXR1cm4gZXJyb3JDb2RlLnJlc2V0KCk7CisgICAgfQorCisjaWYgVUNPTkZJR19OT19DT0xMQVRJT04KKworICAgIFVOZXdEYXRhTWVtb3J5ICpwRGF0YTsKKyAgICBjb25zdCBjaGFyICptc2c7CisgICAgCisgICAgbXNnID0gImdlbnVjYSB3cml0ZXMgZHVtbXkgIiBVQ0FfREFUQV9OQU1FICIuIiBVQ0FfREFUQV9UWVBFICIgYmVjYXVzZSBvZiBVQ09ORklHX05PX0NPTExBVElPTiwgc2VlIHVjb25maWcuaCI7CisgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKTsKKyAgICBwRGF0YSA9IHVkYXRhX2NyZWF0ZShkZXN0RGlyLmRhdGEoKSwgVUNBX0RBVEFfVFlQRSwgVUNBX0RBVEFfTkFNRSwgJmR1bW15RGF0YUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZXJyb3JDb2RlKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBtc2csIHN0cmxlbihtc2cpKTsKKyAgICB1ZGF0YV9maW5pc2gocERhdGEsIGVycm9yQ29kZSk7CisKKyAgICBtc2cgPSAiZ2VudWNhIHdyaXRlcyBkdW1teSAiIElOVkNfREFUQV9OQU1FICIuIiBJTlZDX0RBVEFfVFlQRSAiIGJlY2F1c2Ugb2YgVUNPTkZJR19OT19DT0xMQVRJT04sIHNlZSB1Y29uZmlnLmgiOworICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7CisgICAgcERhdGEgPSB1ZGF0YV9jcmVhdGUoZGVzdERpci5kYXRhKCksIElOVkNfREFUQV9UWVBFLCBJTlZDX0RBVEFfTkFNRSwgJmR1bW15RGF0YUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZXJyb3JDb2RlKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBtc2csIHN0cmxlbihtc2cpKTsKKyAgICB1ZGF0YV9maW5pc2gocERhdGEsIGVycm9yQ29kZSk7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlLnJlc2V0KCk7CisKKyNlbHNlCisKKyAgICByZXR1cm4gd3JpdGVfdWNhX3RhYmxlKHVjYUZpbGUuZGF0YSgpLCBkZXN0RGlyLmRhdGEoKSwgY29weXJpZ2h0LCBlcnJvckNvZGUpOworCisjZW5kaWYKK30KKworLyoKKyAqIEhleSwgRW1hY3MsIHBsZWFzZSBzZXQgdGhlIGZvbGxvd2luZzoKKyAqCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqCisgKi8KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLmggYi91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGU2NjkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW51Y2EuaAorKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisqICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246NAorKgorKiAgIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiBYWCBjZW50dXJ5CisqICAgY3JlYXRlZCBieTogVmxhZGltaXIgV2VpbnN0ZWluCisqCisqICAgVGhpcyBwcm9ncmFtIHJlYWRzIHRoZSBGcmFuY3Rpb25hbCBVQ0EgdGFibGUgYW5kIGdlbmVyYXRlcworKiAgIGludGVybmFsIGZvcm1hdCBmb3IgVUNBIHRhYmxlIGFzIHdlbGwgYXMgaW52ZXJzZSBVQ0EgdGFibGUuCisqICAgSXQgdGhlbiB3cml0ZXMgYmluYXJ5IGZpbGVzIGNvbnRhaW5pbmcgdGhlIGRhdGE6IHVjYWRhdGEuZGF0IAorKiAgICYgaW52dWNhLmRhdAorKi8KKworI2lmbmRlZiBVQ0FEQVRBX0gKKyNkZWZpbmUgVUNBREFUQV9ICisKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorCisjaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OCisKKyNpbmNsdWRlICJ1Y29sX2VsbS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidWNvbF9pbXAuaCIKKyNpbmNsdWRlICJ1aGFzaC5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisKKwordm9pZCBkZWxldGVFbGVtZW50KHZvaWQgKmVsZW1lbnQpOworaW50MzJfdCByZWFkRWxlbWVudChjaGFyICoqZnJvbSwgY2hhciAqdG8sIGNoYXIgc2VwYXJhdG9yLCBVRXJyb3JDb2RlICpzdGF0dXMpOwordWludDMyX3QgZ2V0U2luZ2xlQ0VWYWx1ZShjaGFyICpwcmltYXJ5LCBjaGFyICpzZWNvbmRhcnksIGNoYXIgKnRlcnRpYXJ5LCBVQm9vbCBjYXNlQml0LCBVRXJyb3JDb2RlICpzdGF0dXMpOwordm9pZCBwcmludE91dFRhYmxlKFVDQVRhYmxlSGVhZGVyICpteURhdGEsIFVFcnJvckNvZGUgKnN0YXR1cyk7CitVQ0FFbGVtZW50cyAqcmVhZEFuRWxlbWVudChGSUxFICpkYXRhLCB0ZW1wVUNBVGFibGUgKnQsIFVDQUNvbnN0YW50cyAqY29uc3RzLCBVRXJyb3JDb2RlICpzdGF0dXMpOworCisjZW5kaWYgLyogI2lmICFVQ09ORklHX05PX0NPTExBVElPTiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLnZjcHJvaiBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU2MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9nZW51Y2EudmNwcm9qCkBAIC0wLDAgKzEsNDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOS4wMCIKKwlOYW1lPSJnZW51Y2EiCisJUHJvamVjdEdVSUQ9Ins4NjgyOTY5NC1BMzc1LTRDNTgtQjRFQS05NkVGNTE0RTMyMjV9IgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJ4NjQiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluJiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpblwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4ODZcRGVidWcvZ2VudWNhLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlwuLlxpMThuOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XERlYnVnL2dlbnVjYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg4NlxEZWJ1Zy8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg4NlxEZWJ1Zy8iCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4ODZcRGVidWcvZ2VudWNhLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg4NlxEZWJ1Zy9nZW51Y2EucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJCVVzZUZBVDMyV29ya2Fyb3VuZD0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XFJlbGVhc2UvZ2VudWNhLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXC4uXGkxOG47Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnVjYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg4NlxSZWxlYXNlLyIKKwkJCQlPYmplY3RGaWxlPSIuXHg4NlxSZWxlYXNlLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4ODZcUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VudWNhLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VudWNhLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg2NFxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4NjRcRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcRGVidWcvZ2VudWNhLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlwuLlxpMThuOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU42NDtXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XERlYnVnL2dlbnVjYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg2NFxEZWJ1Zy8iCisJCQkJT2JqZWN0RmlsZT0iLlx4NjRcRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg2NFxEZWJ1Zy8iCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4NjRcRGVidWcvZ2VudWNhLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg2NFxEZWJ1Zy9nZW51Y2EucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkJVXNlRkFUMzJXb3JrYXJvdW5kPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcUmVsZWFzZS9nZW51Y2EudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cLi5caTE4bjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lONjQ7V0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VudWNhLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDY0XFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg2NFxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4NjRcUmVsZWFzZS9nZW51Y2EuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4NjRcUmVsZWFzZS9nZW51Y2EucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnZW51Y2EuY3BwIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdlbnVjYS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisJCQk+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnV0czQ2L0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL2dlbnV0czQ2L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzc4MmUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VudXRzNDYvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisjIGVkaXRlZCBvbjogMjAxMGp1bDIwCisjIGVkaXRlZCBieTogU3R1YXJ0IEcuIEdpbGwKK2FkZF9leGVjdXRhYmxlKGdlbnV0czQ2IGdlbnV0czQ2LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhnZW51dHM0NiBpY3V1YyBpY3V0dSkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51dHM0Ni9nZW51dHM0Ni5jcHAgYi91bmljb2RlL2MvZ2VudXRzNDYvZ2VudXRzNDYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODY0N2EKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VudXRzNDYvZ2VudXRzNDYuY3BwCkBAIC0wLDAgKzEsMzY0IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIGdlbnV0czQ2LmNwcAorKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisqICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246NAorKgorKiAgIGNyZWF0ZWQgb246IDIwMTBtYXIwMgorKiAgIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisqCisqIHF1aWNrICYgZGlydHkgdG9vbCB0byByZWNyZWF0ZSB0aGUgVVRTICM0NiBkYXRhIHRhYmxlIGFjY29yZGluZyB0byB0aGUgc3BlYworKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS9lcnJvcmNvZGUuaCIKKyNpbmNsdWRlICJ1bmljb2RlL25vcm1hbGl6ZXIyLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldGl0ZXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzcHJlcC5oIgorI2luY2x1ZGUgInNwcnBpbXBsLmgiICAvLyBIQUNLCisKKy8qKgorICogaWN1OjpFcnJvckNvZGUgc3ViY2xhc3MgZm9yIGVhc3kgVUVycm9yQ29kZSBoYW5kbGluZy4KKyAqIFRoZSBkZXN0cnVjdG9yIGNhbGxzIGhhbmRsZUZhaWx1cmUoKSB3aGljaCBjYWxscyBleGl0KGVycm9yQ29kZSkgd2hlbiBpc0ZhaWx1cmUoKS4KKyAqLworY2xhc3MgRXhpdGluZ0Vycm9yQ29kZSA6IHB1YmxpYyBpY3U6OkVycm9yQ29kZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQHBhcmFtIGxvYyBBIHNob3J0IHN0cmluZyBkZXNjcmliaW5nIHdoZXJlIHRoZSBFeGl0aW5nRXJyb3JDb2RlIGlzIHVzZWQuCisgICAgICovCisgICAgRXhpdGluZ0Vycm9yQ29kZShjb25zdCBjaGFyICpsb2MpIDogbG9jYXRpb24obG9jKSB7fQorICAgIHZpcnR1YWwgfkV4aXRpbmdFcnJvckNvZGUoKTsKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRmFpbHVyZSgpIGNvbnN0OworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyICpsb2NhdGlvbjsKK307CisKK0V4aXRpbmdFcnJvckNvZGU6On5FeGl0aW5nRXJyb3JDb2RlKCkgeworICAgIC8vIFNhZmUgYmVjYXVzZSBvdXIgaGFuZGxlRmFpbHVyZSgpIGRvZXMgbm90IHRocm93IGV4Y2VwdGlvbnMuCisgICAgaWYoaXNGYWlsdXJlKCkpIHsgaGFuZGxlRmFpbHVyZSgpOyB9Cit9CisKK3ZvaWQgRXhpdGluZ0Vycm9yQ29kZTo6aGFuZGxlRmFpbHVyZSgpIGNvbnN0IHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGF0ICVzOiAlc1xuIiwgbG9jYXRpb24sIGVycm9yTmFtZSgpKTsKKyAgICBleGl0KGVycm9yQ29kZSk7Cit9CisKK3N0YXRpYyBpbnQKK3RvSUROQTIwMDMoY29uc3QgVVN0cmluZ1ByZXBQcm9maWxlICpwcmVwLCBVQ2hhcjMyIGMsIGljdTo6VW5pY29kZVN0cmluZyAmZGVzdFN0cmluZykgeworICAgIFVDaGFyIHNyY1syXTsKKyAgICBpbnQzMl90IHNyY0xlbmd0aD0wOworICAgIFUxNl9BUFBFTkRfVU5TQUZFKHNyYywgc3JjTGVuZ3RoLCBjKTsKKyAgICBVQ2hhciAqZGVzdDsKKyAgICBpbnQzMl90IGRlc3RMZW5ndGg7CisgICAgZGVzdD1kZXN0U3RyaW5nLmdldEJ1ZmZlcigzMik7CisgICAgaWYoZGVzdD09TlVMTCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICBkZXN0TGVuZ3RoPXVzcHJlcF9wcmVwYXJlKHByZXAsIHNyYywgc3JjTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCwgZGVzdFN0cmluZy5nZXRDYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNQUkVQX0RFRkFVTFQsIE5VTEwsICZlcnJvckNvZGUpOworICAgIGRlc3RTdHJpbmcucmVsZWFzZUJ1ZmZlcihkZXN0TGVuZ3RoKTsKKyAgICBpZihlcnJvckNvZGU9PVVfU1RSSU5HUFJFUF9QUk9ISUJJVEVEX0VSUk9SKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBSZXR1cm5zIEZBTFNFPTAgZm9yIFVfU1RSSU5HUFJFUF9VTkFTU0lHTkVEX0VSUk9SIGFuZCBwcm9jZXNzaW5nIGVycm9ycywKKyAgICAgICAgLy8gVFJVRT0xIGlmIGMgaXMgdmFsaWQgb3IgbWFwcGVkLgorICAgICAgICByZXR1cm4gVV9TVUNDRVNTKGVycm9yQ29kZSk7CisgICAgfQorfQorCitlbnVtIFN0YXR1cyB7CisgICAgRElTQUxMT1dFRCwgSUdOT1JFRCwgTUFQUEVELCBERVZJQVRJT04sIFZBTElELAorICAgIERJU0FMTE9XRURfU1REM19WQUxJRCwgRElTQUxMT1dFRF9TVEQzX01BUFBFRAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdGF0dXNOYW1lc1tdPXsKKyAgICAiZGlzYWxsb3dlZCIsICJpZ25vcmVkIiwgIm1hcHBlZCIsICJkZXZpYXRpb24iLCAidmFsaWQiLAorICAgICJkaXNhbGxvd2VkX1NURDNfdmFsaWQiLCAiZGlzYWxsb3dlZF9TVEQzX21hcHBlZCIKK307CisKK3N0YXRpYyB2b2lkCitwcmludExpbmUoVUNoYXIzMiBzdGFydCwgVUNoYXIzMiBlbmQsIFN0YXR1cyBzdGF0dXMsIGNvbnN0IGljdTo6VW5pY29kZVN0cmluZyAmbWFwcGluZykgeworICAgIGlmKHN0YXJ0PT1lbmQpIHsKKyAgICAgICAgcHJpbnRmKCIlMDRsWCAgICAgICAgICAiLCAobG9uZylzdGFydCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlMDRsWC4uJTA0bFggICAgIiwgKGxvbmcpc3RhcnQsIChsb25nKWVuZCk7CisgICAgfQorICAgIHByaW50ZigiOyAlcyIsIHN0YXR1c05hbWVzW3N0YXR1c10pOworICAgIGlmKHN0YXR1cz09TUFQUEVEIHx8IHN0YXR1cz09REVWSUFUSU9OIHx8ICFtYXBwaW5nLmlzRW1wdHkoKSkgeworICAgICAgICBwcmludGYoIiA7Iik7CisgICAgICAgIGNvbnN0IFVDaGFyICpidWZmZXI9bWFwcGluZy5nZXRCdWZmZXIoKTsKKyAgICAgICAgaW50MzJfdCBsZW5ndGg9bWFwcGluZy5sZW5ndGgoKTsKKyAgICAgICAgaW50MzJfdCBpPTA7CisgICAgICAgIFVDaGFyMzIgYzsKKyAgICAgICAgd2hpbGUoaTxsZW5ndGgpIHsKKyAgICAgICAgICAgIFUxNl9ORVhUKGJ1ZmZlciwgaSwgbGVuZ3RoLCBjKTsKKyAgICAgICAgICAgIHByaW50ZigiICUwNGxYIiwgKGxvbmcpYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHV0cygiIik7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRBZ2VJZkFzc2lnbmVkKFVDaGFyMzIgYywgVVZlcnNpb25JbmZvIGFnZSkgeworICAgIGlmKHVfaXNkZWZpbmVkKGMpKSB7CisgICAgICAgIHVfY2hhckFnZShjLCBhZ2UpOworICAgIH0gZWxzZSBpZihVX0lTX1VOSUNPREVfTk9OQ0hBUihjKSkgeworICAgICAgICBhZ2VbMF09MDsKKyAgICAgICAgYWdlWzFdPTA7CisgICAgICAgIGFnZVsyXT0wOworICAgICAgICBhZ2VbM109MTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQoYWdlLCAwLCA0KTsKKyAgICB9Cit9CisKK2V4dGVybiBpbnQKK21haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICAgIEV4aXRpbmdFcnJvckNvZGUgZXJyb3JDb2RlKCJnZW51dHM0NiIpOworCisgICAgLy8gcHJlZGVmaW5lZCBiYXNlIHNldHMKKyAgICBpY3U6OlVuaWNvZGVTZXQgdW5hc3NpZ25lZFNldChVTklDT0RFX1NUUklOR19TSU1QTEUoIls6Q246XSIpLCBlcnJvckNvZGUpOworCisgICAgaWN1OjpVbmljb2RlU2V0IGxhYmVsU2VwYXJhdG9ycygKKyAgICAgICAgVU5JQ09ERV9TVFJJTkdfU0lNUExFKCJbXFx1MDAyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0iKSwgZXJyb3JDb2RlKTsKKworICAgIGljdTo6VW5pY29kZVNldCBtYXBwZWRTZXQoCisgICAgICAgIFVOSUNPREVfU1RSSU5HX1NJTVBMRSgiWzpDaGFuZ2VzX1doZW5fTkZLQ19DYXNlZm9sZGVkOl0iKSwgZXJyb3JDb2RlKTsKKyAgICBtYXBwZWRTZXQucmVtb3ZlQWxsKGxhYmVsU2VwYXJhdG9ycyk7ICAvLyBzaW1wbGlmaWVzIGNoZWNraW5nIG9mIG1hcHBlZCBjaGFyYWN0ZXJzCisKKyAgICBpY3U6OlVuaWNvZGVTZXQgYmFzZVZhbGlkU2V0KGljdTo6VW5pY29kZVN0cmluZygKKyAgICAgICAgIltbW1s6XkNoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQ6XSIKKyAgICAgICAgIi1bOkM6XS1bOlo6XSIKKyAgICAgICAgIi1bOkJsb2NrPUlkZW9ncmFwaGljX0Rlc2NyaXB0aW9uX0NoYXJhY3RlcnM6XV0iCisgICAgICAgICJbOmFzY2lpOl1dLVsuXV0iLCAtMSwgVVNfSU5WKSwgZXJyb3JDb2RlKTsKKworICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgZGlzYWxsb3dlZCB3aGVuIFNURDMgcnVsZXMgYXJlIGFwcGxpZWQsCisgICAgLy8gYnV0IHZhbGlkIHdoZW4gU1REMyBydWxlcyBhcmUgbm90IGFwcGxpZWQuCisgICAgaWN1OjpVbmljb2RlU2V0IGRpc2FsbG93ZWRTVEQzU2V0KGljdTo6VW5pY29kZVN0cmluZygKKyAgICAgICAgIltbOmFzY2lpOl0tW1xcdTAwMkQuYS16QS1aMC05XV0iLCAtMSwgVVNfSU5WKSwgZXJyb3JDb2RlKTsKKworICAgIGljdTo6VW5pY29kZVNldCBkZXZpYXRpb25TZXQoCisgICAgICAgIFVOSUNPREVfU1RSSU5HX1NJTVBMRSgiW1xcdTAwREZcXHUwM0MyXFx1MjAwQ1xcdTIwMERdIiksIGVycm9yQ29kZSk7CisgICAgZXJyb3JDb2RlLmFzc2VydFN1Y2Nlc3MoKTsKKworICAgIC8vIGRlcml2ZWQgc2V0cworICAgIGljdTo6TG9jYWxVU3RyaW5nUHJlcFByb2ZpbGVQb2ludGVyIG5hbWVQcmVwKHVzcHJlcF9vcGVuQnlUeXBlKFVTUFJFUF9SRkMzNDkxX05BTUVQUkVQLCBlcnJvckNvZGUpKTsKKyAgICBjb25zdCBpY3U6Ok5vcm1hbGl6ZXIyICpuZmtjX2NmPQorICAgICAgICBpY3U6Ok5vcm1hbGl6ZXIyOjpnZXRJbnN0YW5jZShOVUxMLCAibmZrY19jZiIsIFVOT1JNMl9DT01QT1NFLCBlcnJvckNvZGUpOworICAgIGVycm9yQ29kZS5hc3NlcnRTdWNjZXNzKCk7CisKKyAgICAvLyBIQUNLOiBUaGUgU3RyaW5nUHJlcCBBUEkgcGVyZm9ybXMgYSBCaURpIGNoZWNrIGFjY29yZGluZyB0byB0aGUgZGF0YS4KKyAgICAvLyBXZSBuZWVkIHRvIG92ZXJyaWRlIHRoYXQgZm9yIHRoaXMgZGF0YSBnZW5lcmF0aW9uLCBieSByZXNldHRpbmcgYW4gaW50ZXJuYWwgZmxhZy4KKyAgICBuYW1lUHJlcC0+Y2hlY2tCaURpPUZBTFNFOworCisgICAgaWN1OjpVbmljb2RlU2V0IGJhc2VFeGNsdXNpb25TZXQ7CisgICAgaWN1OjpVbmljb2RlU3RyaW5nIGNTdHJpbmcsIG1hcHBpbmcsIG5hbWVQcmVwUmVzdWx0OworICAgIGZvcihVQ2hhcjMyIGM9MDsgYzw9MHgxMGZmZmY7ICsrYykgeworICAgICAgICBpZihjPT0weGQ4MDApIHsKKyAgICAgICAgICAgIGM9MHhlMDAwOworICAgICAgICB9CisgICAgICAgIGludCBuYW1lUHJlcFN0YXR1cz10b0lETkEyMDAzKG5hbWVQcmVwLmdldEFsaWFzKCksIGMsIG5hbWVQcmVwUmVzdWx0KTsKKyAgICAgICAgaWYobmFtZVByZXBTdGF0dXMhPTApIHsKKyAgICAgICAgICAgIC8vIGdldCB0aGUgVVRTICM0NiBiYXNlIG1hcHBpbmcgdmFsdWUKKyAgICAgICAgICAgIHN3aXRjaChjKSB7CisgICAgICAgICAgICBjYXNlIDB4ZmYwZToKKyAgICAgICAgICAgIGNhc2UgMHgzMDAyOgorICAgICAgICAgICAgY2FzZSAweGZmNjE6CisgICAgICAgICAgICAgICAgbWFwcGluZy5zZXRUbygweDJlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY1N0cmluZy5zZXRUbyhjKTsKKyAgICAgICAgICAgICAgICBuZmtjX2NmLT5ub3JtYWxpemUoY1N0cmluZywgbWFwcGluZywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKAorICAgICAgICAgICAgICAgIG5hbWVQcmVwU3RhdHVzPjAgPworICAgICAgICAgICAgICAgICAgICAvLyBjIGlzIHZhbGlkIG9yIG1hcHBlZCBpbiBJRE5BMjAwMworICAgICAgICAgICAgICAgICAgICAhbGFiZWxTZXBhcmF0b3JzLmNvbnRhaW5zKGMpICYmIG5hbWVQcmVwUmVzdWx0IT1tYXBwaW5nIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gbmFtZVByZXBTdGF0dXM8MDogYyBpcyBwcm9oaWJpdGVkIGluIElETkEyMDAzCisgICAgICAgICAgICAgICAgICAgIGJhc2VWYWxpZFNldC5jb250YWlucyhjKSB8fCAoY1N0cmluZyE9bWFwcGluZyAmJiBiYXNlVmFsaWRTZXQuY29udGFpbnNBbGwobWFwcGluZykpCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBiYXNlRXhjbHVzaW9uU2V0LmFkZChjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGljdTo6VW5pY29kZVNldCBkaXNhbGxvd2VkU2V0KDAsIDB4MTBmZmZmKTsKKyAgICBkaXNhbGxvd2VkU2V0LgorICAgICAgICByZW1vdmVBbGwobGFiZWxTZXBhcmF0b3JzKS4KKyAgICAgICAgcmVtb3ZlQWxsKGRldmlhdGlvblNldCkuCisgICAgICAgIHJlbW92ZUFsbChtYXBwZWRTZXQpLgorICAgICAgICByZW1vdmVBbGwoYmFzZVZhbGlkU2V0KS4KKyAgICAgICAgYWRkQWxsKGJhc2VFeGNsdXNpb25TZXQpLgorICAgICAgICBhZGRBbGwodW5hc3NpZ25lZFNldCk7CisKKyAgICBjb25zdCBpY3U6Ok5vcm1hbGl6ZXIyICpuZmQ9CisgICAgICAgIGljdTo6Tm9ybWFsaXplcjI6OmdldEluc3RhbmNlKE5VTEwsICJuZmMiLCBVTk9STTJfREVDT01QT1NFLCBlcnJvckNvZGUpOworICAgIGVycm9yQ29kZS5hc3NlcnRTdWNjZXNzKCk7CisKKyAgICBpY3U6OlVuaWNvZGVTZXQgaWdub3JlZFNldDsgIC8vIHdpbGwgYmUgYSBzdWJzZXQgb2YgbWFwcGVkU2V0CisgICAgaWN1OjpVbmljb2RlU2V0IHJlbW92ZVNldDsKKyAgICBpY3U6OlVuaWNvZGVTdHJpbmcgbmZkU3RyaW5nOworICAgIHsKKyAgICAgICAgaWN1OjpVbmljb2RlU2V0SXRlcmF0b3IgaXRlcihtYXBwZWRTZXQpOworICAgICAgICB3aGlsZShpdGVyLm5leHQoKSkgeworICAgICAgICAgICAgVUNoYXIzMiBjPWl0ZXIuZ2V0Q29kZXBvaW50KCk7CisgICAgICAgICAgICBjU3RyaW5nLnNldFRvKGMpOworICAgICAgICAgICAgbmZrY19jZi0+bm9ybWFsaXplKGNTdHJpbmcsIG1hcHBpbmcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBpZighYmFzZVZhbGlkU2V0LmNvbnRhaW5zQWxsKG1hcHBpbmcpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVKyUwNGxYIG1hcHBlZCAtPiBkaXNhbGxvd2VkOiBtYXBwaW5nIG5vdCB3aG9sbHkgaW4gYmFzZSB2YWxpZCBzZXRcbiIsIChsb25nKWMpOworICAgICAgICAgICAgICAgIGRpc2FsbG93ZWRTZXQuYWRkKGMpOworICAgICAgICAgICAgICAgIHJlbW92ZVNldC5hZGQoYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYobWFwcGluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZ25vcmVkU2V0LmFkZChjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXBwZWRTZXQucmVtb3ZlQWxsKHJlbW92ZVNldCk7CisgICAgfQorICAgIGVycm9yQ29kZS5hc3NlcnRTdWNjZXNzKCk7CisKKyAgICBpY3U6OlVuaWNvZGVTZXQgdmFsaWRTZXQoYmFzZVZhbGlkU2V0KTsKKyAgICB2YWxpZFNldC4KKyAgICAgICAgcmVtb3ZlQWxsKGxhYmVsU2VwYXJhdG9ycykuICAvLyBub24tQVNDSUkgbGFiZWwgc2VwYXJhdG9ycyB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZW5kCisgICAgICAgIHJlbW92ZUFsbChkZXZpYXRpb25TZXQpLgorICAgICAgICByZW1vdmVBbGwoZGlzYWxsb3dlZFNldCkuCisgICAgICAgIHJlbW92ZUFsbChtYXBwZWRTZXQpLgorICAgICAgICBhZGQoMHgyZSk7ICAvLyBub3QgbWFwcGVkLCBzaW1wbHkgdmFsaWQKKyAgICBVQm9vbCBtYWRlQ2hhbmdlOworICAgIGRvIHsKKyAgICAgICAgbWFkZUNoYW5nZT1GQUxTRTsKKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlU2V0LmNsZWFyKCk7CisgICAgICAgICAgICBpY3U6OlVuaWNvZGVTZXRJdGVyYXRvciBpdGVyKHZhbGlkU2V0KTsKKyAgICAgICAgICAgIHdoaWxlKGl0ZXIubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgVUNoYXIzMiBjPWl0ZXIuZ2V0Q29kZXBvaW50KCk7CisgICAgICAgICAgICAgICAgaWYobmZkLT5nZXREZWNvbXBvc2l0aW9uKGMsIG5mZFN0cmluZykgJiYgIXZhbGlkU2V0LmNvbnRhaW5zQWxsKG5mZFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVKyUwNGxYIHZhbGlkIC0+IGRpc2FsbG93ZWQ6IE5GRCBub3Qgd2hvbGx5IHZhbGlkXG4iLCAobG9uZyljKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZFNldC5hZGQoYyk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNldC5hZGQoYyk7CisgICAgICAgICAgICAgICAgICAgIG1hZGVDaGFuZ2U9VFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWxpZFNldC5yZW1vdmVBbGwocmVtb3ZlU2V0KTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZW1vdmVTZXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGljdTo6VW5pY29kZVNldEl0ZXJhdG9yIGl0ZXIobWFwcGVkU2V0KTsKKyAgICAgICAgICAgIHdoaWxlKGl0ZXIubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgVUNoYXIzMiBjPWl0ZXIuZ2V0Q29kZXBvaW50KCk7CisgICAgICAgICAgICAgICAgY1N0cmluZy5zZXRUbyhjKTsKKyAgICAgICAgICAgICAgICBuZmtjX2NmLT5ub3JtYWxpemUoY1N0cmluZywgbWFwcGluZywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgICAgICBuZmQtPm5vcm1hbGl6ZShtYXBwaW5nLCBuZmRTdHJpbmcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgaWYoIXZhbGlkU2V0LmNvbnRhaW5zQWxsKG5mZFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVKyUwNGxYIG1hcHBlZCAtPiBkaXNhbGxvd2VkOiBORkQgb2YgbWFwcGluZyBub3Qgd2hvbGx5IHZhbGlkXG4iLCAobG9uZyljKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZFNldC5hZGQoYyk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNldC5hZGQoYyk7CisgICAgICAgICAgICAgICAgICAgIG1hZGVDaGFuZ2U9VFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXBwZWRTZXQucmVtb3ZlQWxsKHJlbW92ZVNldCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlKG1hZGVDaGFuZ2UpOworICAgIGVycm9yQ29kZS5hc3NlcnRTdWNjZXNzKCk7CisKKyAgICAvLyBmaW5pc2ggdXAKKyAgICBsYWJlbFNlcGFyYXRvcnMucmVtb3ZlKDB4MmUpLmZyZWV6ZSgpOyAgLy8gVSswMDJFIGlzIHNpbXBseSB2YWxpZAorICAgIGRldmlhdGlvblNldC5mcmVlemUoKTsKKyAgICBpZ25vcmVkU2V0LmZyZWV6ZSgpOworICAgIHZhbGlkU2V0LmZyZWV6ZSgpOworICAgIG1hcHBlZFNldC5mcmVlemUoKTsKKyAgICBkaXNhbGxvd2VkU1REM1NldC5mcmVlemUoKTsKKworICAgIC8vIG91dHB1dAorICAgIFVDaGFyMzIgcHJldlN0YXJ0PTAsIGM9MDsKKyAgICBTdGF0dXMgcHJldlN0YXR1cz1ESVNBTExPV0VEX1NURDNfVkFMSUQsIHN0YXR1czsKKyAgICBpY3U6OlVuaWNvZGVTdHJpbmcgcHJldk1hcHBpbmc7CisgICAgVVZlcnNpb25JbmZvIHByZXZBZ2U9eyAxLCAxLCAwLCAwIH0sIGFnZTsKKworICAgIGljdTo6VW5pY29kZVNldEl0ZXJhdG9yIGl0ZXIoZGlzYWxsb3dlZFNldCk7CisgICAgd2hpbGUoaXRlci5uZXh0UmFuZ2UoKSkgeworICAgICAgICBVQ2hhcjMyIHN0YXJ0PWl0ZXIuZ2V0Q29kZXBvaW50KCk7CisgICAgICAgIHdoaWxlKGM8c3RhcnQpIHsKKyAgICAgICAgICAgIG1hcHBpbmcucmVtb3ZlKCk7CisgICAgICAgICAgICBpZihsYWJlbFNlcGFyYXRvcnMuY29udGFpbnMoYykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXM9TUFQUEVEOworICAgICAgICAgICAgICAgIG1hcHBpbmcuc2V0VG8oMHgyZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYoZGV2aWF0aW9uU2V0LmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzPURFVklBVElPTjsKKyAgICAgICAgICAgICAgICBjU3RyaW5nLnNldFRvKGMpOworICAgICAgICAgICAgICAgIG5ma2NfY2YtPm5vcm1hbGl6ZShjU3RyaW5nLCBtYXBwaW5nLCBlcnJvckNvZGUpOworICAgICAgICAgICAgfSBlbHNlIGlmKGlnbm9yZWRTZXQuY29udGFpbnMoYykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXM9SUdOT1JFRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZih2YWxpZFNldC5jb250YWlucyhjKSkgeworICAgICAgICAgICAgICAgIGlmKGRpc2FsbG93ZWRTVEQzU2V0LmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVSslMDRsWCB2YWxpZCAtPiBkaXNhbGxvd2VkX1NURDNfdmFsaWQ6IGl0c2VsZiBub3QgU1REM1xuIiwgKGxvbmcpYyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1ESVNBTExPV0VEX1NURDNfVkFMSUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBuZmQtPmdldERlY29tcG9zaXRpb24oYywgbmZkU3RyaW5nKSAmJgorICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkU1REM1NldC5jb250YWluc1NvbWUobmZkU3RyaW5nKQorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlUrJTA0bFggdmFsaWQgLT4gZGlzYWxsb3dlZF9TVEQzX3ZhbGlkOiBORkQgbm90IHdob2xseSBTVEQzXG4iLCAobG9uZyljKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzPURJU0FMTE9XRURfU1REM19WQUxJRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXM9VkFMSUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmKG1hcHBlZFNldC5jb250YWlucyhjKSkgeworICAgICAgICAgICAgICAgIGNTdHJpbmcuc2V0VG8oYyk7CisgICAgICAgICAgICAgICAgbmZrY19jZi0+bm9ybWFsaXplKGNTdHJpbmcsIG1hcHBpbmcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgaWYoZGlzYWxsb3dlZFNURDNTZXQuY29udGFpbnNTb21lKG1hcHBpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVSslMDRsWCBtYXBwZWQgLT4gZGlzYWxsb3dlZF9TVEQzX21hcHBlZFxuIiwgKGxvbmcpYyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1ESVNBTExPV0VEX1NURDNfTUFQUEVEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1NQVBQRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqKiB1bmRldGVybWluZWQgc3RhdHVzIG9mIFUrJTA0bFhcbiIsIChsb25nKWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUHJpbnQgYSBuZXcgbGluZSB3aGVyZSB0aGUgc3RhdHVzLCB0aGUgbWFwcGluZyBvcgorICAgICAgICAgICAgLy8gdGhlIGNoYXJhY3RlciBhZ2UgY2hhbmdlLgorICAgICAgICAgICAgZ2V0QWdlSWZBc3NpZ25lZChjLCBhZ2UpOworICAgICAgICAgICAgaWYoIHByZXZTdGFydDxjICYmCisgICAgICAgICAgICAgICAgKHN0YXR1cyE9cHJldlN0YXR1cyB8fCBtYXBwaW5nIT1wcmV2TWFwcGluZyB8fCAwIT1tZW1jbXAocHJldkFnZSwgYWdlLCA0KSkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHByaW50TGluZShwcmV2U3RhcnQsIGMtMSwgcHJldlN0YXR1cywgcHJldk1hcHBpbmcpOworICAgICAgICAgICAgICAgIHByZXZTdGFydD1jOworICAgICAgICAgICAgICAgIHByZXZTdGF0dXM9c3RhdHVzOworICAgICAgICAgICAgICAgIHByZXZNYXBwaW5nPW1hcHBpbmc7CisgICAgICAgICAgICAgICAgbWVtY3B5KHByZXZBZ2UsIGFnZSwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2M7CisgICAgICAgIH0KKyAgICAgICAgLy8gYz09c3RhcnQgaXMgZGlzYWxsb3dlZAorICAgICAgICBpZihwcmV2U3RhcnQ8YykgeworICAgICAgICAgICAgcHJpbnRMaW5lKHByZXZTdGFydCwgYy0xLCBwcmV2U3RhdHVzLCBwcmV2TWFwcGluZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJldlN0YXJ0PWM7CisgICAgICAgIHByZXZTdGF0dXM9RElTQUxMT1dFRDsKKyAgICAgICAgcHJldk1hcHBpbmcucmVtb3ZlKCk7CisgICAgICAgIGdldEFnZUlmQXNzaWduZWQoYywgcHJldkFnZSk7CisgICAgICAgIFVDaGFyMzIgZW5kPWl0ZXIuZ2V0Q29kZXBvaW50RW5kKCk7CisgICAgICAgIHdoaWxlKCsrYzw9ZW5kKSB7CisgICAgICAgICAgICBnZXRBZ2VJZkFzc2lnbmVkKGMsIGFnZSk7CisgICAgICAgICAgICBpZihwcmV2U3RhcnQ8YyAmJiAwIT1tZW1jbXAocHJldkFnZSwgYWdlLCA0KSkgeworICAgICAgICAgICAgICAgIHByaW50TGluZShwcmV2U3RhcnQsIGMtMSwgcHJldlN0YXR1cywgcHJldk1hcHBpbmcpOworICAgICAgICAgICAgICAgIHByZXZTdGFydD1jOworICAgICAgICAgICAgICAgIG1lbWNweShwcmV2QWdlLCBhZ2UsIDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmKHByZXZTdGFydDxjKSB7CisgICAgICAgIHByaW50TGluZShwcmV2U3RhcnQsIGMtMSwgcHJldlN0YXR1cywgcHJldk1hcHBpbmcpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51dHM0Ni9nZW51dHM0Ni5zbG4gYi91bmljb2RlL2MvZ2VudXRzNDYvZ2VudXRzNDYuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGExMzAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VudXRzNDYvZ2VudXRzNDYuc2xuCkBAIC0wLDAgKzEsMjAgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDAKKyMgVmlzdWFsIEMrKyBFeHByZXNzIDIwMDgKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZ2VudXRzNDYiLCAiZ2VudXRzNDYudmNwcm9qIiwgInsyMEY5RjFCMS1FMzYyLTRBNEQtODRCQS01NDg1NTc3NDVDRDl9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MjBGOUYxQjEtRTM2Mi00QTRELTg0QkEtNTQ4NTU3NzQ1Q0Q5fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7MjBGOUYxQjEtRTM2Mi00QTRELTg0QkEtNTQ4NTU3NzQ1Q0Q5fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezIwRjlGMUIxLUUzNjItNEE0RC04NEJBLTU0ODU1Nzc0NUNEOX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXsyMEY5RjFCMS1FMzYyLTRBNEQtODRCQS01NDg1NTc3NDVDRDl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudXRzNDYvZ2VudXRzNDYudmNwcm9qIGIvdW5pY29kZS9jL2dlbnV0czQ2L2dlbnV0czQ2LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRmODQzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnV0czQ2L2dlbnV0czQ2LnZjcHJvagpAQCAtMCwwICsxLDE4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjkuMDAiCisJTmFtZT0iZ2VudXRzNDYiCisJUHJvamVjdEdVSUQ9InsyMEY5RjFCMS1FMzYyLTRBNEQtODRCQS01NDg1NTc3NDVDRDl9IgorCVJvb3ROYW1lc3BhY2U9ImdlbnV0czQ2IgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxOTY2MTMiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlwuLlwuLlxpY3VcdHJ1bmtcaW5jbHVkZSwgLi5cLi5cLi5cLi5cLi5caWN1XHRydW5rXHNvdXJjZVxjb21tb24iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVfVVNJTkdfSUNVX05BTUVTUEFDRT0wIgorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJpY3V1Y2QubGliIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLlwuLlwuLlwuLlwuLlxpY3VcdHJ1bmtcbGliIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjIiCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJ0cnVlIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXC4uXC4uXGljdVx0cnVua1xpbmNsdWRlLCAuLlwuLlwuLlwuLlwuLlxpY3VcdHJ1bmtcc291cmNlXGNvbW1vbiIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iVV9VU0lOR19JQ1VfTkFNRVNQQUNFPTAiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaWN1dWMubGliIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLlwuLlwuLlwuLlwuLlxpY3VcdHJ1bmtcbGliIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIgorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii5cZ2VudXRzNDYuY3BwIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS91bmljb2RlL2MvcmVhZG1lLnR4dCBiL3VuaWNvZGUvYy9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWEzMDIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvcmVhZG1lLnR4dApAQCAtMCwwICsxLDMxIEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjA0CisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisKK1RoZXNlIHRvb2xzIHBhcnNlIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlIGZpbGVzIGFuZCBnZW5lcmF0ZQorZGF0YSBmaWxlcyAodGV4dCwgc291cmNlIGNvZGUgYW5kIGJpbmFyeSkgZm9yIHVzZSBpbiBJQ1UuCitUaGV5IGFyZSB1c2VkIGR1cmluZyB0aGUgVW5pY29kZSBiZXRhIHBlcmlvZCBhbmQgYWZ0ZXIgYSBVbmljb2RlIHJlbGVhc2UuCisKK0ZvciBhIGxvZyBvZiBhY3Rpb25zIGFuZCBjaGFuZ2VzIGZvciByZWNlbnQgVW5pY29kZSB2ZXJzaW9uIHVwZ3JhZGVzIG9mIElDVSwgc2VlCitodHRwOi8vYnVncy5pY3UtcHJvamVjdC5vcmcvdHJhYy9icm93c2VyL2ljdS90cnVuay9zb3VyY2UvZGF0YS91bmlkYXRhL2NoYW5nZXMudHh0CisKK1NpbmNlIHRoZSBVbmljb2RlIDUuMiB1cGdyYWRlLCB0aGVzZSB0b29scyBoYXZlIGJlZW4gbW92ZWQgb3V0IG9mIHRoZSBJQ1Ugc291cmNlCit0cmVlIHRvIGhlcmUuIFRoZXkgaGF2ZSBub3QgYmVlbiBmdWxseSB0ZXN0ZWQgYW5kIHByb2JhYmx5IG5lZWQgc29tZSBtb3JlIHdvcmsKK2FuZCBzZXR1cC4gVGhleSBtaWdodCBiZW5lZml0IGZyb20gYWRkaXRpb25hbCBzaGVsbCBvciBQeXRob24gc2NyaXB0cy4KKworVGhlcmUgYXJlIGF1dG9jb25mIG1ha2VmaWxlcyAoTWFrZWZpbGUuaW4pIGFuZCBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgKC52Y3Byb2opCitpbiB0aGUgc3ViZm9sZGVycy4gVGhleSBhcmUgY29waWVkIG92ZXIgZnJvbSB0aGUgSUNVIHNvdXJjZSB0cmVlIGFuZCB3aWxsIG5vdAord29yayB3aXRob3V0IG1vZGlmaWNhdGlvbnMuIEhvd2V2ZXIsIEkgc3RhcnRlZCB0byB1c2UgQ01ha2UgKENNYWtlTGlzdHMudHh0KQord2hpY2ggaXMgbXVjaCBzaW1wbGVyLCBhbmQgaWYgaXQgd29ya3Mgd2VsbCBlbm91Z2ggdGhlbiBJIHBsYW4gdG8ganVzdAorZGVsZXRlIHRoZSBvbGQgbWFrZWZpbGVzIGFuZCBwcm9qZWN0IGZpbGVzLiBUaGUgQ01ha2UgZmlsZXMgc2hvdWxkCit3b3JrIG9uIExpbnV4IGFuZCBNYWNPUyBYLgorSSBzaG91bGQgdXNlIG1vcmUgdmFyaWFibGVzIHRvIG1ha2UgdGhlIENNYWtlIGZpbGVzIG1vcmUgcG9ydGFibGUsIGFuZCBzaG91bGQKK3VzZSBJQ1UncyBpbnN0YWxsZWQgaWN1LWNvbmZpZyBvciBNYWtlZmlsZS5pbmMgdG8gZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoZXNlCit2YXJpYWJsZXMuCisoSWYgYW5kIHdoZW4gSUNVIGl0c2VsZiB1c2VzIENNYWtlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBwb2ludCB0byBpdHMgbW9kdWxlcy4pCisKK1RoaW5ncyB3aWxsIGltcHJvdmUgYXMgSSB3b3JrIG9uIFVuaWNvZGUgNi4uLgorCittYXJrdXMKZGlmZiAtLWdpdCBhL3VuaWNvZGUvcHkvcHJlcGFyc2V1Y2QucHkgYi91bmljb2RlL3B5L3ByZXBhcnNldWNkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiMzc4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL3B5L3ByZXBhcnNldWNkLnB5CkBAIC0wLDAgKzEsMjA3MyBAQAorIyEvdXNyL2Jpbi9weXRob24yLjYKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIENvcHlyaWdodCAoYykgMjAwOS0yMDEyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgICBmaWxlIG5hbWU6ICBwcmVwYXJzZXVjZC5weQorIyAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisjICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisjICAgaW5kZW50YXRpb246NAorIworIyAgIGNyZWF0ZWQgb246IDIwMTFub3YwMyAoZm9ya2VkIGZyb20gdWNkY29weS5weSkKKyMgICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorIworIyBDb3BpZXMgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UgKFVDRCkgZmlsZXMgZnJvbSBhIHRyZWUKKyMgb2YgZmlsZXMgZG93bmxvYWRlZCBmcm9tIChmb3IgZXhhbXBsZSkgZnRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy82LjEuMC8KKyMgdG8gSUNVJ3Mgc291cmNlL2RhdGEvdW5pZGF0YS8gYW5kIHNvdXJjZS90ZXN0L3Rlc3RkYXRhLworIyBhbmQgbW9kaWZpZXMgc29tZSBvZiB0aGUgZmlsZXMgdG8gbWFrZSB0aGVtIG1vcmUgY29tcGFjdC4KKyMgUGFyc2VzIHRoZW0gYW5kIHdyaXRlcyB1bmlkYXRhL3BwdWNkLnR4dCAoUHJlUGFyc2VkIFVDRCkgd2l0aCBzaW1wbGUgc3ludGF4LgorIworIyBJbnZva2Ugd2l0aCB0aHJlZSBjb21tYW5kLWxpbmUgcGFyYW1ldGVyczoKKyMgMS4gc291cmNlIGZvbGRlciB3aXRoIFVDRCAmIGlkbmEgZmlsZXMKKyMgMi4gSUNVIHNvdXJjZSByb290IGZvbGRlcgorIyAzLiBJQ1UgdG9vbHMgcm9vdCBmb2xkZXIKKyMKKyMgU2FtcGxlIGludm9jYXRpb246CisjICAgfi9zdm4uaWN1L3Rvb2xzL3RydW5rL3NyYy91bmljb2RlJCBweS9wcmVwYXJzZXVjZC5weSB+L3VuaTYxLzIwMTIwMTE4IH4vc3ZuLmljdS90cnVuay9zcmMgfi9zdm4uaWN1L3Rvb2xzL3RydW5rL3NyYworCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBiaXNlY3QKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHJlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCisKKyMgVW5pY29kZSB2ZXJzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKioqCisKK191Y2RfdmVyc2lvbiA9ICI/IgorX2NvcHlyaWdodCA9ICIiCitfdGVybXNfb2ZfdXNlID0gIiIKKworIyBJU08gMTU5MjQgc2NyaXB0IGNvZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKioKKworIyBTY3JpcHQgY29kZXMgZnJvbSBJU08gMTU5MjQgaHR0cDovL3d3dy51bmljb2RlLm9yZy9pc28xNTkyNC9jb2RlY2hhbmdlcy5odG1sCisjIHRoYXQgYXJlIG5vdCB5ZXQgaW4gdGhlIFVDRC4KK19zY3JpcHRzX29ubHlfaW5faXNvMTU5MjQgPSAoCisgICAgIkJsaXMiLCAiQ2lydCIsICJDeXJzIiwKKyAgICAiRWd5ZCIsICJFZ3loIiwgIkdlb2siLAorICAgICJIYW5zIiwgIkhhbnQiLCAiSG1uZyIsICJIdW5nIiwKKyAgICAiSW5kcyIsICJKcGFuIiwgIkxhdGYiLCAiTGF0ZyIsICJMaW5hIiwKKyAgICAiTWF5YSIsICJNb29uIiwgIlBlcm0iLCAiUm9ybyIsCisgICAgIlNhcmEiLCAiU2dudyIsICJTeXJlIiwgIlN5cmoiLCAiU3lybiIsCisgICAgIlRlbmciLCAiVmlzcCIsICJaeHh4IiwKKworICAgICJLb3JlIiwgIk1hbmkiLCAiUGhscCIsICJQaGx2IiwgIlptdGgiLCAiWnN5bSIsCisKKyAgICAiTmtnYiIsCisKKyAgICAiQmFzcyIsICJEdXBsIiwgIkVsYmEiLCAiR3JhbiIsCisgICAgIktwZWwiLCAiTG9tYSIsICJNZW5kIiwgIk5hcmIiLCAiTmJhdCIsCisgICAgIlBhbG0iLCAiU2luZCIsICJXYXJhIiwKKworICAgICJBZmFrIiwgIkp1cmMiLCAiTXJvbyIsICJOc2h1IiwgIlRhbmciLCAiV29sZSIsCisKKyAgICAiSGx1dyIsICJLaG9qIiwgIlRpcmgiCispCisKKyMgUHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKioqCisKK19pZ25vcmVkX3Byb3BlcnRpZXMgPSBzZXQoKAorICAjIE90aGVyX1h5eiBvbmx5IGNvbnRyaWJ1dGUgdG8gWHl6LCBzdG9yZSBvbmx5IHRoZSBsYXR0ZXIuCisgICJPQWxwaGEiLAorICAiT0RJIiwKKyAgIk9Hcl9FeHQiLAorICAiT0lEQyIsCisgICJPSURTIiwKKyAgIk9Mb3dlciIsCisgICJPTWF0aCIsCisgICJPVXBwZXIiLAorICAjIEZ1cnRoZXIgcHJvcGVydGllcyB0aGF0IGp1c3QgY29udHJpYnV0ZSB0byBvdGhlcnMuCisgICJDRSIsICAjIENvbXBvc2l0aW9uX0V4Y2x1c2lvbiBqdXN0IGNvbnRyaWJ1dGVzIHRvIEZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uLgorICAiSlNOIiwKKyAgIyBUaGVzZSBwcm9wZXJ0aWVzIGp1c3QgZG9uJ3Qgc2VlbSB1c2VmdWwuCisgICMgVGhleSBhcmUgZGVwcmVjYXRlZCBzaW5jZSBVbmljb2RlIDYuMC4KKyAgIlhPX05GQyIsCisgICJYT19ORkQiLAorICAiWE9fTkZLQyIsCisgICJYT19ORktEIiwKKyAgIyBJQ1UgZG9lcyBub3QgdXNlIFVuaWhhbiBwcm9wZXJ0aWVzLgorICAiY2prQWNjb3VudGluZ051bWVyaWMiLAorICAiY2prT3RoZXJOdW1lcmljIiwKKyAgImNqa1ByaW1hcnlOdW1lcmljIiwKKyAgImNqa0NvbXBhdGliaWxpdHlWYXJpYW50IiwKKyAgImNqa0lJQ29yZSIsCisgICJjamtJUkdfR1NvdXJjZSIsCisgICJjamtJUkdfSFNvdXJjZSIsCisgICJjamtJUkdfSlNvdXJjZSIsCisgICJjamtJUkdfS1BTb3VyY2UiLAorICAiY2prSVJHX0tTb3VyY2UiLAorICAiY2prSVJHX01Tb3VyY2UiLAorICAiY2prSVJHX1RTb3VyY2UiLAorICAiY2prSVJHX1VTb3VyY2UiLAorICAiY2prSVJHX1ZTb3VyY2UiLAorICAiY2prUlNVbmljb2RlIgorKSkKKworIyBEaWN0aW9uYXJ5IG9mIHByb3BlcnRpZXMuCisjIEtleWVkIGJ5IG5vcm1hbGl6ZWQgcHJvcGVydHkgbmFtZXMgYW5kIGFsaWFzZXMuCisjIEVhY2ggdmFsdWUgaXMgYSB0dXBsZSB3aXRoCisjIDA6IFR5cGUgb2YgcHJvcGVydHkgKGJpbmFyeSwgZW51bSwgLi4uKQorIyAxOiBMaXN0IG9mIGFsaWFzZXM7IHNob3J0ICYgbG9uZyBuYW1lIGZvbGxvd2VkIGJ5IG90aGVyIGFsaWFzZXMuCisjICAgIFRoZSBzaG9ydCBuYW1lIGlzICIiIGlmIGl0IGlzIGxpc3RlZCBhcyAibi9hIiBpbiBQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQuCisjIDI6IFNldCBvZiBzaG9ydCBwcm9wZXJ0eSB2YWx1ZSBuYW1lcy4KKyMgMzogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSB2YWx1ZXMuCisjICAgIEZvciBDYXRhbG9nICYgRW51bWVyYXRlZCBwcm9wZXJ0aWVzLAorIyAgICBtYXBzIGVhY2ggdmFsdWUgbmFtZSB0byBhIGxpc3Qgb2YgYWxpYXNlcy4KKyMgICAgRW1wdHkgZm9yIG90aGVyIHR5cGVzIG9mIHByb3BlcnRpZXMuCitfcHJvcGVydGllcyA9IHt9CisKKyMgRGljdGlvbmFyeSBvZiBiaW5hcnktcHJvcGVydHkgdmFsdWVzIHdoaWNoIHdlIHN0b3JlIGFzIEZhbHNlL1RydWUuCisjIFNhbWUgYXMgdGhlIHZhbHVlcyBkaWN0aW9uYXJ5IG9mIG9uZSBvZiB0aGUgYmluYXJ5IHByb3BlcnRpZXMuCitfYmluYXJ5X3ZhbHVlcyA9IHt9CisKKyMgRGljdGlvbmFyeSBvZiBudWxsIHZhbHVlcy4KKyMgS2V5ZWQgYnkgc2hvcnQgcHJvcGVydHkgbmFtZXMuCisjIFRoZXNlIGFyZSB0eXBlLXNwZWNpZmljIHZhbHVlcyBmb3IgcHJvcGVydGllcyB0aGF0IG9jY3VyIGluIHRoZSBkYXRhLgorIyBUaGV5IGFyZSBvdmVycmlkZGVuIGJ5IF9kZWZhdWx0cywgYmxvY2sgYW5kIGNvZGUgcG9pbnQgcHJvcGVydGllcy4KK19udWxsX3ZhbHVlcyA9IHt9CisKKyMgUHJvcGVydHkgdmFsdWUgbmFtZXMgZm9yIG51bGwgdmFsdWVzLgorIyBXZSBkbyBub3Qgc3RvcmUgdGhlc2UgaW4gX2RlZmF1bHRzLgorX251bGxfbmFtZXMgPSBmcm96ZW5zZXQoKCI8bm9uZT4iLCAiTmFOIikpCisKKyMgRGljdGlvbmFyeSBvZiBleHBsaWNpdCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcy4KKyMgS2V5ZWQgYnkgc2hvcnQgcHJvcGVydHkgbmFtZXMuCitfZGVmYXVsdHMgPSB7fQorCisjIF9udWxsX3ZhbHVlcyBvdmVycmlkZGVuIGJ5IGV4cGxpY2l0IF9kZWZhdWx0cy4KKyMgSW5pdGlhbGl6ZWQgYWZ0ZXIgcGFyc2luZyBpcyBkb25lLgorX251bGxfb3JfZGVmYXVsdHMgPSB7fQorCisjIExpc3Qgb2YgcHJvcGVydGllcyB3aXRoIGFuIElDVSBVUHJvcGVydHkgZW51bS4KKyMgRWFjaCBpdGVtIGlzIGFuIChlbnVtLCBwbmFtZSwgdmFsdWVzKSB0dXBsZS4KKyMgLSBlbnVtOiB0aGUgSUNVIGVudW0gVVByb3BlcnR5IGNvbnN0YW50IHN0cmluZworIyAtIHBuYW1lOiB0aGUgVUNEIHNob3J0IHByb3BlcnR5IG5hbWUKKyMgLSB2YWx1ZXM6IGxpc3Qgb2YgKGVudW0sIHZuYW1lKSBwYWlycyBwZXIgcHJvcGVydHkgdmFsdWUKKyMgICAtIGVudW06IHRoZSBJQ1UgcHJvcGVydHkgdmFsdWUncyBlbnVtIGNvbnN0YW50IHN0cmluZworIyAgIC0gdm5hbWU6IHRoZSBVQ0Qgc2hvcnQgcHJvcGVydHkgdmFsdWUgbmFtZQorX2ljdV9wcm9wZXJ0aWVzID0gW10KKworIyBEaWN0aW9uYXJ5IG9mIHNob3J0IHByb3BlcnR5IG5hbWVzIG1hcHBlZCB0byBfaWN1X3Byb3BlcnRpZXMgaXRlbXMuCitfcG5hbWVfdG9faWN1X3Byb3AgPSB7fQorCitfbm9uX2FsbnVtX3JlID0gcmUuY29tcGlsZSgiW15hLXpBLVowLTldIikKKworZGVmIE5vcm1Qcm9wTmFtZShwbmFtZSk6CisgICIiIlJldHVybnMgYSBub3JtYWxpemVkIGZvcm0gb2YgcG5hbWUuCisgIFJlbW92ZXMgbm9uLUFTQ0lJLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2VzIGxldHRlcnMuIiIiCisgIHJldHVybiBfbm9uX2FsbnVtX3JlLnN1YigiIiwgcG5hbWUpLmxvd2VyKCkKKworCitkZWYgR2V0UHJvcGVydHkocG5hbWUpOgorICAiIiJSZXR1cm5zIHRoZSBfcHJvcGVydGllcyB2YWx1ZSBmb3IgdGhlIHBuYW1lLgorICBSZXR1cm5zIG51bGwgaWYgdGhlIHByb3BlcnR5IGlzIGlnbm9yZWQuCisgIENhY2hlcyBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIHRoZSBwcm9wZXJ0eSBuYW1lLiIiIgorICAjIFRyeSB0aGUgaW5wdXQgbmFtZS4KKyAgcHJvcCA9IF9wcm9wZXJ0aWVzLmdldChwbmFtZSkKKyAgaWYgcHJvcCAhPSBOb25lOiByZXR1cm4gcHJvcAorICBpZiBwbmFtZSBpbiBfaWdub3JlZF9wcm9wZXJ0aWVzOiByZXR1cm4gTm9uZQorICAjIFRyeSB0aGUgbm9ybWFsaXplZCBpbnB1dCBuYW1lLgorICBub3JtX25hbWUgPSBOb3JtUHJvcE5hbWUocG5hbWUpCisgIHByb3AgPSBfcHJvcGVydGllcy5nZXQobm9ybV9uYW1lKQorICBpZiBwcm9wICE9IE5vbmU6CisgICAgX3Byb3BlcnRpZXNbcG5hbWVdID0gcHJvcCAgIyBDYWNoZSBwcm9wIHVuZGVyIHRoaXMgbmV3IG5hbWUgc3BlbGxpbmcuCisgICAgcmV0dXJuIHByb3AKKyAgZWxpZiBwbmFtZSBpbiBfaWdub3JlZF9wcm9wZXJ0aWVzOgorICAgIF9pZ25vcmVkX3Byb3BlcnRpZXMuYWRkKHBuYW1lKSAgIyBSZW1lbWJlciB0byBpZ25vcmUgdGhpcyBuZXcgbmFtZSBzcGVsbGluZy4KKyAgICByZXR1cm4gTm9uZQorICBlbHNlOgorICAgIHJhaXNlIE5hbWVFcnJvcigidW5rbm93biBwcm9wZXJ0eSAlc1xuIiAlIHBuYW1lKQorCisKK2RlZiBHZXRTaG9ydFByb3BlcnR5TmFtZShwbmFtZSk6CisgIGlmIHBuYW1lIGluIF9udWxsX3ZhbHVlczogcmV0dXJuIHBuYW1lICAjIHBuYW1lIGlzIGFscmVhZHkgdGhlIHNob3J0IG5hbWUuCisgIHByb3AgPSBHZXRQcm9wZXJ0eShwbmFtZSkKKyAgaWYgbm90IHByb3A6IHJldHVybiAiIiAgIyBGb3IgaWdub3JlZCBwcm9wZXJ0aWVzLgorICByZXR1cm4gcHJvcFsxXVswXSBvciBwcm9wWzFdWzFdICAjIExvbmcgbmFtZSBpZiBubyBzaG9ydCBuYW1lLgorCisKK2RlZiBHZXRTaG9ydFByb3BlcnR5VmFsdWVOYW1lKHByb3AsIHZuYW1lKToKKyAgaWYgdm5hbWUgaW4gcHJvcFsyXTogcmV0dXJuIHZuYW1lCisgIHZhbHVlcyA9IHByb3BbM10KKyAgYWxpYXNlcyA9IHZhbHVlcy5nZXQodm5hbWUpCisgIGlmIGFsaWFzZXMgPT0gTm9uZToKKyAgICBub3JtX25hbWUgPSBOb3JtUHJvcE5hbWUodm5hbWUpCisgICAgYWxpYXNlcyA9IHZhbHVlcy5nZXQobm9ybV9uYW1lKQorICAgIGlmIGFsaWFzZXMgPT0gTm9uZToKKyAgICAgIHJhaXNlIE5hbWVFcnJvcigidW5rbm93biB2YWx1ZSBuYW1lICVzIGZvciBwcm9wZXJ0eSAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgKHZuYW1lLCBwcm9wWzFdWzBdKSkKKyAgICB2YWx1ZXNbdm5hbWVdID0gYWxpYXNlcworICByZXR1cm4gYWxpYXNlc1swXSBvciBhbGlhc2VzWzFdICAjIExvbmcgbmFtZSBpZiBubyBzaG9ydCBuYW1lLgorCisKK2RlZiBOb3JtYWxpemVQcm9wZXJ0eVZhbHVlKHByb3AsIHZuYW1lKToKKyAgaWYgcHJvcFsyXTogICMgQmluYXJ5L0NhdGFsb2cvRW51bWVyYXRlZCBwcm9wZXJ0eS4KKyAgICB2YWx1ZSA9IEdldFNob3J0UHJvcGVydHlWYWx1ZU5hbWUocHJvcCwgdm5hbWUpCisgICAgaWYgcHJvcFswXSA9PSAiQmluYXJ5IjoKKyAgICAgIHZhbHVlID0gdmFsdWUgPT0gIlkiCisgICAgaWYgcHJvcFsxXVswXS5lbmRzd2l0aCgiY2NjIik6CisgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKKyAgZWxzZToKKyAgICB2YWx1ZSA9IHZuYW1lCisgIHJldHVybiB2YWx1ZQorCisjIENoYXJhY3RlciBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoqKgorCisjIExpc3RzIG9mIE5hbWVzTGlzdCBoMSBhbmQgaDIgaGVhZGluZ3MuCisjIEVhY2ggaDEgdmFsdWUgaXMgYSAoc3RhcnQsIGVuZCwgY29tbWVudCkgdHVwbGUuCisjIEVhY2ggaDIgdmFsdWUgaXMgYSAoY3AsIGNvbW1lbnQpIHR1cGxlLgorX2gxID0gW10KK19oMiA9IFtdCisKKyMgTGlzdCBvZiBVbmljb2RlIGJsb2Nrcy4KKyMgRWFjaCBpdGVtIGlzIGEgdHVwbGUgb2Ygc3RhcnQgJiBlbmQgY29kZSBwb2ludCBpbnRlZ2VycworIyBhbmQgYSBkaWN0aW9uYXJ5IG9mIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgorX2Jsb2NrcyA9IFtdCisKKyMgTGlzdCBvZiByYW5nZXMgd2l0aCBhbGdvcml0aG1pYyBuYW1lcy4KKyMgRWFjaCB2YWx1ZSBpcyBhIGxpc3Qgb2YgW3N0YXJ0LCBlbmQsIHR5cGUsIHByZWZpeF0KKyMgd2hlcmUgcHJlZml4IGlzIG9wdGlvbmFsLgorX2FsZ19uYW1lc19yYW5nZXMgPSBbXQorCisjIExpc3Qgb2YgVW5pY29kZSBjaGFyYWN0ZXIgcmFuZ2VzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLAorIyBzdG9yZWQgYXMgYW4gaW52ZXJzaW9uIG1hcCB3aXRoIHJhbmdlX3N0YXJ0ICYgcHJvcHMgZGljdGlvbmFyeS4KKyMgU3RhcnRzIHdpdGggb25lIHJhbmdlIGZvciBhbGwgb2YgVW5pY29kZSB3aXRob3V0IGFueSBwcm9wZXJ0aWVzLgorIyBTZXR0aW5nIHZhbHVlcyBzdWJkaXZpZGVzIHJhbmdlcy4KK19zdGFydHMgPSBhcnJheS5hcnJheSgnbCcsIFswLCAweDExMDAwMF0pICAjIGFycmF5IG9mIGludDMyX3QKK19wcm9wcyA9IFt7fSwge31dICAjIHByb3BzIGZvciAwIGFuZCAxMTAwMDAKKworZGVmIEZpbmRSYW5nZSh4KToKKyAgIiIiIEJpbmFyeSBzZWFyY2ggZm9yIHggaW4gdGhlIGludmVyc2lvbiBtYXAuCisgIFJldHVybnMgdGhlIHNtYWxsZXN0IGkgd2hlcmUgeCA8IF9zdGFydHNbaV0iIiIKKyAgcmV0dXJuIGJpc2VjdC5iaXNlY3QoX3N0YXJ0cywgeCkgLSAxCisKKworZGVmIEdldFByb3BzKGMpOgorICBpID0gRmluZFJhbmdlKGMpCisgIHJldHVybiBfcHJvcHNbaV0KKworCitkZWYgVXBkYXRlUHJvcHMoc3RhcnQsIGVuZCwgdXBkYXRlKToKKyAgYXNzZXJ0IDAgPD0gc3RhcnQgPD0gZW5kIDw9IDB4MTBmZmZmCisgIChuZWVkX3RvX3VwZGF0ZSwgZG9fdXBkYXRlLCB1KSA9ICh1cGRhdGVbMF0sIHVwZGF0ZVsxXSwgdXBkYXRlWzJdKQorICAjIEZpbmQgdGhlIGluZGV4IGkgb2YgdGhlIHJhbmdlIGluIF9zdGFydHMgdGhhdCBjb250YWlucyBzdGFydC4KKyAgaSA9IEZpbmRSYW5nZShzdGFydCkKKyAgbGltaXQgPSBlbmQgKyAxCisgICMgSW50ZXJzZWN0IFtzdGFydCwgbGltaXRbIHdpdGggcmFuZ2VzIGluIF9zdGFydHMuCisgIGNfc3RhcnQgPSBfc3RhcnRzW2ldCisgIGNfbGltaXQgPSBfc3RhcnRzW2kgKyAxXQorICBjX3Byb3BzID0gX3Byb3BzW2ldCisgICMgY19zdGFydCA8PSBzdGFydCA8IGNfbGltaXQKKyAgaWYgY19zdGFydCA8IHN0YXJ0OgorICAgIHVwZGF0ZV9saW1pdCA9IGNfbGltaXQgaWYgY19saW1pdCA8PSBsaW1pdCBlbHNlIGxpbWl0CisgICAgaWYgbmVlZF90b191cGRhdGUodSwgc3RhcnQsIHVwZGF0ZV9saW1pdCAtIDEsIGNfcHJvcHMpOgorICAgICAgIyBTcGxpdCBvZmYgW2Nfc3RhcnQsIHN0YXJ0WyB3aXRoIGEgY29weSBvZiBjX3Byb3BzLgorICAgICAgaSArPSAxCisgICAgICBjX3Byb3BzID0gY19wcm9wcy5jb3B5KCkKKyAgICAgIF9zdGFydHMuaW5zZXJ0KGksIHN0YXJ0KQorICAgICAgX3Byb3BzLmluc2VydChpLCBjX3Byb3BzKQorICAgICAgY19zdGFydCA9IHN0YXJ0CisgICMgTW9kaWZ5IGFsbCByYW5nZXMgdGhhdCBhcmUgZnVsbHkgaW5zaWRlIFtzdGFydCwgbGltaXRbLgorICB3aGlsZSBjX2xpbWl0IDw9IGxpbWl0OgorICAgICMgc3RhcnQgPD0gY19zdGFydCA8IGNfbGltaXQgPD0gbGltaXQKKyAgICBpZiBuZWVkX3RvX3VwZGF0ZSh1LCBjX3N0YXJ0LCBjX2xpbWl0IC0gMSwgY19wcm9wcyk6CisgICAgICBkb191cGRhdGUodSwgY19zdGFydCwgY19saW1pdCAtIDEsIGNfcHJvcHMpCisgICAgaWYgY19saW1pdCA9PSAweDExMDAwMDogcmV0dXJuCisgICAgaSArPSAxCisgICAgY19zdGFydCA9IGNfbGltaXQKKyAgICBjX2xpbWl0ID0gX3N0YXJ0c1tpICsgMV0KKyAgICBjX3Byb3BzID0gX3Byb3BzW2ldCisgIGlmIGNfc3RhcnQgPCBsaW1pdCBhbmQgbmVlZF90b191cGRhdGUodSwgY19zdGFydCwgbGltaXQgLSAxLCBjX3Byb3BzKToKKyAgICAjIFNwbGl0IG9mZiBbbGltaXQsIGNfbGltaXRbIHdpdGggYSBjb3B5IG9mIGNfcHJvcHMuCisgICAgX3N0YXJ0cy5pbnNlcnQoaSArIDEsIGxpbWl0KQorICAgIF9wcm9wcy5pbnNlcnQoaSArIDEsIGNfcHJvcHMuY29weSgpKQorICAgICMgTW9kaWZ5IFtjX3N0YXJ0LCBsaW1pdFsgY19wcm9wcy4KKyAgICBkb191cGRhdGUodSwgY19zdGFydCwgbGltaXQgLSAxLCBjX3Byb3BzKQorCisKK2RlZiBOZWVkVG9TZXRQcm9wcyhwcm9wcywgc3RhcnQsIGVuZCwgY19wcm9wcyk6CisgICIiIlJldHVybnMgVHJ1ZSBpZiBwcm9wcyBpcyBub3QgYSBzdWItZGljdCBvZiBjX3Byb3BzLiIiIgorICBmb3IgKHBuYW1lLCB2YWx1ZSkgaW4gcHJvcHMuaXRlcml0ZW1zKCk6CisgICAgaWYgcG5hbWUgbm90IGluIGNfcHJvcHMgb3IgdmFsdWUgIT0gY19wcm9wc1twbmFtZV06IHJldHVybiBUcnVlCisgIHJldHVybiBGYWxzZQorCisKK2RlZiBEb1NldFByb3BzKHByb3BzLCBzdGFydCwgZW5kLCBjX3Byb3BzKToKKyAgY19wcm9wcy51cGRhdGUocHJvcHMpCisKKworZGVmIFNldFByb3BzKHN0YXJ0LCBlbmQsIHByb3BzKToKKyAgVXBkYXRlUHJvcHMoc3RhcnQsIGVuZCwgKE5lZWRUb1NldFByb3BzLCBEb1NldFByb3BzLCBwcm9wcykpCisKKworZGVmIE5lZWRUb1NldEFsd2F5cyhudiwgc3RhcnQsIGVuZCwgY19wcm9wcyk6CisgIHJldHVybiBUcnVlCisKKworIyBGb3IgcmVzdG9yaW5nIGJvdW5kYXJpZXMgYWZ0ZXIgbWVyZ2luZyBhZGphY2VudCBzYW1lLXByb3BzIHJhbmdlcy4KK2RlZiBBZGRCb3VuZGFyeSh4KToKKyAgIiIiRW5zdXJlIHRoYXQgdGhlcmUgaXMgYSByYW5nZSBzdGFydC9saW1pdCBhdCB4LiIiIgorICBhc3NlcnQgMCA8PSB4IDw9IDB4MTBmZmZmCisgIGkgPSBGaW5kUmFuZ2UoeCkKKyAgaWYgX3N0YXJ0c1tpXSA9PSB4OiByZXR1cm4KKyAgIyBTcGxpdCB0aGUgcmFuZ2UgYXQgeC4KKyAgY19zdGFydCA9IF9zdGFydHNbaV0KKyAgY19saW1pdCA9IF9zdGFydHNbaSArIDFdCisgIGNfcHJvcHMgPSBfcHJvcHNbaV0KKyAgIyBjX3N0YXJ0IDwgeCA8IGNfbGltaXQKKyAgaSArPSAxCisgIF9zdGFydHMuaW5zZXJ0KGksIHgpCisgIF9wcm9wcy5pbnNlcnQoaSwgY19wcm9wcy5jb3B5KCkpCisKKworZGVmIFNldERlZmF1bHRWYWx1ZShwbmFtZSwgdmFsdWUpOgorICAiIiJTZXRzIHRoZSBwcm9wZXJ0eSdzIGRlZmF1bHQgdmFsdWUuIElnbm9yZXMgbnVsbCB2YWx1ZXMuIiIiCisgIHByb3AgPSBHZXRQcm9wZXJ0eShwbmFtZSkKKyAgaWYgcHJvcCBhbmQgdmFsdWUgbm90IGluIF9udWxsX25hbWVzOgorICAgIHZhbHVlID0gTm9ybWFsaXplUHJvcGVydHlWYWx1ZShwcm9wLCB2YWx1ZSkKKyAgICBpZiB2YWx1ZSAhPSBfbnVsbF92YWx1ZXNbcHJvcFsxXVswXV06CisgICAgICBfZGVmYXVsdHNbcHJvcFsxXVswXV0gPSB2YWx1ZQorICAgICAgU2V0UHJvcHMoMCwgMHgxMGZmZmYsIHtwcm9wWzFdWzBdOiB2YWx1ZX0pCisKKworZGVmIFNldEJpbmFyeVByb3BlcnR5VG9UcnVlKHBuYW1lLCBzdGFydCwgZW5kKToKKyAgcHJvcCA9IEdldFByb3BlcnR5KHBuYW1lKQorICBpZiBwcm9wOgorICAgIGFzc2VydCBwcm9wWzBdID09ICJCaW5hcnkiCisgICAgU2V0UHJvcHMoc3RhcnQsIGVuZCwge3Byb3BbMV1bMF06IFRydWV9KQorCisKK2RlZiBTZXRQcm9wVmFsdWUocHJvcCwgdm5hbWUsIHN0YXJ0LCBlbmQpOgorICB2YWx1ZSA9IE5vcm1hbGl6ZVByb3BlcnR5VmFsdWUocHJvcCwgdm5hbWUpCisgIFNldFByb3BzKHN0YXJ0LCBlbmQsIHtwcm9wWzFdWzBdOiB2YWx1ZX0pCisKKworZGVmIFNldFByb3BlcnR5VmFsdWUocG5hbWUsIHZuYW1lLCBzdGFydCwgZW5kKToKKyAgcHJvcCA9IEdldFByb3BlcnR5KHBuYW1lKQorICBpZiBwcm9wOiBTZXRQcm9wVmFsdWUocHJvcCwgdm5hbWUsIHN0YXJ0LCBlbmQpCisKKyMgUGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKioqCisKK19zdHJpcHBlZF9jcF9yZSA9IHJlLmNvbXBpbGUoIihbMC05YS1mQS1GXSspJCIpCitfc3RyaXBwZWRfcmFuZ2VfcmUgPSByZS5jb21waWxlKCIoWzAtOWEtZkEtRl0rKVwuXC4oWzAtOWEtZkEtRl0rKSQiKQorX21pc3NpbmdfcmUgPSByZS5jb21waWxlKCIjICpAbWlzc2luZzogKjAwMDBcLlwuMTBGRkZGICo7ICooLispJCIpCisKK2RlZiBSZWFkVUNETGluZXMoaW5fZmlsZSwgd2FudF9yYW5nZXM9VHJ1ZSwgd2FudF9vdGhlcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgd2FudF9jb21tZW50cz1GYWxzZSwgd2FudF9taXNzaW5nPUZhbHNlKToKKyAgIiIiUGFyc2VzIGxpbmVzIGZyb20gYSBzZW1pY29sb24tZGVsaW1pdGVkIFVDRCB0ZXh0IGZpbGUuCisgIFN0cmlwcyBjb21tZW50cywgaWdub3JlcyBlbXB0eSBhbmQgYWxsLWNvbW1lbnQgbGluZXMuCisgIFJldHVybnMgYSB0dXBsZSAodHlwZSwgbGluZSwgLi4uKS4KKyAgIiIiCisgIGZvciBsaW5lIGluIGluX2ZpbGU6CisgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgIGlmIG5vdCBsaW5lOiBjb250aW51ZQorICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiIyIpOiAgIyB3aG9sZS1saW5lIGNvbW1lbnQKKyAgICAgIGlmIHdhbnRfbWlzc2luZzoKKyAgICAgICAgbWF0Y2ggPSBfbWlzc2luZ19yZS5tYXRjaChsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICBmaWVsZHMgPSBtYXRjaC5ncm91cCgxKS5zcGxpdCgiOyIpCisgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihmaWVsZHMpKTogZmllbGRzW2ldID0gZmllbGRzW2ldLnN0cmlwKCkKKyAgICAgICAgICB5aWVsZCAoIm1pc3NpbmciLCBsaW5lLCBmaWVsZHMpCisgICAgICAgICAgY29udGludWUKKyAgICAgIGlmIHdhbnRfY29tbWVudHM6IHlpZWxkICgiY29tbWVudCIsIGxpbmUpCisgICAgICBjb250aW51ZQorICAgIGNvbW1lbnRfc3RhcnQgPSBsaW5lLmZpbmQoIiMiKSAgIyBpbmxpbmUgY29tbWVudAorICAgIGlmIGNvbW1lbnRfc3RhcnQgPj0gMDoKKyAgICAgIGxpbmUgPSBsaW5lWzpjb21tZW50X3N0YXJ0XS5yc3RyaXAoKQorICAgICAgaWYgbm90IGxpbmU6IGNvbnRpbnVlCisgICAgZmllbGRzID0gbGluZS5zcGxpdCgiOyIpCisgICAgZm9yIGkgaW4geHJhbmdlKGxlbihmaWVsZHMpKTogZmllbGRzW2ldID0gZmllbGRzW2ldLnN0cmlwKCkKKyAgICBpZiB3YW50X3JhbmdlczoKKyAgICAgIGZpcnN0ID0gZmllbGRzWzBdCisgICAgICBtYXRjaCA9IF9zdHJpcHBlZF9yYW5nZV9yZS5tYXRjaChmaXJzdCkKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICBzdGFydCA9IGludChtYXRjaC5ncm91cCgxKSwgMTYpCisgICAgICAgIGVuZCA9IGludChtYXRjaC5ncm91cCgyKSwgMTYpCisgICAgICAgIHlpZWxkICgicmFuZ2UiLCBsaW5lLCBzdGFydCwgZW5kLCBmaWVsZHMpCisgICAgICAgIGNvbnRpbnVlCisgICAgICBtYXRjaCA9IF9zdHJpcHBlZF9jcF9yZS5tYXRjaChmaXJzdCkKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICBjID0gaW50KG1hdGNoLmdyb3VwKDEpLCAxNikKKyAgICAgICAgeWllbGQgKCJyYW5nZSIsIGxpbmUsIGMsIGMsIGZpZWxkcykKKyAgICAgICAgY29udGludWUKKyAgICBpZiB3YW50X290aGVyOgorICAgICAgeWllbGQgKCJvdGhlciIsIGxpbmUsIGZpZWxkcykKKyAgICBlbHNlOgorICAgICAgcmFpc2UgU3ludGF4RXJyb3IoInVuYWJsZSB0byBwYXJzZSBsaW5lXG4gICVzXG4iICUgbGluZSkKKworCitkZWYgQWRkQmluYXJ5UHJvcGVydHkoc2hvcnRfbmFtZSwgbG9uZ19uYW1lKToKKyAgX251bGxfdmFsdWVzW3Nob3J0X25hbWVdID0gRmFsc2UKKyAgYmluX3Byb3AgPSBfcHJvcGVydGllc1siTWF0aCJdCisgIHByb3AgPSAoIkJpbmFyeSIsIFtzaG9ydF9uYW1lLCBsb25nX25hbWVdLCBiaW5fcHJvcFsyXSwgYmluX3Byb3BbM10pCisgIF9wcm9wZXJ0aWVzW3Nob3J0X25hbWVdID0gcHJvcAorICBfcHJvcGVydGllc1tsb25nX25hbWVdID0gcHJvcAorICBfcHJvcGVydGllc1tOb3JtUHJvcE5hbWUoc2hvcnRfbmFtZSldID0gcHJvcAorICBfcHJvcGVydGllc1tOb3JtUHJvcE5hbWUobG9uZ19uYW1lKV0gPSBwcm9wCisKKworZGVmIEFkZFBPU0lYQmluYXJ5UHJvcGVydHkobmFtZSk6CisgICMgV2Ugb25seSBkZWZpbmUgYSBsb25nIG5hbWUgZm9yIElDVS1zcGVjaWZpYyAobm9uLVVDRCkgUE9TSVggcHJvcGVydGllcy4KKyAgX251bGxfdmFsdWVzW25hbWVdID0gRmFsc2UKKyAgYmluX3Byb3AgPSBfcHJvcGVydGllc1siTWF0aCJdCisgIHByb3AgPSAoIkJpbmFyeSIsIFsiIiwgbmFtZV0sIGJpbl9wcm9wWzJdLCBiaW5fcHJvcFszXSkKKyAgX3Byb3BlcnRpZXNbbmFtZV0gPSBwcm9wCisgIF9wcm9wZXJ0aWVzW05vcm1Qcm9wTmFtZShuYW1lKV0gPSBwcm9wCisgICMgVGhpcyBpcyB0byBtYXRjaCBVUHJvcGVydHkgVUNIQVJfUE9TSVhfQUxOVU0gZXRjLgorICBfcHJvcGVydGllc1sicG9zaXgiICsgTm9ybVByb3BOYW1lKG5hbWUpXSA9IHByb3AKKworCisjIE1hdGNoIGEgY29tbWVudCBsaW5lIGxpa2UKKyMgUHJvcGVydHlBbGlhc2VzLTYuMS4wLnR4dAorIyBhbmQgZXh0cmFjdCB0aGUgVW5pY29kZSB2ZXJzaW9uLgorX3VjZF92ZXJzaW9uX3JlID0gcmUuY29tcGlsZSgiIyAqUHJvcGVydHlBbGlhc2VzIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItKFswLTldKyg/OlxcLlswLTldKykqKSg/OmRbMC05XSspPyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFwudHh0IikKKworZGVmIFBhcnNlUHJvcGVydHlBbGlhc2VzKGluX2ZpbGUpOgorICBnbG9iYWwgX2NvcHlyaWdodCwgX3Rlcm1zX29mX3VzZSwgX3VjZF92ZXJzaW9uCisgIHByb3BfdHlwZV9udWxscyA9IHsKKyAgICAiQmluYXJ5IjogRmFsc2UsCisgICAgIkNhdGFsb2ciOiAiPz8iLCAgIyBNdXN0IGJlIHNwZWNpZmllZCwgZS5nLiwgaW4gQG1pc3NpbmcgbGluZS4KKyAgICAiRW51bWVyYXRlZCI6ICI/PyIsICAjIE11c3QgYmUgc3BlY2lmaWVkLgorICAgICJOdW1lcmljIjogIk5hTiIsCisgICAgIlN0cmluZyI6ICIiLAorICAgICJNaXNjZWxsYW5lb3VzIjogIiIKKyAgfQorICBmb3IgZGF0YSBpbiBSZWFkVUNETGluZXMoaW5fZmlsZSwgd2FudF9yYW5nZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50X290aGVyPVRydWUsIHdhbnRfY29tbWVudHM9VHJ1ZSk6CisgICAgaWYgZGF0YVswXSA9PSAiY29tbWVudCI6CisgICAgICBsaW5lID0gZGF0YVsxXQorICAgICAgbWF0Y2ggPSBfdWNkX3ZlcnNpb25fcmUubWF0Y2gobGluZSkKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICBfdWNkX3ZlcnNpb24gPSBtYXRjaC5ncm91cCgxKQorICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoIiMgQ29weXJpZ2h0Iik6CisgICAgICAgIF9jb3B5cmlnaHQgPSBsaW5lCisgICAgICBlbGlmICJ0ZXJtcyBvZiB1c2UiIGluIGxpbmU6CisgICAgICAgIF90ZXJtc19vZl91c2UgPSBsaW5lCisgICAgICBlbHNlOgorICAgICAgICB3b3JkcyA9IGxpbmVbMTpdLmxzdHJpcCgpLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKHdvcmRzKSA9PSAyIGFuZCB3b3Jkc1sxXSA9PSAiUHJvcGVydGllcyI6CisgICAgICAgICAgcHJvcF90eXBlID0gd29yZHNbMF0KKyAgICAgICAgICBudWxsX3ZhbHVlID0gcHJvcF90eXBlX251bGxzW3Byb3BfdHlwZV0KKyAgICBlbHNlOgorICAgICAgIyB0eXBlID09ICJvdGhlciIKKyAgICAgIGFsaWFzZXMgPSBkYXRhWzJdCisgICAgICBuYW1lID0gYWxpYXNlc1swXQorICAgICAgaWYgbmFtZSBpbiBfaWdub3JlZF9wcm9wZXJ0aWVzOgorICAgICAgICBmb3IgYWxpYXMgaW4gYWxpYXNlczoKKyAgICAgICAgICBfaWdub3JlZF9wcm9wZXJ0aWVzLmFkZChhbGlhcykKKyAgICAgICAgICBfaWdub3JlZF9wcm9wZXJ0aWVzLmFkZChOb3JtUHJvcE5hbWUoYWxpYXMpKQorICAgICAgZWxzZToKKyAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiY2NjIik6CisgICAgICAgICAgX251bGxfdmFsdWVzW25hbWVdID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgIF9udWxsX3ZhbHVlc1tuYW1lXSA9IG51bGxfdmFsdWUKKyAgICAgICAgcHJvcCA9IChwcm9wX3R5cGUsIGFsaWFzZXMsIHNldCgpLCB7fSkKKyAgICAgICAgZm9yIGFsaWFzIGluIGFsaWFzZXM6CisgICAgICAgICAgX3Byb3BlcnRpZXNbYWxpYXNdID0gcHJvcAorICAgICAgICAgIF9wcm9wZXJ0aWVzW05vcm1Qcm9wTmFtZShhbGlhcyldID0gcHJvcAorICAjIEFkZCBwcm92aXNpb25hbCBhbmQgSUNVLXNwZWNpZmljIHByb3BlcnRpZXMgd2UgbmVlZC4KKyAgIyBXZSBhZGQgc29tZSBpbiBzdXBwb3J0IG9mIHJ1bnRpbWUgQVBJLCBldmVuIGlmIHdlIGRvIG5vdCB3cml0ZQorICAjIGRhdGEgZm9yIHRoZW0gdG8gcHB1Y2QudHh0IChlLmcuLCBsY2NjICYgdGNjYykuCisgICMgV2UgYWRkIG90aGVycyBqdXN0IHRvIHJlcHJlc2VudCBVQ0QgZGF0YSB0aGF0IGNvbnRyaWJ1dGVzIHRvCisgICMgc29tZSBmdW5jdGlvbmFsaXR5LCBhbHRob3VnaCBVbmljb2RlIGhhcyBub3QgImJsZXNzZWQiIHRoZW0KKyAgIyBhcyBzZXBhcmF0ZSBwcm9wZXJ0aWVzIChlLmcuLCBUdXJraWNfQ2FzZV9Gb2xkaW5nKS4KKworICAjIFR1cmtpY19DYXNlX0ZvbGRpbmc6IFRoZSAnVCcgbWFwcGluZ3MgaW4gQ2FzZUZvbGRpbmcudHh0LgorICBuYW1lID0gIlR1cmtpY19DYXNlX0ZvbGRpbmciCisgIF9udWxsX3ZhbHVlc1tuYW1lXSA9ICIiCisgIHByb3AgPSAoIlN0cmluZyIsIFtuYW1lLCBuYW1lXSwgc2V0KCksIHt9KQorICBfcHJvcGVydGllc1tuYW1lXSA9IHByb3AKKyAgX3Byb3BlcnRpZXNbTm9ybVByb3BOYW1lKG5hbWUpXSA9IHByb3AKKyAgIyBDb25kaXRpb25hbF9DYXNlX01hcHBpbmdzOiBTcGVjaWFsQ2FzaW5nLnR4dCBsaW5lcyB3aXRoIGNvbmRpdGlvbnMuCisgIG5hbWUgPSAiQ29uZGl0aW9uYWxfQ2FzZV9NYXBwaW5ncyIKKyAgX251bGxfdmFsdWVzW25hbWVdID0gIiIKKyAgcHJvcCA9ICgiTWlzY2VsbGFuZW91cyIsIFtuYW1lLCBuYW1lXSwgc2V0KCksIHt9KQorICBfcHJvcGVydGllc1tuYW1lXSA9IHByb3AKKyAgX3Byb3BlcnRpZXNbTm9ybVByb3BOYW1lKG5hbWUpXSA9IHByb3AKKyAgIyBsY2NjID0gY2NjIG9mIGZpcnN0IGNwIGluIGNhbm9uaWNhbCBkZWNvbXBvc2l0aW9uLgorICBfbnVsbF92YWx1ZXNbImxjY2MiXSA9IDAKKyAgY2NjX3Byb3AgPSBsaXN0KF9wcm9wZXJ0aWVzWyJjY2MiXSkKKyAgY2NjX3Byb3BbMV0gPSBbImxjY2MiLCAiTGVhZF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIl0KKyAgcHJvcCA9IHR1cGxlKGNjY19wcm9wKQorICBfcHJvcGVydGllc1sibGNjYyJdID0gcHJvcAorICBfcHJvcGVydGllc1siTGVhZF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIl0gPSBwcm9wCisgIF9wcm9wZXJ0aWVzWyJsZWFkY2Fub25pY2FsY29tYmluaW5nY2xhc3MiXSA9IHByb3AKKyAgIyB0Y2NjID0gY2NjIG9mIGxhc3QgY3AgaW4gY2Fub25pY2FsIGRlY29tcG9zaXRpb24uCisgIF9udWxsX3ZhbHVlc1sidGNjYyJdID0gMAorICBjY2NfcHJvcFsxXSA9IFsidGNjYyIsICJUcmFpbF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIl0KKyAgcHJvcCA9IHR1cGxlKGNjY19wcm9wKQorICBfcHJvcGVydGllc1sidGNjYyJdID0gcHJvcAorICBfcHJvcGVydGllc1siVHJhaWxfQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzcyJdID0gcHJvcAorICBfcHJvcGVydGllc1sidHJhaWxjYW5vbmljYWxjb21iaW5pbmdjbGFzcyJdID0gcHJvcAorICAjIFNjcmlwdF9FeHRlbnNpb25zCisgIGlmICJzY3giIG5vdCBpbiBfcHJvcGVydGllczoKKyAgICBfbnVsbF92YWx1ZXNbInNjeCJdID0gIiIKKyAgICBwcm9wID0gKCJNaXNjZWxsYW5lb3VzIiwgWyJzY3giLCAiU2NyaXB0X0V4dGVuc2lvbnMiXSwgc2V0KCksIHt9KQorICAgIF9wcm9wZXJ0aWVzWyJzY3giXSA9IHByb3AKKyAgICBfcHJvcGVydGllc1siU2NyaXB0X0V4dGVuc2lvbnMiXSA9IHByb3AKKyAgICBfcHJvcGVydGllc1sic2NyaXB0ZXh0ZW5zaW9ucyJdID0gcHJvcAorICAjIEdlbmVyYWwgQ2F0ZWdvcnkgYXMgYSBiaXQgbWFzay4KKyAgX251bGxfdmFsdWVzWyJnY20iXSA9ICI/PyIKKyAgZ2NfcHJvcCA9IF9wcm9wZXJ0aWVzWyJnYyJdCisgIHByb3AgPSAoIkJpdG1hc2siLCBbImdjbSIsICJHZW5lcmFsX0NhdGVnb3J5X01hc2siXSwgZ2NfcHJvcFsyXSwgZ2NfcHJvcFszXSkKKyAgX3Byb3BlcnRpZXNbImdjbSJdID0gcHJvcAorICBfcHJvcGVydGllc1siR2VuZXJhbF9DYXRlZ29yeV9NYXNrIl0gPSBwcm9wCisgIF9wcm9wZXJ0aWVzWyJnZW5lcmFsY2F0ZWdvcnltYXNrIl0gPSBwcm9wCisgICMgVmFyaW91cyBiaW5hcnkgcHJvcGVydGllcy4KKyAgQWRkQmluYXJ5UHJvcGVydHkoIlNlbnNpdGl2ZSIsICJDYXNlX1NlbnNpdGl2ZSIpCisgIEFkZEJpbmFyeVByb3BlcnR5KCJuZmRpbmVydCIsICJORkRfSW5lcnQiKQorICBBZGRCaW5hcnlQcm9wZXJ0eSgibmZrZGluZXJ0IiwgIk5GS0RfSW5lcnQiKQorICBBZGRCaW5hcnlQcm9wZXJ0eSgibmZjaW5lcnQiLCAiTkZDX0luZXJ0IikKKyAgQWRkQmluYXJ5UHJvcGVydHkoIm5ma2NpbmVydCIsICJORktDX0luZXJ0IikKKyAgQWRkQmluYXJ5UHJvcGVydHkoInNlZ3N0YXJ0IiwgIlNlZ21lbnRfU3RhcnRlciIpCisgICMgQy9QT1NJWCBjaGFyYWN0ZXIgY2xhc3NlcyB0aGF0IGRvIG5vdCBoYXZlIFVuaWNvZGUgcHJvcGVydHkgW3ZhbHVlXSBhbGlhc2VzLgorICAjIFNlZSB1Y2hhci5oLgorICBBZGRQT1NJWEJpbmFyeVByb3BlcnR5KCJhbG51bSIpCisgIEFkZFBPU0lYQmluYXJ5UHJvcGVydHkoImJsYW5rIikKKyAgQWRkUE9TSVhCaW5hcnlQcm9wZXJ0eSgiZ3JhcGgiKQorICBBZGRQT1NJWEJpbmFyeVByb3BlcnR5KCJwcmludCIpCisgIEFkZFBPU0lYQmluYXJ5UHJvcGVydHkoInhkaWdpdCIpCisKKworZGVmIFBhcnNlUHJvcGVydHlWYWx1ZUFsaWFzZXMoaW5fZmlsZSk6CisgIGdsb2JhbCBfYmluYXJ5X3ZhbHVlcworICBmb3IgZGF0YSBpbiBSZWFkVUNETGluZXMoaW5fZmlsZSwgd2FudF9yYW5nZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50X290aGVyPVRydWUsIHdhbnRfbWlzc2luZz1UcnVlKToKKyAgICBpZiBkYXRhWzBdID09ICJtaXNzaW5nIjoKKyAgICAgIFNldERlZmF1bHRWYWx1ZShkYXRhWzJdWzBdLCBkYXRhWzJdWzFdKQorICAgIGVsc2U6CisgICAgICAjIHR5cGUgPT0gIm90aGVyIgorICAgICAgZmllbGRzID0gZGF0YVsyXQorICAgICAgcG5hbWUgPSBmaWVsZHNbMF0KKyAgICAgIHByb3AgPSBHZXRQcm9wZXJ0eShwbmFtZSkKKyAgICAgIGlmIHByb3A6CisgICAgICAgIGRlbCBmaWVsZHNbMF0gICMgT25seSB0aGUgbGlzdCBvZiBhbGlhc2VzIHJlbWFpbnMuCisgICAgICAgIHNob3J0X25hbWUgPSBmaWVsZHNbMF0KKyAgICAgICAgaWYgc2hvcnRfbmFtZSA9PSAibi9hIjogICMgbm8gc2hvcnQgbmFtZQorICAgICAgICAgIGZpZWxkc1swXSA9ICIiCisgICAgICAgICAgc2hvcnRfbmFtZSA9IGZpZWxkc1sxXQorICAgICAgICBwcm9wWzJdLmFkZChzaG9ydF9uYW1lKQorICAgICAgICB2YWx1ZXMgPSBwcm9wWzNdCisgICAgICAgIGZvciBhbGlhcyBpbiBmaWVsZHM6CisgICAgICAgICAgaWYgYWxpYXM6CisgICAgICAgICAgICB2YWx1ZXNbYWxpYXNdID0gZmllbGRzCisgICAgICAgICAgICB2YWx1ZXNbTm9ybVByb3BOYW1lKGFsaWFzKV0gPSBmaWVsZHMKKyAgICAgICAgaWYgcHJvcFswXSA9PSAiQmluYXJ5IiBhbmQgbm90IF9iaW5hcnlfdmFsdWVzOgorICAgICAgICAgIF9iaW5hcnlfdmFsdWVzID0gdmFsdWVzCisgICMgU29tZSBvZiB0aGUgQG1pc3NpbmcgbGluZXMgd2l0aCBub24tbnVsbCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcworICAjIGFyZSBpbiBmaWxlcyB0aGF0IHdlIGRvIG5vdCBwYXJzZTsKKyAgIyBlaXRoZXIgYmVjYXVzZSB0aGUgZGF0YSBmb3IgdGhhdCBwcm9wZXJ0eSBpcyBlYXNpbHkKKyAgIyAoaS5lLiwgdGhlIEBtaXNzaW5nIGxpbmUgd291bGQgYmUgdGhlIG9ubHkgcmVhc29uIHRvIHBhcnNlIHN1Y2ggYSBmaWxlKQorICAjIG9yIGJlY2F1c2Ugd2UgY29tcHV0ZSB0aGUgcHJvcGVydHkgYXQgcnVudGltZSwKKyAgIyBzdWNoIGFzIHRoZSBIYW5ndWxfU3lsbGFibGVfVHlwZS4KKyAgaWYgImR0IiBub3QgaW4gX2RlZmF1bHRzOiAgIyBEZXJpdmVkRGVjb21wb3NpdGlvblR5cGUudHh0CisgICAgX2RlZmF1bHRzWyJkdCJdID0gIk5vbmUiCisgIGlmICJudCIgbm90IGluIF9kZWZhdWx0czogICMgRGVyaXZlZE51bWVyaWNUeXBlLnR4dAorICAgIF9kZWZhdWx0c1sibnQiXSA9ICJOb25lIgorICBpZiAiaHN0IiBub3QgaW4gX2RlZmF1bHRzOiAgIyBIYW5ndWxTeWxsYWJsZVR5cGUudHh0CisgICAgX2RlZmF1bHRzWyJoc3QiXSA9ICJOQSIKKyAgaWYgImdjIiBub3QgaW4gX2RlZmF1bHRzOiAgIyBObyBAbWlzc2luZyBsaW5lIGluIGFueSAudHh0IGZpbGU/CisgICAgX2RlZmF1bHRzWyJnYyJdID0gIkNuIgorICAjIENvcHkgdGhlIGdjIGRlZmF1bHQgdmFsdWUgdG8gZ2NtLgorICBfZGVmYXVsdHNbImdjbSJdID0gX2RlZmF1bHRzWyJnYyJdCisgICMgQWRkIElTTyAxNTkyNC1vbmx5IHNjcmlwdCBjb2Rlcy4KKyAgIyBPbmx5IGZvciB0aGUgSUNVIHNjcmlwdCBjb2RlIEFQSSwgbm90IG5lY2Vzc2FyeSBmb3IgcGFyc2luZyB0aGUgVUNELgorICBzY3JpcHRfcHJvcCA9IF9wcm9wZXJ0aWVzWyJzYyJdCisgIHNob3J0X3NjcmlwdF9uYW1lcyA9IHNjcmlwdF9wcm9wWzJdICAjIHNldAorICBzY3JpcHRfdmFsdWVzID0gc2NyaXB0X3Byb3BbM10gICMgZGljdAorICByZW1vdmVfc2NyaXB0cyA9IFtdCisgIGZvciBzY3JpcHQgaW4gX3NjcmlwdHNfb25seV9pbl9pc28xNTkyNDoKKyAgICBpZiBzY3JpcHQgaW4gc2hvcnRfc2NyaXB0X25hbWVzOgorICAgICAgcmVtb3ZlX3NjcmlwdHMuYXBwZW5kKHNjcmlwdCkKKyAgICBlbHNlOgorICAgICAgc2hvcnRfc2NyaXB0X25hbWVzLmFkZChzY3JpcHQpCisgICAgICAjIERvIG5vdCBpbnZlbnQgYSBVbmljb2RlIGxvbmcgc2NyaXB0IG5hbWUgYmVmb3JlIHRoZSBVQ0QgYWRkcyB0aGUgc2NyaXB0LgorICAgICAgc2NyaXB0X2xpc3QgPSBbc2NyaXB0LCBzY3JpcHRdICAjIFtzaG9ydCwgbG9uZ10KKyAgICAgIHNjcmlwdF92YWx1ZXNbc2NyaXB0XSA9IHNjcmlwdF9saXN0CisgICAgICAjIFByb2JhYmx5IG5vdCBuZWNlc3NhcnkgYmVjYXVzZQorICAgICAgIyB3ZSB3aWxsIG5vdCBwYXJzZSB0aGVzZSBzY3JpcHRzIGZyb20gdGhlIFVDRDoKKyAgICAgIHNjcmlwdF92YWx1ZXNbTm9ybVByb3BOYW1lKHNjcmlwdCldID0gc2NyaXB0X2xpc3QKKyAgaWYgcmVtb3ZlX3NjcmlwdHM6CisgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgInJlbW92ZSAlcyBmcm9tIF9zY3JpcHRzX29ubHlfaW5faXNvMTU5MjQiICUgcmVtb3ZlX3NjcmlwdHMpCisKKworZGVmIFBhcnNlQmxvY2tzKGluX2ZpbGUpOgorICBmb3IgZGF0YSBpbiBSZWFkVUNETGluZXMoaW5fZmlsZSwgd2FudF9taXNzaW5nPVRydWUpOgorICAgIGlmIGRhdGFbMF0gPT0gIm1pc3NpbmciOgorICAgICAgU2V0RGVmYXVsdFZhbHVlKCJibGsiLCBkYXRhWzJdWzBdKQorICAgIGVsc2U6CisgICAgICAjIHR5cGUgPT0gInJhbmdlIgorICAgICAgKHN0YXJ0LCBlbmQsIG5hbWUpID0gKGRhdGFbMl0sIGRhdGFbM10sIGRhdGFbNF1bMV0pCisgICAgICBfYmxvY2tzLmFwcGVuZCgoc3RhcnQsIGVuZCwgeyJibGsiOiBuYW1lfSkpCisgICAgICBTZXRQcm9wZXJ0eVZhbHVlKCJibGsiLCBuYW1lLCBzdGFydCwgZW5kKQorICBfYmxvY2tzLnNvcnQoKQorICAjIENoZWNrIGZvciBvdmVybGFwcGluZyBibG9ja3MuCisgIHByZXZfZW5kID0gLTEKKyAgZm9yIGIgaW4gX2Jsb2NrczoKKyAgICBzdGFydCA9IGJbMF0KKyAgICBlbmQgPSBiWzFdCisgICAgaWYgcHJldl9lbmQgPj0gc3RhcnQ6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICJibG9jayAlMDRsWC4uJTA0bFggJXMgb3ZlcmxhcHMgd2l0aCBhbm90aGVyICIgKworICAgICAgICAgICJlbmRpbmcgYXQgJTA0bFhcbiAgJXNcbiIgJQorICAgICAgICAgIChzdGFydCwgZW5kLCBiWzJdWyJibGsiXSwgcHJldl9lbmQpKQorICAgIHByZXZfZW5kID0gZW5kCisKKworZGVmIFBhcnNlVW5pY29kZURhdGEoaW5fZmlsZSk6CisgIGR0X3Byb3AgPSBHZXRQcm9wZXJ0eSgiZHQiKQorICByYW5nZV9maXJzdF9saW5lID0gIiIKKyAgcmFuZ2VfZmlyc3QgPSAtMQorICBmb3IgZGF0YSBpbiBSZWFkVUNETGluZXMoaW5fZmlsZSwgd2FudF9taXNzaW5nPVRydWUpOgorICAgICMgdHlwZSA9PSAicmFuZ2UiCisgICAgKGxpbmUsIGMsIGVuZCwgZmllbGRzKSA9IChkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdKQorICAgIGFzc2VydCBjID09IGVuZAorICAgIG5hbWUgPSBmaWVsZHNbMV0KKyAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoIjwiKToKKyAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIiwgRmlyc3Q+Iik6CisgICAgICAgIGlmIHJhbmdlX2ZpcnN0ID49IDA6CisgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoCisgICAgICAgICAgICAgICJlcnJvcjogdW50ZXJtaW5hdGVkIHJhbmdlIHN0YXJ0ZWQgYXRcbiAgJXNcbiIgJQorICAgICAgICAgICAgICByYW5nZV9maXJzdF9saW5lKQorICAgICAgICByYW5nZV9maXJzdCA9IGMKKyAgICAgICAgcmFuZ2VfZmlyc3RfbGluZSA9IGxpbmUKKyAgICAgICAgY29udGludWUKKyAgICAgIGVsaWYgbmFtZS5lbmRzd2l0aCgiLCBMYXN0PiIpOgorICAgICAgICBpZiByYW5nZV9maXJzdCA8IDA6CisgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoCisgICAgICAgICAgICAgICJlcnJvcjogcmFuZ2UgZW5kIHdpdGhvdXQgc3RhcnQgYXRcbiAgJXNcbiIgJQorICAgICAgICAgICAgICBsaW5lKQorICAgICAgICBlbGlmIHJhbmdlX2ZpcnN0ID4gYzoKKyAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigKKyAgICAgICAgICAgICAgImVycm9yOiByYW5nZSBzdGFydC9lbmQgb3V0IG9mIG9yZGVyIGF0XG4gICVzXG4gICVzXG4iICUKKyAgICAgICAgICAgICAgKHJhbmdlX2ZpcnN0X2xpbmUsIGxpbmUpKQorICAgICAgICBmaXJzdF9uYW1lID0gcmFuZ2VfZmlyc3RfbGluZS5zcGxpdCgiOyIpWzFdWzE6LThdCisgICAgICAgIG5hbWUgPSBuYW1lWzE6LTddCisgICAgICAgIGlmIGZpcnN0X25hbWUgIT0gbmFtZToKKyAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigKKyAgICAgICAgICAgICAgImVycm9yOiByYW5nZSBzdGFydC9lbmQgbmFtZSBtaXNtYXRjaCBhdFxuICAlc1xuICAlc1xuIiAlCisgICAgICAgICAgICAgIChyYW5nZV9maXJzdF9saW5lLCBsaW5lKSkKKyAgICAgICAgZW5kID0gYworICAgICAgICBjID0gcmFuZ2VfZmlyc3QKKyAgICAgICAgcmFuZ2VfZmlyc3QgPSAtMQorICAgICAgICAjIFJlbWVtYmVyIGFsZ29yaXRobWljIG5hbWUgcmFuZ2VzLgorICAgICAgICBpZiAiSWRlb2dyYXBoIiBpbiBuYW1lOgorICAgICAgICAgIF9hbGdfbmFtZXNfcmFuZ2VzLmFwcGVuZChbYywgZW5kLCAiaGFuIiwgIkNKSyBVTklGSUVEIElERU9HUkFQSC0iXSkKKyAgICAgICAgZWxpZiBuYW1lID09ICJIYW5ndWwgU3lsbGFibGUiOgorICAgICAgICAgIF9hbGdfbmFtZXNfcmFuZ2VzLmFwcGVuZChbYywgZW5kLCAiaGFuZ3VsIl0pCisgICAgICAgIG5hbWUgPSAiIgorICAgICAgZWxzZToKKyAgICAgICAgIyBJZ25vcmUgbm9uLW5hbWVzIGxpa2UgPGNvbnRyb2w+LgorICAgICAgICBuYW1lID0gIiIKKyAgICBwcm9wcyA9IHt9CisgICAgaWYgbmFtZTogcHJvcHNbIm5hIl0gPSBuYW1lCisgICAgcHJvcHNbImdjIl0gPSBmaWVsZHNbMl0KKyAgICBjY2MgPSBpbnQoZmllbGRzWzNdKQorICAgIGlmIGNjYzogcHJvcHNbImNjYyJdID0gY2NjCisgICAgcHJvcHNbImJjIl0gPSBmaWVsZHNbNF0KKyAgICAjIERlY29tcG9zaXRpb24gdHlwZSAmIG1hcHBpbmcuCisgICAgZG0gPSBmaWVsZHNbNV0KKyAgICBpZiBkbToKKyAgICAgIGlmIGRtLnN0YXJ0c3dpdGgoIjwiKToKKyAgICAgICAgZHRfbGltaXQgPSBkbS5pbmRleCgiPiIpCisgICAgICAgIGR0ID0gTm9ybWFsaXplUHJvcGVydHlWYWx1ZShkdF9wcm9wLCBkbVsxOmR0X2xpbWl0XSkKKyAgICAgICAgZG0gPSBkbVtkdF9saW1pdCArIDE6XS5sc3RyaXAoKQorICAgICAgZWxzZToKKyAgICAgICAgZHQgPSAiQ2FuIgorICAgICAgcHJvcHNbImR0Il0gPSBkdAorICAgICAgcHJvcHNbImRtIl0gPSBkbQorICAgICMgTnVtZXJpYyB0eXBlICYgdmFsdWUuCisgICAgZGVjaW1hbCA9IGZpZWxkc1s2XQorICAgIGRpZ2l0ID0gZmllbGRzWzddCisgICAgbnYgPSBmaWVsZHNbOF0KKyAgICBpZiAoZGVjaW1hbCBhbmQgZGVjaW1hbCAhPSBudikgb3IgKGRpZ2l0IGFuZCBkaWdpdCAhPSBudik6CisgICAgICByYWlzZSBTeW50YXhFcnJvcigiZXJyb3I6IG51bWVyaWMgdmFsdWVzIGRpZmZlciBhdFxuICAlc1xuIiAlIGxpbmUpCisgICAgaWYgbnY6CisgICAgICBwcm9wc1sibnYiXSA9IG52CisgICAgICBwcm9wc1sibnQiXSA9ICJEZSIgaWYgZGVjaW1hbCBlbHNlICJEaSIgaWYgZGlnaXQgZWxzZSAiTnUiCisgICAgaWYgZmllbGRzWzldID09ICJZIjogcHJvcHNbIkJpZGlfTSJdID0gVHJ1ZQorICAgICMgSUNVIDQ5IGFuZCBhYm92ZSBkb2VzIG5vdCBzdXBwb3J0IFVuaWNvZGVfMV9OYW1lIGFueSBtb3JlLgorICAgICMgU2VlIHRpY2tldCAjOTAxMy4KKyAgICAjIG5hMSA9IGZpZWxkc1sxMF0KKyAgICAjIGlmIG5hMTogcHJvcHNbIm5hMSJdID0gbmExCisgICAgIyBJU09fQ29tbWVudCBpcyBkZXByZWNhdGVkIGFuZCBoYXMgbm8gdmFsdWVzLgorICAgICMgaXNjID0gZmllbGRzWzExXQorICAgICMgaWYgaXNjOiBwcm9wc1siaXNjIl0gPSBpc2MKKyAgICAjIFNpbXBsZSBjYXNlIG1hcHBpbmdzLgorICAgIHN1YyA9IGZpZWxkc1sxMl0KKyAgICBzbGMgPSBmaWVsZHNbMTNdCisgICAgc3RjID0gZmllbGRzWzE0XQorICAgIGlmIHN1YzogcHJvcHNbInN1YyJdID0gc3VjCisgICAgaWYgc2xjOiBwcm9wc1sic2xjIl0gPSBzbGMKKyAgICBpZiBzdGM6IHByb3BzWyJzdGMiXSA9IHN0YworICAgIFNldFByb3BzKGMsIGVuZCwgcHJvcHMpCisgIGlmIHJhbmdlX2ZpcnN0ID49IDA6CisgICAgcmFpc2UgU3ludGF4RXJyb3IoCisgICAgICAgICJlcnJvcjogdW50ZXJtaW5hdGVkIHJhbmdlIHN0YXJ0ZWQgYXRcbiAgJXNcbiIgJQorICAgICAgICByYW5nZV9maXJzdF9saW5lKQorICAjIEhhbmd1bCBzeWxsYWJsZXMgaGF2ZSBjYW5vbmljYWwgZGVjb21wb3NpdGlvbnMgd2hpY2ggYXJlIG5vdCBsaXN0ZWQgaW4gVW5pY29kZURhdGEudHh0LgorICBTZXRQcm9wZXJ0eVZhbHVlKCJkdCIsICJDYW4iLCAweGFjMDAsIDB4ZDdhMykKKyAgX2FsZ19uYW1lc19yYW5nZXMuc29ydCgpCisKKworX25hbWVzX2gxX3JlID0gcmUuY29tcGlsZSgiQEBcdChbMC05YS1mQS1GXSspXHQoLis/KVx0KFswLTlhLWZBLUZdKykkIikKK19uYW1lc19oMl9yZSA9IHJlLmNvbXBpbGUoIkBcdFx0KC4rKSIpCitfbmFtZXNfY2hhcl9yZSA9IHJlLmNvbXBpbGUoIihbMC05YS1mQS1GXSspXHQuKyIpCisKK2RlZiBQYXJzZU5hbWVzTGlzdChpbl9maWxlKToKKyAgcGVuZGluZ19oMiA9ICIiCisgIGZvciBsaW5lIGluIGluX2ZpbGU6CisgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgIGlmIG5vdCBsaW5lOiBjb250aW51ZQorICAgIG1hdGNoID0gX25hbWVzX2gxX3JlLm1hdGNoKGxpbmUpCisgICAgaWYgbWF0Y2g6CisgICAgICBwZW5kaW5nX2gyID0gIiIgICMgRHJvcCBhIHBlbmRpbmcgaDIgd2hlbiB3ZSBnZXQgdG8gYW4gaDEuCisgICAgICBzdGFydCA9IGludChtYXRjaC5ncm91cCgxKSwgMTYpCisgICAgICBlbmQgPSBpbnQobWF0Y2guZ3JvdXAoMyksIDE2KQorICAgICAgY29tbWVudCA9IG1hdGNoLmdyb3VwKDIpLnJlcGxhY2UodSJceGEwIiwgIiAiKQorICAgICAgX2gxLmFwcGVuZCgoc3RhcnQsIGVuZCwgY29tbWVudCkpCisgICAgICBjb250aW51ZQorICAgIG1hdGNoID0gX25hbWVzX2gyX3JlLm1hdGNoKGxpbmUpCisgICAgaWYgbWF0Y2g6CisgICAgICBwZW5kaW5nX2gyID0gbWF0Y2guZ3JvdXAoMSkucmVwbGFjZSh1Ilx4YTAiLCAiICIpCisgICAgICBjb250aW51ZQorICAgIGlmIHBlbmRpbmdfaDI6CisgICAgICBtYXRjaCA9IF9uYW1lc19jaGFyX3JlLm1hdGNoKGxpbmUpCisgICAgICBpZiBtYXRjaDoKKyAgICAgICAgYyA9IGludChtYXRjaC5ncm91cCgxKSwgMTYpCisgICAgICAgIF9oMi5hcHBlbmQoKGMsIHBlbmRpbmdfaDIpKQorICAgICAgICBwZW5kaW5nX2gyID0gIiIKKyAgX2gxLnNvcnQoKQorICBfaDIuc29ydCgpCisKKworZGVmIFBhcnNlTmFtZWRQcm9wZXJ0aWVzKGluX2ZpbGUpOgorICAiIiJQYXJzZXMgYSAudHh0IGZpbGUgd2hlcmUgdGhlIGZpcnN0IGNvbHVtbiBpcyBhIGNvZGUgcG9pbnQgcmFuZ2UKKyAgYW5kIHRoZSBzZWNvbmQgY29sdW1uIGlzIGEgcHJvcGVydHkgbmFtZS4KKyAgU2V0cyBiaW5hcnkgcHJvcGVydGllcyB0byBUcnVlLAorICBhbmQgb3RoZXIgcHJvcGVydGllcyB0byB0aGUgdmFsdWVzIGluIHRoZSB0aGlyZCBjb2x1bW4uIiIiCisgIGZvciBkYXRhIGluIFJlYWRVQ0RMaW5lcyhpbl9maWxlLCB3YW50X21pc3Npbmc9VHJ1ZSk6CisgICAgaWYgZGF0YVswXSA9PSAibWlzc2luZyI6CisgICAgICBTZXREZWZhdWx0VmFsdWUoZGF0YVsyXVswXSwgZGF0YVsyXVsxXSkKKyAgICBlbHNlOgorICAgICAgIyB0eXBlID09ICJyYW5nZSIKKyAgICAgIGlmIGxlbihkYXRhWzRdKSA9PSAyOgorICAgICAgICBTZXRCaW5hcnlQcm9wZXJ0eVRvVHJ1ZShkYXRhWzRdWzFdLCBkYXRhWzJdLCBkYXRhWzNdKQorICAgICAgZWxzZToKKyAgICAgICAgU2V0UHJvcGVydHlWYWx1ZShkYXRhWzRdWzFdLCBkYXRhWzRdWzJdLCBkYXRhWzJdLCBkYXRhWzNdKQorCisKK2RlZiBQYXJzZU9uZVByb3BlcnR5KGluX2ZpbGUsIHBuYW1lKToKKyAgIiIiUGFyc2VzIGEgLnR4dCBmaWxlIHdoZXJlIHRoZSBmaXJzdCBjb2x1bW4gaXMgYSBjb2RlIHBvaW50IHJhbmdlCisgIGFuZCB0aGUgc2Vjb25kIGNvbHVtbiBpcyB0aGUgdmFsdWUgb2YgYSBrbm93biBwcm9wZXJ0eS4iIiIKKyAgcHJvcCA9IEdldFByb3BlcnR5KHBuYW1lKQorICBmb3IgZGF0YSBpbiBSZWFkVUNETGluZXMoaW5fZmlsZSwgd2FudF9taXNzaW5nPVRydWUpOgorICAgIGlmIGRhdGFbMF0gPT0gIm1pc3NpbmciOgorICAgICAgU2V0RGVmYXVsdFZhbHVlKHBuYW1lLCBkYXRhWzJdWzBdKQorICAgIGVsc2U6CisgICAgICAjIHR5cGUgPT0gInJhbmdlIgorICAgICAgU2V0UHJvcFZhbHVlKHByb3AsIGRhdGFbNF1bMV0sIGRhdGFbMl0sIGRhdGFbM10pCisKKworZGVmIFBhcnNlQmlkaU1pcnJvcmluZyhpbl9maWxlKTogUGFyc2VPbmVQcm9wZXJ0eShpbl9maWxlLCAiYm1nIikKK2RlZiBQYXJzZURlcml2ZWRBZ2UoaW5fZmlsZSk6IFBhcnNlT25lUHJvcGVydHkoaW5fZmlsZSwgImFnZSIpCitkZWYgUGFyc2VEZXJpdmVkQmlkaUNsYXNzKGluX2ZpbGUpOiBQYXJzZU9uZVByb3BlcnR5KGluX2ZpbGUsICJiYyIpCitkZWYgUGFyc2VEZXJpdmVkSm9pbmluZ0dyb3VwKGluX2ZpbGUpOiBQYXJzZU9uZVByb3BlcnR5KGluX2ZpbGUsICJqZyIpCitkZWYgUGFyc2VEZXJpdmVkSm9pbmluZ1R5cGUoaW5fZmlsZSk6IFBhcnNlT25lUHJvcGVydHkoaW5fZmlsZSwgImp0IikKK2RlZiBQYXJzZUVhc3RBc2lhbldpZHRoKGluX2ZpbGUpOiBQYXJzZU9uZVByb3BlcnR5KGluX2ZpbGUsICJlYSIpCitkZWYgUGFyc2VHcmFwaGVtZUJyZWFrUHJvcGVydHkoaW5fZmlsZSk6IFBhcnNlT25lUHJvcGVydHkoaW5fZmlsZSwgIkdDQiIpCitkZWYgUGFyc2VJbmRpY01hdHJhQ2F0ZWdvcnkoaW5fZmlsZSk6IFBhcnNlT25lUHJvcGVydHkoaW5fZmlsZSwgIkluTUMiKQorZGVmIFBhcnNlSW5kaWNTeWxsYWJpY0NhdGVnb3J5KGluX2ZpbGUpOiBQYXJzZU9uZVByb3BlcnR5KGluX2ZpbGUsICJJblNDIikKK2RlZiBQYXJzZUxpbmVCcmVhayhpbl9maWxlKTogUGFyc2VPbmVQcm9wZXJ0eShpbl9maWxlLCAibGIiKQorZGVmIFBhcnNlU2NyaXB0cyhpbl9maWxlKTogUGFyc2VPbmVQcm9wZXJ0eShpbl9maWxlLCAic2MiKQorZGVmIFBhcnNlU2NyaXB0RXh0ZW5zaW9ucyhpbl9maWxlKTogUGFyc2VPbmVQcm9wZXJ0eShpbl9maWxlLCAic2N4IikKK2RlZiBQYXJzZVNlbnRlbmNlQnJlYWsoaW5fZmlsZSk6IFBhcnNlT25lUHJvcGVydHkoaW5fZmlsZSwgIlNCIikKK2RlZiBQYXJzZVdvcmRCcmVhayhpbl9maWxlKTogUGFyc2VPbmVQcm9wZXJ0eShpbl9maWxlLCAiV0IiKQorCisKK2RlZiBEb1NldE5hbWVBbGlhcyhhbGlhcywgc3RhcnQsIGVuZCwgY19wcm9wcyk6CisgIGlmICJOYW1lX0FsaWFzIiBpbiBjX3Byb3BzOgorICAgIGNfcHJvcHNbIk5hbWVfQWxpYXMiXSArPSAnLCcgKyBhbGlhcworICBlbHNlOgorICAgIGNfcHJvcHNbIk5hbWVfQWxpYXMiXSA9IGFsaWFzCisKKworZGVmIFBhcnNlTmFtZUFsaWFzZXMoaW5fZmlsZSk6CisgICIiIlBhcnNlcyBOYW1lX0FsaWFzIGZyb20gTmFtZUFsaWFzZXMudHh0LgorICBBIGNoYXJhY3RlciBjYW4gaGF2ZSBtdWx0aXBsZSBhbGlhc2VzLgorCisgIEluIFVuaWNvZGUgNi4wLCB0aGVyZSBhcmUgdHdvIGNvbHVtbnMsCisgIHdpdGggYSBuYW1lIGNvcnJlY3Rpb24gaW4gdGhlIHNlY29uZCBjb2x1bW4uCisKKyAgSW4gVW5pY29kZSA2LjEsIHRoZXJlIGFyZSB0aHJlZSBjb2x1bW5zLgorICBUaGUgc2Vjb25kIGNvbnRhaW5zIGFuIGFsaWFzLCB0aGUgdGhpcmQgaXRzIHR5cGUuCisgIFRoZSBkb2N1bWVudGVkIHR5cGVzIGFyZToKKyAgICBjb3JyZWN0aW9uLCBjb250cm9sLCBhbHRlcm5hdGUsIGZpZ21lbnQsIGFiYnJldmlhdGlvbgorCisgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc29ydCB0aGUgdHlwZXMsIGFzc3VtaW5nIHRoZXkgYXBwZWFyIGluIHRoaXMgb3JkZXIuIiIiCisgIGZvciBkYXRhIGluIFJlYWRVQ0RMaW5lcyhpbl9maWxlKToKKyAgICBzdGFydCA9IGRhdGFbMl0KKyAgICBlbmQgPSBkYXRhWzNdCisgICAgaWYgc3RhcnQgIT0gZW5kOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTmFtZUFsaWFzZXMudHh0IGhhcyBhbiBhbGlhcyBmb3IgYSByYW5nZSAlMDRsWC4uJTA0bFgiICUKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0LCBlbmQpKQorICAgIGZpZWxkcyA9IGRhdGFbNF0KKyAgICBpZiBsZW4oZmllbGRzKSA9PSAyOgorICAgICAgYWxpYXMgPSAiY29ycmVjdGlvbj0iICsgZmllbGRzWzFdCisgICAgZWxzZToKKyAgICAgIGFsaWFzID0gZmllbGRzWzJdICsgJz0nICsgZmllbGRzWzFdCisgICAgdXBkYXRlID0gKE5lZWRUb1NldEFsd2F5cywgRG9TZXROYW1lQWxpYXMsIGFsaWFzKQorICAgIFVwZGF0ZVByb3BzKHN0YXJ0LCBlbmQsIHVwZGF0ZSkKKworCitkZWYgTmVlZFRvU2V0TnVtZXJpY1ZhbHVlKG52LCBzdGFydCwgZW5kLCBjX3Byb3BzKToKKyAgY19udiA9IGNfcHJvcHMuZ2V0KCJudiIpCisgIGlmIGNfbnYgPT0gTm9uZToKKyAgICAjIERlcml2ZWROdW1lcmljVmFsdWVzLnR4dCBhZGRzIGEgTnVtZXJpY19WYWx1ZS4KKyAgICBhc3NlcnQgIm50IiBub3QgaW4gY19wcm9wcworICAgIHJldHVybiBUcnVlCisgIGlmIG52ICE9IGNfbnY6CisgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5pY29kZURhdGEudHh0IGhhcyBudj0lcyBmb3IgJTA0bFguLiUwNGxYICIgKworICAgICAgICAgICAgICAgICAgICAgImJ1dCBEZXJpdmVkTnVtZXJpY1ZhbHVlcy50eHQgaGFzIG52PSVzIiAlCisgICAgICAgICAgICAgICAgICAgICAoY19udiwgc3RhcnQsIGVuZCwgbnYpKQorICByZXR1cm4gRmFsc2UKKworCitkZWYgRG9TZXROdW1lcmljVmFsdWUobnYsIHN0YXJ0LCBlbmQsIGNfcHJvcHMpOgorICBjX3Byb3BzLnVwZGF0ZSh7Im50IjogIk51IiwgIm52IjogbnZ9KQorCisKK2RlZiBQYXJzZURlcml2ZWROdW1lcmljVmFsdWVzKGluX2ZpbGUpOgorICAiIiJQYXJzZXMgRGVyaXZlZE51bWVyaWNWYWx1ZXMudHh0LgorICBGb3IgbW9zdCBjaGFyYWN0ZXJzLCB0aGUgbnVtZXJpYyB0eXBlICYgdmFsdWUgd2VyZSBwYXJzZWQgcHJldmlvdXNseQorICBmcm9tIFVuaWNvZGVEYXRhLnR4dCBidXQgdGhhdCBkb2VzIG5vdCBzaG93IHRoZSB2YWx1ZXMgZm9yIEhhbiBjaGFyYWN0ZXJzLgorICBIZXJlIHdlIGNoZWNrIHRoYXQgdmFsdWVzIG1hdGNoIHRob3NlIGZyb20gVW5pY29kZURhdGEudHh0CisgIGFuZCBhZGQgbmV3IG9uZXMuIiIiCisgICMgSWdub3JlIHRoZSBAbWlzc2luZyBsaW5lIHdoaWNoIGhhcyBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIGZpZWxkcywKKyAgIyBhbmQgdGhlICJOYU4iIGluIHRoZSB3cm9uZyBmaWVsZCAoYXQgbGVhc3QgaW4gVW5pY29kZSA1LjEuLjYuMSkuCisgICMgQWxzbywgIk5hTiIgaXMganVzdCB0aGUgTnVtZXJpYyBudWxsIHZhbHVlIGFueXdheS4KKyAgZm9yIGRhdGEgaW4gUmVhZFVDRExpbmVzKGluX2ZpbGUpOgorICAgICMgQ29uZGl0aW9uYWwgdXBkYXRlIHRvIHRoZSBudW1lcmljIHZhbHVlIGluIHRoZSA0dGggZmllbGQuCisgICAgdXBkYXRlID0gKE5lZWRUb1NldE51bWVyaWNWYWx1ZSwgRG9TZXROdW1lcmljVmFsdWUsIGRhdGFbNF1bM10pCisgICAgVXBkYXRlUHJvcHMoZGF0YVsyXSwgZGF0YVszXSwgdXBkYXRlKQorCisKK2RlZiBQYXJzZUNhc2VGb2xkaW5nKGluX2ZpbGUpOgorICBmb3IgZGF0YSBpbiBSZWFkVUNETGluZXMoaW5fZmlsZSwgd2FudF9taXNzaW5nPVRydWUpOgorICAgIGlmIGRhdGFbMF0gPT0gIm1pc3NpbmciOgorICAgICAgYXNzZXJ0IGRhdGFbMl1bMF0gPT0gIkMiICAjIGNvbW1vbiB0byBzY2YgJiBjZgorICAgICAgU2V0RGVmYXVsdFZhbHVlKCJzY2YiLCBkYXRhWzJdWzFdKQorICAgICAgU2V0RGVmYXVsdFZhbHVlKCJjZiIsIGRhdGFbMl1bMV0pCisgICAgZWxzZToKKyAgICAgICMgdHlwZSA9PSAicmFuZ2UiCisgICAgICBzdGFydCA9IGRhdGFbMl0KKyAgICAgIGVuZCA9IGRhdGFbM10KKyAgICAgIHN0YXR1cyA9IGRhdGFbNF1bMV0KKyAgICAgIG1hcHBpbmcgPSBkYXRhWzRdWzJdCisgICAgICBhc3NlcnQgc3RhdHVzIGluICJDU0ZUIgorICAgICAgaWYgc3RhdHVzID09ICJDIjoKKyAgICAgICAgU2V0UHJvcHMoc3RhcnQsIGVuZCwgeyJzY2YiOiBtYXBwaW5nLCAiY2YiOiBtYXBwaW5nfSkKKyAgICAgIGVsaWYgc3RhdHVzID09ICJTIjoKKyAgICAgICAgU2V0UHJvcGVydHlWYWx1ZSgic2NmIiwgbWFwcGluZywgc3RhcnQsIGVuZCkKKyAgICAgIGVsaWYgc3RhdHVzID09ICJGIjoKKyAgICAgICAgU2V0UHJvcGVydHlWYWx1ZSgiY2YiLCBtYXBwaW5nLCBzdGFydCwgZW5kKQorICAgICAgZWxzZTogICMgc3RhdHVzID09ICJUIgorICAgICAgICBTZXRQcm9wZXJ0eVZhbHVlKCJUdXJraWNfQ2FzZV9Gb2xkaW5nIiwgbWFwcGluZywgc3RhcnQsIGVuZCkKKworCitkZWYgRG9TZXRDb25kaXRpb25hbENhc2VNYXBwaW5ncyhjY20sIHN0YXJ0LCBlbmQsIGNfcHJvcHMpOgorICBpZiAiQ29uZGl0aW9uYWxfQ2FzZV9NYXBwaW5ncyIgaW4gY19wcm9wczoKKyAgICBjX3Byb3BzWyJDb25kaXRpb25hbF9DYXNlX01hcHBpbmdzIl0gKz0gJywnICsgY2NtCisgIGVsc2U6CisgICAgY19wcm9wc1siQ29uZGl0aW9uYWxfQ2FzZV9NYXBwaW5ncyJdID0gY2NtCisKKworZGVmIFBhcnNlU3BlY2lhbENhc2luZyhpbl9maWxlKToKKyAgZm9yIGRhdGEgaW4gUmVhZFVDRExpbmVzKGluX2ZpbGUsIHdhbnRfbWlzc2luZz1UcnVlKToKKyAgICBpZiBkYXRhWzBdID09ICJtaXNzaW5nIjoKKyAgICAgIFNldERlZmF1bHRWYWx1ZSgibGMiLCBkYXRhWzJdWzBdKQorICAgICAgU2V0RGVmYXVsdFZhbHVlKCJ0YyIsIGRhdGFbMl1bMV0pCisgICAgICBTZXREZWZhdWx0VmFsdWUoInVjIiwgZGF0YVsyXVsyXSkKKyAgICBlbHNlOgorICAgICAgIyB0eXBlID09ICJyYW5nZSIKKyAgICAgIHN0YXJ0ID0gZGF0YVsyXQorICAgICAgZW5kID0gZGF0YVszXQorICAgICAgZmllbGRzID0gZGF0YVs0XQorICAgICAgaWYgbGVuKGZpZWxkcykgPCA1IG9yIG5vdCBmaWVsZHNbNF06CisgICAgICAgICMgVW5jb25kaXRpb25hbCBtYXBwaW5ncy4KKyAgICAgICAgU2V0UHJvcHMoc3RhcnQsIGVuZCwgeyJsYyI6IGZpZWxkc1sxXSwgInRjIjogZmllbGRzWzJdLCAidWMiOiBmaWVsZHNbM119KQorICAgICAgZWxzZToKKyAgICAgICAgIyBDb25kaXRpb25hbF9DYXNlX01hcHBpbmdzCisgICAgICAgIGNjbSA9IChmaWVsZHNbNF0gKyAiOmxjPSIgKyBmaWVsZHNbMV0gKworICAgICAgICAgICAgICAgIiZ0Yz0iICsgZmllbGRzWzJdICsgIiZ1Yz0iICsgZmllbGRzWzNdKQorICAgICAgICB1cGRhdGUgPSAoTmVlZFRvU2V0QWx3YXlzLCBEb1NldENvbmRpdGlvbmFsQ2FzZU1hcHBpbmdzLCBjY20pCisgICAgICAgIFVwZGF0ZVByb3BzKHN0YXJ0LCBlbmQsIHVwZGF0ZSkKKworIyBQb3N0cHJvY2Vzc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKioKKworZGVmIENvbXBhY3RCbG9jayhiLCBpKToKKyAgYXNzZXJ0IGJbMF0gPT0gX3N0YXJ0c1tpXQorICBvcmlnX2kgPSBpCisgICMgQ291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBlYWNoIHByb3BlcnR5J3MgdmFsdWUgaW4gdGhpcyBibG9jay4KKyAgbnVtX2NwX3NvX2ZhciA9IDAKKyAgcHJvcF9jb3VudGVycyA9IHt9CisgIHdoaWxlIFRydWU6CisgICAgc3RhcnQgPSBfc3RhcnRzW2ldCisgICAgaWYgc3RhcnQgPiBiWzFdOiBicmVhaworICAgIG51bV9jcF9pbl90aGlzX3JhbmdlID0gX3N0YXJ0c1tpICsgMV0gLSBzdGFydAorICAgIHByb3BzID0gX3Byb3BzW2ldCisgICAgZm9yIChwbmFtZSwgdmFsdWUpIGluIHByb3BzLml0ZXJpdGVtcygpOgorICAgICAgaWYgcG5hbWUgaW4gcHJvcF9jb3VudGVyczoKKyAgICAgICAgY291bnRlciA9IHByb3BfY291bnRlcnNbcG5hbWVdCisgICAgICBlbHNlOgorICAgICAgICBjb3VudGVyID0ge19udWxsX29yX2RlZmF1bHRzW3BuYW1lXTogbnVtX2NwX3NvX2Zhcn0KKyAgICAgICAgcHJvcF9jb3VudGVyc1twbmFtZV0gPSBjb3VudGVyCisgICAgICBpZiB2YWx1ZSBpbiBjb3VudGVyOgorICAgICAgICBjb3VudGVyW3ZhbHVlXSArPSBudW1fY3BfaW5fdGhpc19yYW5nZQorICAgICAgZWxzZToKKyAgICAgICAgY291bnRlclt2YWx1ZV0gPSBudW1fY3BfaW5fdGhpc19yYW5nZQorICAgICMgQWxzbyBjb3VudCBkZWZhdWx0IHZhbHVlcyBmb3IgcHJvcGVydGllcyB0aGF0IGRvIG5vdCBvY2N1ciBpbiBhIHJhbmdlLgorICAgIGZvciBwbmFtZSBpbiBwcm9wX2NvdW50ZXJzOgorICAgICAgaWYgcG5hbWUgbm90IGluIHByb3BzOgorICAgICAgICBjb3VudGVyID0gcHJvcF9jb3VudGVyc1twbmFtZV0KKyAgICAgICAgdmFsdWUgPSBfbnVsbF9vcl9kZWZhdWx0c1twbmFtZV0KKyAgICAgICAgY291bnRlclt2YWx1ZV0gKz0gbnVtX2NwX2luX3RoaXNfcmFuZ2UKKyAgICBudW1fY3Bfc29fZmFyICs9IG51bV9jcF9pbl90aGlzX3JhbmdlCisgICAgIyBJbnZhcmlhbnQ6IEZvciBlYWNoIGNvdW50ZXIsIHRoZSBzdW0gb2YgY291bnRzIG11c3QgZXF1YWwgbnVtX2NwX3NvX2Zhci4KKyAgICBpICs9IDEKKyAgIyBGb3IgZWFjaCBwcm9wZXJ0eSB0aGF0IG9jY3VycyB3aXRoaW4gdGhpcyBibG9jaywKKyAgIyBzZXQgdGhlIG1vc3QgY29tbW9uIHZhbHVlIGFzIGEgYmxvY2sgcHJvcGVydHkgdmFsdWUuCisgIGJfcHJvcHMgPSBiWzJdCisgIGZvciAocG5hbWUsIGNvdW50ZXIpIGluIHByb3BfY291bnRlcnMuaXRlcml0ZW1zKCk6CisgICAgbWF4X3ZhbHVlID0gTm9uZQorICAgIG1heF9jb3VudCA9IDAKKyAgICBudW1fdW5pcXVlID0gMAorICAgIGZvciAodmFsdWUsIGNvdW50KSBpbiBjb3VudGVyLml0ZXJpdGVtcygpOgorICAgICAgaWYgY291bnQgPiBtYXhfY291bnQ6CisgICAgICAgIG1heF92YWx1ZSA9IHZhbHVlCisgICAgICAgIG1heF9jb3VudCA9IGNvdW50CisgICAgICBpZiBjb3VudCA9PSAxOiBudW1fdW5pcXVlICs9IDEKKyAgICBpZiBtYXhfdmFsdWUgIT0gX251bGxfb3JfZGVmYXVsdHNbcG5hbWVdOgorICAgICAgIyBBdm9pZCBwaWNraW5nIHJhbmRvbWx5IGFtb25nIHNldmVyYWwgdW5pcXVlIHZhbHVlcy4KKyAgICAgIGlmIChtYXhfY291bnQgPiAxIG9yIG51bV91bmlxdWUgPT0gMSk6CisgICAgICAgIGJfcHJvcHNbcG5hbWVdID0gbWF4X3ZhbHVlCisgICMgRm9yIGVhY2ggcmFuZ2UgYW5kIHByb3BlcnR5LCByZW1vdmUgdGhlIGRlZmF1bHQrYmxvY2sgdmFsdWUKKyAgIyBidXQgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoYXQgcHJvcGVydHkgd2FzIG5vdCBzZXQKKyAgIyAoaS5lLiwgaXQgdXNlZCB0byBpbmhlcml0IHRoZSBkZWZhdWx0IHZhbHVlKS4KKyAgYl9kZWZhdWx0cyA9IF9udWxsX29yX2RlZmF1bHRzLmNvcHkoKQorICBiX2RlZmF1bHRzLnVwZGF0ZShiX3Byb3BzKQorICBpID0gb3JpZ19pCisgIHdoaWxlIFRydWU6CisgICAgc3RhcnQgPSBfc3RhcnRzW2ldCisgICAgaWYgc3RhcnQgPiBiWzFdOiBicmVhaworICAgIHByb3BzID0gX3Byb3BzW2ldCisgICAgZm9yIHBuYW1lIGluIHByb3BfY291bnRlcnM6CisgICAgICBpZiBwbmFtZSBpbiBwcm9wczoKKyAgICAgICAgaWYgcHJvcHNbcG5hbWVdID09IGJfZGVmYXVsdHNbcG5hbWVdOiBkZWwgcHJvcHNbcG5hbWVdCisgICAgICBlbGlmIHBuYW1lIGluIGJfcHJvcHM6CisgICAgICAgICMgYl9wcm9wcyBvbmx5IGhhcyBub24tZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgICMgU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0IHVzZWQgdG8gYmUgaW5oZXJpdGVkLgorICAgICAgICBwcm9wc1twbmFtZV0gPSBfbnVsbF9vcl9kZWZhdWx0c1twbmFtZV0KKyAgICBpICs9IDEKKyAgIyBSZXR1cm4gdGhlIF9zdGFydHMgaW5kZXggb2YgdGhlIGZpcnN0IHJhbmdlIGFmdGVyIHRoaXMgYmxvY2suCisgIHJldHVybiBpCisKKworZGVmIENvbXBhY3ROb25CbG9jayhsaW1pdCwgaSk6CisgICIiIlJlbW92ZSBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcyBmcm9tIGJldHdlZW4tYmxvY2sgcmFuZ2VzLiIiIgorICB3aGlsZSBUcnVlOgorICAgIHN0YXJ0ID0gX3N0YXJ0c1tpXQorICAgIGlmIHN0YXJ0ID49IGxpbWl0OiBicmVhaworICAgIHByb3BzID0gX3Byb3BzW2ldCisgICAgZm9yIHBuYW1lIGluIHByb3BzLmtleXMoKTogICMgLmtleXMoKSBpcyBhIGNvcHkgc28gd2UgY2FuIGRlbCBwcm9wc1twbmFtZV0uCisgICAgICBpZiBwcm9wc1twbmFtZV0gPT0gX251bGxfb3JfZGVmYXVsdHNbcG5hbWVdOiBkZWwgcHJvcHNbcG5hbWVdCisgICAgaSArPSAxCisgICMgUmV0dXJuIHRoZSBfc3RhcnRzIGluZGV4IG9mIHRoZSBmaXJzdCByYW5nZSBhZnRlciB0aGlzIGJsb2NrLgorICByZXR1cm4gaQorCisKK2RlZiBDb21wYWN0QmxvY2tzKCk6CisgICIiIk9wdGltaXplcyBibG9jayBwcm9wZXJ0aWVzLgorICBTZXRzIHByb3BlcnRpZXMgb24gYmxvY2tzIHRvIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgdmFsdWVzLAorICBhbmQgcmVtb3ZlcyBkZWZhdWx0K2Jsb2NrIHZhbHVlcyBmcm9tIGNvZGUgcG9pbnQgcHJvcGVydGllcy4iIiIKKyAgIyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBhIGJvdW5kYXJ5IGluIF9zdGFydHMgZm9yIGVhY2ggYmxvY2sKKyAgIyBzbyB0aGF0IHRoZSBzaW1wbGUgbWl4aW5nIG1ldGhvZCBiZWxvdyB3b3Jrcy4KKyAgZm9yIGIgaW4gX2Jsb2NrczogQWRkQm91bmRhcnkoYlswXSkKKyAgIyBXYWxrIHRocm91Z2ggcmFuZ2VzIGFuZCBibG9ja3MgdG9nZXRoZXIuCisgIGkgPSAwCisgIGZvciBiIGluIF9ibG9ja3M6CisgICAgYl9zdGFydCA9IGJbMF0KKyAgICBpZiBfc3RhcnRzW2ldIDwgYl9zdGFydDoKKyAgICAgIGkgPSBDb21wYWN0Tm9uQmxvY2soYl9zdGFydCwgaSkKKyAgICBpID0gQ29tcGFjdEJsb2NrKGIsIGkpCisgIENvbXBhY3ROb25CbG9jaygweDExMDAwMCwgaSkKKworIyBPdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKioKKworZGVmIEFwcGVuZFJhbmdlKGZpZWxkcywgc3RhcnQsIGVuZCk6CisgIGlmIHN0YXJ0ID09IGVuZDoKKyAgICBmaWVsZHMuYXBwZW5kKCIlMDRsWCIgJSBzdGFydCkKKyAgZWxzZToKKyAgICBmaWVsZHMuYXBwZW5kKCIlMDRsWC4uJTA0bFgiICUgKHN0YXJ0LCBlbmQpKQorCisKK2RlZiBBcHBlbmRQcm9wcyhmaWVsZHMsIHByb3BzKToKKyAgIyBTb3J0IHByb3BlcnR5IG5hbWVzIChwcm9wcyBrZXlzKSBieSB0aGVpciBub3JtYWxpemVkIGZvcm1zCisgICMgYW5kIG91dHB1dCBwcm9wZXJ0aWVzIGluIHRoYXQgb3JkZXIuCisgIGZvciBwbmFtZSBpbiBzb3J0ZWQocHJvcHMsIGtleT1Ob3JtUHJvcE5hbWUpOgorICAgIHZhbHVlID0gcHJvcHNbcG5hbWVdCisgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CisgICAgICBpZiBub3QgdmFsdWU6IHBuYW1lID0gIi0iICsgcG5hbWUKKyAgICAgIGZpZWxkcy5hcHBlbmQocG5hbWUpCisgICAgZWxzZToKKyAgICAgIGZpZWxkcy5hcHBlbmQoIiVzPSVzIiAlIChwbmFtZSwgdmFsdWUpKQorCisKK2RlZiBXcml0ZUZpZWxkc1JhbmdlUHJvcHMoZmllbGRzLCBzdGFydCwgZW5kLCBwcm9wcywgb3V0X2ZpbGUpOgorICBBcHBlbmRSYW5nZShmaWVsZHMsIHN0YXJ0LCBlbmQpCisgIEFwcGVuZFByb3BzKGZpZWxkcywgcHJvcHMpCisgIG91dF9maWxlLndyaXRlKCI7Ii5qb2luKGZpZWxkcykpCisgIG91dF9maWxlLndyaXRlKCJcbiIpCisKKworZGVmIFdyaXRlUHJlcGFyc2VkVUNEKG91dF9maWxlKToKKyAgb3V0X2ZpbGUud3JpdGUoIiMgUHJlcGFyc2VkIFVDRCBnZW5lcmF0ZWQgYnkgSUNVIHByZXBhcnNldWNkLnB5XG4iKTsKKyAgaWYgX2NvcHlyaWdodDogb3V0X2ZpbGUud3JpdGUoX2NvcHlyaWdodCArICJcbiIpCisgIGlmIF90ZXJtc19vZl91c2U6IG91dF9maWxlLndyaXRlKF90ZXJtc19vZl91c2UgKyAiXG4iKQorICBvdXRfZmlsZS53cml0ZSgidWNkOyVzXG5cbiIgJSBfdWNkX3ZlcnNpb24pCisgICMgU29ydCBwcm9wZXJ0eSBuYW1lcyAocHJvcHMga2V5cykgYnkgdGhlaXIgbm9ybWFsaXplZCBmb3JtcworICAjIGFuZCBvdXRwdXQgcHJvcGVydGllcyBpbiB0aGF0IG9yZGVyLgorICBwbmFtZXMgPSBzb3J0ZWQoX251bGxfdmFsdWVzLCBrZXk9Tm9ybVByb3BOYW1lKQorICBmb3IgcG5hbWUgaW4gcG5hbWVzOgorICAgIHByb3AgPSBfcHJvcGVydGllc1twbmFtZV0KKyAgICBvdXRfZmlsZS53cml0ZSgiOyIuam9pbihbInByb3BlcnR5IiwgcHJvcFswXV0gKyBwcm9wWzFdKSkKKyAgICBvdXRfZmlsZS53cml0ZSgiXG4iKQorICBvdXRfZmlsZS53cml0ZSgiXG4iKQorICBvdXRfZmlsZS53cml0ZSgiOyIuam9pbihbImJpbmFyeSJdICsgX2JpbmFyeV92YWx1ZXNbIk4iXSkpCisgIG91dF9maWxlLndyaXRlKCJcbiIpCisgIG91dF9maWxlLndyaXRlKCI7Ii5qb2luKFsiYmluYXJ5Il0gKyBfYmluYXJ5X3ZhbHVlc1siWSJdKSkKKyAgb3V0X2ZpbGUud3JpdGUoIlxuIikKKyAgZm9yIHBuYW1lIGluIHBuYW1lczoKKyAgICBwcm9wID0gX3Byb3BlcnRpZXNbcG5hbWVdCisgICAgc2hvcnRfbmFtZXMgPSBwcm9wWzJdCisgICAgaWYgc2hvcnRfbmFtZXMgYW5kIHByb3BbMF0gIT0gIkJpbmFyeSI6CisgICAgICBmb3IgbmFtZSBpbiBzb3J0ZWQoc2hvcnRfbmFtZXMpOgorICAgICAgICBvdXRfZmlsZS53cml0ZSgiOyIuam9pbihbInZhbHVlIiwgcHJvcFsxXVswXV0gKyBwcm9wWzNdW25hbWVdKSkKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUoIlxuIikKKyAgb3V0X2ZpbGUud3JpdGUoIlxuIikKKyAgIyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBhIGJvdW5kYXJ5IGluIF9zdGFydHMgZm9yIGVhY2gKKyAgIyByYW5nZSBvZiBkYXRhIHdlIG1peCBpbnRvIHRoZSBvdXRwdXQsCisgICMgc28gdGhhdCB0aGUgc2ltcGxlIG1peGluZyBtZXRob2QgYmVsb3cgd29ya3MuCisgIGZvciBiIGluIF9ibG9ja3M6IEFkZEJvdW5kYXJ5KGJbMF0pCisgIGZvciByIGluIF9hbGdfbmFtZXNfcmFuZ2VzOiBBZGRCb3VuZGFyeShyWzBdKQorICBmb3IgaCBpbiBfaDE6IEFkZEJvdW5kYXJ5KGhbMF0pCisgIGZvciBoIGluIF9oMjogQWRkQm91bmRhcnkoaFswXSkKKyAgIyBXcml0ZSB0aGUgcHJlcGFyc2VkIGRhdGEuCisgICMgVE9ETzogZG9jIHN5bnRheAorICAjIC0gcHB1Y2QudHh0ID0gcHJlcGFyc2VkIFVDRAorICAjIC0gT25seSB3aG9sZS1saW5lIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggIywgbm8gaW5saW5lIGNvbW1lbnRzLgorICAjIC0gZGVmYXVsdHMgbXVzdCBwcmVjZWRlIGFueSBibG9jayBvciBjcCBsaW5lcworICAjIC0gYmxvY2s7YS4uYiBtdXN0IHByZWNlZGUgYW55IGNwIGxpbmVzIHdpdGggY29kZSBwb2ludHMgaW4gYS4uYgorICAjIC0gU29tZSBjb2RlIG1heSByZXF1aXJlIHRoYXQgYWxsIGNwIGxpbmVzIHdpdGggY29kZSBwb2ludHMgaW4gYS4uYgorICAjICAgYXBwZWFyIGJldHdlZW4gYmxvY2s7YS4uYiBhbmQgdGhlIG5leHQgYmxvY2sgbGluZS4KKyAgIyAtIGJsb2NrIGxpbmVzIGFyZSBub3QgcmVxdWlyZWQ7IGNwIGxpbmVzIGNhbiBoYXZlIGRhdGEgZm9yCisgICMgICByYW5nZXMgb3V0c2lkZSBvZiBibG9ja3MuCisgIFdyaXRlRmllbGRzUmFuZ2VQcm9wcyhbImRlZmF1bHRzIl0sIDAsIDB4MTBmZmZmLCBfZGVmYXVsdHMsIG91dF9maWxlKQorICBpX2Jsb2NrcyA9IDAKKyAgaV9hbGcgPSAwCisgIGlfaDEgPSAwCisgIGlfaDIgPSAwCisgIGZvciBpIGluIHhyYW5nZShsZW4oX3N0YXJ0cykgLSAxKToKKyAgICBzdGFydCA9IF9zdGFydHNbaV0KKyAgICBlbmQgPSBfc3RhcnRzW2kgKyAxXSAtIDEKKyAgICAjIEJsb2NrIHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzLgorICAgIGlmIGlfYmxvY2tzIDwgbGVuKF9ibG9ja3MpIGFuZCBzdGFydCA9PSBfYmxvY2tzW2lfYmxvY2tzXVswXToKKyAgICAgIGIgPSBfYmxvY2tzW2lfYmxvY2tzXQorICAgICAgV3JpdGVGaWVsZHNSYW5nZVByb3BzKFsiXG5ibG9jayJdLCBiWzBdLCBiWzFdLCBiWzJdLCBvdXRfZmlsZSkKKyAgICAgIGlfYmxvY2tzICs9IDEKKyAgICAjIE5hbWVzTGlzdCBoMSBoZWFkaW5nIChmb3IgW21vc3Qgb2ZdIGEgYmxvY2spLgorICAgIGlmIGlfaDEgPCBsZW4oX2gxKSBhbmQgc3RhcnQgPT0gX2gxW2lfaDFdWzBdOgorICAgICAgaCA9IF9oMVtpX2gxXQorICAgICAgb3V0X2ZpbGUud3JpdGUoIiMgJTA0bFguLiUwNGxYICVzXG4iICUgKGhbMF0sIGhbMV0sIGhbMl0pKQorICAgICAgaV9oMSArPSAxCisgICAgIyBBbGdvcml0aG1pYy1uYW1lcyByYW5nZS4KKyAgICBpZiBpX2FsZyA8IGxlbihfYWxnX25hbWVzX3JhbmdlcykgYW5kIHN0YXJ0ID09IF9hbGdfbmFtZXNfcmFuZ2VzW2lfYWxnXVswXToKKyAgICAgIHIgPSBfYWxnX25hbWVzX3Jhbmdlc1tpX2FsZ10KKyAgICAgIGZpZWxkcyA9IFsiYWxnbmFtZXNyYW5nZSJdCisgICAgICBBcHBlbmRSYW5nZShmaWVsZHMsIHJbMF0sIHJbMV0pCisgICAgICBmaWVsZHMuZXh0ZW5kKHJbMjpdKQorICAgICAgb3V0X2ZpbGUud3JpdGUoIjsiLmpvaW4oZmllbGRzKSkKKyAgICAgIG91dF9maWxlLndyaXRlKCJcbiIpCisgICAgICBpX2FsZyArPSAxCisgICAgIyBOYW1lc0xpc3QgaDIgaGVhZGluZy4KKyAgICBpZiBpX2gyIDwgbGVuKF9oMikgYW5kIHN0YXJ0ID09IF9oMltpX2gyXVswXToKKyAgICAgIG91dF9maWxlLndyaXRlKCIjICVzXG4iICUgKF9oMltpX2gyXVsxXSkpCisgICAgICBpX2gyICs9IDEKKyAgICAjIENvZGUgcG9pbnQvcmFuZ2UgZGF0YS4KKyAgICBwcm9wcyA9IF9wcm9wc1tpXQorICAgICMgT21pdCByYW5nZXMgd2l0aCBvbmx5IGRlZmF1bHQrYmxvY2sgcHJvcGVydGllcy4KKyAgICBpZiBwcm9wczoKKyAgICAgIFdyaXRlRmllbGRzUmFuZ2VQcm9wcyhbImNwIl0sIHN0YXJ0LCBlbmQsIHByb3BzLCBvdXRfZmlsZSkKKworIyBXcml0ZSBOb3JtYWxpemVyMiBpbnB1dCBmaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKioKKyMgUG9ydGVkIGZyb20gZ2Vubm9ybS9zdG9yZS5jLgorCitkZWYgV3JpdGVBbGxDQyhvdXRfZmlsZSk6CisgIG91dF9maWxlLndyaXRlKCIjIENhbm9uaWNhbF9Db21iaW5pbmdfQ2xhc3MgKGNjYykgdmFsdWVzXG4iKTsKKyAgcHJldl9zdGFydCA9IDAKKyAgcHJldl9jYyA9IDAKKyAgZm9yIGkgaW4geHJhbmdlKGxlbihfc3RhcnRzKSk6CisgICAgc3RhcnQgPSBfc3RhcnRzW2ldCisgICAgcHJvcHMgPSBfcHJvcHNbaV0KKyAgICBjYyA9IHByb3BzLmdldCgiY2NjIikKKyAgICBpZiBub3QgY2M6IGNjID0gMAorICAgIGlmIHByZXZfY2MgIT0gY2M6CisgICAgICBpZiBwcmV2X2NjICE9IDA6CisgICAgICAgIGxhc3RfY29kZV9wb2ludCA9IHN0YXJ0IC0gMQorICAgICAgICBpZiBwcmV2X3N0YXJ0ID09IGxhc3RfY29kZV9wb2ludDoKKyAgICAgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WDolZFxuIiAlIChsYXN0X2NvZGVfcG9pbnQsIHByZXZfY2MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYLi4lMDRYOiVkXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJldl9zdGFydCwgbGFzdF9jb2RlX3BvaW50LCBwcmV2X2NjKSkKKyAgICAgIHByZXZfc3RhcnQgPSBzdGFydAorICAgICAgcHJldl9jYyA9IGNjCisKKworZGVmIEhhc01hcHBpbmcoYyk6CisgIHByb3BzID0gR2V0UHJvcHMoYykKKyAgZHQgPSBwcm9wcy5nZXQoImR0IikKKyAgcmV0dXJuIGR0IGFuZCBkdCAhPSAiTm9uZSIKKworCitkZWYgSGFzT25lV2F5TWFwcGluZyhjKToKKyAgd2hpbGUgVHJ1ZToKKyAgICBwcm9wcyA9IEdldFByb3BzKGMpCisgICAgZHQgPSBwcm9wcy5nZXQoImR0IikKKyAgICBpZiBub3QgZHQgb3IgZHQgPT0gIk5vbmUiOgorICAgICAgcmV0dXJuIEZhbHNlICAjIG5vIG1hcHBpbmcKKyAgICBlbGlmIGR0ID09ICJDYW4iOgorICAgICAgIyBUaGUgY2Fub25pY2FsIGRlY29tcG9zaXRpb24gaXMgYSBvbmUtd2F5IG1hcHBpbmcgaWYKKyAgICAgICMgLSBpdCBkb2VzIG5vdCBtYXAgdG8gZXhhY3RseSB0d28gY29kZSBwb2ludHMKKyAgICAgICMgLSBjIGhhcyBjY2MhPTAKKyAgICAgICMgLSBjIGhhcyB0aGUgQ29tcG9zaXRpb25fRXhjbHVzaW9uIHByb3BlcnR5CisgICAgICAjIC0gaXRzIHN0YXJ0ZXIgaGFzIGEgb25lLXdheSBtYXBwaW5nIChsb29wIGZvciB0aGlzKQorICAgICAgIyAtIGl0cyBub24tc3RhcnRlciBkZWNvbXBvc2VzCisgICAgICBuZmQgPSBwcm9wc1siZG0iXS5zcGxpdCgpCisgICAgICBpZiAobGVuKG5mZCkgIT0gMiBvcgorICAgICAgICAgIHByb3BzLmdldCgiY2NjIikgb3IKKyAgICAgICAgICBwcm9wcy5nZXQoIkNvbXBfRXgiKSBvcgorICAgICAgICAgIEhhc01hcHBpbmcoaW50KG5mZFsxXSwgMTYpKSk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgICBjID0gaW50KG5mZFswXSwgMTYpICAjIGNvbnRpbnVlCisgICAgZWxzZToKKyAgICAgICMgYyBoYXMgYSBjb21wYXRpYmlsaXR5IG1hcHBpbmcuCisgICAgICByZXR1cm4gVHJ1ZQorCisKK2RlZiBXcml0ZU5vcm0yTkZDVGV4dEZpbGUocGF0aCk6CisgIHllYXIgPSBkYXRldGltZS5kYXRlLnRvZGF5KCkuc3RyZnRpbWUoIiVZIikKKyAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihwYXRoLCAibmZjLnR4dCIpLCAidyIpIGFzIG91dF9maWxlOgorICAgIG91dF9maWxlLndyaXRlKAorICAgICAgICAiIiIjIENvcHlyaWdodCAoQykgMTk5OS0iIiIgKyB5ZWFyICsKKyAgICAgICAgIiIiLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisjIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBmaWxlIG5hbWU6IG5mYy50eHQKKyMKKyMgbWFjaGluZS1nZW5lcmF0ZWQgYnkgSUNVIHByZXBhcnNldWNkLnB5CisjCisjIENvbXBsZXRlIGRhdGEgZm9yIFVuaWNvZGUgTkZDIG5vcm1hbGl6YXRpb24uCisKKyogVW5pY29kZSAiIiIgKyBfdWNkX3ZlcnNpb24gKyAiIiIKKworIiIiKQorICAgIFdyaXRlQWxsQ0Mob3V0X2ZpbGUpCisgICAgb3V0X2ZpbGUud3JpdGUoIlxuIyBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiBtYXBwaW5nc1xuIikKKyAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKF9zdGFydHMpIC0gMSk6CisgICAgICBzdGFydCA9IF9zdGFydHNbaV0KKyAgICAgIGVuZCA9IF9zdGFydHNbaSArIDFdIC0gMQorICAgICAgcHJvcHMgPSBfcHJvcHNbaV0KKyAgICAgIGRtID0gcHJvcHMuZ2V0KCJkbSIpCisgICAgICBpZiBkbSBhbmQgZG1bMF0gIT0gJzwnIGFuZCBwcm9wc1siZHQiXSA9PSAiQ2FuIjoKKyAgICAgICAgYXNzZXJ0IHN0YXJ0ID09IGVuZAorICAgICAgICAjIFRoZSBDb21wX0V4PUZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uIHByb3BlcnR5IHRlbGxzIHVzCisgICAgICAgICMgd2hldGhlciB0aGUgY2Fub25pY2FsIGRlY29tcG9zaXRpb24gcm91bmQtdHJpcHMuCisgICAgICAgIHNlcGFyYXRvciA9ICc+JyBpZiBwcm9wcy5nZXQoIkNvbXBfRXgiKSBlbHNlICc9JworICAgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WCVzJXNcbiIgJSAoc3RhcnQsIHNlcGFyYXRvciwgZG0pKQorCisKK2RlZiBXcml0ZU5vcm0yTkZLQ1RleHRGaWxlKHBhdGgpOgorICB5ZWFyID0gZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnN0cmZ0aW1lKCIlWSIpCisgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ocGF0aCwgIm5ma2MudHh0IiksICJ3IikgYXMgb3V0X2ZpbGU6CisgICAgb3V0X2ZpbGUud3JpdGUoCisgICAgICAgICIiIiMgQ29weXJpZ2h0IChDKSAxOTk5LSIiIiArIHllYXIgKworICAgICAgICAiIiIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIGZpbGUgbmFtZTogbmZrYy50eHQKKyMKKyMgbWFjaGluZS1nZW5lcmF0ZWQgYnkgSUNVIHByZXBhcnNldWNkLnB5CisjCisjIERhdGEgZm9yIFVuaWNvZGUgTkZLQyBub3JtYWxpemF0aW9uLgorIyBUaGlzIGZpbGUgY29udGFpbnMgb25seSBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gbWFwcGluZ3MsCisjIHBsdXMgdGhvc2UgY2Fub25pY2FsIGRlY29tcG9zaXRpb25zIHRoYXQgY2hhbmdlIGZyb20gTkZDIHJvdW5kLXRyaXAgbWFwcGluZ3MKKyMgdG8gTkZLQyBvbmUtd2F5IG1hcHBpbmdzLgorIyBVc2UgdGhpcyBmaWxlIGFzIHRoZSBzZWNvbmQgZ2Vubm9ybTIgaW5wdXQgZmlsZSBhZnRlciBuZmMudHh0LgorCisqIFVuaWNvZGUgIiIiICsgX3VjZF92ZXJzaW9uICsgIiIiCisKKyIiIikKKyAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKF9zdGFydHMpIC0gMSk6CisgICAgICBzdGFydCA9IF9zdGFydHNbaV0KKyAgICAgIGVuZCA9IF9zdGFydHNbaSArIDFdIC0gMQorICAgICAgcHJvcHMgPSBfcHJvcHNbaV0KKyAgICAgIGRtID0gcHJvcHMuZ2V0KCJkbSIpCisgICAgICBpZiBkbSBhbmQgZG1bMF0gIT0gJzwnOgorICAgICAgICBhc3NlcnQgc3RhcnQgPT0gZW5kCisgICAgICAgIGlmIHByb3BzWyJkdCJdICE9ICJDYW4iOgorICAgICAgICAgICMgQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uLgorICAgICAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYPiVzXG4iICUgKHN0YXJ0LCBkbSkpCisgICAgICAgIGVsaWYgbm90IHByb3BzLmdldCgiQ29tcF9FeCIpIGFuZCBIYXNPbmVXYXlNYXBwaW5nKHN0YXJ0KToKKyAgICAgICAgICAjIE5GQyByb3VuZC10cmlwIG1hcHBpbmcgdHVybnMgaW50byBORktDIG9uZS13YXkgbWFwcGluZy4KKyAgICAgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WD4lcyAgIyBORkMgcm91bmQtdHJpcCwgTkZLQyBvbmUtd2F5XG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnQsIGRtKSkKKworCitkZWYgV3JpdGVOb3JtMk5GS0NfQ0ZUZXh0RmlsZShwYXRoKToKKyAgeWVhciA9IGRhdGV0aW1lLmRhdGUudG9kYXkoKS5zdHJmdGltZSgiJVkiKQorICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHBhdGgsICJuZmtjX2NmLnR4dCIpLCAidyIpIGFzIG91dF9maWxlOgorICAgIG91dF9maWxlLndyaXRlKAorICAgICAgICAiIiIjIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlCisjIENvcHlyaWdodCAoYykgMTk5MS0iIiIgKyB5ZWFyICsgIiIiIFVuaWNvZGUsIEluYy4KKyMgRm9yIHRlcm1zIG9mIHVzZSwgc2VlIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdGVybXNfb2ZfdXNlLmh0bWwKKyMgRm9yIGRvY3VtZW50YXRpb24sIHNlZSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHI0NC8KKyMKKyMgZmlsZSBuYW1lOiBuZmtjX2NmLnR4dAorIworIyBtYWNoaW5lLWdlbmVyYXRlZCBieSBJQ1UgcHJlcGFyc2V1Y2QucHkKKyMKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBVbmljb2RlIE5GS0NfQ0YgbWFwcGluZ3MsCisjIGV4dHJhY3RlZCBmcm9tIHRoZSBVQ0QgZmlsZSBEZXJpdmVkTm9ybWFsaXphdGlvblByb3BzLnR4dCwKKyMgYW5kIHJlZm9ybWF0dGVkIGludG8gc3ludGF4IGZvciB0aGUgZ2Vubm9ybTIgTm9ybWFsaXplcjIgZGF0YSBnZW5lcmF0b3IgdG9vbC4KKyMgVXNlIHRoaXMgZmlsZSBhcyB0aGUgdGhpcmQgZ2Vubm9ybTIgaW5wdXQgZmlsZSBhZnRlciBuZmMudHh0IGFuZCBuZmtjLnR4dC4KKworIiIiKQorICAgIG91dF9maWxlLndyaXRlKCIqIFVuaWNvZGUgIiArIF91Y2RfdmVyc2lvbiArICJcblxuIikKKyAgICBwcmV2X3N0YXJ0ID0gMAorICAgIHByZXZfZW5kID0gMAorICAgIHByZXZfbmZrY19jZiA9IE5vbmUKKyAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKF9zdGFydHMpIC0gMSk6CisgICAgICBzdGFydCA9IF9zdGFydHNbaV0KKyAgICAgIGVuZCA9IF9zdGFydHNbaSArIDFdIC0gMQorICAgICAgcHJvcHMgPSBfcHJvcHNbaV0KKyAgICAgIG5ma2NfY2YgPSBwcm9wcy5nZXQoIk5GS0NfQ0YiKQorICAgICAgIyBNZXJnZSB3aXRoIHRoZSBwcmV2aW91cyByYW5nZSBpZiBwb3NzaWJsZSwKKyAgICAgICMgb3IgcmVtZW1iZXIgdGhpcyByYW5nZSBmb3IgbWVyZ2luZy4KKyAgICAgIGlmIG5ma2NfY2YgPT0gcHJldl9uZmtjX2NmIGFuZCAocHJldl9lbmQgKyAxKSA9PSBzdGFydDoKKyAgICAgICAgcHJldl9lbmQgPSBlbmQKKyAgICAgIGVsc2U6CisgICAgICAgIGlmIHByZXZfbmZrY19jZiAhPSBOb25lIGFuZCAobm90IHByZXZfbmZrY19jZiBvciBwcmV2X25ma2NfY2ZbMF0gIT0gJzwnKToKKyAgICAgICAgICBpZiBwcmV2X3N0YXJ0ID09IHByZXZfZW5kOgorICAgICAgICAgICAgb3V0X2ZpbGUud3JpdGUoIiUwNFg+JXNcbiIgJSAocHJldl9zdGFydCwgcHJldl9uZmtjX2NmKSkKKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0X2ZpbGUud3JpdGUoIiUwNFguLiUwNFg+JXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZfc3RhcnQsIHByZXZfZW5kLCBwcmV2X25ma2NfY2YpKQorICAgICAgICBwcmV2X3N0YXJ0ID0gc3RhcnQKKyAgICAgICAgcHJldl9lbmQgPSBlbmQKKyAgICAgICAgcHJldl9uZmtjX2NmID0gbmZrY19jZgorCisKK2RlZiBXcml0ZU5vcm0yKHBhdGgpOgorICBXcml0ZU5vcm0yTkZDVGV4dEZpbGUocGF0aCkKKyAgV3JpdGVOb3JtMk5GS0NUZXh0RmlsZShwYXRoKQorICBXcml0ZU5vcm0yTkZLQ19DRlRleHRGaWxlKHBhdGgpCisKKyMgVVRTICM0NiBOb3JtYWxpemVyMiBpbnB1dCBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKioqCisKK19pZG5hX3JlcGxhY2VtZW50cyA9IFsKKyAgIyBTZXZlcmFsIHZlcnNpb25zIG9mIGF2b2lkaW5nIGNpcmN1bGFyIEZGRkQ+RkZGRCBtYXBwaW5ncywKKyAgIyBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgdGhlIGlucHV0IGZpbGUuCisgIChyZS5jb21waWxlKHIiRkZGRCAgICAgICAgICA7IGRpc2FsbG93ZWQiKSwgIiMgRkZGRCAoYXZvaWQgY2lyY3VsYXIgbWFwcGluZykiKSwKKyAgKHJlLmNvbXBpbGUociJcLlwuRkZGRCIpLCAiLi5GRkZDIiksCisgIChyZS5jb21waWxlKHIiKEZGRlteRV0pXC5cLkZGRkYiKSwgIlwxLi5GRkZDIiksCisgICMgU2luY2Ugd2Ugc3dpdGNoIGJldHdlZW4gY2hlY2tpbmcgYW5kIG5vdCBjaGVja2luZyBmb3IgU1REMyBjaGFyYWN0ZXIKKyAgIyByZXN0cmljdGlvbnMgYXQgcnVudGltZSwgY2hlY2tpbmcgdGhlIG5vbi1MREggQVNDSUkgY2hhcmFjdGVycyBpbiBjb2RlLAorICAjIHdlIHRyZWF0IHRoZXNlIHZhbHVlcyBoZXJlIGxpa2UgdGhlaXIgcmVndWxhciBzaWJsaW5ncy4KKyAgKHJlLmNvbXBpbGUociJeKFteO10rKSAgOyBkaXNhbGxvd2VkX1NURDNfdmFsaWQiKSwgciIjIFwxZGlzYWxsb3dlZF9TVEQzX3ZhbGlkIiksCisgIChyZS5jb21waWxlKHIiOyBkaXNhbGxvd2VkX1NURDNfbWFwcGVkICs7ICIpLCAiPiIpLAorICAjIEZvciBVVFMgIzQ2LCB3ZSBkbyBub3QgY2FyZSBhYm91dCAibm90IHZhbGlkIGluIElETkEyMDA4Ii4KKyAgKHJlLmNvbXBpbGUociI7ICo7IE5WOCArIiksICIiKSwKKyAgIyBOb3JtYWwgdHJhbnNmb3JtYXRpb25zLgorICAocmUuY29tcGlsZShyIjsgZGlzYWxsb3dlZCIpLCAiPkZGRkQiKSwKKyAgKHJlLmNvbXBpbGUociI7IGlnbm9yZWQiKSwgIj4iKSwKKyAgKHJlLmNvbXBpbGUociJeKFteO10rKSAgOyB2YWxpZCIpLCByIiMgXDF2YWxpZCIpLAorICAocmUuY29tcGlsZShyIjsgbWFwcGVkICs7ICIpLCAiPiIpLAorICAocmUuY29tcGlsZShyIl4oW147XSspICA7IGRldmlhdGlvbiArOyAiKSwgciIjIFwxZGV2aWF0aW9uID4iKQorXQorCitkZWYgSWRuYVRvVVRTNDZUZXh0RmlsZShzLCB0KToKKyAgIiIiVHVybiBVbmljb2RlIElkbmFNYXBwaW5nVGFibGUudHh0IGludG8gSUNVIGdlbm5vcm0yIHNvdXJjZSBmaWxlIGZvcm1hdC4iIiIKKyAgIyBEaWZmZXJlbnQgaW5wdXQvb3V0cHV0IGZpbGUgbmFtZXMuCisgIGRlc3RfcGF0aCA9IG9zLnBhdGguZGlybmFtZSh0KQorICB0ID0gb3MucGF0aC5qb2luKGRlc3RfcGF0aCwgInV0czQ2LnR4dCIpCisgICMgVE9ETzogV2l0aCBQeXRob24gMi43KywgY29tYmluZSB0aGUgdHdvIHdpdGggc3RhdGVtZW50cyBpbnRvIG9uZS4KKyAgd2l0aCBvcGVuKHMsICJyIikgYXMgaW5fZmlsZToKKyAgICB3aXRoIG9wZW4odCwgInciKSBhcyBvdXRfZmlsZToKKyAgICAgIG91dF9maWxlLndyaXRlKCIjIE9yaWdpbmFsIGZpbGU6XG4iKQorICAgICAgZm9yIGxpbmUgaW4gaW5fZmlsZToKKyAgICAgICAgb3JpZ19saW5lID0gbGluZQorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIiMgRm9yIGRvY3VtZW50YXRpb24sIHNlZSIpOgorICAgICAgICAgIG91dF9maWxlLndyaXRlKGxpbmUpCisgICAgICAgICAgb3V0X2ZpbGUud3JpdGUociIiIgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVGhpcyBmaWxlIGhhcyBiZWVuIHJlZm9ybWF0dGVkIGludG8gc3ludGF4IGZvciB0aGUKKyMgZ2Vubm9ybTIgTm9ybWFsaXplcjIgZGF0YSBnZW5lcmF0b3IgdG9vbC4KKyMKKyMgInZhbGlkIiwgImRpc2FsbG93ZWRfU1REM192YWxpZCIgYW5kICJkZXZpYXRpb24iIGxpbmVzIGFyZSBjb21tZW50ZWQgb3V0LgorIyAibWFwcGVkIiBhbmQgImRpc2FsbG93ZWRfU1REM19tYXBwZWQiIGFyZSBjaGFuZ2VkIHRvIHVzZSB0aGUgIj4iIG1hcHBpbmcgc3ludGF4LgorIyAiZGlzYWxsb3dlZCIgbGluZXMgbWFwIHRvIFUrRkZGRC4KKyMgImlnbm9yZWQiIGxpbmVzIG1hcCB0byBhbiBlbXB0eSBzdHJpbmcuCisjCisjIENoYXJhY3RlcnMgZGlzYWxsb3dlZCB1bmRlciBTVEQzIHJ1bGVzIGFyZSB0cmVhdGVkIGFzIHZhbGlkIG9yIG1hcHBlZDsKKyMgdGhleSBhcmUgaGFuZGxlZCBpbiBjb2RlLgorIyBEZXZpYXRpb24gY2hhcmFjdGVycyBhcmUgYWxzbyBoYW5kbGVkIGluIGNvZGUuCisjCisjIFVzZSB0aGlzIGZpbGUgYXMgdGhlIHNlY29uZCBnZW5ub3JtMiBpbnB1dCBmaWxlIGFmdGVyIG5mYy50eHQuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIiIiKQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGxpbmVbMF0gaW4gIiNcclxuIjoKKyAgICAgICAgICBvdXRfZmlsZS53cml0ZShsaW5lKQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciByZXAgaW4gX2lkbmFfcmVwbGFjZW1lbnRzOiBsaW5lID0gcmVwWzBdLnN1YihyZXBbMV0sIGxpbmUpCisgICAgICAgICMgQWxpZ24gaW5saW5lIGNvbW1lbnRzIGF0IGNvbHVtbiA0MC4KKyAgICAgICAgY29tbWVudF9wb3MgPSBsaW5lLmZpbmQoIiMiLCAxKQorICAgICAgICBpZiBjb21tZW50X3BvcyA8IDQwOgorICAgICAgICAgIGxpbmUgPSAobGluZVs6Y29tbWVudF9wb3NdICsgKCg0MCAtIGNvbW1lbnRfcG9zKSAqICcgJykgKworICAgICAgICAgICAgICAgICAgbGluZVtjb21tZW50X3BvczpdKQorICAgICAgICBlbGlmIGNvbW1lbnRfcG9zID4gNDA6CisgICAgICAgICAgc3BhY2VfcG9zID0gY29tbWVudF9wb3MKKyAgICAgICAgICB3aGlsZSBzcGFjZV9wb3MgPiAwIGFuZCBsaW5lW3NwYWNlX3BvcyAtIDFdID09ICcgJzoKKyAgICAgICAgICAgIHNwYWNlX3BvcyA9IHNwYWNlX3BvcyAtIDEKKyAgICAgICAgICBpZiBzcGFjZV9wb3MgPCA0MDoKKyAgICAgICAgICAgICMgRmV3ZXIgdGhhbiA0MCBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY29tbWVudDoKKyAgICAgICAgICAgICMgQWxpZ24gY29tbWVudHMgYXQgY29sdW1uIDQwLgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOjQwXSArIGxpbmVbY29tbWVudF9wb3M6XQorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIDQwIG9yIG1vcmUgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGNvbW1lbnQ6CisgICAgICAgICAgICAjIEtlZXAgb25lIHNwYWNlIGJldHdlZW4gY29udGVudHMgYW5kIGNvbW1lbnQuCisgICAgICAgICAgICBsaW5lID0gbGluZVs6c3BhY2VfcG9zXSArICIgIiArIGxpbmVbY29tbWVudF9wb3M6XQorICAgICAgICAjIFdyaXRlIHRoZSBtb2RpZmllZCBsaW5lLgorICAgICAgICBvdXRfZmlsZS53cml0ZShsaW5lKQorICAgICAgICBpZiAiLi5GRkZGIiBpbiBvcmlnX2xpbmUgYW5kICIuLkZGRkMiIGluIGxpbmU6CisgICAgICAgICAgb3V0X2ZpbGUud3JpdGUoIkZGRkUuLkZGRkYgICAgPkZGRkRcbiIpOworICByZXR1cm4gdAorCisjIFByZXByb2Nlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoqKgorCitfc3RyaXBfcmUgPSByZS5jb21waWxlKCIoWzAtOWEtZkEtRl0rLis/KSAqIy4qIikKK19jb2RlX3BvaW50X3JlID0gcmUuY29tcGlsZSgiXHMqKFswLTlhLWZBLUZdKylccyo7IikKKworZGVmIENvcHlBbmRTdHJpcFdpdGhPcHRpb25hbE1lcmdlKHMsIHQsIGRvX21lcmdlKToKKyAgIyBUT0RPOiBXZSBkbyBub3Qgc2VlbSB0byBuZWVkIHRoZSBkb19tZXJnZSBhcmd1bWVudCBhbmQgbG9naWMgYW55IG1vcmUuCisgICMgVE9ETzogV2l0aCBQeXRob24gMi43KywgY29tYmluZSB0aGUgdHdvIHdpdGggc3RhdGVtZW50cyBpbnRvIG9uZS4KKyAgd2l0aCBvcGVuKHMsICJyIikgYXMgaW5fZmlsZToKKyAgICB3aXRoIG9wZW4odCwgInciKSBhcyBvdXRfZmlsZToKKyAgICAgIGZpcnN0ID0gLTEgICMgRmlyc3QgY29kZSBwb2ludCB3aXRoIGZpcnN0X2RhdGEuCisgICAgICBsYXN0ID0gLTEgICMgTGFzdCBjb2RlIHBvaW50IHdpdGggZmlyc3RfZGF0YS4KKyAgICAgIGZpcnN0X2RhdGEgPSAiIiAgIyBDb21tb24gZGF0YSBmb3IgY29kZSBwb2ludHMgW2ZpcnN0Li5sYXN0XS4KKyAgICAgIGZvciBsaW5lIGluIGluX2ZpbGU6CisgICAgICAgIG1hdGNoID0gX3N0cmlwX3JlLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgIGxpbmUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgICAgICAgIGlmIGRvX21lcmdlOgorICAgICAgICAgIG1hdGNoID0gX2NvZGVfcG9pbnRfcmUubWF0Y2gobGluZSkKKyAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGMgPSBpbnQobWF0Y2guZ3JvdXAoMSksIDE2KQorICAgICAgICAgICAgZGF0YSA9IGxpbmVbbWF0Y2guZW5kKCkgLSAxOl0KKyAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IC0xCisgICAgICAgICAgICBkYXRhID0gIiIKKyAgICAgICAgICBpZiBsYXN0ID49IDAgYW5kIChjICE9IChsYXN0ICsgMSkgb3IgZGF0YSAhPSBmaXJzdF9kYXRhKToKKyAgICAgICAgICAgICMgb3V0cHV0IHRoZSBjdXJyZW50IHJhbmdlCisgICAgICAgICAgICBpZiBmaXJzdCA9PSBsYXN0OgorICAgICAgICAgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WCVzXG4iICUgKGZpcnN0LCBmaXJzdF9kYXRhKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYLi4lMDRYJXNcbiIgJSAoZmlyc3QsIGxhc3QsIGZpcnN0X2RhdGEpKQorICAgICAgICAgICAgZmlyc3QgPSAtMQorICAgICAgICAgICAgbGFzdCA9IC0xCisgICAgICAgICAgICBmaXJzdF9kYXRhID0gIiIKKyAgICAgICAgICBpZiBjIDwgMDoKKyAgICAgICAgICAgICMgbm8gZGF0YSBvbiB0aGlzIGxpbmUsIG91dHB1dCBhcyBpcworICAgICAgICAgICAgb3V0X2ZpbGUud3JpdGUobGluZSkKKyAgICAgICAgICAgIG91dF9maWxlLndyaXRlKCJcbiIpCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZGF0YSBvbiB0aGlzIGxpbmUsIHN0b3JlIGZvciBwb3NzaWJsZSByYW5nZSBjb21wYWN0aW9uCisgICAgICAgICAgICBpZiBsYXN0IDwgMDoKKyAgICAgICAgICAgICAgIyBzZXQgYXMgdGhlIGZpcnN0IGxpbmUgaW4gYSBwb3NzaWJsZSByYW5nZQorICAgICAgICAgICAgICBmaXJzdCA9IGMKKyAgICAgICAgICAgICAgbGFzdCA9IGMKKyAgICAgICAgICAgICAgZmlyc3RfZGF0YSA9IGRhdGEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICMgbXVzdCBiZSBjID09IChsYXN0ICsgMSkgYW5kIGRhdGEgPT0gZmlyc3RfZGF0YQorICAgICAgICAgICAgICAjIGJlY2F1c2Ugb2YgcHJldmlvdXMgY29uZGl0aW9ucworICAgICAgICAgICAgICAjIGNvbnRpbnVlIHdpdGggdGhlIGN1cnJlbnQgcmFuZ2UKKyAgICAgICAgICAgICAgbGFzdCA9IGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAjIE9ubHkgc3RyaXAsIGRvbid0IG1lcmdlOiBqdXN0IG91dHB1dCB0aGUgc3RyaXBwZWQgbGluZS4KKyAgICAgICAgICBvdXRfZmlsZS53cml0ZShsaW5lKQorICAgICAgICAgIG91dF9maWxlLndyaXRlKCJcbiIpCisgICAgICBpZiBkb19tZXJnZSBhbmQgbGFzdCA+PSAwOgorICAgICAgICAjIG91dHB1dCB0aGUgbGFzdCByYW5nZSBpbiB0aGUgZmlsZQorICAgICAgICBpZiBmaXJzdCA9PSBsYXN0OgorICAgICAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYJXNcbiIgJSAoZmlyc3QsIGZpcnN0X2RhdGEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYLi4lMDRYJXNcbiIgJSAoZmlyc3QsIGxhc3QsIGZpcnN0X2RhdGEpKQorICAgICAgICBmaXJzdCA9IC0xCisgICAgICAgIGxhc3QgPSAtMQorICAgICAgICBmaXJzdF9kYXRhID0gIiIKKyAgICAgIG91dF9maWxlLmZsdXNoKCkKKyAgcmV0dXJuIHQKKworCitkZWYgQ29weUFuZFN0cmlwKHMsIHQpOgorICAiIiJDb3BpZXMgYSBmaWxlIGFuZCByZW1vdmVzIGNvbW1lbnRzIGJlaGluZCBkYXRhIGxpbmVzIGJ1dCBub3QgaW4gb3RoZXJzLiIiIgorICByZXR1cm4gQ29weUFuZFN0cmlwV2l0aE9wdGlvbmFsTWVyZ2UocywgdCwgRmFsc2UpCisKKworZGVmIENvcHlBbmRTdHJpcEFuZE1lcmdlKHMsIHQpOgorICAiIiJDb3BpZXMgYW5kIHN0cmlwcyBhIGZpbGUgYW5kIG1lcmdlcyBsaW5lcy4KKworICBDb3BpZXMgYSBmaWxlLCByZW1vdmVzIGNvbW1lbnRzLCBhbmQKKyAgbWVyZ2VzIGxpbmVzIHdpdGggYWRqYWNlbnQgY29kZSBwb2ludCByYW5nZXMgYW5kIGlkZW50aWNhbCBwZXItY29kZSBwb2ludAorICBkYXRhIGxpbmVzIGludG8gb25lIGxpbmUgd2l0aCByYW5nZSBzeW50YXguCisgICIiIgorICByZXR1cm4gQ29weUFuZFN0cmlwV2l0aE9wdGlvbmFsTWVyZ2UocywgdCwgVHJ1ZSkKKworCitkZWYgUHJlcGVuZEJPTShzLCB0KToKKyAgIyBUT0RPOiBXaXRoIFB5dGhvbiAyLjcrLCBjb21iaW5lIHRoZSB0d28gd2l0aCBzdGF0ZW1lbnRzIGludG8gb25lLgorICB3aXRoIG9wZW4ocywgInIiKSBhcyBpbl9maWxlOgorICAgIHdpdGggb3Blbih0LCAidyIpIGFzIG91dF9maWxlOgorICAgICAgb3V0X2ZpbGUud3JpdGUoIlx4ZWZceGJiXHhiZiIpICAjIFVURi04IEJPTSBmb3IgSUNVIHN2bgorICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGluX2ZpbGUsIG91dF9maWxlKQorICByZXR1cm4gdAorCisKK2RlZiBDb3B5T25seShzLCB0KToKKyAgc2h1dGlsLmNvcHkocywgdCkKKyAgcmV0dXJuIHQKKworCitkZWYgRG9udENvcHkocywgdCk6CisgIHJldHVybiBzCisKKworIyBFYWNoIF9maWxlcyB2YWx1ZSBpcyBhCisjIChwcmVwcm9jZXNzb3IsIGRlc3RfZm9sZGVyLCBwYXJzZXIsIG9yZGVyKSB0dXBsZQorIyB3aGVyZSBhbGwgZmllbGRzIGV4Y2VwdCB0aGUgcHJlcHJvY2Vzc29yIGFyZSBvcHRpb25hbC4KKyMgQWZ0ZXIgdGhlIGluaXRpYWwgcHJlcHJvY2Vzc2luZyAoY29weS9zdHJpcC9tZXJnZSksCisjIGlmIGEgcGFyc2VyIGlzIHNwZWNpZmllZCwgdGhlbiBhIHR1cGxlIGlzIGFkZGVkIHRvIF9maWxlc190b19wYXJzZQorIyBhdCBpbmRleCAib3JkZXIiIChkZWZhdWx0IG9yZGVyIDkpLgorIyBBbiBleHBsaWNpdCBvcmRlciBudW1iZXIgaXMgc2V0IG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBiZSBwYXJzZWQKKyMgYmVmb3JlIG90aGVycy4KK19maWxlcyA9IHsKKyAgIkJpZGlNaXJyb3JpbmcudHh0IjogKERvbnRDb3B5LCBQYXJzZUJpZGlNaXJyb3JpbmcpLAorICAiQmlkaVRlc3QudHh0IjogKENvcHlPbmx5LCAidGVzdGRhdGEiKSwKKyAgIkJsb2Nrcy50eHQiOiAoRG9udENvcHksIFBhcnNlQmxvY2tzKSwKKyAgIkNhc2VGb2xkaW5nLnR4dCI6IChDb3B5T25seSwgUGFyc2VDYXNlRm9sZGluZyksCisgICJEZXJpdmVkQWdlLnR4dCI6IChEb250Q29weSwgUGFyc2VEZXJpdmVkQWdlKSwKKyAgIkRlcml2ZWRCaWRpQ2xhc3MudHh0IjogKERvbnRDb3B5LCBQYXJzZURlcml2ZWRCaWRpQ2xhc3MpLAorICAiRGVyaXZlZENvcmVQcm9wZXJ0aWVzLnR4dCI6IChDb3B5QW5kU3RyaXAsIFBhcnNlTmFtZWRQcm9wZXJ0aWVzKSwKKyAgIkRlcml2ZWRKb2luaW5nR3JvdXAudHh0IjogKERvbnRDb3B5LCBQYXJzZURlcml2ZWRKb2luaW5nR3JvdXApLAorICAiRGVyaXZlZEpvaW5pbmdUeXBlLnR4dCI6IChEb250Q29weSwgUGFyc2VEZXJpdmVkSm9pbmluZ1R5cGUpLAorICAiRGVyaXZlZE5vcm1hbGl6YXRpb25Qcm9wcy50eHQiOiAoQ29weUFuZFN0cmlwLCBQYXJzZU5hbWVkUHJvcGVydGllcyksCisgICJEZXJpdmVkTnVtZXJpY1ZhbHVlcy50eHQiOiAoRG9udENvcHksIFBhcnNlRGVyaXZlZE51bWVyaWNWYWx1ZXMpLAorICAiRWFzdEFzaWFuV2lkdGgudHh0IjogKERvbnRDb3B5LCBQYXJzZUVhc3RBc2lhbldpZHRoKSwKKyAgIkdyYXBoZW1lQnJlYWtQcm9wZXJ0eS50eHQiOiAoRG9udENvcHksIFBhcnNlR3JhcGhlbWVCcmVha1Byb3BlcnR5KSwKKyAgIkdyYXBoZW1lQnJlYWtUZXN0LnR4dCI6IChQcmVwZW5kQk9NLCAidGVzdGRhdGEiKSwKKyAgIkluZGljTWF0cmFDYXRlZ29yeS50eHQiOiAoRG9udENvcHksIFBhcnNlSW5kaWNNYXRyYUNhdGVnb3J5KSwKKyAgIkluZGljU3lsbGFiaWNDYXRlZ29yeS50eHQiOiAoRG9udENvcHksIFBhcnNlSW5kaWNTeWxsYWJpY0NhdGVnb3J5KSwKKyAgIkxpbmVCcmVhay50eHQiOiAoRG9udENvcHksIFBhcnNlTGluZUJyZWFrKSwKKyAgIkxpbmVCcmVha1Rlc3QudHh0IjogKFByZXBlbmRCT00sICJ0ZXN0ZGF0YSIpLAorICAiTmFtZUFsaWFzZXMudHh0IjogKERvbnRDb3B5LCBQYXJzZU5hbWVBbGlhc2VzKSwKKyAgIk5hbWVzTGlzdC50eHQiOiAoRG9udENvcHksIFBhcnNlTmFtZXNMaXN0KSwKKyAgIk5vcm1hbGl6YXRpb25Db3JyZWN0aW9ucy50eHQiOiAoQ29weU9ubHksKSwgICMgT25seSB1c2VkIGluIGdlbnNwcmVwLgorICAiTm9ybWFsaXphdGlvblRlc3QudHh0IjogKENvcHlBbmRTdHJpcCwpLAorICAiUHJvcGVydHlBbGlhc2VzLnR4dCI6IChEb250Q29weSwgUGFyc2VQcm9wZXJ0eUFsaWFzZXMsIDApLAorICAiUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0IjogKERvbnRDb3B5LCBQYXJzZVByb3BlcnR5VmFsdWVBbGlhc2VzLCAxKSwKKyAgIlByb3BMaXN0LnR4dCI6IChEb250Q29weSwgUGFyc2VOYW1lZFByb3BlcnRpZXMpLAorICAiU2VudGVuY2VCcmVha1Byb3BlcnR5LnR4dCI6IChEb250Q29weSwgUGFyc2VTZW50ZW5jZUJyZWFrKSwKKyAgIlNlbnRlbmNlQnJlYWtUZXN0LnR4dCI6IChQcmVwZW5kQk9NLCAidGVzdGRhdGEiKSwKKyAgIlNjcmlwdHMudHh0IjogKERvbnRDb3B5LCBQYXJzZVNjcmlwdHMpLAorICAiU2NyaXB0RXh0ZW5zaW9ucy50eHQiOiAoRG9udENvcHksIFBhcnNlU2NyaXB0RXh0ZW5zaW9ucyksCisgICJTcGVjaWFsQ2FzaW5nLnR4dCI6IChDb3B5T25seSwgUGFyc2VTcGVjaWFsQ2FzaW5nKSwKKyAgIlVuaWNvZGVEYXRhLnR4dCI6IChDb3B5T25seSwgUGFyc2VVbmljb2RlRGF0YSwgMiksCisgICJXb3JkQnJlYWtQcm9wZXJ0eS50eHQiOiAoRG9udENvcHksIFBhcnNlV29yZEJyZWFrKSwKKyAgIldvcmRCcmVha1Rlc3QudHh0IjogKFByZXBlbmRCT00sICJ0ZXN0ZGF0YSIpLAorICAjIEZyb20gd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9pZG5hLzx2ZXJzaW9uPi8KKyAgIklkbmFNYXBwaW5nVGFibGUudHh0IjogKElkbmFUb1VUUzQ2VGV4dEZpbGUsICJub3JtMiIpCit9CisKKyMgTGlzdCBvZiBsaXN0cyBvZiBmaWxlcyB0byBiZSBwYXJzZWQgaW4gb3JkZXIuCisjIElubmVyIGxpc3RzIGNvbnRhaW4gKGJhc2VuYW1lLCBwYXRoLCBwYXJzZXIpIHR1cGxlcy4KK19maWxlc190b19wYXJzZSA9IFtbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXV0KKworIyBHZXQgdGhlIHN0YW5kYXJkIGJhc2VuYW1lIGZyb20gYSB2ZXJzaW9uZWQgZmlsZW5hbWUuCisjIEZvciBleGFtcGxlLCBtYXRjaCAiVW5pY29kZURhdGEtNi4xLjBkOC50eHQiCisjIHNvIHdlIGNhbiB0dXJuIGl0IGludG8gIlVuaWNvZGVEYXRhLnR4dCIuCitfZmlsZV92ZXJzaW9uX3JlID0gcmUuY29tcGlsZSgiKFthLXpBLVowLTldKykiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItWzAtOV0rKD86XFwuWzAtOV0rKSooPzpkWzAtOV0rKT8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoXFwuW2Etel0rKSQiKQorCitkZWYgUHJlcHJvY2Vzc0ZpbGVzKHNvdXJjZV9maWxlcywgaWN1X3NyY19yb290KToKKyAgdW5pZGF0YV9wYXRoID0gb3MucGF0aC5qb2luKGljdV9zcmNfcm9vdCwgInNvdXJjZSIsICJkYXRhIiwgInVuaWRhdGEiKQorICBub3JtMl9wYXRoID0gb3MucGF0aC5qb2luKHVuaWRhdGFfcGF0aCwgIm5vcm0yIikKKyAgdGVzdGRhdGFfcGF0aCA9IG9zLnBhdGguam9pbihpY3Vfc3JjX3Jvb3QsICJzb3VyY2UiLCAidGVzdCIsICJ0ZXN0ZGF0YSIpCisgIGZvbGRlcl90b19wYXRoID0geworICAgICJ1bmlkYXRhIjogdW5pZGF0YV9wYXRoLAorICAgICJub3JtMiI6IG5vcm0yX3BhdGgsCisgICAgInRlc3RkYXRhIjogdGVzdGRhdGFfcGF0aAorICB9CisgIGZpbGVzX3Byb2Nlc3NlZCA9IHNldCgpCisgIGZvciBzb3VyY2VfZmlsZSBpbiBzb3VyY2VfZmlsZXM6CisgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNvdXJjZV9maWxlKQorICAgIG1hdGNoID0gX2ZpbGVfdmVyc2lvbl9yZS5tYXRjaChiYXNlbmFtZSkKKyAgICBpZiBtYXRjaDogYmFzZW5hbWUgPSBtYXRjaC5ncm91cCgxKSArIG1hdGNoLmdyb3VwKDIpCisgICAgaWYgYmFzZW5hbWUgaW4gX2ZpbGVzOgorICAgICAgcHJpbnQgIlByZXByb2Nlc3NpbmcgJXMiICUgYmFzZW5hbWUKKyAgICAgIGlmIGJhc2VuYW1lIGluIGZpbGVzX3Byb2Nlc3NlZDoKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJkdXBsaWNhdGUgZmlsZSBiYXNlbmFtZSAlcyEiICUgYmFzZW5hbWUpCisgICAgICBmaWxlc19wcm9jZXNzZWQuYWRkKGJhc2VuYW1lKQorICAgICAgdmFsdWUgPSBfZmlsZXNbYmFzZW5hbWVdCisgICAgICBwcmVwcm9jZXNzb3IgPSB2YWx1ZVswXQorICAgICAgaWYgbGVuKHZhbHVlKSA+PSAyIGFuZCBpc2luc3RhbmNlKHZhbHVlWzFdLCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgICMgVGhlIHZhbHVlIHdhcyBbcHJlcHJvY2Vzc29yLCBkZXN0X2ZvbGRlciwgLi4uXSwgbGVhdmUgWy4uLl0uCisgICAgICAgIGRlc3RfZm9sZGVyID0gdmFsdWVbMV0KKyAgICAgICAgdmFsdWUgPSB2YWx1ZVsyOl0KKyAgICAgIGVsc2U6CisgICAgICAgICMgVGhlIHZhbHVlIHdhcyBbcHJlcHJvY2Vzc29yLCAuLi5dLCBsZWF2ZSBbLi4uXS4KKyAgICAgICAgZGVzdF9mb2xkZXIgPSAidW5pZGF0YSIKKyAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOl0KKyAgICAgIGRlc3RfcGF0aCA9IGZvbGRlcl90b19wYXRoW2Rlc3RfZm9sZGVyXQorICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRlc3RfcGF0aCk6IG9zLm1ha2VkaXJzKGRlc3RfcGF0aCkKKyAgICAgIGRlc3RfZmlsZSA9IG9zLnBhdGguam9pbihkZXN0X3BhdGgsIGJhc2VuYW1lKQorICAgICAgcGFyc2VfZmlsZSA9IHByZXByb2Nlc3Nvcihzb3VyY2VfZmlsZSwgZGVzdF9maWxlKQorICAgICAgaWYgdmFsdWU6CisgICAgICAgIG9yZGVyID0gOSBpZiBsZW4odmFsdWUpIDwgMiBlbHNlIHZhbHVlWzFdCisgICAgICAgIF9maWxlc190b19wYXJzZVtvcmRlcl0uYXBwZW5kKChiYXNlbmFtZSwgcGFyc2VfZmlsZSwgdmFsdWVbMF0pKQorCisjIENoYXJhY3RlciBuYW1lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoqKgorCisjIFRPRE86IFR1cm4gdGhpcyBzY3JpcHQgaW50byBhIG1vZHVsZSB0aGF0CisjIGEpIGdpdmVzIGFjY2VzcyB0byB0aGUgcGFyc2VkIGRhdGEKKyMgYikgaGFzIGEgUHJlcGFyc2VVQ0QodWNkX3Jvb3QsIGljdV9zcmNfcm9vdCkgZnVuY3Rpb24KKyMgYykgaGFzIGEgUGFyc2VQcmVwYXJzZWRVQ0QoZmlsZW5hbWUpIGZ1bmN0aW9uCisjIGQpIGhhcyBhIFdyaXRlUHJlcGFyc2VkVUNEKGZpbGVuYW1lKSBmdW5jdGlvbgorIyBhbmQgdGhlbiB1c2UgaXQgZnJvbSBhIG5ldyBzY3JpcHQgZm9yIG5hbWVzLgorIyBTb21lIG1vcmUgQVBJOgorIyAtIGdlbmVyYXRvciBHZXRSYW5nZXNBbmRQcm9wcygpIC0+IChzdGFydCwgZW5kLCBwcm9wcykqCisKK2RlZiBJbmNDb3VudGVyKGNvdW50ZXJzLCBrZXksIGluYz0xKToKKyAgaWYga2V5IGluIGNvdW50ZXJzOgorICAgIGNvdW50ZXJzW2tleV0gKz0gaW5jCisgIGVsc2U6CisgICAgY291bnRlcnNba2V5XSA9IGluYworCisKK2VuZGluZ3MgPSAoCisgICMgTGlzdCBQSEFTRS0gYmVmb3JlIExFVFRFUiBmb3IgQkFNVU0gTEVUVEVSIFBIQVNFLXh5ei4KKyAgIlBIQVNFLSIsCisgICJMRVRURVIgIiwgIkxJR0FUVVJFICIsICJDSEFSQUNURVIgIiwgIlNZTExBQkxFICIsCisgICJDSE9TRU9ORyAiLCAiSlVOR1NFT05HICIsICJKT05HU0VPTkcgIiwKKyAgIlNZTExBQklDUyAiLCAiSURFT0dSQVBIICIsICJJREVPR1JBUEgtIiwgIklERU9HUkFNICIsICJNT05PR1JBTSAiLAorICAiQUNST1BIT05JQyAiLCAiSElFUk9HTFlQSCAiLAorICAiRElHSVQgIiwgIk5VTUJFUiAiLCAiTlVNRVJBTCAiLCAiRlJBQ1RJT04gIiwKKyAgIlBVTkNUVUFUSU9OICIsICJTSUdOICIsICJTWU1CT0wgIiwKKyAgIlRJTEUgIiwgIkNBUkQgIiwgIkZBQ0UgIiwKKyAgIkFDQ0VOVCAiLCAiUE9JTlQgIiwKKyAgIyBMaXN0IFNJR04gYmVmb3JlIFZPV0VMIHRvIGNhdGNoICJ2b3dlbCBzaWduIi4KKyAgIlZPV0VMICIsICJUT05FICIsICJSQURJQ0FMICIsCisgICMgRm9yIG5hbWVzIG9mIG1hdGggc3ltYm9scywKKyAgIyBlLmcuLCBNQVRIRU1BVElDQUwgQk9MRCBJVEFMSUMgQ0FQSVRBTCBBCisgICJTQ1JJUFQgIiwgIkZSQUtUVVIgIiwgIk1PTk9TUEFDRSAiLAorICAiSVRBTElDICIsICJCT0xEICIsICJET1VCTEUtU1RSVUNLICIsICJTQU5TLVNFUklGICIsCisgICJJTklUSUFMICIsICJUQUlMRUQgIiwgIlNUUkVUQ0hFRCAiLCAiTE9PUEVEICIsCisgICMgQlJBSUxMRSBQQVRURVJOIERPVFMteHl6CisgICJET1RTLSIsCisgICJTRUxFQ1RPUiAiLCAiU0VMRUNUT1ItIgorKQorCitkZWYgU3BsaXROYW1lKG5hbWUsIHRva2Vucyk6CisgIHN0YXJ0ID0gMAorICBmb3IgZSBpbiBlbmRpbmdzOgorICAgIGkgPSBuYW1lLmZpbmQoZSkKKyAgICBpZiBpID49IDA6CisgICAgICBzdGFydCA9IGkgKyBsZW4oZSkKKyAgICAgIHRva2VuID0gbmFtZVs6c3RhcnRdCisgICAgICBJbmNDb3VudGVyKHRva2VucywgdG9rZW4pCisgICAgICBicmVhaworICBmb3IgaSBpbiB4cmFuZ2Uoc3RhcnQsIGxlbihuYW1lKSk6CisgICAgYyA9IG5hbWVbaV0KKyAgICBpZiBjID09ICcgJyBvciBjID09ICctJzoKKyAgICAgIHRva2VuID0gbmFtZVtzdGFydDppICsgMV0KKyAgICAgIEluY0NvdW50ZXIodG9rZW5zLCB0b2tlbikKKyAgICAgIHN0YXJ0ID0gaSArIDEKKyAgSW5jQ291bnRlcih0b2tlbnMsIG5hbWVbc3RhcnQ6XSkKKworCitkZWYgUHJpbnROYW1lU3RhdHMoKToKKyAgIyBUT0RPOiBUaGlzIG5hbWUgYW5hbHlzaXMgY29kZSBpcyBvdXQgb2YgZGF0ZS4KKyAgIyBJdCBuZWVkcyB0byBjb25zaWRlciB0aGUgbXVsdGktdHlwZSBOYW1lX0FsaWFzIHZhbHVlcy4KKyAgbmFtZV9wbmFtZXMgPSAoIm5hIiwgIm5hMSIsICJOYW1lX0FsaWFzIikKKyAgY291bnRzID0ge30KKyAgZm9yIHBuYW1lIGluIG5hbWVfcG5hbWVzOgorICAgIGNvdW50c1twbmFtZV0gPSAwCisgIHRvdGFsX2xlbmd0aHMgPSBjb3VudHMuY29weSgpCisgIG1heF9sZW5ndGggPSAwCisgIG1heF9wZXJfY3AgPSAwCisgIG5hbWVfY2hhcnMgPSBzZXQoKQorICBudW1fZGlnaXRzID0gMAorICB0b2tlbl9jb3VudGVycyA9IHt9CisgIGNoYXJfY291bnRlcnMgPSB7fQorICBmb3IgaSBpbiB4cmFuZ2UobGVuKF9zdGFydHMpIC0gMSk6CisgICAgc3RhcnQgPSBfc3RhcnRzW2ldCisgICAgIyBlbmQgPSBfc3RhcnRzW2kgKyAxXSAtIDEKKyAgICBwcm9wcyA9IF9wcm9wc1tpXQorICAgIHBlcl9jcCA9IDAKKyAgICBmb3IgcG5hbWUgaW4gbmFtZV9wbmFtZXM6CisgICAgICBpZiBwbmFtZSBpbiBwcm9wczoKKyAgICAgICAgY291bnRzW3BuYW1lXSArPSAxCisgICAgICAgIG5hbWUgPSBwcm9wc1twbmFtZV0KKyAgICAgICAgdG90YWxfbGVuZ3Roc1twbmFtZV0gKz0gbGVuKG5hbWUpCisgICAgICAgIG5hbWVfY2hhcnMgfD0gc2V0KG5hbWUpCisgICAgICAgIGlmIGxlbihuYW1lKSA+IG1heF9sZW5ndGg6IG1heF9sZW5ndGggPSBsZW4obmFtZSkKKyAgICAgICAgcGVyX2NwICs9IGxlbihuYW1lKSArIDEKKyAgICAgICAgaWYgcGVyX2NwID4gbWF4X3Blcl9jcDogbWF4X3Blcl9jcCA9IHBlcl9jcAorICAgICAgICB0b2tlbnMgPSBTcGxpdE5hbWUobmFtZSwgdG9rZW5fY291bnRlcnMpCisgICAgICAgIGZvciBjIGluIG5hbWU6CisgICAgICAgICAgaWYgYyBpbiAiMDEyMzQ1Njc4OSI6IG51bV9kaWdpdHMgKz0gMQorICAgICAgICAgIEluY0NvdW50ZXIoY2hhcl9jb3VudGVycywgYykKKyAgcHJpbnQKKyAgZm9yIHBuYW1lIGluIG5hbWVfcG5hbWVzOgorICAgIHByaW50ICgiJyVzJyBjaGFyYWN0ZXIgbmFtZXM6ICVkIC8gJWQgYnl0ZXMiICUKKyAgICAgICAgICAgKHBuYW1lLCBjb3VudHNbcG5hbWVdLCB0b3RhbF9sZW5ndGhzW3BuYW1lXSkpCisgIHByaW50ICIlZCB0b3RhbCBieXRlcyBpbiBjaGFyYWN0ZXIgbmFtZXMiICUgc3VtKHRvdGFsX2xlbmd0aHMuaXRlcnZhbHVlcygpKQorICBwcmludCAoIiVkIG5hbWUtY2hhcmFjdGVyczogJXMiICUKKyAgICAgICAgIChsZW4obmFtZV9jaGFycyksICIiLmpvaW4oc29ydGVkKG5hbWVfY2hhcnMpKSkpCisgIHByaW50ICIlZCBkaWdpdHMgMC05IiAlIG51bV9kaWdpdHMKKyAgY291bnRfY2hhcnMgPSBbKGNvdW50LCBjKSBmb3IgKGMsIGNvdW50KSBpbiBjaGFyX2NvdW50ZXJzLml0ZXJpdGVtcygpXQorICBjb3VudF9jaGFycy5zb3J0KHJldmVyc2U9VHJ1ZSkKKyAgZm9yIGNjIGluIGNvdW50X2NoYXJzOgorICAgIHByaW50ICJuYW1lLWNoYXJzOiAlNmQgKiAnJXMnIiAlIGNjCisgIHByaW50ICJtYXguIG5hbWUgbGVuZ3RoOiAlZCIgJSBtYXhfbGVuZ3RoCisgIHByaW50ICJtYXguIGxlbmd0aCBvZiBhbGwgKG5hbWVzK05VTCkgcGVyIGNwOiAlZCIgJSBtYXhfcGVyX2NwCisKKyAgdG9rZW5fbGVuZ3RocyA9IHN1bShbbGVuKHQpICsgMSBmb3IgdCBpbiB0b2tlbl9jb3VudGVyc10pCisgIHByaW50ICgiJWQgdG90YWwgdG9rZW5zLCAlZCBieXRlcyB3aXRoIE5VTCIgJQorICAgICAgICAgKGxlbih0b2tlbl9jb3VudGVycyksIHRva2VuX2xlbmd0aHMpKQorCisgIGNvdW50c190b2tlbnMgPSBbXQorICBmb3IgKHRva2VuLCBjb3VudCkgaW4gdG9rZW5fY291bnRlcnMuaXRlcml0ZW1zKCk6CisgICAgIyBJZiB3ZSBlbmNvZGUgYSB0b2tlbiB3aXRoIGEgMS1ieXRlIGNvZGUsIHRoZW4gd2Ugc2F2ZSBsZW4odCktMSBieXRlcyBlYWNoIHRpbWUKKyAgICAjIGJ1dCBoYXZlIHRvIHN0b3JlIHRoZSB0b2tlbiBzdHJpbmcgaXRzZWxmIHdpdGggYSBsZW5ndGggb3IgdGVybWluYXRvciBieXRlLAorICAgICMgcGx1cyBhIDItYnl0ZSBlbnRyeSBpbiBhbiB0b2tlbiBpbmRleCB0YWJsZS4KKyAgICBzYXZpbmdzID0gY291bnQgKiAobGVuKHRva2VuKSAtIDEpIC0gKGxlbih0b2tlbikgKyAxICsgMikKKyAgICBpZiBzYXZpbmdzID4gMDoKKyAgICAgIGNvdW50c190b2tlbnMuYXBwZW5kKChzYXZpbmdzLCBjb3VudCwgdG9rZW4pKQorICBjb3VudHNfdG9rZW5zLnNvcnQocmV2ZXJzZT1UcnVlKQorICBwcmludCAiJWQgdG9rZW5zIG1pZ2h0IHNhdmUgc3BhY2Ugd2l0aCAxLWJ5dGUgY29kZXMiICUgbGVuKGNvdW50c190b2tlbnMpCisKKyAgIyBDb2Rlcz1ieXRlcywgNDAgYnl0ZSB2YWx1ZXMgZm9yIG5hbWVfY2hhcnMuCisgICMgVGhhdCBsZWF2ZXMgMjE2IHVuaXRzIGZvciAxLWJ5dGUgdG9rZW5zIG9yIGxlYWQgYnl0ZXMgb2YgMi1ieXRlIHRva2Vucy4KKyAgIyBNYWtlIGVhY2ggMi1ieXRlIHRva2VuIHRoZSB0b2tlbiBzdHJpbmcgaW5kZXggaXRzZWxmLCByYXRoZXIgdGhhbgorICAjIGFuZCBpbmRleCBpbnRvIGEgc3RyaW5nIGluZGV4IHRhYmxlLgorICAjIE1vcmUgbGVhZCBieXRlcyBidXQgYWxzbyBtb3JlIHNhdmluZ3MuCisgIG51bV91bml0cyA9IDI1NgorICBtYXhfbGVhZCA9ICh0b2tlbl9sZW5ndGhzICsgMjU1KSAvIDI1NgorICBtYXhfdG9rZW5fdW5pdHMgPSBudW1fdW5pdHMgLSBsZW4obmFtZV9jaGFycykKKyAgcmVzdWx0cyA9IFtdCisgIGZvciBudW1fbGVhZCBpbiB4cmFuZ2UobWluKG1heF9sZWFkLCBtYXhfdG9rZW5fdW5pdHMpICsgMSk6CisgICAgbWF4MSA9IG1heF90b2tlbl91bml0cyAtIG51bV9sZWFkCisgICAgY3QgPSBjb3VudHNfdG9rZW5zWzptYXgxXQorICAgIHRva2VuczEgPSBzZXQoW3QgZm9yIChzLCBjLCB0KSBpbiBjdF0pCisgICAgZm9yICh0b2tlbiwgY291bnQpIGluIHRva2VuX2NvdW50ZXJzLml0ZXJpdGVtcygpOgorICAgICAgaWYgdG9rZW4gaW4gdG9rZW5zMTogY29udGludWUKKyAgICAgICMgSWYgd2UgZW5jb2RlIGEgdG9rZW4gd2l0aCBhIDItYnl0ZSBjb2RlLCB0aGVuIHdlIHNhdmUgbGVuKHQpLTIgYnl0ZXMgZWFjaCB0aW1lCisgICAgICAjIGJ1dCBoYXZlIHRvIHN0b3JlIHRoZSB0b2tlbiBzdHJpbmcgaXRzZWxmIHdpdGggYSBsZW5ndGggb3IgdGVybWluYXRvciBieXRlLgorICAgICAgc2F2aW5ncyA9IGNvdW50ICogKGxlbih0b2tlbikgLSAyKSAtIChsZW4odG9rZW4pICsgMSkKKyAgICAgIGlmIHNhdmluZ3MgPiAwOgorICAgICAgICBjdC5hcHBlbmQoKHNhdmluZ3MsIGNvdW50LCB0b2tlbikpCisgICAgY3Quc29ydChyZXZlcnNlPVRydWUpCisgICAgIyBBIDItYnl0ZS1jb2RlLXRva2VuIGluZGV4IGNhbm5vdCBiZSBsaW1pdF90X2xlbmd0aHMgb3IgaGlnaGVyLgorICAgIGxpbWl0X3RfbGVuZ3RocyA9IG51bV9sZWFkICogMjU2CisgICAgdG9rZW4yX2luZGV4ID0gMAorICAgIGZvciBpIGluIHhyYW5nZShtYXgxLCBsZW4oY3QpKToKKyAgICAgIGlmIHRva2VuMl9pbmRleCA+PSBsaW1pdF90X2xlbmd0aHM6CisgICAgICAgIGRlbCBjdFtpOl0KKyAgICAgICAgYnJlYWsKKyAgICAgIHRva2VuMl9pbmRleCArPSBsZW4oY3RbaV1bMl0pICsgMQorICAgIGN1bXVsX3NhdmluZ3MgPSBzdW0oW3MgZm9yIChzLCBjLCB0KSBpbiBjdF0pCisgICAgIyBwcmludCAoIiUyZCAxLWJ5dGUgY29kZXM6ICU0ZCB0b2tlbnMgbWlnaHQgc2F2ZSAlNmQgYnl0ZXMiICUKKyAgICAjICAgICAgICAobWF4MSwgbGVuKGN0KSwgY3VtdWxfc2F2aW5ncykpCisgICAgcmVzdWx0cy5hcHBlbmQoKGN1bXVsX3NhdmluZ3MsIG1heDEsIGN0KSkKKyAgYmVzdCA9IG1heChyZXN1bHRzKSAgIyAoY3VtdWxfc2F2aW5ncywgbWF4MSwgY3QpCisKKyAgbWF4MSA9IGJlc3RbMV0KKyAgcHJpbnQgKCJtYXhpbXVtIHNhdmluZ3M6ICVkIGJ5dGVzIHdpdGggJWQgMS1ieXRlIGNvZGVzICYgJWQgbGVhZCBieXRlcyIgJQorICAgICAgICAgKGJlc3RbMF0sIG1heDEsIG1heF90b2tlbl91bml0cyAtIG1heDEpKQorICBjb3VudHNfdG9rZW5zID0gYmVzdFsyXQorICBjdW11bF9zYXZpbmdzID0gMAorICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50c190b2tlbnMpKToKKyAgICBuID0gMSBpZiBpIDwgbWF4MSBlbHNlIDIKKyAgICBpMSA9IGkgKyAxCisgICAgdCA9IGNvdW50c190b2tlbnNbaV0KKyAgICBjdW11bF9zYXZpbmdzICs9IHRbMF0KKyAgICBpZiBpMSA8PSAyNTAgb3IgKGkxICUgMTAwKSA9PSAwIG9yIGkxID09IGxlbihjb3VudHNfdG9rZW5zKToKKyAgICAgIHByaW50ICgoIiUwNGQuIGN1bXVsLiAlNmQgYnl0ZXMgc2F2ZSAlNmQgYnl0ZXMgZnJvbSAiICsKKyAgICAgICAgICAgICAgIiU1ZCAqICVkLWJ5dGUgdG9rZW4gZm9yICUyZD0nJXMnIikgJQorICAgICAgICAgIChpMSwgY3VtdWxfc2F2aW5ncywgdFswXSwgdFsxXSwgbiwgbGVuKHRbMl0pLCB0WzJdKSkKKworIyBJQ1UgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKioKKworIyBTYW1wbGUgbGluZSB0byBtYXRjaDoKKyMgICAgVUNIQVJfVU5JRklFRF9JREVPR1JBUEg9MjksCitfdWNoYXJfcmUgPSByZS5jb21waWxlKAorICAgICIgKihVQ0hBUl9bMC05QS1aX10rKSAqPSAqKD86WzAtOV0rfDB4WzAtOWEtZkEtRl0rKSwiKQorCisjIFNhbXBsZSBsaW5lIHRvIG1hdGNoOgorIyAgICAvKiogWnMgQHN0YWJsZSBJQ1UgMi4wICovCitfZ2NfY29tbWVudF9yZSA9IHJlLmNvbXBpbGUoIiAqL1wqXCogKihbQS1aXVthLXpdKSAiKQorCisjIFNhbXBsZSBsaW5lIHRvIG1hdGNoOgorIyAgICBVX1NQQUNFX1NFUEFSQVRPUiAgICAgICAgID0gMTIsCitfZ2NfcmUgPSByZS5jb21waWxlKCIgKihVX1tBLVpfXSspICo9ICpbMC05XSssIikKKworIyBTYW1wbGUgbGluZSB0byBtYXRjaDoKKyMgICAgLyoqIEwgQHN0YWJsZSBJQ1UgMi4wICovCitfYmNfY29tbWVudF9yZSA9IHJlLmNvbXBpbGUoIiAqL1wqXCogKihbQS1aXXsxLDN9KSAiKQorCisjIFNhbXBsZSBsaW5lIHRvIG1hdGNoOgorIyAgICBVX0xFRlRfVE9fUklHSFQgICAgICAgICAgICAgICA9IDAsCitfYmNfcmUgPSByZS5jb21waWxlKCIgKihVX1tBLVpfXSspICo9ICpbMC05XSssIikKKworIyBTYW1wbGUgbGluZSB0byBtYXRjaDoKKyMgICAgVUJMT0NLX0NZUklMTElDID05LAorX3VibG9ja19yZSA9IHJlLmNvbXBpbGUoIiAqKFVCTE9DS19bMC05QS1aX10rKSAqPSAqWzAtOV0rLCIpCisKKyMgU2FtcGxlIGxpbmUgdG8gbWF0Y2g6CisjICAgIFVfRUFfQU1CSUdVT1VTLAorX3Byb3BfYW5kX3ZhbHVlX3JlID0gcmUuY29tcGlsZSgKKyAgICAiICooVV8oRFR8RUF8R0NCfEhTVHxMQnxKR3xKVHxOVHxTQnxXQilfKFswLTlBLVpfXSspKSIpCisKKyMgU2FtcGxlIGxpbmUgdG8gbWF0Y2ggaWYgaXQgaGFzIG1hdGNoZWQgX3Byb3BfYW5kX3ZhbHVlX3JlCisjICh3ZSB3YW50IHRvIGV4Y2x1ZGUgYWxpYXNlcyk6CisjICAgIFVfSkdfSEFNWkFfT05fSEVIX0dPQUw9VV9KR19URUhfTUFSQlVUQV9HT0FMLAorX3Byb3BfYW5kX2FsaWFzX3JlID0gcmUuY29tcGlsZSgiICpVX1swLTlBLVpfXSsgKj0gKlUiKQorCitkZWYgUGFyc2VVQ2hhckhlYWRlcihpY3Vfc3JjX3Jvb3QpOgorICB1Y2hhcl9wYXRoID0gb3MucGF0aC5qb2luKGljdV9zcmNfcm9vdCwgInNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1vbiIsICJ1bmljb2RlIiwgInVjaGFyLmgiKQorICB3aXRoIG9wZW4odWNoYXJfcGF0aCwgInIiKSBhcyB1Y2hhcl9maWxlOgorICAgIG1vZGUgPSAiIiAgIyBNb2RlIHN0cmluZyAoPXBuYW1lKSBkdXJpbmcgY29udGV4dC1zZW5zaXRpdmUgcGFyc2luZy4KKyAgICBjb21tZW50X3ZhbHVlID0gIiIgICMgUHJvcGVydHkgdmFsdWUgZnJvbSBhIGNvbW1lbnQgcHJlY2VkaW5nIGFuIGVudW0uCisgICAgIyBOb3RlOiBUaGUgZW51bSBVUHJvcGVydHkgaXMgZmlyc3QgaW4gdWNoYXIuaCwgYmVmb3JlIHRoZSBlbnVtcyBmb3IgdmFsdWVzLgorICAgIGZvciBsaW5lIGluIHVjaGFyX2ZpbGU6CisgICAgICAjIFBhcnNlIHNvbWUgZW51bXMgdmlhIGNvbnRleHQtc2Vuc2l0aXZlICJtb2RlcyIuCisgICAgICAjIE5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBlbnVtIGNvbnN0YW50IG5hbWVzIGRvIG5vdCBjb250YWluCisgICAgICAjIGVub3VnaCBpbmZvcm1hdGlvbi4KKyAgICAgIGlmICJlbnVtIFVDaGFyQ2F0ZWdvcnkiIGluIGxpbmU6CisgICAgICAgIG1vZGUgPSAiZ2MiCisgICAgICAgIGNvbW1lbnRfdmFsdWUgPSAiIgorICAgICAgICBjb250aW51ZQorICAgICAgaWYgbW9kZSA9PSAiZ2MiOgorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIn0iKToKKyAgICAgICAgICBtb2RlID0gIiIKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBtYXRjaCA9IF9nY19jb21tZW50X3JlLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgIGNvbW1lbnRfdmFsdWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG1hdGNoID0gX2djX3JlLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1hdGNoIGFuZCBjb21tZW50X3ZhbHVlOgorICAgICAgICAgIGdjX2VudW0gPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgIHByb3AgPSBfcHJvcGVydGllc1siZ2MiXQorICAgICAgICAgIHZuYW1lID0gR2V0U2hvcnRQcm9wZXJ0eVZhbHVlTmFtZShwcm9wLCBjb21tZW50X3ZhbHVlKQorICAgICAgICAgIGljdV92YWx1ZXMgPSBfcG5hbWVfdG9faWN1X3Byb3BbImdjIl1bMl0KKyAgICAgICAgICBpY3VfdmFsdWVzLmFwcGVuZCgoZ2NfZW51bSwgdm5hbWUpKQorICAgICAgICBjb21tZW50X3ZhbHVlID0gIiIKKyAgICAgICAgY29udGludWUKKyAgICAgIGlmICJlbnVtIFVDaGFyRGlyZWN0aW9uIHsiIGluIGxpbmU6CisgICAgICAgIG1vZGUgPSAiYmMiCisgICAgICAgIGNvbW1lbnRfdmFsdWUgPSAiIgorICAgICAgICBjb250aW51ZQorICAgICAgaWYgbW9kZSA9PSAiYmMiOgorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIn0iKToKKyAgICAgICAgICBtb2RlID0gIiIKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBtYXRjaCA9IF9iY19jb21tZW50X3JlLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgIGNvbW1lbnRfdmFsdWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG1hdGNoID0gX2JjX3JlLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1hdGNoIGFuZCBjb21tZW50X3ZhbHVlOgorICAgICAgICAgIGJjX2VudW0gPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgIHByb3AgPSBfcHJvcGVydGllc1siYmMiXQorICAgICAgICAgIHZuYW1lID0gR2V0U2hvcnRQcm9wZXJ0eVZhbHVlTmFtZShwcm9wLCBjb21tZW50X3ZhbHVlKQorICAgICAgICAgIGljdV92YWx1ZXMgPSBfcG5hbWVfdG9faWN1X3Byb3BbImJjIl1bMl0KKyAgICAgICAgICBpY3VfdmFsdWVzLmFwcGVuZCgoYmNfZW51bSwgdm5hbWUpKQorICAgICAgICBjb21tZW50X3ZhbHVlID0gIiIKKyAgICAgICAgY29udGludWUKKyAgICAgICMgTm8gbW9kZSwgcGFyc2UgZW51bSBjb25zdGFudHMgd2hvc2UgbmFtZXMgY29udGFpbgorICAgICAgIyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gcGFyc2Ugd2l0aG91dCByZXF1aXJpbmcgY29udGV4dC4KKyAgICAgIG1hdGNoID0gX3VjaGFyX3JlLm1hdGNoKGxpbmUpCisgICAgICBpZiBtYXRjaDoKKyAgICAgICAgcHJvcF9lbnVtID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgaWYgcHJvcF9lbnVtLmVuZHN3aXRoKCJfTElNSVQiKToKKyAgICAgICAgICAjIElnbm9yZSAiVUNIQVJfQklOQVJZX0xJTUlUPTU3LCIgZXRjLgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHBuYW1lID0gR2V0U2hvcnRQcm9wZXJ0eU5hbWUocHJvcF9lbnVtWzY6XSkKKyAgICAgICAgaWN1X3Byb3AgPSAocHJvcF9lbnVtLCBwbmFtZSwgW10pCisgICAgICAgIF9pY3VfcHJvcGVydGllcy5hcHBlbmQoaWN1X3Byb3ApCisgICAgICAgIF9wbmFtZV90b19pY3VfcHJvcFtwbmFtZV0gPSBpY3VfcHJvcAorICAgICAgICBjb250aW51ZQorICAgICAgbWF0Y2ggPSBfdWJsb2NrX3JlLm1hdGNoKGxpbmUpCisgICAgICBpZiBtYXRjaDoKKyAgICAgICAgcHJvcF9lbnVtID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgaWYgcHJvcF9lbnVtID09ICJVQkxPQ0tfQ09VTlQiOgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHByb3AgPSBfcHJvcGVydGllc1siYmxrIl0KKyAgICAgICAgdm5hbWUgPSBHZXRTaG9ydFByb3BlcnR5VmFsdWVOYW1lKHByb3AsIHByb3BfZW51bVs3Ol0pCisgICAgICAgIGljdV92YWx1ZXMgPSBfcG5hbWVfdG9faWN1X3Byb3BbImJsayJdWzJdCisgICAgICAgIGljdV92YWx1ZXMuYXBwZW5kKChwcm9wX2VudW0sIHZuYW1lKSkKKyAgICAgICAgY29udGludWUKKyAgICAgIG1hdGNoID0gX3Byb3BfYW5kX3ZhbHVlX3JlLm1hdGNoKGxpbmUpCisgICAgICBpZiBtYXRjaDoKKyAgICAgICAgKHByb3BfZW51bSwgdm5hbWUpID0gbWF0Y2guZ3JvdXAoMSwgMykKKyAgICAgICAgaWYgdm5hbWUgPT0gIkNPVU5UIiBvciBfcHJvcF9hbmRfYWxpYXNfcmUubWF0Y2gobGluZSk6CisgICAgICAgICAgY29udGludWUKKyAgICAgICAgcG5hbWUgPSBHZXRTaG9ydFByb3BlcnR5TmFtZShtYXRjaC5ncm91cCgyKSkKKyAgICAgICAgcHJvcCA9IF9wcm9wZXJ0aWVzW3BuYW1lXQorICAgICAgICB2bmFtZSA9IEdldFNob3J0UHJvcGVydHlWYWx1ZU5hbWUocHJvcCwgdm5hbWUpCisgICAgICAgIGljdV92YWx1ZXMgPSBfcG5hbWVfdG9faWN1X3Byb3BbcG5hbWVdWzJdCisgICAgICAgIGljdV92YWx1ZXMuYXBwZW5kKChwcm9wX2VudW0sIHZuYW1lKSkKKyAgIyBjY2MsIGxjY2MsIHRjY2MgdXNlIHRoZWlyIG51bWVyaWMgdmFsdWVzIGFzICJlbnVtIiB2YWx1ZXMuCisgICMgSW4gdGhlIFVDRCBkYXRhLCB0aGVzZSBudW1lcmljIHZhbHVlcyBhcmUgdGhlIGZpcnN0IHZhbHVlIG5hbWVzLAorICAjIGZvbGxvd2VkIGJ5IHRoZSBzaG9ydCAmIGxvbmcgdmFsdWUgbmFtZXMuCisgICMgTGlzdCB0aGUgY2NjIHZhbHVlcyBpbiBudW1lcmljIG9yZGVyLgorICBwcm9wID0gX3Byb3BlcnRpZXNbImNjYyJdCisgIGljdV92YWx1ZXMgPSBfcG5hbWVfdG9faWN1X3Byb3BbImNjYyJdWzJdCisgIGZvciBjY2MgaW4gc29ydGVkKFtpbnQobmFtZSkgZm9yIG5hbWUgaW4gcHJvcFsyXV0pOgorICAgIGljdV92YWx1ZXMuYXBwZW5kKChjY2MsIHN0cihjY2MpKSkKKyAgX3BuYW1lX3RvX2ljdV9wcm9wWyJsY2NjIl1bMl0uZXh0ZW5kKGljdV92YWx1ZXMpICAjIENvcHkgY2NjIC0+IGxjY2MuCisgIF9wbmFtZV90b19pY3VfcHJvcFsidGNjYyJdWzJdLmV4dGVuZChpY3VfdmFsdWVzKSAgIyBDb3B5IGNjYyAtPiB0Y2NjLgorCisgICMgTm8gbmVlZCB0byBwYXJzZSBwcmVkaWN0YWJsZSBHZW5lcmFsX0NhdGVnb3J5X01hc2sgZW51bSBjb25zdGFudHMuCisgICMgSnVzdCBkZWZpbmUgdGhlbSBpbiBBU0NJSSBvcmRlci4KKyAgcHJvcCA9IF9wcm9wZXJ0aWVzWyJnY20iXQorICBpY3VfdmFsdWVzID0gX3BuYW1lX3RvX2ljdV9wcm9wWyJnY20iXVsyXQorICBmb3Igdm5hbWUgaW4gc29ydGVkKHByb3BbMl0pOgorICAgIGljdV92YWx1ZXMuYXBwZW5kKCgiVV9HQ18iICsgdm5hbWUudXBwZXIoKSArICJfTUFTSyIsIHZuYW1lKSkKKyAgIyBIYXJkY29kZSBrbm93biB2YWx1ZXMgZm9yIHRoZSBub3JtYWxpemF0aW9uIHF1aWNrIGNoZWNrIHByb3BlcnRpZXMsCisgICMgc2VlIHVub3JtMi5oIGZvciB0aGUgVU5vcm1hbGl6YXRpb25DaGVja1Jlc3VsdCBlbnVtLgorICBpY3VfdmFsdWVzID0gX3BuYW1lX3RvX2ljdV9wcm9wWyJORkNfUUMiXVsyXQorICBpY3VfdmFsdWVzLmFwcGVuZCgoIlVOT1JNX05PIiwgIk4iKSkKKyAgaWN1X3ZhbHVlcy5hcHBlbmQoKCJVTk9STV9ZRVMiLCAiWSIpKQorICBpY3VfdmFsdWVzLmFwcGVuZCgoIlVOT1JNX01BWUJFIiwgIk0iKSkKKyAgX3BuYW1lX3RvX2ljdV9wcm9wWyJORktDX1FDIl1bMl0uZXh0ZW5kKGljdV92YWx1ZXMpICAjIENvcHkgTkZDIC0+IE5GS0MuCisgICMgTm8gIm1heWJlIiB2YWx1ZXMgZm9yIE5GW0tdRC4KKyAgaWN1X3ZhbHVlcyA9IF9wbmFtZV90b19pY3VfcHJvcFsiTkZEX1FDIl1bMl0KKyAgaWN1X3ZhbHVlcy5hcHBlbmQoKCJVTk9STV9OTyIsICJOIikpCisgIGljdV92YWx1ZXMuYXBwZW5kKCgiVU5PUk1fWUVTIiwgIlkiKSkKKyAgX3BuYW1lX3RvX2ljdV9wcm9wWyJORktEX1FDIl1bMl0uZXh0ZW5kKGljdV92YWx1ZXMpICAjIENvcHkgTkZEIC0+IE5GS0QuCisKKworIyBTYW1wbGUgbGluZSB0byBtYXRjaDoKKyMgICAgVVNDUklQVF9MT01BICAgPSAxMzksLyogTG9tYSAqLworX3VzY3JpcHRfcmUgPSByZS5jb21waWxlKAorICAgICIgKihVU0NSSVBUX1tBLVpfXSspICo9ICpbMC05XSsgKiwgKi9cKiAqKFtBLVpdW2Etel17M30pICpcKi8iKQorCitkZWYgUGFyc2VVU2NyaXB0SGVhZGVyKGljdV9zcmNfcm9vdCk6CisgIHVzY3JpcHRfcGF0aCA9IG9zLnBhdGguam9pbihpY3Vfc3JjX3Jvb3QsICJzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1vbiIsICJ1bmljb2RlIiwgInVzY3JpcHQuaCIpCisgIGljdV92YWx1ZXMgPSBfcG5hbWVfdG9faWN1X3Byb3BbInNjIl1bMl0KKyAgd2l0aCBvcGVuKHVzY3JpcHRfcGF0aCwgInIiKSBhcyB1c2NyaXB0X2ZpbGU6CisgICAgZm9yIGxpbmUgaW4gdXNjcmlwdF9maWxlOgorICAgICAgbWF0Y2ggPSBfdXNjcmlwdF9yZS5tYXRjaChsaW5lKQorICAgICAgaWYgbWF0Y2g6CisgICAgICAgIChzY3JpcHRfZW51bSwgc2NyaXB0X2NvZGUpID0gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICAgICAgaWN1X3ZhbHVlcy5hcHBlbmQoKHNjcmlwdF9lbnVtLCBzY3JpcHRfY29kZSkpCisKKworZGVmIENoZWNrUE5hbWVzRGF0YSgpOgorICAiIiJDaGVja3MgdGhhdCBldmVyeSBJQ1UgcHJvcGVydHkgaGFzIGEgZnVsbCBzZXQgb2YgdmFsdWUgZW51bSBjb25zdGFudHMsCisgIGFuZCB0aGF0IHRoZSBfaWN1X3Byb3BlcnRpZXMgdmFsdWUgbmFtZXMgbWFwIGJhY2sgdG8gdGhlIFVDRC4iIiIKKyAgbWlzc2luZ19lbnVtcyA9IFtdCisgIGZvciAocF9lbnVtLCBwbmFtZSwgdmFsdWVzKSBpbiBfaWN1X3Byb3BlcnRpZXM6CisgICAgcHJvcCA9IF9wcm9wZXJ0aWVzW3BuYW1lXQorICAgIHZuYW1lcyA9IHNldChwcm9wWzJdKSAgIyBNb2RpZmlhYmxlIGNvcHkgb2YgdGhlIHNldCBvZiBzaG9ydCB2YWx1ZSBuYW1lcy4KKyAgICBmb3IgKHZfZW51bSwgdm5hbWUpIGluIHZhbHVlczoKKyAgICAgIGlmIHZuYW1lIG5vdCBpbiB2bmFtZXM6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVzID0gJXMgKHVjaGFyLmggJXMpIG5vdCBpbiB0aGUgVUNEXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocG5hbWUsIHZuYW1lLCB2X2VudW0pKQorICAgICAgdm5hbWVzLnJlbW92ZSh2bmFtZSkKKyAgICAjIEV4Y2VwdGlvbnMgdG8gdGhlIGFsbC12YWx1ZXMgY2hlY2s6CisgICAgIyAtIElDVSBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIGVudW0gdmFsdWVzIGZvciBiaW5hcnkgTm8vWWVzLgorICAgICMgLSBJQ1UgcmVwcmVzZW50cyBBZ2UgdmFsdWVzIHZpYSBVVmVyc2lvbkluZm8gcmF0aGVyIHRoYW4gZW51bSBjb25zdGFudHMuCisgICAgIyAtIGdjOiBJQ1UgZW51bSBVQ2hhckNhdGVnb3J5IG9ubHkgaGFzIHRoZSBzaW5nbGUtY2F0ZWdvcnkgdmFsdWVzLgorICAgICMgICAgICAgKElDVSdzIGdjbSBwcm9wZXJ0eSBoYXMgYWxsIG9mIHRoZSBVQ0QgZ2MgcHJvcGVydHkgdmFsdWVzLikKKyAgICBpZiB2bmFtZXMgYW5kIG5vdCAocHJvcFswXSA9PSAiQmluYXJ5IiBvciBwbmFtZSBpbiAoImFnZSIsICJnYyIpKToKKyAgICAgIG1pc3NpbmdfZW51bXMuYXBwZW5kKChwbmFtZSwgdm5hbWVzKSkKKyAgaWYgbWlzc2luZ19lbnVtczoKKyAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAibWlzc2luZyB1Y2hhci5oIGVudW0gY29uc3RhbnRzIGZvciBzb21lIHByb3BlcnR5IHZhbHVlczogJXMiICUKKyAgICAgICAgbWlzc2luZ19lbnVtcykKKworCitkZWYgV3JpdGVQTmFtZXNEYXRhSGVhZGVyKG91dF9wYXRoKToKKyAgeWVhciA9IGRhdGV0aW1lLmRhdGUudG9kYXkoKS5zdHJmdGltZSgiJVkiKQorICB3aXRoIG9wZW4ob3V0X3BhdGgsICJ3IikgYXMgb3V0X2ZpbGU6CisgICAgb3V0X2ZpbGUud3JpdGUoIiIiLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItIiIiICsgeWVhciArCisiIiIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogbWFjaGluZS1nZW5lcmF0ZWQgYnk6IGljdS90b29scy91bmljb2RlL3B5L3ByZXBhcnNldWNkLnB5CisgKi8KKworIiIiKQorCisgICAgIyBOb3RlOiBUaGUgdWNoYXIuaCAmIHVzY3JpcHQuaCBwYXJzZXJzIHN0b3JlIHRoZSBJQ1UgVW5pY29kZSBwcm9wZXJ0aWVzCisgICAgIyBhbmQgdmFsdWVzIGluIHRoZSBvcmRlciBvZiB0aGVpciBkZWZpbml0aW9uLAorICAgICMgYW5kIHRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZW0gaW4gdGhhdCBvcmRlci4KKyAgICAjIFNpbmNlIHRoZSBJQ1UgQVBJIGNvbnN0YW50cyBhcmUgc3RhYmxlIGFuZCBuZXcgdmFsdWVzIGFyZSBvbmx5CisgICAgIyBhcHBlbmRlZCBhdCB0aGUgZW5kCisgICAgIyAobmV3IHByb3BlcnRpZXMgYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBiaW5hcnkvZW51bS8uLi4gcmFuZ2UpLAorICAgICMgdGhlIG91dHB1dCBpcyBzdGFibGUgYXMgd2VsbC4KKyAgICAjIFdoZW4gYSBwcm9wZXJ0eSBvciB2YWx1ZSBjb25zdGFudCBpcyByZW5hbWVkLAorICAgICMgaXQgb25seSBjaGFuZ2VzIHRoZSBuYW1lIGl0c2VsZiBpbiB0aGUgb3V0cHV0OworICAgICMgaXQgZG9lcyBub3QgbW92ZSBpbiB0aGUgb3V0cHV0IHNpbmNlIHRoZXJlIGlzIG5vIHNvcnRpbmcuCisgICAgIyBUaGlzIG1pbmltaXplcyBkaWZmcyBhbmQgYXNzaXN0cyB3aXRoIHJldmlld2luZyBhbmQgZXZhbHVhdGluZyB1cGRhdGVzLgorCisgICAgdmVyc2lvbiA9IF91Y2RfdmVyc2lvbi5zcGxpdCgnLicpCisgICAgd2hpbGUgbGVuKHZlcnNpb24pIDwgNDogdmVyc2lvbi5hcHBlbmQoIjAiKQorICAgIG91dF9maWxlLndyaXRlKCIjZGVmaW5lIFVOSUNPREVfVkVSU0lPTiB7ICVzIH1cblxuIiAlICIsICIuam9pbih2ZXJzaW9uKSkKKworICAgICMgQ291bnQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsaWFzZXMgZm9yIGFueSBwcm9wZXJ0eSBvciB2YWx1ZS4KKyAgICAjIFdlIHdyaXRlIHRoZSBmaW5hbCB2YWx1ZSBhdCB0aGUgZW5kLgorICAgIG1heF9hbGlhc2VzID0gbWF4KGxlbihfYmluYXJ5X3ZhbHVlc1siTiJdKSwgbGVuKF9iaW5hcnlfdmFsdWVzWyJZIl0pKQorCisgICAgIyBXcml0ZSBhbiBhcnJheSBvZiAiYmlucHJvcCIgVmFsdWUgb2JqZWN0IGluaXRpYWxpemVycworICAgICMgd2l0aCB0aGUgdmFsdWUgYWxpYXNlcyBzaGFyZWQgYW1vbmcgYWxsIGJpbmFyeSBwcm9wZXJ0aWVzLgorICAgIG91dF9maWxlLndyaXRlKCJzdGF0aWMgY29uc3QgVmFsdWUgVkFMVUVTX2JpbnByb3BbMl0gPSB7XG4iKQorICAgIG91dF9maWxlLndyaXRlKCcgICAgVmFsdWUoMCwgIiVzIiksXG4nICUgIiAiLmpvaW4oX2JpbmFyeV92YWx1ZXNbIk4iXSkpCisgICAgb3V0X2ZpbGUud3JpdGUoJyAgICBWYWx1ZSgxLCAiJXMiKSxcbicgJSAiICIuam9pbihfYmluYXJ5X3ZhbHVlc1siWSJdKSkKKyAgICBvdXRfZmlsZS53cml0ZSgifTtcblxuIikKKworICAgICMgRm9yIGVhY2ggcHJvcGVydHkgd2l0aCBuYW1lZCB2YWx1ZXMsIHdyaXRlIGFuIGFycmF5IG9mCisgICAgIyBWYWx1ZSBvYmplY3QgaW5pdGlhbGl6ZXJzIHdpdGggdGhlIHZhbHVlIGVudW0gYW5kIHRoZSBhbGlhc2VzLgorICAgIGZvciAocF9lbnVtLCBwbmFtZSwgdmFsdWVzKSBpbiBfaWN1X3Byb3BlcnRpZXM6CisgICAgICBwcm9wID0gX3Byb3BlcnRpZXNbcG5hbWVdCisgICAgICBhbGlhc2VzID0gcHJvcFsxXQorICAgICAgaWYgbGVuKGFsaWFzZXMpID4gbWF4X2FsaWFzZXM6IG1heF9hbGlhc2VzID0gbGVuKGFsaWFzZXMpCisgICAgICBpZiBub3QgdmFsdWVzOiBjb250aW51ZQorICAgICAgb3V0X2ZpbGUud3JpdGUoInN0YXRpYyBjb25zdCBWYWx1ZSBWQUxVRVNfJXNbJWRdID0ge1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAocG5hbWUsIGxlbih2YWx1ZXMpKSkKKyAgICAgIGZvciAodl9lbnVtLCB2bmFtZSkgaW4gdmFsdWVzOgorICAgICAgICBhbGlhc2VzID0gX3Byb3BlcnRpZXNbcG5hbWVdWzNdW3ZuYW1lXQorICAgICAgICAjIGNjYywgbGNjYywgdGNjYzogT21pdCB0aGUgbnVtZXJpYyBzdHJpbmdzIGZyb20gdGhlIGFsaWFzZXMuCisgICAgICAgICMgKFNlZSB0aGUgY29tbWVudCBhYm91dCBjY2MgaW4gdGhlIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCBoZWFkZXIuKQorICAgICAgICBpZiBwbmFtZS5lbmRzd2l0aCgiY2NjIik6IGFsaWFzZXMgPSBhbGlhc2VzWzE6XQorICAgICAgICBpZiBsZW4oYWxpYXNlcykgPiBtYXhfYWxpYXNlczogbWF4X2FsaWFzZXMgPSBsZW4oYWxpYXNlcykKKyAgICAgICAgY2FzdCA9ICIoaW50MzJfdCkiIGlmIHBuYW1lID09ICJnY20iIGVsc2UgIiIKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUoJyAgICBWYWx1ZSglcyVzLCAiJXMiKSxcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAoY2FzdCwgdl9lbnVtLCAiICIuam9pbihhbGlhc2VzKSkpCisgICAgICBvdXRfZmlsZS53cml0ZSgifTtcblxuIikKKworICAgICMgRm9yIGVhY2ggcHJvcGVydHksIHdyaXRlIGEgUHJvcGVydHkgb2JqZWN0IGluaXRpYWxpemVyCisgICAgIyB3aXRoIHRoZSBwcm9wZXJ0eSBlbnVtLCBpdHMgYWxpYXNlcywgYW5kIGEgcmVmZXJlbmNlIHRvIGl0cyB2YWx1ZXMuCisgICAgb3V0X2ZpbGUud3JpdGUoInN0YXRpYyBjb25zdCBQcm9wZXJ0eSBQUk9QRVJUSUVTWyVkXSA9IHtcbiIgJQorICAgICAgICAgICAgICAgICAgIGxlbihfaWN1X3Byb3BlcnRpZXMpKQorICAgIGZvciAoZW51bSwgcG5hbWUsIHZhbHVlcykgaW4gX2ljdV9wcm9wZXJ0aWVzOgorICAgICAgcHJvcCA9IF9wcm9wZXJ0aWVzW3BuYW1lXQorICAgICAgYWxpYXNlcyA9ICIgIi5qb2luKHByb3BbMV0pCisgICAgICBpZiBwcm9wWzBdID09ICJCaW5hcnkiOgorICAgICAgICBvdXRfZmlsZS53cml0ZSgnICAgIFByb3BlcnR5KCVzLCAiJXMiKSxcbicgJSAoZW51bSwgYWxpYXNlcykpCisgICAgICBlbGlmIHZhbHVlczogICMgUHJvcGVydHkgd2l0aCBuYW1lZCB2YWx1ZXMuCisgICAgICAgIG91dF9maWxlLndyaXRlKCcgICAgUHJvcGVydHkoJXMsICIlcyIsIFZBTFVFU18lcywgJWQpLFxuJyAlCisgICAgICAgICAgICAgICAgICAgICAgIChlbnVtLCBhbGlhc2VzLCBwbmFtZSwgbGVuKHZhbHVlcykpKQorICAgICAgZWxzZToKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUoJyAgICBQcm9wZXJ0eSglcywgIiVzIiksXG4nICUgKGVudW0sIGFsaWFzZXMpKQorICAgIG91dF9maWxlLndyaXRlKCJ9O1xuXG4iKQorCisgICAgb3V0X2ZpbGUud3JpdGUoImNvbnN0IGludDMyX3QgTUFYX0FMSUFTRVMgPSAlZDtcbiIgJSBtYXhfYWxpYXNlcykKKworIyBtYWluKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKioKKworZGVmIG1haW4oKToKKyAgZ2xvYmFsIF9udWxsX29yX2RlZmF1bHRzCisgIGlmIGxlbihzeXMuYXJndikgPCA0OgorICAgIHByaW50ICgiVXNhZ2U6ICVzICBwYXRoL3RvL1VDRC9yb290ICBwYXRoL3RvL0lDVS9zcmMvcm9vdCAgIgorICAgICAgICAgICAicGF0aC90by9JQ1UvdG9vbHMvcm9vdCIgJSBzeXMuYXJndlswXSkKKyAgICByZXR1cm4KKyAgKHVjZF9yb290LCBpY3Vfc3JjX3Jvb3QsIGljdV90b29sc19yb290KSA9IHN5cy5hcmd2WzE6NF0KKyAgc291cmNlX2ZpbGVzID0gW10KKyAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsodWNkX3Jvb3QpOgorICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgc291cmNlX2ZpbGVzLmFwcGVuZChvcy5wYXRoLmpvaW4ocm9vdCwgZmlsZSkpCisgIFByZXByb2Nlc3NGaWxlcyhzb3VyY2VfZmlsZXMsIGljdV9zcmNfcm9vdCkKKyAgIyBQYXJzZSB0aGUgcHJvY2Vzc2VkIGZpbGVzIGluIGEgcGFydGljdWxhciBvcmRlci4KKyAgZm9yIGZpbGVzIGluIF9maWxlc190b19wYXJzZToKKyAgICBmb3IgKGJhc2VuYW1lLCBwYXRoLCBwYXJzZXIpIGluIGZpbGVzOgorICAgICAgcHJpbnQgIlBhcnNpbmcgJXMiICUgYmFzZW5hbWUKKyAgICAgIHZhbHVlID0gX2ZpbGVzW2Jhc2VuYW1lXQorICAgICAgaWYgYmFzZW5hbWUgPT0gIk5hbWVzTGlzdC50eHQiOgorICAgICAgICBpbl9maWxlID0gY29kZWNzLm9wZW4ocGF0aCwgInIiLCAiSVNPLTg4NTktMSIpCisgICAgICBlbHNlOgorICAgICAgICBpbl9maWxlID0gb3BlbihwYXRoLCAiciIpCisgICAgICB3aXRoIGluX2ZpbGU6CisgICAgICAgIHBhcnNlcihpbl9maWxlKQorICBfbnVsbF9vcl9kZWZhdWx0cyA9IF9udWxsX3ZhbHVlcy5jb3B5KCkKKyAgX251bGxfb3JfZGVmYXVsdHMudXBkYXRlKF9kZWZhdWx0cykKKyAgIyBFdmVyeSBDYXRhbG9nIGFuZCBFbnVtZXJhdGVkIHByb3BlcnR5IG11c3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUsCisgICMgZnJvbSBhIEBtaXNzaW5nIGxpbmUuICJudiIgPSAibnVsbCB2YWx1ZSIuCisgIHBudiA9IFtwbmFtZSBmb3IgKHBuYW1lLCBudikgaW4gX251bGxfb3JfZGVmYXVsdHMuaXRlcml0ZW1zKCkgaWYgbnYgPT0gIj8/Il0KKyAgaWYgcG52OgorICAgIHJhaXNlIEV4Y2VwdGlvbigibm8gZGVmYXVsdCB2YWx1ZXMgKEBtaXNzaW5nIGxpbmVzKSBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICJzb21lIENhdGFsb2cgb3IgRW51bWVyYXRlZCBwcm9wZXJ0aWVzOiAlcyAiICUgcG52KQorICAjIFdyaXRlIE5vcm1hbGl6ZXIyIGlucHV0IHRleHQgZmlsZXMuCisgICMgRG8gdGhpcyBiZWZvcmUgY29tcGFjdGluZyB0aGUgZGF0YSBzbyB0aGF0IHdlIG5lZWQgbm90IGhhbmRsZSBmYWxsYmFja3MuCisgIHVuaWRhdGFfcGF0aCA9IG9zLnBhdGguam9pbihpY3Vfc3JjX3Jvb3QsICJzb3VyY2UiLCAiZGF0YSIsICJ1bmlkYXRhIikKKyAgbm9ybTJfcGF0aCA9IG9zLnBhdGguam9pbih1bmlkYXRhX3BhdGgsICJub3JtMiIpCisgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhub3JtMl9wYXRoKTogb3MubWFrZWRpcnMobm9ybTJfcGF0aCkKKyAgV3JpdGVOb3JtMihub3JtMl9wYXRoKQorICAjIE9wdGltaXplIGJsb2NrIHZzLiBjcCBwcm9wZXJ0aWVzLgorICBDb21wYWN0QmxvY2tzKCkKKyAgIyBXcml0ZSB0aGUgcHB1Y2QudHh0IG91dHB1dCBmaWxlLgorICBvdXRfcGF0aCA9IG9zLnBhdGguam9pbih1bmlkYXRhX3BhdGgsICJwcHVjZC50eHQiKQorICB3aXRoIG9wZW4ob3V0X3BhdGgsICJ3IikgYXMgb3V0X2ZpbGU6CisgICAgV3JpdGVQcmVwYXJzZWRVQ0Qob3V0X2ZpbGUpCisgICAgb3V0X2ZpbGUuZmx1c2goKQorCisgICMgVE9ETzogUHJpbnROYW1lU3RhdHMoKQorCisgICMgSUNVIGRhdGEgZm9yIHByb3BlcnR5ICYgdmFsdWUgbmFtZXMgQVBJCisgIFBhcnNlVUNoYXJIZWFkZXIoaWN1X3NyY19yb290KQorICBQYXJzZVVTY3JpcHRIZWFkZXIoaWN1X3NyY19yb290KQorICBDaGVja1BOYW1lc0RhdGEoKQorICBnZW5wcm9wc19wYXRoID0gb3MucGF0aC5qb2luKGljdV90b29sc19yb290LCAidW5pY29kZSIsICJjIiwgImdlbnByb3BzIikKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGdlbnByb3BzX3BhdGgpOiBvcy5tYWtlZGlycyhnZW5wcm9wc19wYXRoKQorICBvdXRfcGF0aCA9IG9zLnBhdGguam9pbihnZW5wcm9wc19wYXRoLCAicG5hbWVzX2RhdGEuaCIpCisgIFdyaXRlUE5hbWVzRGF0YUhlYWRlcihvdXRfcGF0aCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9CdW5kbGUuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9CdW5kbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTFlZWNkCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL0J1bmRsZS5qYXZhCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLmd1aS5SQk1hbmFnZXJHVUk7CisKKy8qKgorICogQSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGVudGlyZSBCdW5kbGUgb2YgUmVzb3VyY2VzIGZvciBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UsIGNvdW50cnksIHZhcmlhbnQuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIEJ1bmRsZSB7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyBwdWJsaWMgY2xhc3MgdmFyaWFibGVzIHJlZmxlY3QgdGhlIHZhcmlvdXMgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBhcworICAgICAqIG1ldGEtZGF0YSBpbiBhIHJlc291cmNlIGJ1bmRsZSBmb3JtYXR0ZWQgYnkgUkJNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIC8qKgorICAgICAqIFRoZSBlbmNvZGluZyBvZiB0aGUgYnVuZGxlIChlLmcuICdlbicsICdlbl9VUycsICdkZScsIGV0Yy4pCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGluZzsKKyAgICAvKioKKyAgICAgKiBBIGRlc2NyaXB0b3Igb2YgdGhlIGxhbmd1YWdlIGluIHRoZSBlbmNvZGluZyAoZS5nLiBFbmdsaXNoLCBHZXJtYW4sIGV0Yy4pCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBsYW5ndWFnZTsKKyAgICAvKioKKyAgICAgKiBBIGRlc2NyaXB0b3Igb2YgdGhlIGNvdW50cnkgaW4gdGhlIGVuY29kaW5nIChlLmcuIFVTLCBDYW5hZGEsIEdyZWF0IEJyaXRhaW4pCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb3VudHJ5OworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSB2YXJpYW50IGluIHRoZSBlbmNvZGluZyAoZS5nLiBFdXJvLCBJcmlzaCwgZXRjLikKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHZhcmlhbnQ7CisgICAgLyoqCisgICAgICogQSBjb21tZW50IGNvbmNlcm5pbmcgdGhlIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY29tbWVudDsKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIHJlc3BvbnNpYmxlIGZvciB0aGUgbWFuYWdlcm1lbnQgb2YgdGhpcyBidW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG1hbmFnZXI7CisgICAgCisgICAgcHJpdmF0ZSBUcmVlU2V0IGdyb3VwczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHZlY3RvciBvZiBncm91cHMgb2YgTkxTIGl0ZW1zLCB0aGUga2V5IGlzIHRoZSBncm91cCBuYW1lCisgICAgCisgICAgLyoqCisgICAgICogQSBoYXNodGFibGUgb2YgYWxsIG9mIHRoZSBpdGVtcyBpbiB0aGUgYnVuZGxlLCBoYXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyCisgICAgICogTkxTIGtleS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgSGFzaHRhYmxlIGFsbEl0ZW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgaGFzaHRhYmxlIG9mIGFsbCBpdGVtcyBpbiB0aGUgZmlsZSwgdGhlIGtleSBpcyB0aGUgTkxTIGtleQorICAgIAorICAgIHByaXZhdGUgVHJlZVNldCB1bnRyYW5zbGF0ZWRJdGVtczsgICAgICAgICAgICAgICAgICAgICAgLy8gQSB2ZWN0b3Igb2YgYWxsIGl0ZW1zIHdoaWNoIGFyZSB1bnRyYW5zbGF0ZWQKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIHZlY3RvciBjb250YWluaW5nIGFsbCBvZiB0aGUgaXRlbXMgd2hpY2ggYXJlIGR1cGxpY2F0ZXMgKGJhc2VkIG9uIHRoZSBOTFMga2V5cykKKyAgICAgKiBvZiBpdGVtcyBwcmV2aW91c2x5IGRlY2xhcmVkIGluIHRoZSBidW5kbGUuCisgICAgICovCisgICAgCisgICAgcHVibGljIFZlY3RvciBkdXBsaWNhdGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHZlY3RvciBvZiBpdGVtcyB3aGljaCBhcmUgZHVwbGljYXRlcyAoTkxTIEtleXMpIG9mIHByZXZpb3VzIGl0ZW1zCisJCQorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBhbiBlbXB0eSBidW5kbGUgd2l0aCBhIGdpdmVuIGVuY29kaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEJ1bmRsZShTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICBsYW5ndWFnZSA9IG51bGw7CisgICAgICAgIGNvdW50cnkgID0gbnVsbDsKKyAgICAgICAgdmFyaWFudCAgPSBudWxsOworICAgICAgICBjb21tZW50ICA9IG51bGw7CisgICAgICAgIG1hbmFnZXIgID0gbnVsbDsKKyAgICAgICAgZ3JvdXBzID0gbmV3IFRyZWVTZXQobmV3IENvbXBhcmF0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgICAgICAgIGlmICghKG8xIGluc3RhbmNlb2YgQnVuZGxlR3JvdXApIHx8ICEobzIgaW5zdGFuY2VvZiBCdW5kbGVHcm91cCkpCisgICAgICAgICAgICAgICAgCXJldHVybiAwOworICAgICAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGcxID0gKEJ1bmRsZUdyb3VwKW8xOworICAgICAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGcyID0gKEJ1bmRsZUdyb3VwKW8yOworICAgICAgICAgICAgICAgIHJldHVybiBnMS5nZXROYW1lKCkuY29tcGFyZVRvKGcyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAgICAgCisgICAgICAgIHVudHJhbnNsYXRlZEl0ZW1zID0gbmV3IFRyZWVTZXQobmV3IENvbXBhcmF0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICAgICAgICAgIGlmICghKG8xIGluc3RhbmNlb2YgQnVuZGxlSXRlbSkgfHwgIShvMiBpbnN0YW5jZW9mIEJ1bmRsZUl0ZW0pKSByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGkxID0gKEJ1bmRsZUl0ZW0pbzE7CisgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpMiA9IChCdW5kbGVJdGVtKW8yOworICAgICAgICAgICAgICAgIHJldHVybiBpMS5nZXRLZXkoKS5jb21wYXJlVG8oaTIuZ2V0S2V5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIGR1cGxpY2F0ZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGFsbEl0ZW1zID0gbmV3IEhhc2h0YWJsZSgpOworICAgIH0KKwkJCisgICAgLyoqCisgICAgICogRW5jb2RpbmdzIGFyZSBvZiB0aGUgZm9ybSAtPiBsYW5ndWFnZV9jb3VudHJ5X3ZhcmlhbnQgPC0gKGZvciBleGFtcGxlOiAiZW5fdXNfc291dGhlcm4iKS4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBzdHJpbmcsIG9yIG51bGwgaWYgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAqLworCQkKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlRW5jb2RpbmcoKSB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChlbmNvZGluZy5pbmRleE9mKCJfIikgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGluZy5zdWJzdHJpbmcoMCxlbmNvZGluZy5pbmRleE9mKCJfIikpOworICAgICAgICByZXR1cm4gZW5jb2RpbmcudHJpbSgpOworICAgIH0KKwkJCisgICAgLyoqCisgICAgICogRW5jb2RpbmdzIGFyZSBvZiB0aGUgZm9ybSAtPiBsYW5ndWFnZV9jb3VudHJ5X3ZhcmlhbnQgPC0gKGZvciBleGFtcGxlOiAiZW5fdXNfc291dGhlcm4iKS4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBjb3VudHJ5IGVuY29kaW5nIHN0cmluZywgb3IgbnVsbCBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICovCisJCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q291bnRyeUVuY29kaW5nKCkgeworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCB8fCBlbmNvZGluZy5pbmRleE9mKCJfIikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIC8vIFN0cmlwIG9mZiB0aGUgbGFuZ3VhZ2UKKyAgICAgICAgU3RyaW5nIHdvcmtTdHIgPSBlbmNvZGluZy5zdWJzdHJpbmcoZW5jb2RpbmcuaW5kZXhPZigiXyIpKzEsZW5jb2RpbmcubGVuZ3RoKCkpOworICAgICAgICBpZiAod29ya1N0ci5pbmRleE9mKCJfIikgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiB3b3JrU3RyLnN1YnN0cmluZygwLGVuY29kaW5nLmluZGV4T2YoIl8iKSk7CisgICAgICAgIHJldHVybiB3b3JrU3RyLnRyaW0oKTsKKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIEVuY29kaW5ncyBhcmUgb2YgdGhlIGZvcm0gLT4gbGFuZ3VhZ2VfY291bnRyeV92YXJpYW50IDwtIChmb3IgZXhhbXBsZTogImVuX3VzX3NvdXRoZXJuIikuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdmFyaWFudCBlbmNvZGluZyBzdHJpbmcsIG9yIG51bGwgaWYgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAqLworCQkKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhcmlhbnRFbmNvZGluZygpIHsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwgfHwgZW5jb2RpbmcuaW5kZXhPZigiXyIpIDwgMCkKKyAgICAgICAgCXJldHVybiBudWxsOworICAgICAgICAvLyBTdHJpcCBvZmYgdGhlIGxhbmd1YWdlCisgICAgICAgIFN0cmluZyB3b3JrU3RyID0gZW5jb2Rpbmcuc3Vic3RyaW5nKGVuY29kaW5nLmluZGV4T2YoIl8iKSsxLGVuY29kaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKHdvcmtTdHIgPT0gbnVsbCB8fCB3b3JrU3RyLmxlbmd0aCgpIDwgMSB8fCB3b3JrU3RyLmluZGV4T2YoIl8iKSA8IDApCisgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgLy8gU3RyaXAgb2ZmIHRoZSBjb3VudHJ5CisgICAgICAgIHdvcmtTdHIgPSB3b3JrU3RyLnN1YnN0cmluZyhlbmNvZGluZy5pbmRleE9mKCJfIikrMSwgd29ya1N0ci5sZW5ndGgoKSk7CisgICAgICAgIHJldHVybiB3b3JrU3RyLnRyaW0oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVW50cmFuc2xhdGVkSXRlbXMgYXMgYSB2ZWN0b3IuIEkgc2hvdWxkIGZpbmQgd2hlcmUgdGhpcyBoYXBwZW5zIGFuZCBzdG9wIGl0LgorICAgICAqLworCQkKKyAgICBwdWJsaWMgVmVjdG9yIGdldFVudHJhbnNsYXRlZEl0ZW1zQXNWZWN0b3IoKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB1bnRyYW5zbGF0ZWRJdGVtcy5pdGVyYXRvcigpOworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQorICAgICAgICAJdi5hZGRFbGVtZW50KGl0ZXIubmV4dCgpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCQkKKyAgICAvKioKKyAgICAgKiBDaGVja3MgYWxsIGl0ZW1zIGluIHRoZSB1bnRyYW5zbGF0ZWQgaXRlbXMgc2V0LiBJZiB0aGV5IGJlbG9uZyB0byBhIGdyb3VwIHdob3NlIG5hbWUKKyAgICAgKiBtYXRjaGVzIHRoZSBwYXNzZWQgaW4gbmFtZSwgdGhlbiB0aGV5IGFyZSByZW1vdmVkLgorICAgICAqLworCQkKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVbnRyYW5zbGF0ZWRJdGVtc0J5R3JvdXAoU3RyaW5nIGdyb3VwTmFtZSkgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gdW50cmFuc2xhdGVkSXRlbXMuaXRlcmF0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0TmFtZSgpLmVxdWFscyhncm91cE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVVudHJhbnNsYXRlZEl0ZW0oaXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKwkJCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIHNlZSBpZiBhbiBpdGVtIG9mIHRoZSBnaXZlbiBrZXkgbmFtZSBleGlzdHMgaW4gdGhlIHNldCBvZiB1bnRyYW5zbGF0ZWQgaXRlbXMuIElmCisgICAgICogaXQgZG9lcyBleGlzdCwgdGhlbiBpdCBpcyByZW1vdmVkLgorICAgICAqLworCQkKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVbnRyYW5zbGF0ZWRJdGVtKFN0cmluZyBuYW1lKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB1bnRyYW5zbGF0ZWRJdGVtcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaXRlbSA9IChCdW5kbGVJdGVtKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0S2V5KCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdW50cmFuc2xhdGVkSXRlbXMucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCQkKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIG9mIHdldGhlciBhIGdyb3VwIG9mIGEgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhlIGJ1bmRsZQorICAgICAqLworCQkKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNHcm91cChTdHJpbmcgZ3JvdXBOYW1lKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBncm91cHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChncm91cC5nZXROYW1lKCkuZXF1YWxzKGdyb3VwTmFtZSkpCisgICAgICAgICAgICAJcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZ3JvdXAgb2YgdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsbHkgYXNzb2NpYXRlcyBhIGNvbW1lbnQgd2l0aAorICAgICAqIHRoYXQgZ3JvdXAuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgYWRkQnVuZGxlR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIGdyb3VwQ29tbWVudCkgeworICAgICAgICBCdW5kbGVHcm91cCBiZyA9IG5ldyBCdW5kbGVHcm91cCh0aGlzLCBncm91cE5hbWUpOworICAgICAgICBiZy5zZXRDb21tZW50KGdyb3VwQ29tbWVudCk7CisgICAgICAgIGFkZEJ1bmRsZUdyb3VwKGJnKTsKKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGdyb3VwIG9mIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgYnVuZGxlCisgICAgICovCisJCQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKFN0cmluZyBncm91cE5hbWUpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGdyb3Vwcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUdyb3VwIHRlbXBHcm91cCA9IChCdW5kbGVHcm91cClpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0ZW1wR3JvdXAuZ2V0TmFtZSgpLmVxdWFscyhncm91cE5hbWUpKSB7CisgICAgICAgICAgICAgICAgZ3JvdXBzLnJlbW92ZSh0ZW1wR3JvdXApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbXMgZnJvbSB0aGUgdW50YW5zbGF0ZWQgaXRlbXMKKyAgICAgICAgcmVtb3ZlVW50cmFuc2xhdGVkSXRlbXNCeUdyb3VwKGdyb3VwTmFtZSk7CisJCQkKKyAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBJdGVtcworICAgICAgICBFbnVtZXJhdGlvbiBlbGVtcyA9IGFsbEl0ZW1zLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlKGVsZW1zLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSllbGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXROYW1lKCkuZXF1YWxzKGdyb3VwTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBhbGxJdGVtcy5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBzaW5nbGUgcmVzb3VyY2UgaXRlbSBmcm9tIHRoZSBidW5kbGUKKyAgICAgKi8KKwkJCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSXRlbShTdHJpbmcga2V5KSB7CisgICAgICAgIE9iamVjdCBvID0gYWxsSXRlbXMuZ2V0KGtleSk7CisgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaXRlbSA9IChCdW5kbGVJdGVtKW87CisgICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBhbGxJdGVtcyBIYXNodGFibGUKKyAgICAgICAgICAgIGFsbEl0ZW1zLnJlbW92ZShrZXkpOworICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gaXRlbSdzIGdyb3VwCisgICAgICAgICAgICBpZiAoaXRlbS5nZXRQYXJlbnRHcm91cCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKTsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVCdW5kbGVJdGVtKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSB1bnRyYW5zbGF0ZWRJdGVtcyBIYXNodGFibGUKKyAgICAgICAgICAgIHJlbW92ZVVudHJhbnNsYXRlZEl0ZW0oa2V5KTsKKyAgICAgICAgfQorICAgIH0KKwkJCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gYWRkIGEgQnVuZGxlSXRlbSB0byB0aGUgdW50cmFuc2xhdGVkSXRlbXMuIFRoZSBhZGRpdGlvbiB3aWxsIGZhaWwgaW4gdHdvIGNhc2VzOiBPbmUsIGlmCisgICAgICogdGhlIGl0ZW0gZG9lcyBub3QgYWxsIHJlYWR5IGJlbG9uZyB0byB0aGlzIEJ1bmRsZSwgYW5kIFR3bywgaWYgdGhlIGl0ZW0gaXMgYWxsIHJlYWR5IGluIHRoZSBzZXQgb2YKKyAgICAgKiB1bnRyYW5zbGF0ZWQgaXRlbXMuCisgICAgICovCisJCQorICAgIHB1YmxpYyB2b2lkIGFkZFVudHJhbnNsYXRlZEl0ZW0oQnVuZGxlSXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0UGFyZW50QnVuZGxlKCkgIT0gdGhpcykKKyAgICAgICAgCXJldHVybjsKKyAgICAgICAgLy8gUmVtb3ZlIGl0IGlmIGl0IGV4aXN0cy4KKyAgICAgICAgaWYgKHVudHJhbnNsYXRlZEl0ZW1zLmNvbnRhaW5zKGl0ZW0pKSB7CisgICAgICAgIAl1bnRyYW5zbGF0ZWRJdGVtcy5yZW1vdmUoaXRlbSk7CisgICAgICAgIH0KKyAgICAJdW50cmFuc2xhdGVkSXRlbXMuYWRkKGl0ZW0pOworICAgIH0KKwkJCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBtYXJrZWQgYXMgdW50cmFuc2xhdGVkCisgICAgICovCisJCQorICAgIHB1YmxpYyBpbnQgZ2V0VW50cmFuc2xhdGVkSXRlbXNTaXplKCkgeworICAgICAgICByZXR1cm4gdW50cmFuc2xhdGVkSXRlbXMuc2l6ZSgpOworICAgIH0KKwkJCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXh0aCB1bnRyYW5zbGF0ZWQgaXRlbQorICAgICAqLworCQkKKyAgICBwdWJsaWMgQnVuZGxlSXRlbSBnZXRVbnRyYW5zbGF0ZWRJdGVtKGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPj0gdW50cmFuc2xhdGVkSXRlbXMuc2l6ZSgpKQorICAgICAgICAJcmV0dXJuIG51bGw7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB1bnRyYW5zbGF0ZWRJdGVtcy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBpbmRleDsgaSsrKQorICAgICAgICAJaXRlci5uZXh0KCk7CisgICAgICAgIHJldHVybiAoQnVuZGxlSXRlbSlpdGVyLm5leHQoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YXJpb3VzIHJlc291cmNlIGJ1bmRsZSBncm91cHMgc3RvcmVkIGluIGEgVmVjdG9yIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgCisgICAgcHVibGljIFZlY3RvciBnZXRHcm91cHNBc1ZlY3RvcigpIHsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBncm91cHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChncm91cCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBncm91cHMgaW4gdGhlIGJ1bmRsZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldEdyb3VwQ291bnQoKSB7CisgICAgICAgIHJldHVybiBncm91cHMuc2l6ZSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgYnVuZGxlIGdyb3VwIGdpdmVuIGEgY2VydGFpbiBpbmRleC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQnVuZGxlR3JvdXAgZ2V0QnVuZGxlR3JvdXAoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA+PSBnZXRHcm91cENvdW50KCkpCisgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGdyb3Vwcy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBpbmRleDsgaSsrKQorICAgICAgICAJaXRlci5uZXh0KCk7CisgICAgICAgIHJldHVybiAoQnVuZGxlR3JvdXApaXRlci5uZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgZm9yIGEgYnVuZGxlIGdyb3VwIG9mIGEgZ2l2ZW4gbmFtZSB3aXRoaW4gYSBidW5kbGUgYW5kCisgICAgICogcmV0dXJucyBpdCBpZiBmb3VuZC4KKyAgICAgKi8KKwkJCisgICAgcHVibGljIEJ1bmRsZUdyb3VwIGdldEJ1bmRsZUdyb3VwKFN0cmluZyBncm91cE5hbWUpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGdyb3Vwcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0TmFtZSgpLmVxdWFscyhncm91cE5hbWUpKQorICAgICAgICAgICAgCXJldHVybiBncm91cDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTG9va3MgdXAgYW5kIHJldHVybnMgYSBidW5kbGUgaXRlbSBzdG9yZWQgaW4gdGhlIGJ1bmRsZSBiYXNlZCBvbiBpdHMKKyAgICAgKiBOTFMgbG9va3VwIGtleS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQnVuZGxlSXRlbSBnZXRCdW5kbGVJdGVtKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIChCdW5kbGVJdGVtKWFsbEl0ZW1zLmdldChrZXkpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgLyoqCisgICAgICogT25lIGdyb3VwIGlzIGNyZWF0ZWQgZm9yIGFsbCBidW5kbGVzIGNhbGxlZCAnVW5ncm91cGVkIEl0ZW1zJy4gVGhpcyBpcyB0aGUgYnVuZGxlCisgICAgICogZ3JvdXAgaW4gd2hpY2ggYnVuZGxlIGl0ZW1zIGFyZSBwbGFjZWQgdGhhdCBhcmUgbm90IHNwZWNpZmljYWxseSBncm91cGVkIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmaWxlLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoYXQgYnVuZGxlIGdyb3VwLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBCdW5kbGVHcm91cCBnZXRVbmdyb3VwZWRHcm91cCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJ1bmRsZUdyb3VwKCJVbmdyb3VwZWQgSXRlbXMiKTsKKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIEFkZCBhIGJ1bmRsZSBncm91cCB0byB0aGUgYnVuZGxlCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEJ1bmRsZUdyb3VwKEJ1bmRsZUdyb3VwIGJnKSB7CisgICAgICAgIGdyb3Vwcy5hZGQoYmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGJ1bmRsZSBpdGVtIHRvIHRoZSBidW5kbGUuIFRoaXMgYnVuZGxlIGl0ZW0gc2hvdWxkIGFsbCByZWFkeSBoYXZlIGl0cworICAgICAqIGJ1bmRsZSBncm91cCBhc3NpZ25lZC4KKyAgICAgKi8KKwkJCisgICAgcHVibGljIHZvaWQgYWRkQnVuZGxlSXRlbShCdW5kbGVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGFsbEl0ZW1zLmNvbnRhaW5zS2V5KGl0ZW0uZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICBkdXBsaWNhdGVzLmFkZEVsZW1lbnQoaXRlbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShncm91cHMuY29udGFpbnMoaXRlbS5nZXRQYXJlbnRHcm91cCgpKSkpCisgICAgICAgICAgICAJYWRkQnVuZGxlR3JvdXAoaXRlbS5nZXRQYXJlbnRHcm91cCgpKTsKKyAgICAgICAgICAgIGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5hZGRCdW5kbGVJdGVtKGl0ZW0pOworICAgICAgICAgICAgYWxsSXRlbXMucHV0KGl0ZW0uZ2V0S2V5KCksIGl0ZW0pOworICAgICAgICAgICAgcmVtb3ZlVW50cmFuc2xhdGVkSXRlbShpdGVtLmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmICghaXRlbS5pc1RyYW5zbGF0ZWQoKSkKKyAgICAgICAgICAgIAlhZGRVbnRyYW5zbGF0ZWRJdGVtKGl0ZW0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEEgbWV0aG9kIHVzZWZ1bCBpbiBkZWJ1Z2dpbmcuIFRoZSBzdHJpbmcgcmV0dXJuZWQgZGlzcGxheXMgdGhlIGVuY29kaW5nCisgICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJ1bmRsZSBhbmQgd2V0aGVyIG9yIG5vdCBpdCBpcyB0aGUgYmFzZSBjbGFzcyBvZgorICAgICAqIGEgcmVzb3VyY2UgYnVuZGxlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyByZXRTdHIgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsICYmICFsYW5ndWFnZS5lcXVhbHMoIiIpKSByZXRTdHIgPSBsYW5ndWFnZTsKKyAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCAmJiAhY291bnRyeS5lcXVhbHMoIiIpKSByZXRTdHIgKz0gIiwgIiArIGNvdW50cnk7CisgICAgICAgIGlmICh2YXJpYW50ICE9IG51bGwgJiYgIXZhcmlhbnQuZXF1YWxzKCIiKSkgcmV0U3RyICs9ICIsICIgKyB2YXJpYW50OworCQkJCisgICAgICAgIHJldFN0ciArPSAiICgiICsgKGVuY29kaW5nID09IG51bGwgfHwgZW5jb2RpbmcuZXF1YWxzKCIiKSA/ICJCYXNlIENsYXNzIiA6IGVuY29kaW5nKSArICIpIjsKKyAgICAgICAgcmV0dXJuIHJldFN0cjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBTdHJpbmcgd2hpY2ggaXMgc3VpdGFibGUgZm9yIGluY2x1c2lvbiBpbiBhIC5wcm9wZXJ0aWVzCisgICAgICogc3R5bGUgcmVzb3VyY2UgYnVuZGxlLiBJdCBhdHRhY2hlcyAoaW4gY29tbWVudHMpIHRoZSBtZXRhIGRhdGEgdGhhdCBSQk1hbmFnZXIKKyAgICAgKiByZWFkcyB0byBtYW5hZ2UgdGhlIHJlc291cmNlIGJ1bmRsZSBmaWxlLiBUaGlzIHBvcnRpb24gb2YgdGhlIG91dHB1dCBzaG91bGQKKyAgICAgKiBiZSBpbmNsdWRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgZmlsZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHRvT3V0cHV0U3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgICAgICAgICAgICAgICAgcmV0U3RyICA9ICIjIEBmaWxlICAgICAgICAgICIgKyBuYW1lICAgICArICJcbiI7CisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSByZXRTdHIgKz0gIiMgQGZpbGVFbmNvZGluZyAgIiArIGVuY29kaW5nICsgIlxuIjsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHJldFN0ciArPSAiIyBAZmlsZUxhbmd1YWdlICAiICsgbGFuZ3VhZ2UgKyAiXG4iOworICAgICAgICBpZiAoY291bnRyeSAgIT0gbnVsbCkgcmV0U3RyICs9ICIjIEBmaWxlQ291bnRyeSAgICIgKyBjb3VudHJ5ICArICJcbiI7CisgICAgICAgIGlmICh2YXJpYW50ICAhPSBudWxsKSByZXRTdHIgKz0gIiMgQGZpbGVWYXJpYW50ICAgIiArIHZhcmlhbnQgICsgIlxuIjsKKyAgICAgICAgaWYgKG1hbmFnZXIgICE9IG51bGwpIHJldFN0ciArPSAiIyBAZmlsZU1hbmFnZXIgICAiICsgbWFuYWdlciAgKyAiXG4iOworICAgICAgICBpZiAoY29tbWVudCAgIT0gbnVsbCkgcmV0U3RyICs9ICIjIEBmaWxlQ29tbWVudCAgICIgKyBjb21tZW50ICArICJcbiI7CisgICAgICAgIHJldHVybiByZXRTdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwaW5nIG1ldGhvZCBmb3Igb3V0cHV0dGluZyB0aGUgZm9ybWF0dGVkIGNvbnRlbnRzIG9mIHRoZSBidW5kbGUgdG8gYQorICAgICAqIHByaW50IHN0cmVhbS4gVGhlIG1ldGhvZCBmaXJzdCBvdXRwdXRzIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gYW5kIHRoZW4gb3V0cHV0cworICAgICAqIGVhY2ggYnVuZGxlIGdyb3VwJ3MgZm9ybWF0dGVkIGRhdGEgd2hpY2ggaW5jbHVkZXMgZWFjaCBidW5kbGUgaXRlbS4KKyAgICAgKi8KKwkJCisgICAgcHVibGljIHZvaWQgd3JpdGVDb250ZW50cyhQcmludFN0cmVhbSBwcykgeworICAgICAgICBwcy5wcmludGxuKHRoaXMudG9PdXRwdXRTdHJpbmcoKSk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBncm91cHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAoKEJ1bmRsZUdyb3VwKWl0ZXIubmV4dCgpKS53cml0ZUNvbnRlbnRzKHBzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGluZyBtZXRob2QgZm9yIG91dHB1dHRpbmcgdGhlIGZvcm1hdHRlZCBjb250ZW50cyBvZiB0aGUgYnVuZGxlIHRvIGEKKyAgICAgKiBvdXB1dCBXcml0ZXIgKHN1Y2ggYXMgYSBGaWxlV3JpdGVyKS4gVGhlIG1ldGhvZCBmaXJzdCBvdXRwdXRzIHRoZSBoZWFkZXIKKyAgICAgKiBpbmZvcm1hdGlvbiBhbmQgdGhlbiBvdXRwdXRzIGVhY2ggYnVuZGxlIGdyb3VwJ3MgZm9ybWF0dGVkIGRhdGEgd2hpY2ggaW5jbHVkZXMKKyAgICAgKiBlYWNoIGJ1bmRsZSBpdGVtLgorICAgICAqLworCQkKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbnRlbnRzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3LndyaXRlKHRoaXMudG9PdXRwdXRTdHJpbmcoKSArICJcbiIpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gZ3JvdXBzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgKChCdW5kbGVHcm91cClpdGVyLm5leHQoKSkud3JpdGVDb250ZW50cyh3KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlR3JvdXAuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9CdW5kbGVHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2NlZGIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlR3JvdXAuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgZ3JvdXAgb2YgQnVuZGxlSXRlbXMgYW5kIHRoZSBtZXRhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZ3JvdXAKKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgQnVuZGxlR3JvdXAgeworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIGdyb3VwCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudDsgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbW1lbnQgZGVzY3JpYmluZyB0aGlzIGdyb3VwCisgICAgcHJpdmF0ZSBUcmVlU2V0IGl0ZW1zOyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgTkxTIGl0ZW1zIGNvbnRhaW5lZCBpbiB0aGlzIGdyb3VwCisgICAgcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IEJ1bmRsZSBvYmplY3Qgb2YgdGhpcyBncm91cAorCQkKKyAgICAvKioKKyAgICAgKiBCYXNpYyBkYXRhIGNvbnN0cnVjdG9yLgorICAgICAqIENyZWF0ZXMgYSBCdW5kbGVHcm91cCB3aXRoIGEgcGFyZW50IGJ1bmRsZSBhbmQgYSBnaXZlbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGVHcm91cChCdW5kbGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworICAgICAgICBidW5kbGUgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIGNvbW1lbnQgPSBudWxsOworICAgICAgICBpdGVtcyA9IG5ldyBUcmVlU2V0KG5ldyBDb21wYXJhdG9yKCl7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShvMSBpbnN0YW5jZW9mIEJ1bmRsZUl0ZW0pIHx8ICEobzIgaW5zdGFuY2VvZiBCdW5kbGVJdGVtKSkKKyAgICAgICAgICAgICAgICAJcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpMSA9IChCdW5kbGVJdGVtKW8xOworICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaTIgPSAoQnVuZGxlSXRlbSlvMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTEuZ2V0S2V5KCkuY29tcGFyZVRvKGkyLmdldEtleSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHdvIGJ1bmRsZSBncm91cHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWZmIHRoZWlyIG5hbWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIChvIGluc3RhbmNlb2YgQnVuZGxlR3JvdXAgJiYgKChCdW5kbGVHcm91cClvKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKTsKKyAgICB9CisJCisgICAgLy8gVGhpcyBzaG91bGQgYmUgY2hhbmdlZCBhbnl3aGVyZSBpdCBpcyB1c2VkCisJCisgICAgcHVibGljIFZlY3RvciBnZXRJdGVtc0FzVmVjdG9yKCkgeworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgdi5hZGRFbGVtZW50KGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogQWRkcyBhIEJ1bmRsZUl0ZW0gdG8gdGhlIGdyb3VwIGFzIGxvbmcgYXMgdGhhdCBpdGVtIGlzIG5vdCBjdXJyZW50bHkgaW4gdGhlIGdyb3VwLgorICAgICAqIElmIHRoZSBpdGVtLmdyb3VwIGlzIG5vdCBlcXVhbCB0byB0aGlzIGdyb3VwLCB0aGVuIGl0IGlzIGNoYW5nZWQgdG8gYmUgdGhpcyBncm91cC4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQsIGluIG1vc3QgY2FzZXMsIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIEJ1bmRsZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRCdW5kbGVJdGVtKEJ1bmRsZUl0ZW0gaXRlbSkgeworICAgIAlpZiAoaXRlbXMuY29udGFpbnMoaXRlbSkpIHsKKyAgICAJCWl0ZW1zLnJlbW92ZShpdGVtKTsKKyAgICAJfQorICAgICAgICBpdGVtLnNldFBhcmVudEdyb3VwKHRoaXMpOworICAgICAgICBpdGVtcy5hZGQoaXRlbSk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBpdGVtIG9mIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhlIGdyb3VwCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQnVuZGxlSXRlbShTdHJpbmcgaXRlbU5hbWUpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEtleSgpLmVxdWFscyhpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHN0b3JlZCBpbiB0aGUgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zLnNpemUoKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIEJ1bmRsZUl0ZW0gZnJvbSB0aGUgc2V0IG9mIGl0ZW1zIGF0IGEgcGFydGljdWxhciBpbmRleCBwb2ludC4KKyAgICAgKiBJZiB0aGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHNldCwKKyAgICAgKiBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGVJdGVtIGdldEJ1bmRsZUl0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA+PSBpdGVtcy5zaXplKCkpCisgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGluZGV4OyBpKyspCisgICAgICAgIAlpdGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIChCdW5kbGVJdGVtKWl0ZXIubmV4dCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBidW5kbGUgdG8gd2hpY2ggdGhpcyBncm91cCBiZWxvbmdzCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRQYXJlbnRCdW5kbGUoKSB7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gY29tbWVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50QnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgdGhpcy5idW5kbGUgPSBidW5kbGU7CisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKyAgICB9CisJCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNsYXRpb24gdG8gYSBzdHJpbmcgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3V0cHV0IGZvciBhIGdyb3VwIGhlYWRpbmcuCisgICAgICogVGhpcyB3aWxsIGJlIGZvdW5kIGluIGNvbW1lbnQgbGluZXMgYWJvdmUgdGhlIGdyb3VwIGl0ZW1zCisgICAgICovCisJcHVibGljIFN0cmluZyB0b091dHB1dFN0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHJldFN0ciA9ICJcbiNcbiMgQGdyb3VwICIgKyBuYW1lICsgIlxuI1xuIjsKKyAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCkKKyAgICAgICAgCXJldFN0ciArPSAiIyBAZ3JvdXBDb21tZW50ICIgKyBjb21tZW50ICsgIlxuIjsKKyAgICAgICAgcmV0dXJuIHJldFN0cjsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvdXRwdXQgY29udGVudHMgdG8gYSBwYXJ0aWN1bGFyIFByaW50U3RyZWFtLgorICAgICAqIFRoZSBvdXRwdXQgd2lsbCBiZSBzdWl0YWJsZSBmb3IgYSBwcm9wZXJseSBmb3JtYXR0ZWQgLnByb3BlcnRpZXMgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbnRlbnRzKFByaW50U3RyZWFtIHBzKSB7CisgICAgICAgIGlmICghbmFtZS5lcXVhbHMoIlVuZ3JvdXBlZCBJdGVtcyIpKQorICAgICAgICAJcHMucHJpbnRsbih0aGlzLnRvT3V0cHV0U3RyaW5nKCkpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAoKEJ1bmRsZUl0ZW0pIGl0ZXIubmV4dCgpKS53cml0ZUNvbnRlbnRzKHBzKTsJCisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvdXRwdXQgY29udGVudHMgdG8gYSBwYXJ0aWN1bGFyIFdyaXRlci4KKyAgICAgKiBUaGUgb3V0cHV0IHdpbGwgYmUgc3VpdGFibGUgZm9yIGEgcHJvcGVybHkgZm9ybWF0dGVkIC5wcm9wZXJ0aWVzIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVDb250ZW50cyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFuYW1lLmVxdWFscygiVW5ncm91cGVkIEl0ZW1zIikpCisgICAgICAgIAl3LndyaXRlKHRoaXMudG9PdXRwdXRTdHJpbmcoKSArICJcbiIpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAoKEJ1bmRsZUl0ZW0pIGl0ZXIubmV4dCgpKS53cml0ZUNvbnRlbnRzKHcpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9CdW5kbGVJdGVtLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDAzNjAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlSXRlbS5qYXZhCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogQSBjbGFzcyByZXByZXNlbnRpbmcgYSBzaW5nbGUgdHJhbnNsYXRpb24gaXRlbSBhbmQgYWxsIG9mIHRoZSBtZXRhLWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgdHJhbnNsYXRpb24KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uIC0gRW1haWw6IDxhIGhyZWY9Im1haWx0bzpqamFyZWRAYWxtYWRlbi5pYm0uY29tIj5qamFyZWRAYWxtYWRlbi5pYm0uY29tPC9hPgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIEJ1bmRsZUl0ZW0geworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgTkxTIGl0ZW0ga2V5CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0cmFuc2xhdGlvbiBvZiB0aGUga2V5IGl0ZW0KKyAgICBwcml2YXRlIFN0cmluZyBjb21tZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb21tZW50IGFib3V0IHRoaXMgaXRlbQorICAgIHByaXZhdGUgYm9vbGVhbiB0cmFuc2xhdGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXMgdGhpcyBpdGVtIGJlZW4gdHJhbnNsYXRlZD8KKyAgICBwcml2YXRlIERhdGUgY3JlYXRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRhdGUgb2YgY3JlYXRpb24gb2YgdGhlIGl0ZW0KKyAgICBwcml2YXRlIERhdGUgbW9kaWZpZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGl0ZW0KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiB3aG8gY3JlYXRlZCB0aGUgaXRlbQorICAgIHByaXZhdGUgU3RyaW5nIG1vZGlmaWVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBpdGVtCisgICAgcHJpdmF0ZSBIYXNodGFibGUgbG9va3VwczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgaGFzdGFibGUgb2YgbG9va3VwcyBmb3IgdGhlIGl0ZW0gKGkuZS4gKHsjfSwgTWVhbmluZykgcGFpcnMpCisgICAgcHJpdmF0ZSBCdW5kbGVHcm91cCBncm91cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJlbnQgZ3JvdXAgb2YgdGhlIGl0ZW0KKwkJCisgICAgLyoqCisgICAgICogQmFzaWMgZGF0YSBjb25zdHJ1Y3RvciBmb3IgYSByZXNvdXJjZSBidW5kbGUgaXRlbS4KKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBCdW5kbGVHcm91cCB0byB3aGljaCB0aGUgaXRlbSBiZWxvbmdzLiBUaGlzIGdyb3VwIHdpbGwgaGF2ZSBpdHMgb3duIEJ1bmRsZSBwYXJlbnQuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIE5MUyBsb29rdXAga2V5IGNvbW1vbiBhY3Jvc3MgYWxsIGJ1bmRsZSBmaWxlcyBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB0cmFuc2xhdGVkIHZhbHVlIG9mIHRoZSBpdGVtIGFwcHJvcHJpYXRlIGZvciB0aGUgZW5jb2Rpbmcgb2YgdGhlIGJ1bmRsZSBmaWxlIHRvIHdoaWNoIHRoZSBpdGVtIGJlbG9uZ3MKKyAgICAgKi8KKyAgICAgCisgICAgcHVibGljIEJ1bmRsZUl0ZW0oQnVuZGxlR3JvdXAgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgdGhpcy5ncm91cCA9IHBhcmVudDsKKyAgICAgICAgY29tbWVudCA9IG51bGw7CisgICAgICAgIHRyYW5zbGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgY3JlYXRlZCA9IG5ldyBEYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBjdXJyZW50IGRhdGUKKyAgICAgICAgbW9kaWZpZWQgPSBuZXcgRGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBjdXJyZW50IGRhdGUKKyAgICAgICAgY3JlYXRvciA9IG51bGw7CisgICAgICAgIG1vZGlmaWVyID0gbnVsbDsKKyAgICAgICAgbG9va3VwcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBCdW5kbGVHcm91cCB0byB3aGljaCB0aGlzIGl0ZW0gYmVsb25ncworICAgICAqLworCQorICAgIHB1YmxpYyBCdW5kbGVHcm91cCBnZXRQYXJlbnRHcm91cCgpIHsKKyAgICAgICAgcmV0dXJuIGdyb3VwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRhdGUgdGhpcyBpdGVtIHdhcyBsYXN0IG1vZGlmaWVkLgorICAgICAqLworCQorICAgIHB1YmxpYyBEYXRlIGdldE1vZGlmaWVkRGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIHRoZSBpdGVtIHdhcyBmaXJzdCBjcmVhdGVkLgorICAgICAqLworCQorICAgIHB1YmxpYyBEYXRlIGdldENyZWF0ZWREYXRlKCkgeworICAgICAgICByZXR1cm4gY3JlYXRlZDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9naW4gbmFtZSBvZiB0aGUgdXNlciB0aGF0IGNyZWF0ZWQgdGhlIGl0ZW0uCisgICAgICovCisJCisgICAgcHVibGljIFN0cmluZyBnZXRDcmVhdG9yKCkgeworICAgICAgICByZXR1cm4gY3JlYXRvcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9naW4gbmFtZSBvZiB0aGUgdXNlciB0aGF0IGxhc3QgbW9kaWZpZWQgdGhlIGl0ZW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRNb2RpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBOTFMgbG9va3VwIGtleSBmb3IgdGhlIGl0ZW0uCisgICAgICovCisJCisgICAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHZhbHVlIGZvciB0aGUgaXRlbS4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRyYW5zbGF0aW9uKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBIYXMgdGhlIGl0ZW0geWV0IGJlZW4gdHJhbnNsYXRlZCwgb3Igd2FzIGl0IG1lcmVseSBkZXJpdmVkIGZyb20gYSBwcmV2aW91cworICAgICAqIGJ1bmRsZSBmaWxlPworICAgICAqLworCQorICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNsYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoYXNodGFibGUgb2YgdGhlIHZhcmlvdXMgbG9va3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW0uIExvb2t1cHMgYXJlCisgICAgICogY29udGV4dCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gc3RvcmVkIHdpdGhpbiB0aGUgcmVzb3VyY2UgaXRlbSBhbmQgaGF2ZSB0aGVpciBvd24KKyAgICAgKiBtZXRhLWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZW1zZWx2ZXMuCisgICAgICovCisJCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRMb29rdXBzKCkgeworICAgICAgICByZXR1cm4gbG9va3VwczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0cmFuc2xhdGVkIHZhbHVlIG9mIHRoZSBpdGVtLiBBIHRydWUgbWFyayBpbmRpY2F0ZXMgdGhhdCB0aGUgaXRlbSBoYXMKKyAgICAgKiBiZWVuIGV4YW1pbmVkIG9yIG1vZGlmaWVkIGFuZCBpcyByZWFkeSBmb3IgdXNlIGluIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgYnkgdGhlCisgICAgICogcGFyZW50IEJ1bmRsZS4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdGVkKGJvb2xlYW4gaXNUcmFuc2xhdGVkKSB7CisgICAgICAgIGlmICh0cmFuc2xhdGVkID09IGlzVHJhbnNsYXRlZCkgcmV0dXJuOworICAgICAgICB0cmFuc2xhdGVkID0gaXNUcmFuc2xhdGVkOworICAgICAgICBpZiAodGhpcy5nZXRQYXJlbnRHcm91cCgpICE9IG51bGwgJiYgdGhpcy5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSB0aGlzLmdldFBhcmVudEdyb3VwKCkuZ2V0UGFyZW50QnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoaXNUcmFuc2xhdGVkKSBidW5kbGUucmVtb3ZlVW50cmFuc2xhdGVkSXRlbSh0aGlzLm5hbWUpOworICAgICAgICAgICAgZWxzZSBidW5kbGUuYWRkVW50cmFuc2xhdGVkSXRlbSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGl0ZW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGhhc2h0YWJsZSBvZiBsb29rdXBzLCBhc3NvY2lhdGVzIHRob3NlIGxvb2t1cHMgd2l0aCB0aGlzIGl0ZW0uCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgc2V0TG9va3VwcyhIYXNodGFibGUgbG9va3VwcykgeworICAgICAgICB0aGlzLmxvb2t1cHMgPSBsb29rdXBzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBOTFMga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGl0ZW0uIEJlIGNhcmVmdWwgdXNpbmcgdGhpcyBtZXRob2QsIGFzCisgICAgICogaXQgZG9lcyBub3QgY2hhbmdlIHRoZSBsb29rdXAgdmFsdWUgb2YgYW55IG90aGVyIGl0ZW1zIGluIHRoZSByZXNvdXJjZSBidW5kbGUuCisgICAgICogVGhpcyBtdXN0IGJlIGRvbmUgYXQgYSBoaWdoZXIgbGV2ZWwuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXlOYW1lKSB7CisgICAgICAgIG5hbWUgPSBrZXlOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBvZiB0aGUgaXRlbS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdGlvbihTdHJpbmcgdHJhbnNsYXRpb25WYWx1ZSkgeworICAgICAgICB2YWx1ZSA9IHRyYW5zbGF0aW9uVmFsdWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhcmVudCBCdW5kbGVHcm91cCBvZiB0aGUgaXRlbS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRHcm91cChCdW5kbGVHcm91cCBncm91cCkgeworICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFzc29jaWF0ZXMgYSBsb2dpbiBuYW1lIG9mIHRoZSBjcmVhdG9yIG9mIHRoZSBpdGVtIHdpdGggdGhlIGl0ZW0uCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgc2V0Q3JlYXRvcihTdHJpbmcgbmFtZSkgeworICAgICAgICBjcmVhdG9yID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIGEgbG9naW4gbmFtZSBvZiB0aGUgbGFzdCBtb2RpZmllciBvZiB0aGUgaXRlbSB3aXRoIHRoZSBpdGVtLgorICAgICAqLworCQorICAgIHB1YmxpYyB2b2lkIHNldE1vZGlmaWVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG1vZGlmaWVyID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjcmVhdGVkIGRhdGUgb2YgdGhlIGl0ZW0gZ2l2ZW4gYSBkYXRlIGZvcm1hdHRlZCBzdHJpbmcuCisgICAgICogVGhlIGZvcm1hdCBjYW4gYmUgZWl0aGVyICdZWVlZLU1NLUREJyAoZS5nLiAyMDAwMi0wMi0wNSkgb3IKKyAgICAgKiB0aGUgZm9ybWF0IGNhbiBiZSAnWVlZTU1ERFRISE1NU1NaJyAoZS5nLiAyMDAyMDIwNVQxMDMwMDBaKQorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZWREYXRlKFN0cmluZyBkYXRlU3RyKSB7CisgICAgICAgIGlmIChkYXRlU3RyICE9IG51bGwpIGNyZWF0ZWQgPSBwYXJzZURhdGVGcm9tU3RyaW5nKGRhdGVTdHIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjcmVhdGVkIGRhdGUgb2YgdGhlIGl0ZW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q3JlYXRlZERhdGUoRGF0ZSBkYXRlKSB7CisgICAgICAgIGNyZWF0ZWQgPSBkYXRlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsYXN0IG1vZGlmaWZjYXRpb24gZGF0ZSBvZiB0aGUgaXRlbSBnaXZlbiBhIGRhdGUgZm9ybWF0dGVkIHN0cmluZy4KKyAgICAgKiBUaGUgZm9ybWF0IGNhbiBiZSBlaXRoZXIgJ1lZWVktTU0tREQnIChlLmcuIDIwMDItMDItMDUpIG9yCisgICAgICogdGhlIGZvcm1hdCBjYW4gYmUgJ1lZWU1NRERUSEhNTVNTWicgKGUuZy4gMjAwMjAyMDVUMTAzMDAwWikKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllZERhdGUoU3RyaW5nIGRhdGVTdHIpIHsKKyAgICAgICAgaWYgKGRhdGVTdHIgIT0gbnVsbCkKKyAgICAgICAgCW1vZGlmaWVkID0gcGFyc2VEYXRlRnJvbVN0cmluZyhkYXRlU3RyKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgaXRlbS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllZERhdGUoRGF0ZSBkYXRlKSB7CisgICAgICAgIG1vZGlmaWVkID0gZGF0ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2ltcGx5IHJldHVybnMgdGhlIGxvb2t1cCBuYW1lIG9mIHRoZSBpdGVtLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgb3V0cHV0IG9mIHRoaXMgYnVuZGxlIGl0ZW0gYXMgaXQgd291bGQgYmUgaW5jbHVkZWQgaW4gYSAucHJvcGVydGllcworICAgICAqIGZvcm1hdHRlZCByZXNvdXJjZSBidW5kbGUgZmlsZS4gVGhpcyBmb3JtYXQgYWxzbyBjb250YWlucyB0aGUgbWV0YS1kYXRhIHVzZWQgYnkgUkJNYW5hZ2VyIGluCisgICAgICogdGhlIGZvcm0gb2YgcGFyc2VhYmxlIGNvbW1lbnRzLgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyB0b091dHB1dFN0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHJldFN0ciA9ICh0cmFuc2xhdGVkID8gIiMgQHRyYW5zbGF0ZWQgdHJ1ZSIgOiAiIyBAdHJhbnNsYXRlZCBmYWxzZSIpOworICAgICAgICBpZiAoY3JlYXRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjcmVhdGVkQ2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICBjcmVhdGVkQ2FsLnNldFRpbWUoY3JlYXRlZCk7CisgICAgICAgICAgICBpbnQgeWVhciA9IGNyZWF0ZWRDYWwuZ2V0KENhbGVuZGFyLllFQVIpOworICAgICAgICAgICAgaW50IG1vbnRoID0gY3JlYXRlZENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKzE7CisgICAgICAgICAgICBpbnQgZGF5ID0gY3JlYXRlZENhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKKyAgICAgICAgICAgIHJldFN0ciArPSAiIEBjcmVhdGVkICIgKyBTdHJpbmcudmFsdWVPZih5ZWFyKSArICItIgorICAgICAgICAgICAgICAgICsgKG1vbnRoID4gOSA/IFN0cmluZy52YWx1ZU9mKG1vbnRoKSA6ICIwIiArIFN0cmluZy52YWx1ZU9mKG1vbnRoKSkgKyAiLSIKKyAgICAgICAgICAgICAgICArIChkYXkgPiA5ID8gU3RyaW5nLnZhbHVlT2YoZGF5KSA6ICIwIiArIFN0cmluZy52YWx1ZU9mKGRheSkpOworICAgICAgICB9CisgICAgICAgIGlmIChtb2RpZmllZCAhPSBudWxsKSB7CisgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBtb2RpZmllZENhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgbW9kaWZpZWRDYWwuc2V0VGltZShtb2RpZmllZCk7CisgICAgICAgICAgICBpbnQgeWVhciA9IG1vZGlmaWVkQ2FsLmdldChDYWxlbmRhci5ZRUFSKTsKKyAgICAgICAgICAgIGludCBtb250aCA9IG1vZGlmaWVkQ2FsLmdldChDYWxlbmRhci5NT05USCkrMTsKKyAgICAgICAgICAgIGludCBkYXkgPSBtb2RpZmllZENhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKKyAgICAgICAgICAgIHJldFN0ciArPSAiIEBtb2RpZmllZCAiICsgU3RyaW5nLnZhbHVlT2YoeWVhcikgKyAiLSIKKyAgICAgICAgICAgICAgICArIChtb250aCA+IDkgPyBTdHJpbmcudmFsdWVPZihtb250aCkgOiAiMCIgKyBTdHJpbmcudmFsdWVPZihtb250aCkpICsgIi0iCisgICAgICAgICAgICAgICAgKyAoZGF5ID4gOSA/IFN0cmluZy52YWx1ZU9mKGRheSkgOiAiMCIgKyBTdHJpbmcudmFsdWVPZihkYXkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3JlYXRvciAhPSBudWxsKSByZXRTdHIgKz0gIiBAY3JlYXRvciAiICsgY3JlYXRvcjsKKyAgICAgICAgaWYgKG1vZGlmaWVyICE9IG51bGwpIHJldFN0ciArPSAiIEBtb2RpZmllciAiICsgbW9kaWZpZXI7CisgICAgICAgIEVudW1lcmF0aW9uIGVsZW1zID0gbG9va3Vwcy5rZXlzKCk7CisgICAgICAgIHdoaWxlIChlbGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHN0ciA9IChTdHJpbmcpZWxlbXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHJldFN0ciArPSAiXG4jIEB7IiArIHN0ciArICJ9ICIgKyAoU3RyaW5nKWxvb2t1cHMuZ2V0KHN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCkgcmV0U3RyICs9ICJcbiMgQGNvbW1lbnQgIiArIGNvbW1lbnQ7CisJCQorICAgICAgICByZXRTdHIgKz0gIlxuIiArIG5hbWUgKyAiPSIgKyBzYXZlQ29udmVydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiByZXRTdHI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZm9ybWF0dGVkIGNvbnRlbnRzIHRvIGEgUHJpbnRTdHJlYW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgd3JpdGVDb250ZW50cyhQcmludFN0cmVhbSBwcykgeworICAgICAgICBwcy5wcmludGxuKHRoaXMudG9PdXRwdXRTdHJpbmcoKSk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZm9ybWF0dGVkIGNvbnRlbnRzIHRvIGEgd3JpdGVyIHN1Y2ggYXMgYSBGaWxlV3JpdGVyLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgd3JpdGVDb250ZW50cyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdy53cml0ZSh0aGlzLnRvT3V0cHV0U3RyaW5nKCkgKyAiXG4iKTsKKyAgICB9CisJCQorICAgIC8qCisgICAgICogQ29udmVydHMgdW5pY29kZXMgdG8gZW5jb2RlZCBcXHV4eHh4CisgICAgICogYW5kIHdyaXRlcyBvdXQgYW55IG9mIHRoZSBjaGFyYWN0ZXJzIGluIHNwZWNpYWxTYXZlQ2hhcnMKKyAgICAgKiB3aXRoIGEgcHJlY2VkaW5nIHNsYXNoCisgICAgICovCisgICAgLy8gVGFrZW4gZnJvbSBqYXZhLnV0aWwuUHJvcGVydGllcworICAgIHByaXZhdGUgU3RyaW5nIHNhdmVDb252ZXJ0KFN0cmluZyB0aGVTdHJpbmcpIHsKKyAgICAgICAgY2hhciBhQ2hhcjsKKyAgICAgICAgaW50IGxlbiA9IHRoZVN0cmluZy5sZW5ndGgoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIG91dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKjIpOworCisgICAgICAgIGZvcihpbnQgeD0wOyB4PGxlbjsgKSB7CisgICAgICAgICAgICBhQ2hhciA9IHRoZVN0cmluZy5jaGFyQXQoeCsrKTsKKyAgICAgICAgICAgIHN3aXRjaChhQ2hhcikgeworICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzpvdXRCdWZmZXIuYXBwZW5kKCdcXCcpOyBvdXRCdWZmZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICdcdCc6b3V0QnVmZmVyLmFwcGVuZCgnXFwnKTsgb3V0QnVmZmVyLmFwcGVuZCgndCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6b3V0QnVmZmVyLmFwcGVuZCgnXFwnKTsgb3V0QnVmZmVyLmFwcGVuZCgnbicpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICdccic6b3V0QnVmZmVyLmFwcGVuZCgnXFwnKTsgb3V0QnVmZmVyLmFwcGVuZCgncicpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjYXNlICdcZic6b3V0QnVmZmVyLmFwcGVuZCgnXFwnKTsgb3V0QnVmZmVyLmFwcGVuZCgnZicpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoKGFDaGFyIDwgMjApIHx8IChhQ2hhciA+IDEyNykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKCd1Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKHRvSGV4KChhQ2hhciA+PiAxMikgJiAweEYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5hcHBlbmQodG9IZXgoKGFDaGFyID4+IDgpICYgMHhGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKHRvSGV4KChhQ2hhciA+PiA0KSAmIDB4RikpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZCh0b0hleCgoYUNoYXIgPj4gMCkgJiAweEYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVjaWFsU2F2ZUNoYXJzLmluZGV4T2YoYUNoYXIpICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKGFDaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRCdWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogQ29udmVydCBhIG5pYmJsZSB0byBhIGhleCBjaGFyYWN0ZXIKKyAgICAgKiBAcGFyYW0JbmliYmxlCXRoZSBuaWJibGUgdG8gY29udmVydC4KKyAgICAgKi8KKwkvLyBUYWtlbiBmcm9tIGphdmEudXRpbC5Qcm9wZXJ0aWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhciB0b0hleChpbnQgbmliYmxlKSB7CisgICAgICAgIHJldHVybiBoZXhEaWdpdFsobmliYmxlICYgMHhGKV07CisgICAgfQorCQorICAgIC8qKiBBIHRhYmxlIG9mIGhleCBkaWdpdHMgKi8KKyAgICAvLyBUYWtlbiBmcm9tIGphdmEudXRpbC5Qcm9wZXJ0aWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleERpZ2l0ID0geworCScwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJworICAgIH07CisJCisgICAgLy8gVGFrZW4gZnJvbSBqYXZhLnV0aWwuUHJvcGVydGllcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzcGVjaWFsU2F2ZUNoYXJzID0gIj06IFx0XHJcblxmIyEiOworCQorICAgIHByaXZhdGUgRGF0ZSBwYXJzZURhdGVGcm9tU3RyaW5nKFN0cmluZyBkYXRlU3RyKSB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbnVsbDsKKyAgICAgICAgaWYgKGRhdGVTdHIubGVuZ3RoKCkgPT0gMTApCisgICAgICAgIAlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOyAvLyBTaW1wbGUgZm9ybWF0CisgICAgICAgIGVsc2UKKyAgICAgICAgCWZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5TU1kZCdUJ0hIbW1zcydaJyIpOyAgICAgICAgICAgICAgLy8gVE1YIElTTyBmb3JtYXQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXQucGFyc2UoZGF0ZVN0cik7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vT2NjdXJhbmNlLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vT2NjdXJhbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliY2JkYQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9PY2N1cmFuY2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKKy8qKgorICogVGhpcyBpcyBhIGNsYXNzIHVzZWQgYnkgdGhlIFJCUmVwb3J0ZXIgdG8gdHJhY2sgb2NjdXJhbmNlcyBvZiBhIHJlc291cmNlCisgKiBrZXkgZm91bmQgd2hpbGUgc2Nhbm5pbmcgYSB0ZXh0IGNvZGUgZmlsZS4gSXQgaXMgdXNlZCBtYWlubHkgdG8gcHJvZHVjZSBlcnJvcgorICogbWVzc2FnZXMgd2l0aCBoZWxwZnVsIGNvbnRleHQgaW5mb3JtYXRpb24uCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQlJlcG9ydGVyCisgKi8KK3B1YmxpYyBjbGFzcyBPY2N1cmFuY2UgeworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVfbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlX3BhdGg7CisgICAgcHJpdmF0ZSBpbnQgbGluZV9udW1iZXI7CisgICAgCisgICAgLyoqCisgICAgICogQmFzaWMgZGF0YSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICAKKyAgICBPY2N1cmFuY2UgKFN0cmluZyBmaWxlX25hbWUsIFN0cmluZyBmaWxlX3BhdGgsIGludCBsaW5lX251bWJlcikgeworICAgICAgICB0aGlzLmZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKKyAgICAgICAgdGhpcy5maWxlX3BhdGggPSBmaWxlX3BhdGg7CisgICAgICAgIHRoaXMubGluZV9udW1iZXIgPSBsaW5lX251bWJlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCBmaWxlIG5hbWUgb2YgdGhlIG9jY3VyYW5jZQorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWxlX25hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQgZmlsZSBwYXRoIG9mIHRoZSBvY2N1cmFuY2UKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgeworICAgICAgICByZXR1cm4gZmlsZV9wYXRoOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgb2NjdXJhbmNlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGxpbmVfbnVtYmVyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvY2N1cmFuY2Ugb2YgdGhlIGZvcm0gJ09jY3VyYW5jZTogX2ZpbGVfcGF0aF8gKF9saW5lX251bWJlcl8pJworICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiT2NjdXJhbmNlOiAiICsgZmlsZV9wYXRoICsgIiAoIiArIGxpbmVfbnVtYmVyICsgIikiOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUHJlZmVyZW5jZXMuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9QcmVmZXJlbmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTRiOGEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUHJlZmVyZW5jZXMuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5pby4qOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgbWV0aG9kcyB1c2VkIGJ5IFJCTWFuYWdlciB0byBhY2Nlc3MsIHNldCwgYW5kIHN0b3JlCisgKiBpbmRpdmlkdWFsIHVzZXIgcHJlZmVyZW5jZXMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gQWxsIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBkZWZpbmVkCisgKiBpbiB0aGlzIGNsYXNzIGFyZSBzdGF0aWMsIGFuZCBzbyB0aGUgY2xhc3MgbmVlZCBub3QgYmUgaW5zdGFudGlhdGVkLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlcyB7CisgICAgLy8gRGVmYXVsdCB2YWx1ZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFQ0VOVF9GSUxFUyA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOworICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgcHJvcDsKKwkKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHByZWZlcmVuY2UgYnkgaXRzIGtleSBuYW1lCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggb25lIHByZWZlcmVuY2UKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBzb3VnaHQKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpIGluaXQoKTsKKyAgICAgICAgT2JqZWN0IG8gPSBwcm9wLmdldChuYW1lKTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCAhKG8gaW5zdGFuY2VvZiBTdHJpbmcpKSByZXR1cm4gRU1QVFlfU1RSSU5HOworICAgICAgICByZXR1cm4gKFN0cmluZylvOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcHJlZmVyZW5jZSBieSBrZXkgbmFtZSBhbmQgdmFsdWUuIElmIHRoZSBrZXkgbmFtZSBhbGwgcmVhZHkgZXhpc3RzLCB0aGF0CisgICAgICogcHJlZmVyZW5jZSBpcyBvdmVyd3JpdHRlbiB3aXRob3V0IHdhcm5pbmcuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWZlcmVuY2UKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHRvIGJlIHNldCBhbmQgbGF0ZXIgcmV0cmlldmVkLiBJZiB0aGlzIHZhbHVlIGlzIG51bGwsIHRoZSBwcm9wZXJ0eSBvZiB0aGlzIG5hbWUgaXMgZXJhc2VkLgorICAgICAqLworCQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgaW5pdCgpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHJlbW92ZSB0aGUgcHJvcGVydHkKKyAgICAgICAgICAgIHByb3AucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIHByb3AucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSByZXN1bHRzIG9mIHRoZSBidWZmZXJlZCBwcmVmZXJlbmNlcyB0byBmaWxlLiBUaGVyZSBpcyBubyBvcHRpb24gZm9yCisgICAgICogd2hlcmUgdGhpcyBmaWxlIGlzIHNhdmVkIG9uIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgaW5pdCgpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJwcmVmZXJlbmNlcy5wcm9wZXJ0aWVzIik7CisgICAgICAgIHByb3Auc3RvcmUoZm9zLCAiUkJNYW5hZ2VyIFByZWZlcmVuY2VzIik7CisgICAgICAgIGZvcy5mbHVzaCgpOworICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogR2l2ZW4gdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgYW5kIHRoZSBmaWxlIHBhdGggbG9jYXRpb24gb2YgdGhlIGJhc2UKKyAgICAgKiBkb2N1bWVudCBmb3IgdGhhdCByZXNvdXJjZSBidW5kbGUsIHRoaXMgbWV0aG9kIHdpbGwgaW5zZXJ0IHRoYXQgZmlsZSBpbnRvCisgICAgICogYSBsaXN0IG9mIHJlY2VudCBmaWxlcy4gQ3VycmVudGx5IHRoZSBwYXN0IDQgcmVzb3VyY2UgYnVuZGxlcyB2aXNpdGVkIHdpbGwKKyAgICAgKiBiZSBkaXNwbGF5ZWQuIFRoaXMgbWV0aG9kIGFsc28gc29ydHMgdGhlIHByZWZlbmNlcyBzbyB0aGF0IHRoZSBtb3N0IHJlY2VudGx5CisgICAgICogYWRkZWQgd2lsbCBiZSB0aGUgZmlyc3QgcmV0dXJuZWQsIGV2ZW4gaWYgdGhhdCBmaWxlIGhhZCBhbGwgcmVhZHkgZXhpc3RlZAorICAgICAqIGluIHRoZSBwcmVmZXJlbmNlcyB3aGVuIGl0IHdhcyBhZGRlZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIGZpbGUgYXMgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGZpbGUgcGF0aCB0byB0aGlzIGZpbGUgKHNob3VsZCBiZSBhYnNvbHV0ZSkuCisgICAgICovCisJCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlY2VudEZpbGVQcmVmZXJlbmNlKFN0cmluZyBuYW1lLCBTdHJpbmcgbG9jYXRpb24pIHsKKyAgICAgICAgVmVjdG9yIGV4aXN0aW5nTmFtZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvciBleGlzdGluZ0xvY2F0aW9ucyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgTlVNX1JFQ0VOVF9GSUxFUzsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IGdldFByZWZlcmVuY2UoInJlY2VudGZpbGVpZCIgKyBTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBTdHJpbmcgb2xkTG9jYXRpb24gPSBnZXRQcmVmZXJlbmNlKCJyZWNlbnRmaWxlbG9jIiArIFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIGlmIChvbGROYW1lLmVxdWFscyhFTVBUWV9TVFJJTkcpIHx8IG9sZExvY2F0aW9uLmVxdWFscyhFTVBUWV9TVFJJTkcpKSBicmVhazsKKyAgICAgICAgICAgIGV4aXN0aW5nTmFtZXMuYWRkRWxlbWVudChvbGROYW1lKTsKKyAgICAgICAgICAgIGV4aXN0aW5nTG9jYXRpb25zLmFkZEVsZW1lbnQob2xkTG9jYXRpb24pOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBhbGwgcmVhZHkgaW4gdGhlcmUKKyAgICAgICAgaW50IHN3YXBfc3RhcnQgPSAwOworICAgICAgICBpbnQgb2xkX3NpemUgPSBleGlzdGluZ0xvY2F0aW9ucy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8PSBvbGRfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBleGlzdGluZ0xvY2F0aW9ucy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBtYXRjaCB3YXMgZm91bmQsIHB1bGwgYWxsIHRoZSBlbGVtZW50cyBkb3duIG9uZQorICAgICAgICAgICAgICAgIHN3YXBfc3RhcnQgPSBpOworICAgICAgICAgICAgICAgIGlmIChzd2FwX3N0YXJ0ID49IE5VTV9SRUNFTlRfRklMRVMpIHN3YXBfc3RhcnQgPSBOVU1fUkVDRU5UX0ZJTEVTLTE7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEV4dGVuZCB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3JzCisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTmFtZXMuYWRkRWxlbWVudChFTVBUWV9TVFJJTkcpOworICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0xvY2F0aW9ucy5hZGRFbGVtZW50KEVNUFRZX1NUUklORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb2xkTG9jYXRpb24gPSAoU3RyaW5nKWV4aXN0aW5nTG9jYXRpb25zLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkTG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoLCBwdWxsIHRoaXMgb25lIHRvIHRoZSBmcm9udAorICAgICAgICAgICAgICAgICAgICBzd2FwX3N0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisJCQorICAgICAgICAvLyBNb3ZlIHRoZSBmaWxlcyBkb3duIHRoZSBsaW5lIGFzIGFwcHJvcHJpYXRlCisgICAgICAgIGZvciAoaW50IGk9c3dhcF9zdGFydDsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgZXhpc3RpbmdMb2NhdGlvbnMuc2V0RWxlbWVudEF0KGV4aXN0aW5nTG9jYXRpb25zLmVsZW1lbnRBdChpLTEpLGkpOworICAgICAgICAgICAgZXhpc3RpbmdOYW1lcy5zZXRFbGVtZW50QXQoZXhpc3RpbmdOYW1lcy5lbGVtZW50QXQoaS0xKSxpKTsKKyAgICAgICAgfQorICAgICAgICBleGlzdGluZ0xvY2F0aW9ucy5zZXRFbGVtZW50QXQobG9jYXRpb24sIDApOworICAgICAgICBleGlzdGluZ05hbWVzLnNldEVsZW1lbnRBdChuYW1lLCAwKTsKKwkJCisgICAgICAgIC8vIFNldCB0aGUgcHJvcGVydGllcworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBleGlzdGluZ0xvY2F0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc2V0UHJlZmVyZW5jZSgicmVjZW50ZmlsZWlkIiArIFN0cmluZy52YWx1ZU9mKGkpLCAoU3RyaW5nKWV4aXN0aW5nTmFtZXMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgICAgIHNldFByZWZlcmVuY2UoInJlY2VudGZpbGVsb2MiICsgU3RyaW5nLnZhbHVlT2YoaSksIChTdHJpbmcpZXhpc3RpbmdMb2NhdGlvbnMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPWV4aXN0aW5nTG9jYXRpb25zLnNpemUoKTsgaSA8IE5VTV9SRUNFTlRfRklMRVM7IGkrKykgeworICAgICAgICAgICAgc2V0UHJlZmVyZW5jZSgicmVjZW50ZmlsZWlkIiArIFN0cmluZy52YWx1ZU9mKGkpLCBFTVBUWV9TVFJJTkcpOworICAgICAgICAgICAgc2V0UHJlZmVyZW5jZSgicmVjZW50ZmlsZWxvYyIgKyBTdHJpbmcudmFsdWVPZihpKSwgRU1QVFlfU1RSSU5HKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2F2ZVByZWZlcmVuY2VzKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30gLy8gSWdub3JlLCBpdHMgbm90IGNyaXRpY2FsCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgbG9jYXRpb25zIG9mIHRoZSB2YXJpb3VzIHJlY2VudGx5IHVzZWQgZmlsZXMuCisgICAgICogQHJldHVybiBBIFZlY3RvciBvZiBTdHJpbmdzIHdoaWNoIGlzIHR3aWNlIGluIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGZpbGVzIGtub3duIGFib3V0LiBUaGUgdmVjdG9yIGNvbnRhaW5zIG5hbWUgMSB0aGVuIGxvY2F0aW9uIDEsIHRoZW4gbmFtZSAyIC4uLgorICAgICAqLworCQorICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldFJlY2VudEZpbGVzUHJlZmVyZW5jZXMoKSB7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpIGluaXQoKTsKKyAgICAgICAgVmVjdG9yIGV4aXN0aW5nID0gbmV3IFZlY3RvcigpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBOVU1fUkVDRU5UX0ZJTEVTOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UHJlZmVyZW5jZSgicmVjZW50ZmlsZWlkIiArIFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGdldFByZWZlcmVuY2UoInJlY2VudGZpbGVsb2MiICsgU3RyaW5nLnZhbHVlT2YoaSkpOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEVNUFRZX1NUUklORykgfHwgbG9jYXRpb24uZXF1YWxzKEVNUFRZX1NUUklORykpIGJyZWFrOworICAgICAgICAgICAgZXhpc3RpbmcuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgIGV4aXN0aW5nLmFkZEVsZW1lbnQobG9jYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleGlzdGluZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIFByb3BlcnRpZXMgZGVmYXVsdHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAvLyBUaGlzIHZhbHVlcyBhcmUgbmVlZGVkIGFuZCBhcmUgc3BlY2lmaWVkIGJ5IGRlZmF1bHQKKyAgICAgICAgLy8gSWYgdGhleSBleGlzdCBpbiB0aGUgZmlsZSwgdGhleSB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgIGRlZmF1bHRzLnB1dCgidXNlcm5hbWUiLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVua25vd25fdXNlciIpKTsKKyAgICAgICAgZGVmYXVsdHMucHV0KCJsb2NhbGUiLCAiZW4iKTsKKyAgICAgICAgZGVmYXVsdHMucHV0KCJsb29rYW5kZmVlbCIsICIiKTsKKwkJCisgICAgICAgIHByb3AgPSBuZXcgUHJvcGVydGllcyhkZWZhdWx0cyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgicHJlZmVyZW5jZXMucHJvcGVydGllcyIpOworICAgICAgICAgICAgcHJvcC5sb2FkKGZpcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciByZWFkaW5nIHByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNhdmVQcmVmZXJlbmNlcygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3Igc2F2aW5nIHByZWZlcmVuY2VzICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKgorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAgLy8gVGVzdAorICAgICAgICBpbml0KCk7CisgICAgfQorICAgICovCit9CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJFeHBvcnRlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCRXhwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE1ODA0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCRXhwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdXBlciBjbGFzcyBmb3IgYWxsIGV4cG9ydGVyIHBsdWctaW4gY2xhc3Nlcy4gQXMgb2YgeWV0LCB0aGVyZQorICogaXMgbGl0dGxlIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSQkV4cG9ydGVyIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEpGaWxlQ2hvb3NlciBjaG9vc2VyOworCQorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4cG9ydChSQk1hbmFnZXIgcmJtKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSUNVRXhwb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQklDVUV4cG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiYzExZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQklDVUV4cG9ydGVyLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBwbHVnLWluIGV4cG9ydGVyIHV0aWxpdHkgZm9yIFJCTWFuYWdlciB0aGF0IG91dHB1dHMgSUNVCisgKiByZXNvdXJjZSBidW5kbGUgZmlsZXMgaW4gdGhlIGFjY29yZGluZyB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUgb2YgUmVzb3VyY2UKKyAqIEJ1bmRsZXMuIE1vc3Qgb2YgdGhlIG1ldGEtZGF0YSBpcyBsb3N0IGluIHRoaXMgZXhwb3J0LgorICogCisgKiBAYXV0aG9yIEdlb3JnZSBSaG90ZW4KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQklDVUV4cG9ydGVyIGV4dGVuZHMgUkJFeHBvcnRlciB7CisgICAgLyoqIERvIGNoYXJhY3RlcnMgYmV5b25kIFxcdTAwN2YgbmVlZCBcXHUgZXNjYXBlIG5vdGF0aW9uPyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlc2NhcGVOb25Bc2NpaSA9IGZhbHNlOworCisgICAgLyoqIFdyaXRlIHRoZSBtZXRhIGRhdGEgZm9yIGVhY2ggcmVzb3VyY2U/ICovCisgICAgcHJpdmF0ZSBib29sZWFuIHdyaXRlTWV0YURhdGEgPSB0cnVlOworCQorICAgIC8qKiBXcml0ZSB0aGUgZ3JvdXBzIGFzIGtleXM/ICovCisgICAgcHJpdmF0ZSBib29sZWFuIHdyaXRlR3JvdXBzQXNLZXlzID0gZmFsc2U7CisKKyAgICBwdWJsaWMgUkJJQ1VFeHBvcnRlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKwkJCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZpbGUgY2hvb3NlciBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGNob29zZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKyAgICAgICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAicm9vdCBJQ1UgRmlsZSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZi5nZXROYW1lKCkuc3RhcnRzV2l0aCgicm9vdC4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gLy8gZW5kIGlmCisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChSQk1hbmFnZXIgcmJtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmJtID09IG51bGwpIHJldHVybjsKKyAgICAgICAgLy8gT3BlbiB0aGUgU2F2ZSBEaWFsb2cKKyAgICAgICAgaW50IHJldF92YWwgPSBjaG9vc2VyLnNob3dTYXZlRGlhbG9nKG51bGwpOworICAgICAgICBpZiAocmV0X3ZhbCAhPSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZXRyaWV2ZSBiYXNpYyBmaWxlIGluZm9ybWF0aW9uCisgICAgICAgIEZpbGUgZmlsZSA9IGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpbGUocykgd2Ugd2lsbCBiZSB3b3JraW5nIHdpdGgKKyAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudCgpKTsgICAgICAgICAgICAvLyBUaGUgZGlyZWN0b3J5IHdlIHdpbGwgYmUgd3JpdGluZyB0bworICAgICAgICBTdHJpbmcgYmFzZV9uYW1lID0gZmlsZS5nZXROYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlIG5hbWUgb2YgdGhlIGZpbGVzIHdlIHdpbGwgd3JpdGUKKyAgICAgICAgaWYgKGJhc2VfbmFtZSA9PSBudWxsIHx8IGJhc2VfbmFtZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlX25hbWUgPSByYm0uZ2V0QmFzZUNsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2VfbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKSB7CisgICAgICAgICAgICBiYXNlX25hbWUgPSBiYXNlX25hbWUuc3Vic3RyaW5nKDAsYmFzZV9uYW1lLmxlbmd0aCgpLTExKTsKKyAgICAgICAgfQorCQkKKyAgICAgICAgVmVjdG9yIGJ1bmRsZV92ID0gcmJtLmdldEJ1bmRsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlX3Yuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZV92LmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlX2VuYyA9IGJhc2VfbmFtZTsKKyAgICAgICAgICAgIGlmIChidW5kbGUuZW5jb2RpbmcgIT0gbnVsbCAmJiAhYnVuZGxlLmVuY29kaW5nLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBiYXNlX2VuYyA9IGJhc2VfZW5jICsgIl8iICsgYnVuZGxlLmVuY29kaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGZpbGVfbmFtZSA9IGJhc2VfZW5jICsgIi50eHQiOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJcdWZlZmYvLyBSZXNvdXJjZSBCdW5kbGU6ICIgKyBmaWxlX25hbWUgKyAiIC0gRmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIgYXQgIiArIChuZXcgRGF0ZSgpKTsKKworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZV9uYW1lKSk7CisgICAgICAgICAgICBQcmludFdyaXRlciByZXNPdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEYtOCIpKTsKKworICAgICAgICAgICAgVmVjdG9yIGdyb3VwX3YgPSBidW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKTsKKyAgICAgICAgICAgIHJlc091dC5wcmludGxuKGhlYWRlcik7CisgICAgICAgICAgICByZXNPdXQucHJpbnRsbihiYXNlX2VuYyArICIgeyAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGdyb3VwX3Yuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClncm91cF92LmVsZW1lbnRBdChqKTsKKworICAgICAgICAgICAgICAgIFZlY3RvciBpdGVtVmVjdCA9IGdyb3VwLmdldEl0ZW1zQXNWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICBpbnQgaXRlbVZlY3RTaXplID0gaXRlbVZlY3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtVmVjdFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZU1ldGFEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXBDb21tZW50ID0gZ3JvdXAuZ2V0Q29tbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ29tbWVudCAhPSBudWxsICYmICFncm91cENvbW1lbnQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc091dC5wcmludGxuKCIgICAgLy8gQGdyb3VwQ29tbWVudCAiICsgZ3JvdXBDb21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd3JpdGVHcm91cE5hbWUgPSAhYnVuZGxlLmdldFVuZ3JvdXBlZEdyb3VwKCkuZ2V0TmFtZSgpLmVxdWFscyhncm91cC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVHcm91cE5hbWUpIHsKKwkgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZUdyb3Vwc0FzS2V5cykgeworCQkgICAgICAgICAgICAgICAgICAgIHJlc091dC5wcmludGxuKCIgICAgIiArIGVzY2FwZVN0cmluZyhncm91cC5nZXROYW1lKCksIHRydWUpICsgIiB7ICIpOworCSAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod3JpdGVNZXRhRGF0YSkgeworCQkgICAgICAgICAgICAgICAgICAgIHJlc091dC5wcmludGxuKCIgICAgLy8gQGdyb3VwICIgKyBlc2NhcGVTdHJpbmcoZ3JvdXAuZ2V0TmFtZSgpLCB0cnVlKSk7CisJICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrIDwgaXRlbVZlY3RTaXplOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaXRlbSA9IChCdW5kbGVJdGVtKWl0ZW1WZWN0LmVsZW1lbnRBdChrKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlTWV0YURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnQoIiAgICAgICAgLy8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnQoIiBAdHJhbnNsYXRlZCAiICsgaXRlbS5pc1RyYW5zbGF0ZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzT3V0LnByaW50KCIgQGNyZWF0ZWQgIiArIGl0ZW0uZ2V0Q3JlYXRlZERhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzT3V0LnByaW50KCIgQG1vZGlmaWVkICIgKyBpdGVtLmdldE1vZGlmaWVkRGF0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnQoIiBAY3JlYXRvciAiICsgaXRlbS5nZXRDcmVhdG9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc091dC5wcmludGxuKCIgQG1vZGlmaWVyICIgKyBpdGVtLmdldE1vZGlmaWVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtQ29tbWVudCA9IGl0ZW0uZ2V0Q29tbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQ29tbWVudCAhPSBudWxsICYmICFpdGVtQ29tbWVudC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc091dC5wcmludGxuKCIgICAgICAgIC8vIEBjb21tZW50ICIgKyBpdGVtQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnRsbigiICAgICAgICAiICsgZXNjYXBlU3RyaW5nKGl0ZW0uZ2V0S2V5KCksIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgeyAiICsgZXNjYXBlU3RyaW5nKGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSwgZmFsc2UpICsgIiB9Iik7CisgICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGZvciAtIGsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlR3JvdXBOYW1lICYmIHdyaXRlR3JvdXBzQXNLZXlzKSB7CisJICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnRsbigiICAgIH0iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gZW5kIGZvciAtIGoKKyAgICAgICAgICAgIHJlc091dC5wcmludGxuKCJ9Iik7CisJCQkKKyAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgZmlsZQorICAgICAgICAgICAgcmVzT3V0LmNsb3NlKCk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgfSAvLyBlbmQgZm9yIC0gaQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVzY2FwZSBhIHN0cmluZyBhY2NvcmRpbmcgdG8gaG93IHRoZSBJQ1UgdG9vbCAiZ2VucmIiIGhhbmRsZXMgc3RyaW5ncy4KKyAgICAgKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgdG8gZXNjYXBlCisgICAgICogQHBhcmFtIGlzS2V5IElmIHRoaXMgaXMgYSBrZXksIHRoZW4gcXVvdGVzIGFyZSBvcHRpb25hbC4KKyAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gSUNVIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVzY2FwZVN0cmluZyhTdHJpbmcgc3RyLCBib29sZWFuIGlzS2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnQgbGVuID0gc3RyLmxlbmd0aCgpOworICAgICAgICBib29sZWFuIHF1b3RlUmVxdWlyZWQgPSAhaXNLZXk7CisgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKKyAgICAgICAgICAgIGludCBjaCA9IHN0ci5jaGFyQXQoaWR4KTsKKyAgICAgICAgICAgIGlmIChjaCA8PSAnICcgfHwgJ34nIDwgY2gpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNLZXkgJiYgY2ggIT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGUgPSBuZXcgSU9FeGNlcHRpb24oc3RyICsgIiBuZWVkcyB0byB1c2UgaW52YXJpYW50IGNoYXJhY3RlcnMgZm9yIHRoZSBrZXkuIik7CisgICAgICAgICAgICAgICAgICAgIGUuZmlsbEluU3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXNjYXBlTm9uQXNjaWkgJiYgY2ggIT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB6ZXJvczsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhleE51bTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCAmIDB4ZjgwMCkgPT0gMHhkODAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBmb3VuZCBhIHZhbGlkIFVURi0xNiBzdHJpbmcgd2l0aCBhIHN1cnJvZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoMiA9IHN0ci5jaGFyQXQoaWR4KyspOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoU3Vycm9nYXRlID0gKCgoY2gpPDwxMCkrKGNoMiktKCgweGQ4MDA8PDEwKSsweGRjMDAtMHgxMDAwMCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvcyA9ICIwMDAwMDAwMCI7CisgICAgICAgICAgICAgICAgICAgICAgICBoZXhOdW0gPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoU3Vycm9nYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoIlxcVSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgemVyb3MgPSAiMDAwMCI7CisgICAgICAgICAgICAgICAgICAgICAgICBoZXhOdW0gPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoIlxcdSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoemVyb3Muc3Vic3RyaW5nKGhleE51bS5sZW5ndGgoKSkgKyBoZXhOdW0udG9VcHBlckNhc2UoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcXVvdGVSZXF1aXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgeworICAgICAgICAgICAgICAgIHF1b3RlUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAneycgfHwgY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIHF1b3RlUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocXVvdGVSZXF1aXJlZCkgeworICAgICAgICAgICAgc3RyQnVmLmluc2VydCgwLCAnXCInKTsKKyAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoJ1wiJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJJbXBvcnRlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSW1wb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjRhNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSW1wb3J0ZXIuamF2YQpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS5ndWkuUkJNYW5hZ2VyR1VJOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworCisvKioKKyAqIDxQPlRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzIGZvciBhbGwgaW1wb3J0ZXIgcGx1Zy1pbiBjbGFzc2VzLjwvUD4KKyAqIDxQPgorICogSW4gdGVybXMgb2YgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY2xhc3Mgb3IgaXRzIGNoaWxkcmVuIGNsYXNzZXMsIHRoZSBmb2xsb3dpbmcgc3RlcHMgc2hvdWxkIGhhcHBlbiBpbiBvcmRlcjoKKyAqIDxPTD4KKyAqIDxMST5BIERpYWxvZyBpcyBzaG93biBmcm9tIHdoaWNoIHRoZSB1c2VyIG1heSBzZWxlY3Qgb3B0aW9ucyBhYm91dCB0aGUgaW1wb3J0LCBpbmNsdWRpbmcgdGhlIGZpbGUgZnJvbSB3aGljaCB0byBpbXBvcnQuPC9MST4KKyAqIDxMST5UaGUgJ0ltcG9ydCcgYnV0dG9uIGlzIHByZXNzZWQsIGNsb3NpbmcgdGhlIG9wdGlvbnMgZGlhbG9nIGFuZCBvcGVuaW5nIGEgcHJvZ3Jlc3MgYmFyIGRpYWxvZyBib3guPC9MST4KKyAqIDxMST5UaGUgY2xhc3Mgc2hvdWxkIHJlc29sdmUgYWxsIGNvbmZsaWN0cyB3aXRoIGxvY2FsZSBlbmNvZGluZ3MgZXhpc3RpbmcgaW4gdGhlIGltcG9ydCBmaWxlcywgYnV0IG5vdCBpbiB0aGUgYWN0aXZlIHJlc291cmNlIGJ1bmRsZS48L0xJPgorICogPExJPlRoZSBjbGFzcyBzaG91bGQgcGFyc2UgcmVzb3VyY2VzIG9uZSBhdCBhIHRpbWUgYW5kIHVzZSB0aGUgaW1wb3J0UmVzb3VyY2UoKSBtZXRob2QgdG8gaW5zZXJ0IHRoZW0gaW50byB0aGUgcmVzb3VyY2UgYnVuZGxlLjwvTEk+CisgKiA8TEk+VGhlIGNsYXNzIHNob3VsZCByZXBvcnQgd2hlbiBhbGwgcmVzb3VyY2VzIGhhdmUgYmVlbiByZWFkIGFuZCB0aGUgaW1wb3J0IGlzIGNvbXBsZXRlLjwvTEk+CisgKiA8L09MPgorICogPC9QPgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQkltcG9ydGVyIGV4dGVuZHMgSkRpYWxvZyB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZJTEVfT1BUSU9OX1BPUFVMQVRFICAgICAgPSAwOyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBsb2NhbGUgZmlsZSBwb3B1bGF0ZWQgZnJvbSBiYXNlIGZpbGUKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRklMRV9PUFRJT05fRU1QVFkgICAgICAgICA9IDE7ICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGVtcHR5IGxvY2FsZSBmaWxlCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZJTEVfT1BUSU9OX0lHTk9SRSAgICAgICAgPSAyOyAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgcmVzb3VyY2VzIGZyb20gdGhpcyBlbmNvZGluZworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBGSUxFX09QVElPTl9QUk9NUFQgICAgICAgID0gMzsgICAgICAgICAgICAvLyBQcm9tcHQgZm9yIGVhY2ggY29uZmxpY3QKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUkVTT1VSQ0VfT1BUSU9OX09WRVJXUklURSA9IDA7ICAgICAgICAgICAgLy8gVXNlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgaW1wb3J0IGZpbGUKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUkVTT1VSQ0VfT1BUSU9OX0lHTk9SRSAgICA9IDE7ICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBpbXBvcnQgYW5kIHVzZSBleGlzdGluZyB2YWx1ZQorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBSRVNPVVJDRV9PUFRJT05fUFJPTVBUICAgID0gMjsgICAgICAgICAgICAvLyBQcm9wbXB0IGZvciBlYWNoIGNvbmZsaWN0CisJCisgICAgcHJvdGVjdGVkIHN0YXRpYyBKRmlsZUNob29zZXIgY2hvb3NlcjsKKyAgICBwcm90ZWN0ZWQgaW50ICAgIG51bV9jb25mbGljdHM7CisgICAgcHJvdGVjdGVkIGludCAgICBudW1fZXh0cmFfZmlsZXM7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKKyAgICBwcm90ZWN0ZWQgUkJNYW5hZ2VyIHJibTsKKyAgICBwcm90ZWN0ZWQgUkJNYW5hZ2VyR1VJIGd1aTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXRoU2V0ID0gZmFsc2U7CisJCisgICAgLy8gVmlzdWFsIENvbXBvbmVudHMKKyAgICBKUmFkaW9CdXR0b24gcmVzb3VyY2VPdmVyd3JpdGVSYWRpbyAgICA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3Rfb3ZlcndyaXRlIiksIGZhbHNlKTsKKyAgICBKUmFkaW9CdXR0b24gcmVzb3VyY2VJZ25vcmVSYWRpbyAgICAgICA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfaWdub3JlIiksIGZhbHNlKTsKKyAgICBKUmFkaW9CdXR0b24gcmVzb3VyY2VQcm9tcHRSYWRpbyAgICAgICA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfY29uZmxpY3RfcHJvbXB0IiksIHRydWUpOworICAgIEpSYWRpb0J1dHRvbiBmaWxlR2VuZXJhdGVQb3B1bGF0ZVJhZGlvID0gbmV3IEpSYWRpb0J1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9maWxlX2NvbmZsaWN0X2dlbmVyYXRlX3BvcHVsYXRlIiksIGZhbHNlKTsKKyAgICBKUmFkaW9CdXR0b24gZmlsZUdlbmVyYXRlRW1wdHlSYWRpbyAgICA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9lbXB0eSIpLCBmYWxzZSk7CisgICAgSlJhZGlvQnV0dG9uIGZpbGVJZ25vcmVSYWRpbyAgICAgICAgICAgPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RfaWdub3JlIiksIGZhbHNlKTsKKyAgICBKUmFkaW9CdXR0b24gZmlsZVByb21wdFJhZGlvICAgICAgICAgICA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfY29uZmxpY3RfcHJvbXB0IiksIHRydWUpOworCQorICAgIEpDaGVja0JveCBtYXJrVHJhbnNsYXRlZENoZWNrID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9kZWZhdWx0X3RyYW5zbGF0ZWQiKSwgdHJ1ZSk7CisgICAgSkNoZWNrQm94IGNyZWF0ZUdyb3Vwc0NoZWNrID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9kZWZhdWx0X2dyb3VwX2NyZWF0aW9uIiksIHRydWUpOworICAgIEpDb21ib0JveCBncm91cENvbWJvQm94ID0gbmV3IEpDb21ib0JveCgpOworCQorICAgIEpMYWJlbCBzb3VyY2VMYWJlbDsKKwkKKyAgICBKRGlhbG9nIHByb2dyZXNzQmFyRGlhbG9nOworICAgIEpQcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdGhhdCBhcHBlYXJzIGluIHRoZSBEaWFsb2cgYm94CisgICAgICogQHBhcmFtIHJibSBBbiBSQk1hbmFnZXIgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gZ3VpIFRoZSBSQk1hbmFnZXIgR1VJIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgUkJNYW5hZ2VyIGluc3RhbmNlCisgICAgICovCisgICAgCisgICAgcHVibGljIFJCSW1wb3J0ZXIoU3RyaW5nIHRpdGxlLCBSQk1hbmFnZXIgcmJtLCBSQk1hbmFnZXJHVUkgZ3VpKSB7CisgICAgICAgIHN1cGVyKG5ldyBGcmFtZSgpLCB0aXRsZSwgdHJ1ZSk7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICAgICAgdGhpcy5yYm0gPSByYm07CisgICAgICAgIHRoaXMuZ3VpID0gZ3VpOworICAgICAgICBpbml0KCk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKSB7CisgICAgICAgIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisgICAgICAgIHNldHVwRmlsZUNob29zZXIoKTsKKyAgICAgICAgbnVtX2NvbmZsaWN0cyA9IDA7CisgICAgICAgIG51bV9leHRyYV9maWxlcyA9IDA7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgICAgIHNldFZpc2libGUodHJ1ZSk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHNldHVwRmlsZUNob29zZXIoKSB7CisgICAgICAgIC8vIFRvIGJlIG92ZXJ3cml0dGVuCisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIGJlZ2luSW1wb3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVG8gYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgaWYgKCFwYXRoU2V0KQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJQYXRoIG5vdCBzZXQgeWV0Iik7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIGNob29zZUZpbGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBjaG9vc2VyLnNob3dPcGVuRGlhbG9nKHRoaXMpOworICAgICAgICBpZiAocmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworICAgICAgICAgICAgRmlsZSBmID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKyAgICAgICAgICAgIHNvdXJjZUxhYmVsLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfc291cmNlX2ZpbGUiLGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgICAgIHBhdGhTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCQorICAgIHByb3RlY3RlZCBGaWxlIGdldENob3NlbkZpbGUoKSB7CisgICAgICAgIHJldHVybiBjaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBBIHN1cGVyIGNsYXNzIG1ldGhvZCBpbnRlbmRlZCBmb3IgdXNlIG9mIG5lYXJseSBhbGwgc3ViY2xhc3MgaW1wb3J0ZXJzLCBvbmNlIGEgcmVzb3VyY2UKKyAgICAgKiBpcyBmb3VuZCBieSB0aG9zZSBzdWJjbGFzc2VzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBuZXcgcmVzb3VyY2UKKyAgICAgKiBhbmQgaGFuZGxlIHRoZSB2YXJpb3VzIGNvbmZsaWN0IGVycm9ycyB0aGF0IG1heSByZXN1bHQgYXMgYSBwYXJ0IG9mIHRoYXQgaW1wb3J0LgorICAgICAqLworCQorICAgIHByb3RlY3RlZCB2b2lkIGltcG9ydFJlc291cmNlKEJ1bmRsZUl0ZW0gaXRlbSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgZ3JvdXBfbmFtZSkgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbnVsbDsKKyAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSBudWxsOworICAgICAgICBCdW5kbGVHcm91cCBiYWNrdXBfZ3JvdXAgPSBudWxsOworCQkKKyAgICAgICAgaWYgKGdyb3VwX25hbWUgPT0gbnVsbCkKKyAgICAgICAgCWdyb3VwX25hbWUgPSBnZXREZWZhdWx0R3JvdXAoKTsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIC8vIEdldCB0aGUgYnVuZGxlIHRvIHdoaWNoIHdlIHdpbGwgYmUgYWRkaW5nIHRoaXMgcmVzb3VyY2UKKyAgICAgICAgYnVuZGxlID0gcmJtLmdldEJ1bmRsZShlbmNvZGluZyk7CisgICAgICAgIC8vIFNraXAgdGhpcyBpbXBvcnQgaWYgdGhlIGJ1bmRsZSBpcyBub24tZXhpc3RlbnQgKFNob3VsZCBoYXZlIGJlZW4gcmVzb2x2ZWQgaWYgd2FudGVkKQorICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIC8vIEZpbmQgdGhlIGdyb3VwIGluIHRoZSBidW5kbGUsIFVuZ3JvdXBlZCBpZiBub24tZXhpc3RlbnQKKyAgICAgICAgVmVjdG9yIGd2ID0gYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGd2LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGVHcm91cCB0ZW1wZyA9IChCdW5kbGVHcm91cClndi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBpZiAoaT09MCkgYmFja3VwX2dyb3VwID0gdGVtcGc7CisgICAgICAgICAgICBpZiAodGVtcGcuZ2V0TmFtZSgpLmVxdWFscygiVW5ncm91cGVkIEl0ZW1zIikpIGJhY2t1cF9ncm91cCA9IHRlbXBnOworICAgICAgICAgICAgZWxzZSBpZiAodGVtcGcuZ2V0TmFtZSgpLmVxdWFscyhncm91cF9uYW1lKSkgeworICAgICAgICAgICAgICAgIGdyb3VwID0gdGVtcGc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChnZXREZWZhdWx0R3JvdXBDcmVhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGdyb3VwIGJ5IHRoaXMgbmFtZQorICAgICAgICAgICAgICAgIGJ1bmRsZS5hZGRCdW5kbGVHcm91cChncm91cF9uYW1lLCAiIik7CisgICAgICAgICAgICAgICAgZ3YgPSBidW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBndi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCB0ZW1wZyA9IChCdW5kbGVHcm91cClndi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wZy5nZXROYW1lKCkuZXF1YWxzKGdyb3VwX25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHRlbXBnOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYmFja3VwX2dyb3VwCisgICAgICAgICAgICAgICAgZ3JvdXAgPSBiYWNrdXBfZ3JvdXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgYWxsIGdyb3VwIGlkZW50aWZpY2F0aW9uIGVmZm9ydHMgZmFpbCwgd2UgZmFpbAorICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKKyAgICAgICAgCXJldHVybjsKKyAgICAgICAgaXRlbS5zZXRQYXJlbnRHcm91cChncm91cCk7CisgICAgICAgIC8vIENoZWNrIGZvciBhbmQgcmVzb2x2ZSBjb25mbGljdHMKKyAgICAgICAgaWYgKGJ1bmRsZS5hbGxJdGVtcy5jb250YWluc0tleShpdGVtLmdldEtleSgpKSkgeworICAgICAgICAgICAgcmVzb2x2ZVJlc291cmNlKGJ1bmRsZSxpdGVtKTsgCisgICAgICAgICAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coIlJlc29sdmUgY29uZmxpY3QiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEluc2VydCB0aGUgcmVzb3VyY2UKKyAgICAgICAgICAgIGJ1bmRsZS5hZGRCdW5kbGVJdGVtKGl0ZW0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0cnlpbmcgdG8gaW1wb3J0IGFuZCBpdGVtIHdob3NlIGtleSBhbGwgcmVhZHkgZXhpc3RzIHdpdGhpbiB0aGUgYnVuZGxlLgorICAgICAqLworCQorICAgIHByb3RlY3RlZCB2b2lkIHJlc29sdmVSZXNvdXJjZShCdW5kbGUgYnVuZGxlLCBCdW5kbGVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb25mbGljdE9wdGlvbigpID09IFJFU09VUkNFX09QVElPTl9JR05PUkUpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIGVsc2UgaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb25mbGljdE9wdGlvbigpID09IFJFU09VUkNFX09QVElPTl9PVkVSV1JJVEUpIHsKKyAgICAgICAgICAgIGJ1bmRsZS5yZW1vdmVJdGVtKGl0ZW0uZ2V0S2V5KCkpOworICAgICAgICAgICAgYnVuZGxlLmFkZEJ1bmRsZUl0ZW0oaXRlbSk7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRSZXNvdXJjZUNvbmZsaWN0T3B0aW9uKCkgPT0gUkVTT1VSQ0VfT1BUSU9OX1BST01QVCkgeworICAgICAgICAgICAgQnVuZGxlSXRlbSBvcmlnaW5hbCA9IChCdW5kbGVJdGVtKWJ1bmRsZS5hbGxJdGVtcy5nZXQoaXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAob3JpZ2luYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIAlyZXR1cm47CisgICAgICAgICAgICBTdHJpbmcgdHJhbnMgPSBvcmlnaW5hbC5nZXRUcmFuc2xhdGlvbigpOworICAgICAgICAgICAgU3RyaW5nIG9wdGlvbnNbXSA9IHsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3Rfb3ZlcndyaXRlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9pZ25vcmUiKX07CisgICAgICAgICAgICBTdHJpbmcgaW5zZXJ0W10gPSB7aXRlbS5nZXRLZXkoKSwgKGJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoIiIpID8gIihCYXNlIENsYXNzKSIgOiBidW5kbGUuZW5jb2RpbmcpfTsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKUpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyh0aGlzLCAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlIiwgaW5zZXJ0KSArIAorICAgICAgICAgICAgICAgICJcbiIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2Vfc291cmNlIiwgaXRlbS5nZXRUcmFuc2xhdGlvbigpKSArCisgICAgICAgICAgICAgICAgIlxuIiArIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZV90YXJnZXQiLCB0cmFucyksCisgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdHMiKSwgSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSwKKyAgICAgICAgICAgICAgICBudWxsLCBvcHRpb25zLCBvcHRpb25zWzBdKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgIAlyZXR1cm47CisgICAgICAgICAgICBpZiAocmVzdWx0LmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9vdmVyd3JpdGUiKSkpIHsKKyAgICAgICAgICAgICAgICBidW5kbGUucmVtb3ZlSXRlbShpdGVtLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBidW5kbGUuYWRkQnVuZGxlSXRlbShpdGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9pZ25vcmUiKSkpCisgICAgICAgICAgICAJcmV0dXJuOworICAgICAgICB9CisgICAgfQorCQorICAgIC8qKgorICAgICAqIEdpdmVuIGEgdmVjdG9yIG9mIHN0cmluZ3MgY29udGFpbmluZyBsb2NhbGUgZW5jb2RpbmdzIChlLmcuIHsiZW4iLCAiZW5fdXMiLCAiZGUifSksIGF0dGVtcHRzCisgICAgICogdG8gcmVzb2x2ZSB0aG9zZSBjb25mbGljdHMgYWNjb3JkaW5nIHRvIHRoZSBwcmVmZXJlbmNlcyBzZWxlY3RlZCBieSB0aGUgdXNlci4KKyAgICAgKi8KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNvbHZlRW5jb2RpbmdzKFZlY3RvciB2KSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IChTdHJpbmcpdi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCB8fCBlbmNvZGluZy5lcXVhbHMoIiIpIHx8IHJibS5oYXNSZXNvdXJjZShlbmNvZGluZykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZXNvbHZlIHRoaXMgY29uZmxpY3QKKyAgICAgICAgICAgIGlmICh0aGlzLmdldEZpbGVDb25mbGljdE9wdGlvbigpID09IEZJTEVfT1BUSU9OX0lHTk9SRSkgY29udGludWU7CisgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmdldEZpbGVDb25mbGljdE9wdGlvbigpID09IEZJTEVfT1BUSU9OX1BPUFVMQVRFKSB7CisgICAgICAgICAgICAgICAgcmJtLmNyZWF0ZVJlc291cmNlKG51bGwsIG51bGwsIG51bGwsIGVuY29kaW5nLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRGaWxlQ29uZmxpY3RPcHRpb24oKSA9PSBGSUxFX09QVElPTl9FTVBUWSkgeworICAgICAgICAgICAgICAgIHJibS5jcmVhdGVSZXNvdXJjZShudWxsLCBudWxsLCBudWxsLCBlbmNvZGluZywgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0RmlsZUNvbmZsaWN0T3B0aW9uKCkgPT0gRklMRV9PUFRJT05fUFJPTVBUKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG9wdGlvbnNbXSA9IHsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9wb3B1bGF0ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfZW1wdHkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9maWxlX2NvbmZsaWN0X2lnbm9yZSIpfTsKKwkJCQkKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZylKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9jaG9vc2UiLCBlbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RzIiksIEpPcHRpb25QYW5lLlFVRVNUSU9OX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG9wdGlvbnMsIG9wdGlvbnNbMF0pOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9pZ25vcmUiKSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9wb3B1bGF0ZSIpKSkgeworICAgICAgICAgICAgICAgICAgICByYm0uY3JlYXRlUmVzb3VyY2UobnVsbCwgbnVsbCwgbnVsbCwgZW5jb2RpbmcsIG51bGwsIG51bGwsIG51bGwsIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9maWxlX2NvbmZsaWN0X2dlbmVyYXRlX2VtcHR5IikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJibS5jcmVhdGVSZXNvdXJjZShudWxsLCBudWxsLCBudWxsLCBlbmNvZGluZywgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBndWkudXBkYXRlRGlzcGxheVRyZWUoKTsKKyAgICB9CisJCisgICAgLy8gUmV0dXJucyBhbiBpbnRlZ2VyIG1hc2sgZGVzY3JpYmluZyB0aGUgdXNlcidzIHNlbGVjdGlvbiBmb3IgZmlsZSByZXNvbHZpbmcgbWlzc2luZyBmaWxlIGxvY2FsZSBjb25mbGljdHMKKwkKKyAgICBwcml2YXRlIGludCBnZXRGaWxlQ29uZmxpY3RPcHRpb24oKSB7CisgICAgICAgIGlmIChmaWxlR2VuZXJhdGVQb3B1bGF0ZVJhZGlvLmlzU2VsZWN0ZWQoKSkgcmV0dXJuIEZJTEVfT1BUSU9OX1BPUFVMQVRFOworICAgICAgICBpZiAoZmlsZUdlbmVyYXRlRW1wdHlSYWRpby5pc1NlbGVjdGVkKCkpIHJldHVybiBGSUxFX09QVElPTl9FTVBUWTsKKyAgICAgICAgaWYgKGZpbGVJZ25vcmVSYWRpby5pc1NlbGVjdGVkKCkpIHJldHVybiBGSUxFX09QVElPTl9JR05PUkU7CisgICAgICAgIGlmIChmaWxlUHJvbXB0UmFkaW8uaXNTZWxlY3RlZCgpKSByZXR1cm4gRklMRV9PUFRJT05fUFJPTVBUOworICAgICAgICByZXR1cm4gRklMRV9PUFRJT05fUFJPTVBUOworICAgIH0KKwkKKyAgICAvLyBSZXR1cm5zIGFuIGludGVnZXIgbWFzayBkZXNjcmliaW5nIHRoZSB1c2VyJ3Mgc2VsZWN0aW9uIGZvciBkdXBsaWNhdGUgcmVzb3VyY2Uga2V5IGNvbmZsaWN0cworCQorICAgIHByaXZhdGUgaW50IGdldFJlc291cmNlQ29uZmxpY3RPcHRpb24oKSB7CisgICAgICAgIGlmIChyZXNvdXJjZU92ZXJ3cml0ZVJhZGlvLmlzU2VsZWN0ZWQoKSkgcmV0dXJuIFJFU09VUkNFX09QVElPTl9PVkVSV1JJVEU7CisgICAgICAgIGlmIChyZXNvdXJjZUlnbm9yZVJhZGlvLmlzU2VsZWN0ZWQoKSkgcmV0dXJuIFJFU09VUkNFX09QVElPTl9JR05PUkU7CisgICAgICAgIGlmIChyZXNvdXJjZVByb21wdFJhZGlvLmlzU2VsZWN0ZWQoKSkgcmV0dXJuIFJFU09VUkNFX09QVElPTl9QUk9NUFQ7CisgICAgICAgIHJldHVybiBSRVNPVVJDRV9PUFRJT05fUFJPTVBUOworICAgIH0KKwkKKyAgICAvLyBSZXR1cm5zIHRoZSBncm91cCBuYW1lIGZvciB1c2Ugd2hlbiBubyBncm91cCBuYW1lIGlzIHNwZWNpZmllZAorCQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEdyb3VwKCkgeworICAgICAgICByZXR1cm4gZ3JvdXBDb21ib0JveC5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOworICAgIH0KKwkKKyAgICAvLyBSZXR1cm5zIHRoZSBkZWZhdWx0IHRyYW5zbGF0aW9uIHZhbHVlCisJCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RGVmYXVsdFRyYW5zbGF0ZWQoKSB7CisgICAgICAgIHJldHVybiBtYXJrVHJhbnNsYXRlZENoZWNrLmlzU2VsZWN0ZWQoKTsKKyAgICB9CisJCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIGdyb3VwIG9mIG5hbWUgbm9uLWV4aXN0YW50IGluIHRoZSBhY3RpdmUgYnVuZGxlIGlzIGNyZWF0ZWQKKwkKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXREZWZhdWx0R3JvdXBDcmVhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUdyb3Vwc0NoZWNrLmlzU2VsZWN0ZWQoKTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgc2hvd1Byb2dyZXNzQmFyKGludCBzdGVwcykgeworICAgICAgICB0aGlzV2luZG93Q2xvc2luZygpOworICAgICAgICBKRGlhbG9nIHByb2dyZXNzQmFyRGlhbG9nID0gbmV3IEpEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfaW1wb3J0X3Byb2dyZXNzIiksIGZhbHNlKTsKKyAgICAgICAgSlByb2dyZXNzQmFyIHByb2dyZXNzQmFyID0gbmV3IEpQcm9ncmVzc0JhcigwLCBzdGVwcyk7CisgICAgICAgIHByb2dyZXNzQmFyLnNldFZhbHVlKDApOworICAgICAgICBwcm9ncmVzc0JhckRpYWxvZy5nZXRDb250ZW50UGFuZSgpLmFkZChwcm9ncmVzc0Jhcik7CisgICAgICAgIHByb2dyZXNzQmFyRGlhbG9nLnBhY2soKTsKKyAgICAgICAgcHJvZ3Jlc3NCYXJEaWFsb2cuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50UHJvZ3Jlc3NCYXIoKSB7CisgICAgICAgIGlmIChwcm9ncmVzc0JhciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIHByb2dyZXNzQmFyLnNldFZhbHVlKHByb2dyZXNzQmFyLmdldFZhbHVlKCkrMSk7CisgICAgICAgIGlmIChwcm9ncmVzc0Jhci5nZXRWYWx1ZSgpID09IHByb2dyZXNzQmFyLmdldE1heGltdW0oKSkgaGlkZVByb2dyZXNzQmFyKCk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIGhpZGVQcm9ncmVzc0JhcigpIHsKKyAgICAgICAgaWYgKHByb2dyZXNzQmFyRGlhbG9nICE9IG51bGwpIHByb2dyZXNzQmFyRGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSB2aXN1YWwgY29tcG9uZW50cyBmb3Igc2VsZWN0aW5nIGFuIGltcG9ydCBmaWxlIGFuZCBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIG9wdGlvbnMKKyAgICAgKi8KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKyAgICAgICAgLy8gQ3JlYXRlIENvbXBvbmVudHMKKyAgICAgICAgSkxhYmVsIHRpdGxlTGFiZWwgICAgICAgPSBuZXcgSkxhYmVsKHRpdGxlKTsKKyAgICAgICAgc291cmNlTGFiZWwgICAgICAgICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3NvdXJjZV9maWxlIiwiLS0iKSk7CisgICAgICAgIEpMYWJlbCBpbnNlcnRHcm91cExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9pbnNlcnRfZ3JvdXAiKSk7CisgICAgICAgIAorICAgICAgICBKQnV0dG9uIGZpbGVDaG9vc2VCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jaG9vc2UiKSk7CisgICAgICAgIEpCdXR0b24gY2FuY2VsQnV0dG9uICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NhbmNlbCIpKTsKKyAgICAgICAgSkJ1dHRvbiBpbXBvcnRCdXR0b24gICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25faW1wb3J0IikpOworICAgICAgICAKKyAgICAgICAgQnV0dG9uR3JvdXAgcmVzb3VyY2VHcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOworICAgICAgICBCdXR0b25Hcm91cCBmaWxlR3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKKwkJCisgICAgICAgIEpQYW5lbCB0b3BQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgSlBhbmVsIG1pZFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICBKUGFuZWwgYm90UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuUklHSFQpKTsKKyAgICAgICAgCisgICAgICAgIEpQYW5lbCB0b3BJbm5lclBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICAKKyAgICAgICAgQm94IG1pZEJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCQorICAgICAgICBKUGFuZWwgcmVzb3VyY2VQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisgICAgICAgIEpQYW5lbCBmaWxlUGFuZWwgICAgID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKKyAgICAgICAgSlBhbmVsIGRlZmF1bHRQYW5lbCAgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuTEVGVCkpOworICAgICAgICBKUGFuZWwgZGVmYXVsdFBhbmVsMiA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgCisgICAgICAgIEJveCByZXNvdXJjZUJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisgICAgICAgIEJveCBmaWxlQm94ICAgICA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisgICAgICAgIEJveCBncm91cEJveCAgICA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJCQorICAgICAgICAvLyBTZXR1cCB0aXRsZQorICAgICAgICB0aXRsZUxhYmVsLnNldEZvbnQobmV3IEZvbnQoIlNlcmlmIixGb250LkJPTEQsMTYpKTsKKwkJCisgICAgICAgIC8vIFNldHVwIHBhbmVscworICAgICAgICBtaWRQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfb3B0aW9ucyIpKSk7CisgICAgICAgIHJlc291cmNlUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0cyIpKSk7CisgICAgICAgIGZpbGVQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdHMiKSkpOworICAgICAgICBkZWZhdWx0UGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2RlZmF1bHRfdmFsdWVzIikpKTsKKwkJCisgICAgICAgIC8vIEFycmFuZ2UgYnV0dG9uIGdyb3VwcworICAgICAgICBmaWxlR3JvdXAuYWRkKGZpbGVHZW5lcmF0ZVBvcHVsYXRlUmFkaW8pOworICAgICAgICBmaWxlR3JvdXAuYWRkKGZpbGVHZW5lcmF0ZUVtcHR5UmFkaW8pOworICAgICAgICBmaWxlR3JvdXAuYWRkKGZpbGVJZ25vcmVSYWRpbyk7CisgICAgICAgIGZpbGVHcm91cC5hZGQoZmlsZVByb21wdFJhZGlvKTsKKyAgICAgICAgcmVzb3VyY2VHcm91cC5hZGQocmVzb3VyY2VPdmVyd3JpdGVSYWRpbyk7CisgICAgICAgIHJlc291cmNlR3JvdXAuYWRkKHJlc291cmNlSWdub3JlUmFkaW8pOworICAgICAgICByZXNvdXJjZUdyb3VwLmFkZChyZXNvdXJjZVByb21wdFJhZGlvKTsKKwkJCisgICAgICAgIC8vIEFkZCBhY3Rpb24gbGlzdGVuZXJzCisgICAgICAgIGNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworICAgICAgICAgICAgICAgIHRoaXNXaW5kb3dDbG9zaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCQkKKyAgICAgICAgaW1wb3J0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYmVnaW5JbXBvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZ3VpLnVwZGF0ZVByb2plY3RUcmVlKCk7CisgICAgICAgICAgICAgICAgICAgIGd1aS51cGRhdGVEaXNwbGF5VHJlZSgpOworICAgICAgICAgICAgICAgICAgICB0aGlzV2luZG93Q2xvc2luZygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIAlpb2UucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpICsgIlxuIiArIGlvZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCQkKKyAgICAgICAgZmlsZUNob29zZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworICAgICAgICAgICAgICAgIGNob29zZUZpbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisJCQorICAgICAgICAvLyBTZXR1cCBjb21ibyBib3gKKyAgICAgICAgQnVuZGxlIGJhc2VCdW5kbGUgPSAoKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmVsZW1lbnRBdCgwKSk7CisgICAgICAgIEJ1bmRsZUdyb3VwIHVuZ3JvdXBlZEdyb3VwID0gYmFzZUJ1bmRsZS5nZXRVbmdyb3VwZWRHcm91cCgpOworICAgICAgICBncm91cENvbWJvQm94ID0gbmV3IEpDb21ib0JveChiYXNlQnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCkpOworICAgICAgICBpbnQgZ3JvdXBDb21ib0JveENvdW50ID0gZ3JvdXBDb21ib0JveC5nZXRJdGVtQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgc2VsZWN0ZWRJbmRleCA9IDA7IHNlbGVjdGVkSW5kZXggPCBncm91cENvbWJvQm94Q291bnQ7IHNlbGVjdGVkSW5kZXgrKykgeworICAgICAgICAJQnVuZGxlR3JvdXAgYnVuZEdyb3VwID0gKChCdW5kbGVHcm91cClncm91cENvbWJvQm94LmdldEl0ZW1BdChzZWxlY3RlZEluZGV4KSk7CisgICAgICAgIAlpZiAoYnVuZEdyb3VwLmdldE5hbWUoKS5lcXVhbHModW5ncm91cGVkR3JvdXAuZ2V0TmFtZSgpKSkgeworICAgICAgICAJCS8vIEJ5IGRlZmF1bHQsIHVzZSB0aGUgdW5ncm91cGVkIGdyb3VwLiBQcm9iYWJseSBuYW1lZCAnVW5ncm91cGVkIEl0ZW1zJy4KKyAgICAgICAgCQlncm91cENvbWJvQm94LnNldFNlbGVjdGVkSW5kZXgoc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIAkJYnJlYWs7CisgICAgICAgIAl9CisgICAgICAgIH0KKwkJCisgICAgICAgIC8vIEFyYW5nZSBjb21wb25lbnRzCisgICAgICAgIGdyb3VwQm94LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7CisgICAgICAgIGdyb3VwQm94LmFkZChpbnNlcnRHcm91cExhYmVsKTsKKyAgICAgICAgZ3JvdXBCb3guYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworICAgICAgICBncm91cEJveC5hZGQoZ3JvdXBDb21ib0JveCk7CisJCQorICAgICAgICBkZWZhdWx0UGFuZWwyLmFkZChncm91cEJveCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAgZGVmYXVsdFBhbmVsMi5hZGQobWFya1RyYW5zbGF0ZWRDaGVjaywgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIGRlZmF1bHRQYW5lbDIuYWRkKGNyZWF0ZUdyb3Vwc0NoZWNrLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQkKKyAgICAgICAgZmlsZUJveC5hZGQoZmlsZUdlbmVyYXRlUG9wdWxhdGVSYWRpbyk7CisgICAgICAgIGZpbGVCb3guYWRkKGZpbGVHZW5lcmF0ZUVtcHR5UmFkaW8pOworICAgICAgICBmaWxlQm94LmFkZChmaWxlSWdub3JlUmFkaW8pOworICAgICAgICBmaWxlQm94LmFkZChmaWxlUHJvbXB0UmFkaW8pOworCQkKKyAgICAgICAgcmVzb3VyY2VCb3guYWRkKHJlc291cmNlT3ZlcndyaXRlUmFkaW8pOworICAgICAgICByZXNvdXJjZUJveC5hZGQocmVzb3VyY2VJZ25vcmVSYWRpbyk7CisgICAgICAgIHJlc291cmNlQm94LmFkZChyZXNvdXJjZVByb21wdFJhZGlvKTsKKwkJCisgICAgICAgIGRlZmF1bHRQYW5lbC5hZGQoZGVmYXVsdFBhbmVsMik7CisgICAgICAgIGZpbGVQYW5lbC5hZGQoZmlsZUJveCk7CisgICAgICAgIHJlc291cmNlUGFuZWwuYWRkKHJlc291cmNlQm94KTsKKwkJCisgICAgICAgIG1pZEJveC5hZGQocmVzb3VyY2VQYW5lbCk7CisgICAgICAgIG1pZEJveC5hZGQoZmlsZVBhbmVsKTsKKyAgICAgICAgbWlkQm94LmFkZChkZWZhdWx0UGFuZWwpOworICAgICAgICAgICAgCisgICAgICAgIG1pZFBhbmVsLmFkZChtaWRCb3gsIEJvcmRlckxheW91dC5DRU5URVIpOworCQkKKyAgICAgICAgdG9wSW5uZXJQYW5lbC5hZGQoc291cmNlTGFiZWwsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICB0b3BJbm5lclBhbmVsLmFkZChmaWxlQ2hvb3NlQnV0dG9uLCBCb3JkZXJMYXlvdXQuRUFTVCk7CisJCQorICAgICAgICB0b3BQYW5lbC5hZGQodGl0bGVMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAgdG9wUGFuZWwuYWRkKHRvcElubmVyUGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOworCQkKKyAgICAgICAgYm90UGFuZWwuYWRkKGNhbmNlbEJ1dHRvbik7CisgICAgICAgIGJvdFBhbmVsLmFkZChpbXBvcnRCdXR0b24pOworCQkKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQodG9wUGFuZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKG1pZFBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoYm90UGFuZWwsIEJvcmRlckxheW91dC5TT1VUSCk7CisJCQorICAgICAgICBwYWNrKCk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHRoaXNXaW5kb3dDbG9zaW5nKCkgeworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZGlzcG9zZSgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJKYXZhRXhwb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQkphdmFFeHBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjQ4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJKYXZhRXhwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIEFuIGV4cG9ydGVyIHBsdWctaW4gY2xhc3MgZm9yIFJCTWFuYWdlci4gVGhlIHJlc291cmNlcyBleHBvcnRlZCBoZXJlIGNvbmZvcm0gdG8KKyAqIHRoZSBKYXZhIHN0YW5kYXJkIGZvciBSZXNvdXJjZSBCdW5kbGVzIGFzIHNwZWNpZmllZCBpbiBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlLgorICogVGhlIG91dHB1dCBmaWxlcyBhcmUgY29tcGlsYWJsZSBqYXZhIGZpbGVzIHRoYXQgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55CisgKiBwYWNrYWdlLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQkphdmFFeHBvcnRlciBleHRlbmRzIFJCRXhwb3J0ZXIgeworICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHVibGljQ2xhc3MgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBwdWJsaWNNZXRob2RzID0gdHJ1ZTsKKwkKKwkKKyAgICBwdWJsaWMgUkJKYXZhRXhwb3J0ZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisJCQorICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmaWxlIGNob29zZXIgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChjaG9vc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisgICAgICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkphdmEgU291cmNlIEZpbGVzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpICYmIGYuZ2V0TmFtZSgpLmluZGV4T2YoIl8iKSA8IDApIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgcHVibGljIHZvaWQgZXhwb3J0KFJCTWFuYWdlciByYm0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyYm0gPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAvLyBPcGVuIHRoZSBhZGRpdGlvbmFsIERpYWxvZworICAgICAgICBSQkphdmFFeHBvcnRlckRpYWxvZyBwYXJhbWV0ZXJzRGlhbG9nID0gbmV3IFJCSmF2YUV4cG9ydGVyRGlhbG9nKCk7CisgICAgICAgIHBhY2thZ2VOYW1lID0gcGFyYW1ldGVyc0RpYWxvZy5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBwdWJsaWNDbGFzcyA9IHBhcmFtZXRlcnNEaWFsb2cuaXNDbGFzc1B1YmxpYygpOworICAgICAgICBwdWJsaWNNZXRob2RzID0gcGFyYW1ldGVyc0RpYWxvZy5pc01ldGhvZHNQdWJsaWMoKTsKKwkJCisgICAgICAgIC8vIE9wZW4gdGhlIFNhdmUgRGlhbG9nCisgICAgICAgIGludCByZXRfdmFsID0gY2hvb3Nlci5zaG93U2F2ZURpYWxvZyhudWxsKTsKKyAgICAgICAgaWYgKHJldF92YWwgIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSByZXR1cm47CisgICAgICAgIC8vIFJldHJpZXZlIGJhc2ljIGZpbGUgaW5mb3JtYXRpb24KKyAgICAgICAgRmlsZSBmaWxlID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlsZShzKSB3ZSB3aWxsIGJlIHdvcmtpbmcgd2l0aAorICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50KCkpOyAgICAgICAgICAgIC8vIFRoZSBkaXJlY3Rvcnkgd2Ugd2lsbCBiZSB3cml0aW5nIHRvCisgICAgICAgIFN0cmluZyBiYXNlX25hbWUgPSBmaWxlLmdldE5hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgbmFtZSBvZiB0aGUgZmlsZXMgd2Ugd2lsbCB3cml0ZQorICAgICAgICBpZiAoYmFzZV9uYW1lID09IG51bGwgfHwgYmFzZV9uYW1lLmVxdWFscygiIikpIGJhc2VfbmFtZSA9IHJibS5nZXRCYXNlQ2xhc3MoKTsKKyAgICAgICAgaWYgKGJhc2VfbmFtZS5lbmRzV2l0aCgiLmphdmEiKSkgYmFzZV9uYW1lID0gYmFzZV9uYW1lLnN1YnN0cmluZygwLGJhc2VfbmFtZS5sZW5ndGgoKS01KTsKKwkJCisgICAgICAgIFZlY3RvciBidW5kbGVfdiA9IHJibS5nZXRCdW5kbGVzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZV92LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVfdi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBTdHJpbmcgYmFzZV9lbmMgPSBiYXNlX25hbWU7CisgICAgICAgICAgICBpZiAoYnVuZGxlLmVuY29kaW5nICE9IG51bGwgJiYgIWJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoIiIpKSBiYXNlX2VuYyA9IGJhc2VfZW5jICsgIl8iICsgYnVuZGxlLmVuY29kaW5nOworICAgICAgICAgICAgU3RyaW5nIGZpbGVfbmFtZSA9IGJhc2VfZW5jICsgIi5qYXZhIjsKKwkJCQorICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi8qIEZpbGU6ICAgICIgKyBmaWxlX25hbWUgKyAiXG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAqIERhdGU6ICAgICIgKyAobmV3IERhdGUoKSkgKyAiXG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAqIENvbW1lbnQ6IFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgUkJNYW5hZ2VyIiArICJcbiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICovXG5cbiIpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7XG5cbiIpOworICAgICAgICAgICAgfQkKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlO1xuXG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKHB1YmxpY0NsYXNzID8gInB1YmxpYyAiIDogInByb3RlY3RlZCAiKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJjbGFzcyAiICsgYmFzZV9lbmMgKyAiIGV4dGVuZHMgTGlzdFJlc291cmNlQnVuZGxlIHtcbiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHQiICsgKHB1YmxpY01ldGhvZHMgPyAicHVibGljIiA6ICJwcm90ZWN0ZWQiKSArICIgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHtcbiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHRcdHJldHVybiBjb250ZW50cztcbiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHR9XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0cHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHtcbiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHQvLyBMT0NBTElaRSBUSElTXG4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVmVjdG9yIGdyb3VwX3YgPSBidW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGdyb3VwX3Yuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClncm91cF92LmVsZW1lbnRBdChqKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgaXRlbV92ID0gZ3JvdXAuZ2V0SXRlbXNBc1ZlY3RvcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgayA8IGl0ZW1fdi5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtX3YuZWxlbWVudEF0KGspOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcdFx0e1wiIiArIGl0ZW0uZ2V0S2V5KCkgKyAiXCIsIFwiIiArIGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSArICJcIn0sXHQvLyAiICsgaXRlbS5nZXRDb21tZW50KCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICB9IC8vIGVuZCBmb3IgLSBrCisgICAgICAgICAgICB9IC8vIGVuZCBmb3IgLSBqCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0Ly8gRU5EIE9GIE1BVEVSSUFMIFRPIExPQ0FMSVpFXG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0fTtcbiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgifSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGZpbGUKKyAgICAgICAgICAgIEZpbGUgd3JpdGVfZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZV9uYW1lKTsKKyAgICAgICAgICAgIEZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIod3JpdGVfZmlsZSk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgfSAvLyBlbmQgZm9yIC0gaQorICAgIH0KK30KKworY2xhc3MgUkJKYXZhRXhwb3J0ZXJEaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIHsKKyAgICBKQ2hlY2tCb3ggcGFja2FnZUNoZWNrOworICAgIEpSYWRpb0J1dHRvbiBjbGFzc1B1YmxpY1JhZGlvOworICAgIEpSYWRpb0J1dHRvbiBjbGFzc1Byb3RlY3RlZFJhZGlvOworICAgIEpSYWRpb0J1dHRvbiBtZXRob2RzUHVibGljUmFkaW87CisgICAgSlJhZGlvQnV0dG9uIG1ldGhvZHNQcm90ZWN0ZWRSYWRpbzsKKyAgICBKVGV4dEZpZWxkIHBhY2thZ2VGaWVsZDsKKwkKKyAgICBwdWJsaWMgUkJKYXZhRXhwb3J0ZXJEaWFsb2coKSB7CisgICAgICAgIHN1cGVyKG5ldyBKRnJhbWUoKSwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZXhwb3J0X2phdmFfb3B0aW9ucyIpLCB0cnVlKTsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisJCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgaWYgKCEocGFja2FnZUNoZWNrLmlzU2VsZWN0ZWQoKSkpIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcmV0VmFsID0gcGFja2FnZUZpZWxkLmdldFRleHQoKTsKKyAgICAgICAgaWYgKHJldFZhbCA9PSBudWxsIHx8IHJldFZhbC50cmltKCkuZXF1YWxzKCIiKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiByZXRWYWwudHJpbSgpOworICAgIH0KKwkKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzUHVibGljKCkgewkKKyAgICAgICAgcmV0dXJuIGNsYXNzUHVibGljUmFkaW8uaXNTZWxlY3RlZCgpOwkKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RzUHVibGljKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kc1B1YmxpY1JhZGlvLmlzU2VsZWN0ZWQoKTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNsb3NlKCkgeworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZGlzcG9zZSgpOworICAgIH0KKwkKKyAgICBwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkucmVtb3ZlQWxsKCk7CisJCQorICAgICAgICBwYWNrYWdlQ2hlY2sgPSBuZXcgSkNoZWNrQm94KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXhwb3J0X2phdmFfcGFja2FnZSIpLCBmYWxzZSk7CisgICAgICAgIGNsYXNzUHVibGljUmFkaW8gPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXhwb3J0X2phdmFfY2xhc3NfcHVibGljIiksIHRydWUpOworICAgICAgICBjbGFzc1Byb3RlY3RlZFJhZGlvID0gbmV3IEpSYWRpb0J1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImV4cG9ydF9qYXZhX2NsYXNzX3Byb3RlY3RlZCIpLCBmYWxzZSk7CisgICAgICAgIG1ldGhvZHNQdWJsaWNSYWRpbyA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJleHBvcnRfamF2YV9jbGFzc19wdWJsaWMiKSwgdHJ1ZSk7CisgICAgICAgIG1ldGhvZHNQcm90ZWN0ZWRSYWRpbyA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJleHBvcnRfamF2YV9jbGFzc19wcm90ZWN0ZWQiKSwgZmFsc2UpOworICAgICAgICBwYWNrYWdlRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOworICAgICAgICBwYWNrYWdlRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCQorICAgICAgICBKQnV0dG9uIG9rQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJPSyIpKTsKKyAgICAgICAgSkxhYmVsIHRpdGxlTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXhwb3J0X2phdmFfdGl0bGUiKSwgU3dpbmdDb25zdGFudHMuTEVGVCk7CisJCQorICAgICAgICBKUGFuZWwgb2tQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICAgICAgb2tQYW5lbC5hZGQob2tCdXR0b24pOworICAgICAgICBKUGFuZWwgY2VudGVyUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsMSkpOworICAgICAgICBjZW50ZXJQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihCZXZlbEJvcmRlci5SQUlTRUQpKTsKKyAgICAgICAgQm94IGNlbnRlckJveCA9IEJveC5jcmVhdGVWZXJ0aWNhbEJveCgpOworICAgICAgICBCb3ggcGFja2FnZUJveCA9IEJveC5jcmVhdGVIb3Jpem9udGFsQm94KCk7CisgICAgICAgIHBhY2thZ2VCb3guYWRkKHBhY2thZ2VDaGVjayk7CisgICAgICAgIHBhY2thZ2VCb3guYWRkKHBhY2thZ2VGaWVsZCk7CisgICAgICAgIGNlbnRlckJveC5hZGQocGFja2FnZUJveCk7CisgICAgICAgIGNlbnRlckJveC5hZGQobmV3IEpTZXBhcmF0b3IoKSk7CisgICAgICAgIGNlbnRlckJveC5hZGQoY2xhc3NQdWJsaWNSYWRpbyk7CisgICAgICAgIGNlbnRlckJveC5hZGQoY2xhc3NQcm90ZWN0ZWRSYWRpbyk7CisgICAgICAgIGNlbnRlckJveC5hZGQobmV3IEpTZXBhcmF0b3IoKSk7CisgICAgICAgIGNlbnRlckJveC5hZGQobWV0aG9kc1B1YmxpY1JhZGlvKTsKKyAgICAgICAgY2VudGVyQm94LmFkZChtZXRob2RzUHJvdGVjdGVkUmFkaW8pOworICAgICAgICBjZW50ZXJQYW5lbC5hZGQoY2VudGVyQm94KTsKKwkJCisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKHRpdGxlTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKG9rUGFuZWwsIEJvcmRlckxheW91dC5TT1VUSCk7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGNlbnRlclBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCisgICAgICAgIG9rQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisJCQorICAgICAgICBCdXR0b25Hcm91cCBjbGFzc0dyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7CisgICAgICAgIEJ1dHRvbkdyb3VwIG1ldGhvZHNHcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOworICAgICAgICBjbGFzc0dyb3VwLmFkZChjbGFzc1B1YmxpY1JhZGlvKTsKKyAgICAgICAgY2xhc3NHcm91cC5hZGQoY2xhc3NQcm90ZWN0ZWRSYWRpbyk7CisgICAgICAgIG1ldGhvZHNHcm91cC5hZGQobWV0aG9kc1B1YmxpY1JhZGlvKTsKKyAgICAgICAgbWV0aG9kc0dyb3VwLmFkZChtZXRob2RzUHJvdGVjdGVkUmFkaW8pOworCQkKKyAgICAgICAgLy92YWxpZGF0ZVRyZWUoKTsKKyAgICAgICAgcGFjaygpOworICAgICAgICAvL3NldExvY2F0aW9uKG5ldyBQb2ludCgyNSwyNSkpOworICAgICAgICBzZXRWaXNpYmxlKHRydWUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJKYXZhSW1wb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQkphdmFJbXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmZmZTgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJKYXZhSW1wb3J0ZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKKworaW1wb3J0IGphdmEuaW8uKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLmd1aS5SQk1hbmFnZXJHVUk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzIGZvciBhbGwgaW1wb3J0ZXIgcGx1Zy1pbiBjbGFzc2VzLiBBcyBvZiB5ZXQsIHRoZXJlCisgKiBpcyBsaXR0bGUgY29udGFpbmVkIGluIHRoaXMgY2xhc3MuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCSmF2YUltcG9ydGVyIGV4dGVuZHMgUkJJbXBvcnRlciB7CisJCisgICAgcHVibGljIFJCSmF2YUltcG9ydGVyKFN0cmluZyB0aXRsZSwgUkJNYW5hZ2VyIHJibSwgUkJNYW5hZ2VyR1VJIGd1aSkgeworICAgICAgICBzdXBlcih0aXRsZSwgcmJtLCBndWkpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZpbGVDaG9vc2VyKCkgeworICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpICYmIGYuZ2V0TmFtZSgpLmluZGV4T2YoIl8iKSA8IDApIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKwkJCQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfamF2YV9maWxlX2Rlc2NyaXB0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBiZWdpbkltcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmJlZ2luSW1wb3J0KCk7CisgICAgICAgIExpc3RSZXNvdXJjZUJ1bmRsZSBiYXNlX2xyYiA9IG51bGw7CisgICAgICAgIFVSTENsYXNzTG9hZGVyIHVybExvYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGJhc2VGaWxlID0gZ2V0Q2hvc2VuRmlsZSgpOworICAgICAgICAgICAgVVJMIGJhc2VVUkwgPSBiYXNlRmlsZS50b1VSTCgpOworICAgICAgICAgICAgVVJMIHVybHNbXSA9IG5ldyBVUkxbMV07CisgICAgICAgICAgICB1cmxzWzBdID0gYmFzZVVSTDsKKyAgICAgICAgICAgIHVybExvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcih1cmxzKTsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IGJhc2VGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsIGJhc2VOYW1lLmluZGV4T2YoIi5jbGFzcyIpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ2xhc3MgYmFzZUNsYXNzID0gdXJsTG9hZGVyLmxvYWRDbGFzcyhiYXNlTmFtZSk7CisgICAgICAgICAgICBiYXNlX2xyYiA9IChMaXN0UmVzb3VyY2VCdW5kbGUpYmFzZUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFJCTWFuYWdlckdVSS5kZWJ1Z01zZyhlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFzZV9scmIgIT0gbnVsbCkgeworICAgICAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGJhc2VfbHJiLmdldEtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGtleXMubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIFJCTWFuYWdlckdVSS5kZWJ1Z01zZygiUmVzb3VyY2UgLT4gIiArIGtleSArICIgPSAiICsgYmFzZV9scmIuZ2V0U3RyaW5nKGtleSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorY2xhc3MgbXlDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKKyAgICBwdWJsaWMgbXlDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisJCisgICAgcHVibGljIENsYXNzIG15RGVmaW5lQ2xhc3MoU3RyaW5nIG5hbWUsIGJ5dGUgYXJyYXlbXSwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICByZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MobmFtZSwgYXJyYXksIG9mZiwgbGVuKTsKKyAgICB9Cit9CisqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCTWFuYWdlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDdhNzAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5NDYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7CisKK2ltcG9ydCBjb20uaWJtLnJibS5ndWkuUkJNYW5hZ2VyR1VJOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyB0byBhaWQgaW4gdGhlIHByb2Nlc3Mgb2YgdXBkYXRpbmcgdGhlIE5hdHVyYWwgTGFuZ3VhZ2UgU3VwcG9ydCBvZiBUZW1wdXMgRnVnaXQuCisgKiBUaGlzIGNsYXNzIHNjYW5zIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBOTFMgZmlsZXMgYW5kIGNoZWNrcyB0aGUgdmFyaW91cyBsYW5ndWFnZXMgZm91bmQgdGhlcmUKKyAqIGZvciBjb21wbGV0ZW5lc3MsIGR1cGxpY2F0aW9uIG9mIGVudHJ5LCBhbmQgc3RhdHVzIG9mIHRyYW5zbGF0aW9uLiBUaGUgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZAorICogdGhyb3VnaCBhIGNvbnN0cnVjdG9yLCBvciBpdCBjYW4gYmUgcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlCisgKiBjb21tYW5kIGxpbmUgcmVzdWx0cywgc2VlIHRoZSA8Q09ERT5tYWluPC9DT0RFPiBtZXRob2QuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCTWFuYWdlciB7CisJCisgICAgLy8gKioqIERBVEEgKioqCisgICAgcHJpdmF0ZSBWZWN0b3IgYWxsQnVuZGxlS2V5czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBWZWN0b3Igb2YgU3RyaW5ncyB3aXRoIGFsbCBkZWZpbmVkIE5MUyBwcm9wZXJ0aWVzCisgICAgcHJpdmF0ZSBWZWN0b3IgYnVuZGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgVmVjdG9yIG9mIE5MU2J1bmRsZXMsIG9uZSBmb3IgZWFjaCBsYW5ndWFnZQorICAgIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRVc2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwZXJzb24gY3VycmVudGx5IHVzaW5nIHRoZSBlZGl0b3IKKyAgICBwcml2YXRlIFN0cmluZyBiYXNlQ2xhc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgYmFzZSBjbGFzcyBvZiB0aGUgYWN0aXZlIHJlc291cmNlIGJ1bmRsZQorICAgIHByaXZhdGUgRmlsZSAgIGN1cnJlbnREaXJlY3Rvcnk7CisJCisgICAgLy8gKioqIENPTlNUUlVDVE9SUyAqKioKKwkKKyAgICAvLyBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBub3QgcHVibGljbHkgYXZhaWxhYmxlCisgICAgcHJpdmF0ZSBSQk1hbmFnZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBMb29rIGFuZCBGZWVsIGNoZWNrCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYWYgPSBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJsb29rYW5kZmVlbCIpOworICAgICAgICAgICAgICAgIGlmICghbGFmLmVxdWFscygiIikpIFVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChsYWYpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCisgICAgICAgICAgICAgICAgLy8gSWdub3JlZAorICAgICAgICAgICAgfQorCQkJCisgICAgICAgICAgICBSZXNvdXJjZXMuaW5pdEJ1bmRsZSgpOworICAgICAgICAgICAgUkJNYW5hZ2VyR1VJIGd1aUZyYW1lID0gbmV3IFJCTWFuYWdlckdVSSgpOworICAgICAgICAgICAgaWYgKCFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJ1c2VybmFtZSIpLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgZ3VpRnJhbWUuc2V0VXNlcihQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJ1c2VybmFtZSIpKTsKKyAgICAgICAgICAgIGlmICghUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgibG9jYWxlIikuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbGVTdHIgPSBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJsb2NhbGUiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBSZXNvdXJjZXMuZ2V0TGFuZ3VhZ2UobG9jYWxlU3RyKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IFJlc291cmNlcy5nZXRDb3VudHJ5KGxvY2FsZVN0cik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhcmlhbnQgPSBSZXNvdXJjZXMuZ2V0VmFyaWFudChsb2NhbGVTdHIpOworICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlLmVxdWFscygiIikgfHwgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAzKSBsYW5ndWFnZSA9ICJlbiI7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50cnkgPT0gbnVsbCkgY291bnRyeSA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFyaWFudCA9PSBudWxsKSBSZXNvdXJjZXMuc2V0TG9jYWxlKG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpKTsKKyAgICAgICAgICAgICAgICBlbHNlIFJlc291cmNlcy5zZXRMb2NhbGUobmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVzb3VyY2VzLmluaXRCdW5kbGUoKTsKKyAgICAgICAgICAgIGd1aUZyYW1lLmluaXRDb21wb25lbnRzKCk7CisgICAgICAgICAgICBndWlGcmFtZS5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gZW50aXJlbHkgYmxhbmsgUkJNYW5hZ2VyIGFuZCBiYXNlIEJ1bmRsZS4gT25seSB0aGUgYmFzZSBjbGFzcyBuYW1lIGlzIGRlZmluZWQuCisgICAgICogQWxsIG90aGVyIHByb3BlcnRpZXMgbmVlZCB0byBiZSBkZWZpbmVkLgorICAgICAqLworCQorICAgIHB1YmxpYyBSQk1hbmFnZXIoU3RyaW5nIGJhc2VDbGFzc05hbWUpIHsKKyAgICAgICAgYWxsQnVuZGxlS2V5cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYnVuZGxlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgY3VycmVudFVzZXIgPSAiVW5rbm93biI7CisgICAgICAgIGJhc2VDbGFzcyA9IGJhc2VDbGFzc05hbWU7CisgICAgICAgIGN1cnJlbnREaXJlY3RvcnkgPSBuZXcgRmlsZSgiIik7CisJCQorICAgICAgICBCdW5kbGUgbWFpbkJ1bmRsZSA9IG5ldyBCdW5kbGUoIiIpOworICAgICAgICAvLyBDcmVhdGUgYSBkZWZhdWx0IGdyb3VwCisgICAgICAgIG1haW5CdW5kbGUuYWRkQnVuZGxlR3JvdXAoIlVuZ3JvdXBlZCBJdGVtcyIsICJUaGVzZSBhcmUgcmVzb3VyY2UgaXRlbXMgdGhhdCBoYXZlIG5vdCBiZWVuIGFzc2lnbmVkIGEgZ3JvdXAiKTsKKyAgICAgICAgYnVuZGxlcy5hZGRFbGVtZW50KG1haW5CdW5kbGUpOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvciBmb3IgUkJNYW5hZ2VyLiBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSByb290IG9mIGEgcmVzb3VyY2UgYnVuZGxlLgorICAgICAqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBlYWNoIGZpbGUgaXMgcGFyc2VkIHNlcGFyYXRlbHkgc3RhcnRpbmcgd2l0aCB0aGUgYmFzZSBjbGFzcyBmaWxlIChyb290KS4KKyAgICAgKiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgbG9va3VwIGtleXMgYXJlIHJlcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBmaWxlcy4gVGhlCisgICAgICogdHJhbnNsYXRpb24gdmFsdWVzIGhvd2V2ZXIgYXJlIHRyYW5zbGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBiYXNpYyBydWxlcyBkZWZpbmVkIGluIGphdmEudXRpbC5Qcm9wZXJ0aWVzLgorICAgICAqIFRodXMgaW4gdGhlIGtleSwgdGhlIHVzZXIgbWF5IHNlZSAnXCInIHdoZW4gaW4gdGhlIHZhbHVlIGl0IHdvdWxkIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gJyInLiBUaGlzCisgICAgICogdHJhbnNsYXRpb24gaXMgcmV2ZXJzZWQgd2hlbiBzYXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0gbWFpbkZpbGUgVGhlIGJhc2UgY2xhc3MgZmlsZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIGJlIHJlYWQKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgUkJNYW5hZ2VyKEZpbGUgbWFpbkZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdCgpOworCQkKKyAgICAgICAgY3VycmVudERpcmVjdG9yeSA9IG5ldyBGaWxlKG1haW5GaWxlLmdldFBhcmVudCgpKTsKKwkJCisgICAgICAgIFN0cmluZ1tdIGVuY29kaW5nczsKKwkJCisgICAgICAgIC8vIEluaXRpYWlsaXplIHRoZSByZWFkZXJzIHRvIHRoZSBtYWluIE5MUyBmaWxlCisgICAgICAgIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihtYWluRmlsZSk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKKwkJCisgICAgICAgIC8vIExvYWQgdGhlIGphdmEgcmVhZGFibGUgdmFsdWVzIGZyb20gdGhlIG1haW4gTkxTIGZpbGU7CisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKG1haW5GaWxlKSk7CisJCQorICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxhbmd1YWdlIGZpbGVzIGFuZCBzZXQgdXAgdGhlIGVuY29kaW5nIGFuZCBkaWN0aW9uYXJ5IGRhdGEKKyAgICAgICAgaW50IG51bUxhbmd1YWdlcyA9IDE7CisgICAgICAgIFN0cmluZyBOTFNiYXNlQ2xhc3MgPSBudWxsOworICAgICAgICBTdHJpbmcgTkxTcG9zdGZpeCAgID0gbnVsbDsKKwkJCisgICAgICAgIGlmIChtYWluRmlsZS5nZXROYW1lKCkuaW5kZXhPZigiLiIpID49IDApIHsKKyAgICAgICAgICAgIE5MU2Jhc2VDbGFzcyA9IG1haW5GaWxlLmdldE5hbWUoKS5zdWJzdHJpbmcoMCxtYWluRmlsZS5nZXROYW1lKCkuaW5kZXhPZigiLiIpKTsKKyAgICAgICAgICAgIE5MU3Bvc3RmaXggPSAiLnByb3BlcnRpZXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTkxTYmFzZUNsYXNzID0gbWFpbkZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgTkxTcG9zdGZpeCA9ICIiOworICAgICAgICB9CisJCQorICAgICAgICBiYXNlQ2xhc3MgPSBOTFNiYXNlQ2xhc3M7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZmlsZVByZWZpeCA9IG1haW5GaWxlLmdldE5hbWUoKS5zdWJzdHJpbmcoMCxtYWluRmlsZS5nZXROYW1lKCkubGFzdEluZGV4T2YoIi4iKSk7CisgICAgICAgIFN0cmluZyBmaWxlUG9zdGZpeCA9IG1haW5GaWxlLmdldE5hbWUoKS5zdWJzdHJpbmcobWFpbkZpbGUuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCIuIiksbWFpbkZpbGUuZ2V0TmFtZSgpLmxlbmd0aCgpKTsKKyAgICAgICAgRmlsZSByZXNEaXIgPSBjdXJyZW50RGlyZWN0b3J5OworICAgICAgICBpZiAocmVzRGlyICE9IG51bGwgJiYgcmVzRGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHRlbXAgPSByZXNEaXIubGlzdCgpOworICAgICAgICAgICAgbnVtTGFuZ3VhZ2VzID0gMDsKKyAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGFuZ3VhZ2UgZmlsZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0ZW1wW2ldLnN0YXJ0c1dpdGgoTkxTYmFzZUNsYXNzKSAmJiAodGVtcFtpXS5lbmRzV2l0aChOTFNwb3N0Zml4KSAKKyAgICAgICAgICAgICAgICAgICAgfHwgdGVtcFtpXS5lbmRzV2l0aChOTFNwb3N0Zml4LnRvVXBwZXJDYXNlKCkpIHx8IE5MU3Bvc3RmaXguZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnRzIHdpdGggdGhlIGJhc2UgY2xhc3MgbmFtZSBhbmQgZW5kcyBpbiBwcm9wZXIgc3VmZml4IChhYm92ZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gQmFzZSBuYW1lIGlzIGZvbGxvd2VkIGJ5IC4gb3IgXyAoYmVsb3cpCisgICAgICAgICAgICAgICAgICAgIFJCTWFuYWdlckdVSS5kZWJ1Z01zZygiQ2hhcmFjdGVyIGlzOiAiICsgdGVtcFtpXS5jaGFyQXQoTkxTYmFzZUNsYXNzLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2ldLmNoYXJBdChOTFNiYXNlQ2xhc3MubGVuZ3RoKCkpID09ICcuJyB8fCB0ZW1wW2ldLmNoYXJBdChOTFNiYXNlQ2xhc3MubGVuZ3RoKCkpID09ICdfJykKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUxhbmd1YWdlcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGJ1bmRsZXMgYW5kIGVuY29kaW5ncworICAgICAgICAgICAgZW5jb2RpbmdzID0gbmV3IFN0cmluZ1tudW1MYW5ndWFnZXNdOworCQkJCisgICAgICAgICAgICBpbnQgY291bnQgPSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBbaV0uZXF1YWxzKG1haW5GaWxlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzWzBdID0gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wW2ldLnN0YXJ0c1dpdGgoTkxTYmFzZUNsYXNzKSAmJiAodGVtcFtpXS5lbmRzV2l0aChOTFNwb3N0Zml4KSAKKyAgICAgICAgICAgICAgICAgICAgfHwgdGVtcFtpXS5lbmRzV2l0aChOTFNwb3N0Zml4LnRvVXBwZXJDYXNlKCkpIHx8IE5MU3Bvc3RmaXguZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBbaV0uY2hhckF0KE5MU2Jhc2VDbGFzcy5sZW5ndGgoKSkgPT0gJy4nIHx8IHRlbXBbaV0uY2hhckF0KE5MU2Jhc2VDbGFzcy5sZW5ndGgoKSkgPT0gJ18nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3NbY291bnRdID0gbmV3IFN0cmluZyh0ZW1wW2ldLnN1YnN0cmluZyhmaWxlUHJlZml4Lmxlbmd0aCgpKzEsdGVtcFtpXS5pbmRleE9mKGZpbGVQb3N0Zml4KSkpOwkJCQkJCQljb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYnVuZGxlcyBhbmQgZW5jb2RpbmdzIGluIGNhc2UgdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIG9ubHkgdGhlIG1haW4gTkxTIGZpbGUgd2lsbCBiZSBoYW5kbGVkCisgICAgICAgICAgICBlbmNvZGluZ3MgPSBuZXcgU3RyaW5nW251bUxhbmd1YWdlc107CisgICAgICAgICAgICBlbmNvZGluZ3NbMF0gPSBuZXcgU3RyaW5nKCIiKTsKKyAgICAgICAgfSAvLyBlbmQgdGhlIGNvdW50IGFuZCBpbml0aWFsaXphdGlvbgorCQkKKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgZW50cmllcyBmcm9tIHRoZSBtYWluIGZpbGUKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIC8vIFNldCB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIG1haW4gZmlsZQorICAgICAgICBCdW5kbGUgZGljdCA9IG5ldyBCdW5kbGUoZW5jb2RpbmdzWzBdKTsKKyAgICAgICAgYnVuZGxlcy5hZGRFbGVtZW50KGRpY3QpOworICAgICAgICAvLyBTZXQgdXAgdGhlIGZpcnN0IGdyb3VwIGluIGNhc2UgdGhlcmUgYXJlIE5MUyBpdGVtcyB3aGljaCB3ZXJlIG5vdCBhc3NpZ25lZCB0byBhIGdyb3VwCisgICAgICAgIEJ1bmRsZUdyb3VwIGdyb3VwID0gbmV3IEJ1bmRsZUdyb3VwKGRpY3QsICJVbmdyb3VwZWQgSXRlbXMiKTsKKyAgICAgICAgZ3JvdXAuc2V0Q29tbWVudCgiTkxTIEl0ZW1zIHdoaWNoIHdlcmUgbm90IGluaXRpYWxseSBhc3NpZ25lZCB0byBhIGdyb3VwIik7CisgICAgICAgIGRpY3QuYWRkQnVuZGxlR3JvdXAoZ3JvdXApOworICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSBuZXcgQnVuZGxlSXRlbShncm91cCxudWxsLG51bGwpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBUZXN0IHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGEgZmlsZSB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkgUkJNYW5hZ2VyCisgICAgICAgICAgICBpZiAoIWxpbmUudHJpbSgpLmVxdWFscygiIikpIGNvdW50Kys7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gMSAmJiAhbGluZS5zdGFydHNXaXRoKCIjIEBmaWxlIikpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgZ2VuZXJhdGVkIGJ5IFJCTWFuYWdlcgorICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsCisgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfbm90X3JibWFuYWdlcl9mb3JtYXQiKSArICJcbiIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3N1Z2dlc3RfaW1wb3J0X3Byb3BlcnRpZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZXJyb3Jfbm90X3JibWFuYWdlcl9mb3JtYXQiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiSW1wcm9wZXIgZm9ybWF0IGZvciBmaWxlOiAiICsgbWFpbkZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBjb21tZW50TGluZSA9IG51bGw7CisgICAgICAgICAgICAvLyBHcmFiIHRleHQgZm9sbG93aW5nIHRoZSAjIHNpZ24KKyAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoIiMiKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgY29tbWVudExpbmUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoIiMiKSsxLGxpbmUubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLGxpbmUuaW5kZXhPZigiIyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb21tZW50TGluZSAhPSBudWxsICYmIGNvbW1lbnRMaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGFueSBpbmZvcm1hdGlvbiBtYWRlIGF2YWlsYWJsZSBpbiBjb21tZW50ICdAJyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBkZXNjcmlwdG9ycyA9IGdldERlc2NyaXB0b3JzKG51bGwsY29tbWVudExpbmUpOworICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvOworICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZSIpOyBpZiAobyAhPSBudWxsKSBkaWN0Lm5hbWUgPSAoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGVDb21tZW50Iik7ICBpZiAobyAhPSBudWxsKSBkaWN0LmNvbW1lbnQgID0gKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlTGFuZ3VhZ2UiKTsgaWYgKG8gIT0gbnVsbCkgZGljdC5sYW5ndWFnZSA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZUNvdW50cnkiKTsgIGlmIChvICE9IG51bGwpIGRpY3QuY291bnRyeSAgPSAoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGVWYXJpYW50Iik7ICBpZiAobyAhPSBudWxsKSBkaWN0LnZhcmlhbnQgID0gKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlTWFuYWdlciIpOyAgaWYgKG8gIT0gbnVsbCkgZGljdC5tYW5hZ2VyICA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIEdyb3VwIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZ3JvdXAiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBuZXcgQnVuZGxlR3JvdXAoZGljdCwgKFN0cmluZylvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0UGFyZW50R3JvdXAoZ3JvdXApOworICAgICAgICAgICAgICAgICAgICAgICAgZGljdC5hZGRCdW5kbGVHcm91cChncm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZ3JvdXBDb21tZW50Iik7IGlmIChvICE9IG51bGwpIGdyb3VwLnNldENvbW1lbnQoKFN0cmluZykgbyk7CisJCQkJCQorICAgICAgICAgICAgICAgICAgICAvLyBJdGVtIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiY29tbWVudCIpOyAgICBpZiAobyAhPSBudWxsKSBpdGVtLnNldENvbW1lbnQoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoInRyYW5zbGF0ZWQiKTsgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRUcmFuc2xhdGVkKCgoU3RyaW5nKSBvKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJjcmVhdG9yIik7ICAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0Q3JlYXRvcigoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgibW9kaWZpZXIiKTsgICBpZiAobyAhPSBudWxsKSBpdGVtLnNldE1vZGlmaWVyKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJjcmVhdGVkIik7ICAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0Q3JlYXRlZERhdGUoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoIm1vZGlmaWVkIik7ICAgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRNb2RpZmllZERhdGUoKFN0cmluZykgbyk7CisJCQkJCQorICAgICAgICAgICAgICAgICAgICAvLyBMb29rdXAgdGFncyAoZS5nLiB7XyNffSBfZGVzY3JpcHRpb25fKQorICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gZGVzY3JpcHRvcnMua2V5cygpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhZyA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy5zdGFydHNXaXRoKCJ7IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnLmluZGV4T2YoIn0iKSA8IDApIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXAgPSB0YWcuc3Vic3RyaW5nKDEsdGFnLmluZGV4T2YoIn0iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5nZXRMb29rdXBzKCkucHV0KGxvb2t1cCwgZGVzY3JpcHRvcnMuZ2V0KHRhZykpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIH0gLy8gZW5kIGNoZWNrIG9mIGNvbW1lbnQgbGluZQorICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpIDwgMSkgY29udGludWU7CisJCQkKKyAgICAgICAgICAgIC8vIEdyYWIgdGhlIG5hbWUgYW5kIHZhbHVlICh0cmFuc2xhdGlvbikgZnJvbSB0aGUgbGluZQorICAgICAgICAgICAgaW50IGJyZWFrcG9pbnQgPSAwOworICAgICAgICAgICAgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBjaGFyIGFycmF5W10gPSBsaW5lLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghc3RhcnRlZCAmJiBhcnJheVtpXSAhPSAnICcgJiYgYXJyYXlbaV0gIT0gJ1x0Jykgc3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKGFycmF5W2ldID09ICc9JyB8fCBhcnJheVtpXSA9PSAnOicgfHwgYXJyYXlbaV0gPT0gJyAnIHx8IGFycmF5W2ldID09ICdcdCcpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nLnZhbHVlT2YoYXJyYXksMCxicmVha3BvaW50KTsKKwkJCQorICAgICAgICAgICAgaXRlbS5zZXRLZXkoa2V5KTsKKyAgICAgICAgICAgIFN0cmluZyB0cmFuc2xhdGlvbiA9IHAuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbiA9PSBudWxsIHx8IHRyYW5zbGF0aW9uLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgaXRlbS5zZXRUcmFuc2xhdGlvbihsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoIj0iKSsxLGxpbmUubGVuZ3RoKCkpLnRyaW0oKSk7CisgICAgICAgICAgICBlbHNlIGl0ZW0uc2V0VHJhbnNsYXRpb24odHJhbnNsYXRpb24pOworCQkJCisgICAgICAgICAgICBkaWN0LmFkZEJ1bmRsZUl0ZW0oaXRlbSk7CisgICAgICAgICAgICBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0oZ3JvdXAsbnVsbCxudWxsKTsKKyAgICAgICAgfSAvLyBlbmQgd2hpbGUgLSBtYWluIE5MUyBmaWxlCisJCQorICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHBhcnNlZCB0aGUgZW50aXJlIG1haW4gbGFuZ3VhZ2UgZmlsZSwgcG9wdWxhdGUgdGhlIGFsbE5MU0tleSBzZXQgd2l0aCB0aGUgZGljdGlvbmFyeSBrZXlzCisgICAgICAgIGFsbEJ1bmRsZUtleXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSAoKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdCgwKSkuYWxsSXRlbXMua2V5cygpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgYWxsQnVuZGxlS2V5cy5hZGRFbGVtZW50KGtleXMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKwkJCisgICAgICAgIC8vIE5vdyBnbyB0aHJvdWdoIGFsbCBvZiB0aGUgb3RoZXIgbGFuZ3VhZ2VzCisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZW5jb2RpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RpbmdzW2ldLmVxdWFscygia3IiKSkgY29udGludWU7IC8vIEkgY2FuJ3QgaGFuZGxlIGRvdWJsZSBieXRlIGNoYXJhY3RlciBzZXRzIHlldAorICAgICAgICAgICAgLy8gVHJ5IHRvIG9idGFpbiB0aGUgbmV3IGZpbGUKKyAgICAgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBuZXcgRmlsZShyZXNEaXIsIE5MU2Jhc2VDbGFzcyArICJfIiArIGVuY29kaW5nc1tpXSArIE5MU3Bvc3RmaXgpOworICAgICAgICAgICAgZnIgPSBuZXcgRmlsZVJlYWRlcih0ZW1wRmlsZSk7CisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7CisJCQkKKyAgICAgICAgICAgIC8vIFRyeSB0byBvYnRhaW4gdGhlIGphdmEgcmVhZGFibGUgcHJvcGVydGllcyBmb3IgdGhlIGZpbGUKKyAgICAgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgcC5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcEZpbGUpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU2V0IHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgbWFpbiBmaWxlCisgICAgICAgICAgICBkaWN0ID0gbmV3IEJ1bmRsZShlbmNvZGluZ3NbaV0pOworICAgICAgICAgICAgYnVuZGxlcy5hZGRFbGVtZW50KGRpY3QpOworICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBmaXJzdCBncm91cCBpbiBjYXNlIHRoZXJlIGFyZSBOTFMgaXRlbXMgd2hpY2ggd2VyZSBub3QgYXNzaWduZWQgdG8gYSBncm91cAorICAgICAgICAgICAgZ3JvdXAgPSBuZXcgQnVuZGxlR3JvdXAoZGljdCwgIlVuZ3JvdXBlZCBJdGVtcyIpOworICAgICAgICAgICAgZGljdC5hZGRCdW5kbGVHcm91cChncm91cCk7CisgICAgICAgICAgICBncm91cC5zZXRDb21tZW50KCJOTFMgSXRlbXMgd2hpY2ggd2VyZSBub3QgaW5pdGlhbGx5IGFzc2lnbmVkIHRvIGEgZ3JvdXAiKTsKKyAgICAgICAgICAgIGl0ZW0gPSBuZXcgQnVuZGxlSXRlbShncm91cCxudWxsLG51bGwpOworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXN0IG9mIHRoZSBncm91cHMKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29tbWVudExpbmUgPSBudWxsOworICAgICAgICAgICAgICAgIC8vIEdyYWIgdGhlIHRleHQgZm9sbG93aW5nIHRoZSAjIHNpZ24KKyAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCIjIikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb21tZW50TGluZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZigiIyIpKzEsbGluZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLGxpbmUuaW5kZXhPZigiIyIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRMaW5lICE9IG51bGwgJiYgY29tbWVudExpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGFueSBpbmZvcm1hdGlvbiBtYWRlIGF2YWlsYWJsZSBpbiBjb21tZW50ICdAJyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZGVzY3JpcHRvcnMgPSBnZXREZXNjcmlwdG9ycyhudWxsLGNvbW1lbnRMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB0YWdzCisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlIik7IGlmIChvICE9IG51bGwpIGRpY3QubmFtZSA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGVDb21tZW50Iik7ICBpZiAobyAhPSBudWxsKSBkaWN0LmNvbW1lbnQgID0gKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZUxhbmd1YWdlIik7IGlmIChvICE9IG51bGwpIGRpY3QubGFuZ3VhZ2UgPSAoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlQ291bnRyeSIpOyAgaWYgKG8gIT0gbnVsbCkgZGljdC5jb3VudHJ5ICA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGVWYXJpYW50Iik7ICBpZiAobyAhPSBudWxsKSBkaWN0LnZhcmlhbnQgID0gKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZU1hbmFnZXIiKTsgIGlmIChvICE9IG51bGwpIGRpY3QubWFuYWdlciAgPSAoKFN0cmluZykgbyk7CisJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyb3VwIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImdyb3VwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBuZXcgQnVuZGxlR3JvdXAoZGljdCwgKFN0cmluZylvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFBhcmVudEdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LmFkZEJ1bmRsZUdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImdyb3VwQ29tbWVudCIpOyBpZiAobyAhPSBudWxsKSBncm91cC5zZXRDb21tZW50KChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVtIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImNvbW1lbnQiKTsgICAgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRDb21tZW50KChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgidHJhbnNsYXRlZCIpOyBpZiAobyAhPSBudWxsKSBpdGVtLnNldFRyYW5zbGF0ZWQoKChTdHJpbmcpIG8pLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJjcmVhdG9yIik7ICAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0Q3JlYXRvcigoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoIm1vZGlmaWVyIik7ICAgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRNb2RpZmllcigoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImNyZWF0ZWQiKTsgICAgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRDcmVhdGVkRGF0ZSgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoIm1vZGlmaWVkIik7ICAgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRNb2RpZmllZERhdGUoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvb2t1cCB0YWdzIChlLmcuIHtfI199IF9kZXNjcmlwdGlvbl8pCisgICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBkZXNjS2V5cyA9IGRlc2NyaXB0b3JzLmtleXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZXNjS2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWcgPSAoU3RyaW5nKWRlc2NLZXlzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy5zdGFydHNXaXRoKCJ7IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy5pbmRleE9mKCJ9IikgPCAwKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvb2t1cCA9IHRhZy5zdWJzdHJpbmcoMSx0YWcuaW5kZXhPZigifSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5nZXRMb29rdXBzKCkucHV0KGxvb2t1cCwgZGVzY3JpcHRvcnMuZ2V0KHRhZykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQkKKyAgICAgICAgICAgICAgICB9IC8vIGVuZCBjaGVjayBvZiBjb21tZW50IGxpbmUKKyAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPCAxKSBjb250aW51ZTsKKwkJCQorICAgICAgICAgICAgICAgIC8vIEdyYWIgdGhlIG5hbWUgYW5kIHZhbHVlICh0cmFuc2xhdGlvbikgZnJvbSB0aGUgbGluZQorICAgICAgICAgICAgICAgIGludCBicmVha3BvaW50ID0gMDsKKyAgICAgICAgICAgICAgICBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjaGFyIGFycmF5W10gPSBsaW5lLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgYXJyYXkubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydGVkICYmIGFycmF5W2pdICE9ICcgJyAmJiBhcnJheVtqXSAhPSAnXHQnKSBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKGFycmF5W2pdID09ICc9JyB8fCBhcnJheVtqXSA9PSAnOicgfHwgYXJyYXlbal0gPT0gJyAnIHx8IGFycmF5W2pdID09ICdcdCcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50ID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcudmFsdWVPZihhcnJheSwwLGJyZWFrcG9pbnQpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0S2V5KGtleSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zbGF0aW9uID0gcC5nZXRQcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbiA9PSBudWxsIHx8IHRyYW5zbGF0aW9uLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VHJhbnNsYXRpb24obGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCI9IikrMSxsaW5lLmxlbmd0aCgpKS50cmltKCkpOworICAgICAgICAgICAgICAgIGVsc2UgaXRlbS5zZXRUcmFuc2xhdGlvbih0cmFuc2xhdGlvbik7CisJCQkJCisgICAgICAgICAgICAgICAgZGljdC5hZGRCdW5kbGVJdGVtKGl0ZW0pOworICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgQnVuZGxlSXRlbShncm91cCxudWxsLG51bGwpOworICAgICAgICAgICAgfSAvLyBlbmQgd2hpbGUgLSBuZXh0IGxpbmUKKyAgICAgICAgfSAvLyBlbmQgZm9yIGxvb29wIHRocm91Z2ggbGFuZ3VhZ2VzCisgICAgICAgIC8vIEFkZCB0aGlzIG9wZW5lZCBmaWxlIHRvIG91ciByZWNlbnQgZmlsZXMKKyAgICAgICAgUHJlZmVyZW5jZXMuYWRkUmVjZW50RmlsZVByZWZlcmVuY2UobWFpbkZpbGUuZ2V0TmFtZSgpLCBtYWluRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfSAvLyBlbmQgUkJNYW5hZ2VyKCkKKwkKKyAgICAvLyAqKiogTUVUSE9EUyAqKioKKwkKKyAgICAvKioKKyAgICAgKiBNYWluCisgICAgICovCisJCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHVzZXIgc3BlY2lmaWVkIGEgcGF0aAorICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAxKSB7IAorICAgICAgICAgICAgbmV3IFJCTWFuYWdlcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSAvLyBtYWluCisJCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIGJhc2VDbGFzczsgfQorCQorICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAqLworCQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGN1cnJlbnREaXJlY3RvcnksIGJhc2VDbGFzcyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChidW5kbGUuZW5jb2RpbmcgPT0gbnVsbCB8fCBidW5kbGUuZW5jb2RpbmcuZXF1YWxzKCIiKSkgPyAiIiA6ICJfIiArIGJ1bmRsZS5lbmNvZGluZykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIucHJvcGVydGllcyIpOworICAgICAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKG91dHB1dEZpbGUpOworICAgICAgICAgICAgYnVuZGxlLndyaXRlQ29udGVudHMoZncpOworICAgICAgICAgICAgZncuZmx1c2goKTsKKyAgICAgICAgICAgIGZ3LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSW4gY2FzZSB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCBidW5kbGUgb3IgdGhlIGxvY2F0aW9uIGhhcyBjaGFuZ2VkIHJlY2VudGx5LCB1cGRhdGUgdGhlIHJlY2VudCBmaWxlcywgcHJlZmVyZW5jZQorICAgICAgICBQcmVmZXJlbmNlcy5hZGRSZWNlbnRGaWxlUHJlZmVyZW5jZShiYXNlQ2xhc3MgKyAiLnByb3BlcnRpZXMiLCBjdXJyZW50RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgKyAiLnByb3BlcnRpZXMiKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZW1vdmVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJtYW5lbnRseQorICAgICAqIGVyYXNlIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlcyBhdCB0aGlzIGVuY29kaW5nLCBob3dldmVyIGFueSBjaGFuZ2VzIG9yIHNhdmVzIHRoYXQgdGFrZQorICAgICAqIHBsYWNlIG9uY2UgdGhpcyBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoaXMgaGlkZGVuIGZpbGUuIFRvIHJlc3RvcmUgdGhlIHJlc291cmNlLCAKKyAgICAgKiB0aGUgYnVuZGxlIHdpbGwgaGF2ZSB0byBiZSByZWNyZWF0ZWQuIChUaGlzIGxhc3QgcG9pbnQgbWF5IGNoYW5nZSkKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgdm9pZCBoaWRlUmVzb3VyY2UoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgaWYgKGJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoZW5jb2RpbmcpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlcy5yZW1vdmVFbGVtZW50KGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyoqCisgICAgICogRXJhc2VzIHBlcm1hbmVudGx5IG9uZSBvZiB0aGUgcmVzb3VyY2UgZmlsZXMuIEJlIGNhcmVmdWwgYWJvdXQgY2FsbGluZyB0aGlzIG1ldGhvZCB0aGVyZSBpcyBub3RoaW5nIHlvdSBjYW4gZG8KKyAgICAgKiBvbmNlIGEgZmlsZSBpcyBlcmFzZWQuCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgZXJhc2VGaWxlKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGlmICghKGJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoZW5jb2RpbmcpKSkgY29udGludWU7CisgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShjdXJyZW50RGlyZWN0b3J5LCBiYXNlQ2xhc3MgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVuZGxlLmVuY29kaW5nID09IG51bGwgfHwgYnVuZGxlLmVuY29kaW5nLmVxdWFscygiIikpID8gIiIgOiAiXyIgKyBidW5kbGUuZW5jb2RpbmcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IG91dHB1dEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHRocm93IG5ldyBJT0V4Y2VwdGlvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2RlbGV0aW9uX25vdF9wb3NzaWJsZSIpKTsKKyAgICAgICAgICAgIGhpZGVSZXNvdXJjZShlbmNvZGluZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgb25seSBvbmUgb2YgdGhlIHJlc291cmNlIGZpbGVzIHRvIHRoZSBmaWxlIHN5c3RlbS4gVGhpcyBmaWxlIGlzIHNwZWNpZmllZCBieSB0aGUgZW5jb2RpbmcgcGFyYW1ldGVyCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgd3JpdGVUb0ZpbGUoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgaWYgKGJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoZW5jb2RpbmcpIHx8IChpPT0wICYmIGVuY29kaW5nLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoY3VycmVudERpcmVjdG9yeSwgYmFzZUNsYXNzICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChidW5kbGUuZW5jb2RpbmcgPT0gbnVsbCB8fCBidW5kbGUuZW5jb2RpbmcuZXF1YWxzKCIiKSkgPyAiIiA6ICJfIiArIGJ1bmRsZS5lbmNvZGluZykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIob3V0cHV0RmlsZSk7CisgICAgICAgICAgICAgICAgYnVuZGxlLndyaXRlQ29udGVudHMoZncpOworICAgICAgICAgICAgICAgIGZ3LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgZncuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJbiBjYXNlIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIGJ1bmRsZSBvciB0aGUgbG9jYXRpb24gaGFzIGNoYW5nZWQgcmVjZW50bHksIHVwZGF0ZSB0aGUgcmVjZW50IGZpbGVzLCBwcmVmZXJlbmNlCisgICAgICAgIFByZWZlcmVuY2VzLmFkZFJlY2VudEZpbGVQcmVmZXJlbmNlKGJhc2VDbGFzcyArICIucHJvcGVydGllcyIsIGN1cnJlbnREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VDbGFzcyArICIucHJvcGVydGllcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgQnVuZGxlSXRlbSBhbmQgc29tZSBwcm9wZXJ0aWVzIHRvIGNoYW5nZSBmb3IgdGhhdCBpdGVtLCB0aGlzIG1ldGhvZCBmaXJzdCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBwYXNzZWQKKyAgICAgKiBpdGVtIGlzIHZhbGlkIGFuZCBpZiBpdCBpcywgdGhlIHByb3BlcnRpZXMgb2YgdGhhdCBpdGVtIGFyZSBjaGFuZ2VkIHRvIHJlZmxlY3QgdGhvc2UgcGFzc2VkIGluIGFzIHBhcmFtZXRlcnMgdG8gdGhpcworICAgICAqIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEJ1bmRsZUl0ZW0gd2FzIHZhbGlkIGFuZCB1cGRhdGVhYmxlLCBmYWxzZSBpZiBvdGhlcndpc2UgKGluIHRoaXMgY2FzZSBubyBjaGFuZ2VzIHdlcmUgbWFkZSkuCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBib29sZWFuIGVkaXRJdGVtKEJ1bmRsZUl0ZW0gaXRlbSwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIGNvbW1lbnQsIEhhc2h0YWJsZSBsb29rdXBzKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpIHx8IGdyb3VwTmFtZSA9PSBudWxsIHx8IGdyb3VwTmFtZS5lcXVhbHMoIiIpIHx8IGl0ZW0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IGl0ZW0uZ2V0S2V5KCk7CisgICAgICAgIFN0cmluZyBvbGRDb21tZW50ID0gaXRlbS5nZXRDb21tZW50KCk7CisgICAgICAgIFN0cmluZyBvbGRWYWx1ZSA9IGl0ZW0uZ2V0VHJhbnNsYXRpb24oKTsKKyAgICAgICAgLy9TdHJpbmcgb2xkR3JvdXBOYW1lID0gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKTsKKyAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBidW5kbGVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBCdW5kbGVJdGVtIG9sZEl0ZW0gPSAoQnVuZGxlSXRlbSlidW5kbGUuYWxsSXRlbXMuZ2V0KG9sZE5hbWUpOworICAgICAgICAgICAgaWYgKG9sZEl0ZW0gPT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICBpZiAoIW9sZE5hbWUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gQSBuZXcga2V5CisgICAgICAgICAgICAgICAgb2xkSXRlbS5zZXRLZXkobmFtZSk7CisgICAgICAgICAgICAgICAgYnVuZGxlLmFsbEl0ZW1zLnJlbW92ZShvbGRJdGVtKTsKKyAgICAgICAgICAgICAgICBidW5kbGUuYWxsSXRlbXMucHV0KG9sZEl0ZW0uZ2V0S2V5KCksIG9sZEl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZEl0ZW0uZ2V0Q29tbWVudCgpID09IG51bGwgfHwgb2xkSXRlbS5nZXRDb21tZW50KCkuZXF1YWxzKG9sZENvbW1lbnQpKSBvbGRJdGVtLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICBpZiAob2xkSXRlbS5nZXRUcmFuc2xhdGlvbigpLmVxdWFscyhvbGRWYWx1ZSkpIG9sZEl0ZW0uc2V0VHJhbnNsYXRpb24odmFsdWUpOworICAgICAgICAgICAgb2xkSXRlbS5zZXRMb29rdXBzKGxvb2t1cHMpOworICAgICAgICAgICAgaWYgKCFvbGRJdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0TmFtZSgpLmVxdWFscyhncm91cE5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gQSBuZXcgZ3JvdXAKKyAgICAgICAgICAgICAgICBvbGRJdGVtLmdldFBhcmVudEdyb3VwKCkucmVtb3ZlQnVuZGxlSXRlbShvbGRJdGVtLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBiZyA9IGJ1bmRsZS5nZXRCdW5kbGVHcm91cChncm91cE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChiZyA9PSBudWxsKSBiZyA9IGJ1bmRsZS5nZXRVbmdyb3VwZWRHcm91cCgpOworICAgICAgICAgICAgICAgIG9sZEl0ZW0uc2V0UGFyZW50R3JvdXAoYmcpOworICAgICAgICAgICAgICAgIGJnLmFkZEJ1bmRsZUl0ZW0ob2xkSXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIG5ldyBpdGVtIGluIGVhY2ggb2YgdGhlIGxhbmd1YWdlIGZpbGVzLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcyB0aGUgYmFzZSBSZXNvdXJjZSBCdW5kbGUKKyAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaXRlbSBuYW1lIGRvZXMgbm90IGFsbCByZWFkeSBleGlzdC4gSWYgaXQgZG9lcyBleGlzdCB0aGUgaXRlbSBpcyBub3QgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5pcXVlIGtleSBvZiB0aGUgaXRlbQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdHJhbnNsYXRpb24gb2YgdGhlIGl0ZW0gZm9yIHRoZSBiYXNlIGNsYXNzCisgICAgICogQHBhcmFtIGdyb3VwTmFtZSBUaGUgZ3JvdXAgbmFtZSwgc2hvdWxkIGFsbCByZWFkeSBleGlzdCBpbiB0aGUgYmFzZSBjbGFzcworICAgICAqIEBwYXJhbSBjb21tZW50IEFuIG9wdGlvbmFsIGNvbW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGl0ZW0sIGNhbiBiZSA8Q09ERT5udWxsPC9DT0RFPgorICAgICAqIEByZXR1cm4gQW4gZXJyb3IgcmVzcG9uc2UuIElmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCA8Q09ERT50cnVlPC9DT0RFPiBpcyByZXR1cm5lZCwgaWYgdGhlcmUgd2FzIGFuIGVycm9yIDxDT0RFPmZhbHNlPC9DT0RFPiBpcyByZXR1cm5lZC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVJdGVtKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBjb21tZW50LCBIYXNodGFibGUgbG9va3VwcykgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSB8fCBncm91cE5hbWUgPT0gbnVsbCB8fCBncm91cE5hbWUuZXF1YWxzKCIiKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBCdW5kbGUgbWFpbkJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5maXJzdEVsZW1lbnQoKTsKKyAgICAgICAgQnVuZGxlR3JvdXAgbWFpbkdyb3VwID0gbnVsbDsKKyAgICAgICAgaWYgKG1haW5CdW5kbGUuYWxsSXRlbXMuY29udGFpbnNLZXkobmFtZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbWFpbkJ1bmRsZS5nZXRHcm91cENvdW50KCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlR3JvdXAgYmcgPSBtYWluQnVuZGxlLmdldEJ1bmRsZUdyb3VwKGkpOworICAgICAgICAgICAgaWYgKGJnLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkge21haW5Hcm91cCA9IGJnOyBicmVhazt9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1haW5Hcm91cCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIEFkZCB0byB0aGUgYmFzZSBjbGFzcworICAgICAgICBCdW5kbGVJdGVtIG1haW5JdGVtID0gbmV3IEJ1bmRsZUl0ZW0obWFpbkdyb3VwLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIG1haW5JdGVtLnNldFRyYW5zbGF0ZWQodHJ1ZSk7CisgICAgICAgIG1haW5JdGVtLnNldENyZWF0b3IoY3VycmVudFVzZXIpOworICAgICAgICBtYWluSXRlbS5zZXRNb2RpZmllcihjdXJyZW50VXNlcik7CisgICAgICAgIG1haW5JdGVtLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIG1haW5CdW5kbGUuYWxsSXRlbXMucHV0KG5hbWUsIG1haW5JdGVtKTsKKyAgICAgICAgbWFpbkdyb3VwLmFkZEJ1bmRsZUl0ZW0obWFpbkl0ZW0pOworICAgICAgICBpZiAobG9va3VwcyAhPSBudWxsKSBtYWluSXRlbS5zZXRMb29rdXBzKGxvb2t1cHMpOworICAgICAgICAvLyBBZGQgdG8gdGhlIHJlc3Qgb2YgdGhlIGJ1bmRsZXMKKyAgICAgICAgZm9yIChpbnQgaT0xOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBncm91cAorICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgYnVuZGxlLmdldEdyb3VwQ291bnQoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgYmcgPSBidW5kbGUuZ2V0QnVuZGxlR3JvdXAoaik7CisgICAgICAgICAgICAgICAgaWYgKGJnLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkge2dyb3VwID0gYmc7IGJyZWFrO30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ3JvdXAgPSBuZXcgQnVuZGxlR3JvdXAoYnVuZGxlLCBncm91cE5hbWUpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5hZGRCdW5kbGVHcm91cChncm91cCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSBuZXcgQnVuZGxlSXRlbShncm91cCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgaXRlbS5zZXRDcmVhdG9yKGN1cnJlbnRVc2VyKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0TW9kaWZpZXIoY3VycmVudFVzZXIpOworICAgICAgICAgICAgaXRlbS5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICAgICAgaWYgKGxvb2t1cHMgIT0gbnVsbCkgaXRlbS5zZXRMb29rdXBzKGxvb2t1cHMpOworICAgICAgICAgICAgYnVuZGxlLmFsbEl0ZW1zLnB1dChuYW1lLCBpdGVtKTsKKyAgICAgICAgICAgIGJ1bmRsZS5hZGRVbnRyYW5zbGF0ZWRJdGVtKGl0ZW0pOworICAgICAgICAgICAgZ3JvdXAuYWRkQnVuZGxlSXRlbShpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgbmV3IGdyb3VwIGluIGVhY2ggb2YgdGhlIGxhbmd1YWdlIGZpbGVzLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcyB0aGUgYmFzZSBSZXNvdXJjZSBCdW5kbGUKKyAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZ3JvdXAgbmFtZSBkb2VzIG5vdCBhbGwgcmVhZHkgZXhpc3QuIElmIGl0IGRvZXMgZXhpc3QgdGhlIGdyb3VwIGlzIG5vdCBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBncm91cE5hbWUgVGhlIHVuaXF1ZSBncm91cCBuYW1lIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gZ3JvdXBDb21tZW50IEFuIG9wdGlvbmFsIGNvbW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGdyb3VwLCBjYW4gYmUgPENPREU+bnVsbDwvQ09ERT4KKyAgICAgKiBAcmV0dXJuIEFuIGVycm9yIHJlc3BvbnNlLiBJZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwgPENPREU+dHJ1ZTwvQ09ERT4gaXMgcmV0dXJuZWQsIGlmIHRoZXJlIHdhcyBhbiBlcnJvciA8Q09ERT5mYWxzZTwvQ09ERT4gaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIGdyb3VwQ29tbWVudCkgeworICAgICAgICBpZiAoZ3JvdXBOYW1lID09IG51bGwgfHwgZ3JvdXBOYW1lLmVxdWFscygiIikpCisgICAgICAgIAlyZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZ3JvdXAgZXhpc3RzCisgICAgICAgIEJ1bmRsZSBtYWluQnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmZpcnN0RWxlbWVudCgpOworICAgICAgICBpZiAobWFpbkJ1bmRsZS5oYXNHcm91cChncm91cE5hbWUpKQorICAgICAgICAJcmV0dXJuIGZhbHNlOworCQkKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBncm91cAorICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGJnID0gbmV3IEJ1bmRsZUdyb3VwKGJ1bmRsZSwgZ3JvdXBOYW1lKTsKKyAgICAgICAgICAgIGlmIChncm91cENvbW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIAliZy5zZXRDb21tZW50KGdyb3VwQ29tbWVudCk7CisgICAgICAgICAgICBidW5kbGUuYWRkQnVuZGxlR3JvdXAoYmcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgZ3JvdXAgYW5kIGFsbCBvZiB0aGUgaXRlbXMgd2l0aGluIHRoYXQgZ3JvdXAgZnJvbSB0aGUgdmFyaW91cworICAgICAqIFJlc291cmNlIEJ1bmRsZXMga25vd24gdG8gdGhlIHN5c3RlbS4gVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgZ3JvdXAgZnJvbQorICAgICAqIHRoZSBwcm90ZWN0ZWQgdmVjdG9yIG9mIGdyb3VwcywgdGhlbiByZW1vdmVzIGFsbCBpdGVtcyBpbiB0aGF0IGdyb3VwIGZyb20KKyAgICAgKiB0aGUgcHJvdGVjdGVkIHZlY3RvciBvZiB1bnRyYW5zbGF0ZWQgaXRlbXMsIGFuZCB0aGUgcHJvdGVjdGVkIGhhc2h0YWJsZSBvZgorICAgICAqIGFsbCBpdGVtcy4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVHcm91cChTdHJpbmcgZ3JvdXBOYW1lKSB7CisgICAgICAgIGlmIChncm91cE5hbWUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBidW5kbGVzOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGJ1bmRsZS5yZW1vdmVHcm91cChncm91cE5hbWUpOworICAgICAgICB9CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJlbW92ZSByZXNvdXJjZSBpdGVtcyBvZiB0aGUgZ2l2ZW4gbmFtZSBmcm9tIGVhY2ggb2YgdGhlIHJlc291cmNlIGJ1bmRsZXMgdGhhdCB0aGUgc3lzdGVtCisgICAgICoga25vd3MgYWJvdXQuIFRoaXMgd29ya3MgYnkgZmlyc3QgcmVtb3ZpbmcgdGhlIGl0ZW0gZnJvbSB0aGUgcHJvdGVjdGVkIHZlY3RvciBvZiB0cmFuc2xhdGVkCisgICAgICogaXRlbXMsIGlmIGl0IGlzIHRoZXJlLCBhbmQgdGhlbiByZW1vdmluZyBpdCBmcm9tIHRoZSB0aGUgaGFzaHRhYmxlIG9mIGFsbCBpdGVtcywgYW5kIHRoZW4KKyAgICAgKiByZW1vdmluZyBpdCBmcm9tIGl0cyByZXNwZWN0aXZlIGdyb3VwLiAKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVJdGVtKFN0cmluZyBpdGVtTmFtZSkgeworICAgICAgICBpZiAoaXRlbU5hbWUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBidW5kbGVzOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdW50cmFuc2xhdGVkIGl0ZW1zCisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGJ1bmRsZS5yZW1vdmVVbnRyYW5zbGF0ZWRJdGVtKGl0ZW1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIEl0ZW1zCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBpdGVtcyA9IGJ1bmRsZS5hbGxJdGVtcy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUoaXRlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldEtleSgpLmVxdWFscyhpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmFsbEl0ZW1zLnJlbW92ZShpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5nZXRQYXJlbnRHcm91cCgpLnJlbW92ZUJ1bmRsZUl0ZW0oaXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCQorICAgIC8qKgorICAgICAqIExvb2tzIHRocm91Z2ggdGhlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhlIGJ1bmRsZSBmb3IgYSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gZW5jb2RpbmcuIE5vdGUgdGhhdCB0aGlzCisgICAgICogc2VhcmNoIGlzIGNhc2Ugc2Vuc2l0aXZlLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW5jb2RpbmcgZXhpc3RzIGFzIG9uZSBvZiB0aGUgcmVzb3VyY2UgZmlsZXMsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworCQorICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGVuY29kaW5nIGV4aXN0cworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYiA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBpZiAoYi5lbmNvZGluZy5lcXVhbHMoZW5jb2RpbmcpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIG5ldyByZXNvdXJjZSBmaWxlIHdpdGggdGhlIGdpdmVuIGVuY29kaW5nLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcyB0aGUgYmFzZSBSZXNvdXJjZSBCdW5kbGUKKyAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCBlbmNvZGluZyBkb2VzIG5vdCBhbGwgcmVhZHkgZXhpc3QuIElmIGl0IGRvZXMgZXhpc3QgdGhlIHJlc291cmNlIGZpbGUgaXMgbm90IGNyZWF0ZWQuCisgICAgICogQHBhcmFtIHRpdGxlIEFuIG9wdGlvbmFsLCBxdWljayB0aXRsZSBmb3IgdGhlIGZpbGUsIGNhbiBiZSA8Q09ERT5udWxsPC9DT0RFPgorICAgICAqIEBwYXJhbSBjb21tZW50IEFuIG9wdGlvbmFsIGNvbW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIHJlc291cmNlLCBjYW4gYmUgPENPREU+bnVsbDwvQ09ERT4KKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIHJlc3BvbnNpYmxlIGZvciB0aGlzIHJlc291cmNlLCBjYW4gYmUgPENPREU+bnVsbDwvQ09ERT4KKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgVGhlIHByb3BlciBlbmNvZGluZyBmb3IgdGhlIHJlc291cmNlLiBNdXN0IGJlIG9mIGZvcm0gJ2xhbmd1YWdlJywgJ2xhbmd1YWdlX2NvdW50cnknLCBvciAnbGFuZ3VhZ2VfY291bnRyeV92YXJpYW50JworICAgICAqIEBwYXJhbSBsYW5ndWFnZSBBIG1vcmUgZm9ybWFsIG5hbWUgZm9yIHRoZSBsYW5ndWFnZSAoZS5nLiAnRW5nbGlzaCcsICdEZXV0c2NoJywgZXRjLiksIGNhbiBiZSA8Q09ERT5udWxsPC9DT0RFPgorICAgICAqIEBwYXJhbSBjb3VudHJ5IEEgbW9yZSBmb3JtYWwgbmFtZSBmb3IgdGhlIGNvdW50cnkgZGVzY3JpYmVkIGJ5IHRoZSByZXNvdXJjZSwgY2FuIGJlIDxDT0RFPm51bGw8L0NPREU+CisgICAgICogQHBhcmFtIHZhcmlhbnQgQSBtb3JlIGZvcm1hbCBuYW1lIGZvciB0aGUgdmFyaWFudCBkZXNjcmliZWQgYnkgdGhlIHJlc291cmNlLCBjYW4gYmUgPENPREU+bnVsbDwvQ09ERT4KKyAgICAgKiBAcGFyYW0gY29weVZhbHVlcyBBbiBpbmRpY2F0aW9uIG9mIHdldGhlciBvciBub3QgdG8gcG9wdWxhdGUgdGhlIHJlc291cmNlIHdpdGggdGhlIGl0ZW1zIGluIHRoZSBiYXNlIGNsYXNzCisgICAgICogQHJldHVybiBBbiBlcnJvciByZXNwb25zZS4gSWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsIDxDT0RFPnRydWU8L0NPREU+IGlzIHJldHVybmVkLCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgPENPREU+ZmFsc2U8L0NPREU+IGlzIHJldHVybmVkLgorICAgICAqLworCQorICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZVJlc291cmNlKFN0cmluZyB0aXRsZSwgU3RyaW5nIGNvbW1lbnQsIFN0cmluZyBtYW5hZ2VyLCBTdHJpbmcgZW5jb2RpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGNvdW50cnksIFN0cmluZyB2YXJpYW50LCBib29sZWFuIGNvcHlWYWx1ZXMpIHsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwgfHwgZW5jb2RpbmcuZXF1YWxzKCIiKSB8fCBlbmNvZGluZy5zdGFydHNXaXRoKCJfIikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBlbmNvZGluZyBleGlzdHMKKyAgICAgICAgaWYgKGhhc1Jlc291cmNlKGVuY29kaW5nKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBDcmVhdGUgdGhlIHJlc291cmNlCisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKGVuY29kaW5nKTsKKyAgICAgICAgYnVuZGxlLm5hbWUgPSB0aXRsZTsKKyAgICAgICAgYnVuZGxlLmNvbW1lbnQgPSBjb21tZW50OworICAgICAgICBidW5kbGUubWFuYWdlciA9IG1hbmFnZXI7CisgICAgICAgIGJ1bmRsZS5sYW5ndWFnZSA9IGxhbmd1YWdlOworICAgICAgICBidW5kbGUuY291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIGJ1bmRsZS52YXJpYW50ID0gdmFyaWFudDsKKwkJCisgICAgICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgZ3JvdXAKKyAgICAgICAgYnVuZGxlLmFkZEJ1bmRsZUdyb3VwKCJVbmdyb3VwZWQgSXRlbXMiLCAiVGhlc2UgYXJlIHJlc291cmNlIGl0ZW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCBhIGdyb3VwIik7CisgICAgICAgIAorICAgICAgICBpZiAoY29weVZhbHVlcykgeworICAgICAgICAgICAgQnVuZGxlIG1haW5CdW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZmlyc3RFbGVtZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBtYWluQnVuZGxlLmdldEdyb3VwQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgbWFpbkdyb3VwID0gbWFpbkJ1bmRsZS5nZXRCdW5kbGVHcm91cChpKTsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBiZyA9IG5ldyBCdW5kbGVHcm91cChidW5kbGUsbWFpbkdyb3VwLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgYmcuc2V0Q29tbWVudChtYWluR3JvdXAuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgICAgICAgICBidW5kbGUuYWRkQnVuZGxlR3JvdXAoYmcpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IG1haW5Hcm91cC5nZXRJdGVtQ291bnQoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gbWFpbkl0ZW0gPSBtYWluR3JvdXAuZ2V0QnVuZGxlSXRlbShqKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0oYmcsIG1haW5JdGVtLmdldEtleSgpLCBtYWluSXRlbS5nZXRUcmFuc2xhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRDb21tZW50KG1haW5JdGVtLmdldENvbW1lbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q3JlYXRvcihtYWluSXRlbS5nZXRDcmVhdG9yKCkpOworICAgICAgICAgICAgICAgICAgICBpdGVtLnNldE1vZGlmaWVyKG1haW5JdGVtLmdldE1vZGlmaWVyKCkpOworICAgICAgICAgICAgICAgICAgICBpdGVtLnNldExvb2t1cHMobmV3IEhhc2h0YWJsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgZG9uZSBpbiB0aGUgQnVuZGxlIGNsYXNzCisgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBtYWluSXRlbS5nZXRMb29rdXBzKCkua2V5cygpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpbWFpbkl0ZW0uZ2V0TG9va3VwcygpLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TG9va3VwcygpLnB1dChuZXcgU3RyaW5nKG5hbWUpLCBuZXcgU3RyaW5nKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmcuYWRkQnVuZGxlSXRlbShpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmFkZFVudHJhbnNsYXRlZEl0ZW0oaXRlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisJCQorICAgICAgICBidW5kbGVzLmFkZEVsZW1lbnQoYnVuZGxlKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkdXBsaWNhdGUgTkxTIGVudHJpZXMKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgaW50IGdldE51bWJlckR1cGxpY2F0ZXMoKSB7CisgICAgICAgIHJldHVybiAoKEJ1bmRsZSlidW5kbGVzLmZpcnN0RWxlbWVudCgpKS5kdXBsaWNhdGVzLnNpemUoKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNpbmdsZSBzdHJpbmcgd2l0aCBhIGNvbW1hIGRlbGltaXRlZCBsaXN0aW5nIG9mIGFsbCBkdXBsaWNhdGUgZW50cmllcyBmb3VuZCBpbiB0aGUgTkxTIHJlc291cmNlcworICAgICAqLworCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHVwbGljYXRlc0xpc3RpbmcoKSB7CisgICAgICAgIHJldHVybiBsaXN0U3RyaW5ncyhnZXREdXBsaWNhdGVzTGlzdGluZ1ZlY3RvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIGNvbGxlY3Rpb24gb2YgZHVwbGljYXRlIEJ1bmRsZUl0ZW1zIGZvdW5kIGluIHRoZSBidW5kbGUKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgVmVjdG9yIGdldER1cGxpY2F0ZXNMaXN0aW5nVmVjdG9yKCkgeworICAgICAgICByZXR1cm4gKChCdW5kbGUpYnVuZGxlcy5maXJzdEVsZW1lbnQoKSkuZHVwbGljYXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVzZWZ1bCBkZWJ1Z2dpbmcgbWV0aG9kIHRoYXQgbGlzdHMgdGhlIHZhcmlvdXMgQnVuZGxlR3JvdXAgbmFtZXMgaW4gYSBTdHJpbmcuCisgICAgICovCisJCisgICAgcHVibGljIFN0cmluZyBnZXRHcm91cExpc3RpbmcoKSB7CisgICAgICAgIHJldHVybiBsaXN0U3RyaW5ncyhnZXRHcm91cExpc3RpbmdWZWN0b3IoKSk7CisgICAgfQorICAgICAgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZlY3RvciBjb2xsZWN0aW9uIG9mIGFsbCBvZiB0aGUgQnVuZGxlR3JvdXAgaXRlbXMgZm91bmRzIGludCB0aGUgYnVuZGxlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBMaXN0aW5nVmVjdG9yKCkgeworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5maXJzdEVsZW1lbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlLmdldEdyb3VwQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGJ1bmRsZS5nZXRCdW5kbGVHcm91cChpKS5nZXROYW1lKCk7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBsYW5ndWFnZXMgdGhhdCB0aGUgc3lzdGVtIHNlZW1zIHRvIHN1cHBvcnQKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgaW50IGdldE51bWJlckxhbmd1YWdlcygpIHsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZXMuc2l6ZSgpOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2luZ2xlIHN0cmluZyBjb21wcmlzZWQgb2YgYSBjb21tYSBkZWxpbWl0ZWQgbGlzdGluZyBvZiBhbGwgbGFuZ3VhZ2VzIHRoZSBzeXN0ZW0gc2VlbXMgdG8gc3VwcG9ydAorICAgICAqLworCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2VMaXN0aW5nKCkgeworICAgICAgICByZXR1cm4gbGlzdFN0cmluZ3MoZ2V0TGFuZ3VhZ2VMaXN0aW5nVmVjdG9yKCkpOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmVjdG9yIG9mIHN0cmluZ3MgY29tcHJpc2luZyBhIGxpc3Qgb2YgYWxsIGxhbmd1YWdlcyBpbiB0aGUgc3lzdGVtCisgICAgICovCisJCisgICAgcHVibGljIFZlY3RvciBnZXRMYW5ndWFnZUxpc3RpbmdWZWN0b3IoKSB7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworCQkKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgZGljdCA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBTdHJpbmcgZGljdFN0ciA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChkaWN0Lmxhbmd1YWdlICE9IG51bGwpIGRpY3RTdHIgKz0gZGljdC5sYW5ndWFnZTsKKyAgICAgICAgICAgIGlmIChkaWN0LmNvdW50cnkgIT0gbnVsbCkgZGljdFN0ciArPSAiICIgKyBkaWN0LmNvdW50cnk7CisgICAgICAgICAgICBpZiAoZGljdC52YXJpYW50ICE9IG51bGwpIGRpY3RTdHIgKz0gIiAiICsgZGljdC52YXJpYW50OworICAgICAgICAgICAgaWYgKGRpY3RTdHIudHJpbSgpLmVxdWFscygiIikpIGRpY3RTdHIgPSAoZGljdC5lbmNvZGluZy50cmltKCkuZXF1YWxzKCIiKSA/ICJCYXNlIFJlc291cmNlIEJ1bmRsZSIgOiBkaWN0LmVuY29kaW5nKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChkaWN0U3RyKTsKKyAgICAgICAgfQorCQkKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0cmFuc2xhdGlvbnMgY29udGFpbmVkIGFjcm9zcyBhbGwgbGFuZ3VhZ2UgZmlsZXMKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgaW50IGdldE51bWJlclRvdGFsVHJhbnNsYXRpb25zKCkgeworICAgICAgICByZXR1cm4gYWxsQnVuZGxlS2V5cy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIEJ1bmRsZUdyb3VwcyBpbiAgdGhlIGJ1bmRsZS4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgaW50IGdldE51bWJlckdyb3VwcygpIHsKKyAgICAgICAgcmV0dXJuICgoQnVuZGxlKWJ1bmRsZXMuZmlyc3RFbGVtZW50KCkpLmdldEdyb3VwQ291bnQoKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdXNlciBjdXJyZW50bHkgdXNpbmcgdGhlIGVkaXRvcgorICAgICAqLworCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRVc2VyOwkKKyAgICB9CisJCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdXNlciBjdXJyZW50bHkgdXNpbmcgdGhlIGVkaXRvcgorICAgICAqLworCQorICAgIHB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIHVzZXIpIHsKKyAgICAgICAgY3VycmVudFVzZXIgPSB1c2VyOwkKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgYmFzZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXNvdXJjZSBidW5kbGUKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlQ2xhc3MoU3RyaW5nIGJhc2VDbGFzc05hbWUpIHsKKyAgICAgICAgYmFzZUNsYXNzID0gYmFzZUNsYXNzTmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGlyZWN0b3J5IGluIHRoZSBmaWxlIHN5c3RlbSBpbiB3aGljaCB0aGlzIHJlc291cmNlIGJ1bmRsZSBpcyB0byBiZQorICAgICAqIHNhdmVkIGFuZCByZXRyaWV2ZWQuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RmlsZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgeworICAgICAgICBpZiAoZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIGN1cnJlbnREaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBjbGFzcyBuYW1lIGlmIGtub3duLCBvciAiVW5rbm93biBCYXNlIENsYXNzIiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1NyaW5nKCkgeworICAgICAgICByZXR1cm4gKGJhc2VDbGFzcyA9PSBudWxsID8gIlVua25vd24gQmFzZSBDbGFzcyIgOiBiYXNlQ2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhc2UgY2xhc3MgbmFtZSBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqLworCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gYmFzZUNsYXNzOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBBIFZlY3RvciBvZiBOTFNidW5kbGVzLCBvbmUgZm9yIGVhY2ggbGFuZ3VhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldEJ1bmRsZXMoKSB7CisgICAgICAgIHJldHVybiBidW5kbGVzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBidW5kbGUgZnJvbSBhIGxvY2FsZQorICAgICAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBidW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgbG9jYWxlKSB7CisgICAgCUJ1bmRsZSBidW5kbGUgPSBudWxsOworICAgICAgICBpZiAoaGFzUmVzb3VyY2UobG9jYWxlKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlIHRlbXBiID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcGIuZW5jb2RpbmcuZXF1YWxzKGxvY2FsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlID0gdGVtcGI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBpcyB0aGUgYmFzZSBjbGFzcyBmaWxlIGZvciB0aGUgcmVzb3VyY2UgYnVuZGxlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBGaWxlIGdldEJhc2VGaWxlKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoY3VycmVudERpcmVjdG9yeSxiYXNlQ2xhc3MgKyAiLnByb3BlcnRpZXMiKTsKKyAgICB9CisJCisgICAgLy8gUmV0dXJuIGEgc2luZ2xlIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgbWFkZSBmcm9tIGEgdmVjdG9yIG9mIHN0cmluZ3MKKyAgICBwcml2YXRlIFN0cmluZyBsaXN0U3RyaW5ncyhWZWN0b3IgdikgeworICAgICAgICBTdHJpbmcgcmV0U3RyID0gbmV3IFN0cmluZygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gdi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CisgICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpbzsKKyAgICAgICAgICAgIGlmIChpID4gMCkgcmV0U3RyICs9ICIsICI7CisgICAgICAgICAgICByZXRTdHIgKz0gczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0U3RyOworICAgIH0KKwkKKyAgICAvLyBJbml0IC0gY2FsbGVkIGJlZm9yZSBhbnQgY29uc3RydWN0aW9uCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIGFsbEJ1bmRsZUtleXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGJ1bmRsZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGN1cnJlbnRVc2VyID0gIlVua25vd24iOworICAgIH0KKwkKKyAgICAvLyBSZXR1cm4gYSBoYXNodGFibGUgb2YgdGhlIHRhZ3MgaW4gYSBjb21tZW50IGxpbmUgKGkuZS4gdGhlIHRleHQgYWZ0ZXIgZWFjaCAnQCcgY2hhcmFjdGVyKSBhbmQgdGhlaXIgdmFsdWVzCisgICAgcHJpdmF0ZSBIYXNodGFibGUgZ2V0RGVzY3JpcHRvcnMoSGFzaHRhYmxlIHJlc3VsdCwgU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgLy8gUmVjdXJzaW9uIHRlcm1pbmF0aW5nIGNvbmRpdGlvbgorICAgICAgICBpZiAobGluZSA9PSBudWxsIHx8IGxpbmUubGVuZ3RoKCkgPD0gMCB8fCBsaW5lLmluZGV4T2YoIkAiKSA8IDApIHJldHVybiByZXN1bHQ7CisgICAgICAgIC8vIE90aGVyd2lzZSBnZW5lcmF0ZSB3aGF0IGluZm9ybWF0aW9uIHdlIGNhbiBhbmQgcmVjdXJzZQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgLy8gU3RyaXAgb2ZmIGFueSBpbmZvcm1hdGlvbiBiZWZvcmUgYW5kIGluY2x1ZGluZyBhICdAJworICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCJAIikrMSwgbGluZS5sZW5ndGgoKSk7CisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhIHNwYWNlIGFmdGVyIHRoZSAnQF90YWdfJyBhbmQgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkKKyAgICAgICAgaWYgKGxpbmUuaW5kZXhPZigiICIpIDwgMCkgcmV0dXJuIHJlc3VsdDsgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBpZiB0aGluZ3MgYXJlIGZvcm1hdHRlZCByaWdodAorICAgICAgICAvLyBBZGQgdGhlIHRleHQgYWZ0ZXIgdGhlICdAJyBjaGFyYWN0ZXIgdXAgdG8gdGhlIGZpcnN0IHdoaXRlc3BhY2UgKGhhcyB0byBiZSBhIHNwYWNlLCBub3QgdGFiIG9yIG90aGVyIHdoaXRlc3BhY2UpCisgICAgICAgIFN0cmluZyBuYW1lID0gbGluZS5zdWJzdHJpbmcoMCxsaW5lLmluZGV4T2YoIiAiKSkudHJpbSgpOworICAgICAgICAvLyBOb3cgc3RyaXAgb2ZmIHRoZSB0YWcgbmFtZQorICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCIgIiksIGxpbmUubGVuZ3RoKCkpOworICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyICdAJyBjaGFyYWN0ZXIgd2UgdGFrZSB0aGUgdmFsdWUgdXAgdW50aWwgdGhhdCBjaGFyYWN0ZXIKKyAgICAgICAgaWYgKGxpbmUuaW5kZXhPZigiQCIpID49IDApIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXQobmFtZSxsaW5lLnN1YnN0cmluZygwLGxpbmUuaW5kZXhPZigiQCIpKS50cmltKCkpOworICAgICAgICB9CisgICAgICAgIC8vIE90aGVyd2lzZSB3ZSB0YWtlIHRoZSByZXN0IG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBsaW5lCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LnB1dChuYW1lLGxpbmUudHJpbSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVjdXJzZQorICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvcnMocmVzdWx0LCBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoIkAiKSwgbGluZS5sZW5ndGgoKSkpOworICAgIH0KKworICAgIC8vIENoZWNrcyBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHNlZSBpZiBpdCBjb250YWlucyBhIHBhcnRpY3VsYXIgc3RyaW5nCisvKiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFycmF5Q29udGFpbnMoU3RyaW5nW10gYXJyYXksIFN0cmluZyBtYXRjaCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJyYXlbaV0uZXF1YWxzKG1hdGNoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0qLworCQorICAgIC8vIFByaW50cyB0aGUgdXNhZ2Ugb2YgdGhlIHByb2dyYW0gd2hlbiBjYWxsZWQgZnJvbSBtYWluCisvKiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7CisgICAgICAgIFN0cmluZyB1c2FnZSA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgdXNhZ2UgKz0gIlVzYWdlOlxuXG5qYXZhIGNvbS5pYm0uYWxtYWRlbi5UZW1wdXNGdWdpdC5Ub29scy5SQk1hbmFnZXIgZmlsZU5hbWUgKCgtciB8IC1kKSBlbmNvZGluZz8pPyI7CisgICAgICAgIHVzYWdlICs9ICJcblxuICBmaWxlTmFtZSAtPiBUaGUgZmlsZSAoYW5kIHBhdGg/KSByZXByZXNlbnRpbmcgdGhlIG1haW4gTkxTIHJlc291cmNlXG5cdFx0KGkuZS4gVGVtcHVzRnVnaXQucmVzb3VyY2VzKVxuIjsKKyAgICAgICAgdXNhZ2UgKz0gIiAgZW5jb2RpbmcgLT4gUmV0dXJucyByZXN1bHRzIGZvciBvbmx5IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBzcGVjaWZpZWRcbiI7CisgICAgICAgIHVzYWdlICs9ICIgIGZsYWcgLXIgIC0+IEdpdmVzIG9ubHkgYSBzdGF0dXMgcmVwb3J0IG9uIHRoZSBzdGF0ZSBvZiB0aGUgdHJhbnNsYXRpb25zXG4iOyAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVzYWdlKTsKKyAgICB9Ki8KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUHJvcGVydGllc0V4cG9ydGVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJQcm9wZXJ0aWVzRXhwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RmN2NiCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUHJvcGVydGllc0V4cG9ydGVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHBsdWctaW4gZXhwb3J0ZXIgdXRpbGl0eSBmb3IgUkJNYW5hZ2VyIHRoYXQgb3V0cHV0cyBKYXZhCisgKiBzdGFuZGFyZCAucHJvcGVydGllcyBmaWxlcyBpbiB0aGUgYWNjb3JkaW5nIHRvIHRoZSBmaWxlIHN0cnVjdHVyZSBvZiBSZXNvdXJjZQorICogQnVuZGxlcy4gTW9zdCBhbGwgbWV0YS1kYXRhIGlzIGxvc3QgaW4gdGhpcyBleHBvcnQuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCUHJvcGVydGllc0V4cG9ydGVyIGV4dGVuZHMgUkJFeHBvcnRlciB7CisJCisgICAgcHVibGljIFJCUHJvcGVydGllc0V4cG9ydGVyKCkgeworICAgICAgICBzdXBlcigpOworCQkKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmlsZSBjaG9vc2VyIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoY2hvb3NlciA9PSBudWxsKSB7CisgICAgICAgICAgICBjaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworICAgICAgICAgICAgY2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCl7CisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCYXNlIENsYXNzIFByb3BlcnRpZXMgRmlsZXMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpICYmIGYuZ2V0TmFtZSgpLmluZGV4T2YoIl8iKSA8IDApIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gLy8gZW5kIGlmCisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChSQk1hbmFnZXIgcmJtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmJtID09IG51bGwpIHJldHVybjsKKyAgICAgICAgLy8gT3BlbiB0aGUgU2F2ZSBEaWFsb2cKKyAgICAgICAgaW50IHJldF92YWwgPSBjaG9vc2VyLnNob3dTYXZlRGlhbG9nKG51bGwpOworICAgICAgICBpZiAocmV0X3ZhbCAhPSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHJldHVybjsKKyAgICAgICAgLy8gUmV0cmlldmUgYmFzaWMgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICBGaWxlIGZpbGUgPSBjaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaWxlKHMpIHdlIHdpbGwgYmUgd29ya2luZyB3aXRoCisgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnQoKSk7ICAgICAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSB3ZSB3aWxsIGJlIHdyaXRpbmcgdG8KKyAgICAgICAgU3RyaW5nIGJhc2VfbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYmFzZSBuYW1lIG9mIHRoZSBmaWxlcyB3ZSB3aWxsIHdyaXRlCisgICAgICAgIGlmIChiYXNlX25hbWUgPT0gbnVsbCB8fCBiYXNlX25hbWUuZXF1YWxzKCIiKSkgYmFzZV9uYW1lID0gcmJtLmdldEJhc2VDbGFzcygpOworICAgICAgICBpZiAoYmFzZV9uYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpIAorICAgICAgICAgICAgYmFzZV9uYW1lID0gYmFzZV9uYW1lLnN1YnN0cmluZygwLGJhc2VfbmFtZS5sZW5ndGgoKS0xMSk7CisJCQorICAgICAgICBWZWN0b3IgYnVuZGxlX3YgPSByYm0uZ2V0QnVuZGxlcygpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVfdi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZV92LmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlX2VuYyA9IGJhc2VfbmFtZTsKKyAgICAgICAgICAgIGlmIChidW5kbGUuZW5jb2RpbmcgIT0gbnVsbCAmJiAhYnVuZGxlLmVuY29kaW5nLmVxdWFscygiIikpIGJhc2VfZW5jID0gYmFzZV9lbmMgKyAiXyIgKyBidW5kbGUuZW5jb2Rpbmc7CisgICAgICAgICAgICBTdHJpbmcgZmlsZV9uYW1lID0gYmFzZV9lbmMgKyAiLnByb3BlcnRpZXMiOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJSZXNvdXJjZSBCdW5kbGU6ICIgKyBmaWxlX25hbWUgKyAiIC0gRmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIgYXQgIiArIChuZXcgRGF0ZSgpKTsKKwkJCQorICAgICAgICAgICAgVmVjdG9yIGdyb3VwX3YgPSBidW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGdyb3VwX3Yuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClncm91cF92LmVsZW1lbnRBdChqKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgaXRlbV92ID0gZ3JvdXAuZ2V0SXRlbXNBc1ZlY3RvcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgayA8IGl0ZW1fdi5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtX3YuZWxlbWVudEF0KGspOworICAgICAgICAgICAgICAgICAgICBwcm9wLnNldFByb3BlcnR5KGl0ZW0uZ2V0S2V5KCksIGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gaworICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gagorCQkJCisgICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGZpbGUKKyAgICAgICAgICAgIEZpbGUgd3JpdGVfZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZV9uYW1lKTsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0od3JpdGVfZmlsZSk7CisgICAgICAgICAgICBwcm9wLnN0b3JlKGZvcywgaGVhZGVyKTsKKyAgICAgICAgfSAvLyBlbmQgZm9yIC0gaQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJQcm9wZXJ0aWVzSW1wb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlByb3BlcnRpZXNJbXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNmNkMjkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJQcm9wZXJ0aWVzSW1wb3J0ZXIuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS5pby4qOworCitpbXBvcnQgY29tLmlibS5yYm0uZ3VpLlJCTWFuYWdlckdVSTsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzIGZvciBhbGwgaW1wb3J0ZXIgcGx1Zy1pbiBjbGFzc2VzLiBBcyBvZiB5ZXQsIHRoZXJlCisgKiBpcyBsaXR0bGUgY29udGFpbmVkIGluIHRoaXMgY2xhc3MuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCUHJvcGVydGllc0ltcG9ydGVyIGV4dGVuZHMgUkJJbXBvcnRlciB7CisJCisgICAgYm9vbGVhbiBpc1JCTUZpbGUgPSB0cnVlOworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgdGhlIGltcG9ydGVyIGdpdmVuIHRoZSBwYXJlbnQgZGF0YSBjbGFzc2VzIGFuZCBhIERpYWxvZyB0aXRsZS4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgUkJQcm9wZXJ0aWVzSW1wb3J0ZXIoU3RyaW5nIHRpdGxlLCBSQk1hbmFnZXIgcmJtLCBSQk1hbmFnZXJHVUkgZ3VpKSB7CisgICAgICAgIHN1cGVyKHRpdGxlLCByYm0sIGd1aSk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHNldHVwRmlsZUNob29zZXIoKSB7CisgICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworICAgICAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpICYmIGYuZ2V0TmFtZSgpLmluZGV4T2YoIl8iKSA8IDApIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcHJvcGVydGllc19maWxlX2Rlc2NyaXB0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBiZWdpbkltcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmJlZ2luSW1wb3J0KCk7CisgICAgICAgIEZpbGUgYmFzZUZpbGUgPSBnZXRDaG9zZW5GaWxlKCk7CisgICAgICAgIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihiYXNlRmlsZSk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKKwkJCisgICAgICAgIC8vIFRlc3QgaWYgdGhpcyBpcyBhbiBSQk1hbmFnZXIgZ2VuZXJhdGVkIGZpbGUgb3Igbm90CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgaXNSQk1GaWxlID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5lcXVhbHMoIiIpKSBjb3VudCsrOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDEgJiYgIWxpbmUuc3RhcnRzV2l0aCgiIyBAZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIKKyAgICAgICAgICAgICAgICBpc1JCTUZpbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBlbmQgd2hpbGUKKyAgICAgICAgaWYgKGlzUkJNRmlsZSkgeworICAgICAgICAgICAgLy8gVHJlYXQgdGhlIGZpbGUgYXMgZ2VuZXJhdGVkIGJ5IFJCTWFuYWdlcgorICAgICAgICAgICAgLy8gUGFyc2UgdGhlIHJlc291cmNlIGJ1bmRsZSB0aHJvdWdoIFJCTWFuYWdlcgorICAgICAgICAgICAgUkJNYW5hZ2VyIGltcG9ydF9yYm0gPSBuZXcgUkJNYW5hZ2VyKGJhc2VGaWxlKTsKKyAgICAgICAgICAgIC8vIE1lcmdlIHRoZSB0d28gcmVzb3VyY2UgYnVuZGxlcworICAgICAgICAgICAgVmVjdG9yIGJ1bmRsZXMgPSBpbXBvcnRfcmJtLmdldEJ1bmRsZXMoKTsKKyAgICAgICAgICAgIFZlY3RvciBlbmNvZGluZ3MgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlIGIgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgIGVuY29kaW5ncy5hZGRFbGVtZW50KGIuZW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzb2x2ZUVuY29kaW5ncyhlbmNvZGluZ3MpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBiID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gYi5hbGxJdGVtcy5rZXlzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSliLmFsbEl0ZW1zLmdldChrZXkpOworICAgICAgICAgICAgICAgICAgICBpbXBvcnRSZXNvdXJjZShpdGVtLCBiLmVuY29kaW5nLCAoaXRlbS5nZXRQYXJlbnRHcm91cCgpID09IG51bGwgPyBnZXREZWZhdWx0R3JvdXAoKTogaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKSkpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBKdXN0IHRyZWF0IGl0IGFzIGEgcmVndWxhciBwcm9wZXJ0aWVzIGZpbGUKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbWlzc2luZyB0YXJnZXQgbG9jYWxlIGZpbGVzCisgICAgICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBiYXNlRmlsZS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsYmFzZUZpbGUuZ2V0TmFtZSgpLmxlbmd0aCgpLTExKTsgLy8gfCcucHJvcGVydGllcyd8ID09IDExCisgICAgICAgICAgICBGaWxlIGJhc2VEaXIgPSBuZXcgRmlsZShiYXNlRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICBTdHJpbmcgYWxsQ2hpbGRyZW5bXSA9IGJhc2VEaXIubGlzdCgpOworICAgICAgICAgICAgVmVjdG9yIGNoaWxkcmVuX3YgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBhbGxDaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhbGxDaGlsZHJlbltpXS5zdGFydHNXaXRoKGJhc2VOYW1lKSAmJiBhbGxDaGlsZHJlbltpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxDaGlsZHJlbltpXS5sZW5ndGgoKSA9PSAoYmFzZU5hbWUgKyAiLnByb3BlcnRpZXMiKS5sZW5ndGgoKSkgY2hpbGRyZW5fdi5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBjaGlsZHJlbl92LmFkZEVsZW1lbnQoYWxsQ2hpbGRyZW5baV0uc3Vic3RyaW5nKGJhc2VOYW1lLmxlbmd0aCgpKzEsIGFsbENoaWxkcmVuW2ldLmluZGV4T2YoIi5wcm9wZXJ0aWVzIikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaG93UHJvZ3Jlc3NCYXIoY2hpbGRyZW5fdi5zaXplKCkpOworICAgICAgICAgICAgcmVzb2x2ZUVuY29kaW5ncyhjaGlsZHJlbl92KTsKKyAgICAgICAgICAgIC8vIFJ1biB0aHJvdWdoIGVhY2ggc291cmNlIGxvY2FsZSBmaWxlIGltcG9ydGluZyBhcyBuZWNlc3NhcnkKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuX3Yuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGJhc2VEaXIsIGJhc2VOYW1lICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoaWxkcmVuX3YuZWxlbWVudEF0KGkpLnRvU3RyaW5nKCkuZXF1YWxzKCIiKSA/ICIiIDogIl8iICsgY2hpbGRyZW5fdi5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIucHJvcGVydGllcyIpKTsKKyAgICAgICAgICAgICAgICBwLmxvYWQoZmlzKTsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gcC5rZXlzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSBuZXcgQnVuZGxlSXRlbShudWxsLCBrZXksIHAuZ2V0UHJvcGVydHkoa2V5KSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VHJhbnNsYXRlZCh0aGlzLmdldERlZmF1bHRUcmFuc2xhdGVkKCkpOworICAgICAgICAgICAgICAgICAgICBpbXBvcnRSZXNvdXJjZShpdGVtLCBjaGlsZHJlbl92LmVsZW1lbnRBdChpKS50b1N0cmluZygpLCBnZXREZWZhdWx0R3JvdXAoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluY3JlbWVudFByb2dyZXNzQmFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoaWRlUHJvZ3Jlc3NCYXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJSZXBvcnRlci5iYXQgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJSZXBvcnRlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWI4ZmIzMwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlJlcG9ydGVyLmJhdApAQCAtMCwwICsxLDIgQEAKK0BlY2hvIG9mZgoramF2YSAtY2xhc3NwYXRoIFJCTWFuYWdlci5qYXI7bGliXHhlcmNlcy5qYXI7LiBjb20uaWJtLnJibS5SQlJlcG9ydGVyICUxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUmVwb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlJlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3YWM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlJlcG9ydGVyLmphdmEKQEAgLTAsMCArMSwxMTkxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS5ndWkuUkJNYW5hZ2VyR1VJOworCisvKioKKyAqIFJCUmVwb3J0ZXIgaXMgYSBmdWxseSBmdW5jdGlvbmFsIGFwcGxpY2F0aW9uIHRoYXQgcnVucyBzZXBhcmF0ZSBmcm9tIFJCTWFuYWdlci4KKyAqIFRoZSByZXBvcnQgcHJvZHVjZXMgc3RhdGlzdGljYWxseSBiYXNlZCByZXBvcnRzIG9uIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGVzLAorICogYW5kIGl0IGFsbG93cyB0aGUgdXNlciB0byBzZXQgdGltZSBpbnRlcnZhbHMgYXQgd2hpY2ggdGhvc2UgcmVwb3J0cyB3aWxsIGJlCisgKiBnZW5lcmF0ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHVzYWdlIHNlZSB0aGUKKyAqIGNvbW1lbnRzIGZvciB0aGUgbWFpbigpIG1ldGhvZC4KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgUkJSZXBvcnRlciBleHRlbmRzIEpGcmFtZSB7CisJCisJLy8gKiogQ09NUE9ORU5UUyAqKgorCUpMYWJlbCAgICAgICBzdGF0dXNMYWJlbDsgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBpZiB0aGUgcmVwb3J0ZWQgaXMgcnVubmluZworCUpCdXR0b24gICAgICBzdGF0dXNCdXR0b247ICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgdGhlIHJlcG9ydGVyIG9uL29mZgorCUpMYWJlbCAgICAgICBuZXh0UmVwb3J0TGFiZWw7ICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBkYXRlL3RpbWUgb2YgbmV4dCByZXBvcnQKKwlKTGFiZWwgICAgICAgbGFzdFJlcG9ydExhYmVsOyAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgZGF0ZS90aW1lIG9mIGxhc3QgcmVwb3J0CisJSlRleHRGaWVsZCAgIGJ1bmRsZUZpZWxkOyAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGVzIGlucHV0IGJhc2UgY2xhc3MgZmlsZQorCUpUZXh0RmllbGQgICBkaXJlY3RvcnlGaWVsZDsgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBvdXRwdXQgZGlyZWN0b3J5CisJSkNoZWNrQm94ICAgIHRleHRDaGVjazsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGV4dCByZXBvcnQgZ2VuZXJhdGVkPworCUpDaGVja0JveCAgICBodG1sQ2hlY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIEhUTUwgcmVwb3J0IGdlbmVyYXRlZD8KKwlKQ2hlY2tCb3ggICAgeG1sQ2hlY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBYTUwgcmVwb3J0IGdlbmVyYXRlZD8KKwlKQ2hlY2tCb3ggICAgc2NhbkNoZWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBjb2RlIHNjYW4gcGVyZm9ybWVkPworCUpUZXh0RmllbGQgICB0ZXh0RmllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHQgcmVwb3J0IGZpbGUgbmFtZQorCUpUZXh0RmllbGQgICBodG1sRmllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhUTUwgcmVwb3J0IGZpbGUgbmFtZQorCUpUZXh0RmllbGQgICB4bWxGaWVsZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhNTCByZXBvcnQgZmlsZSBuYW1lCisJSlRleHRGaWVsZCAgIHNjYW5GaWVsZDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWE1MIHNjYW5uZXIgZmlsZSBsb2NhdGlvbgorCUpDb21ib0JveCAgICB0ZXh0Q29tYm87ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHQgcmVwb3J0IGRldGFpbCBsZXZlbAorCUpDb21ib0JveCAgICBodG1sQ29tYm87ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhUTUwgcmVwb3J0IGRldGFpbCBsZXZlbAorCUpDb21ib0JveCAgICB4bWxDb21ibzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhNTCByZXBvcnQgZGV0YWlsIGxldmVsCisJSlJhZGlvQnV0dG9uIHNlcXVlbnRpYWxSYWRpbzsgICAgICAgICAgICAgICAgICAgLy8gUmVwb3J0IGF0IHNlcXVlbnRpYWwgaW50ZXJ2YWw/CisJSlJhZGlvQnV0dG9uIGRlZmluZWRSYWRpbzsgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwb3J0IGF0IGRlZmluZWQgdGltZT8KKwlKQ29tYm9Cb3ggICAgdmFsdWVDb21ibzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgdW5pdHMgdG8gd2FpdCBiZXR3ZWVuIHJlcG9ydHMKKwlKQ29tYm9Cb3ggICAgdW5pdENvbWJvOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbml0cyBvZiB0aW1lCisJSkNvbWJvQm94ICAgIGhvdXJDb21ibzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmaW5lZCB0aW1lIHRvIHJlcG9ydCAtLSBob3VycworCUpDb21ib0JveCAgICBtaW51dGVDb21ibzsgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmluZWQgdGltZSB0byByZXBvcnQgLS0gbWludXRlcworCUpDb21ib0JveCAgICBkYXlDb21ibzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmluZWQgdGltZSB0byByZXBvcnQgLS0gZGF5CisJCisJLy8gKiogRmlsZSBDaG9vc2VyICoqCisJSkZpbGVDaG9vc2VyIGJ1bmRsZUZpbGVDaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworCUpGaWxlQ2hvb3NlciBkaXJlY3RvcnlGaWxlQ2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKwlKRmlsZUNob29zZXIgc2NhbkZpbGVDaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworCQorCS8vICoqIERBVEEgKioKKwlEYXRlIGxhc3RSZXBvcnQgPSBudWxsOworCURhdGUgbmV4dFJlcG9ydCA9IG51bGw7CisJYm9vbGVhbiBydW5uaW5nID0gZmFsc2U7CisgICAgLyoqIEZvciBnZW5lcmF0aW5nIGEgcmVwb3J0ICovCisgICAgUkJNYW5hZ2VyIHJibTsKKwkKKwlwcml2YXRlIFJCUmVwb3J0ZXIoYm9vbGVhbiBtYWtlVmlzaWJsZSkgeworCQl0cnkgeworCQkJLy8gR2V0IHRoZSBsb29rIGFuZCBmZWVsIGZyb20gcHJlZmVyZW5jZXMJCisJCQl0cnkgeworCQkJCVN0cmluZyBsYWYgPSBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJsb29rYW5kZmVlbCIpOworCQkJCWlmICghbGFmLmVxdWFscygiIikpCisJCQkJCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChsYWYpOworCQkJfSAKKwkJCWNhdGNoIChFeGNlcHRpb24gZSkgeyAKKwkJCX0KKwkJCS8vIEdldCB0aGUgbG9jYWxlIGZyb20gcHJlZmVyZW5jZXMKKwkJCWlmICghUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgibG9jYWxlIikuZXF1YWxzKCIiKSkgeworCQkJCVN0cmluZyBsb2NhbGVTdHIgPSBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJsb2NhbGUiKTsKKwkJCQlTdHJpbmcgbGFuZ3VhZ2UgPSBSZXNvdXJjZXMuZ2V0TGFuZ3VhZ2UobG9jYWxlU3RyKTsKKwkJCQlTdHJpbmcgY291bnRyeSA9IFJlc291cmNlcy5nZXRDb3VudHJ5KGxvY2FsZVN0cik7CisJCQkJU3RyaW5nIHZhcmlhbnQgPSBSZXNvdXJjZXMuZ2V0VmFyaWFudChsb2NhbGVTdHIpOworCQkJCWlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlLmVxdWFscygiIikgfHwgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAzKSBsYW5ndWFnZSA9ICJlbiI7CisJCQkJaWYgKGNvdW50cnkgPT0gbnVsbCkgY291bnRyeSA9IG5ldyBTdHJpbmcoKTsKKwkJCQlpZiAodmFyaWFudCA9PSBudWxsKSBSZXNvdXJjZXMuc2V0TG9jYWxlKG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpKTsKKwkJCQllbHNlIFJlc291cmNlcy5zZXRMb2NhbGUobmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCkpOworCQkJfQorCQkJUmVzb3VyY2VzLmluaXRCdW5kbGUoKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJaW5pdENvbXBvbmVudHMoKTsKKwkJc2V0VmlzaWJsZShtYWtlVmlzaWJsZSk7CisJCVRocmVhZCByZXBvcnRUaHJlYWQgPSBuZXcgVGhyZWFkKCl7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKG5leHRSZXBvcnQgIT0gbnVsbCAmJiAobmV4dFJlcG9ydC5jb21wYXJlVG8obmV3IERhdGUoKSkgPD0gMCkpIHsKKwkJCQkJdHJ5IHsgZ2VuZXJhdGVSZXBvcnRzKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30KKwkJCQl9CisJCQkJaWYgKG5leHRSZXBvcnQgPT0gbnVsbCkKKwkJCQkgICAgbmV4dFJlcG9ydCA9IGdlbmVyYXRlTmV4dFJlcG9ydERhdGUoKTsKKwkJCQl1cGRhdGVTdGF0dXNDb21wb25lbnRzKCk7CisJCQkJdXBkYXRlRGF0ZUZpZWxkcygpOworCQkJCXdoaWxlICh0cnVlKSB7CisJCQkJCWlmIChydW5uaW5nICYmIChuZXh0UmVwb3J0LmNvbXBhcmVUbyhuZXcgRGF0ZSgpKSA8IDApKSB7CisJCQkJCQl0cnkge2dlbmVyYXRlUmVwb3J0cygpO30KKwkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCBpb2UuZ2V0TWVzc2FnZSgpLAorCQkJCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwKKwkJCQkJCQkJCQkJCQkJICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl0cnkgeworCQkJCQkJc2xlZXAoMTAwMCk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKwkJcmVwb3J0VGhyZWFkLnN0YXJ0KCk7CisJfQorCQorCS8vIENhbGxlZCB3aGVuIGEgcmVwb3J0IHNob3VsZCBiZSBnZW5lcmF0ZWQuIERvZXMgbm90IGNoZWNrIGlmIGl0IHNob3VsZCBiZSBnZW5lcmF0ZWQKKwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVSZXBvcnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRmlsZSBiYXNlRmlsZSA9IG5ldyBGaWxlKGJ1bmRsZUZpZWxkLmdldFRleHQoKSk7CisJCWlmIChiYXNlRmlsZSA9PSBudWxsIHx8ICFiYXNlRmlsZS5pc0ZpbGUoKSkKKwkJICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3BlY2lmaWVkIGlucHV0IGZpbGUgaXMgdW51c2FibGUiKTsKKwkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShkaXJlY3RvcnlGaWVsZC5nZXRUZXh0KCkpOworCQlyYm0gPSBuZXcgUkJNYW5hZ2VyKGJhc2VGaWxlKTsKKwkJCisJCWlmIChyYm0gPT0gbnVsbCkKKwkJICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgdGhlIHJlc291cmNlIGJ1bmRsZSBmaWxlIik7CisJCWlmIChkaXJlY3RvcnkgPT0gbnVsbCB8fCAhZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpCisJCSAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNwZWNpZmllZCBvdXRwdXQgZGlyZWN0b3J5IGlzIHVudXNhYmxlIik7CisJCVJCUmVwb3J0ZXJTY2FubmVyIHNjYW5uZXIgPSBudWxsOworCQlpZiAoc2NhbkNoZWNrLmlzU2VsZWN0ZWQoKSkgeworCQkJc2Nhbm5lciA9IG5ldyBSQlJlcG9ydGVyU2Nhbm5lcigoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZWxlbWVudEF0KDApLAorCQkJCQkJCQkJCSAgICBuZXcgRmlsZShzY2FuRmllbGQuZ2V0VGV4dCgpKSk7CisJCQlzY2FubmVyLnBlcmZvcm1TY2FuKCk7CisJCX0KKwkJaWYgKHRleHRDaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCUZpbGUgdGV4dEZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIHRleHRGaWVsZC5nZXRUZXh0KCkpOworCQkJU3RyaW5nIHRleHRSZXBvcnQgPSBnZXRBbGxMYW5ndWFnZVJlcG9ydHModGV4dENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAwKTsKKwkJCWlmIChzY2FuQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQkJLy8gQWRkIGZpbGUgc2NhbiBpbmZvcm1hdGlvbgorCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQkJYnVmZmVyLmFwcGVuZCgiXG5cbkNvZGUgU2NhbiBSZXN1bHRzOlxuXG4iKTsKKwkJCQlidWZmZXIuYXBwZW5kKCJcblx0TnVtYmVyIG9mIHVuaXF1ZSByZXNvdXJjZXMgZm91bmQ6ICIgKyBzY2FubmVyLmdldE51bWJlclJlc291cmNlc0ZvdW5kKCkpOworCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHROdW1iZXIgb2YgcmVzb3VyY2VzIG1pc3NpbmcgZnJvbSBidW5kbGU6ICIgKyBzY2FubmVyLmdldE51bWJlck1pc3NpbmdSZXNvdXJjZXMoKSk7CisJCQkJLy8gTWlzc2luZyByZXNvdXJjZXMgZnJvbSB0aGUgYnVuZGxlCisJCQkJYnVmZmVyLmFwcGVuZCgiXG5cdE1pc3NpbmcgUmVzb3VyY2VzOiAiKTsKKwkJCQlWZWN0b3IgdiA9IHNjYW5uZXIuZ2V0TWlzc2luZ1Jlc291cmNlcygpOworCQkJCWZvciAoaW50IGk9MDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKwkJCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCl2LmVsZW1lbnRBdChpKTsKKwkJCQkJaWYgKHRleHRDb21iby5nZXRTZWxlY3RlZEluZGV4KCkgPT0gMCkgeworCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIHJlc3VsdC5nZXROYW1lKCkgKyAiICgiICsgcmVzdWx0LmdldE9jY3VyYW5jZXMoKS5zaXplKCkgKyAiIE9jY3VyYW5jZXMpIik7CisJCQkJCQlidWZmZXIuYXBwZW5kKCJcblx0XHRcdCIgKyByZXN1bHQuZ2V0T2NjdXJhbmNlcygpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoKGk9PTAgPyAiIiA6ICIsICIpICsgcmVzdWx0LmdldE5hbWUoKSArICIgKCIgKyByZXN1bHQuZ2V0T2NjdXJhbmNlcygpLnNpemUoKSArICIgT2NjdXJhbmNlcykiKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBCdW5kbGUgcmVzb3VyY2VzIG5vdCBmb3VuZCBpbiB0aGUgY29kZQorCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHROdW1iZXIgb2YgcG90ZW50aWFsbHkgdW51c2VkIHJlc291cmNlcyBpbiBidW5kbGU6ICIgKyBzY2FubmVyLmdldE51bWJlclVudXNlZFJlc291cmNlcygpKTsKKwkJCQl2ID0gc2Nhbm5lci5nZXRVbnVzZWRSZXNvdXJjZXMoKTsKKwkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCVNjYW5SZXN1bHQgcmVzdWx0ID0gKFNjYW5SZXN1bHQpdi5lbGVtZW50QXQoaSk7CisJCQkJCWlmICh0ZXh0Q29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHRcdCIgKyByZXN1bHQuZ2V0TmFtZSgpICsgIiAoR3JvdXA6ICIgKyByZXN1bHQuZ2V0R3JvdXBOYW1lKCkgKyAiKSIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJYnVmZmVyLmFwcGVuZCgoaT09MCA/ICIiIDogIiwgIikgKyByZXN1bHQuZ2V0TmFtZSgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQl0ZXh0UmVwb3J0ID0gdGV4dFJlcG9ydCArIGJ1ZmZlci50b1N0cmluZygpOworCQkJfQorCQkJRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKHRleHRGaWxlKTsKKwkJCWZ3LndyaXRlKHRleHRSZXBvcnQpOworCQkJZncuZmx1c2goKTsKKwkJCWZ3LmNsb3NlKCk7CisJCX0KKwkJaWYgKGh0bWxDaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCUZpbGUgaHRtbEZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIGh0bWxGaWVsZC5nZXRUZXh0KCkpOworCQkJRG9jdW1lbnQgaHRtbFJlcG9ydCA9IGdldEhUTUxSZXBvcnR6KGh0bWxDb21iby5nZXRTZWxlY3RlZEluZGV4KCkgPT0gMCk7CisJCQlpZiAoc2NhbkNoZWNrLmlzU2VsZWN0ZWQoKSkgeworCQkJCS8vIEFkZCBmaWxlIHNjYW4gaW5mb3JtYXRpb24KKwkJCQlFbGVtZW50IGh0bWxfZWxlbSA9IGh0bWxSZXBvcnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJCQkJTm9kZUxpc3QgbmwgPSBodG1sX2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkJPRFkiKTsKKwkJCQlFbGVtZW50IGJvZHlfZWxlbSA9IChFbGVtZW50KW5sLml0ZW0oMCk7CisJCQkJRWxlbWVudCBoMl9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJIMiIpOworCQkJCVRleHQgICAgaDJfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoIkNvZGUgU2NhbiBSZXN1bHRzIik7CisJCQkJRWxlbWVudCBibG9ja19lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJCTE9DS1FVT1RFIik7CisJCQkJRWxlbWVudCBwMV9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJQIik7CisJCQkJRWxlbWVudCBwMl9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJQIik7CisJCQkJRWxlbWVudCBwM19lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJQIik7CisJCQkJVGV4dCAgICBwMV90ZXh0ID0gaHRtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZSgiTnVtYmVyIG9mIHVuaXF1ZSByZXNvdXJjZXMgZm91bmQ6ICIgKworCQkJCQkJCQkJCQkJCQkJc2Nhbm5lci5nZXROdW1iZXJNaXNzaW5nUmVzb3VyY2VzKCkpOworCQkJCVRleHQgICAgcDJfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoIk51bWJlciBvZiByZXNvdXJjZXMgbWlzc2luZyBmcm9tIGJ1bmRsZTogIiArCisJCQkJCQkJCQkJCQkJCQlzY2FubmVyLmdldE51bWJlck1pc3NpbmdSZXNvdXJjZXMoKSk7CisJCQkJVGV4dCAgICBwM190ZXh0ID0gaHRtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZSgiTnVtYmVyIG9mIHBvdGVudGlhbGx5IHVudXNlZCByZXNvdXJjZXMgaW4gYnVuZGxlOiAiICsKKwkJCQkJCQkJCQkJCQkJCXNjYW5uZXIuZ2V0TnVtYmVyVW51c2VkUmVzb3VyY2VzKCkpOworCQkJCQorCQkJCWgyX2VsZW0uYXBwZW5kQ2hpbGQoaDJfdGV4dCk7CisJCQkJcDFfZWxlbS5hcHBlbmRDaGlsZChwMV90ZXh0KTsKKwkJCQlwMl9lbGVtLmFwcGVuZENoaWxkKHAyX3RleHQpOworCQkJCXAzX2VsZW0uYXBwZW5kQ2hpbGQocDNfdGV4dCk7CisJCQkJYmxvY2tfZWxlbS5hcHBlbmRDaGlsZChwMV9lbGVtKTsKKwkJCQlibG9ja19lbGVtLmFwcGVuZENoaWxkKHAyX2VsZW0pOworCQkJCWJsb2NrX2VsZW0uYXBwZW5kQ2hpbGQocDNfZWxlbSk7CisJCQkJYm9keV9lbGVtLmFwcGVuZENoaWxkKGgyX2VsZW0pOworCQkJCWJvZHlfZWxlbS5hcHBlbmRDaGlsZChibG9ja19lbGVtKTsKKwkJCQkKKwkJCQkvLyBNaXNzaW5nIHJlc291cmNlcyBmcm9tIHRoZSBidW5kbGUKKwkJCQlUZXh0ICAgbWlzc2luZ190ZXh0ID0gbnVsbDsKKwkJCQlWZWN0b3IgdiA9IHNjYW5uZXIuZ2V0TWlzc2luZ1Jlc291cmNlcygpOworCQkJCWlmIChodG1sQ29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApIHsKKwkJCQkJRWxlbWVudCB1bF9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJVTCIpOworCQkJCQltaXNzaW5nX3RleHQgPSBodG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKCJNaXNzaW5nIFJlc291cmNlczoiKTsKKwkJCQkJdWxfZWxlbS5hcHBlbmRDaGlsZChtaXNzaW5nX3RleHQpOworCQkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCQlTY2FuUmVzdWx0IHJlc3VsdCA9IChTY2FuUmVzdWx0KXYuZWxlbWVudEF0KGkpOworCQkJCQkJRWxlbWVudCBsaV9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJMSSIpOworCQkJCQkJRWxlbWVudCBicl9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJCUiIpOworCQkJCQkJVGV4dCAgICB0MV90ZXh0ID0gaHRtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZShyZXN1bHQuZ2V0TmFtZSgpICsgIiAoIiArCisJCQkJCQkJCQkJCQkJCQkJCQkJCSAgcmVzdWx0LmdldE9jY3VyYW5jZXMoKS5zaXplKCkgKyAiIE9jY3VyYW5jZXMpIik7CisJCQkJCQlUZXh0ICAgIHQyX3RleHQgPSBodG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKHJlc3VsdC5nZXRPY2N1cmFuY2VzKCkudG9TdHJpbmcoKSk7CisJCQkJCQlsaV9lbGVtLmFwcGVuZENoaWxkKHQxX3RleHQpOworCQkJCQkJbGlfZWxlbS5hcHBlbmRDaGlsZChicl9lbGVtKTsKKwkJCQkJCWxpX2VsZW0uYXBwZW5kQ2hpbGQodDJfdGV4dCk7CisJCQkJCQl1bF9lbGVtLmFwcGVuZENoaWxkKGxpX2VsZW0pOworCQkJCQl9CisJCQkJCXAyX2VsZW0uYXBwZW5kQ2hpbGQodWxfZWxlbSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQkJYnVmZmVyLmFwcGVuZCgiTWlzc2luZyBSZXNvdXJjZXM6ICIpOworCQkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCQlTY2FuUmVzdWx0IHJlc3VsdCA9IChTY2FuUmVzdWx0KXYuZWxlbWVudEF0KGkpOworCQkJCQkJYnVmZmVyLmFwcGVuZCgoaT09MCA/ICIiIDogIiwgIikgKyByZXN1bHQuZ2V0TmFtZSgpICsgIiAoIiArIHJlc3VsdC5nZXRPY2N1cmFuY2VzKCkuc2l6ZSgpICsgIiBPY2N1cmFuY2VzKSIpOworCQkJCQl9CisJCQkJCW1pc3NpbmdfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoYnVmZmVyLnRvU3RyaW5nKCkpOworCQkJCQlFbGVtZW50IGJyX2VsZW0gPSBodG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIkJSIik7CisJCQkJCXAyX2VsZW0uYXBwZW5kQ2hpbGQoYnJfZWxlbSk7CisJCQkJCXAyX2VsZW0uYXBwZW5kQ2hpbGQobWlzc2luZ190ZXh0KTsKKwkJCQl9CisJCQkJLy8gQnVuZGxlIHJlc291cmNlcyBub3QgZm91bmQgaW4gdGhlIGNvZGUKKwkJCQlUZXh0ICAgdW51c2VkX3RleHQgPSBudWxsOworCQkJCXYgPSBzY2FubmVyLmdldFVudXNlZFJlc291cmNlcygpOworCQkJCWlmIChodG1sQ29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApIHsKKwkJCQkJRWxlbWVudCB1bF9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJVTCIpOworCQkJCQl1bnVzZWRfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoIlVudXNlZCBSZXNvdXJjZXM6Iik7CisJCQkJCXVsX2VsZW0uYXBwZW5kQ2hpbGQodW51c2VkX3RleHQpOworCQkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCQlTY2FuUmVzdWx0IHJlc3VsdCA9IChTY2FuUmVzdWx0KXYuZWxlbWVudEF0KGkpOworCQkJCQkJRWxlbWVudCBsaV9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJMSSIpOworCQkJCQkJVGV4dCAgICB0MV90ZXh0ID0gaHRtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZShyZXN1bHQuZ2V0TmFtZSgpICsgIiAoR3JvdXA6ICIgKworCQkJCQkJCQkJCQkJCQkJCQkJCQkgIHJlc3VsdC5nZXRHcm91cE5hbWUoKSArICIpIik7CisJCQkJCQlsaV9lbGVtLmFwcGVuZENoaWxkKHQxX3RleHQpOworCQkJCQkJdWxfZWxlbS5hcHBlbmRDaGlsZChsaV9lbGVtKTsKKwkJCQkJfQorCQkJCQlwM19lbGVtLmFwcGVuZENoaWxkKHVsX2VsZW0pOworCQkJCX0gZWxzZSB7CisJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIlVudXNlZCBSZXNvdXJjZXM6ICIpOworCQkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCQlTY2FuUmVzdWx0IHJlc3VsdCA9IChTY2FuUmVzdWx0KXYuZWxlbWVudEF0KGkpOworCQkJCQkJYnVmZmVyLmFwcGVuZCgoaT09MCA/ICIiIDogIiwgIikgKyByZXN1bHQuZ2V0TmFtZSgpKTsKKwkJCQkJfQorCQkJCQl1bnVzZWRfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoYnVmZmVyLnRvU3RyaW5nKCkpOworCQkJCQlFbGVtZW50IGJyX2VsZW0gPSBodG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIkJSIik7CisJCQkJCXAzX2VsZW0uYXBwZW5kQ2hpbGQoYnJfZWxlbSk7CisJCQkJCXAzX2VsZW0uYXBwZW5kQ2hpbGQodW51c2VkX3RleHQpOworCQkJCX0KKwkJCX0KKwkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihodG1sRmlsZSk7CisJCQlPdXRwdXRGb3JtYXQgb2YgPSBuZXcgT3V0cHV0Rm9ybWF0KGh0bWxSZXBvcnQpOworCQkJb2Yuc2V0SW5kZW50aW5nKHRydWUpOworCQkJb2Yuc2V0RW5jb2RpbmcoIklTTy04ODU5LTEiKTsKKwkJCUhUTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgSFRNTFNlcmlhbGl6ZXIoZncsIG9mKTsKKwkJCXNlcmlhbGl6ZXIuc2VyaWFsaXplKGh0bWxSZXBvcnQpOworCQl9CisJCWlmICh4bWxDaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCUZpbGUgeG1sRmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgeG1sRmllbGQuZ2V0VGV4dCgpKTsKKwkJCURvY3VtZW50IHhtbFJlcG9ydCA9IGdldFhNTFJlcG9ydHooeG1sQ29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApOworCQkJaWYgKHNjYW5DaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCQkvLyBBZGQgZmlsZSBzY2FuIGluZm9ybWF0aW9uCisJCQkJRWxlbWVudCByb290ID0geG1sUmVwb3J0LmdldERvY3VtZW50RWxlbWVudCgpOworCQkJCUVsZW1lbnQgY29kZV9zY2FuX2VsZW0gPSB4bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiQ09ERV9TQ0FOIik7CisJCQkJRWxlbWVudCB1bmlxdWVfZWxlbSA9IHhtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJVTklRVUVfUkVTT1VSQ0VTIik7CisJCQkJRWxlbWVudCBtaXNzaW5nX2VsZW0gPSB4bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiTUlTU0lOR19SRVNPVVJDRVMiKTsKKwkJCQlFbGVtZW50IHVudXNlZF9lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIlVOVVNFRF9SRVNPVVJDRVMiKTsKKwkJCQlFbGVtZW50IHVuaXF1ZV90b3RhbF9lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIlRPVEFMIik7CisJCQkJRWxlbWVudCBtaXNzaW5nX3RvdGFsX2VsZW0gPSB4bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiVE9UQUwiKTsKKwkJCQlFbGVtZW50IHVudXNlZF90b3RhbF9lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIlRPVEFMIik7CisJCQkJVGV4dCAgICB1bmlxdWVfdG90YWxfdGV4dCA9IHhtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihzY2FubmVyLmdldE51bWJlck1pc3NpbmdSZXNvdXJjZXMoKSkpOworCQkJCVRleHQgICAgbWlzc2luZ190b3RhbF90ZXh0ID0geG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKFN0cmluZy52YWx1ZU9mKHNjYW5uZXIuZ2V0TnVtYmVyTWlzc2luZ1Jlc291cmNlcygpKSk7CisJCQkJVGV4dCAgICB1bnVzZWRfdG90YWxfdGV4dCA9IHhtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihzY2FubmVyLmdldE51bWJlclVudXNlZFJlc291cmNlcygpKSk7CisJCQkJCisJCQkJdW5pcXVlX3RvdGFsX2VsZW0uYXBwZW5kQ2hpbGQodW5pcXVlX3RvdGFsX3RleHQpOworCQkJCW1pc3NpbmdfdG90YWxfZWxlbS5hcHBlbmRDaGlsZChtaXNzaW5nX3RvdGFsX3RleHQpOworCQkJCXVudXNlZF90b3RhbF9lbGVtLmFwcGVuZENoaWxkKHVudXNlZF90b3RhbF90ZXh0KTsKKwkJCQl1bmlxdWVfZWxlbS5hcHBlbmRDaGlsZCh1bmlxdWVfdG90YWxfZWxlbSk7CisJCQkJbWlzc2luZ19lbGVtLmFwcGVuZENoaWxkKG1pc3NpbmdfdG90YWxfZWxlbSk7CisJCQkJdW51c2VkX2VsZW0uYXBwZW5kQ2hpbGQodW51c2VkX3RvdGFsX2VsZW0pOworCQkJCWNvZGVfc2Nhbl9lbGVtLmFwcGVuZENoaWxkKHVuaXF1ZV9lbGVtKTsKKwkJCQljb2RlX3NjYW5fZWxlbS5hcHBlbmRDaGlsZChtaXNzaW5nX2VsZW0pOworCQkJCWNvZGVfc2Nhbl9lbGVtLmFwcGVuZENoaWxkKHVudXNlZF9lbGVtKTsKKwkJCQlyb290LmFwcGVuZENoaWxkKGNvZGVfc2Nhbl9lbGVtKTsKKwkJCQkvLyBNaXNzaW5nIHJlc291cmNlcyBmcm9tIHRoZSBidW5kbGUKKwkJCQlWZWN0b3IgdiA9IHNjYW5uZXIuZ2V0TWlzc2luZ1Jlc291cmNlcygpOworCQkJCWZvciAoaW50IGk9MDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKwkJCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCl2LmVsZW1lbnRBdChpKTsKKwkJCQkJRWxlbWVudCBpdGVtX2VsZW0gPSB4bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiUkVTT1VSQ0UiKTsKKwkJCQkJaXRlbV9lbGVtLnNldEF0dHJpYnV0ZSgiTkFNRSIscmVzdWx0LmdldE5hbWUoKSk7CisJCQkJCWlmICh4bWxDb21iby5nZXRTZWxlY3RlZEluZGV4KCkgPT0gMCkgeworCQkJCQkJVmVjdG9yIG9jY192ID0gcmVzdWx0LmdldE9jY3VyYW5jZXMoKTsKKwkJCQkJCWZvciAoaW50IGo9MDsgaiA8IG9jY192LnNpemUoKTsgaisrKSB7CisJCQkJCQkJT2NjdXJhbmNlIG9jYyA9IChPY2N1cmFuY2Upb2NjX3YuZWxlbWVudEF0KGopOworCQkJCQkJCUVsZW1lbnQgb2NjX2VsZW0gPSB4bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiT0NDVVJBTkNFIik7CisJCQkJCQkJb2NjX2VsZW0uc2V0QXR0cmlidXRlKCJGSUxFX05BTUUiLCBvY2MuZ2V0RmlsZU5hbWUoKSk7CisJCQkJCQkJb2NjX2VsZW0uc2V0QXR0cmlidXRlKCJGSUxFX1BBVEgiLCBvY2MuZ2V0RmlsZVBhdGgoKSk7CisJCQkJCQkJb2NjX2VsZW0uc2V0QXR0cmlidXRlKCJMSU5FX05VTUJFUiIsIFN0cmluZy52YWx1ZU9mKG9jYy5nZXRMaW5lTnVtYmVyKCkpKTsKKwkJCQkJCQlpdGVtX2VsZW0uYXBwZW5kQ2hpbGQob2NjX2VsZW0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJCW1pc3NpbmdfZWxlbS5hcHBlbmRDaGlsZChpdGVtX2VsZW0pOworCQkJCX0KKwkJCQkvLyBCdW5kbGUgcmVzb3VyY2VzIG5vdCBmb3VuZCBpbiB0aGUgY29kZQorCQkJCXYgPSBzY2FubmVyLmdldFVudXNlZFJlc291cmNlcygpOworCQkJCWZvciAoaW50IGk9MDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKKwkJCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCl2LmVsZW1lbnRBdChpKTsKKwkJCQkJRWxlbWVudCBpdGVtX2VsZW0gPSB4bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiUkVTT1VSQ0UiKTsKKwkJCQkJaXRlbV9lbGVtLnNldEF0dHJpYnV0ZSgiTkFNRSIscmVzdWx0LmdldE5hbWUoKSk7CisJCQkJCWl0ZW1fZWxlbS5zZXRBdHRyaWJ1dGUoIkdST1VQIixyZXN1bHQuZ2V0R3JvdXBOYW1lKCkpOworCQkJCQl1bnVzZWRfZWxlbS5hcHBlbmRDaGlsZChpdGVtX2VsZW0pOworCQkJCX0KKwkJCX0KKwkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih4bWxGaWxlKTsKKwkJCU91dHB1dEZvcm1hdCBvZiA9IG5ldyBPdXRwdXRGb3JtYXQoeG1sUmVwb3J0KTsKKwkJCW9mLnNldEluZGVudGluZyh0cnVlKTsKKwkJCW9mLnNldEVuY29kaW5nKCJJU08tODg1OS0xIik7CisJCQlYTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcihmdywgb2YpOworCQkJc2VyaWFsaXplci5zZXJpYWxpemUoeG1sUmVwb3J0KTsKKwkJfQorCQkKKwkJbGFzdFJlcG9ydCA9IG5ldyBEYXRlKCk7CisJCW5leHRSZXBvcnQgPSBnZW5lcmF0ZU5leHRSZXBvcnREYXRlKCk7CisJCXVwZGF0ZURhdGVGaWVsZHMoKTsKKwkJaWYgKCFpc1Zpc2libGUoKSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJSQlJlcG9ydGVyOiBHZW5lcmF0ZWQgcmVwb3J0IGF0ICIgKyBsYXN0UmVwb3J0LnRvU3RyaW5nKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJSQlJlcG9ydGVyOiBOZXh0IHJlcG9ydCBhdCAiICsgbmV4dFJlcG9ydC50b1N0cmluZygpKTsKKwkJfQorCX0KKwkKKwkvLyBBc3N1bWVzIHRoZSBsYXN0IHJlcG9ydCB3YXMganVzdCBnZW5lcmF0ZWQsIGFuZCBjb21wdXRlcyB0aGUgbmV4dCByZXBvcnQgdGltZSBhY2NvcmRpbmdseQorCXByaXZhdGUgRGF0ZSBnZW5lcmF0ZU5leHRSZXBvcnREYXRlKCkgeworCQlEYXRlIHJldERhdGUgPSBudWxsOworCQlHcmVnb3JpYW5DYWxlbmRhciBub3cgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKwkJaWYgKHNlcXVlbnRpYWxSYWRpby5pc1NlbGVjdGVkKCkpIHsKKwkJCWludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQodmFsdWVDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJCWlmICh1bml0Q29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApIG5vdy5hZGQoQ2FsZW5kYXIuTUlOVVRFLCB2YWx1ZSk7CisJCQllbHNlIGlmICh1bml0Q29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDEpIG5vdy5hZGQoQ2FsZW5kYXIuSE9VUiwgdmFsdWUpOworCQkJZWxzZSBpZiAodW5pdENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAyKSBub3cuYWRkKENhbGVuZGFyLkRBVEUsIHZhbHVlKTsKKwkJCXJldERhdGUgPSBub3cuZ2V0VGltZSgpOworCQl9IGVsc2UgaWYgKGRlZmluZWRSYWRpby5pc1NlbGVjdGVkKCkpIHsKKwkJCWludCBob3VyID0gSW50ZWdlci5wYXJzZUludChob3VyQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSk7CisJCQlpbnQgbWludXRlID0gSW50ZWdlci5wYXJzZUludChtaW51dGVDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJCWludCBkYXkgPSBkYXlDb21iby5nZXRTZWxlY3RlZEluZGV4KCk7CisJCQkKKwkJCUdyZWdvcmlhbkNhbGVuZGFyIHRoZW4gPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKwkJCXRoZW4uc2V0KENhbGVuZGFyLkhPVVIsIGhvdXIpOworCQkJdGhlbi5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBtaW51dGUpOworCQkJdGhlbi5zZXQoQ2FsZW5kYXIuU0VDT05ELCAwKTsKKwkJCQorCQkJaWYgKHRoZW4uZ2V0VGltZSgpLmNvbXBhcmVUbyhub3cuZ2V0VGltZSgpKSA8PSAwKSB0aGVuLmFkZChDYWxlbmRhci5EQVRFLCAxKTsKKwkJCWlmIChkYXkgPiAwICYmIGRheSA8PSA3KSB7CisJCQkJLy8gTWFrZSBzdXJlIHdlIGFyZSBhdCB0aGUgcmlnaHQgZGF5CisJCQkJYm9vbGVhbiByaWdodERheSA9IGZhbHNlOworCQkJCXdoaWxlICghcmlnaHREYXkpIHsKKwkJCQkJaW50IHdlZWtEYXkgPSB0aGVuLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyk7CisJCQkJCWlmICgoZGF5ID09IDEgJiYgd2Vla0RheSA9PSBDYWxlbmRhci5NT05EQVkpIHx8CisJCQkJCQkoZGF5ID09IDIgJiYgd2Vla0RheSA9PSBDYWxlbmRhci5UVUVTREFZKSB8fAorCQkJCQkJKGRheSA9PSAzICYmIHdlZWtEYXkgPT0gQ2FsZW5kYXIuV0VETkVTREFZKSB8fAorCQkJCQkJKGRheSA9PSA0ICYmIHdlZWtEYXkgPT0gQ2FsZW5kYXIuVEhVUlNEQVkpIHx8CisJCQkJCQkoZGF5ID09IDUgJiYgd2Vla0RheSA9PSBDYWxlbmRhci5GUklEQVkpIHx8CisJCQkJCQkoZGF5ID09IDYgJiYgd2Vla0RheSA9PSBDYWxlbmRhci5TQVRVUkRBWSkgfHwKKwkJCQkJCShkYXkgPT0gNyAmJiB3ZWVrRGF5ID09IENhbGVuZGFyLlNVTkRBWSkpIHJpZ2h0RGF5ID0gdHJ1ZTsKKwkJCQkJZWxzZSB0aGVuLmFkZChDYWxlbmRhci5EQVRFLCAxKTsKKwkJCQl9CisJCQl9CisJCQlyZXREYXRlID0gdGhlbi5nZXRUaW1lKCk7CisJCX0KKwkJUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKCJOZXh0IERhdGU6ICIgKyByZXREYXRlLnRvU3RyaW5nKCkpOworCQlyZXR1cm4gcmV0RGF0ZTsKKwl9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGJhc2VkIHRleHQgcmVwb3J0IGFib3V0IGFsbCBvZiB0aGUgbGFuZ3VhZ2UgZmlsZXMgb24gcmVjb3JkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGxMYW5ndWFnZVJlcG9ydHMoYm9vbGVhbiBkZXRhaWxlZCkgeworICAgICAgICBTdHJpbmcgcmV0U3RyID0gbmV3IFN0cmluZygpOworICAgICAgICByZXRTdHIgPSAgICAiUmVzb3VyY2UgQnVuZGxlIFJlcG9ydDogIiArIHJibS5nZXRCYXNlQ2xhc3MoKTsKKyAgICAgICAgcmV0U3RyICs9ICJcblJlcG9ydCBHZW5lcmF0ZWQ6ICAgICAgICIgKyAobmV3IERhdGUoKSkudG9TdHJpbmcoKSArICJcblxuIjsKKyAgICAgICAgVmVjdG9yIGJ1bmRsZXMgPSByYm0uZ2V0QnVuZGxlcygpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICByZXRTdHIgKz0gZ2V0TGFuZ3VhZ2VSZXBvcnQoZGV0YWlsZWQsIChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSkpOwkKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0U3RyOworICAgIH0KKwkKKyAgICBwcml2YXRlIFN0cmluZyBnZXRMYW5ndWFnZVJlcG9ydChib29sZWFuIGRldGFpbGVkLCBCdW5kbGUgZGljdCkgeworICAgICAgICBpZiAoZGljdCA9PSBudWxsKSByZXR1cm4gIiI7CisgICAgICAgIFN0cmluZyByZXRTdHIgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgIHJldFN0ciArPSAiXG5MYW5ndWFnZTogIiArIChkaWN0Lmxhbmd1YWdlID09IG51bGwgPyBkaWN0LmVuY29kaW5nIDogZGljdC5sYW5ndWFnZSk7CisgICAgICAgIHJldFN0ciArPSAoZGljdC5jb3VudHJ5ID09IG51bGwgPyAiIiA6ICIgLSBDb3VudHJ5OiAiICsgZGljdC5jb3VudHJ5KTsKKyAgICAgICAgcmV0U3RyICs9IChkaWN0LnZhcmlhbnQgPT0gbnVsbCA/ICIiIDogIiAtIFZhcmlhbnQ6ICIgKyBkaWN0LnZhcmlhbnQpOworICAgICAgICByZXRTdHIgKz0gIlxuIjsKKyAgICAgICAgcmV0U3RyICs9ICIgIE51bWJlciBvZiBOTFMgaXRlbXMgaW4gdGhlIGZpbGU6ICIgKyBkaWN0LmFsbEl0ZW1zLnNpemUoKSArICJcbiI7CisJCQorICAgICAgICBpbnQgdW50cmFuc2xhdGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHVudHJhbnNTdHIgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgIEVudW1lcmF0aW9uIGl0ZW1zID0gZGljdC5hbGxJdGVtcy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUl0ZW0gdGVtcEl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHRlbXBJdGVtLmlzVHJhbnNsYXRlZCgpKSBjb250aW51ZTsKKyAgICAgICAgICAgIHVudHJhbnNsYXRlZCsrOworICAgICAgICAgICAgdW50cmFuc1N0ciArPSAiICIgKyB0ZW1wSXRlbS5nZXRLZXkoKTsKKyAgICAgICAgfQorICAgICAgICByZXRTdHIgKz0gIiAgTnVtYmVyIG9mIE5MUyBpdGVtcyBub3QgdHJhbnNsYXRlZDogIiArIHVudHJhbnNsYXRlZDsKKyAgICAgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICAgICAgICByZXRTdHIgKz0gIlxuICBVbnRyYW5zbGF0ZWQgTkxTIGtleXM6ICIgKyB1bnRyYW5zU3RyOwkKKyAgICAgICAgfQorCQkKKyAgICAgICAgcmV0dXJuIHJldFN0cjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYSFRNTCBmb3JtYXR0ZWQgcmVwb3J0IG9uIHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnRseSBvcGVuZWQgcmVzb3VyY2UgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIERvY3VtZW50IGdldEhUTUxSZXBvcnR6KGJvb2xlYW4gZGV0YWlsZWQpIHsKKyAgICAgICAgRG9jdW1lbnQgaHRtbCA9IG5ldyBEb2N1bWVudEltcGwoKTsKKyAgICAgICAgRWxlbWVudCByb290ID0gaHRtbC5jcmVhdGVFbGVtZW50KCJIVE1MIik7CisgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQocm9vdCk7CisgICAgICAgIEVsZW1lbnQgaGVhZF9lbGVtID0gaHRtbC5jcmVhdGVFbGVtZW50KCJIRUFEIik7CisgICAgICAgIEVsZW1lbnQgdGl0bGVfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiVElUTEUiKTsKKyAgICAgICAgVGV4dCAgICB0aXRsZV90ZXh0ID0gaHRtbC5jcmVhdGVUZXh0Tm9kZSgiUmVzb3VyY2UgQnVuZGxlIFJlcG9ydCAtICIgKyByYm0uZ2V0QmFzZUNsYXNzKCkpOworICAgICAgICBFbGVtZW50IGJvZHlfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiQk9EWSIpOworICAgICAgICBFbGVtZW50IGNlbnRlcjFfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiQ0VOVEVSIik7CisgICAgICAgIEVsZW1lbnQgaDFfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiSDEiKTsKKyAgICAgICAgRWxlbWVudCBjZW50ZXIyX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkNFTlRFUiIpOworICAgICAgICBFbGVtZW50IGgzX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkgxIik7CisgICAgICAgIFRleHQgICAgdGl0bGUxX3RleHQgPSBodG1sLmNyZWF0ZVRleHROb2RlKCJSZXNvdXJjZSBCdW5kbGUgUmVwb3J0OiAiICsgcmJtLmdldEJhc2VDbGFzcygpKTsKKyAgICAgICAgVGV4dCAgICB0aXRsZTJfdGV4dCA9IGh0bWwuY3JlYXRlVGV4dE5vZGUoIlJlcG9ydCBHZW5lcmF0ZWQ6ICIgKyAobmV3IERhdGUoKSkudG9TdHJpbmcoKSk7CisgICAgICAgIFZlY3RvciBidW5kbGVzID0gcmJtLmdldEJ1bmRsZXMoKTsKKwkJCisgICAgICAgIHRpdGxlX2VsZW0uYXBwZW5kQ2hpbGQodGl0bGVfdGV4dCk7CisgICAgICAgIGhlYWRfZWxlbS5hcHBlbmRDaGlsZCh0aXRsZV9lbGVtKTsKKyAgICAgICAgaDFfZWxlbS5hcHBlbmRDaGlsZCh0aXRsZTFfdGV4dCk7CisgICAgICAgIGgzX2VsZW0uYXBwZW5kQ2hpbGQodGl0bGUyX3RleHQpOworICAgICAgICBjZW50ZXIxX2VsZW0uYXBwZW5kQ2hpbGQoaDFfZWxlbSk7CisgICAgICAgIGNlbnRlcjJfZWxlbS5hcHBlbmRDaGlsZChoM19lbGVtKTsKKyAgICAgICAgYm9keV9lbGVtLmFwcGVuZENoaWxkKGNlbnRlcjFfZWxlbSk7CisgICAgICAgIGJvZHlfZWxlbS5hcHBlbmRDaGlsZChjZW50ZXIyX2VsZW0pOworICAgICAgICByb290LmFwcGVuZENoaWxkKGhlYWRfZWxlbSk7CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoYm9keV9lbGVtKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGdldEhUTUxMYW5ndWFnZVJlcG9ydHooaHRtbCwgYm9keV9lbGVtLCBkZXRhaWxlZCwgKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gaHRtbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIEhUTUwgcmVwb3J0IGFzIGEgU3RyaW5nIG9iamVjdCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50bHkgb3BlbmVkIHJlc291cmNlIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SFRNTFJlcG9ydChib29sZWFuIGRldGFpbGVkKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxIVE1MPlxuPEhFQUQ+PFRJVExFPlJlc291cmNlIEJ1bmRsZSBSZXBvcnQgLSAiICsgcmJtLmdldEJhc2VDbGFzcygpICsgIjwvVElUTEU+PC9IRUFEPlxuPEJPRFk+XG4iKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPENFTlRFUj48SDE+UmVzb3VyY2UgQnVuZGxlIFJlcG9ydDogIiArIHJibS5nZXRCYXNlQ2xhc3MoKSArICI8L0gxPjwvQ0VOVEVSPlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxDRU5URVI+PEgzPlJlcG9ydCBHZW5lcmF0ZWQ6ICIgKyAobmV3IERhdGUoKSkudG9TdHJpbmcoKSArICI8L0gzPjwvQ0VOVEVSPlxuIik7CisJCQorICAgICAgICBWZWN0b3IgYnVuZGxlcyA9IHJibS5nZXRCdW5kbGVzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0SFRNTExhbmd1YWdlUmVwb3J0KGRldGFpbGVkLCAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpKSk7CQorICAgICAgICB9CisJCQorICAgICAgICBidWZmZXIuYXBwZW5kKCI8L0JPRFk+XG48L0hUTUw+Iik7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSB2b2lkIGdldEhUTUxMYW5ndWFnZVJlcG9ydHooRG9jdW1lbnQgaHRtbCwgRWxlbWVudCBib2R5X2VsZW0sIGJvb2xlYW4gZGV0YWlsZWQsIEJ1bmRsZSBkaWN0KSB7CisgICAgICAgIEVsZW1lbnQgaDJfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiSDIiKTsKKyAgICAgICAgVGV4dCAgICBoMl90ZXh0ID0gaHRtbC5jcmVhdGVUZXh0Tm9kZSgiTGFuZ3VhZ2U6ICIgKyAoZGljdC5sYW5ndWFnZSA9PSBudWxsID8gZGljdC5lbmNvZGluZyA6IGRpY3QubGFuZ3VhZ2UpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpY3QuY291bnRyeSA9PSBudWxsID8gIiIgOiAiIC0gQ291bnRyeTogIiArIGRpY3QuY291bnRyeSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoZGljdC52YXJpYW50ID09IG51bGwgPyAiIiA6ICIgLSBWYXJpYW50OiAiICsgZGljdC52YXJpYW50KSk7CisgICAgICAgIEVsZW1lbnQgYmxvY2tfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiQkxPQ0tRVU9URSIpOworICAgICAgICBFbGVtZW50IHBfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiUCIpOworICAgICAgICBUZXh0ICAgIHBfdGV4dCA9IGh0bWwuY3JlYXRlVGV4dE5vZGUoIk51bWJlciBvZiBOTFMgaXRlbXMgaW4gdGhlIGZpbGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGRpY3QuYWxsSXRlbXMuc2l6ZSgpKSk7CisgICAgICAgIEVsZW1lbnQgdWxfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiVUwiKTsKKyAgICAgICAgVGV4dCAgICB1bF90ZXh0ID0gaHRtbC5jcmVhdGVUZXh0Tm9kZSgiVW50cmFuc2xhdGVkIE5MUyBrZXlzOiIpOworCQkKKyAgICAgICAgaDJfZWxlbS5hcHBlbmRDaGlsZChoMl90ZXh0KTsKKyAgICAgICAgcF9lbGVtLmFwcGVuZENoaWxkKHBfdGV4dCk7CisgICAgICAgIHVsX2VsZW0uYXBwZW5kQ2hpbGQodWxfdGV4dCk7CisgICAgICAgIGJsb2NrX2VsZW0uYXBwZW5kQ2hpbGQocF9lbGVtKTsKKyAgICAgICAgYm9keV9lbGVtLmFwcGVuZENoaWxkKGgyX2VsZW0pOworICAgICAgICBib2R5X2VsZW0uYXBwZW5kQ2hpbGQoYmxvY2tfZWxlbSk7CisJCQorICAgICAgICBpbnQgdW50cmFuc2xhdGVkID0gMDsKKyAgICAgICAgRW51bWVyYXRpb24gaXRlbXMgPSBkaWN0LmFsbEl0ZW1zLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChpdGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgQnVuZGxlSXRlbSB0ZW1wSXRlbSA9IChCdW5kbGVJdGVtKWl0ZW1zLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAodGVtcEl0ZW0uaXNUcmFuc2xhdGVkKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgdW50cmFuc2xhdGVkKys7CisgICAgICAgICAgICBpZiAoZGV0YWlsZWQpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGxpX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkxJIik7CisgICAgICAgICAgICAgICAgVGV4dCAgICBsaV90ZXh0ID0gaHRtbC5jcmVhdGVUZXh0Tm9kZSh0ZW1wSXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgbGlfZWxlbS5hcHBlbmRDaGlsZChsaV90ZXh0KTsKKyAgICAgICAgICAgICAgICB1bF9lbGVtLmFwcGVuZENoaWxkKGxpX2VsZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgcDJfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiUCIpOworICAgICAgICBUZXh0ICAgIHAyX3RleHQgPSBodG1sLmNyZWF0ZVRleHROb2RlKCJOdW1iZXIgb2YgTkxTIGl0ZW1zIG5vdCB0cmFuc2xhdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YodW50cmFuc2xhdGVkKSk7CisgICAgICAgIHAyX2VsZW0uYXBwZW5kQ2hpbGQocDJfdGV4dCk7CisgICAgICAgIGJsb2NrX2VsZW0uYXBwZW5kQ2hpbGQocDJfZWxlbSk7CisgICAgICAgIGlmIChkZXRhaWxlZCkgYmxvY2tfZWxlbS5hcHBlbmRDaGlsZCh1bF9lbGVtKTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SFRNTExhbmd1YWdlUmVwb3J0KGJvb2xlYW4gZGV0YWlsZWQsIEJ1bmRsZSBkaWN0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuPEgyPkxhbmd1YWdlOiAiICsgKGRpY3QubGFuZ3VhZ2UgPT0gbnVsbCA/IGRpY3QuZW5jb2RpbmcgOiBkaWN0Lmxhbmd1YWdlKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZGljdC5jb3VudHJ5ID09IG51bGwgPyAiIiA6ICIgLSBDb3VudHJ5OiAiICsgZGljdC5jb3VudHJ5KTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChkaWN0LnZhcmlhbnQgPT0gbnVsbCA/ICIiIDogIiAtIFZhcmlhbnQ6ICIgKyBkaWN0LnZhcmlhbnQpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI8L0gyPlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxCTE9DS1FVT1RFPlxuIik7CisgICAgICAgIAorICAgICAgICBidWZmZXIuYXBwZW5kKCI8UD5OdW1iZXIgb2YgTkxTIGl0ZW1zIGluIHRoZSBmaWxlOiAiICsgU3RyaW5nLnZhbHVlT2YoZGljdC5hbGxJdGVtcy5zaXplKCkpICsgIjwvUD5cbiIpOworICAgICAgICBpbnQgdW50cmFuc2xhdGVkID0gMDsKKyAgICAgICAgRW51bWVyYXRpb24gaXRlbXMgPSBkaWN0LmFsbEl0ZW1zLmVsZW1lbnRzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBpbm5lckJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBCdW5kbGVJdGVtIHRlbXBJdGVtID0gKEJ1bmRsZUl0ZW0paXRlbXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICh0ZW1wSXRlbS5pc1RyYW5zbGF0ZWQoKSkgY29udGludWU7CisgICAgICAgICAgICB1bnRyYW5zbGF0ZWQrKzsKKyAgICAgICAgICAgIGlubmVyQnVmZmVyLmFwcGVuZCgiPExJPiIgKyB0ZW1wSXRlbS5nZXRLZXkoKSArICI8L0xJPlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPFA+TnVtYmVyIG9mIE5MUyBpdGVtcyBub3QgdHJhbnNsYXRlZDogIiArIFN0cmluZy52YWx1ZU9mKHVudHJhbnNsYXRlZCkgKyAiPC9QPlxuIik7CisgICAgICAgIGlmIChkZXRhaWxlZCkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPFVMPlVudHJhbnNsYXRlZCBOTFMga2V5czpcbiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChpbm5lckJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvVUw+XG4iKTsKKyAgICAgICAgfQorCQkKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPC9CTE9DS1FVT1RFPlxuIik7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIFhNTCBmb3JtYXR0ZWQgcmVwb3J0IG9uIHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnRseSBvcGVuIHJlc291cmNlIGJ1bmRsZQorICAgICAqLyAKKwkKKyAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0WE1MUmVwb3J0eihib29sZWFuIGRldGFpbGVkKSB7CisgICAgICAgIERvY3VtZW50IHhtbCA9IG5ldyBEb2N1bWVudEltcGwoKTsKKyAgICAgICAgRWxlbWVudCByb290ID0geG1sLmNyZWF0ZUVsZW1lbnQoIlJFUE9SVCIpOworICAgICAgICByb290LnNldEF0dHJpYnV0ZSgiQkFTRUNMQVNTIiwgcmJtLmdldEJhc2VDbGFzcygpKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoIkRBVEUiLCAobmV3IERhdGUoKSkudG9TdHJpbmcoKSk7CisgICAgICAgIHhtbC5hcHBlbmRDaGlsZChyb290KTsKKworICAgICAgICBWZWN0b3IgYnVuZGxlcyA9IHJibS5nZXRCdW5kbGVzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZ2V0WE1MTGFuZ3VhZ2VSZXBvcnR6KHhtbCwgZGV0YWlsZWQsIChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geG1sOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIFhNTCBmb3JtYXR0ZWQgcmVwb3J0IGFzIGEgU3RyaW5nIG9iamVjdCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50bHkgb3BlbiByZXNvdXJjZSBidW5kbGUKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFhNTFJlcG9ydChib29sZWFuIGRldGFpbGVkKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4iKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPFJFUE9SVCBCQVNFQ0xBU1M9XCIiICsgcmJtLmdldEJhc2VDbGFzcygpICsgIlwiIERBVEU9XCIiICsgKG5ldyBEYXRlKCkpLnRvU3RyaW5nKCkgKyAiXCI+XG4iKTsKKworICAgICAgICBWZWN0b3IgYnVuZGxlcyA9IHJibS5nZXRCdW5kbGVzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0WE1MTGFuZ3VhZ2VSZXBvcnQoZGV0YWlsZWQsIChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSkpKTsJCisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPC9SRVBPUlQ+Iik7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSBFbGVtZW50IGdldFhNTExhbmd1YWdlUmVwb3J0eihEb2N1bWVudCB4bWwsIGJvb2xlYW4gZGV0YWlsZWQsIEJ1bmRsZSBkaWN0KSB7CisgICAgICAgIEVsZW1lbnQgbGFuZ19yZXBvcnRfZWxlbSA9IHhtbC5jcmVhdGVFbGVtZW50KCJMQU5HVUFHRV9SRVBPUlQiKTsKKyAgICAgICAgRWxlbWVudCBsb2NhbGVfZWxlbSA9IHhtbC5jcmVhdGVFbGVtZW50KCJMT0NBTEUiKTsKKyAgICAgICAgbG9jYWxlX2VsZW0uc2V0QXR0cmlidXRlKCJMQU5HVUFHRSIsIChkaWN0Lmxhbmd1YWdlID09IG51bGwgPyBkaWN0LmVuY29kaW5nIDogZGljdC5sYW5ndWFnZSkpOworICAgICAgICBsb2NhbGVfZWxlbS5zZXRBdHRyaWJ1dGUoIkNPVU5UUlkiLCAoZGljdC5jb3VudHJ5ID09IG51bGwgPyAiIiA6IGRpY3QuY291bnRyeSkpOworICAgICAgICBsb2NhbGVfZWxlbS5zZXRBdHRyaWJ1dGUoIlZBUklBTlQiLCAoZGljdC52YXJpYW50ID09IG51bGwgPyAiIiA6IGRpY3QudmFyaWFudCkpOworICAgICAgICBFbGVtZW50IG5sc190b3RhbF9lbGVtID0geG1sLmNyZWF0ZUVsZW1lbnQoIk5MU19UT1RBTCIpOworICAgICAgICBUZXh0ICAgIG5sc190b3RhbF90ZXh0ID0geG1sLmNyZWF0ZVRleHROb2RlKFN0cmluZy52YWx1ZU9mKGRpY3QuYWxsSXRlbXMuc2l6ZSgpKSk7CisgICAgICAgIEVsZW1lbnQgdW50cmFuc2xhdGVkX3RvdGFsX2VsZW0gPSB4bWwuY3JlYXRlRWxlbWVudCgiVU5UUkFOU0xBVEVEX1RPVEFMIik7CisgICAgICAgIEVsZW1lbnQgdW50cmFuc2xhdGVkX2VsZW0gPSB4bWwuY3JlYXRlRWxlbWVudCgiVU5UUkFOU0xBVEVEIik7CisgICAgICAgIAorICAgICAgICBubHNfdG90YWxfZWxlbS5hcHBlbmRDaGlsZChubHNfdG90YWxfdGV4dCk7CisgICAgICAgIGxhbmdfcmVwb3J0X2VsZW0uYXBwZW5kQ2hpbGQobG9jYWxlX2VsZW0pOworICAgICAgICBsYW5nX3JlcG9ydF9lbGVtLmFwcGVuZENoaWxkKG5sc190b3RhbF9lbGVtKTsKKyAgICAgICAgbGFuZ19yZXBvcnRfZWxlbS5hcHBlbmRDaGlsZCh1bnRyYW5zbGF0ZWRfdG90YWxfZWxlbSk7CisgICAgICAgIGlmIChkZXRhaWxlZCkgbGFuZ19yZXBvcnRfZWxlbS5hcHBlbmRDaGlsZCh1bnRyYW5zbGF0ZWRfZWxlbSk7CisJCQorICAgICAgICBpbnQgdW50cmFuc2xhdGVkID0gMDsKKyAgICAgICAgRW51bWVyYXRpb24gaXRlbXMgPSBkaWN0LmFsbEl0ZW1zLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChpdGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgQnVuZGxlSXRlbSB0ZW1wSXRlbSA9IChCdW5kbGVJdGVtKWl0ZW1zLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAodGVtcEl0ZW0uaXNUcmFuc2xhdGVkKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgdW50cmFuc2xhdGVkKys7CisgICAgICAgICAgICBFbGVtZW50IHJlc291cmNlX2VsZW0gPSB4bWwuY3JlYXRlRWxlbWVudCgiUkVTT1VSQ0VLRVkiKTsKKyAgICAgICAgICAgIFRleHQgICAgcmVzb3VyY2VfdGV4dCA9IHhtbC5jcmVhdGVUZXh0Tm9kZSh0ZW1wSXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICByZXNvdXJjZV9lbGVtLmFwcGVuZENoaWxkKHJlc291cmNlX3RleHQpOworICAgICAgICAgICAgdW50cmFuc2xhdGVkX2VsZW0uYXBwZW5kQ2hpbGQocmVzb3VyY2VfZWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgVGV4dCB1bnRyYW5zbGF0ZWRfdG90YWxfdGV4dCA9IHhtbC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZih1bnRyYW5zbGF0ZWQpKTsKKyAgICAgICAgdW50cmFuc2xhdGVkX3RvdGFsX2VsZW0uYXBwZW5kQ2hpbGQodW50cmFuc2xhdGVkX3RvdGFsX3RleHQpOworCQkKKyAgICAgICAgcmV0dXJuIGxhbmdfcmVwb3J0X2VsZW07CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGdldFhNTExhbmd1YWdlUmVwb3J0KGJvb2xlYW4gZGV0YWlsZWQsIEJ1bmRsZSBkaWN0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxMQU5HVUFHRV9SRVBPUlQ+XG4iKTsKKyAgICAgICAgCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuXHQ8TE9DQUxFIExBTkdVQUdFPVwiIiArIChkaWN0Lmxhbmd1YWdlID09IG51bGwgPyBkaWN0LmVuY29kaW5nIDogZGljdC5sYW5ndWFnZSkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJcIiBDT1VOVFJZPVwiIiArIChkaWN0LmNvdW50cnkgPT0gbnVsbCA/ICIiIDogZGljdC5jb3VudHJ5KSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlwiIFZBUklBTlQ9XCIiICsgKGRpY3QudmFyaWFudCA9PSBudWxsID8gIiIgOiBkaWN0LnZhcmlhbnQpICsgIlwiLz5cbiIpOworCQkKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHQ8TkxTX1RPVEFMPiIgKyBTdHJpbmcudmFsdWVPZihkaWN0LmFsbEl0ZW1zLnNpemUoKSkgKyAiPC9OTFNfVE9UQUw+XG4iKTsKKyAgICAgICAgaW50IHVudHJhbnNsYXRlZCA9IDA7CisgICAgICAgIEVudW1lcmF0aW9uIGl0ZW1zID0gZGljdC5hbGxJdGVtcy5lbGVtZW50cygpOworICAgICAgICBTdHJpbmdCdWZmZXIgaW5uZXJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlIChpdGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgQnVuZGxlSXRlbSB0ZW1wSXRlbSA9IChCdW5kbGVJdGVtKWl0ZW1zLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAodGVtcEl0ZW0uaXNUcmFuc2xhdGVkKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgdW50cmFuc2xhdGVkKys7CisgICAgICAgICAgICBpbm5lckJ1ZmZlci5hcHBlbmQoIlx0XHQ8UkVTT1VSQ0VLRVk+IiArIHRlbXBJdGVtLmdldEtleSgpICsgIjwvUkVTT1VSQ0VLRVk+XG4iKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKCJcdDxVTlRSQU5TTEFURURfVE9UQUw+IiArIFN0cmluZy52YWx1ZU9mKHVudHJhbnNsYXRlZCkgKyAiPC9VTlRSQU5TTEFURURfVE9UQUw+XG4iKTsKKyAgICAgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcdDxVTlRSQU5TTEFURUQ+XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaW5uZXJCdWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcdDwvVU5UUkFOU0xBVEVEPlxuIik7CisgICAgICAgIH0KKwkJCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvTEFOR1VBR0VfUkVQT1JUPlxuIik7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZURhdGVGaWVsZHMoKSB7CisJCWlmIChuZXh0UmVwb3J0ID09IG51bGwpIG5leHRSZXBvcnRMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfbmV4dF9yZXBvcnQiLCAiLS0iKSk7CisJCWVsc2UgbmV4dFJlcG9ydExhYmVsLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9uZXh0X3JlcG9ydCIsIG5leHRSZXBvcnQudG9TdHJpbmcoKSkpOworCQlpZiAobGFzdFJlcG9ydCA9PSBudWxsKSBsYXN0UmVwb3J0TGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2xhc3RfcmVwb3J0IiwgIi0tIikpOworCQllbHNlIGxhc3RSZXBvcnRMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfbGFzdF9yZXBvcnQiLCBsYXN0UmVwb3J0LnRvU3RyaW5nKCkpKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1c0NvbXBvbmVudHMoKSB7CisJCWlmIChydW5uaW5nKSB7CisJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfc3RhdHVzX3J1bm5pbmciKSk7CisJCQlzdGF0dXNMYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLmdyZWVuKTsKKwkJCXN0YXR1c0J1dHRvbi5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfYnV0dG9uX3N0b3AiKSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXNMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfc3RhdHVzX3N0b3BwZWQiKSk7CisJCQlzdGF0dXNMYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLnJlZCk7CisJCQlzdGF0dXNCdXR0b24uc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2J1dHRvbl9zdGFydCIpKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0Q29tcG9uZW50c1RvRGVmYXVsdHMoKSB7CisJCWlmICgocnVubmluZyAmJiBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9lbmFibGVkIikuZXF1YWxzKCJObyIpKSB8fAorCQkJKCFydW5uaW5nICYmIFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2VuYWJsZWQiKS5lcXVhbHMoIlllcyIpKSkgdG9nZ2xlU3RhdHVzKCk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9lbmFibGVkIikgIT0gbnVsbCkKKwkJCXRleHRDaGVjay5zZXRTZWxlY3RlZChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9lbmFibGVkIikuZXF1YWxzKCJZZXMiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfaHRtbF9lbmFibGVkIikgIT0gbnVsbCkKKwkJCWh0bWxDaGVjay5zZXRTZWxlY3RlZChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfaHRtbF9lbmFibGVkIikuZXF1YWxzKCJZZXMiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2VuYWJsZWQiKSAhPSBudWxsKQorCQkJCXhtbENoZWNrLnNldFNlbGVjdGVkKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF94bWxfZW5hYmxlZCIpLmVxdWFscygiWWVzIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZmlsZSIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9maWxlIikuZXF1YWxzKCIiKSkKKwkJCXRleHRGaWVsZC5zZXRUZXh0KFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF90ZXh0X2ZpbGUiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfaHRtbF9maWxlIikgIT0gbnVsbCAmJgorCQkJIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF9odG1sX2ZpbGUiKS5lcXVhbHMoIiIpKQorCQkJaHRtbEZpZWxkLnNldFRleHQoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZmlsZSIpKTsKKwkJaWYgKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF94bWxfZmlsZSIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2ZpbGUiKS5lcXVhbHMoIiIpKQorCQkJeG1sRmllbGQuc2V0VGV4dChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2ZpbGUiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9kZXRhaWwiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZGV0YWlsIikuZXF1YWxzKCIiKSkKKwkJCXNlbGVjdENvbWJvVmFsdWUodGV4dENvbWJvLCBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9kZXRhaWwiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfaHRtbF9kZXRhaWwiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZGV0YWlsIikuZXF1YWxzKCIiKSkKKwkJCXNlbGVjdENvbWJvVmFsdWUoaHRtbENvbWJvLCBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfaHRtbF9kZXRhaWwiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2RldGFpbCIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2RldGFpbCIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKHhtbENvbWJvLCBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2RldGFpbCIpKTsKKwkJaWYgKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsIikuZXF1YWxzKCJTZXF1ZW50aWFsIikpCisJCQlzZXF1ZW50aWFsUmFkaW8uc2V0U2VsZWN0ZWQodHJ1ZSk7CisJCWVsc2UgZGVmaW5lZFJhZGlvLnNldFNlbGVjdGVkKHRydWUpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF92YWx1ZSIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsX3ZhbHVlIikuZXF1YWxzKCIiKSkKKwkJCXNlbGVjdENvbWJvVmFsdWUodmFsdWVDb21ibywgUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF92YWx1ZSIpKTsKKwkJaWYgKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdW5pdHMiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF91bml0cyIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKHZhbHVlQ29tYm8sIFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdW5pdHMiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2hvdXIiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9ob3VyIikuZXF1YWxzKCIiKSkKKwkJCXNlbGVjdENvbWJvVmFsdWUoaG91ckNvbWJvLCBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2hvdXIiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2RheSIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2RheSIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKGRheUNvbWJvLCBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2RheSIpKTsKKwkJaWYgKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfbWludXRlIikgIT0gbnVsbCAmJgorCQkJIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfbWludXRlIikuZXF1YWxzKCIiKSkKKwkJCXNlbGVjdENvbWJvVmFsdWUobWludXRlQ29tYm8sIFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfbWludXRlIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfc2Nhbl9maWxlIikgIT0gbnVsbCAmJgorCQkJIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX3NjYW5fZmlsZSIpLmVxdWFscygiIikpCisJCQlzY2FuRmllbGQuc2V0VGV4dChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9zY2FuX2ZpbGUiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9wZXJmb3JtX3NjYW4iKSAhPSBudWxsKQorCQkJc2NhbkNoZWNrLnNldFNlbGVjdGVkKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX3BlcmZvcm1fc2NhbiIpLmVxdWFscygiWWVzIikpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbGVjdENvbWJvVmFsdWUoSkNvbWJvQm94IGJveCwgU3RyaW5nIHZhbHVlKSB7CisJCWZvciAoaW50IGk9MDsgaSA8IGJveC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7CisJCQlpZiAoYm94LmdldEl0ZW1BdChpKS50b1N0cmluZygpLmVxdWFscyh2YWx1ZSkpIHsKKwkJCQlib3guc2V0U2VsZWN0ZWRJbmRleChpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2F2ZURlZmF1bHRzKCkgeworCQkvLyBTYXZlIGZvcm1hdCBvcHRpb25zCisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF90ZXh0X2VuYWJsZWQiLCAodGV4dENoZWNrLmlzU2VsZWN0ZWQoKSA/ICJZZXMiIDogIk5vIikpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9maWxlIiwgdGV4dEZpZWxkLmdldFRleHQoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF90ZXh0X2RldGFpbCIsIHRleHRDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZW5hYmxlZCIsIChodG1sQ2hlY2suaXNTZWxlY3RlZCgpID8gIlllcyIgOiAiTm8iKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF9odG1sX2ZpbGUiLCBodG1sRmllbGQuZ2V0VGV4dCgpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZGV0YWlsIiwgaHRtbENvbWJvLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2VuYWJsZWQiLCAoeG1sQ2hlY2suaXNTZWxlY3RlZCgpID8gIlllcyIgOiAiTm8iKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF94bWxfZmlsZSIsIHhtbEZpZWxkLmdldFRleHQoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF94bWxfZGV0YWlsIiwgeG1sQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX3NjYW5fZmlsZSIsIHNjYW5GaWVsZC5nZXRUZXh0KCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9wZXJmb3JtX3NjYW4iLCAoc2NhbkNoZWNrLmlzU2VsZWN0ZWQoKSA/ICJZZXMiIDogIk5vIikpOworCQkvLyBTYXZlIGludGVydmFsIG9wdGlvbnMKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWwiLCAoc2VxdWVudGlhbFJhZGlvLmlzU2VsZWN0ZWQoKSA/ICJTZXF1ZW50aWFsIiA6ICJEZWZpbmVkIikpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsX3ZhbHVlIiwgdmFsdWVDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF91bml0cyIsIHVuaXRDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9ob3VyIiwgaG91ckNvbWJvLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX21pbnV0ZSIsIG1pbnV0ZUNvbWJvLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2RheSIsIGRheUNvbWJvLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOworCQkvLyBTYXZlIHN5c3RlbSBvcHRpb25zCisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2VuYWJsZWQiLCAocnVubmluZyA/ICJZZXMiIDogIk5vIikpOworCQkvLyBXcml0ZSB0aGUgcHJlZmVyZW5jZXMKKwkJdHJ5IHsKKwkJCVByZWZlcmVuY2VzLnNhdmVQcmVmZXJlbmNlcygpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCS8vIFRPRE86IFdhcm4gb2YgZXJyb3IgdGhyb3VnaCBKT3B0aW9uUGFuZQorCQkJaW9lLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCB0b2dnbGVTdGF0dXMoKSB7CisJCWlmIChydW5uaW5nKSB7CisJCQlydW5uaW5nID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlydW5uaW5nID0gdHJ1ZTsKKwkJfQorCQl1cGRhdGVTdGF0dXNDb21wb25lbnRzKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKwkJCisJCS8vIEZpbGUgY2hvb3NlcnMKKwkJYnVuZGxlRmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKwkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKwkJCQkKKwkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworCQkJCWlmICghKG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkpIHJldHVybiBmYWxzZTsKKwkJCQlpZiAobmFtZS5pbmRleE9mKCJfIikgPiAwKSByZXR1cm4gZmFsc2U7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCisJCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQkJCXJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbiIpOworCQkJfQorCQl9KTsKKwkJYnVuZGxlRmlsZUNob29zZXIuc2V0U2VsZWN0ZWRGaWxlKG5ldyBGaWxlKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Jhc2VfY2xhc3NfZmlsZSIpKSk7CisJCQorCQlkaXJlY3RvcnlGaWxlQ2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCkgeworCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHJldHVybiB0cnVlOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCQkJcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlyZWN0b3J5Iik7CisJCQl9CisJCX0pOworCQlkaXJlY3RvcnlGaWxlQ2hvb3Nlci5zZXRTZWxlY3RlZEZpbGUobmV3IEZpbGUoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfb3V0cHV0X2RpcmVjdG9yeSIpKSk7CisJCQorCQlzY2FuRmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKwkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKwkJCQlpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoIi54bWwiKSkgcmV0dXJuIHRydWU7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQorCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCQlyZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb25fc2NhbiIpOworCQkJfQorCQl9KTsKKwkJc2NhbkZpbGVDaG9vc2VyLnNldFNlbGVjdGVkRmlsZShuZXcgRmlsZShQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9zY2FuX2ZpbGUiKSkpOworCQkKKwkJLy8gTmV3IHRvcCBsZXZlbCBjb21wb25lbnRzCisJCUpQYW5lbCBzdGF0dXNQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsIGludGVydmFsUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCBvcHRpb25zUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCBmb3JtYXRQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwkJQm94IG1haW5Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQlpbnQgd2lkdGggPSA2MDA7CisJCWludCBoZWlnaHQgPSA2MDA7CisJCWludCBjb21wSGVpZ2h0ID0gMjA7CisJCURpbWVuc2lvbiBtYWluRGltID0gbmV3IERpbWVuc2lvbih3aWR0aCxoZWlnaHQpOworCQkKKwkJc3RhdHVzUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3BhbmVsX3N0YXR1cyIpKSk7CisJCWludGVydmFsUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3BhbmVsX2ludGVydmFsIikpKTsKKwkJb3B0aW9uc1BhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9wYW5lbF9vcHRpb25zIikpKTsKKwkJZm9ybWF0UGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3BhbmVsX291dHB1dF9mb3JtYXQiKSkpOworCQkKKwkJLy8gKiogU1RBVFVTIFBBTkVMIFNFVFVQICoqCisJCUpCdXR0b24gbm93QnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9idXR0b25fbm93IikpOworCQlCb3ggICAgIHN0YXR1c0JveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCUpQYW5lbCAgc3RhdHVzUGFuZWwxID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgIHN0YXR1c1BhbmVsMiA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsICBzdGF0dXNQYW5lbDMgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCAgc3RhdHVzUGFuZWw0ID0gbmV3IEpQYW5lbCgpOworCQlzdGF0dXNCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2J1dHRvbl9zdGFydCIpKTsKKwkJc3RhdHVzTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfc3RhdHVzX3N0b3BwZWQiKSk7CisJCW5leHRSZXBvcnRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9uZXh0X3JlcG9ydCIsICItLSIpKTsKKwkJbGFzdFJlcG9ydExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2xhc3RfcmVwb3J0IiwgIi0tIikpOworCQlzdGF0dXNMYWJlbC5zZXRGb250KG5ldyBGb250KCJzZXJpZiIsRm9udC5CT0xELDE0KSk7CisJCXN0YXR1c0xhYmVsLnNldEZvcmVncm91bmQoQ29sb3IucmVkKTsKKwkJc3RhdHVzUGFuZWwyLnNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKKwkJc3RhdHVzUGFuZWwzLnNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKKwkJc3RhdHVzUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQorCQlub3dCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJdHJ5IHsKKwkJCQkJZ2VuZXJhdGVSZXBvcnRzKCk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgZS5nZXRNZXNzYWdlKCksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwKKwkJCQkJCQkJCQkJCSAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZyhlLnRvU3RyaW5nKCkpOworCQkJCQlpZiAoUkJNYW5hZ2VyR1VJLmRlYnVnKSBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQkKKwkJc3RhdHVzQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXRvZ2dsZVN0YXR1cygpOworCQkJfQorCQl9KTsKKwkJCisJCXN0YXR1c1BhbmVsMS5hZGQoc3RhdHVzTGFiZWwpOworCQlzdGF0dXNQYW5lbDIuYWRkKG5leHRSZXBvcnRMYWJlbCk7CisJCXN0YXR1c1BhbmVsMy5hZGQobGFzdFJlcG9ydExhYmVsKTsKKwkJc3RhdHVzUGFuZWw0LmFkZChub3dCdXR0b24pOworCQlzdGF0dXNQYW5lbDQuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNykpOworCQlzdGF0dXNQYW5lbDQuYWRkKHN0YXR1c0J1dHRvbik7CisJCXN0YXR1c0JveC5hZGQoc3RhdHVzUGFuZWwxKTsKKwkJc3RhdHVzQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg3KSk7CisJCS8vc3RhdHVzQm94LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7CisJCXN0YXR1c0JveC5hZGQoc3RhdHVzUGFuZWwyKTsKKwkJLy9zdGF0dXNCb3guYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsKKwkJc3RhdHVzQm94LmFkZChzdGF0dXNQYW5lbDMpOworCQlzdGF0dXNCb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDcpKTsKKwkJc3RhdHVzQm94LmFkZChzdGF0dXNQYW5lbDQpOworCQlzdGF0dXNQYW5lbC5hZGQoc3RhdHVzQm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCisJCS8vICoqIE9QVElPTlMgUEFORUwgU0VUVVAgKioKKwkJSkxhYmVsICBpbnB1dExhYmVsICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2lucHV0X2J1bmRsZSIpKTsKKwkJSkxhYmVsICBvdXRwdXRMYWJlbCAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX291dHB1dF9kaXJlY3RvcnkiKSk7CisJCUpCdXR0b24gaW5wdXRCdXR0b24gICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfYnV0dG9uX2Nob29zZSIpKTsKKwkJSkJ1dHRvbiBvdXRwdXRCdXR0b24gID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9idXR0b25fY2hvb3NlIikpOworCQlKQnV0dG9uIHNjYW5CdXR0b24gICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2J1dHRvbl9jaG9vc2UiKSk7CisJCUpCdXR0b24gZGVmYXVsdEJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfYnV0dG9uX3NhdmVfZGVmYXVsdHMiKSk7CisJCUpMYWJlbCAgdGV4dExhYmVsICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9vdXRwdXRfZmlsZSIpKTsKKwkJSkxhYmVsICBodG1sTGFiZWwgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX291dHB1dF9maWxlIikpOworCQlKTGFiZWwgIHhtbExhYmVsICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfb3V0cHV0X2ZpbGUiKSk7CisJCUpMYWJlbCAgdGV4dExhYmVsMiAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9kZXRhaWxfbGV2ZWwiKSk7CisJCUpMYWJlbCAgaHRtbExhYmVsMiAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9kZXRhaWxfbGV2ZWwiKSk7CisJCUpMYWJlbCAgeG1sTGFiZWwyICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9kZXRhaWxfbGV2ZWwiKSk7CisJCUpQYW5lbCAgb3B0aW9uc1BhbmVsMSA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsICBvcHRpb25zUGFuZWwyID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgIG9wdGlvbnNQYW5lbEEgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCAgb3B0aW9uc1BhbmVsMyA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsICBvcHRpb25zUGFuZWw0ID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgIG9wdGlvbnNQYW5lbDUgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCAgb3B0aW9uc1BhbmVsNiA9IG5ldyBKUGFuZWwoKTsKKwkJQm94ICAgICBvcHRpb25zQm94ICAgID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJQm94ICAgICBvdXRwdXRCb3ggICAgID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCisJCWJ1bmRsZUZpZWxkICAgID0gbmV3IEpUZXh0RmllbGQoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfYmFzZV9jbGFzc19maWxlIikpOworCQlkaXJlY3RvcnlGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX291dHB1dF9kaXJlY3RvcnkiKSk7CisJCXRleHRDaGVjayAgICAgID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2Zvcm1hdF90ZXh0IikpOworCQlodG1sQ2hlY2sgICAgICA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9mb3JtYXRfaHRtbCIpKTsKKwkJeG1sQ2hlY2sgICAgICAgPSBuZXcgSkNoZWNrQm94KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfZm9ybWF0X3htbCIpKTsKKwkJc2NhbkNoZWNrICAgICAgPSBuZXcgSkNoZWNrQm94KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfcGVyZm9ybV9zY2FuIiksIGZhbHNlKTsKKwkJdGV4dEZpZWxkICAgICAgPSBuZXcgSlRleHRGaWVsZCgicmVwb3J0LnR4dCIpOworCQlodG1sRmllbGQgICAgICA9IG5ldyBKVGV4dEZpZWxkKCJyZXBvcnQuaHRtbCIpOworCQl4bWxGaWVsZCAgICAgICA9IG5ldyBKVGV4dEZpZWxkKCJyZXBvcnQueG1sIik7CisJCXNjYW5GaWVsZCAgICAgID0gbmV3IEpUZXh0RmllbGQoKTsKKwkJU3RyaW5nIFtdIGRldGFpbExldmVscyA9IHtSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2RldGFpbF9oaWdoIiksCisJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9kZXRhaWxfbm9ybWFsIil9OworCQl0ZXh0Q29tYm8gICAgICA9IG5ldyBKQ29tYm9Cb3goZGV0YWlsTGV2ZWxzKTsKKwkJaHRtbENvbWJvICAgICAgPSBuZXcgSkNvbWJvQm94KGRldGFpbExldmVscyk7CisJCXhtbENvbWJvICAgICAgID0gbmV3IEpDb21ib0JveChkZXRhaWxMZXZlbHMpOworCQkKKwkJYnVuZGxlRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCWRpcmVjdG9yeUZpZWxkLnNldENvbHVtbnMoMzApOworCQlzY2FuRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCXRleHRGaWVsZC5zZXRDb2x1bW5zKDE1KTsKKwkJaHRtbEZpZWxkLnNldENvbHVtbnMoMTUpOworCQl4bWxGaWVsZC5zZXRDb2x1bW5zKDE1KTsKKwkJRGltZW5zaW9uIGNoZWNrRGltID0gbmV3IERpbWVuc2lvbig1NSxjb21wSGVpZ2h0KTsKKwkJdGV4dENoZWNrLnNldFByZWZlcnJlZFNpemUoY2hlY2tEaW0pOworCQlodG1sQ2hlY2suc2V0UHJlZmVycmVkU2l6ZShjaGVja0RpbSk7CisJCXhtbENoZWNrLnNldFByZWZlcnJlZFNpemUoY2hlY2tEaW0pOworCQlvcHRpb25zUGFuZWwxLnNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LlJJR0hUKSk7CisJCW9wdGlvbnNQYW5lbDIuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuUklHSFQpKTsKKwkJb3B0aW9uc1BhbmVsQS5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5SSUdIVCkpOworCQkKKwkJaW5wdXRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJc2V0SW5wdXRCdW5kbGUoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlvdXRwdXRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJc2V0T3V0cHV0QnVuZGxlKCk7CisJCQl9CisJCX0pOworCQkKKwkJc2NhbkJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXNldFNjYW5GaWxlKCk7CisJCQl9CisJCX0pOworCQkKKwkJZGVmYXVsdEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlzYXZlRGVmYXVsdHMoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlvcHRpb25zUGFuZWw2LmFkZChkZWZhdWx0QnV0dG9uKTsKKwkJb3B0aW9uc1BhbmVsMy5hZGQodGV4dENoZWNrKTsKKwkJb3B0aW9uc1BhbmVsMy5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDMuYWRkKHRleHRMYWJlbCk7CisJCW9wdGlvbnNQYW5lbDMuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWwzLmFkZCh0ZXh0RmllbGQpOworCQlvcHRpb25zUGFuZWwzLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsMy5hZGQodGV4dExhYmVsMik7CisJCW9wdGlvbnNQYW5lbDMuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWwzLmFkZCh0ZXh0Q29tYm8pOworCQlvcHRpb25zUGFuZWw0LmFkZChodG1sQ2hlY2spOworCQlvcHRpb25zUGFuZWw0LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsNC5hZGQoaHRtbExhYmVsKTsKKwkJb3B0aW9uc1BhbmVsNC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDQuYWRkKGh0bWxGaWVsZCk7CisJCW9wdGlvbnNQYW5lbDQuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWw0LmFkZChodG1sTGFiZWwyKTsKKwkJb3B0aW9uc1BhbmVsNC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDQuYWRkKGh0bWxDb21ibyk7CisJCW9wdGlvbnNQYW5lbDUuYWRkKHhtbENoZWNrKTsKKwkJb3B0aW9uc1BhbmVsNS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDUuYWRkKHhtbExhYmVsKTsKKwkJb3B0aW9uc1BhbmVsNS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDUuYWRkKHhtbEZpZWxkKTsKKwkJb3B0aW9uc1BhbmVsNS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDUuYWRkKHhtbExhYmVsMik7CisJCW9wdGlvbnNQYW5lbDUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWw1LmFkZCh4bWxDb21ibyk7CisJCW91dHB1dEJveC5hZGQob3B0aW9uc1BhbmVsMyk7CisJCW91dHB1dEJveC5hZGQob3B0aW9uc1BhbmVsNCk7CisJCW91dHB1dEJveC5hZGQob3B0aW9uc1BhbmVsNSk7CisJCWZvcm1hdFBhbmVsLmFkZChvdXRwdXRCb3gpOworCQlvcHRpb25zUGFuZWwxLmFkZChpbnB1dExhYmVsKTsKKwkJb3B0aW9uc1BhbmVsMS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDEuYWRkKGJ1bmRsZUZpZWxkKTsKKwkJb3B0aW9uc1BhbmVsMS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDEuYWRkKGlucHV0QnV0dG9uKTsKKwkJb3B0aW9uc1BhbmVsMi5hZGQob3V0cHV0TGFiZWwpOworCQlvcHRpb25zUGFuZWwyLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsMi5hZGQoZGlyZWN0b3J5RmllbGQpOworCQlvcHRpb25zUGFuZWwyLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsMi5hZGQob3V0cHV0QnV0dG9uKTsKKwkJb3B0aW9uc1BhbmVsQS5hZGQoc2NhbkNoZWNrKTsKKwkJb3B0aW9uc1BhbmVsQS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbEEuYWRkKHNjYW5GaWVsZCk7CisJCW9wdGlvbnNQYW5lbEEuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWxBLmFkZChzY2FuQnV0dG9uKTsKKwkJb3B0aW9uc0JveC5hZGQob3B0aW9uc1BhbmVsMSk7CisJCW9wdGlvbnNCb3guYWRkKG9wdGlvbnNQYW5lbDIpOworCQlvcHRpb25zQm94LmFkZChvcHRpb25zUGFuZWxBKTsKKwkJb3B0aW9uc0JveC5hZGQoZm9ybWF0UGFuZWwpOworCQlvcHRpb25zQm94LmFkZChvcHRpb25zUGFuZWw2KTsKKwkJb3B0aW9uc1BhbmVsLmFkZChvcHRpb25zQm94KTsKKwkJCisJCS8vICoqIElOVEVSVkFMIFBBTkVMIFNFVFVQICoqCisJCVN0cmluZyBib3hBcnJheTFbXSA9IHsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTUiLCIyMCIsIjI0IiwiMjUiLCIzMCJ9OworCQlTdHJpbmcgYm94QXJyYXkyW10gPSB7UmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl90aW1lX21pbnV0ZXMiKSwKKwkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV9ob3VycyIpLAorCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl90aW1lX2RheXMiKX07CisJCVN0cmluZyBib3hBcnJheTNbXSA9IHsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwKKwkJCQkJCQkgICIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMCJ9OworCQlTdHJpbmcgYm94QXJyYXk0W10gPSB7IjAwIiwiMTUiLCIzMCIsIjQ1In07CisJCVN0cmluZyBib3hBcnJheTVbXSA9IHtSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfZXZlcnlkYXkiKSwKKwkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV9tb25kYXkiKSwKKwkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV90dWVzZGF5IiksCisJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfd2VkbmVzZGF5IiksCisJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfdGh1cnNkYXkiKSwKKwkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV9mcmlkYXkiKSwKKwkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV9zYXR1cmRheSIpLAorCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl90aW1lX3N1bmRheSIpfTsKKwkJCisJCUpMYWJlbCBjb2xvbkxhYmVsID0gbmV3IEpMYWJlbCgiOiIpOworCQlzZXF1ZW50aWFsUmFkaW8gPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbCIpKTsKKwkJZGVmaW5lZFJhZGlvID0gbmV3IEpSYWRpb0J1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2ludGVydmFsX2RlZmluZWQiKSwgdHJ1ZSk7CisJCXZhbHVlQ29tYm8gPSBuZXcgSkNvbWJvQm94KGJveEFycmF5MSk7CisJCXVuaXRDb21ibyA9IG5ldyBKQ29tYm9Cb3goYm94QXJyYXkyKTsKKwkJaG91ckNvbWJvID0gbmV3IEpDb21ib0JveChib3hBcnJheTMpOworCQltaW51dGVDb21ibyA9IG5ldyBKQ29tYm9Cb3goYm94QXJyYXk0KTsKKwkJZGF5Q29tYm8gPSBuZXcgSkNvbWJvQm94KGJveEFycmF5NSk7CisJCUpQYW5lbCBpbnRlcnZhbFBhbmVsMSA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsIGludGVydmFsUGFuZWwyID0gbmV3IEpQYW5lbCgpOworCQlpbnRlcnZhbFBhbmVsMS5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisJCWludGVydmFsUGFuZWwyLnNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKKwkJQm94IGludGVydmFsQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJaW50ZXJ2YWxQYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCisJCUJ1dHRvbkdyb3VwIGJnID0gbmV3IEJ1dHRvbkdyb3VwKCk7CisJCWJnLmFkZChzZXF1ZW50aWFsUmFkaW8pOworCQliZy5hZGQoZGVmaW5lZFJhZGlvKTsKKwkJCisJCWludGVydmFsUGFuZWwxLmFkZChzZXF1ZW50aWFsUmFkaW8pOworCQlpbnRlcnZhbFBhbmVsMS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCWludGVydmFsUGFuZWwxLmFkZCh2YWx1ZUNvbWJvKTsKKwkJaW50ZXJ2YWxQYW5lbDEuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlpbnRlcnZhbFBhbmVsMS5hZGQodW5pdENvbWJvKTsKKwkJaW50ZXJ2YWxQYW5lbDIuYWRkKGRlZmluZWRSYWRpbyk7CisJCWludGVydmFsUGFuZWwyLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJaW50ZXJ2YWxQYW5lbDIuYWRkKGhvdXJDb21ibyk7CisJCWludGVydmFsUGFuZWwyLmFkZChjb2xvbkxhYmVsKTsKKwkJaW50ZXJ2YWxQYW5lbDIuYWRkKG1pbnV0ZUNvbWJvKTsKKwkJaW50ZXJ2YWxQYW5lbDIuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlpbnRlcnZhbFBhbmVsMi5hZGQoZGF5Q29tYm8pOworCQlpbnRlcnZhbEJveC5hZGQoaW50ZXJ2YWxQYW5lbDEpOworCQlpbnRlcnZhbEJveC5hZGQoaW50ZXJ2YWxQYW5lbDIpOworCQlpbnRlcnZhbFBhbmVsLmFkZChpbnRlcnZhbEJveCwgQm9yZGVyTGF5b3V0LldFU1QpOworCQkKKwkJLy8gKiogTUFJTkJPWCBTRVRVUCAqKgorCQltYWluQm94LnJlbW92ZUFsbCgpOworCQltYWluQm94LmFkZChzdGF0dXNQYW5lbCk7CisJCW1haW5Cb3guYWRkKGludGVydmFsUGFuZWwpOworCQltYWluQm94LmFkZChvcHRpb25zUGFuZWwpOworCQkKKwkJLy8gKiogTUFJTiBGUkFNRSBTRVRVUCAqKgorCQlzZXRMb2NhdGlvbihuZXcgamF2YS5hd3QuUG9pbnQoMjUsIDI1KSk7CisJCXNldFNpemUobWFpbkRpbSk7CisJCS8vKChKQ29tcG9uZW50KWdldENvbnRlbnRQYW5lKCkpLnNldE1heGltdW1TaXplKGRpbU1haW5NYXgpOworCQkvLygoSkNvbXBvbmVudClnZXRDb250ZW50UGFuZSgpKS5zZXRNaW5pbXVtU2l6ZShkaW1NYWluTWluKTsKKwkJLy9zZXRKTWVudUJhcihqTWVudUJhck1haW4pOworCQlnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQlnZXRDb250ZW50UGFuZSgpLnJlbW92ZUFsbCgpOworCQlnZXRDb250ZW50UGFuZSgpLmFkZChtYWluQm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJc2V0VGl0bGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXNvdXJjZV9idW5kbGVfcmVwb3J0ZXIiKSk7CisJCS8vdmFsaWRhdGVUcmVlKCk7CisJCXNldENvbXBvbmVudHNUb0RlZmF1bHRzKCk7CisJCW5leHRSZXBvcnQgPSBnZW5lcmF0ZU5leHRSZXBvcnREYXRlKCk7CisJCXVwZGF0ZURhdGVGaWVsZHMoKTsKKwkJcmVwYWludCgpOworCQkKKwkJYWRkV2luZG93TGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGV2KSB7CisJCQkJdGhpc1dpbmRvd0Nsb3NpbmcoZXYpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGhpc1dpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZXYpIHsKKwkJc2V0VmlzaWJsZShmYWxzZSk7CisJCWRpc3Bvc2UoKTsKKwkJU3lzdGVtLmV4aXQoMCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRJbnB1dEJ1bmRsZSgpIHsKKwkJaW50IHJlc3VsdCA9IGJ1bmRsZUZpbGVDaG9vc2VyLnNob3dPcGVuRGlhbG9nKHRoaXMpOworCQlpZiAocmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworCQkJRmlsZSBmID0gYnVuZGxlRmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisJCQlpZiAoZiAhPSBudWxsKSB7CisJCQkJYnVuZGxlRmllbGQuc2V0VGV4dChmLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9iYXNlX2NsYXNzX2ZpbGUiLGYuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJCXRyeSB7UHJlZmVyZW5jZXMuc2F2ZVByZWZlcmVuY2VzKCk7fSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7fQorCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRPdXRwdXRCdW5kbGUoKSB7CisJCWludCByZXN1bHQgPSBkaXJlY3RvcnlGaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyh0aGlzKTsKKwkJaWYgKHJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKwkJCUZpbGUgZiA9IGRpcmVjdG9yeUZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOworCQkJaWYgKCFmLmlzRGlyZWN0b3J5KCkpIGYgPSBuZXcgRmlsZShmLmdldFBhcmVudCgpKTsKKwkJCWlmIChmICE9IG51bGwpIHsKKwkJCQlkaXJlY3RvcnlGaWVsZC5zZXRUZXh0KGYuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX291dHB1dF9kaXJlY3RvcnkiLGYuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJCXRyeSB7UHJlZmVyZW5jZXMuc2F2ZVByZWZlcmVuY2VzKCk7fSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7fQorCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRTY2FuRmlsZSgpIHsKKwkJaW50IHJlc3VsdCA9IHNjYW5GaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyh0aGlzKTsKKwkJaWYgKHJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKwkJCUZpbGUgZiA9IHNjYW5GaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKwkJCWlmIChmICE9IG51bGwpIHsKKwkJCQlzY2FuRmllbGQuc2V0VGV4dChmLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9zY2FuX2ZpbGUiLGYuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJCXRyeSB7UHJlZmVyZW5jZXMuc2F2ZVByZWZlcmVuY2VzKCk7fSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7fQorCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVc2FnZSgpIHsKKwkJcmV0dXJuICJcblJCUmVwb3J0ZXIgQ29tbWFuZCBMaW5lIFVzYWdlOlxuXG4iICsKKwkJCSAgICJEZWZhdWx0IFVzYWdlIChHVUkpOiAgIGphdmEgY29tLmlibS5yYm0uUkJSZXBvcnRlclxuIiArCisJCQkgICAiT3B0aW9ucyBVc2FnZTogICAgICAgICBqYXZhIGNvbS5pYm0ucmJtLlJCUmVwb3J0ZXIgWy1ndWkgfCAtbm93IHwgLWxpbmVdXG5cbiIgKyAKKwkJCSAgICJPcHRpb25zOiAgICAgICAgICAgICAgIC1ndWkgICAgIFJ1biB0aGUgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlXG4iICsKKwkJCSAgICIgICAgICAgICAgICAgICAgICAgICAgIC1ub3cgICAgIEV4ZWN1dGUgdGhlIFJlcG9ydCBHZW5lcmF0aW9uIEltbWVkaWF0ZWx5XG4iICsKKwkJCSAgICIgICAgICAgICAgICAgICAgICAgICAgIC1saW5lICAgIFJ1biB0aGUgUmVwb3J0ZXIgd2l0aG91dCB0aGUgR1VJIjsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworCSAgICBSQlJlcG9ydGVyIHJlcG9ydGVyOworCQlpZiAoYXJncy5sZW5ndGggPT0gMSkgeworCQkJaWYgKGFyZ3NbMF0uZXF1YWxzKCItZ3VpIikpIHsKKwkJCSAgICByZXBvcnRlciA9IG5ldyBSQlJlcG9ydGVyKHRydWUpOwkKKwkJCX0gZWxzZSBpZiAoYXJnc1swXS5lcXVhbHMoIi1ub3ciKSkgeworCQkJCXJlcG9ydGVyID0gbmV3IFJCUmVwb3J0ZXIoZmFsc2UpOworCQkJCXRyeSB7CisJCQkJCXJlcG9ydGVyLmdlbmVyYXRlUmVwb3J0cygpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJCUmVwb3J0ZXI6IEdlbmVyYXRpb24gb2YgcmVwb3J0cyBzdWNjZXNzZnVsLiAiICsgbmV3IERhdGUoKSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGdlbmVyYXRpbmcgdGhlIHJlcG9ydHMuLi5cblxuXHQiICsgaW9lLmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJCXJlcG9ydGVyLnRoaXNXaW5kb3dDbG9zaW5nKG51bGwpOworCQkJfSBlbHNlIGlmIChhcmdzWzBdLmVxdWFscygiLWxpbmUiKSkgeworCQkJCXJlcG9ydGVyID0gbmV3IFJCUmVwb3J0ZXIoZmFsc2UpOworCQkJCWlmICghcmVwb3J0ZXIucnVubmluZykKKwkJCQkgICAgcmVwb3J0ZXIudG9nZ2xlU3RhdHVzKCk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSQlJlcG9ydGVyOiBOZXh0IFJlcG9ydCBhdCAiICsgcmVwb3J0ZXIubmV4dFJlcG9ydC50b1N0cmluZygpKTsKKwkJCX0gZWxzZSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldFVzYWdlKCkpOworCQkJfQorCQl9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKKwkJCXJlcG9ydGVyID0gbmV3IFJCUmVwb3J0ZXIodHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0VXNhZ2UoKSk7CisJCX0KKwl9CisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUmVwb3J0ZXJTY2FubmVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJSZXBvcnRlclNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjE3ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUmVwb3J0ZXJTY2FubmVyLmphdmEKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXI7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworCisvKioKKyAqIFJCUmVwb3J0ZXJTY2FuZXIgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBSQlJlcG9ydGVyLiBJdCBjcmVhdGVzIGEgcmVwb3J0IGZyb20gYW4geG1sIHNldHRpbmdzCisgKiBmaWxlIHRoYXQgc2NhbnMgY29kZSBmb3IgcmVzb3VyY2VzIGFuZCBjb21wYXJlcyB0aGVtIGFnYWluc3QgYSByZXNvdXJjZSBidW5kbGUuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQlJlcG9ydGVyCisgKi8KK3B1YmxpYyBjbGFzcyBSQlJlcG9ydGVyU2Nhbm5lciB7CisJcHJpdmF0ZSBCdW5kbGUgICAgICAgYnVuZGxlOworCXByaXZhdGUgRG9jdW1lbnQgICAgIGNvbmZpZzsKKwlwcml2YXRlIEhhc2h0YWJsZSAgICBmaWxlUnVsZXM7CisJcHJpdmF0ZSBIYXNodGFibGUgICAgcGFyc2VSdWxlczsKKwlwcml2YXRlIEhhc2h0YWJsZSAgICByZXN1bHRzOworCXByaXZhdGUgSGFzaHRhYmxlICAgIG1pc3Npbmc7CisJcHJpdmF0ZSBib29sZWFuICAgICAgcmVzdWx0c0ZvdW5kOworCQorCXByb3RlY3RlZCBSQlJlcG9ydGVyU2Nhbm5lcihCdW5kbGUgYnVuZGxlLCBGaWxlIGNvbmZpZ0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJlc3VsdHNGb3VuZCA9IGZhbHNlOworCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKKwkJCisJCXRyeSB7CisJCQlJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZpZ0ZpbGUpKTsKKwkJCURPTVBhcnNlciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CisJCQlwYXJzZXIucGFyc2UoaXMpOworCQkJY29uZmlnID0gcGFyc2VyLmdldERvY3VtZW50KCk7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzYXhlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIklsbGVnYWwgWE1MIERvY3VtZW50OiAiICsgc2F4ZS5nZXRNZXNzYWdlKCkpOworCQl9CisJCQorCQlFbGVtZW50IHJvb3QgPSBjb25maWcuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJCWZpbGVSdWxlcyA9IGdldEZpbGVSdWxlcyhyb290KTsKKwkJcGFyc2VSdWxlcyA9IGdldFBhcnNlUnVsZXMocm9vdCk7CisJCQorCQlyZXN1bHRzID0gbmV3IEhhc2h0YWJsZSgpOworCQlFbnVtZXJhdGlvbiBrZXlzID0gYnVuZGxlLmFsbEl0ZW1zLmtleXMoKTsKKwkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKwkJCUJ1bmRsZUl0ZW0gaXRlbSA9IChCdW5kbGVJdGVtKWJ1bmRsZS5hbGxJdGVtcy5nZXQoa2V5KTsKKwkJCXJlc3VsdHMucHV0KGtleSwgbmV3IFNjYW5SZXN1bHQoaXRlbSkpOworCQl9CisJCQorCQltaXNzaW5nID0gbmV3IEhhc2h0YWJsZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGdldE51bWJlclJlc291cmNlc0ZvdW5kKCkgeworCQlyZXR1cm4gcmVzdWx0cy5zaXplKCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgZ2V0TnVtYmVyTWlzc2luZ1Jlc291cmNlcygpIHsKKwkJcmV0dXJuIG1pc3Npbmcuc2l6ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGdldE51bWJlclVudXNlZFJlc291cmNlcygpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJRW51bWVyYXRpb24gZWxlbXMgPSByZXN1bHRzLmVsZW1lbnRzKCk7CisJCXdoaWxlIChlbGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCllbGVtcy5uZXh0RWxlbWVudCgpOworCQkJaWYgKHJlc3VsdC5nZXRPY2N1cmFuY2VzKCkuc2l6ZSgpIDwgMSkgY291bnQrKzsKKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCQorCXByb3RlY3RlZCBWZWN0b3IgZ2V0TWlzc2luZ1Jlc291cmNlcygpIHsKKwkJRW51bWVyYXRpb24gZWxlbXMgPSBtaXNzaW5nLmVsZW1lbnRzKCk7CisJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworCQl3aGlsZSAoZWxlbXMuaGFzTW9yZUVsZW1lbnRzKCkpCisJCQl2LmFkZEVsZW1lbnQoZWxlbXMubmV4dEVsZW1lbnQoKSk7CisJCXJldHVybiB2OworCX0KKwkKKwlwcm90ZWN0ZWQgVmVjdG9yIGdldFVudXNlZFJlc291cmNlcygpIHsKKwkJRW51bWVyYXRpb24gZWxlbXMgPSByZXN1bHRzLmVsZW1lbnRzKCk7CisJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworCQl3aGlsZSAoZWxlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCVNjYW5SZXN1bHQgcmVzdWx0ID0gKFNjYW5SZXN1bHQpZWxlbXMubmV4dEVsZW1lbnQoKTsKKwkJCWlmIChyZXN1bHQuZ2V0T2NjdXJhbmNlcygpLnNpemUoKSA8IDEpIHsKKwkJCQl2LmFkZEVsZW1lbnQocmVzdWx0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdjsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gcGVyZm9ybVNjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXN1bHRzRm91bmQgPSBmYWxzZTsKKwkJCisJCUVsZW1lbnQgcm9vdCA9IGNvbmZpZy5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJTm9kZUxpc3QgbmwgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTY2FuIik7CisJCWlmIChubC5nZXRMZW5ndGgoKSA8IDEpIHJldHVybiByZXN1bHRzRm91bmQ7CisJCUVsZW1lbnQgc2Nhbl9lbGVtID0gKEVsZW1lbnQpbmwuaXRlbSgwKTsKKwkJbmwgPSBzY2FuX2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkRpcmVjdG9yeSIpOworCQlmb3IgKGludCBpPTA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlFbGVtZW50IGRpcl9lbGVtID0gKEVsZW1lbnQpbmwuaXRlbShpKTsKKwkJCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyX2VsZW0uZ2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpKTsKKwkJCWJvb2xlYW4gcmVjdXJzZSA9IGRpcl9lbGVtLmdldEF0dHJpYnV0ZSgicmVjdXJzZV9kaXJlY3RvcmllcyIpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKKwkJCU5vZGVMaXN0IHJ1bGVzX2xpc3QgPSBkaXJfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUnVsZXMiKTsKKwkJCWlmIChydWxlc19saXN0LmdldExlbmd0aCgpIDwgMSkgY29udGludWU7CisJCQlFbGVtZW50IHJ1bGVzX2VsZW0gPSAoRWxlbWVudClydWxlc19saXN0Lml0ZW0oMCk7CisJCQlOb2RlTGlzdCBmcnVsZXNfbGlzdCA9IHJ1bGVzX2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFwcGx5RmlsZVJ1bGUiKTsKKwkJCS8vIEZvciBlYWNoIGZpbGUgcnVsZQorCQkJZm9yIChpbnQgaj0wOyBqIDwgZnJ1bGVzX2xpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworCQkJCUVsZW1lbnQgZnJ1bGVfZWxlbSA9IChFbGVtZW50KWZydWxlc19saXN0Lml0ZW0oaik7CisJCQkJRmlsZVJ1bGUgZnJ1bGUgPSAoRmlsZVJ1bGUpZmlsZVJ1bGVzLmdldChmcnVsZV9lbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKKwkJCQlpZiAoZnJ1bGUgPT0gbnVsbCkgY29udGludWU7CisJCQkJTm9kZUxpc3QgcHJ1bGVzX2xpc3QgPSBmcnVsZV9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBcHBseVBhcnNlUnVsZSIpOworCQkJCVZlY3RvciBwcnVsZXNfdiA9IG5ldyBWZWN0b3IoKTsKKwkJCQkvLyBGb3IgZWFjaCBwYXJzZSBydWxlCisJCQkJZm9yIChpbnQgaz0wOyBrIDwgcHJ1bGVzX2xpc3QuZ2V0TGVuZ3RoKCk7IGsrKykgeworCQkJCQlFbGVtZW50IHBydWxlX2VsZW0gPSAoRWxlbWVudClwcnVsZXNfbGlzdC5pdGVtKGspOworCQkJCQlQYXJzZVJ1bGUgcHJ1bGUgPSAoUGFyc2VSdWxlKXBhcnNlUnVsZXMuZ2V0KHBydWxlX2VsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikpOworCQkJCQlpZiAocHJ1bGUgPT0gbnVsbCkgY29udGludWU7CisJCQkJCXBydWxlc192LmFkZEVsZW1lbnQocHJ1bGUpOworCQkJCX0KKwkJCQlpZiAocHJ1bGVzX3Yuc2l6ZSgpIDwgMSkgY29udGludWU7CisJCQkJc2NhbkRpcmVjdG9yeShkaXJlY3RvcnksIGZydWxlLCBwcnVsZXNfdiwgcmVjdXJzZSk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiByZXN1bHRzRm91bmQ7CisJfQorCQorCXByaXZhdGUgdm9pZCBzY2FuRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5LCBGaWxlUnVsZSBmcnVsZSwgVmVjdG9yIHBydWxlcywgYm9vbGVhbiByZWN1cnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkKKwkJLy8gUmVjdXJzaW9uIHN0ZXAKKwkJaWYgKHJlY3Vyc2UpIHsKKwkJCUZpbGUgY2hpbGRyZW5bXSA9IGRpcmVjdG9yeS5saXN0RmlsZXMobmV3IGphdmEuaW8uRmlsZUZpbHRlcigpeworCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKwkJCQkJcmV0dXJuIGYuaXNEaXJlY3RvcnkoKTsKKwkJCQl9CisJCQkJCisJCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCQkJcmV0dXJuICIiOworCQkJCX0KKwkJCX0pOworCQkJZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQlGaWxlIG5ld19kaXJlY3RvcnkgPSBjaGlsZHJlbltpXTsKKwkJCQlzY2FuRGlyZWN0b3J5KG5ld19kaXJlY3RvcnksIGZydWxlLCBwcnVsZXMsIHJlY3Vyc2UpOworCQkJfQorCQl9CisJCS8vIEdvIHRocm91Z2ggZWFjaCBhY2NlcHRhYmxlIGZpbGUKKwkJRmlsZSBjaGlsZHJlbltdID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOworCQlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJRmlsZSBmID0gY2hpbGRyZW5baV07CisJCQlpZiAoZi5pc0RpcmVjdG9yeSgpIHx8ICEoZnJ1bGUuYXBwbHlSdWxlKGYuZ2V0TmFtZSgpKSkpIGNvbnRpbnVlOworCQkJRmlsZVJlYWRlciBmciA9IG5ldyBGaWxlUmVhZGVyKGYpOworCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOworCQkJU3RyaW5nIGxpbmUgPSBudWxsOworCQkJaW50IGxpbmVfY291bnQgPSAwOworCQkJLy8gUmVhZCB0aGUgZmlsZSBsaW5lIGJ5IGxpbmUKKwkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlsaW5lX2NvdW50Kys7CisJCQkJVmVjdG9yIGZpbmRpbmdzID0gbmV3IFZlY3RvcigpOworCQkJCS8vIEFwcGx5IGFsbCBwYXJzZSBydWxlcyB0byBlYWNoIGxpbmUKKwkJCQlmb3IgKGludCBqPTA7IGogPCBwcnVsZXMuc2l6ZSgpOyBqKyspIHsKKwkJCQkJUGFyc2VSdWxlIHBydWxlID0gKFBhcnNlUnVsZSlwcnVsZXMuZWxlbWVudEF0KGopOworCQkJCQlWZWN0b3IgdGVtcF9yZXN1bHRzID0gcHJ1bGUuYXBwbHlSdWxlKGxpbmUpOworCQkJCQlmb3IgKGludCBrPTA7IGsgPCB0ZW1wX3Jlc3VsdHMuc2l6ZSgpOyBrKyspIHsKKwkJCQkJCWZpbmRpbmdzLmFkZEVsZW1lbnQodGVtcF9yZXN1bHRzLmVsZW1lbnRBdChrKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZm9yIChpbnQgaj0wOyBqIDwgZmluZGluZ3Muc2l6ZSgpOyBqKyspIHsKKwkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWZpbmRpbmdzLmVsZW1lbnRBdChqKTsKKwkJCQkJT2NjdXJhbmNlIG9jYyA9IG5ldyBPY2N1cmFuY2UoZi5nZXROYW1lKCksIGYuZ2V0QWJzb2x1dGVQYXRoKCksIGxpbmVfY291bnQpOworCQkJCQkvLyBJZiB0aGUgbmFtZSBpcyBmb3VuZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlcyBkZXJpdmVkIGhhc2h0YWJsZQorCQkJCQlpZiAocmVzdWx0cy5jb250YWluc0tleShuYW1lKSkgeworCQkJCQkJU2NhblJlc3VsdCBzY2FuX3JlcyA9IChTY2FuUmVzdWx0KXJlc3VsdHMuZ2V0KG5hbWUpOworCQkJCQkJc2Nhbl9yZXMuYWRkT2NjdXJhbmNlKG9jYyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBBZGQgaXQgdG8gdGhlIG1pc3NpbmcgcmVzdWx0cworCQkJCQkJU2NhblJlc3VsdCBzY2FuX3JlcyA9IG5ldyBTY2FuUmVzdWx0KG5ldyBCdW5kbGVJdGVtKG51bGwsIG5hbWUsICIqdW5rbm93bioiKSk7CisJCQkJCQlzY2FuX3Jlcy5hZGRPY2N1cmFuY2Uob2NjKTsKKwkJCQkJCW1pc3NpbmcucHV0KG5hbWUsIHNjYW5fcmVzKTsKKwkJCQkJCXJlc3VsdHMucHV0KG5hbWUsIHNjYW5fcmVzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIEhhc2h0YWJsZSBnZXRGaWxlUnVsZXMoRWxlbWVudCByb290KSB7CisJCUhhc2h0YWJsZSByZXN1bHQgPSBuZXcgSGFzaHRhYmxlKCk7CisJCU5vZGVMaXN0IGZydWxlc19saXN0ID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRmlsZVJ1bGVzIik7CisJCUVsZW1lbnQgZnJ1bGVzX2VsZW0gPSBudWxsOworCQlpZiAoZnJ1bGVzX2xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSBmcnVsZXNfZWxlbSA9IChFbGVtZW50KWZydWxlc19saXN0Lml0ZW0oMCk7CisJCWlmIChmcnVsZXNfZWxlbSA9PSBudWxsKSByZXR1cm4gcmVzdWx0OworCQlmcnVsZXNfbGlzdCA9IGZydWxlc19lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGaWxlUnVsZSIpOworCQlmb3IgKGludCBpPTA7IGkgPCBmcnVsZXNfbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlFbGVtZW50IGVsZW0gPSAoRWxlbWVudClmcnVsZXNfbGlzdC5pdGVtKGkpOworCQkJRmlsZVJ1bGUgZnJ1bGUgPSBuZXcgRmlsZVJ1bGUoZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgZWxlbS5nZXRBdHRyaWJ1dGUoInN0YXJ0c193aXRoIiksCisJCQkJCQkJCQkJICBlbGVtLmdldEF0dHJpYnV0ZSgiZW5kc193aXRoIiksIGVsZW0uZ2V0QXR0cmlidXRlKCJjb250YWlucyIpKTsKKwkJCXJlc3VsdC5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgZnJ1bGUpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXByaXZhdGUgSGFzaHRhYmxlIGdldFBhcnNlUnVsZXMoRWxlbWVudCByb290KSB7CisJCUhhc2h0YWJsZSByZXN1bHQgPSBuZXcgSGFzaHRhYmxlKCk7CisJCU5vZGVMaXN0IHBydWxlc19saXN0ID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUGFyc2VSdWxlcyIpOworCQlFbGVtZW50IHBydWxlc19lbGVtID0gbnVsbDsKKwkJaWYgKHBydWxlc19saXN0LmdldExlbmd0aCgpID4gMCkKKwkJCXBydWxlc19lbGVtID0gKEVsZW1lbnQpcHJ1bGVzX2xpc3QuaXRlbSgwKTsKKwkJaWYgKHBydWxlc19lbGVtID09IG51bGwpCisJCQlyZXR1cm4gcmVzdWx0OworCQlwcnVsZXNfbGlzdCA9IHBydWxlc19lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJQYXJzZVJ1bGUiKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgcHJ1bGVzX2xpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpcHJ1bGVzX2xpc3QuaXRlbShpKTsKKwkJCVBhcnNlUnVsZSBwcnVsZSA9IG5ldyBQYXJzZVJ1bGUoZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgZWxlbS5nZXRBdHRyaWJ1dGUoImZvbGxvd3MiKSwKKwkJCQkJCQkJCQkJZWxlbS5nZXRBdHRyaWJ1dGUoInByZWNlZGVzIikpOworCQkJcmVzdWx0LnB1dChlbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBwcnVsZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CisKK2NsYXNzIEZpbGVSdWxlIHsKKwlTdHJpbmcgbmFtZTsKKwlTdHJpbmcgc3RhcnRzX3dpdGg7CisJU3RyaW5nIGVuZHNfd2l0aDsKKwlTdHJpbmcgY29udGFpbnM7CisJCisJRmlsZVJ1bGUoU3RyaW5nIG5hbWUsIFN0cmluZyBzdGFydHNfd2l0aCwgU3RyaW5nIGVuZHNfd2l0aCwgU3RyaW5nIGNvbnRhaW5zKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuc3RhcnRzX3dpdGggPSBzdGFydHNfd2l0aDsKKwkJdGhpcy5lbmRzX3dpdGggPSBlbmRzX3dpdGg7CisJCXRoaXMuY29udGFpbnMgPSBjb250YWluczsKKwl9CisJCisJYm9vbGVhbiBhcHBseVJ1bGUoU3RyaW5nIHNvdXJjZSkgeworCQlib29sZWFuIGFjY2VwdCA9IHRydWU7CisJCWlmIChzdGFydHNfd2l0aCAhPSBudWxsICYmIHN0YXJ0c193aXRoLmxlbmd0aCgpID4gMCAmJiAhKHNvdXJjZS5zdGFydHNXaXRoKHN0YXJ0c193aXRoKSkpIGFjY2VwdCA9IGZhbHNlOworCQlpZiAoZW5kc193aXRoICE9IG51bGwgJiYgZW5kc193aXRoLmxlbmd0aCgpID4gMCAmJiAhKHNvdXJjZS5lbmRzV2l0aChlbmRzX3dpdGgpKSkgYWNjZXB0ID0gZmFsc2U7CisJCWlmIChjb250YWlucyAhPSBudWxsICYmIGNvbnRhaW5zLmxlbmd0aCgpID4gMCAmJiBzb3VyY2UuaW5kZXhPZihjb250YWlucykgPCAwKSBhY2NlcHQgPSBmYWxzZTsKKwkJcmV0dXJuIGFjY2VwdDsKKwl9Cit9CisKK2NsYXNzIFBhcnNlUnVsZSB7CisJU3RyaW5nIG5hbWU7CisJU3RyaW5nIGJlZm9yZTsKKwlTdHJpbmcgYWZ0ZXI7CisJCisJUGFyc2VSdWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgYmVmb3JlLCBTdHJpbmcgYWZ0ZXIpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5iZWZvcmUgPSBiZWZvcmU7CisJCXRoaXMuYWZ0ZXIgPSBhZnRlcjsKKwl9CisJCisJLy8gcmV0dXJucyB0aGUgdmVjdG9yIG9mIHN0cmluZ3MgZm91bmQgYWZ0ZXIgYmVmb3JlIGFuZCBiZWZvcmUgYWZ0ZXIKKwkKKwlWZWN0b3IgYXBwbHlSdWxlKFN0cmluZyBzb3VyY2UpIHsKKwkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisJCWlmIChiZWZvcmUgIT0gbnVsbCAmJiBiZWZvcmUubGVuZ3RoKCkgPiAwKSB7CisJCQlpZiAoYWZ0ZXIgIT0gbnVsbCAmJiBhZnRlci5sZW5ndGgoKSA+IDApIHsKKwkJCQkvLyBCb3RoIGJlZm9yZSBhbmQgYWZ0ZXIgbm9uLWVtcHR5CisJCQkJaW50IGJlZm9yZV9pbmRleCA9IC0xOworCQkJCWludCBhZnRlcl9pbmRleCA9IC0xOworCQkJCXdoaWxlICgoYmVmb3JlX2luZGV4ID0gc291cmNlLmluZGV4T2YoYmVmb3JlLCArK2JlZm9yZV9pbmRleCkpID49IDApIHsKKwkJCQkJLy9iZWZvcmVfaW5kZXggPSBzb3VyY2UuaW5kZXhPZihiZWZvcmUsIGJlZm9yZV9pbmRleCk7CisJCQkJCWFmdGVyX2luZGV4ID0gLTE7CisJCQkJCWFmdGVyX2luZGV4ID0gc291cmNlLmluZGV4T2YoYWZ0ZXIsIGJlZm9yZV9pbmRleCArIGJlZm9yZS5sZW5ndGgoKSsxKTsKKwkJCQkJaWYgKGFmdGVyX2luZGV4IDwgMCB8fCBiZWZvcmVfaW5kZXggPCAwIHx8IGJlZm9yZS5sZW5ndGgoKSA8IDApIHsKKwkJCQkJICAgIGJyZWFrOworCQkJCQl9CisJCQkJCXYuYWRkRWxlbWVudChzb3VyY2Uuc3Vic3RyaW5nKGJlZm9yZV9pbmRleCArIGJlZm9yZS5sZW5ndGgoKSwgYWZ0ZXJfaW5kZXgpKTsKKwkJCQkJYmVmb3JlX2luZGV4ID0gYWZ0ZXJfaW5kZXg7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBCZWZvcmUgbm9uLWVtcHR5LCBhZnRlciBlbXB0eQorCQkJCWludCBpbmRleCA9IC0xOworCQkJCXdoaWxlIChzb3VyY2UuaW5kZXhPZihiZWZvcmUsICsraW5kZXgpID49IDApIHsKKwkJCQkJaW5kZXggPSBzb3VyY2UuaW5kZXhPZihiZWZvcmUsIGluZGV4KTsKKwkJCQkJU3RyaW5nIHJlc3VsdCA9IHNvdXJjZS5zdWJzdHJpbmcoaW5kZXggKyBiZWZvcmUubGVuZ3RoKCksIHNvdXJjZS5sZW5ndGgoKSk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwKSB2LmFkZEVsZW1lbnQocmVzdWx0KTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoYWZ0ZXIgIT0gbnVsbCAmJiBhZnRlci5sZW5ndGgoKSA+IDApIHsKKwkJCS8vIEJlZm9yZSBlbXB0eSwgYWZ0ZXIgbm90CisJCQlpbnQgaW5kZXggPSAtMTsKKwkJCXdoaWxlIChzb3VyY2UuaW5kZXhPZihhZnRlciwgKytpbmRleCkgPj0gMCkgeworCQkJCWluZGV4ID0gc291cmNlLmluZGV4T2YoYmVmb3JlLCBpbmRleCk7CisJCQkJU3RyaW5nIHJlc3VsdCA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwKSB2LmFkZEVsZW1lbnQocmVzdWx0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIEJlZm9yZSBhbmQgYWZ0ZXIgZW1wdHkKKwkJCXYuYWRkRWxlbWVudChzb3VyY2UpOworCQl9CisJCXJldHVybiB2OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJUTVhFeHBvcnRlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCVE1YRXhwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFlZGFhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCVE1YRXhwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgcGx1Zy1pbiB0byBSQk1hbmFnZXIgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZXhwb3J0IFJlc291cmNlIEJ1bmRsZXMKKyAqIGFsb25nIHdpdGggc29tZSBvZiB0aGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgYnkgUkJNYW5hZ2VyIHRvIHRoZSBUTVggc3BlY2lmaWNhdGlvbi4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRNWCB2aXNpdCB0aGUgd2ViIHNpdGUgPGEgaHJlZj0iaHR0cDovL3d3dy5saXNhLm9yZy90bXgvIj5odHRwOi8vd3d3Lmxpc2Eub3JnL3RteC88L2E+CisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCVE1YRXhwb3J0ZXIgZXh0ZW5kcyBSQkV4cG9ydGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIwLjVhIjsKKwkKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgVE1YIGV4cG9ydGVyLgorICAgICAqLworICAgICAgICAKKyAgICBwdWJsaWMgUkJUTVhFeHBvcnRlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKwkJCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZpbGUgY2hvb3NlciBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGNob29zZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKyAgICAgICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVE1YIEZpbGVzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudG14IikpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gLy8gZW5kIGlmCisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0lTTyhEYXRlIGQpIHsKKyAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgICAgZ2Muc2V0VGltZShkKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0lTTyhnYyk7CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0lTTyhHcmVnb3JpYW5DYWxlbmRhciBnYykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGdjLmdldChDYWxlbmRhci5ZRUFSKSkpOworICAgICAgICBpbnQgbW9udGggPSBnYy5nZXQoQ2FsZW5kYXIuTU9OVEgpKzE7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoKChtb250aCA8IDEwKSA/ICIwIiA6ICIiKSArIFN0cmluZy52YWx1ZU9mKG1vbnRoKSk7CisgICAgICAgIGludCBkYXkgPSBnYy5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgoKGRheSA8IDEwKSA/ICIwIiA6ICIiKSArIFN0cmluZy52YWx1ZU9mKGRheSkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJUIik7CisgICAgICAgIGludCBob3VyID0gZ2MuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgoKGhvdXIgPCAxMCkgPyAiMCIgOiAiIikgKyBTdHJpbmcudmFsdWVPZihob3VyKSk7CisgICAgICAgIGludCBtaW51dGUgPSBnYy5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgoKG1pbnV0ZSA8IDEwKSA/ICIwIiA6ICIiKSArIFN0cmluZy52YWx1ZU9mKG1pbnV0ZSkpOworICAgICAgICBpbnQgc2Vjb25kID0gZ2MuZ2V0KENhbGVuZGFyLlNFQ09ORCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoKChzZWNvbmQgPCAxMCkgPyAiMCIgOiAiIikgKyBTdHJpbmcudmFsdWVPZihzZWNvbmQpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWiIpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRFbmNvZGluZyhCdW5kbGVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmdldFBhcmVudEdyb3VwKCkgIT0gbnVsbCAmJiBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0UGFyZW50QnVuZGxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpLmdldExhbmd1YWdlRW5jb2RpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpLmdldENvdW50cnlFbmNvZGluZygpOworICAgICAgICAgICAgU3RyaW5nIHZhcmlhbnQgPSBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0UGFyZW50QnVuZGxlKCkuZ2V0VmFyaWFudEVuY29kaW5nKCk7CisgICAgICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiAhbGFuZ3VhZ2UuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIC8vbGFuZ3VhZ2UgPSBsYW5ndWFnZS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwgJiYgIWNvdW50cnkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAvL2NvdW50cnkgPSBjb3VudHJ5LnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYW50ICE9IG51bGwgJiYgIXZhcmlhbnQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJpYW50ID0gdmFyaWFudC50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlICsgIi0iICsgY291bnRyeSArICItIiArIHZhcmlhbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlICsgIi0iICsgY291bnRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisJCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFRVVihEb2N1bWVudCB4bWwsIEVsZW1lbnQgdHUsIEJ1bmRsZUl0ZW0gaXRlbSkgeworICAgICAgICBFbGVtZW50IHR1diA9IHhtbC5jcmVhdGVFbGVtZW50KCJ0dXYiKTsKKyAgICAgICAgdHV2LnNldEF0dHJpYnV0ZSgibGFuZyIsIGNvbnZlcnRFbmNvZGluZyhpdGVtKSk7CisgICAgICAgIHR1di5zZXRBdHRyaWJ1dGUoImNyZWF0aW9uZGF0ZSIsY29udmVydFRvSVNPKGl0ZW0uZ2V0Q3JlYXRlZERhdGUoKSkpOworICAgICAgICB0dXYuc2V0QXR0cmlidXRlKCJjcmVhdGlvbmlkIixpdGVtLmdldENyZWF0b3IoKSk7CisgICAgICAgIHR1di5zZXRBdHRyaWJ1dGUoImNoYW5nZWRhdGUiLGNvbnZlcnRUb0lTTyhpdGVtLmdldE1vZGlmaWVkRGF0ZSgpKSk7CisgICAgICAgIHR1di5zZXRBdHRyaWJ1dGUoImNoYW5nZWlkIixpdGVtLmdldE1vZGlmaWVyKCkpOworICAgICAgICBpdGVtLmdldENvbW1lbnQoKTsKKyAgICAgICAgaXRlbS5pc1RyYW5zbGF0ZWQoKTsKKwkJCisgICAgICAgIEVsZW1lbnQgY29tbWVudF9wcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKyAgICAgICAgY29tbWVudF9wcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShpdGVtLmdldENvbW1lbnQoKSkpOworICAgICAgICBjb21tZW50X3Byb3Auc2V0QXR0cmlidXRlKCJ0eXBlIiwieC1Db21tZW50Iik7CisgICAgICAgIHR1di5hcHBlbmRDaGlsZChjb21tZW50X3Byb3ApOworICAgICAgICAKKyAgICAgICAgRWxlbWVudCB0cmFuc2xhdGVkX3Byb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworICAgICAgICB0cmFuc2xhdGVkX3Byb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKFN0cmluZy52YWx1ZU9mKGl0ZW0uaXNUcmFuc2xhdGVkKCkpKSk7CisgICAgICAgIHRyYW5zbGF0ZWRfcHJvcC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ4LVRyYW5zbGF0ZWQiKTsKKyAgICAgICAgdHV2LmFwcGVuZENoaWxkKHRyYW5zbGF0ZWRfcHJvcCk7CisJCQorICAgICAgICBIYXNodGFibGUgbG9va3VwcyA9IGl0ZW0uZ2V0TG9va3VwcygpOworICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gbG9va3Vwcy5rZXlzKCk7CisgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWxvb2t1cHMuZ2V0KGtleSk7CisgICAgICAgICAgICBFbGVtZW50IGxvb2t1cF9wcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKyAgICAgICAgICAgIGxvb2t1cF9wcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShrZXkgKyAiPSIgKyB2YWx1ZSkpOworICAgICAgICAgICAgbG9va3VwX3Byb3Auc2V0QXR0cmlidXRlKCJ0eXBlIiwieC1Mb29rdXAiKTsKKyAgICAgICAgICAgIHR1di5hcHBlbmRDaGlsZChsb29rdXBfcHJvcCk7CisgICAgICAgIH0KKwkJCisgICAgICAgIEVsZW1lbnQgc2VnID0geG1sLmNyZWF0ZUVsZW1lbnQoInNlZyIpOworICAgICAgICBzZWcuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSkpOworICAgICAgICB0dXYuYXBwZW5kQ2hpbGQoc2VnKTsKKwkJCisgICAgICAgIHR1LmFwcGVuZENoaWxkKHR1dik7CisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChSQk1hbmFnZXIgcmJtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmJtID09IG51bGwpIHJldHVybjsKKyAgICAgICAgLy8gT3BlbiB0aGUgU2F2ZSBEaWFsb2cKKyAgICAgICAgaW50IHJldF92YWwgPSBjaG9vc2VyLnNob3dTYXZlRGlhbG9nKG51bGwpOworICAgICAgICBpZiAocmV0X3ZhbCAhPSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHJldHVybjsKKyAgICAgICAgLy8gUmV0cmlldmUgYmFzaWMgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICBGaWxlIGZpbGUgPSBjaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaWxlKHMpIHdlIHdpbGwgYmUgd29ya2luZyB3aXRoCisgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnQoKSk7ICAgICAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSB3ZSB3aWxsIGJlIHdyaXRpbmcgdG8KKyAgICAgICAgU3RyaW5nIGJhc2VfbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYmFzZSBuYW1lIG9mIHRoZSBmaWxlcyB3ZSB3aWxsIHdyaXRlCisgICAgICAgIGlmIChiYXNlX25hbWUgPT0gbnVsbCB8fCBiYXNlX25hbWUuZXF1YWxzKCIiKSkgYmFzZV9uYW1lID0gcmJtLmdldEJhc2VDbGFzcygpOworICAgICAgICBpZiAoYmFzZV9uYW1lLmVuZHNXaXRoKCIudG14IikpIGJhc2VfbmFtZSA9IGJhc2VfbmFtZS5zdWJzdHJpbmcoMCxiYXNlX25hbWUubGVuZ3RoKCktNCk7CisJCQorICAgICAgICBTdHJpbmcgZmlsZV9uYW1lID0gYmFzZV9uYW1lICsgIi50bXgiOworICAgICAgICAKKyAgICAgICAgVmVjdG9yIGJ1bmRsZV92ID0gcmJtLmdldEJ1bmRsZXMoKTsKKyAgICAgICAgQnVuZGxlIG1haW5fYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVfdi5lbGVtZW50QXQoMCk7CisgICAgICAgIAorICAgICAgICBEb2N1bWVudCB4bWwgPSBuZXcgRG9jdW1lbnRJbXBsKCk7CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IHhtbC5jcmVhdGVFbGVtZW50KCJ0bXgiKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCAiMS4yIik7CisgICAgICAgIHhtbC5hcHBlbmRDaGlsZChyb290KTsKKwkJCisgICAgICAgIEVsZW1lbnQgaGVhZGVyID0geG1sLmNyZWF0ZUVsZW1lbnQoImhlYWRlciIpOworICAgICAgICBFbGVtZW50IG5vdGUgPSB4bWwuY3JlYXRlRWxlbWVudCgibm90ZSIpOworICAgICAgICBub3RlLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZSgiVGhpcyBkb2N1bWVudCB3YXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IFJCTWFuYWdlciIpKTsKKyAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKG5vdGUpOworICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCJjcmVhdGlvbnRvb2wiLCAiUkJNYW5hZ2VyIik7CisgICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoImNyZWF0aW9udG9vbHZlcnNpb24iLCBWRVJTSU9OKTsKKyAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgiZGF0YXR5cGUiLCAiUGxhaW5UZXh0Iik7CisgICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoInNlZ3R5cGUiLCAic2VudGFuY2UiKTsKKyAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgiYWRtaW5sYW5nIiwgImVuLXVzIik7CisgICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoInNyY2xhbmciLCAiRU4iKTsKKyAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgiby10bWYiLCAibm9uZSIpOworICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCJjcmVhdGlvbmRhdGUiLCBjb252ZXJ0VG9JU08obmV3IERhdGUoKSkpOworICAgICAgICByb290LmFwcGVuZENoaWxkKGhlYWRlcik7CisJCQorICAgICAgICBFbGVtZW50IGJvZHkgPSB4bWwuY3JlYXRlRWxlbWVudCgiYm9keSIpOworICAgICAgICByb290LmFwcGVuZENoaWxkKGJvZHkpOworCQkKKyAgICAgICAgVmVjdG9yIGdyb3VwX3YgPSBtYWluX2J1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpOworICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBidW5kbGUgZ3JvdXAgaW4gbWFpbl9idW5kbGUKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZ3JvdXBfdi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlR3JvdXAgbWFpbl9ncm91cCA9IChCdW5kbGVHcm91cClncm91cF92LmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIC8vIEdhdGhlciBhIGdyb3VwIG9mIGdyb3VwcyBvZiB0aGUgc2FtZSBuYW1lIGFzIG1haW5fZ3JvdXAKKyAgICAgICAgICAgIFZlY3RvciBhbGxfZ3JvdXBzX3YgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBmb3IgKGludCBqPTE7IGogPCBidW5kbGVfdi5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZV92LmVsZW1lbnRBdChqKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVuZGxlLmhhc0dyb3VwKG1haW5fZ3JvdXAuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3IgZ3JvdXBzID0gYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgayA8IGdyb3Vwcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApZ3JvdXBzLmVsZW1lbnRBdChrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cC5nZXROYW1lKCkuZXF1YWxzKG1haW5fZ3JvdXAuZ2V0TmFtZSgpKSkgYWxsX2dyb3Vwc192LmFkZEVsZW1lbnQoZ3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gagorICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggaXRlbSBpbiBtYWluX2dyb3VwCisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBtYWluX2dyb3VwLmdldEl0ZW1Db3VudCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIG1haW5faXRlbSA9IG1haW5fZ3JvdXAuZ2V0QnVuZGxlSXRlbShqKTsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHR1ID0geG1sLmNyZWF0ZUVsZW1lbnQoInR1Iik7CisgICAgICAgICAgICAgICAgdHUuc2V0QXR0cmlidXRlKCJ0dWlkIixtYWluX2l0ZW0uZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIHR1LnNldEF0dHJpYnV0ZSgiZGF0YXR5cGUiLCJUZXh0Iik7CisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBncm91cCBuYW1lIGZvciB0aGUgaXRlbQorICAgICAgICAgICAgICAgIEVsZW1lbnQgZ3JvdXBfcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wIik7CisgICAgICAgICAgICAgICAgZ3JvdXBfcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUobWFpbl9ncm91cC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBncm91cF9wcm9wLnNldEF0dHJpYnV0ZSgidHlwZSIsICJ4LUdyb3VwIik7CisgICAgICAgICAgICAgICAgdHUuYXBwZW5kQ2hpbGQoZ3JvdXBfcHJvcCk7CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBtYWluX2l0ZW0gdG8gdGhlIHhtbAorICAgICAgICAgICAgICAgIGFwcGVuZFRVVih4bWwsIHR1LCBtYWluX2l0ZW0pOworICAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzIG9mIHRoZSBzYW1lIG5hbWUgYXMgbWFpbl9ncm91cAorICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgayA8IGFsbF9ncm91cHNfdi5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClhbGxfZ3JvdXBzX3YuZWxlbWVudEF0KGspOworICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIGl0ZW1zIGluIGVhY2ggZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbD0wOyBsIDwgZ3JvdXAuZ2V0SXRlbUNvdW50KCk7IGwrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gZ3JvdXAuZ2V0QnVuZGxlSXRlbShsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldEtleSgpLmVxdWFscyhtYWluX2l0ZW0uZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVFVWKHhtbCwgdHUsIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBmb3IgLSBsCisgICAgICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gaworICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodHUpOworICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gagorICAgICAgICB9IC8vIGVuZCBmb3IgLSBpCisgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihuZXcgRmlsZShkaXJlY3RvcnksZmlsZV9uYW1lKSk7CisgICAgICAgIE91dHB1dEZvcm1hdCBvZiA9IG5ldyBPdXRwdXRGb3JtYXQoeG1sKTsKKyAgICAgICAgb2Yuc2V0SW5kZW50aW5nKHRydWUpOworICAgICAgICBvZi5zZXRFbmNvZGluZygiSVNPLTg4NTktMSIpOworICAgICAgICBYTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcihmdywgb2YpOworICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZSh4bWwpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJUTVhJbXBvcnRlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCVE1YSW1wb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM4ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCVE1YSW1wb3J0ZXIuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKKworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLmd1aS5SQk1hbmFnZXJHVUk7CisKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdXBlciBjbGFzcyBmb3IgYWxsIGltcG9ydGVyIHBsdWctaW4gY2xhc3Nlcy4gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBtZXRob2RzCisgKiBhbmQgZnVuY3Rpb25hbGl0eSBjb21tb24gdG8gYWxsIGltcG9ydGVycy4gVGhpcyBpbmNsdWRlcyBzZXR0aW5nIHVwIHRoZSBvcHRpb25zIGRpYWxvZyBhbmQKKyAqIGRpc3BsYXlpbmcgaXQgdG8gdGhlIHVzZXIsIHBlcmZvcm1pbmcgdGhlIGFjdHVhbCBpbnNlcnRpb25zIGludG8gdGhlIHJlc291cmNlIGJ1bmRsZSBtYW5hZ2VyLAorICogYW5kIG1hbmFnaW5nIGFueSBpbXBvcnQgY29uZmxpY3RzLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQlRNWEltcG9ydGVyIGV4dGVuZHMgUkJJbXBvcnRlciB7CisJCisgICAgRG9jdW1lbnQgdG14X3htbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBCYXNpYyBjb25zdHJ1Y3RvciBmb3IgdGhlIFRNWCBpbXBvcnRlciBmcm9tIHRoZSBwYXJlbnQgUkJNYW5hZ2VyIGRhdGEgYW5kIGEgRGlhbG9nIHRpdGxlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBSQlRNWEltcG9ydGVyKFN0cmluZyB0aXRsZSwgUkJNYW5hZ2VyIHJibSwgUkJNYW5hZ2VyR1VJIGd1aSkgeworICAgICAgICBzdXBlcih0aXRsZSwgcmJtLCBndWkpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZpbGVDaG9vc2VyKCkgeworICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoIi50bXgiKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X1RNWF9maWxlX2Rlc2NyaXB0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBiZWdpbkltcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmJlZ2luSW1wb3J0KCk7CisgICAgICAgIEZpbGUgdG14X2ZpbGUgPSBnZXRDaG9zZW5GaWxlKCk7CisJCQorICAgICAgICB0cnkgeworICAgICAgICAJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odG14X2ZpbGUpOworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoZmlzKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAJdG14X3htbCA9IGJ1aWxkZXIucGFyc2UoaXMpOworICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRteF94bWwgPT0gbnVsbCkKKyAgICAgICAgCXJldHVybjsKKyAgICAgICAgCisgICAgICAgIGltcG9ydERvYygpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW1wb3J0RG9jKCkgeworICAgICAgICBpZiAodG14X3htbCA9PSBudWxsKQorICAgICAgICAJcmV0dXJuOworICAgICAgICBFbGVtZW50IHJvb3QgPSB0bXhfeG1sLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICBOb2RlIG5vZGUgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFIHx8ICEobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImhlYWRlciIpKSkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLy9FbGVtZW50SW1wbCBoZWFkZXIgPSAoRWxlbWVudEltcGwpbm9kZTsKKyAgICAgICAgbm9kZSA9IHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUgfHwgIShub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYm9keSIpKSkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgRWxlbWVudCBib2R5ID0gKEVsZW1lbnQpbm9kZTsKKyAgICAgICAgcmVzb2x2ZUVuY29kaW5ncyhnZXRFbmNvZGluZ3NWZWN0b3IoYm9keSkpOworCQkKKyAgICAgICAgLy8gTm93IGRvIHRoZSBhY3R1YWwgaW1wb3J0IHJlc291cmNlIGJ5IHJlc291cmNlCisgICAgICAgIE5vZGVMaXN0IHR1X2xpc3QgPSBib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0dSIpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB0dV9saXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIEVsZW1lbnQgdHVfZWxlbSA9IChFbGVtZW50KXR1X2xpc3QuaXRlbShpKTsKKyAgICAgICAgICAgIC8vIEdldCB0aGUga2V5IHZhbHVlCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHR1X2VsZW0uZ2V0QXR0cmlidXRlKCJ0dWlkIik7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAgICAgLy8gR2V0IHRoZSBncm91cCBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgIFN0cmluZyBncm91cCA9IG51bGw7CisgICAgICAgICAgICBOb2RlTGlzdCBwcm9wX2xpc3QgPSB0dV9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcm9wIik7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBwcm9wX2xpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcF9lbGVtID0gKEVsZW1lbnQpcHJvcF9saXN0Lml0ZW0oaik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBwcm9wX2VsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIik7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmVxdWFscygieC1Hcm91cCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BfZWxlbS5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgdGV4dF9saXN0ID0gcHJvcF9lbGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfbGlzdC5nZXRMZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgVGV4dCB0ZXh0X2VsZW0gPSAoVGV4dCl0ZXh0X2xpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSB0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdyb3VwID09IG51bGwgfHwgZ3JvdXAubGVuZ3RoKCkgPCAxKSBncm91cCA9IGdldERlZmF1bHRHcm91cCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBOb2RlTGlzdCB0dXZfbGlzdCA9IHR1X2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInR1diIpOworICAgICAgICAgICAgLy8gRm9yIGVhY2ggdHV2IGVsZW1lbnQKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IHR1dl9saXN0LmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHR1dl9lbGVtID0gKEVsZW1lbnQpdHV2X2xpc3QuaXRlbShqKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSB0dXZfZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgY29udGludWU7CisgICAgICAgICAgICAgICAgY2hhciBhcnJheVtdID0gZW5jb2RpbmcudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBhcnJheS5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlba10gPT0gJy0nKQorICAgICAgICAgICAgICAgICAgICAJYXJyYXlba10gPSAnXyc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nLnZhbHVlT2YoYXJyYXkpOworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdHJhbnNsYXRpb24gdmFsdWUKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBzZWdfbGlzdCA9IHR1dl9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWciKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VnX2xpc3QuZ2V0TGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHNlZ19lbGVtID0gKEVsZW1lbnQpc2VnX2xpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICBzZWdfZWxlbS5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCB0ZXh0X2xpc3QgPSBzZWdfZWxlbS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHRleHRfbGlzdC5nZXRMZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIFRleHQgdGV4dF9lbGVtID0gKFRleHQpdGV4dF9saXN0Lml0ZW0oMCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdGV4dF9lbGVtLmdldE5vZGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBidW5kbGUgaXRlbQorICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaXRlbSA9IG5ldyBCdW5kbGVJdGVtKG51bGwsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiB2YWx1ZXMKKyAgICAgICAgICAgICAgICBpdGVtLnNldENyZWF0ZWREYXRlKHR1dl9lbGVtLmdldEF0dHJpYnV0ZSgiY3JlYXRpb25kYXRlIikpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0TW9kaWZpZWREYXRlKHR1dl9lbGVtLmdldEF0dHJpYnV0ZSgiY2hhbmdlZGF0ZSIpKTsKKyAgICAgICAgICAgICAgICBpZiAodHV2X2VsZW0uZ2V0QXR0cmlidXRlKCJjaGFuZ2VpZCIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgCWl0ZW0uc2V0TW9kaWZpZXIodHV2X2VsZW0uZ2V0QXR0cmlidXRlKCJjaGFuZ2VpZCIpKTsKKyAgICAgICAgICAgICAgICBpZiAodHV2X2VsZW0uZ2V0QXR0cmlidXRlKCJjcmVhdGlvbmlkIikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAJaXRlbS5zZXRDcmVhdG9yKHR1dl9lbGVtLmdldEF0dHJpYnV0ZSgiY3JlYXRpb25pZCIpKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgcHJvcGVydGllcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICBwcm9wX2xpc3QgPSB0dXZfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcCIpOworICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBsb29rdXBzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBwcm9wX2xpc3QuZ2V0TGVuZ3RoKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BfZWxlbSA9IChFbGVtZW50KXByb3BfbGlzdC5pdGVtKGspOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHByb3BfZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmVxdWFscygieC1Db21tZW50IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcF9lbGVtLm5vcm1hbGl6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9saXN0ID0gcHJvcF9lbGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xpc3QuZ2V0TGVuZ3RoKCkgPCAxKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZWxlbSA9IChUZXh0KXRleHRfbGlzdC5pdGVtKDApOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnQgPSB0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgCWl0ZW0uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5lcXVhbHMoIngtVHJhbnNsYXRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHRyYW5zbGF0ZWQgZmxhZyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcF9lbGVtLm5vcm1hbGl6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9saXN0ID0gcHJvcF9lbGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xpc3QuZ2V0TGVuZ3RoKCkgPCAxKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZWxlbSA9IChUZXh0KXRleHRfbGlzdC5pdGVtKDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfZWxlbS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfZWxlbS5nZXROb2RlVmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWl0ZW0uc2V0VHJhbnNsYXRlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaXRlbS5zZXRUcmFuc2xhdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWl0ZW0uc2V0VHJhbnNsYXRlZChnZXREZWZhdWx0VHJhbnNsYXRlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIAlpdGVtLnNldFRyYW5zbGF0ZWQoZ2V0RGVmYXVsdFRyYW5zbGF0ZWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZXF1YWxzKCJ4LUxvb2t1cCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYSBsb29rdXAgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BfZWxlbS5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbGlzdCA9IHByb3BfZWxlbS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dF9saXN0LmdldExlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZWxlbSA9IChUZXh0KXRleHRfbGlzdC5pdGVtKDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfZWxlbS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZigiPSIpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2t1cHMgPT0gbnVsbCkgbG9va3VwcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsa2V5ID0gdGV4dC5zdWJzdHJpbmcoMCx0ZXh0LmluZGV4T2YoIj0iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbHZhbHVlID0gdGV4dC5zdWJzdHJpbmcodGV4dC5pbmRleE9mKCI9IikrMSx0ZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cHMucHV0KGxrZXksIGx2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeyAvKiBTdHJpbmcgb3V0IG9mIGJvdW5kcyAtIElnbm9yZSBhbmQgZ28gb24gKi8gfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIAlpdGVtLnNldFRyYW5zbGF0ZWQoZ2V0RGVmYXVsdFRyYW5zbGF0ZWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvb2t1cHMgIT0gbnVsbCkgaXRlbS5zZXRMb29rdXBzKGxvb2t1cHMpOworICAgICAgICAgICAgICAgIGltcG9ydFJlc291cmNlKGl0ZW0sIGVuY29kaW5nLCBncm91cCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJCisgICAgcHJpdmF0ZSBWZWN0b3IgZ2V0RW5jb2RpbmdzVmVjdG9yKEVsZW1lbnQgYm9keSkgeworICAgICAgICBTdHJpbmcgZW1wdHkgPSAiIjsKKyAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkKKyAgICAgICAgCXJldHVybiBudWxsOworICAgICAgICBIYXNodGFibGUgaGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgTm9kZUxpc3QgdHVfbGlzdCA9IGJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInR1Iik7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHR1X2xpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgRWxlbWVudCB0dV9lbGVtID0gKEVsZW1lbnQpdHVfbGlzdC5pdGVtKGkpOworICAgICAgICAgICAgTm9kZUxpc3QgdHV2X2xpc3QgPSB0dV9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0dXYiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IHR1dl9saXN0LmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHR1dl9lbGVtID0gKEVsZW1lbnQpdHV2X2xpc3QuaXRlbShqKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSB0dXZfZWxlbS5nZXRBdHRyaWJ1dGUoImxhbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICAgICAgY2hhciBhcnJheVtdID0gZW5jb2RpbmcudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBhcnJheS5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlba10gPT0gJy0nKQorICAgICAgICAgICAgICAgICAgICAJYXJyYXlba10gPSAnXyc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nLnZhbHVlT2YoYXJyYXkpOworICAgICAgICAgICAgICAgIGlmICghKGhhc2guY29udGFpbnNLZXkoZW5jb2RpbmcpKSkKKyAgICAgICAgICAgICAgICAJaGFzaC5wdXQoZW5jb2RpbmcsZW1wdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gaGFzaC5rZXlzKCk7CisgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgIAl2LmFkZEVsZW1lbnQoa2V5cy5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCeGxpZmZFeHBvcnRlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCeGxpZmZFeHBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTdiNmIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJ4bGlmZkV4cG9ydGVyLmphdmEKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnRleHQuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uKjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS4qOworCitpbXBvcnQgb3JnLnczYy5kb20uKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgcGx1Zy1pbiB0byBSQk1hbmFnZXIgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZXhwb3J0IFJlc291cmNlIEJ1bmRsZXMKKyAqIGFsb25nIHdpdGggc29tZSBvZiB0aGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgYnkgUkJNYW5hZ2VyIHRvIHRoZSBYTElGRiBzcGVjaWZpY2F0aW9uLgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWExJRkYgdmlzaXQgdGhlIHdlYiBzaXRlCisgKiA8YSBocmVmPSJodHRwOi8vd3d3Lmxpc2Eub3JnL3hsaWZmLyI+aHR0cDovL3d3dy5saXNhLm9yZy94bGlmZi88L2E+CisgKiAKKyAqIEBhdXRob3IgR2VvcmdlIFJob3RlbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCeGxpZmZFeHBvcnRlciBleHRlbmRzIFJCRXhwb3J0ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjAuNyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhMSUZGX0RURCA9ICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMveGxpZmYvZG9jdW1lbnRzL3hsaWZmLmR0ZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhMSUZGX1BVQkxJQ19OQU1FID0gIi0vL1hMSUZGLy9EVEQgWExJRkYvL0VOIjsKKyAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIik7CisJCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIFhMSUZGIGV4cG9ydGVyLgorICAgICAqLworICAgICAgICAKKyAgICBwdWJsaWMgUkJ4bGlmZkV4cG9ydGVyKCkgeworICAgICAgICBzdXBlcigpOworCQkKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmlsZSBjaG9vc2VyIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoY2hvb3NlciA9PSBudWxsKSB7CisgICAgICAgICAgICBjaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworICAgICAgICAgICAgY2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCl7CisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJYTElGRiBGaWxlcyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmLmlzRGlyZWN0b3J5KCkgfHwgZi5nZXROYW1lKCkuZW5kc1dpdGgoIi54bGYiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvSVNPKERhdGUgZCkgeworICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICBnYy5zZXRUaW1lKGQpOworICAgICAgICByZXR1cm4gY29udmVydFRvSVNPKGdjKTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvSVNPKEdyZWdvcmlhbkNhbGVuZGFyIGdjKSB7CisgICAgCWRhdGVGb3JtYXQuc2V0Q2FsZW5kYXIoZ2MpOworICAgICAgICByZXR1cm4gZGF0ZUZvcm1hdC5mb3JtYXQoZ2MuZ2V0VGltZSgpKTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYWxlKEJ1bmRsZSBpdGVtKSB7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGl0ZW0uZ2V0TGFuZ3VhZ2VFbmNvZGluZygpOworICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiAhbGFuZ3VhZ2UuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgLy9sYW5ndWFnZSA9IGxhbmd1YWdlLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IGl0ZW0uZ2V0Q291bnRyeUVuY29kaW5nKCk7CisgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsICYmICFjb3VudHJ5LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAvL2NvdW50cnkgPSBjb3VudHJ5LnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhcmlhbnQgPSBpdGVtLmdldFZhcmlhbnRFbmNvZGluZygpOworICAgICAgICAgICAgICAgIGlmICh2YXJpYW50ICE9IG51bGwgJiYgIXZhcmlhbnQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAvL3ZhcmlhbnQgPSB2YXJpYW50LnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZSArICItIiArIGNvdW50cnkgKyAiLSIgKyB2YXJpYW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGFuZ3VhZ2UgKyAiLSIgKyBjb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRQYXJlbnRMb2NhbGUoU3RyaW5nIGxvY2FsZSkgeworICAgIAkKKyAgICAJaW50IHRydW5jSW5kZXggPSBsb2NhbGUubGFzdEluZGV4T2YoJy0nKTsKKyAgICAJaWYgKHRydW5jSW5kZXggPiAwKSB7CisgICAgCQlsb2NhbGUgPSBsb2NhbGUuc3Vic3RyaW5nKDAsIHRydW5jSW5kZXgpOworICAgIAl9CisgICAgCWVsc2UgeworICAgIAkJbG9jYWxlID0gIiI7CisgICAgCX0KKyAgICAJcmV0dXJuIGxvY2FsZTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRyYW5zVW5pdChEb2N1bWVudCB4bWwsIEVsZW1lbnQgZ3JvdXBFbGVtLCBCdW5kbGVJdGVtIGl0ZW0sIEJ1bmRsZUl0ZW0gcGFyZW50X2l0ZW0pIHsKKyAgICAgICAgRWxlbWVudCB0cmFuc1VuaXQgPSB4bWwuY3JlYXRlRWxlbWVudCgidHJhbnMtdW5pdCIpOworICAgICAgICB0cmFuc1VuaXQuc2V0QXR0cmlidXRlKCJkYXRlIixjb252ZXJ0VG9JU08oaXRlbS5nZXRNb2RpZmllZERhdGUoKSkpOworICAgICAgICB0cmFuc1VuaXQuc2V0QXR0cmlidXRlKCJpZCIsaXRlbS5nZXRLZXkoKSk7CisJCQorICAgICAgICBTdHJpbmcgc291cmNlT3JUYXJnZXQgPSAidGFyZ2V0IjsKKyAgICAgICAgaWYgKHBhcmVudF9pdGVtID09IG51bGwpIHsKKyAgICAgICAgCXNvdXJjZU9yVGFyZ2V0ID0gInNvdXJjZSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBFbGVtZW50IHNvdXJjZSA9IHhtbC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKKyAgICAgICAgICAgIHNvdXJjZS5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsInByZXNlcnZlIik7CisgICAgICAgICAgICBzb3VyY2UuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKHBhcmVudF9pdGVtLmdldFRyYW5zbGF0aW9uKCkpKTsKKyAgICAgICAgICAgIHRyYW5zVW5pdC5hcHBlbmRDaGlsZChzb3VyY2UpOworICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgdGFyZ2V0ID0geG1sLmNyZWF0ZUVsZW1lbnQoc291cmNlT3JUYXJnZXQpOworICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpOworICAgIAkvLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0cmFuc2xhdGUgYXR0cmlidXRlCisgICAgICAgIGlmIChpdGVtLmlzVHJhbnNsYXRlZCgpKSB7CisgICAgICAgIAkvLyBUT0RPIEhhbmRsZSB0aGUgb3RoZXIgc3RhdGVzIGluIHRoZSBmdXR1cmUuCisgICAgICAgIAl0cmFuc1VuaXQuc2V0QXR0cmlidXRlKCJzdGF0ZSIsICJ0cmFuc2xhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShpdGVtLmdldFRyYW5zbGF0aW9uKCkpKTsKKyAgICAgICAgdHJhbnNVbml0LmFwcGVuZENoaWxkKHRhcmdldCk7CisJCQorICAgICAgICBpZiAoaXRlbS5nZXRDb21tZW50KCkgIT0gbnVsbCAmJiBpdGVtLmdldENvbW1lbnQoKS5sZW5ndGgoKSA+IDEpIHsKKwkgICAgICAgIEVsZW1lbnQgY29tbWVudF9wcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoIm5vdGUiKTsKKwkgICAgICAgIGNvbW1lbnRfcHJvcC5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsInByZXNlcnZlIik7CisJICAgICAgICBjb21tZW50X3Byb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKGl0ZW0uZ2V0Q29tbWVudCgpKSk7CisJICAgICAgICB0cmFuc1VuaXQuYXBwZW5kQ2hpbGQoY29tbWVudF9wcm9wKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKChpdGVtLmdldENyZWF0b3IoKSAhPSBudWxsICYmIGl0ZW0uZ2V0Q3JlYXRvcigpLmxlbmd0aCgpID4gMSkKKyAgICAgICAgCXx8IChpdGVtLmdldE1vZGlmaWVyKCkgIT0gbnVsbCAmJiBpdGVtLmdldE1vZGlmaWVyKCkubGVuZ3RoKCkgPiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudCB0cmFuc1VuaXRfcHJvcF9ncm91cF9lbGVtID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AtZ3JvdXAiKTsKKworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q3JlYXRvcigpICE9IG51bGwgJiYgaXRlbS5nZXRDcmVhdG9yKCkubGVuZ3RoKCkgPiAxKSB7CisJICAgICAgICAgICAgRWxlbWVudCBjcmVhdG9yX3Byb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworCSAgICAgICAgICAgIGNyZWF0b3JfcHJvcC5zZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIsImNyZWF0b3IiKTsKKwkgICAgICAgICAgICBjcmVhdG9yX3Byb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKGl0ZW0uZ2V0Q3JlYXRvcigpKSk7CisJCSAgICAgICAgdHJhbnNVbml0X3Byb3BfZ3JvdXBfZWxlbS5hcHBlbmRDaGlsZChjcmVhdG9yX3Byb3ApOworICAgICAgICAgICAgfQorCSAgICAgICAgCisgICAgICAgICAgICBpZiAoaXRlbS5nZXRDcmVhdG9yKCkgIT0gbnVsbCAmJiBpdGVtLmdldENyZWF0b3IoKS5sZW5ndGgoKSA+IDEpIHsKKwkgICAgICAgICAgICBFbGVtZW50IGNyZWF0ZWRfcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wIik7CisJICAgICAgICAgICAgY3JlYXRlZF9wcm9wLnNldEF0dHJpYnV0ZSgicHJvcC10eXBlIiwiY3JlYXRlZCIpOworCSAgICAgICAgICAgIGNyZWF0ZWRfcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUoY29udmVydFRvSVNPKGl0ZW0uZ2V0Q3JlYXRlZERhdGUoKSkpKTsKKwkJICAgICAgICB0cmFuc1VuaXRfcHJvcF9ncm91cF9lbGVtLmFwcGVuZENoaWxkKGNyZWF0ZWRfcHJvcCk7CisgICAgICAgICAgICB9CisJICAgICAgICAKKyAgICAgICAgCWlmIChpdGVtLmdldE1vZGlmaWVyKCkgIT0gbnVsbCAmJiBpdGVtLmdldE1vZGlmaWVyKCkubGVuZ3RoKCkgPiAxKSB7CisJCSAgICAgICAgRWxlbWVudCBtb2RpZmllcl9wcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKwkJICAgICAgICBtb2RpZmllcl9wcm9wLnNldEF0dHJpYnV0ZSgicHJvcC10eXBlIiwibW9kaWZpZXIiKTsKKwkJICAgICAgICBtb2RpZmllcl9wcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShpdGVtLmdldE1vZGlmaWVyKCkpKTsKKwkJICAgICAgICB0cmFuc1VuaXRfcHJvcF9ncm91cF9lbGVtLmFwcGVuZENoaWxkKG1vZGlmaWVyX3Byb3ApOworICAgICAgICAJfQorCSAgICAgICAgCisJICAgICAgICB0cmFuc1VuaXQuYXBwZW5kQ2hpbGQodHJhbnNVbml0X3Byb3BfZ3JvdXBfZWxlbSk7CisgICAgICAgIH0KKworICAgICAgICBncm91cEVsZW0uYXBwZW5kQ2hpbGQodHJhbnNVbml0KTsKKyAgICB9CisJCisgICAgcHVibGljIHZvaWQgZXhwb3J0KFJCTWFuYWdlciByYm0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyYm0gPT0gbnVsbCkKKyAgICAgICAgCXJldHVybjsKKyAgICAgICAgLy8gT3BlbiB0aGUgU2F2ZSBEaWFsb2cKKyAgICAgICAgaW50IHJldF92YWwgPSBjaG9vc2VyLnNob3dTYXZlRGlhbG9nKG51bGwpOworICAgICAgICBpZiAocmV0X3ZhbCAhPSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIC8vIFJldHJpZXZlIGJhc2ljIGZpbGUgaW5mb3JtYXRpb24KKyAgICAgICAgRmlsZSBmaWxlID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsgICAgICAgICAgICAgIC8vIFRoZSBmaWxlKHMpIHdlIHdpbGwgYmUgd29ya2luZyB3aXRoCisgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnQoKSk7ICAgICAgICAvLyBUaGUgZGlyZWN0b3J5IHdlIHdpbGwgYmUgd3JpdGluZyB0bworICAgICAgICBTdHJpbmcgYmFzZV9uYW1lID0gZmlsZS5nZXROYW1lKCk7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgbmFtZSBvZiB0aGUgZmlsZXMgd2Ugd2lsbCB3cml0ZQorICAgICAgICBpZiAoYmFzZV9uYW1lID09IG51bGwgfHwgYmFzZV9uYW1lLmVxdWFscygiIikpCisgICAgICAgIAliYXNlX25hbWUgPSByYm0uZ2V0QmFzZUNsYXNzKCk7CisgICAgICAgIGlmIChiYXNlX25hbWUuZW5kc1dpdGgoIi54bGYiKSkKKyAgICAgICAgCWJhc2VfbmFtZSA9IGJhc2VfbmFtZS5zdWJzdHJpbmcoMCxiYXNlX25hbWUubGVuZ3RoKCktNCk7CisJCQorICAgICAgICBTdHJpbmcgZmlsZV9uYW1lID0gYmFzZV9uYW1lICsgIi54bGYiOworICAgICAgICAKKyAgICAgICAgVmVjdG9yIGJ1bmRsZV92ID0gcmJtLmdldEJ1bmRsZXMoKTsKKyAgICAgICAgRW51bWVyYXRpb24gYnVuZGxlSXRlciA9IGJ1bmRsZV92LmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChidW5kbGVJdGVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgIAlleHBvcnRGaWxlKHJibSwgZGlyZWN0b3J5LCBiYXNlX25hbWUsIChCdW5kbGUpYnVuZGxlSXRlci5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYWRkSGVhZGVyUHJvcGVydGllcyhEb2N1bWVudCB4bWwsIEVsZW1lbnQgaGVhZGVyLCBCdW5kbGUgbWFpbl9idW5kbGUpIHsKKyAgICAgICAgaWYgKG1haW5fYnVuZGxlLmNvbW1lbnQgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS5jb21tZW50Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgRWxlbWVudCBub3RlID0geG1sLmNyZWF0ZUVsZW1lbnQoIm5vdGUiKTsKKyAgICAgICAgCWhlYWRlci5hcHBlbmRDaGlsZChub3RlKTsKKyAgICAgICAgICAgIG5vdGUuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKG1haW5fYnVuZGxlLmNvbW1lbnQpKTsKKyAgICAgICAgICAgIG5vdGUuc2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpOworICAgICAgICB9CisgICAgICAgIGlmICgobWFpbl9idW5kbGUubmFtZSAhPSBudWxsICYmIG1haW5fYnVuZGxlLm5hbWUubGVuZ3RoKCkgPiAwKQorICAgIAkJfHwgKG1haW5fYnVuZGxlLm1hbmFnZXIgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS5tYW5hZ2VyLmxlbmd0aCgpID4gMCkKKyAgICAgICAgCXx8IChtYWluX2J1bmRsZS5sYW5ndWFnZSAhPSBudWxsICYmIG1haW5fYnVuZGxlLmxhbmd1YWdlLmxlbmd0aCgpID4gMCkKKwkJCXx8IChtYWluX2J1bmRsZS5jb3VudHJ5ICE9IG51bGwgJiYgbWFpbl9idW5kbGUuY291bnRyeS5sZW5ndGgoKSA+IDApCisJCQl8fCAobWFpbl9idW5kbGUudmFyaWFudCAhPSBudWxsICYmIG1haW5fYnVuZGxlLnZhcmlhbnQubGVuZ3RoKCkgPiAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudCBwcm9wX2dyb3VwID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AtZ3JvdXAiKTsKKyAgICAgICAgCWhlYWRlci5hcHBlbmRDaGlsZChwcm9wX2dyb3VwKTsKKyAgICAgICAgICAgIGlmIChtYWluX2J1bmRsZS5uYW1lICE9IG51bGwgJiYgbWFpbl9idW5kbGUubmFtZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHByb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworICAgICAgICAgICAgCWhlYWRlci5hcHBlbmRDaGlsZChwcm9wKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwicHJlc2VydmUiKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgicHJvcC10eXBlIiwibmFtZSIpOworICAgICAgICAgICAgCXByb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKG1haW5fYnVuZGxlLm5hbWUpKTsKKyAgICAgICAgICAgIAlwcm9wX2dyb3VwLmFwcGVuZENoaWxkKHByb3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1haW5fYnVuZGxlLm1hbmFnZXIgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS5tYW5hZ2VyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wIik7CisgICAgICAgICAgICAJaGVhZGVyLmFwcGVuZENoaWxkKHByb3ApOworICAgICAgICAgICAgCXByb3Auc2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpOworICAgICAgICAgICAgCXByb3Auc2V0QXR0cmlidXRlKCJwcm9wLXR5cGUiLCJtYW5hZ2VyIik7CisgICAgICAgICAgICAJcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUobWFpbl9idW5kbGUubWFuYWdlcikpOworICAgICAgICAgICAgCXByb3BfZ3JvdXAuYXBwZW5kQ2hpbGQocHJvcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFpbl9idW5kbGUubGFuZ3VhZ2UgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS5sYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHByb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworICAgICAgICAgICAgCWhlYWRlci5hcHBlbmRDaGlsZChwcm9wKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwicHJlc2VydmUiKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgicHJvcC10eXBlIiwibGFuZ3VhZ2UiKTsKKyAgICAgICAgICAgIAlwcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShtYWluX2J1bmRsZS5sYW5ndWFnZSkpOworICAgICAgICAgICAgCXByb3BfZ3JvdXAuYXBwZW5kQ2hpbGQocHJvcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFpbl9idW5kbGUuY291bnRyeSAhPSBudWxsICYmIG1haW5fYnVuZGxlLmNvdW50cnkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBwcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKyAgICAgICAgICAgIAloZWFkZXIuYXBwZW5kQ2hpbGQocHJvcCk7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsInByZXNlcnZlIik7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIsImNvdW50cnkiKTsKKyAgICAgICAgICAgIAlwcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShtYWluX2J1bmRsZS5jb3VudHJ5KSk7CisgICAgICAgICAgICAJcHJvcF9ncm91cC5hcHBlbmRDaGlsZChwcm9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYWluX2J1bmRsZS52YXJpYW50ICE9IG51bGwgJiYgbWFpbl9idW5kbGUudmFyaWFudC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHByb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworICAgICAgICAgICAgCWhlYWRlci5hcHBlbmRDaGlsZChwcm9wKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwicHJlc2VydmUiKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgicHJvcC10eXBlIiwidmFyaWFudCIpOworICAgICAgICAgICAgCXByb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKG1haW5fYnVuZGxlLnZhcmlhbnQpKTsKKyAgICAgICAgICAgIAlwcm9wX2dyb3VwLmFwcGVuZENoaWxkKHByb3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBleHBvcnRGaWxlKFJCTWFuYWdlciByYm0sIEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcgYmFzZV9uYW1lLCBCdW5kbGUgbWFpbl9idW5kbGUpCisgICAgCXRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQnVuZGxlIHBhcmVudF9idW5kbGUgPSBudWxsOworICAgICAgICBTdHJpbmcgcGFyZW50X2J1bmRsZV9uYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKCFnZXRMb2NhbGUobWFpbl9idW5kbGUpLmVxdWFscygiIikpIHsKKyAgICAgICAgCS8vIElmIHRoaXMgaXNuJ3QgdGhlIHJvb3QgbG9jYWxlLCBmaW5kIHRoZSBwYXJlbnQKKyAgICAgICAgICAgIHBhcmVudF9idW5kbGVfbmFtZSA9IGdldFBhcmVudExvY2FsZShnZXRMb2NhbGUobWFpbl9idW5kbGUpKTsKKwkgICAgICAgIGRvIHsKKwkgICAgICAgIAlwYXJlbnRfYnVuZGxlID0gcmJtLmdldEJ1bmRsZShwYXJlbnRfYnVuZGxlX25hbWUpOworCSAgICAgICAgCWlmIChwYXJlbnRfYnVuZGxlICE9IG51bGwpIHsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJfQorCSAgICAgICAgICAgIHBhcmVudF9idW5kbGVfbmFtZSA9IGdldFBhcmVudExvY2FsZShwYXJlbnRfYnVuZGxlX25hbWUpOworCSAgICAgICAgfSB3aGlsZSAoIXBhcmVudF9idW5kbGVfbmFtZS5lcXVhbHMoIiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgICAgICAvLyBGaW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCWJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7CisgICAgICAgIAl0aHJvdyBuZXcgSU9FeGNlcHRpb24ocGNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIENyZWF0ZSB0aGUgZG9jdW1lbnQKKyAgICAgICAgRG9jdW1lbnQgeG1sID0gYnVpbGRlci5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KG51bGwsICJ4bGlmZiIsIG51bGwpOworICAgICAgICAgCisgICAgICAgIC8vIEZpbGwgdGhlIGRvY3VtZW50CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IHhtbC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCAiMS4xIik7CisgICAgICAgIC8vcm9vdC5hcHBlbmRDaGlsZChyb290KTsKKyAgICAgICAgCisgICAgICAgIEVsZW1lbnQgZmlsZV9lbGVtID0geG1sLmNyZWF0ZUVsZW1lbnQoImZpbGUiKTsKKyAgICAgICAgU3RyaW5nIG1haW5Mb2NhbGUgPSBnZXRMb2NhbGUobWFpbl9idW5kbGUpOworICAgICAgICBCdW5kbGUgcGFyZW50QnVuZGxlID0gbnVsbDsKKyAgICAgICAgaWYgKG1haW5Mb2NhbGUuZXF1YWxzKCIiKSkgeworICAgICAgICAJZmlsZV9lbGVtLnNldEF0dHJpYnV0ZSgic291cmNlLWxhbmd1YWdlIiwgZ2V0TG9jYWxlKG1haW5fYnVuZGxlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIAlmaWxlX2VsZW0uc2V0QXR0cmlidXRlKCJzb3VyY2UtbGFuZ3VhZ2UiLCBwYXJlbnRfYnVuZGxlX25hbWUpOworICAgICAgICAJZmlsZV9lbGVtLnNldEF0dHJpYnV0ZSgidGFyZ2V0LWxhbmd1YWdlIiwgZ2V0TG9jYWxlKG1haW5fYnVuZGxlKSk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZV9lbGVtLnNldEF0dHJpYnV0ZSgiZGF0YXR5cGUiLCAicGxhaW50ZXh0Iik7CisgICAgICAgIGZpbGVfZWxlbS5zZXRBdHRyaWJ1dGUoImRhdGUiLCBjb252ZXJ0VG9JU08obmV3IERhdGUoKSkpOworICAgICAgICByb290LmFwcGVuZENoaWxkKGZpbGVfZWxlbSk7CisJCQorICAgICAgICBFbGVtZW50IGhlYWRlciA9IHhtbC5jcmVhdGVFbGVtZW50KCJoZWFkZXIiKTsKKyAgICAgICAgRWxlbWVudCB0b29sID0geG1sLmNyZWF0ZUVsZW1lbnQoInRvb2wiKTsKKyAgICAgICAgdG9vbC5zZXRBdHRyaWJ1dGUoInRvb2wtbmFtZSIsICJSQk1hbmFnZXIiKTsKKyAgICAgICAgdG9vbC5zZXRBdHRyaWJ1dGUoInRvb2wtaWQiLCAiUkJNYW5hZ2VyIik7CisgICAgICAgIHRvb2wuc2V0QXR0cmlidXRlKCJ0b29sLXZlcnNpb24iLCBWRVJTSU9OKTsKKyAgICAgICAgLy8gVE9ETyBBZGQgZmlsZSBhdHRyaWJ1dGUKKyAgICAgICAgLy9oZWFkZXIuc2V0QXR0cmlidXRlKCJmaWxlIiwgIiIpOworICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQodG9vbCk7CisgICAgICAgIGFkZEhlYWRlclByb3BlcnRpZXMoeG1sLCBoZWFkZXIsIG1haW5fYnVuZGxlKTsKKyAgICAgICAgZmlsZV9lbGVtLmFwcGVuZENoaWxkKGhlYWRlcik7CisJCQorICAgICAgICBFbGVtZW50IGJvZHkgPSB4bWwuY3JlYXRlRWxlbWVudCgiYm9keSIpOworICAgICAgICBmaWxlX2VsZW0uYXBwZW5kQ2hpbGQoYm9keSk7CisJCQorICAgICAgICBWZWN0b3IgZ3JvdXBfdiA9IG1haW5fYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisgICAgICAgIFZlY3RvciBwYXJlbnRfZ3JvdXBfdiA9IG51bGw7CisgICAgICAgIGlmIChwYXJlbnRfYnVuZGxlICE9IG51bGwpIHsKKyAgICAgICAgCXBhcmVudF9ncm91cF92ID0gcGFyZW50X2J1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpOworICAgICAgICB9CisgICAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGJ1bmRsZSBncm91cCBpbiBtYWluX2J1bmRsZQorICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBncm91cF92LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGVHcm91cCBjdXJyX2dyb3VwID0gKEJ1bmRsZUdyb3VwKWdyb3VwX3YuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgQnVuZGxlR3JvdXAgcGFyZW50X2dyb3VwID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYXJlbnRfZ3JvdXBfdiAhPSBudWxsKSB7IAorCSAgICAgICAgICAgIEVudW1lcmF0aW9uIHBhcmVudEdyb3VwSXRlciA9IHBhcmVudF9ncm91cF92LmVsZW1lbnRzKCk7CisJICAgICAgICAgICAgCisJICAgICAgICAgICAgd2hpbGUgKHBhcmVudEdyb3VwSXRlci5oYXNNb3JlRWxlbWVudHMoKSkgeworCSAgICAgICAgICAgIAlCdW5kbGVHcm91cCBncm91cFRvRmluZCA9IChCdW5kbGVHcm91cClwYXJlbnRHcm91cEl0ZXIubmV4dEVsZW1lbnQoKTsKKwkgICAgICAgICAgICAJaWYgKGdyb3VwVG9GaW5kLmdldE5hbWUoKS5lcXVhbHMoY3Vycl9ncm91cC5nZXROYW1lKCkpKSB7CisJICAgICAgICAgICAgCQlwYXJlbnRfZ3JvdXAgPSBncm91cFRvRmluZDsKKwkgICAgICAgICAgICAJCWJyZWFrOworCSAgICAgICAgICAgIAl9CisJICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRWxlbWVudCBncm91cF9lbGVtID0geG1sLmNyZWF0ZUVsZW1lbnQoImdyb3VwIik7CisgICAgICAgICAgICBncm91cF9lbGVtLnNldEF0dHJpYnV0ZSgiaWQiLCBjdXJyX2dyb3VwLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoY3Vycl9ncm91cC5nZXRDb21tZW50KCkgIT0gbnVsbCAmJiBjdXJyX2dyb3VwLmdldENvbW1lbnQoKS5sZW5ndGgoKSA+IDEpIHsKKyAgICAJICAgICAgICBFbGVtZW50IGNvbW1lbnRfcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJub3RlIik7CisgICAgCSAgICAgICAgY29tbWVudF9wcm9wLnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwicHJlc2VydmUiKTsKKyAgICAJICAgICAgICBjb21tZW50X3Byb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKGN1cnJfZ3JvdXAuZ2V0Q29tbWVudCgpKSk7CisgICAgCSAgICAgICAgZ3JvdXBfZWxlbS5hcHBlbmRDaGlsZChjb21tZW50X3Byb3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBWZWN0b3IgZ3JvdXBfaXRlbXMgPSBjdXJyX2dyb3VwLmdldEl0ZW1zQXNWZWN0b3IoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGdyb3VwX2l0ZW1zLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAJQnVuZGxlSXRlbSBtYWluX2l0ZW0gPSAoQnVuZGxlSXRlbSlncm91cF9pdGVtcy5nZXQoaik7CisgICAgICAgICAgICAJQnVuZGxlSXRlbSBwYXJlbnRfaXRlbSA9IG51bGw7CisgICAgICAgICAgICAJaWYgKHBhcmVudF9ncm91cCAhPSBudWxsKSB7CisJICAgICAgICAgICAgCUVudW1lcmF0aW9uIHBhcmVudEl0ZXIgPSBwYXJlbnRfZ3JvdXAuZ2V0SXRlbXNBc1ZlY3RvcigpLmVsZW1lbnRzKCk7CisJICAgICAgICAgICAgCUJ1bmRsZUl0ZW0gaXRlbVRvRmluZCA9IG51bGw7CisJICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRJdGVyLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgICAgICAgICAgICAgIAlpdGVtVG9GaW5kID0gKEJ1bmRsZUl0ZW0pcGFyZW50SXRlci5uZXh0RWxlbWVudCgpOworCSAgICAgICAgICAgICAgICAJaWYgKGl0ZW1Ub0ZpbmQuZ2V0S2V5KCkuZXF1YWxzKG1haW5faXRlbS5nZXRLZXkoKSkpIHsKKwkgICAgICAgICAgICAgICAgCQlwYXJlbnRfaXRlbSA9IGl0ZW1Ub0ZpbmQ7CisJICAgICAgICAgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAgICAgICAgIAl9CisJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYWRkVHJhbnNVbml0KHhtbCwgZ3JvdXBfZWxlbSwgbWFpbl9pdGVtLCBwYXJlbnRfaXRlbSk7CisgICAgICAgICAgICAgICAgLy9ncm91cF9lbGVtLmFwcGVuZENoaWxkKHR1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoZ3JvdXBfZWxlbSk7CisgICAgICAgIH0gLy8gZW5kIGZvciAtIGkKKyAgICAgICAgU3RyaW5nIHN1ZmZpeCA9IG1haW5Mb2NhbGU7CisgICAgICAgIGlmICghc3VmZml4LmVxdWFscygiIikpIHsKKyAgICAgICAgCXN1ZmZpeCA9ICdfJyArIHN1ZmZpeDsKKyAgICAgICAgfQorICAgICAgICBjaGFyIGFycmF5W10gPSBzdWZmaXgudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaz0wOyBrIDwgYXJyYXkubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChhcnJheVtrXSA9PSAnLScpCisgICAgICAgICAgICAgICAgYXJyYXlba10gPSAnXyc7CisgICAgICAgIH0KKyAgICAgICAgc3VmZml4ID0gU3RyaW5nLnZhbHVlT2YoYXJyYXkpOworICAgICAgICAKKyAgICAgICAgLy8gc2VyaWFsaXplIGRvY3VtZW50CisgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorICAgICAgICAJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGRpcmVjdG9yeSwgYmFzZV9uYW1lICsgc3VmZml4ICsgIi54bGYiKSksICJVVEYtOCIpOworICAgICAgICB0cnkgeworCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1NZU1RFTSwgWExJRkZfRFREKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIFhMSUZGX1BVQkxJQ19OQU1FKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOworCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoeG1sKSwgbmV3IFN0cmVhbVJlc3VsdChvc3cpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgCXRocm93IG5ldyBJT0V4Y2VwdGlvbih0ZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvc3cuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJ4bGlmZkltcG9ydGVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJ4bGlmZkltcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlYzQzMAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQnhsaWZmSW1wb3J0ZXIuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworCitpbXBvcnQgY29tLmlibS5yYm0uZ3VpLlJCTWFuYWdlckdVSTsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKKy8qKgorICogVGhpcyBpbXBvcnRzIFhMSUZGIGZpbGVzIGludG8gUkJNYW5hZ2VyLgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisgKiA8YSBocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMveGxpZmYvZG9jdW1lbnRzL3hsaWZmLXNwZWNpZmljYXRpb24uaHRtIj4KKyAqIGh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy94bGlmZi9kb2N1bWVudHMveGxpZmYtc3BlY2lmaWNhdGlvbi5odG08L2E+CisgKiAKKyAqIEBhdXRob3IgR2VvcmdlIFJob3RlbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCeGxpZmZJbXBvcnRlciBleHRlbmRzIFJCSW1wb3J0ZXIgeworCQorICAgIERvY3VtZW50IHhsZl94bWwgPSBudWxsOworCisgICAgLyoqCisgICAgICogQmFzaWMgY29uc3RydWN0b3IgZm9yIHRoZSBYTElGRiBpbXBvcnRlciBmcm9tIHRoZSBwYXJlbnQgUkJNYW5hZ2VyIGRhdGEgYW5kIGEgRGlhbG9nIHRpdGxlLgorICAgICAqLworICAgIHB1YmxpYyBSQnhsaWZmSW1wb3J0ZXIoU3RyaW5nIHRpdGxlLCBSQk1hbmFnZXIgcmJtLCBSQk1hbmFnZXJHVUkgZ3VpKSB7CisgICAgICAgIHN1cGVyKHRpdGxlLCByYm0sIGd1aSk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHNldHVwRmlsZUNob29zZXIoKSB7CisgICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworICAgICAgICAgICAgICAgIHJldHVybiAoZi5pc0RpcmVjdG9yeSgpIHx8IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueGxmIikpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X1hMRl9maWxlX2Rlc2NyaXB0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBiZWdpbkltcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmJlZ2luSW1wb3J0KCk7CisgICAgICAgIEZpbGUgeGxmX2ZpbGUgPSBnZXRDaG9zZW5GaWxlKCk7CisJCQorICAgICAgICB0cnkgeworICAgICAgICAJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oeGxmX2ZpbGUpOworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoZmlzKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgeGxmX3htbCA9IGJ1aWxkZXIucGFyc2UoaXMpOworICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7CisgICAgICAgICAgICBwY2UucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICAJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh4bGZfeG1sID09IG51bGwpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIAorICAgICAgICBpbXBvcnREb2MoKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBpbXBvcnREb2MoKSB7CisgICAgICAgIGlmICh4bGZfeG1sID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9ICIiOworICAgICAgICBTdHJpbmcgYnVuZGxlX25vdGUgPSBudWxsOworICAgIAlTdHJpbmcgYnVuZGxlX25hbWUgPSBudWxsOworICAgIAlTdHJpbmcgbWFuYWdlcl9uYW1lID0gbnVsbDsKKyAgICAJU3RyaW5nIGxhbmd1YWdlX25hbWUgPSBudWxsOworICAgIAlTdHJpbmcgY291bnRyeV9uYW1lID0gbnVsbDsKKyAgICAJU3RyaW5nIHZhcmlhbnRfbmFtZSA9IG51bGw7CisgICAgICAgIAorICAgICAgICBFbGVtZW50IHJvb3QgPSB4bGZfeG1sLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICBOb2RlIGZpbGVOb2RlID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIE5vZGUgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgTm9kZSBub2RlID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKGZpbGVOb2RlICE9IG51bGwgJiYgIShmaWxlTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZmlsZU5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikpKSB7CisgICAgICAgICAgICBmaWxlTm9kZSA9IGZpbGVOb2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyID0gZmlsZU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICB3aGlsZSAoaGVhZGVyICE9IG51bGwKKyAgICAgICAgCQkmJiAhKGhlYWRlci5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFCisgICAgICAgIAkJJiYgKGhlYWRlci5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImhlYWRlciIpCisJCQkJfHwgaGVhZGVyLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYm9keSIpKSkpCisgICAgICAgIHsKKyAgICAgICAgCWhlYWRlciA9IGhlYWRlci5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJoZWFkZXIiKSkgeworICAgICAgICAJLy8gR2V0IHRoZSBub3RlcyBpZiBmcm9tIHRoZSBoZWFkZXIgaWYgdGhleSBleGlzdC4KKyAgICAgICAgICAgIE5vZGVMaXN0IGhlYWRlcl9ub3RlX2xpc3QgPSAoKEVsZW1lbnQpaGVhZGVyKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibm90ZSIpOworICAgICAgICAgICAgaWYgKGhlYWRlcl9ub3RlX2xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisJICAgICAgICAgICAgVGV4dCB0ZXh0X2VsZW0gPSAoVGV4dCloZWFkZXJfbm90ZV9saXN0Lml0ZW0oMCkuZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCk7CisJICAgICAgICAgICAgaWYgKHRleHRfZWxlbSAhPSBudWxsKSB7CisJCSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHRleHRfZWxlbS5nZXROb2RlVmFsdWUoKTsKKwkJICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7CisJCSAgICAgICAgICAgIAlidW5kbGVfbm90ZSA9IHZhbHVlOworCQkgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9kZSBwcm9wX2dyb3VwX2xpc3QgPSAoKEVsZW1lbnQpaGVhZGVyKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcC1ncm91cCIpLml0ZW0oMCk7CisgICAgICAgICAgICBOb2RlTGlzdCBwcm9wX2xpc3QgPSBwcm9wX2dyb3VwX2xpc3QuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAJaW50IHByb3BlcnR5TnVtID0gcHJvcF9saXN0LmdldExlbmd0aCgpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5TnVtID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHByb3AgPSAwOyBwcm9wIDwgcHJvcGVydHlOdW07IHByb3ArKykgeworICAgICAgICAgICAgICAgIAlpZiAocHJvcF9saXN0Lml0ZW0ocHJvcCkgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisgICAgCSAgICAgICAgICAgIAlFbGVtZW50IHByb3BlcnR5X2VsZW0gPSAoRWxlbWVudClwcm9wX2xpc3QuaXRlbShwcm9wKTsKKyAgICAJICAgICAgICAgICAgCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eV9lbGVtLmdldEF0dHJpYnV0ZSgicHJvcC10eXBlIik7CisgICAgCSAgICAgICAgICAgIAlpZiAocHJvcGVydHlUeXBlICE9IG51bGwpIHsKKyAgICAJCQkgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eV9lbGVtLmdldENoaWxkTm9kZXMoKS5pdGVtKDApLmdldE5vZGVWYWx1ZSgpOworICAgIAkJCSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgeworICAgIAkJCSAgICAgICAgICAgIAlpZiAocHJvcGVydHlUeXBlLmVxdWFscygibmFtZSIpKSB7CisgICAgCQkJCSAgICAgICAgICAgIAlidW5kbGVfbmFtZSA9IHZhbHVlOworICAgIAkJCSAgICAgICAgICAgIAl9CisgICAgCQkJICAgICAgICAgICAgCWVsc2UgaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoIm1hbmFnZXIiKSkgeworICAgIAkJCQkgICAgICAgICAgICAJbWFuYWdlcl9uYW1lID0gdmFsdWU7CisgICAgCQkJICAgICAgICAgICAgCX0KKyAgICAJCQkgICAgICAgICAgICAJZWxzZSBpZiAocHJvcGVydHlUeXBlLmVxdWFscygibGFuZ3VhZ2UiKSkgeworICAgIAkJCQkgICAgICAgICAgICAJbGFuZ3VhZ2VfbmFtZSA9IHZhbHVlOworICAgIAkJCSAgICAgICAgICAgIAl9CisgICAgCQkJICAgICAgICAgICAgCWVsc2UgaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoImNvdW50cnkiKSkgeworICAgIAkJCSAgICAgICAgICAgIAkJY291bnRyeV9uYW1lID0gdmFsdWU7CisgICAgCQkJICAgICAgICAgICAgCX0KKyAgICAJCQkgICAgICAgICAgICAJZWxzZSBpZiAocHJvcGVydHlUeXBlLmVxdWFscygidmFyaWFudCIpKSB7CisgICAgCQkJICAgICAgICAgICAgCQl2YXJpYW50X25hbWUgPSB2YWx1ZTsKKyAgICAJCQkgICAgICAgICAgICAJfQorICAgIAkJCSAgICAgICAgICAgIH0KKyAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBub2RlID0gaGVhZGVyLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYm9keSIpKSkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgRWxlbWVudCBib2R5ID0gKEVsZW1lbnQpbm9kZTsKKyAgICAgICAgLy9yZXNvbHZlRW5jb2RpbmdzKGdldEVuY29kaW5nc1ZlY3Rvcihib2R5KSk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc291cmNlTG9jYWxlID0gKChFbGVtZW50KWZpbGVOb2RlKS5nZXRBdHRyaWJ1dGUoInNvdXJjZS1sYW5ndWFnZSIpOworICAgICAgICBTdHJpbmcgdGFyZ2V0TG9jYWxlID0gKChFbGVtZW50KWZpbGVOb2RlKS5nZXRBdHRyaWJ1dGUoInRhcmdldC1sYW5ndWFnZSIpOworICAgICAgICBpZiAoIXNvdXJjZUxvY2FsZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBsYW5ndWFnZSA9IHNvdXJjZUxvY2FsZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXRhcmdldExvY2FsZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGxhbmd1YWdlIGlzIHRoZSByZWFsIGRhdGEuIFRoZSBzb3VyY2UgaXMgb25seSBmb3IgcmVmZXJlbmNlLgorICAgICAgICAgICAgLy8gV2UgY291bGQgZG8gdmVyaWZpY2F0aW9uIHRoYXQgYWxsIHRoZSBkYXRhIGlzIHRyYW5zbGF0ZWQgdGhlIHNhbWUgdGhvdWdoLgorICAgICAgICAgICAgbGFuZ3VhZ2UgPSB0YXJnZXRMb2NhbGU7CisgICAgICAgIH0KKwkJCisgICAgICAgIC8vIE5vdyBkbyB0aGUgYWN0dWFsIGltcG9ydCByZXNvdXJjZSBieSByZXNvdXJjZQorICAgICAgICBOb2RlTGlzdCB0dV9saXN0ID0gYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZ3JvdXAiKTsKKyAgICAgICAgaW50IGJvZHlfbm9kZXNfbGVuZ3RoID0gYm9keS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7CisgICAgICAgIE5vZGVMaXN0IGJvZHlfbGlzdCA9IGJvZHkuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBpbnQgZ3JvdXBDb3VudCA9IDAsIGVsZW1lbnRDb3VudCA9IDA7CisgICAgICAgIE5vZGUgbGFzdF9ncm91cF9ub2RlID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYm9keV9ub2Rlc19sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTm9kZSBib2R5X2VsZW0gPSBib2R5X2xpc3QuaXRlbShpKTsKKwkgICAgICAgIGlmIChib2R5X2VsZW0uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworCSAgICAgICAgICAgIGlmIChib2R5X2VsZW0uZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJncm91cCIpKSB7CisJCSAgICAgICAgICAgIGdyb3VwQ291bnQrKzsKKwkJICAgICAgICAgICAgbGFzdF9ncm91cF9ub2RlID0gYm9keV9lbGVtOworCQkgICAgICAgIH0KKwkgICAgICAgICAgICBlbGVtZW50Q291bnQrKzsKKwkgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudENvdW50ID09IDEgJiYgZ3JvdXBDb3VudCA9PSAxKSB7CisJICAgICAgICAvLyBJQ1Ugc3R5bGUgZ3JvdXAgd2hlcmUgdGhlIHRvcCBncm91cCBpcyBqdXN0IHRoZSBsb2NhbGUuCisJICAgICAgICBFbGVtZW50IGxvY2FsZU5vZGUgPSAoRWxlbWVudClsYXN0X2dyb3VwX25vZGU7IAorCSAgICAgICAgdHVfbGlzdCA9IGxhc3RfZ3JvdXBfbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICBTdHJpbmcgcm9vdEdyb3VwTmFtZSA9IGxvY2FsZU5vZGUuZ2V0QXR0cmlidXRlKCJpZCIpOworICAgICAgICAgICAgaWYgKHJvb3RHcm91cE5hbWUgIT0gbnVsbCAmJiByb290R3JvdXBOYW1lLmVxdWFscygicm9vdCIpKSB7CisgICAgICAgICAgICAgICAgcm9vdEdyb3VwTmFtZSA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSXQncyBkb25lIHRoaXMgd2F5IGJlY2F1c2UgSUNVIGhhbmRsZXMgcmZjMzA2NmJpcyAodGhlIHN1Y2Nlc3NvciBvZiByZmMzMDY2KQorICAgICAgICAgICAgLy8gWExJRkYgcmVxdWlyZXMgcmZjMzA2Niwgd2hpY2ggZG9lc24ndCBoYW5kbGUgc2NyaXB0cy4KKyAgICAgICAgICAgIGxhbmd1YWdlID0gcm9vdEdyb3VwTmFtZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQWRkIHRoZSBsb2NhbGUgaWYgbmVlZGVkLCBhbmQgbm9ybWFsaXplIGl0IHRvIHRoZSBjb3JyZWN0IGZvcm1hdC4KKyAgICAgICAgVmVjdG9yIGxvY2FsZU5hbWVzID0gbmV3IFZlY3RvcigpOworICAgICAgICBjaGFyIGFycmF5W10gPSBsYW5ndWFnZS50b0NoYXJBcnJheSgpOworICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBhcnJheS5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgaWYgKGFycmF5W2tdID09ICctJykKKyAgICAgICAgICAgICAgICBhcnJheVtrXSA9ICdfJzsKKyAgICAgICAgfQorICAgICAgICBsYW5ndWFnZSA9IFN0cmluZy52YWx1ZU9mKGFycmF5KTsKKyAgICAgICAgbG9jYWxlTmFtZXMuYWRkKGxhbmd1YWdlKTsKKyAgICAgICAgcmVzb2x2ZUVuY29kaW5ncyhsb2NhbGVOYW1lcyk7CisgICAgICAgIEJ1bmRsZSBtYWluX2J1bmRsZSA9IHJibS5nZXRCdW5kbGUobGFuZ3VhZ2UpOworCQltYWluX2J1bmRsZS5uYW1lID0gYnVuZGxlX25hbWU7CisJCW1haW5fYnVuZGxlLmNvbW1lbnQgPSBidW5kbGVfbm90ZTsKKwkJbWFpbl9idW5kbGUubWFuYWdlciA9IG1hbmFnZXJfbmFtZTsKKwkJbWFpbl9idW5kbGUubGFuZ3VhZ2UgPSBsYW5ndWFnZV9uYW1lOworCQltYWluX2J1bmRsZS5jb3VudHJ5ID0gY291bnRyeV9uYW1lOworCQltYWluX2J1bmRsZS52YXJpYW50ID0gdmFyaWFudF9uYW1lOworCisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHR1X2xpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCEodHVfbGlzdC5pdGVtKGkpIGluc3RhbmNlb2YgRWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVsZW1lbnQgdHVfZWxlbSA9IChFbGVtZW50KXR1X2xpc3QuaXRlbShpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gR2V0IHRoZSBrZXkgdmFsdWUKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHVfZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gR2V0IHRoZSBncm91cCBpZiBpdCBleGlzdHMKKyAgICAgICAgICAgIFN0cmluZyBncm91cCA9IG51bGw7CisgICAgICAgICAgICBpZiAodHVfZWxlbS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImdyb3VwIikpIHsKKyAgICAgICAgICAgICAgICBncm91cCA9IG5hbWU7CisgICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwQ29tbWVudCA9ICIiOworICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5vdGVzX2xpc3QgPSB0dV9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJub3RlIik7CisgICAgICAgICAgICAgICAgaWYgKG5vdGVzX2xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgCSAgICAgICAgICAgIFRleHQgdGV4dF9lbGVtID0gKFRleHQpbm90ZXNfbGlzdC5pdGVtKDApLmdldENoaWxkTm9kZXMoKS5pdGVtKDApOworICAgIAkgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCk7CisgICAgCSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgeworICAgIAkgICAgICAgICAgICAJZ3JvdXBDb21tZW50ID0gdmFsdWU7CisgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmJtLmNyZWF0ZUdyb3VwKGdyb3VwLCBncm91cENvbW1lbnQpOworICAgICAgICAgICAgICAgIC8vTm9kZUxpc3QgZ3JvdXBfbGlzdCA9IHR1X2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImdyb3VwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsIHx8IGdyb3VwLmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgICAgIGdyb3VwID0gZ2V0RGVmYXVsdEdyb3VwKCk7CisgICAgICAgICAgICAgICAgcGFyc2VUcmFuc2xhdGlvblVuaXQobGFuZ3VhZ2UsIGdyb3VwLCB0dV9lbGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTm9kZUxpc3QgdHJhbnNfdW5pdF9saXN0ID0gdHVfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHJhbnMtdW5pdCIpOworICAgICAgICAgICAgLy8gRm9yIGVhY2ggdHJhbnMtdW5pdCBlbGVtZW50CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCB0cmFuc191bml0X2xpc3QuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgIHBhcnNlVHJhbnNsYXRpb25Vbml0KGxhbmd1YWdlLCBncm91cCwgKEVsZW1lbnQpdHJhbnNfdW5pdF9saXN0Lml0ZW0oaikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlVHJhbnNsYXRpb25Vbml0KFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGdyb3VwLCBFbGVtZW50IHRyYW5zX3VuaXRfZWxlbSkgeworICAgICAgICAvLyBHZXQgdGhlIHRyYW5zbGF0aW9uIHZhbHVlCisgICAgCU5vZGUgdGFyZ2V0X2VsZW0gPSB0cmFuc191bml0X2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRhcmdldCIpLml0ZW0oMCk7CisgICAgICAgIGlmICh0YXJnZXRfZWxlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgdGVtcGxhdGUsIG9yIGEgc2tlbGV0b24KKyAgICAgICAgICAgIHRhcmdldF9lbGVtID0gdHJhbnNfdW5pdF9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5pdGVtKDApOworICAgICAgICB9CisgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc291cmNlIG9yIHRhcmdldCwgZXZlbiBpZiBlbXB0eSwgaXQgbXVzdCBiZSBwYXJzZWQuCisgICAgICAgIGlmICh0YXJnZXRfZWxlbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0YXJnZXRfZWxlbS5ub3JtYWxpemUoKTsKKyAgICAgICAgTm9kZUxpc3QgdGV4dF9saXN0ID0gdGFyZ2V0X2VsZW0uZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBpZiAodGV4dF9saXN0LmdldExlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgVGV4dCB0ZXh0X2VsZW0gPSAoVGV4dCl0ZXh0X2xpc3QuaXRlbSgwKTsKKyAgICAgICAgU3RyaW5nIHRyYW5zVmFsdWUgPSB0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgIGlmICh0cmFuc1ZhbHVlID09IG51bGwgfHwgdHJhbnNWYWx1ZS5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8qTmFtZWROb2RlTWFwIGF0dHJpYk1hcCA9IHRyYW5zX3VuaXRfZWxlbS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYXR0cmliTWFwLmdldExlbmd0aCgpOyBrKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyaWJNYXBOYW1lID0gYXR0cmliTWFwLml0ZW0oaykuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhdHRyaWJNYXBOYW1lKTsKKyAgICAgICAgfSovCisgICAgICAgIFN0cmluZyBuYW1lID0gdHJhbnNfdW5pdF9lbGVtLmdldEF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBidW5kbGUgaXRlbQorICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSBuZXcgQnVuZGxlSXRlbShudWxsLCBuYW1lLCB0cmFuc1ZhbHVlKTsKKyAgICAgICAgLy8gR2V0IGNyZWF0aW9uLCBtb2RpZmljYXRpb24gdmFsdWVzCisKKyAgICAgICAgU3RyaW5nIHN0YXRlID0gdHJhbnNfdW5pdF9lbGVtLmdldEF0dHJpYnV0ZSgic3RhdGUiKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwgJiYgc3RhdGUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpdGVtLnNldFRyYW5zbGF0ZWQoc3RhdGUuZXF1YWxzSWdub3JlQ2FzZSgidHJhbnNsYXRlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkYXRlID0gdHJhbnNfdW5pdF9lbGVtLmdldEF0dHJpYnV0ZSgiZGF0ZSIpOworICAgICAgICBpZiAoZGF0ZSAhPSBudWxsICYmIGRhdGUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpdGVtLnNldE1vZGlmaWVkRGF0ZShkYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEVsZW1lbnQgbm90ZV9lbGVtID0gKEVsZW1lbnQpdHJhbnNfdW5pdF9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJub3RlIikuaXRlbSgwKTsKKyAgICAgICAgaWYgKG5vdGVfZWxlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBOb2RlTGlzdCBub3RlX2xpc3QgPSBub3RlX2VsZW0uZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgaWYgKG5vdGVfbGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKKwkgICAgICAgICAgICBUZXh0IG5vdGVfdGV4dF9lbGVtID0gKFRleHQpbm90ZV9saXN0Lml0ZW0oMCk7CisJICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnQgPSBub3RlX3RleHRfZWxlbS5nZXROb2RlVmFsdWUoKTsKKwkgICAgICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKSB7CisJICAgICAgICAgICAgCWl0ZW0uc2V0Q29tbWVudChjb21tZW50KTsKKwkgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFbGVtZW50IHByb3BfZ3JvdXBfZWxlbSA9IChFbGVtZW50KXRyYW5zX3VuaXRfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcC1ncm91cCIpLml0ZW0oMCk7CisgICAgICAgIGlmIChwcm9wX2dyb3VwX2VsZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgTm9kZUxpc3QgcHJvcF9saXN0ID0gcHJvcF9ncm91cF9lbGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgCWludCBwcm9wZXJ0eUxlbiA9IHByb3BfbGlzdC5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHByb3AgPSAwOyBwcm9wIDwgcHJvcGVydHlMZW47IHByb3ArKykgeworICAgICAgICAgICAgCWlmIChwcm9wX2xpc3QuaXRlbShwcm9wKSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKwkgICAgICAgICAgICAJRWxlbWVudCBwcm9wZXJ0eV9lbGVtID0gKEVsZW1lbnQpcHJvcF9saXN0Lml0ZW0ocHJvcCk7CisJICAgICAgICAgICAgCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eV9lbGVtLmdldEF0dHJpYnV0ZSgicHJvcC10eXBlIik7CisJICAgICAgICAgICAgCWlmIChwcm9wZXJ0eVR5cGUgIT0gbnVsbCkgeworCQkJICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcGVydHlfZWxlbS5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKS5nZXROb2RlVmFsdWUoKTsKKwkJCSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgeworCQkJICAgICAgICAgICAgCWlmIChwcm9wZXJ0eVR5cGUuZXF1YWxzKCJjcmVhdG9yIikpIHsKKwkJCQkgICAgICAgICAgICAJaXRlbS5zZXRDcmVhdG9yKHZhbHVlKTsKKwkJCSAgICAgICAgICAgIAl9CisJCQkgICAgICAgICAgICAJZWxzZSBpZiAocHJvcGVydHlUeXBlLmVxdWFscygiY3JlYXRlZCIpKSB7CisJCQkJICAgICAgICAgICAgCWl0ZW0uc2V0Q3JlYXRlZERhdGUodmFsdWUpOworCQkJICAgICAgICAgICAgCX0KKwkJCSAgICAgICAgICAgIAllbHNlIGlmIChwcm9wZXJ0eVR5cGUuZXF1YWxzKCJtb2RpZmllciIpKSB7CisJCQkJICAgICAgICAgICAgCWl0ZW0uc2V0TW9kaWZpZXIodmFsdWUpOworCQkJICAgICAgICAgICAgCX0KKwkJCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisvLyAgICAgICAgaWYgKGxvb2t1cHMgIT0gbnVsbCkKKy8vICAgICAgICAgICAgaXRlbS5zZXRMb29rdXBzKGxvb2t1cHMpOworICAgICAgICBpbXBvcnRSZXNvdXJjZShpdGVtLCBsYW5ndWFnZSwgZ3JvdXApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SZXNvdXJjZXMuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SZXNvdXJjZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQ5NzZhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1Jlc291cmNlcy5qYXZhCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworCitpbXBvcnQgY29tLmlibS5yYm0uZ3VpLlJCTWFuYWdlckdVSTsKKworLyoqCisgKiBBIGNsYXNzIG5vdCB0byBiZSBpbnN0YW50aWF0ZWQuIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHRyYW5zbGF0aW5nIGl0ZW1zIGZyb20gYSByZXNvdXJjZSBidW5kbGUuIFRvIHVzZSB0aGlzIGNsYXNzCisgKiBtYWtlIHN1cmUgeW91IGZpcnN0IGNhbGwgaW5pdEJ1bmRsZSgpLiBPbmNlIHRoaXMgaXMgZG9uZSwgY2FsbGluZyBhbnkgb2YgdGhlIGdldFRyYW5zbGF0aW9uKCkgbWV0aG9kcyB3aWxsIHJldHVybgorICogdGhlIGFwcHJvcHJpYXRlIFN0cmluZy4KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZV9idW5kbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlIGxvY2FsZTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyByZXNvdXJjZSBidW5kbGUuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIGFueQorICAgICAqIG90aGVyIG1ldGhvZCBjYW4gYmUgY2FsbGVkICh1bmxlc3MgdGhhdCBtZXRob2QgcGVyZm9ybXMgYSBjaGVjayB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kKS4gVGhpcyBpcworICAgICAqIGFsc28gdGhlIG1ldGhvZCB0byB1c2UgaW4gY2FzZSB0aGUgcmVzb3VyY2UgZGF0YSBvbiB0aGUgZGF0YSBzdG9yZSBoYXMgY2hhbmdlZCBhbmQgdGhvc2UgY2hhbmdlcworICAgICAqIG5lZWQgdG8gYmUgcmVmbGVjdGVkIGluIGZ1dHVyZSB1c2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEJ1bmRsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCkgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgICAgIHJlc291cmNlX2J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlciIsIGxvY2FsZSk7CisgICAgICAgIH0gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNzaW5nIFJlc291cmNlIGZvciBkZWZhdWx0IGxvY2FsZSwgIiArIExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtcmUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYWxlIHRvIGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBxdWVyeSBvbiB0aGUgcmVzb3VyY2UKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgICAgICAgICBSZXNvdXJjZXMucmVzb3VyY2VfYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJjb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyIiwgbG9jYWxlKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNzaW5nIFJlc291cmNlIGZvciBsb2NhbGUsICIgKyBsb2NhbGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtcmUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNldCBMb2NhbGVzIG9iamVjdC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgICAgIGlmIChSZXNvdXJjZXMubG9jYWxlID09IG51bGwpIFJlc291cmNlcy5pbml0QnVuZGxlKCk7CisgICAgICAgIHJldHVybiBSZXNvdXJjZXMubG9jYWxlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbG9jYWxlIGVuY29kaW5nIChlLmcuICdlbl9VUycsICdkZScsIGV0Yy4pCisgICAgICogb2YgdGhlIGxvY2FsZXMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCByZXNvdXJjZSBidW5kbGUuIFRoZXNlIGFyZSBhbGwgb2YgdGhlIGxvY2FsZXMgZm9yCisgICAgICogd2hpY2ggdW5pcXVlIHRyYW5zbGF0aW9uIG9mIHJlc291cmNlIGJ1bmRsZSBpdGVtcyBhcmUgcG9zc2libGUuIElmIGEgbG9jYWxlIGVuY29kaW5nIGlzCisgICAgICogdXNlZCB0byBxdWVyeSBvbiB0aGF0IGlzIG5vdCBpbiB0aGlzIGFycmF5LCB0aGUgYmFzZSBjbGFzcyB0cmFuc2xhdGlvbiB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworCQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHsKKyAgICAgICAgLy9Mb2NhbGUgbG9jW10gPSBudWxsOworICAgICAgICBTdHJpbmcgbGlzdFtdID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgVmVjdG9yIGxvY1ZlY3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgcmVzVVJMID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UoImNvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXIucHJvcGVydGllcyIpOworICAgICAgICAgICAgSmFyVVJMQ29ubmVjdGlvbiByZXNDb25uZWN0aW9uID0gKEphclVSTENvbm5lY3Rpb24pcmVzVVJMLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtUmVzID0gcmVzQ29ubmVjdGlvbi5nZXRKYXJGaWxlKCkuZW50cmllcygpOworICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gImNvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXIiOworICAgICAgICAgICAgd2hpbGUgKGVudW1SZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gKChaaXBFbnRyeSllbnVtUmVzLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgoYmFzZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoYmFzZU5hbWUubGVuZ3RoKCksIGVudHJ5TmFtZS5sYXN0SW5kZXhPZignLicpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZS5zdGFydHNXaXRoKCJfIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnlOYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBvdXIgcmVzb3VyY2VzIHdlIGNvbnNpZGVyIHJvb3QgYXMgRW5nbGlzaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lID0gImVuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb2NWZWN0LmFkZChlbnRyeU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworLyogICAgICAgICAgICBGaWxlIGxvY0RpciA9IG5ldyBGaWxlKCJyZXNvdXJjZXMiKTsKKyAgICAgICAgICAgIGxpc3QgPSBsb2NEaXIubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFjY2VwdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKSBhY2NlcHQgPSBmYWxzZTsgLy8gTXVzdCBiZSBwcm9wZXJ0eSBmaWxlCisgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCJSQk1hbmFnZXIiKSkgYWNjZXB0ID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhIFJCTWFuYWdlciBmaWxlCisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiUkJNYW5hZ2VyLnByb3BlcnRpZXMiKSkgYWNjZXB0ID0gZmFsc2U7ICAgICAgICAgLy8gQmFzZSBjbGFzcyBkb2VzIG5vdCBjb3VudAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworKi8KKyAgICAgICAgICAgIGludCBsaXN0U2l6ZSA9IGxvY1ZlY3Quc2l6ZSgpOworICAgICAgICAgICAgbGlzdCA9IG5ldyBTdHJpbmdbbGlzdFNpemVdOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbGlzdFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGxpc3RbaV0gPSAoU3RyaW5nKWxvY1ZlY3QuZ2V0KGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FuJ3QgZ2V0IHJlc291cmNlcyIpOworICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBnZXQgcmVzb3VyY2VzIik7CisgICAgICAgICAgICBjY2UucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIHVwIGEgdHJhbnNsYXRpb24gaW4gdGhlIGN1cnJlbnRseSBzZXQgTG9jYWxlIGJ5IHRoZSBOTFMgbG9va3VwIGtleSBwcm92aWRlZC4KKyAgICAgKiBJZiBubyByZXNvdXJjZSBieSB0aGF0IGtleSBpcyBmb3VuZCwgdGhlIGtleSBpdHNlbGYgaXMgcmV0dXJuZWQuCisgICAgICovCisJCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJhbnNsYXRpb24oU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwgcmVzb3VyY2VfYnVuZGxlID09IG51bGwpIHJldHVybiAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyByZXRTdHIgPSByZXNvdXJjZV9idW5kbGUuZ2V0U3RyaW5nKGtleSk7CisgICAgICAgICAgICByZXR1cm4gcmV0U3RyOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGxvY2FsZSBlbmNvZGluZywgcmV0dXJucyB0aGUgbGFuZ3VhZ2UgcG9ydGlvbiBvZiB0aGF0IGVuY29kaW5nLgorICAgICAqPGJyPgorICAgICAqIEZvciBpbnN0YW5jZSAnZW4nLCAnZW5fVVMnLCAnZW5fR0InLCBhbGwgcmV0dXJuICdlbicKKyAgICAgKi8KKyAgICAgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGVuY29kaW5nLmluZGV4T2YoIl8iKSA8IDApIHJldHVybiBlbmNvZGluZy50cmltKCk7CisgICAgICAgIHJldHVybiBlbmNvZGluZy5zdWJzdHJpbmcoMCwgZW5jb2RpbmcuaW5kZXhPZigiXyIpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBsb2NhbGUgZW5jb2RpbmcsIHJldHVybnMgdGhlIGNvdW50cnkgcG9ydGlvbiBvZiB0aGF0IGVuY29kaW5nLgorICAgICAqIDxicj4KKyAgICAgKiBGb3IgaW5zdGFuY2UgJ2VuX1VTJywgJ3NwX1VTJywgYm90aCByZXR1cm4gJ1VTJworICAgICAqIDxicj4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gY291bnRyeSBpcyBzcGVjaWZpZWQgKGUuZy4gJ2VuJyBvciAnZGUnKQorICAgICAqLworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvdW50cnkoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGVuY29kaW5nLmluZGV4T2YoIl8iKSA8IDApIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZW5jb2Rpbmcuc3Vic3RyaW5nKGVuY29kaW5nLmluZGV4T2YoIl8iKSsxLCBlbmNvZGluZy5sZW5ndGgoKSk7CisgICAgICAgIGlmIChyZXN1bHQuaW5kZXhPZigiXyIpIDwgMCkgcmV0dXJuIHJlc3VsdC50cmltKCk7CisgICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDAsIGVuY29kaW5nLmluZGV4T2YoIl8iKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdpdmVuIGEgbG9jYWxlIGVuY29kaW5nLCByZXR1cm5zIHRoZSB2YXJpYW50IHBvcnRpb24gb2YgdGhhdCBlbmNvZGluZy4KKyAgICAgKiA8YnI+CisgICAgICogRm9yIGluc3RhbmNlICdlbl9HQl9FVVJPJywgJ2RlX0RFX0VVUk8nLCBib3RoIHJldHVybiAnRVVSTycKKyAgICAgKiA8YnI+CisgICAgICogUmV0dXJucyBudWxsIGlmIG5vIHZhcmlhbnQgaXMgc3BlY2lmaWVkIChlLmcuICdlbicgb3IgJ2VuX1VTJykKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWYXJpYW50KFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coZW5jb2RpbmcpOworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChlbmNvZGluZy5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGVuY29kaW5nLnN1YnN0cmluZyhlbmNvZGluZy5pbmRleE9mKCJfIikrMSwgZW5jb2RpbmcubGVuZ3RoKCkpOworICAgICAgICBpZiAocmVzdWx0LmluZGV4T2YoIl8iKSA8IDApIHJldHVybiBudWxsOworICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKHJlc3VsdC5pbmRleE9mKCJfIikrMSwgcmVzdWx0Lmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50cmltKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIHRyYW5zbGF0aW9uIGdpdmVuIHRoZSBjdXJyZW50bHkgc2V0IGxvY2FsZSwgYSBsb29rdXAga2V5LCBhbmQgYSBzaW5nbGUgbG9va3VwIGl0ZW0gcmVwbGFjZW1lbnQuCisgICAgICogRm9yIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGxvb2t1cCBpdGVtIHJlcGxhY2VtZW50IHNlZSBnZXRUcmFuc2xhdGlvbihTdHJpbmcga2V5LCBTdHJpbmdbXSBsb29rdXApLgorICAgICAqLworCQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyYW5zbGF0aW9uKFN0cmluZyBrZXksIFN0cmluZyBsb29rdXApIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IHJlc291cmNlX2J1bmRsZSA9PSBudWxsKSByZXR1cm4gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0c1tdID0ge2xvb2t1cH07CisgICAgICAgICAgICBTdHJpbmcgcmV0U3RyID0gcmVzb3VyY2VfYnVuZGxlLmdldFN0cmluZyhrZXkpOworICAgICAgICAgICAgcmV0U3RyID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmV0U3RyLCBvYmplY3RzKTsKKyAgICAgICAgICAgIHJldHVybiByZXRTdHI7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgYSB0cmFuc2xhdGlvbiBnaXZlbiB0aGUgY3VycmVudGx5IHNldCBsb2NhbGUsIGEgbG9va3VwIGtleSwgYW5kIHplcm8gb3IgbW9yZSBsb29rdXAgaXRlbSByZXBsYWNlbWVudHMuCisgICAgICogTG9va3VwIGl0ZW1zIGFyZSBjb250ZXh0dWFsIHRyYW5zbGF0aW9uIG1hdGVyaWFsIHN0b3JlZCBpbiB0aGUgcmVzb3VyY2UgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgZGljdGF0ZWQgaW4KKyAgICAgKiB0aGUgamF2YS50ZXh0IHBhY2thZ2UuIEluIHNob3J0LCBudW1iZXJlZCBtYXJrZXJzIGFyZSByZXBsYWNlZCBieSBzdHJpbmdzIHBhc3NlZCBpbiBhcyBwYXJhbWV0ZXJzLgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2U6CisgICAgICogPHA+CisgICAgICogbXlSZXNvdXJjZSA9IEhlbGxvIHsxfSwgSXNuJ3QgdGhpcyBhIGdyZWF0IHsyfT8KKyAgICAgKiA8cD4KKyAgICAgKiBZb3Ugd2FudCB0byByZXBsYWNlIHRoZSAnezF9JyB3aXRodCB0aGUgY3VycmVudCB1c2VyIG5hbWUgYW5kIHRoZSAnezJ9JyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBkYXkgdG9kYXkuCisgICAgICogWW91IGNhbiBkbyB0aGlzIGJ5IGNhbGxpbmc6CisgICAgICogPHA+CisgICAgICogU3RyaW5nIGxvb2t1cHNbXSA9IHsgIkpvZSIsICJGcmlkYXkiIH07CisgICAgICogPGJyPgorICAgICAqIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibXlSZXNvdXJjZSIsIGxvb2t1cHMpOworICAgICAqIDxwPgorICAgICAqIFRoZSByZXN1bHQgd291bGQgYmU6CisgICAgICogPHA+CisgICAgICogJ0hlbGxvIEpvZSwgSXNuJ3QgdGhpcyBhIGdyZWF0IEZyaWRheT8nCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgKGFzIHdlbGwgYXMgdGhlIGdldFRyYW5zbGF0aW9uKFN0cmluZyBrZXksIFN0cmluZyBsb29rdXApIG1ldGhvZCkgaXMgdXNlZnVsIGZvciB1c2luZyBuZXN0ZWQKKyAgICAgKiBsb29rdXBzIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4gRm9yIGluc3RhbmNlLCB0aGUgYWJvdmUgbGluZSBjb3VsZCBiZSByZXBsYWNlZCB3aXRoOgorICAgICAqIDxwPgorICAgICAqIFN0cmluZyBsb29rdXBzW10gPSB7IGdldFVzZXJOYW1lKCksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiRnJpZGF5IikgfTsKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUcmFuc2xhdGlvbihTdHJpbmcga2V5LCBTdHJpbmdbXSBsb29rdXApIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IHJlc291cmNlX2J1bmRsZSA9PSBudWxsKSByZXR1cm4gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0c1tdID0gbmV3IE9iamVjdFtsb29rdXAubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykgb2JqZWN0c1tpXSA9IGxvb2t1cFtpXTsKKyAgICAgICAgICAgIFN0cmluZyByZXRTdHIgPSByZXNvdXJjZV9idW5kbGUuZ2V0U3RyaW5nKGtleSk7CisgICAgICAgICAgICByZXRTdHIgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXRTdHIsIGxvb2t1cCk7CisgICAgICAgICAgICByZXR1cm4gcmV0U3RyOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vU2NhblJlc3VsdC5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1NjYW5SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEyYzAxCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1NjYW5SZXN1bHQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgcmVzdWx0cyBmb3VuZCBmb3IgZWFjaCByZXNvdXJjZSBrZXkgd2hpbGUKKyAqIHBlcmZvcm1pbmcgdGhlIGNvZGUgc2NhbiBkb25lIGJ5IFJCUmVwb3J0ZXIuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQlJlcG9ydGVyCisgKi8KK3B1YmxpYyBjbGFzcyBTY2FuUmVzdWx0IHsKKyAgICBCdW5kbGVJdGVtIGl0ZW07CisgICAgVmVjdG9yIG9jY3VyYW5jZXM7CisgICAgCisgICAgU2NhblJlc3VsdChCdW5kbGVJdGVtIGl0ZW0pIHsKKyAgICAgICAgdGhpcy5pdGVtID0gaXRlbTsKKyAgICAgICAgb2NjdXJhbmNlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisJCisgICAgQnVuZGxlSXRlbSBnZXRJdGVtKCkgeworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisJCisgICAgaW50IGdldE51bWJlck9jY3VyYW5jZXMoKSB7CisgICAgICAgIHJldHVybiBvY2N1cmFuY2VzLnNpemUoKTsKKyAgICB9CisJCisgICAgVmVjdG9yIGdldE9jY3VyYW5jZXMoKSB7CisgICAgICAgIHJldHVybiBvY2N1cmFuY2VzOworICAgIH0KKwkKKyAgICB2b2lkIGFkZE9jY3VyYW5jZShPY2N1cmFuY2UgbykgeworICAgICAgICBvY2N1cmFuY2VzLmFkZEVsZW1lbnQobyk7CisgICAgfQorCQorICAgIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gaXRlbS5nZXRLZXkoKTsKKyAgICB9CisJCisgICAgU3RyaW5nIGdldEdyb3VwTmFtZSgpIHsKKyAgICAgICAgaWYgKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSAhPSBudWxsKSByZXR1cm4gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuICJVbmtub3duIjsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NvbXBpbGUuYmF0IGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NvbXBpbGUuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg1MTJkNTYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vY29tcGlsZS5iYXQKQEAgLTAsMCArMSwyNiBAQAorQGVjaG8gb2ZmCisKK3JlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorcmVtICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCityZW0gKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3JlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitjZCAuLlwuLlwuLlwKK2VjaG8gY29tcGlsaW5nIHNvdXJjZSBjb2RlICUxCitqYXZhYyAtZCAuIC1jbGFzc3BhdGggY29tL2libS9yYm0vbGliL3hlcmNlcy5qYXIgLWRlcHJlY2F0aW9uICUxIGNvbS9pYm0vcmJtLyouamF2YSBjb20vaWJtL3JibS9ndWkvKi5qYXZhCitpZiBlcnJvcmxldmVsIDEgZ290byBlcnJvcgorCitlY2hvIGNyZWF0aW5nIGphciBmaWxlCitlcmFzZSBjb21caWJtXHJibVxSQk1hbmFnZXIuamFyCitqYXIgY2ZtIGNvbS9pYm0vcmJtL1JCTWFuYWdlci5qYXIgY29tL2libS9yYm0vbWFuaWZlc3Quc3R1YiBjb20vaWJtL3JibS8qLmNsYXNzIGNvbS9pYm0vcmJtL2d1aS8qLmNsYXNzIGNvbS9pYm0vcmJtL2d1aS9pbWFnZXMvKi5naWYgY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlcioucHJvcGVydGllcworaWYgZXJyb3JsZXZlbCAxIGdvdG8gZXJyb3IKKworZWNobyBjbGVhbmluZyB1cCBjbGFzcyBmaWxlcworY2QgY29tXGlibVxyYm0KK2VyYXNlICouY2xhc3MgZ3VpXCouY2xhc3MKK2dvdG8gZW5kCisKKzplcnJvcgorY2QgY29tXGlibVxyYm0KK3BhdXNlCis6ZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NvbXBpbGUuc2ggYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vY29tcGlsZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNmE4Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NvbXBpbGUuc2gKQEAgLTAsMCArMSwxOSBAQAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorIyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitjZCAuLi8uLi8uLi8KK2VjaG8gY29tcGlsaW5nIHNvdXJjZSBjb2RlICQxCitqYXZhYyAtZCAuIC1jbGFzc3BhdGggY29tL2libS9yYm0vbGliL3hlcmNlcy5qYXIgLWRlcHJlY2F0aW9uICQxIGNvbS9pYm0vcmJtLyouamF2YSBjb20vaWJtL3JibS9ndWkvKi5qYXZhCisjaWYgZXJyb3JsZXZlbCAxIGdvdG8gZXJyb3IKKworZWNobyBjcmVhdGluZyBqYXIgZmlsZQorcm0gY29tL2libS9yYm0vUkJNYW5hZ2VyLmphcgoramFyIGNmbSBjb20vaWJtL3JibS9SQk1hbmFnZXIuamFyIGNvbS9pYm0vcmJtL21hbmlmZXN0LnN0dWIgY29tL2libS9yYm0vKi5jbGFzcyBjb20vaWJtL3JibS9ndWkvKi5jbGFzcyBjb20vaWJtL3JibS9ndWkvaW1hZ2VzLyouZ2lmIGNvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXIqLnByb3BlcnRpZXMKKyNpZiBlcnJvcmxldmVsIDEgZ290byBlcnJvcgorCitlY2hvIGNsZWFuaW5nIHVwIGNsYXNzIGZpbGVzCitjZCBjb20vaWJtL3JibQorcm0gLXJmICouY2xhc3MgZ3VpLyouY2xhc3MKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NyZWF0ZWRvYy5iYXQgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vY3JlYXRlZG9jLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NGEzY2RiCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NyZWF0ZWRvYy5iYXQKQEAgLTAsMCArMSw4IEBACitAcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAcmVtICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCitAcmVtICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitAcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitta2RpciBkb2NzXGFwaQorQHNldCBET0NfVFlQRT0tcHJpdmF0ZQoramF2YWRvYyAtZCBkb2NzL2FwaSAtY2xhc3NwYXRoIGxpYi94ZXJjZXMuamFyIC1zb3VyY2VwYXRoIC4uLy4uLy4uLyAtd2luZG93VGl0bGUgIlJCTWFuYWdlciIgLWJvdHRvbSAiQ29weXJpZ2h0IElCTSAyMDAwLTIwMDQiICVET0NfVFlQRSUgY29tLmlibS5yYm0gY29tLmlibS5yYm0uZ3VpCitAaWYgZXJyb3JsZXZlbCAxIHBhdXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvUkJSZXBvcnRlci5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvUkJSZXBvcnRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTYyNDMKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9SQlJlcG9ydGVyLmh0bWwKQEAgLTAsMCArMSwyMDUgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UmVzb3VyY2UgQnVuZGxlIFJlcG9ydGVyPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6ICB1cmwoaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Imxvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Im1lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0idHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InNjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMSBBTElHTj0iQ0VOVEVSIj5SZXNvdXJjZSBCdW5kbGUgUmVwb3J0ZXI8L0gxPgorICAgICAgPEgxIEFMSUdOPSJDRU5URVIiPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvUkJSZXBvcnRlci5naWYiIFdJRFRIPSI2MDAiIEhFSUdIVD0iNjAwIj48L0gxPgorICAgICAgPEg0IEFMSUdOPSJMRUZUIj5XaGF0IGlzIFJCUmVwb3J0ZXI/PC9IND4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5GcmVxdWVudGx5LCBtYW5hZ2VycyBhbmQgZGV2ZWxvcGVycyB3b3JraW5nIG9uIGFuIGluZXJuYXRpb25hbGl6ZWQgCisgICAgICAgIHByb2R1Y3QgcmVxdWVzdCB0aGUgYWJpbGl0eSB0byBxdWlja2x5IHZpZXcgdGhlIHN0YXR1cyBhbmQgcHJvZ3Jlc3Mgb2YgCisgICAgICAgIHRoZSB0cmFuc2xhdGlvbiBlZmZvcnRzIGluIHRoZWlyIHByb2plY3QuIFJCUmVwb3J0ZXIgZ2VuZXJhdGVzIHN1Y2ggcmVwb3J0cyAKKyAgICAgICAgb24gYSBwZXJpb2RpYyBiYXNpcyBhbmQgc3RvcmVzIHRoZW0gdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gYSB2YXJpZXR5IAorICAgICAgICBvZiBmb3JtYXRzLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gdGhlIHJlcG9ydHMgaW5jbHVkZXMgdGhlIG5hbWVzIAorICAgICAgICBhbmQgbWV0YSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9mIHRoZSByZXNvdXJjZSBmaWxlcywgdGhlIG51bWJlciBvciAKKyAgICAgICAgcmVzb3VyY2VzIGhlbGQgaW4gZWFjaCBmaWxlLCB0aGUgbnVtYmVyIG9mIHVudHJhbnNsYXRlZCByZXNvdXJjZXMgaW4gZWFjaCAKKyAgICAgICAgZmlsZSwgYW5kLCBpZiB0aGUgZGV0YWlsIGxldmVsIGlzIHNldCB0byAnSGlnaCwnIGEgbGlzdCBvZiBhbGwgb2YgdGhlIAorICAgICAgICB1bnRyYW5zbGF0ZWQgcmVzb3VyY2Uga2V5cyBmb3IgZWFjaCBmaWxlLjwvUD4KKyAgICAgIDxINCBBTElHTj0iTEVGVCI+SG93IGlzIFJCUmVwb3J0ZXIgc3RhcnRlZD88L0g0PgorICAgICAgPFAgQUxJR049IkxFRlQiPkZyb20gdGhlIGNvbW1hbmQgbGluZSwgUkJSZXBvcnRlciBpcyBydW4gYnkgdHlwaW5nIGluIHRoZSAKKyAgICAgICAgZm9sbG93aW5nIGNvbW1hbmQ6PC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPjxDT0RFPmphdmEgY29tLmlibS5yYm0uUkJSZXBvcnRlcjwvQ09ERT48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhpcyB3aWxsIGJyaW5nIHVwIHRoZSB3aW5kb3cgc2VlbiBhYm92ZS4gQWx0ZXJuYXRpdmVseSwgCisgICAgICAgIFdpbmRvd3MgdXNlcnMgY2FuIHJ1biB0aGUgYmF0Y2ggZmlsZSBSQlJlcG9ydGVyLmJhdC4gUkJSZXBvcnRlciB3aWxsIGFsc28gCisgICAgICAgIHRha2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0aGF0IHdpbGwgcnVuIHRoZSBwcm9ncmFtIGluIGEgdmFyaWV0eSBvZiAKKyAgICAgICAgbW9kZXMuIEFuIGVxdWl2YWxlbnQgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIHRoZSBvbmUgYWJvdmUgaXM6PC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPjxDT0RFPmphdmEgY29tLmlibS5yYm0uUkJSZXBvcnRlciAtZ3VpPC9DT0RFPjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5UaGlzIGFyZ3VtZW50IHdvcmtzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCwgYnJpbmdpbmcgdXAgdGhlIAorICAgICAgICBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UuIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgcHJvcGVydGllcyBvZiAKKyAgICAgICAgdGhlIHJlcG9ydGVyLCBzdWNoIGFzIHRoZSBidW5kbGUgdG8gcmVwb3J0IG9uLCB0aGUgdHlwZXMgb2YgcmVwb3J0cyBnZW5lcmF0ZWQsIAorICAgICAgICBhbmQgdGhlIGludGVydmFsIGJldHdlZW4gcmVwb3J0IGdlbmVyYXRpb24uPC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPkFub3RoZXIgb3B0aW9uIGlzIHRvIHJ1biB0aGUgcmVwb3J0ZXIgd2l0aCB0aGUgZm9sbG93aW5nIAorICAgICAgICBhcmd1bWVudDo8L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+PENPREU+amF2YSBjb20uaWJtLnJibS5SQlJlcG9ydGVyIC1ub3c8L0NPREU+PC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPldoZW4gdGhlIC1ub3cgb3B0aW9uIGlzIHVzZWQsIHRoZSBpbnRlcnZhbCBzZXR0aW5nIGJldHdlZW4gCisgICAgICAgIHJlcG9ydHMgaXMgaWdub3JlZCwgYW5kIHRoZSByZXBvcnRzIGFyZSBnZW5lcmF0ZWQgaW1tZWRpYXRlbHkgYWNjb3JkaW5nIAorICAgICAgICB0byB0aGUgb3RoZXIgc2F2ZWQgc2V0dGluZ3MuIFRoaXMgb3B0aW9uIGRvZXMgbm90IGJyaW5nIHVwIHRoZSB3aW5kb3cgCisgICAgICAgIGZvciBjaGFuZ2luZyBzZXR0aW5ncy4gVXNpbmcgdGhpcyBvcHRpb24gaXMgaGVscGZ1bCBpZiB5b3Ugd291bGQgbGlrZSAKKyAgICAgICAgdG8gdXNlIHlvdSBvcGVyYXRpbmcgc3lzdGVtIGluc3RlYWQgb2YgUkJSZXBvcnRlciB0byBzY2hlZHVsZSB0aGUgZ2VuZXJhdGlvbiAKKyAgICAgICAgb2YgcmVwb3J0cy48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhlIGxhc3Qgb3B0aW9uIGlzIHRoZSBmb2xsb3dpbmc6PC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPjxjb2RlPmphdmEgY29tLmlibS5yYm0uUkJSZXBvcnRlciAtbGluZTwvQ09ERT48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+V2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCB0aGUgcmVwb3J0ZXIgaXMgcnVuIHRocm91Z2ggdGhlIAorICAgICAgICBjb21tYW5kIGxpbmUgb25seS4gTm9uZSBvZiB0aGUgc2V0dGluZ3Mgd2lsbCBiZSBhY2Nlc3NpYmxlIGZvciBjaGFuZ2luZy4gCisgICAgICAgIFdoZW5ldmVyIGl0IGlzIHRpbWUgZm9yIGEgcmVwb3J0IHRvIGJlIGdlbmVyYXRlZCwgYSBtZXNzYWdlIHdpbGwgYXBwZWFyIAorICAgICAgICBvbiB0aGUgY29tbWFuZCBsaW5lLiBBbm90aGVyIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgd2hlbiB0aGUgcmVwb3J0cyBoYXZlIAorICAgICAgICBiZWVuIHN1Y2Nlc3NmdWxseSB3cml0dGVuLiBUaGlzIGxhc3QgbWVzc2FnZSB3aWxsIGluY2x1ZGUgdGhlIGRhdGUgYW5kIAorICAgICAgICB0aW1lIG9mIHRoZSBuZXh0IHJlcG9ydCBnZW5lcmF0aW9uLjwvUD4KKyAgICAgIDxINCBBTElHTj0iTEVGVCI+V2hhdCBkbyB0aGUgc2V0dGluZ3MgbWVhbj88L0g0PgorICAgICAgPFAgQUxJR049IkxFRlQiPldoZW4gdGhlIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBpcyBpbml0aWFsbHkgYnJvdWdodCB1cCwgCisgICAgICAgIHRoZSByZXBvcnRlciBtYXkgbm90IGJlIGFjdGl2ZS4gQW4gaW5kaWNhdGlvbiBhdCB0aGUgdG9wIG9mIHRoZSB3aW5kb3cgCisgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVwb3J0ZXIgd2lsbCByZXBvcnQgYXQgdGhlIHRpbWUgdGhhdCBoYXMgCisgICAgICAgIGJlZW4gc3BlY2lmaWVkLiBUaGUgJ1N0YXJ0ZWQnIG1lc3NhZ2UgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCByZXBvcnQgZ2VuZXJhdGlvbiAKKyAgICAgICAgaGFzIHN0YXJ0ZWQ7IGl0IG1lcmVseSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVwb3J0ZXIgaGFzIHN0YXJ0ZWQgYW5kIHdpbGwgCisgICAgICAgIGdlbmVyYXRlIHJlcG9ydHMgYWNjb3JkaW5nIHRvIHRoZSBvdGhlciBzZXR0aW5ncy4gVG8gdG9nZ2xlIHdoZXRoZXIgb3IgCisgICAgICAgIG5vdCB0aGUgcmVwb3J0ZXIgaXMgcnVubmluZyBwcmVzcyB0aGUgJ1N0YXJ0JyBvciAnU3RvcCcgYnV0dG9uIG5lYXIgdGhlIAorICAgICAgICB0b3Agb2YgdGhlIHdpbmRvdy4gVG8gZ2VuZXJhdGUgYSByZXBvcnQgaW1tZWRpYXRlbHksIHByZXNzIHRoZSAnVXBkYXRlIAorICAgICAgICBOb3cnIGJ1dHRvbi48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhlIHJlcG9ydCBpbnRlcnZhbCBkZXRlcm1pbmVzIHdoZW4gYSByZXBvcnQgaXMgZ2VuZXJhdGVkLiAKKyAgICAgICAgVGhlcmUgYXJlIHR3byBtYWluIG9wdGlvbnMgZm9yIGRldGVybWluaW5nIHRoZSBpbnRlcnZhbC4gRWl0aGVyIGFuIGFtb3VudCAKKyAgICAgICAgb2YgdGltZSBpcyBzcGVjaWZpZWQgdGhhdCBtdXN0IHBhc3MgaW4gYmV0d2VlbiByZXBvcnRzLCBvciBhIHNwZWNpZmljIAorICAgICAgICB0aW1lIGR1cmluZyB0aGUgd2VlayBvciBkYXkgaXMgc3BlY2lmaWVkIGF0IHdoaWNoIHRpbWUgdGhlIHJlcG9ydCBpcyBnZW5lcmF0ZWQgCisgICAgICAgIGlycmVnYXJkbGVzcyBvZiB3aGVuIHRoZSBsYXN0IHJlcG9ydCB3YXMgZ2VuZXJhdGVkLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5UaGUgUmVzb3VyY2UgQnVuZGxlIHNldHRpbmcgaXMgYW4gaW5kaWNhdGlvbiBvZiB0aGUgYmFzZSAKKyAgICAgICAgZmlsZSBmcm9tIGNvbmNlcm5pbmcgd2hpY2ggdGhlIHJlcG9ydCBpcyBnZW5lcmF0ZWQuIFRvIGNoYW5nZSB0aGUgYmFzZSAKKyAgICAgICAgZmlsZSwgZWl0aGVyIHR5cGUgaW4gdGhlIG5ldyBmaWxlIHBhdGggdG8gYSByZXNvdXJjZSBidW5kbGUsIG9yIHNlbGVjdCAKKyAgICAgICAgdGhlICdDaG9vc2UnIGJ1dHRvbiBpbW1lZGlhdGVseSB0byB0aGUgcmlnaHQgdG8gYnJpbmcgdXAgdGhlIGdyYXBoaWNhbCAKKyAgICAgICAgZmlsZSBjaG9vc2VyLiBUaGUgb3V0cHV0IGRpcmVjdG9yeSBpcyB0aGUgZmlsZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgCisgICAgICAgIHJlcG9ydHMgYXJlIHNhdmVkLiBOb3RlIHRoYXQgdGhlIHJlcG9ydHMgYXJlIG92ZXJ3cml0dGVuIGVhY2ggdGltZSB0aGV5IAorICAgICAgICBhcmUgbmV3bHkgZ2VuZXJhdGVkLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5UaGUgb3V0cHV0IGZvcm1hdCBoYXMgdGhyZWUgb3B0aW9ucy4gQW55IGNvbWJpbmF0aW9uIG9mIAorICAgICAgICB0aGVzZSBvcHRpb25zIGlzIHBlcm1pc3NpYmxlLCB0aG91Z2ggaXQgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIHR1cm4gdGhlbSAKKyAgICAgICAgYWxsIG9mZi4gVGhlICdUZXh0JyBmb3JtYXQgcHJvZHVjZXMgYSBzaW1wbGUgdGV4dCBmaWxlIGluIEVuZ2xpc2ggcmVwb3J0aW5nIAorICAgICAgICBvbiB0aGUgc3RhdHVzIG9mIGVhY2ggb2YgdGhlIHJlc291cmNlIGZpbGVzLiBUaGUgJ0hUTUwnIGZvcm1hdCBwcm9kdWNlcyAKKyAgICAgICAgYSBwYWdlIHRoYXQgaXMgdmlld2FibGUgaW4gYSB3ZWIgYnJvd3Nlci4gVGhlICdYTUwnIGZvcm1hdCBwcm9kdWNlcyBhIAorICAgICAgICB3ZWxsIGZvcm1lZCBYTUwgcmVwb3J0IHRoYXQgY2FuIGJlIGltcG9ydGVkIGludG8gYSBkYXRhYmFzZSwgdHJhbnNmb3JtZWQgCisgICAgICAgIGludG8gYW5vdGhlciBmb3JtYXQsIG9yIHVzZWQgaW4gYSB2YXJpZXR5IG9mIG90aGVyIHdheXMuPC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPkVhY2ggb3V0cHV0IGZvcm1hdCBoYXMgYXNzb2NpYXRlZCB3aXRoIGl0IGEgZmlsZSBuYW1lLiBUaGlzIAorICAgICAgICBuYW1lIGNhbiBiZSBjaG9zZW4gYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBidW5kbGUgCisgICAgICAgIGJlbG9uZ3MuIEFsc28sIHRoZXNlIGZpbGUgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIGluIG9yZGVyIHRvIHBsYWNlIHRoZSAKKyAgICAgICAgZmlsZXMgaW4gYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gCisgICAgICAgIEZvciBpbnN0YW5jZSwgYSBVTklYIHVzZXIgbWlnaHQgY2hhbmdlIHRoZSB0ZXh0IGZpbGUgbmFtZSB0byAnLi4vLi4vbG9nL3JlcG9ydC50eHQnLiAKKyAgICAgICAgQSBkZXRhaWwgbGV2ZWwgaXMgYWxzbyBhc3NvY2lhdGVkIHdpdGggZWFjaCByZXBvcnQuIFRoZSAnSGlnaCcgZGV0YWlsIAorICAgICAgICBsZXZlbCBtZXJlbHkgaW5jbHVkZXMgZWFjaCBvZiB0aGUgcmVzb3VyY2Uga2V5cyB0aGF0IGFyZSB1bnRyYW5zbGF0ZWQgCisgICAgICAgIG9yIGR1cGxpY2F0ZWQgaW5zdGVhZCBvZiBqdXN0IHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHN1Y2ggcmVzb3VyY2VzLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5UaGUgbGFzdCBidXR0b24gc2F2ZXMgdGhlIHNldHRpbmdzIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQgCisgICAgICAgIHRvIGEgcHJlZmVyZW5jZXMgZmlsZSBzbyB0aGF0IHRoZXNlIHNldHRpbmdzIHdpbGwgYmUgaW4gcGxhY2UgdGhlIG5leHQgCisgICAgICAgIHRpbWUgdGhlIHByb2dyYW0gaXMgcnVuLiBJZiB0aGUgc2V0dGluZ3MgYXJlIG5vdCBtZWFudCB0byBiZSBzYXZlZCBhcyAKKyAgICAgICAgc3VjaCwgZG8gbm90IGNsaWNrIHRoaXMgYnV0dG9uLiBUaGUgcmVwb3J0ZXIgd2lsbCBzdGlsbCBydW4gYWNjb3JkaW5nIAorICAgICAgICB0byB0aGUgZGlzcGxheWVkIHNldHRpbmdzIGFzIGxvbmcgYXMgdGhlIFJCUmVwb3J0ZXIgcHJvZ3JhbSBpcyBydW5uaW5nLjwvUD4KKyAgICAgIDxINCBBTElHTj0iTEVGVCI+V2hhdCBpcyB0aGUgY29kZSBzY2FuPzwvSDQ+CisgICAgICA8UCBBTElHTj0iTEVGVCI+U3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDAuM2EsIHRoZSByZXBvcnRlciBpbmNsdWRlZCBhIGZ1bmN0aW9uIAorICAgICAgICB0aGF0IGNhbiBzY2FuIHRleHQgZmlsZXMgbG9va2luZyBmb3IgaW5zdGFuY2VzIG9mIHJlc291cmNlIGJ1bmRsZSB1c2FnZSAKKyAgICAgICAgYW5kIGNvbXBhcmUgdGhvc2UgaW5zdGFuY2VzIHdpdGggdGhlIHNlbGVjdGVkIHJlc291cmNlIGJ1bmRsZS4gVGhpcyBzY2FuIAorICAgICAgICBjYW4gdGhlbiByZXBvcnQgb24gYW55IHJlc291cmNlIGtleXMgY2FsbGVkIG9uIGJ5IGEgcHJvZ3JhbSBidXQgbm90IGV4aXN0aW5nIAorICAgICAgICBpbiBhIHJlc291cmNlIGJ1bmRsZSwgYXMgd2VsbCBhcyBwb2ludCBvdXQgcmVzb3VyY2VzIGluIHRoZSBidW5kbGUgdGhhdCAKKyAgICAgICAgYXJlIHBvdGVudGlhbGx5IG5vdCB1c2VkIGF0IGFsbCBieSB0aGUgY29kZS48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhlIHJlcG9ydGVyIGlzIHR1cm5lZCBvbiBieSBzZWxlY3RpbmcgdGhlIGNoZWNrIGJveCBuZXh0IAorICAgICAgICB0byB0aGUgdGV4dCAnU2NhbiBDb2RlIEZpbGUnIGFuZCBwb2ludGluZyB0aGUgc2NhbiB0byBhIHByb3Blcmx5IHNwZWNpZmllZCAKKyAgICAgICAgc2NhbiBYTUwgZmlsZS4gVGhlIHJlcG9ydCBnZW5lcmF0ZWQgaXMgYXBwZW5kZWQgdG8gdGhlIG5vcm1hbCByZXBvcnRzIAorICAgICAgICBnZW5lcmF0ZWQgaW4gdGV4dCwgSFRNTCwgb3IgWE1MLiBUaGUgcmVwb3J0IGlzIGFsc28gc2Vuc2l0aXZlIHRvIHRoZSBkZXRhaWwgCisgICAgICAgIGxldmVsIHNlbGVjdGVkIGZvciBlYWNoIG9mIHRoZXNlIHRocmVlIG91dHB1dCBmb3JtYXRzLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5UaGUgc2NhbiBYTUwgZmlsZSBwcm92aWRlcyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAKKyAgICAgICAgZm9yIHRoZSBjb2RlIHNjYW4uIEluIGl0IHJ1bGVzIGZvciB3aGF0IGRpcmVjdG9yaWVzIGFuZCBmaWxlcyB0byBzY2FuIAorICAgICAgICBhcmUgc2V0IGFzIHdlbGwgYXMgd2hhdCB0eXBlIG9mIHRleHQgaXMgbG9va2VkIGZvciB0byBmaW5kIGEgcmVzb3VyY2UgCisgICAgICAgIGtleS4gTW9yZSA8QSBIUkVGPSJzY2FuZmlsZS5odG1sIj5kZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHVwIGEgCisgICAgICAgIHNjYW4gWE1MIGZpbGU8L0E+IGNhbiBiZSBmb3VuZCBieSBmb2xsb3dpbmcgdGhlIGxpbmsuPC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPiZuYnNwOzwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9mYXEuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ZhcS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmY2JmMjkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9mYXEuaHRtbApAQCAtMCwwICsxLDE1OSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5UZW1wbGF0ZTwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiAgdXJsKGltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSJpbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9ImltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJsb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJtZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InR1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDMgQUxJR049IkNFTlRFUiI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L0gzPgorICAgICAgPFA+PEI+IFdoYXQgaXMgdGhlIGFkdmFudGFnZSBvZiB1c2luZyBSQiBNYW5hZ2VyIHdoZW4gSSBjYW4gZWRpdCByZXNvdXJjZSAKKyAgICAgICAgYnVuZGxlIHByb3BlcnR5IGZpbGVzIGluIGEgc2ltcGxlIHRleHQgZWRpdG9yPzwvQj48L1A+CisgICAgICA8UD5UcnlpbmcgdG8gbWFuYWdlIGludGVybmF0aW9uYWxpemF0aW9uIGVmZm9ydHMgaW4gYW55dGhpbmcgYnV0IHRoZSBzbWFsbGVzdCAKKyAgICAgICAgb2YgcHJvamVjdHMgY2FuIGJlIGEgZGlmZmljdWx0IGFuZCB0aW1lIGNvbnN1bWluZyB0YXNrLiBJbiBmYWN0LCBSQiBNYW5hZ2VyIAorICAgICAgICBhcyBhIHByb2plY3QgZ3JldyBvdXQgb2YgdGhlIGZydXN0cmF0aW9ucyBhbmQgZXJyb3JzIHRoYXQgZGV2ZWxvcGVkIGFzIAorICAgICAgICB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBtYWludGFpbiBtdWx0aXBsZSBsYW5ndWFnZSBzdXBwb3J0IGluIGEgbW9kZXJhdGVseSAKKyAgICAgICAgbGFyZ2UgcHJvamVjdC4gUmVseWluZyBvbiB0ZXh0IGVkaXRvcnMgYW5kIHRoZSBsaWtlIGRlY3JlYXNlcyB0aGUgY2hhbmNlIAorICAgICAgICB0aGF0IGRldmVsb3BlcnMgd2lsbCBwcm9wZXJseSBjb21tZW50IGVhY2ggYXNwZWN0IG9mIGVhY2ggdHJhbnNsYXRpb24sIAorICAgICAgICBpbmNyZWFzZXMgdGhlIGNoYW5jZSB0aGF0IGVycm9ycyBzdWNoIGFzIGR1cGxpY2F0ZSBrZXkgbmFtZXMgYW5kIGluY29uc2lzdGVuY2llcyAKKyAgICAgICAgYWNyb3NzIGxhbmd1YWdlIGZpbGVzLCBhbmQgaW5jcmVhc2VzIHRoZSBhbW91bnQgb2YgdGltZSBkZXZlbG9wZXJzIGFuZCAKKyAgICAgICAgdHJhbnNsYXRvcnMgaGF2ZSB0byBzcGVuZCB0cmFja2luZyBkb3duIGluY29uc2lzdGVuY2llcyBhbmQgdW50cmFuc2xhdGVkIAorICAgICAgICByZXNvdXJjZXMuPC9QPgorICAgICAgPFA+UkJNYW5hZ2VyIG9mZmVycyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzIHRvIGNvcnJlY3QgdGhlc2UgcHJvYmxlbXM6PC9QPgorICAgICAgPFA+IAorICAgICAgICA8VUw+CisgICAgICAgICAgCisgICAgICAgIDxMST4gUkIgTWFuYWdlciBjYW4gZWRpdCBtdWx0aXBsZSBsYW5ndWFnZSBmaWxlcyB3aGVuIGFwcHJvcHJpYXRlPC9MST4KKyAgICAgICAgICA8TEk+RW50cmllcyBhcmUgY2hlY2tlZCBmb3IgcHJvcGVyIGZvcm1hdCBhbmQgYXNzdXJlZCBub3QgdG8gYmUgZHVwbGljYXRlczwvTEk+CisgICAgICAgICAgCisgICAgICAgIDxMST5SQiBNYW5hZ2VyIHByb3ZpZGVzIGEgYmV0dGVyIGdyb3VwaW5nIG9mIHJlc291cmNlcywgc28gdGhhdCBpbmRpdmlkdWFsIAorICAgICAgICAgIHRyYW5zbGF0aW9ucyBhcmUgZWFzeSB0byBmaW5kPC9MST4KKyAgICAgICAgICA8TEk+RWFjaCBsYW5ndWFnZSBmaWxlIHdpbGwgZGlzcGxheSBpbiBpdHMgb3duIHZpZXcgYSBsaXN0IG9mIG9ubHkgcmVzb3VyY2VzIAorICAgICAgICAgICAgdGhhdCBhcmUgdW50cmFuc2xhdGVkPC9MST4KKyAgICAgICAgICAKKyAgICAgICAgPExJPlJCIE1hbmFnZXIga2VlcHMgdHJhY2sgb2Ygc3RhdGlzdGljcyBzdWNoIGFzIG51bWJlciBvZiByZXNvdXJjZXMsIAorICAgICAgICAgIHVudHJhbnNsYXRlZCBpdGVtcywgZXRjLjwvTEk+CisgICAgICAgICAgCisgICAgICAgIDxMST5SQiBNYW5hZ2VyIGFsbG93cyBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBvZiB0cmFuc2xhdGlvbiBkYXRhIGludG8gCisgICAgICAgICAgbXVsdGlwbGUgZm9ybWF0czwvTEk+CisgICAgICAgICAgPExJPlVzZSBvZiB0aGUgYXBwbGljYXRpb24gY3V0cyBkb3duIG9uIGRldmVsb3BtZW50LCB0cmFuc2xhdGlvbiwgYW5kIAorICAgICAgICAgICAgZGVidWdnaW5nIHRpbWUgaW4gYW55IGludGVybmF0aW9uYWxpemVkIHNldHRpbmc8L0xJPgorICAgICAgICA8L1VMPgorICAgICAgICAKKyAgICAgIDxQPjxCPldpbGwgUkIgTWFuYWdlciB3b3JrIG9uIG15IGNvbXB1dGVyPzwvQj48L1A+CisgICAgICAgIAorICAgICAgPFA+UkIgTWFuYWdlciBpcyB3cml0dGVuIHVzaW5nIG9ubHkgdGhlIEphdmEgQVBJLiBJdCBoYXMgYmVlbiB0ZXN0ZWQgdW5kZXIgCisgICAgICAgIHRoZSBKYXZhIDEuMi4yIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGhpZ2hlci4gSWYgeW91ciBjb21wdXRlciBoYXMgYSAKKyAgICAgICAgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgKEpWTSkgaW4gdGhpcyBlbnZpcm9ubWVudCwgUkJNYW5hZ2VyIHNob3VsZCB3b3JrIAorICAgICAgICBmb3IgeW91LiBJbnN0cnVjdGlvbnMgZm9yIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgdGhlIHByb2dyYW0gYXJlIGZvdW5kIAorICAgICAgICBpbiA8QSBIUkVGPSJ0dXRvcmlhbC9zdGVwMS5odG1sIj5TdGVwIDE8L0E+IG9mIHRoZSB0dXRvcmlhbC48L1A+CisgICAgICAgIAorICAgICAgPFA+PEI+V2h5IGRvZXNuJ3QgUkIgTWFuYWdlciBydW4gaW4gbGFuZ3VhZ2UgWD88L0I+PC9QPgorICAgICAgPFA+PC9QPgorICAgICAgPFA+UkIgTWFuYWdlciB3aWxsIGFsbG93IHlvdSB0byBlZGl0IGxhbmd1YWdlIGZpbGVzIGZvciBhbnkgbGFuZ3VhZ2UvY291bnRyeS92YXJpYW50IAorICAgICAgICBlbmNvZGluZy4gVG8gZGVtb25zdHJhdGUgdGhlIHVzZWZ1bG5lc3Mgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIFJCIE1hbmFnZXIgCisgICAgICAgIGhhcyBpdHMgb3duIHJlc291cmNlIGJ1bmRsZS4gVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXJyZW50bHkgYmUgcnVuIGluIEVuZ2xpc2gsIAorICAgICAgICBHZXJtYW4sIFN3ZWRpc2gsIGFuZCBGaW5uaXNoLiBZb3UgYXJlIHdlbGNvbWUgdG8gdXNlIHRoZSBwcm9ncmFtIHRvIGVkaXQgCisgICAgICAgIGl0cyBvd24gcmVzb3VyY2UgYnVuZGxlIGFuZCBhZGQgYW55IG90aGVyIGxhbmd1YWdlLiBJZiB5b3UgZG8gc28sIHlvdSAKKyAgICAgICAgbWF5IHN1Ym1pdCB0aGUgbmV3IGxhbmd1YWdlIGZpbGUgdG8gdGhlCisgICAgICAgIDxBIEhSRUY9Imh0dHA6Ly93d3cuanRjc3YuY29tL2NnaWJpbi9pY3UtYnVncy8iPklDVSBidWcgZGF0YWJhc2U8L0E+LiAKKyAgICAgICAgRWFjaCBzdWJtaXNzaW9uIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgZnV0dXJlIHN1Ym1pc3Npb25zLCBidXQgdGhlIHN1Ym1pdHRvciAKKyAgICAgICAgbXVzdCBnaXZlIHRoZSByaWdodHMgdG8gdGhlIHRyYW5zbGF0aW9uIHRvIElCTSBpZiB0aGUgZmlsZSBpcyB0byBiZSBpbmNsdWRlZC48L1A+CisgICAgICA8UD48Qj5JIGZvdW5kIGEgYnVnLiBXaGVyZSBkbyBJIHJlcG9ydCBpdD88L0I+PC9QPgorICAgICAgPFA+UGxlYXNlIHN1Ym1pdCBhIGJ1ZyB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5qdGNzdi5jb20vY2dpYmluL2ljdS1idWdzLyI+SUNVIGJ1ZyBkYXRhYmFzZTwvYT4uPC9QPgorICAgICAgPFA+PEI+V2hhdCBjYW4gSSBleHBlY3QgZnJvbSBmdXR1cmUgdmVyc2lvbnMgb2YgUkIgTWFuYWdlcj88L0I+PC9QPgorICAgICAgPFA+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkFuc3dlcjwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2Z1dHVyZV9mZWF0dXJlcy5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvZnV0dXJlX2ZlYXR1cmVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjZThmMAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2Z1dHVyZV9mZWF0dXJlcy5odG1sCkBAIC0wLDAgKzEsMTYzIEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgLSBGZWF0dXJlcyBhbmQgVmVyc2lvbiBIaXN0b3J5PC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6ICB1cmwoaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Imxvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Im1lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0idHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgPFVMPgorICAgICAgICAgICAgPExJPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDMgQUxJR049IkNFTlRFUiI+RnV0dXJlIEZlYXR1cmVzIGFuZCBWZXJzaW9uIEhpc3Rvcnk8L0gzPgorICAgICAgPFA+U29tZSBvZiB0aGUgZmVhdHVyZXMgYWxsIHJlYWR5IGluIHRoZSB3b3JrcyBmb3IgZnV0dXJlIHZlcnNpb25zIG9mIFJCIAorICAgICAgICBNYW5hZ2VyOjwvUD4KKyAgICAgIDxVTD4KKyAgICAgICAgPExJPlRoZSBhYmlsaXR5IHRvIGxvb2t1cCBzdWdnZXN0ZWQgdHJhbnNsYXRpb25zIHVzaW5nIGltcG9ydGVkIGRpY3Rpb25hcmllczwvTEk+CisgICAgICAgIDxMST5NdWx0aXBsZSBzZWxlY3Rpb25zIGFjcm9zcyByZXNvdXJjZSB0YWJsZXM8L0xJPgorICAgICAgICA8TEk+RWRpdGluZyBzdWJ0cmVlcyB3aXRoaW4gdGhlIHJlc291cmNlIGJ1bmRsZSB0cmVlPC9MST4KKyAgICAgICAgPExJPlRoZSBhYmlsaXR5IHRvIHByaW50IHZhcmlvdXMgdmlld3Mgb2YgcmVzb3VyY2VzPC9MST4KKyAgICAgICAgPExJPkEgY2hhcmFjdGVyIHRhYmxlIGZvciBzZWxlY3RpbmcgY2hhcmFjdGVycyBub3QgY29tbW9uIHRvIGtleWJvYXJkczwvTEk+CisgICAgICAgIDxMST4uLi5hbmQgb2YgY291cnNlIGFsbCBvZiB0aGUgYnVnIGZpeGVzPC9MST4KKyAgICAgIDwvVUw+CisgICAgICAKKyAgICAgIDxwPkZlYXR1cmVzIGFkZGVkIGluIHRoZSBsYXRlc3QgdmVyc2lvbiAoMC43KSBvZiBSQiBNYW5hZ2VyOjwvcD4KKyAgICAgICAgCisgICAgICA8dWw+CisgICAgICAgIDxsaT5BZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBYTElGRiBmaWxlczwvbGk+CisgICAgICAgIDxsaT5GaXggc29tZSBwYW5lbCB1cGRhdGluZyBpc3N1ZXM8L2xpPgorICAgICAgICA8bGk+Li4uIGFuZCBzb21lIG90aGVyIGJ1ZyBmaXhlczwvbGk+CisgICAgICA8L3VsPgorCisgICAgICA8UD5GZWF0dXJlcyBhZGRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gKDAuNikgb2YgUkIgTWFuYWdlcjo8L1A+CisgICAgICAgIAorICAgICAgPFVMPgorICAgICAgICA8TEk+VGhlIHByb2dyYW0gd2luZG93IG5vdyBoYXMgYW4gaWNvbjwvTEk+CisgICAgICAgIDxMST5JbnRlZ3JhdGUgdGhlIGltYWdlcyBhbmQgcmVzb3VyY2VzIGludG8gdGhlIGphciBmaWxlczwvTEk+CisgICAgICAgIDxMST5Tb3VyY2UgY29kZSBtYWRlIHB1YmxpY2x5IGF2YWlsYWJsZTwvTEk+CisgICAgICAgIDxMST5BbGxvdyBleHBvcnRpbmcgb2YgSUNVNEMgcmVzb3VyY2UgYnVuZGxlczwvTEk+CisgICAgICAgIDxMST4uLi4gYW5kIHNvbWUgYnVnIGZpeGVzPC9MST4KKyAgICAgIDwvVUw+CisgICAgICAKKyAgICAgIDxQPkZlYXR1cmVzIGFkZGVkIGluIHZlcnNpb24gMC40YSBvZiBSQiBNYW5hZ2VyOjwvUD4KKyAgICAgIAorICAgICAgPFVMPgorICAgICAgICA8TEk+UmVjZW50bHkgYWNjZXNzZWQgcmVzb3VyY2UgYnVuZGxlcyBhcHBlYXIgaW4gdGhlIEZpbGUgbWVudSBmb3IgZWFzeSAKKyAgICAgICAgICBvcGVuaW5nPC9MST4KKyAgICAgICAgPExJPk5ldyBpY29ucyBmb3IgdGhlIHRyZWUgdmlldzwvTEk+CisgICAgICAgIDxMST5BYmlsaXR5IHRvIHNhdmUsIGhpZGUsIG9yIGRlbGV0ZSBzcGVjaWZpYyByZXNvdXJjZSBmaWxlcyB3aXRob3V0IGFmZmVjdGluZyAKKyAgICAgICAgICB0aGUgcmVzb3VyY2UgYnVuZGxlIGFzIGEgd2hvbGU8L0xJPgorICAgICAgICA8TEk+RXhwb3J0aW5nIHRvIEphdmEgY2xhc3MgZmlsZXMgYWxsb3dzIGZvciBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwYWNrYWdlIAorICAgICAgICAgIG5hbWUgYXMgd2VsbCBhcyB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHB1YmxpYyBvciBwcm90ZWN0ZWQgb2JqZWN0czwvTEk+CisgICAgICAgIDxMST5UcmFuc2xhdGlvbnMgY2FuIG5vdyBlYXNpbHkgYWNjb21pZGF0ZSBtdWx0aXBsZSBsaW5lIHRleHQ8L0xJPgorICAgICAgICA8TEk+UkIgTWFuYWdlciBpcyBubyBsb25nZXIgcmVzdHJpY2VkIHRvIHJlc291cmNlIGJ1bmRsZXMgdGhhdCBlbmQgaW4gCisgICAgICAgICAgJy5wcm9wZXJ0aWVzJyBpbiBsb3dlci1jYXNlPC9MST4KKyAgICAgICAgPExJPi4uLiBhbmQgc29tZSBidWcgZml4ZXM8L0xJPgorICAgICAgPC9VTD4KKworICAgICAgPFA+RmVhdHVyZXMgYWRkZWQgaW4gdmVyc2lvbiAwLjNhIG9mIFJCIE1hbmFnZXI6PC9QPgorICAgICAgPFVMPgorICAgICAgICA8TEk+VGhlIGFiaWxpdHkgdG8gbWVyZ2UgcHJvcGVydHkgZmlsZXMgYW5kIG90aGVyIHJlc291cmNlIGJ1bmRsZXMgd2l0aCAKKyAgICAgICAgICB0aGUgb3BlbiByZXNvdXJjZSBidW5kbGU8L0xJPgorICAgICAgICA8TEk+RXhwb3J0aW5nIEphdmEgY29tcGlsYWJsZSBmaWxlcyAoTGlzdFJlc291cmNlQnVuZGxlIGV4dGVuc2lvbiBmaWxlcyk8L0xJPgorICAgICAgICA8TEk+SW1wb3J0IGFuZCBleHBvcnQgc3VwcG9ydCBmb3IgVE1YIGZvcm1hdHRlZCBYTUwgdHJhbnNsYXRpb24gZmlsZXM8L0xJPgorICAgICAgICA8TEk+VGhlIGFiaWxpdHkgdG8gc2VhcmNoIHJlc291cmNlIGJ1bmRsZXMgYW5kIGxhbmd1YWdlIGZpbGVzIGZvciBwYXJ0aWN1bGFyIAorICAgICAgICAgIHRyYW5zbGF0aW9uczwvTEk+CisgICAgICAgIDxMST5LZXlib2FyZCBzaG9ydGN1dHMgZm9yIHRoZSBtb3N0IGNvbW1vbiBmdW5jdGlvbnM8L0xJPgorICAgICAgICA8TEk+QSBmaWxlIHNjYW5uaW5nIGV4dGVuc2lvbiB0byB0aGUgcmVwb3J0aW5nIHRvb2w8L0xJPgorICAgICAgICA8TEk+Li4uIGFuZCBzb21lIGJ1ZyBmaXhlczwvTEk+CisgICAgICA8L1VMPgorICAgICAgPFA+SGF2ZSBhbm90aGVyIGlkZWE/IFNlbmQgYW55IHRob3VnaHRzIG9yIGNvbW1lbnRzIHRvCisgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmp0Y3N2LmNvbS9jZ2liaW4vaWN1LWJ1Z3MvIj5JQ1UncyBKaXR0ZXJidWcgZGF0YWJhc2U8L2E+LjwvUD4KKyAgICAgIDxicj4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwNCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2U4NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MjE0ZDZjMjVjNGEyMjJmZWViNWVjZDFkN2U3MDFjNmJmMTgwMWYxNTQ5Yjg3NTAwZjA2ZGJiNTA2NTJlNTlhNworc2l6ZSAxNjc0CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvYXJyb3dfYnVsbGV0LmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9hcnJvd19idWxsZXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMDE4MjUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvYXJyb3dfYnVsbGV0LmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjoyODU0ZjM1ODY0OGRjYzJlYTIxYjRhM2M5Y2E2NWE4Mjc2MmIzZDAyYjE4YjUzMzRlNDRlZTlhODhjMmJhNDkwCitzaXplIDcwCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDFmMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjoyYjI5Yjc1MDFjN2IwNjJkODc0MzYzODQ5MTYxODJhNTc1NGNjYjNjMzNmYWY5MmRmNTJmOTZmY2Q3OWFkMjkyCitzaXplIDk0CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvaWJtX2xvZ29fc21hbGxfd2hpdGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2libV9sb2dvX3NtYWxsX3doaXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmU1YmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2libV9sb2dvX3NtYWxsX3doaXRlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo5MzZiODRkN2MzN2M0ZGZlNGMyMDA3YTFiMzZhN2M0YjllN2Y5OWE3NmE5OTJkNmZlNTJhODQ3ODI2OGU4MzhkCitzaXplIDEzOApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL1JCUmVwb3J0ZXIuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL1JCUmVwb3J0ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTNmZjgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvUkJSZXBvcnRlci5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MmM1MzNlYzQ4NTk4MzNiNjU0NWMzZWNlN2IwNGYyMDVjNzA2YTU1OWQxYjljYzEzYjIzNThlOGE2YzFmN2ZiYgorc2l6ZSAxMzk4NApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2ZpbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2ZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2UyZDIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfZmlsZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NTAwMDQ0NmYwZGUzY2Q2YmI1ODA2OGYwYTE4MTIxNDNjNjFiZmFmOGYxMjM3N2Q4NTk0NGYxOTU1ZmY0MzgwMgorc2l6ZSA5NzQxCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfZ3JvdXAuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2dyb3VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTBkNWEyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2dyb3VwLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo4YTA2NzdiY2FjZDM4MWU0MDk4MTJlYzA4Mzc2MWEzNWJmMDFhYWE0NmZiZTc1NGVmZjBjZTExYTA4ZTc5ZDkzCitzaXplIDE1MDQyCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfcmVzb3VyY2UuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3Jlc291cmNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDcwNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3Jlc291cmNlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo1ZDliMDJmZDE3ZTc4NzgxYWIwMDg3ODQxZTU3ZGI1ZjRmMDE4MjlhYzJkMGU0NzA1YmU3N2NlMGY5ZTA3NzczCitzaXplIDYyNjYKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY190cmFuc2xhdGlvbi5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfdHJhbnNsYXRpb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzhlMGEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfdHJhbnNsYXRpb24uZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjY5ZWRlN2E4ZDNkNTYxMWJmZjY3YjgxNjc2OTk3MGIwMGJiYjI2Mzc1ZGQ3YmNiNWRjMTJiZmY2ZTYzNWJhYjkKK3NpemUgNzg3NQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3VudHJhbnNsYXRlZC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfdW50cmFuc2xhdGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QzODYwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3VudHJhbnNsYXRlZC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6ZTljOTU5NDVhOGFlZmI2Y2MwYjNhYjQwYzQ3ZTNkYjliY2M0NzcyNTNkZWViZjhjMWQ5MDY4YTUxZGI5MDEyYgorc2l6ZSAxMzE4MgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2NyZWF0ZV9ncm91cC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvY3JlYXRlX2dyb3VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ViZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2NyZWF0ZV9ncm91cC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6OTZiN2JkY2Q5MzVkYTIwYjRlOGRjYzJmN2EzYzBiNzk0ZGIzYWI2ZWJiOTY3MWY3YTEyNGI5MDZiOGM1YmQ5ZQorc2l6ZSAzOTA3CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfZ3JvdXAuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X2dyb3VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODkwMjYyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X2dyb3VwLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo3Zjc5YmFmY2JkODNjMGI0OGQwNWVhMWU5MmUzODc3MTM4MGM3ZjAyMzdlM2QxOWExNDU1YjY3OWUxYjFjY2ViCitzaXplIDE0NTY5CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfcmVzb3VyY2UuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3Jlc291cmNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc1YmFhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3Jlc291cmNlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjpiMTI2ZWRiMmY2OGQzNDliZTcxYTMxOGZhYTg1N2FlYTQ2NzMzZTJiMWYwNjk3N2MzODcyYTZiODkyM2UyNjVmCitzaXplIDUxMDMKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9zY3JlZW4uZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3NjcmVlbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlOGNkZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9zY3JlZW4uZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjRiZTljYzAxYWY2NjIyYjMyYjg5OTBiMDMwMjhmMzVlYjJiZjM1YTM4ZjgxNzY1ZTIyMDE3YjI3NWJiODkzMmQKK3NpemUgOTk5MwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3dpdGhfcHJlZmVyZW5jZXMuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3dpdGhfcHJlZmVyZW5jZXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTEwYjgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfd2l0aF9wcmVmZXJlbmNlcy5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6Y2VmNDQxOWE0ODFhYWI4MGI2YzJiNGViZDNkODI1ZjQxZmY5YTNlMWQzYWQzMTZiMjNkMzhkNmI3MzA2YmQyNQorc2l6ZSA5OTA3CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21ldGFsLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sYWZfbWV0YWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODgwMjAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21ldGFsLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo3NWI2MmRmY2UzNDc5NTJhYjE4MWEwNTgwNjhhMDc3MDM4NmFkZGU3YjllMzY5ZDgxNGM2NTMwYzE2ZGQ3MmZmCitzaXplIDQ0NDMzCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21vdGlmLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sYWZfbW90aWYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTVhOTkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21vdGlmLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjplNTMyNTkwZmM2YTI5MDk0Mzg1YzIyYWE4MzUwNWEzZDE1ODFlOWM1NjM5YWJlODVkNGU4MWUyYTJhZjQ3NDQzCitzaXplIDUzMzIyCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX3dpbmRvd3MuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl93aW5kb3dzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY3NjczCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl93aW5kb3dzLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjplYTRkODVlMjA1NWQ4ZjViODBmMzU3OTE0NTk0YmUxMzYzYjBkYTgxY2NkMGQ1OGY0ZTJjYjQ0ZGRiNDAyMGMzCitzaXplIDQ2MDc3CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbG9va3VwX3Jlc291cmNlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sb29rdXBfcmVzb3VyY2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDRkN2IKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbG9va3VwX3Jlc291cmNlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjphOTcxYTQ5Njg5M2ZjZDQ3MzE2ODU0Yzc5NGViYTg0MTk0N2JlMzk5YjczNGRiYzQxYTQ5YjdjNGU0NzY2Y2ZlCitzaXplIDY0NDUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tYWluX3BhZ2UuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21haW5fcGFnZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwNGIzYgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tYWluX3BhZ2UuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjhjNzk1ODllN2E1YjI3NzdjOTU1YmZmMDAxNTNhY2IxMmMwNTc4ZmE2NTQ0ZWM4ZDVkMjljNjYzMGRlN2E5ZjEKK3NpemUgMTkwODUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjNTFlMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2Ojk4NjlkNGI3ZDVhYmVlNGYwOGM0MWQ0NzA0MGRlY2M1YWQ3YjVhMTJhNTk1NmU2OWQ0NDkyODVmMDllMjI0MjMKK3NpemUgMjc0MQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZV9leHBvcnQuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZV9leHBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjVkOGEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlX2V4cG9ydC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6OGJmMzAxNWFjMWFlZTAzMWE3Mjc3YTU2OTJlNTRmZjc1ZGI0ZGE4MGFlZDFmZGRmNGYwOGZiODIwMzEwZjBkNAorc2l6ZSAzOTg1CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlX2ltcG9ydC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlX2ltcG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzNjU0NgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGVfaW1wb3J0LmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo2MGUwZjA5NWNlMGNlYmNkN2I5YWI0ZjAyODg1NjUxZTQ0OTE5ZDhkMDE3NjQ1ZjcxMWM3NjU2Mjg4ZDgwNDc4CitzaXplIDQwODYKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2hlbHAuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfaGVscC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3NTA3NwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2hlbHAuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjUwNjYwMzFmMTQ2OGE0YTY3Zjk0NzZhOWIyYmU4OTY3NDZlOTQwOGJiYzU1YjRjMTJjMGY4YTRiZjk2MGFiZWEKK3NpemUgOTc0CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9vcHRpb25zLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X29wdGlvbnMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDM0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9vcHRpb25zLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjoyNzlkNTVhMmFlMmM2YTM5YWQ1Zjk1ZTVmMzYzN2I5ZGY1OGIzYWUwYmM2MTM1NWE4OGY0MDhhYTY1Y2YxNDk2CitzaXplIDEzNjMKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X3BvcHVwX3RyZWUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfcG9wdXBfdHJlZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5Y2ZhZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X3BvcHVwX3RyZWUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmI1ZDViYWVkOWFjNTZmYjQ4OTQxOWYxMzRkMDFjZmUwOGRkZDI2OGE4YjVlOGU5NzJhZjk1MmNiYWUwYTJmOGQKK3NpemUgMjQ0MTMKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYmFzZWNsYXNzLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYmFzZWNsYXNzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjYwOTdkCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL25ld19iYXNlY2xhc3MuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjkwZDVkMWZhZThjYWVkNjkwNmYxNDBhZmI0OTYxMDFjOTMwMjAwNDE4MzdiNzcwOThmZmM2MWIxZDMyZmZiMzYKK3NpemUgMTM0MTkKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYnVuZGxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYnVuZGxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDY4MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL25ld19idW5kbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjZjZGFkNzIwNTYyOTgyNmVlNTBkMzVjNTY0NTkxZWEwMWMxZTIyMmNkMzQ3ZjdmMTc1MGQ2NGZlZWU4YzY2MGQKK3NpemUgMTE2OTYKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9wcmVmZXJlbmNlc19kaWFsb2cuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ByZWZlcmVuY2VzX2RpYWxvZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYTFlMAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9wcmVmZXJlbmNlc19kaWFsb2cuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjIzMjBhNTE1ZjA3MjNmYmFkYTgwZWRmMjBjNDNjMmZkZTc4NWQyYTg1MWU3ZjBjYWYxMzRlOTQzZDg2MThmZjIKK3NpemUgNzE4NwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2J1bmRsZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19ncm91cHNfYnVuZGxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTMwOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2J1bmRsZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MzA0MmJiYTY5MTExM2NiMGRkNjAyMmRjODQxZDZkYzVkNmYzOGQyZTFhOWU5MmIzN2NiNjMxMjYxZjYwZDRmNAorc2l6ZSAxODA4NwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2ZpbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2ZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjM5YTUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19ncm91cHNfZmlsZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6ZGM2Y2JhNDJjODk0MTcxNmU1MjIzZTg5NzZkNmFmNDhmZjcxZDdhMTBiZDYyOTliNWM5MGYzZTkzMTBlODZhYworc2l6ZSAxOTM0MwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc2VhcmNoLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3NlYXJjaC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NjZmYwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3NlYXJjaC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MGZjNzY4ZDAyNjQwZTMzMTM1MmNkNWU0N2EyNzBmNzMwMjk5MGRkZTZkNjMzZTQ5ZDRmYzU0NWNkOTZlMmQzYgorc2l6ZSAyMTY4MQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfYnVuZGxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3N0YXRzX2J1bmRsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmZmViNQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3N0YXRzX2J1bmRsZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6YzU5YmJlMTk1ZWFlOTU3ZjA3YzMxZDMzNGFkODAwNmExZWJiMWMyNGQ3MzMzOTYzNzk3NTU4NTQxNzc3ZGQ2NAorc2l6ZSAxNzA5MApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfZmlsZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zdGF0c19maWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJiMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfZmlsZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6ODBlMzg1MTA2NmNlM2NhZDVkY2EzMmUyMjQ2NTMxY2ZjMzBhNDBhOThjODUxMzIwODM1NDMyMmM1MjA4Zjk2ZAorc2l6ZSAxNjUyNQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdHJlZV9iYXNpYy5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld190cmVlX2Jhc2ljLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODlkOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdHJlZV9iYXNpYy5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NjU2MGMyNWRjYmE2Nzk3NzA5MTU2ZWZiZWI0NzczMjZjNGI2ZDc2NTZhZjY3ODdmNTgwNmFkN2U3MjFlYWVkYworc2l6ZSAxNjMxMwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19idW5kbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19idW5kbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDcyMzgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2J1bmRsZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MGE4N2QzMTIzNmFlOTU1MjQyN2U2ZjZjYTJiNjJmMzFkMDgyZWMyZTMzNzM2M2RjZDk0MDMwYTczNTI4MDEzNQorc2l6ZSAxOTU1OApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19kaWFsb2cwLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZGlhbG9nMC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2YmM1MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZGlhbG9nMC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NGEyMzZlMDY1YTg5MGZhYjQ5ZTBjZGFkZGU3YzViMGZmMGE0ZTNjMzg1NjYyZmUwZmI1NzUyM2RhYTc1MjAyNworc2l6ZSA3MzY3CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2ZpbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19maWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg3NjgwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19maWxlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjoxNWQzMzk1NjFhMjI5M2MwMTQwNTE1NDBiMjA4YzQ0NjNiNDBiMWJlMzIyMWNhNWEwOTkyMmY2ZGY5N2E5NzNjCitzaXplIDI0MjMwCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc3BhY2VyLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zcGFjZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzVlM2MKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc3BhY2VyLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjozYjRjNjNjZTVlOGJiMzY3Y2M0ODYzMDcyZDlkMDFjZGJmZTExYjY1NzhmYTJmNjFmMTIwZjY2NjVhYmE1MGQzCitzaXplIDg3MApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjk1NzIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6M2NkZjhjMzgyMTM3N2IzMjkwNjViN2UzYjMyM2YxZDhhNDZlOWY0Nzc5M2QyMmI2ZjhiMTYzNGUzMmNmNWY0Mworc2l6ZSAxMjgKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU5MGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmNjM2M3MjRiMWQ1NDBiYmVhZWZjMjg0OWY1YjU1NTM5NDhjMjgxY2U5Zjg3ZTMzYzFlZjgwMDk1N2Q3Y2VlYjkKK3NpemUgODcKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZmQ3YWYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2Ojg4ODExZGNlZmQxNDMyMGRhOWVhZmNiMDA5MWQyYjExNDIwM2QwMDM2ZDU3YWQ5NzNlNjFlNDg0YWE2ZTY2MWUKK3NpemUgNzQ4CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfdS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfdS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmOGM0NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV91LmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo1ZGI3NzY5MjA4ZmZjYjk1NjMxZDk3MjdlNmZjOTNkODIwNzNlZWU1ZTdjMjZkYTc4OTQ5ZWNjMmEzN2EzYWI4CitzaXplIDkzCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTBjYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjowMDg5YmE5ZDQxZjBkNjIzNGQ2MjNhZWY5NjVmYWI0NGMxOTAwOTdjOTRjOTQ3MmZjZGM5OWFiZGQ1MTI0YmRmCitzaXplIDEwNjkKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2luZGV4Lmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjM1MjcKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJlc291cmNlIEJ1bmRsZSBNYW5hZ2VyPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6ICB1cmwoaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Imxvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Im1lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0idHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InNjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPgorICAgICAgPERJViBBTElHTj0iQ0VOVEVSIj4KKyAgICAgICAgPEgyPldlbGNvbWUgdG8gUmVzb3VyY2UgQnVuZGxlIE1hbmFnZXIgKHYwLjYpPC9IMj4KKyAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+PElNRyBTUkM9ImltYWdlcy9zY3JlZW5zaG90cy9tYWluX3BhZ2UuZ2lmIj48L1A+CisgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPlRoZXNlIHBhZ2VzIGFyZSBtZWFudCB0byBoZWxwIHlvdSBhbmQgeW91ciBkZXZlbG9wbWVudCAKKyAgICAgICAgICB0ZWFtIGdldCBzdGFydGVkIHdpdGggdGhpcyB0cmFuc2xhdGlvbiBtYW5hZ2VtZW50IHRvb2wuPC9QPgorICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5UaGUgdG9vbCB3YXMgZGV2ZWxvcGVkIHRvIGJlIGVhc3kgdG8gdXNlIGFuZCBpbnR1dGl0aXZlLiAKKyAgICAgICAgICBJZiB5b3UgYWxsIHJlYWR5IHVuZGVyc3RhbmQgdGhlIHByb2Nlc3Mgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIAorICAgICAgICAgIGp1c3Qgd2FudCB0byBsZWFybiBob3cgdGhpcyB0b29sIGNhbiBiZSB1c2VkIHRvIG1ha2UgeW91ciBlZmZvcnRzIG1vcmUgCisgICAgICAgICAgZWZmaWNpZW50IGFuZCBsZXNzIGVycm9yIHByb25lIGdvIHN0cmFpZ2h0IHRvIHRoZSA8QSBIUkVGPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5zdGVwLWJ5LXN0ZXAgCisgICAgICAgICAgdHV0b3JpYWw8L0E+LCA8QSBIUkVGPSJ2aWV3cy9pbmRleC5odG1sIj5mdW5jdGlvbnMgYW5kIHZpZXdzPC9BPiwgb3IgCisgICAgICAgICAgPEEgSFJFRj0iZmFxLmh0bWwiPmZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb25zPC9BPi4gSWYgeW91IGFyZSBuZXcgdG8gCisgICAgICAgICAgaW50ZXJuYXRpb25hbGl6YXRpb24gaW4gZGV2ZWxvcG1lbnQsIHlvdSBtYXkgd2FudCB0byBmaXJzdCBjaGVjayBvdXQgCisgICAgICAgICAgdGhpczxBIEhSRUY9Imh0dHA6Ly93d3ctMTA2LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9qLXJibWdyL2luZGV4Lmh0bWwiPiAKKyAgICAgICAgICBpbnRyb2R1Y3Rpb24gdG8gaW50ZXJuYXRpb25hbGl6YXRpb248L0E+LjwvUD4KKyAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SWYgeW91IHdvdWxkIGxpa2UgdG8gcmVwb3J0IGEgYnVnLCBmZWVsIGZyZWUgdG8KKyAgICAgICAgICA8QSBIUkVGPSJodHRwOi8vd3d3Lmp0Y3N2LmNvbS9jZ2liaW4vaWN1LWJ1Z3MvIj5zdWJtaXQgYSBidWcgdG8gb3VyCisgICAgICAgICAgYnVnIGRhdGFiYXNlPC9BPi48L1A+CisgICAgICA8L0RJVj4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorPCEtLQorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMiI+CisgIDxUUj4KKyAgICA8VEQgV0lEVEg9IjIwMCIgQkdDT0xPUj0iI0NDQ0NGRiI+Jm5ic3A7PC9URD4KKyAgICA8VEQ+CisgICAgICA8RElWIEFMSUdOPSJDRU5URVIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgV0lEVEg9IjE3NSIgSEVJR0hUPSI1MCI+PC9ESVY+CisgICAgPC9URD4KKyAgPC9UUj4KKyAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgPFREIFdJRFRIPSIyMDAiIEJHQ09MT1I9IiNDQ0NDRkYiPiAKKyAgICAgIDxQPjxBIEhSRUY9ImluZGV4Lmh0bWwiPlJCTWFuYWdlcjwvQT48L1A+CisgICAgICA8UD48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPlJCUmVwb3J0ZXI8L0E+PC9QPgorICAgICAgPFA+PEEgSFJFRj0iLi4vdHV0b3JpYWwvc3RlcDEuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L1A+CisgICAgICA8UD48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvUD4KKyAgICAgIDxQPlRvcGljczwvUD4KKyAgICAgIDxVTD4KKyAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlN0ZXAtYnktc3RlcCBUdXRvcmlhbDwvQT48L0xJPgorICAgICAgICA8TEk+PEEgSFJFRj0ic3RlcDEuaHRtbCI+Q2hhbmdpbmcgUHJlZmVuY2VzPC9BPjwvTEk+CisgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2UgRmVhdHVyZXM8L0E+PC9MST4KKyAgICAgIDwvVUw+CisgICAgPC9URD4KKyAgICA8VEQ+PC9URD4KKyAgPC9UUj4KKzwvVEFCTEU+CistLT4KKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2xvb2thbmRmZWVsLmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9sb29rYW5kZmVlbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTYwMTYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9sb29rYW5kZmVlbC5odG1sCkBAIC0wLDAgKzEsMTE5IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCTWFuYWdlciAtIExvb2sgYW5kIEZlZWw8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogIHVybChpbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSJpbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InN5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InR1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ2aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJ0dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPkxvb2sgYW5kIEZlZWw8L0gzPgorICAgICAgPFA+UkIgTWFuYWdlciBpcyB3cml0dGVuIHB1cmVseSBpbiBKYXZhLCBhbmQgdGhlcmVmb3JlIGlzIGEgY3Jvc3MtcGxhdGZvcm0gCisgICAgICAgIGFwcGxpY2F0aW9uLiBVc2luZyB0aGUgUHJlZmVyZW5jZXMgbWVudSBpdGVtLCB0aGUgbG9vayBhbmQgZmVlbCBvZiB0aGUgCisgICAgICAgIGFwcGxpY2F0aW9uIGNhbiBiZSBjaGFuZ2VkIHRvIGFueSBvbmUgb2YgdGhlIGxvb2sgYW5kIGZlZWxzIHN1cHBvcnRlZCAKKyAgICAgICAgYnkgdGhlIHZpcnR1YWwgbWFjaGluZSBydW5uaW5nIG9uIHRoZSBzeXN0ZW0uPC9QPgorICAgICAgPFA+VGhpcyBwYWdlIHNob3dzIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRoZSBzeXN0ZW0gbG9va3MgdW5kZXIgZm91ciBjb21tb24gCisgICAgICAgIGxvb2sgYW5kIGZlZWxzOiA8QSBIUkVGPSIjV2luZG93cyI+V2luZG93czwvQT4sIDxBIEhSRUY9IiNNZXRhbCI+TWV0YWw8L0E+LCAKKyAgICAgICAgPEEgSFJFRj0iI01hYyI+TWFjIE9TWCAoYXF1YSk8L0E+LCBhbmQgPEEgSFJFRj0iI01vdGlmIj5Nb3RpZjwvQT4uPC9QPgorICAgICAgPFA+PEI+PGEgbmFtZT0iV2luZG93cyI+V2luZG93czwvQT48L0I+PC9QPgorICAgICAgPFA+PElNRyBTUkM9ImltYWdlcy9zY3JlZW5zaG90cy9sYWZfd2luZG93cy5naWYiIFdJRFRIPSI2MDAiIEhFSUdIVD0iNDQ0Ij48L1A+CisgICAgICA8UD48Qj48YSBuYW1lPSJNZXRhbCI+TWV0YWw8L0E+PC9CPjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21ldGFsLmdpZiIgV0lEVEg9IjYwMCIgSEVJR0hUPSI0NDQiPjwvUD4KKyAgICAgIDxQPjxCPjxhIG5hbWU9Ik1hYyI+TWFjIE9TWCAoYXF1YSk8L0E+PC9CPjwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPjxCPjxhIG5hbWU9Ik1vdGlmIj5Nb3RpZjwvQT48L0I+PC9QPgorICAgICAgPFA+PElNRyBTUkM9ImltYWdlcy9zY3JlZW5zaG90cy9sYWZfbW90aWYuZ2lmIiBXSURUSD0iNjAwIiBIRUlHSFQ9IjQ0NCI+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL21lbnUuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL21lbnUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGFjNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvbWVudS5odG1sCkBAIC0wLDAgKzEsMjU3IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgLSBNZW51IEl0ZW1zPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6ICB1cmwoaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Imxvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Im1lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0idHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InNjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMiBBTElHTj0iQ0VOVEVSIj5SQiBNYW5hZ2VyIC0gTWVudSBJdGVtczwvSDI+CisgICAgICA8VEFCTEUgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjIiPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+IAorICAgICAgICAgICAgPFA+PEI+VGhlIEZpbGUgTWVudTwvQj48L1A+CisgICAgICAgICAgPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlLmdpZiIgV0lEVEg9IjI1OCIgSEVJR0hUPSIyMTkiIFZTUEFDRT0iNSIgSFNQQUNFPSI1Ij48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+TmV3IFJlc291cmNlIEJ1bmRsZS4uLjwvST48L1REPgorICAgICAgICAgIDxURD5DcmVhdGUgYSBuZXcgcmVzb3VyY2UgYnVuZGxlLiBZb3Ugd2lsbCBuZWVkIHRvIHNlbGVjdCB0aGUgYmFzZSBjbGFzcyAKKyAgICAgICAgICAgIG5hbWUgZm9yIHRoaXMgYnVuZGxlLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5PcGVuIFJlc291cmNlIEJ1bmRsZS4uLjwvST48L1REPgorICAgICAgICAgIDxURD5TZWxlY3QgYSByZXNvdXJjZSBidW5kbGUgZnJvbSB0aGUgZmlsZSBzeXNldGVtLiBUaGUgYnVuZGxlIHNob3VsZCAKKyAgICAgICAgICAgIGhhdmUgYmVlbiBvbmUgY3JlYXRlZCBieSBSQiBNYW5hZ2VyLCBvdGhlcndpc2UgdXNlIHRoZSBNZXJnZSBvcHRpb24uPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPlNhdmUgUmVzb3VyY2UgQnVuZGxlPC9JPjwvVEQ+CisgICAgICAgICAgPFREPlNhdmUgdGhlIGJ1bmRsZSB0byB0aGUgZmlsZSBzeXN0ZW0uPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPlNhdmUgUmVzb3VyY2UgQnVuZGxlIEFzLi4uPC9JPjwvVEQ+CisgICAgICAgICAgPFREPlNhdmUgdGhlIHJlc291cmNlIGJ1bmRsZSBpbiBhIHNlbGVjdGVkIGxvY2F0aW9uIHdpdGhpbiB0aGUgZmlsZSAKKyAgICAgICAgICAgIHN5c3RlbS48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+PElNRyBTUkM9ImltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGVfaW1wb3J0LmdpZiIgV0lEVEg9IjQ1NCIgSEVJR0hUPSIyMTkiIFZTUEFDRT0iNSIgSFNQQUNFPSI1Ij48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+PEI+TWVyZ2UgVG8gUmVzb3VyY2UgQnVuZGxlPC9CPjwvST48L1REPgorICAgICAgICAgIDxURD5JbXBvcnQgcmVzb3VyY2UgYnVuZGxlcyBmcm9tIGRpZmZlcmVudCBmb3JtYXRzIGFuZCBtZXJnZSB0aGVtIHdpdGggCisgICAgICAgICAgICB0aGUgY3VycmVudGx5IG9wZW4gcmVzb3VyY2UgYnVuZGxlLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST48SU1HIFNSQz0iaW1hZ2VzL2Fycm93X2J1bGxldC5naWYiIFdJRFRIPSIxMiIgSEVJR0hUPSIxMCI+U2ltcGxlIAorICAgICAgICAgICAgUmVzb3VyY2UgQnVuZGxlcy4uLjwvST48L1REPgorICAgICAgICAgIDxURD5JbXBvcnQgZnJvbSBvdGhlciByZXNvdXJjZSBidW5kbGVzIG1hZGUgdXAgb2YgLnByb3BlcnRpZXMgdGV4dCBmaWxlcyAKKyAgICAgICAgICAgIGNyZWF0ZWQgYnkgUkIgTWFuYWdlciBvciBub3QuPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPjxJTUcgU1JDPSJpbWFnZXMvYXJyb3dfYnVsbGV0LmdpZiIgV0lEVEg9IjEyIiBIRUlHSFQ9IjEwIj5UTVggCisgICAgICAgICAgICBEb2N1bWVudHMuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+SW1wb3J0IGZyb20gWE1MIGRvY3VtZW50cyB0aGF0IGNvbmZvcm0gdG8gdGhlIFRNWCBzcGVjaWZpY2F0aW9uIAorICAgICAgICAgICAgY3JlYXRlZCBieSB0aGUgTElTQSBncm91cC48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+PElNRyBTUkM9ImltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGVfZXhwb3J0LmdpZiIgV0lEVEg9IjQzOSIgSEVJR0hUPSIyMTkiIFZTUEFDRT0iNSIgSFNQQUNFPSI1Ij48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+PEI+RXhwb3J0IFJlc291cmNlIEJ1bmRsZXM8L0I+PC9JPjwvVEQ+CisgICAgICAgICAgPFREPlNhdmUgdGhlIHRyYW5zbGF0aW9ucyBpbiBvdGhlciBmb3JtYXRzLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST48SU1HIFNSQz0iaW1hZ2VzL2Fycm93X2J1bGxldC5naWYiIFdJRFRIPSIxMiIgSEVJR0hUPSIxMCI+Q29tcGlsYWJsZSAKKyAgICAgICAgICAgIEphdmEgRmlsZXMuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+RXhwb3J0IHRvIGNvbXBpbGFibGUgamF2YSBjbGFzcyBmaWxlcyB0aGF0IGV4dGVuZCB0aGUgTGlzdFJlc291cmNlQnVuZGxlIAorICAgICAgICAgICAgY2xhc3MuIDwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST48SU1HIFNSQz0iaW1hZ2VzL2Fycm93X2J1bGxldC5naWYiIFdJRFRIPSIxMiIgSEVJR0hUPSIxMCI+TWluaW1hbCAKKyAgICAgICAgICAgIFByb3BlcnRpZXMgRmlsZXMuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+RXhwb3J0IHRvIC5wcm9wZXJ0aWVzIHRleHQgZmlsZXMganVzdCBhcyBpbiB0aGUgU2F2ZSBvcHRpb24sIGV4Y2VwdCAKKyAgICAgICAgICAgIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBzdHJpcHBlZCBvZiBhbGwgdW5uZWNlc3NhcnkgbWV0YSBkYXRhLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST48SU1HIFNSQz0iaW1hZ2VzL2Fycm93X2J1bGxldC5naWYiIFdJRFRIPSIxMiIgSEVJR0hUPSIxMCI+VE1YIAorICAgICAgICAgICAgRG9jdW1lbnRzLi4uPC9JPjwvVEQ+CisgICAgICAgICAgPFREPkV4cG9ydCB0byBYTUwgZG9jdW1lbnRzIHRoYXQgY29uZm9ybSB0byB0aGUgVE1YIHNwZWNpZmljYXRpb24gY3JlYXRlZCAKKyAgICAgICAgICAgIGJ5IHRoZSBMSVNBIGdyb3VwLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48SU1HIFNSQz0iaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIxNSIgSEVJR0hUPSIxNSI+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxCPlRoZSBPcHRpb25zIE1lbnU8L0I+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9vcHRpb25zLmdpZiIgV0lEVEg9IjIxMSIgSEVJR0hUPSIxMTEiIFZTUEFDRT0iNSIgSFNQQUNFPSI1Ij48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+QWRkIE5ldyBFbnRyeS4uLjwvST48L1REPgorICAgICAgICAgIDxURD5DcmVhdGUgYSBuZXcgcmVzb3VyY2UgZm9yIHRoZSBlbnRpcmUgcmVzb3VyY2UgYnVuZGxlLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5BZGQgTmV3IEdyb3VwLi4uPC9JPjwvVEQ+CisgICAgICAgICAgPFREPkNyZWF0ZSBhIG5ldyByZXNvdXJjZSBncm91cCBmb3IgdGhlIGVudGlyZSByZXNvdXJjZSBidW5kbGUuPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPkFkZCBOZXcgUmVzb3VyY2UgRmlsZS4uLjwvST48L1REPgorICAgICAgICAgIDxURD5DcmVhdGUgYSBuZXcgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZS4gT3B0aW9uYWxseSBzZWxlY3QgCisgICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCB0byBwb3B1bGF0ZSB0aGlzIGZpbGUgd2l0aCBjdXJyZW50bHkgZGVmaW5lZCByZXNvdXJjZXMuPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPlByZWZlcmVuY2VzLi4uPC9JPjwvVEQ+CisgICAgICAgICAgPFREPkJyaW5nIHVwIHRoZSBwcmVmZXJlbmNlcyBkaWFsb2cgYm94LjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48SU1HIFNSQz0iaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIxNSIgSEVJR0hUPSIxNSI+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxCPlRoZSBIZWxwIE1lbnU8L0I+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9oZWxwLmdpZiIgV0lEVEg9IjM1MyIgSEVJR0hUPSI0NiIgVlNQQUNFPSI1IiBIU1BBQ0U9IjUiPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5BYm91dCBSZXNvdXJjZSBCdW5kbGUgTWFuYWdlci4uLjwvST48L1REPgorICAgICAgICAgIDxURD5CcmluZ3MgdXAgYSBkaWFsb2cgYm94IGRpc3BsYXlpbmcgdGhlIHZlcnNpb24gb2YgUkIgTWFuYWdlciBhbmQgCisgICAgICAgICAgICBvdGhlciBpbmZvcm1hdGlvbi48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMTUiIEhFSUdIVD0iMTUiPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48Qj5UaGUgUmVzb3VyY2UgRmlsZSBQb3B1cCBNZW51PC9CPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48SU1HIFNSQz0iaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfcG9wdXBfdHJlZS5naWYiIFdJRFRIPSI2NzEiIEhFSUdIVD0iNTQzIiBWU1BBQ0U9IjUiIEhTUEFDRT0iNSI+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPjxCPlJlc291cmNlIEZpbGUgUG9wdXAgTWVudTwvQj48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+UG9wcyB1cCBmcm9tIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+U2F2ZSBSZXNvdXJjZSBGaWxlPC9JPjwvVEQ+CisgICAgICAgICAgPFREPlNhdmUgb25seSB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgZmlsZSB0byB0aGUgZmlsZSBzeXN0ZW0uPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPkhpZGUgUmVzb3VyY2UgRmlsZTwvST48L1REPgorICAgICAgICAgIDxURD5SZW1vdmUgdGhlIHNlbGVjdGVkIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIHRyZWUuIAorICAgICAgICAgICAgQWxsIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBidW5kbGUgd2lsbCBub3QgYWZmZWN0IHRoaXMgZmlsZS4gVGhpcyB3aWxsIAorICAgICAgICAgICAgYWxzbyByZW1vdmUgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgZmlsZSBzaW5jZSBsYXN0IHNhdmluZyBpdC48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+RGVsZXRlIFJlc291cmNlIEZpbGU8L0k+PC9URD4KKyAgICAgICAgICA8VEQ+SWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYWxsb3dzLCBkZWxldGVzIHRoZSByZXNvdXJjZSBmaWxlIGZyb20gdGhlIAorICAgICAgICAgICAgZmlsZSBzeXN0ZW0uIFRoaXMgaXMgYSBwZXJtYW5lbnQgY2hhbmdlIGFuZCBjYW4gbm90IGJlIHVuZG9uZS48L1REPgorICAgICAgICA8L1RSPgorICAgICAgPC9UQUJMRT4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDxQPiZuYnNwOzwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9zY2FuZmlsZS5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvc2NhbmZpbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFiMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvc2NhbmZpbGUuaHRtbApAQCAtMCwwICsxLDE5NSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQlJlcG9ydGVyIFNjYW4gRmlsZTwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiAgdXJsKGltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSJpbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9ImltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJsb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJtZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InR1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDEgQUxJR049IkNFTlRFUiI+UkJSZXBvcnRlciBTY2FuIFhNTCBDb25maWd1cmF0aW9uIEZpbGU8L0gxPgorICAgICAgPFA+PEI+SW50cm9kdWN0aW9uPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIFJCUmVwb3J0ZXIgc2NhbnMgaXMgYSB0ZXh0IGZpbGUgc3RvcmVkIGluIAorICAgICAgICBYTUwuIFRoZSBkZXNpZ24gb24gdGhlIGZvcm1hdCBmb3IgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgd2FzIGtlcHQgc2ltcGxlIAorICAgICAgICBhbmQgc28gdGhlIGdlbmVyYWwgYXBwbGljYXRpb24gb2YgdGhlIHNjYW5uZXIgaXMgbm90IG1lYW50IGZvciBjb21wbGljYXRlZCAKKyAgICAgICAgYW5hbHlzaXMuIFRoZSBkZXNpZ24gd29ya3MgYXJvdW5kIHRocmVlIHR5cGVzIG9mIHJ1bGVzOiBEaXJlY3RvcnkgUnVsZXMsIAorICAgICAgICBGaWxlIFJ1bGVzLCBhbmQgUGFyc2UgUnVsZXMuIEVhY2ggb2YgdGhlc2Ugd2lsbCBiZSBleHBsYWluZWQgYmVsb3cuIEZpcnN0LCAKKyAgICAgICAgaGVyZSBpcyBhbiBleGFtcGxlIGZpbGUgZm9yIHJlZmVyZW5jZS4gVGhpcyBmaWxlIGlzIHRoZSBjb25maWd1cmF0aW9uIAorICAgICAgICBmaWxlIHVzZWQgdG8gc2NhbiB0aGUgcmVzb3VyY2UgYnVuZGxlIGFzc29jaWF0ZWQgd2l0aCBSQk1hbmFnZXIuPC9QPgorICAgICAgPFA+PEI+U2FtcGxlIFNjYW4gRmlsZSA8L0I+KHJibWFuYWdlcl9zY2FuLnhtbDxCPik8L0I+PC9QPgorICAgICAgPEJMT0NLUVVPVEU+PENPREU+CisgICAgICAgIDxQUkU+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiID8+CismbHQ7UkJGSUxFU0NBTk5FUiBOQU1FPSJSQk1hbmFnZXIgU2Nhbm5lciIgRklMRU5BTUU9InJibWFuYWdlcl9zY2FubmVyLnhtbCI+CisJJmx0O0ZJTEVSVUxFUz4KKwkJJmx0OyEtLSAgRmlsZVJ1bGVzIGNhbiBoYXZlIGF0dHJpYnV0ZXMgc3RhcnRzX3dpdGgsIGVuZHNfd2l0aCwgYW5kIGNvbnRhaW5zIC0tPgorCQkmbHQ7RklMRVJVTEUgTkFNRT0iSmF2YSBGaWxlIiBFTkRTX1dJVEg9Ii5qYXZhIiAvPgorCQkmbHQ7RklMRVJVTEUgTkFNRT0iWFNMIEZpbGUiIEVORFNfV0lUSD0iLnhzbCIgLz4KKwkmbHQ7L0ZJTEVSVUxFUz4KKwkmbHQ7UEFSU0VSVUxFUz4KKwkJJmx0OyEtLSAgUGFyc2VSdWxlcyBjYW4gaGF2ZSBhdHRyaWJ1dGVzIGZvbGxvd3MgYW5kIHByZWNlZGVzIC0tPiAKKwkJJmx0O1BBUlNFUlVMRSBOQU1FPSJKYXZhIHN0YXRpYyByZXNvdXJjZSIgRk9MTE9XUz0iUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCZhbXA7cXVvdDsiIFBSRUNFREVTPSImYW1wO3F1b3Q7IiAvPiAKKwkmbHQ7L1BBUlNFUlVMRVM+CisJJmx0O1NDQU4+CisJCSZsdDtESVJFQ1RPUlkgTE9DQVRJT049IlxDOlxEZXZlbG9wbWVudFxSQk1hbmFnZXJcU291cmNlIiBSRUNVUlNFX0RJUkVDVE9SSUVTPSJ0cnVlIj4gCisJCQkmbHQ7UlVMRVM+CisJCQkJJmx0O0FQUExZRklMRVJVTEUgTkFNRT0iSmF2YSBGaWxlIj4KKwkJCQkJJmx0O0FQUExZUEFSU0VSVUxFIE5BTUU9IkphdmEgc3RhdGljIHJlc291cmNlIiAvPgorCQkJCSZsdDsvQVBQTFlGSUxFUlVMRT4KKwkJCSZsdDsvUlVMRVM+CisJCSZsdDsvRElSRUNUT1JZPgorCSZsdDsvU0NBTj4KKyZsdDsvUkJGSUxFU0NBTk5FUj4KKyAgICAgICAgPC9QUkU+CisgICAgICAgIDwvQ09ERT48L0JMT0NLUVVPVEU+Cis8UD48Qj5EZXRhaWxzPC9CPjwvUD4KKyAgICAgIDxQPlRoZSByb290IGVsZW1lbnQgb2YgdGhlIFhNTCBmaWxlIGlzIG5hbWVkICdSQkZJTEVTQ0FOTkVSJy4gVGhpcyByb290IAorICAgICAgICBlbGVtZW50IGhhcyB0d28gb3B0aW9uYWwgYXR0cmlidXRlcyBmb3IgbmFtaW5nIHRoZSBzY2FuIGZpbGUgaW4gYSBodW1hbiAKKyAgICAgICAgcmVhZGFibGUgbWFubmVyIGFuZCBzcGVjaWZ5aW5nIHRoZSBmaWxlIG5hbWUuIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIGZvciAKKyAgICAgICAgdGhlIGRldmVsb3BlcnMgcmVmZXJlbmNlOyB0aGV5IG1lYW4gbm90aGluZyB0byBSQlJlcG9ydGVyLiBCZW5lYXRoIHRoZSAKKyAgICAgICAgcm9vdCBlbGVtZW50IGFyZSB0aHJlZSByZXF1aXJlZCBlbGVtZW50cyAnRklMRVJVTEVTJywgJ1BBUlNFUlVMRVMnIGFuZCAKKyAgICAgICAgJ1NDQU4nLiA8L1A+CisgICAgICA8UD5CZW5lYXRoIHRoZSBGSUxFUlVMRVMgZWxlbWVudCBhcmUgZm91bmQgRklMRVJVTEUgZWxlbWVudHMuIEFueSBudW1iZXIgCisgICAgICAgIG9mIHRoZXNlIHJ1bGVzIGNhbiBiZSBzcGVjaWZpZWQsIHRob3VnaCBlYWNoIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lIGFzIAorICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQncyBOQU1FIGF0dHJpYnV0ZS4gQWxvbmcgd2l0aCB0aGlzIG5hbWUgYXR0cmlidXRlLCAKKyAgICAgICAgdGhlIGF0dHJpYnV0ZXMgU1RBUlRTX1dJVEgsIEVORFNfV0lUSCwgYW5kIENPTlRBSU5TIG1heSBiZSBvcHRpb25hbGx5IAorICAgICAgICBzcGVjaWZpZWQuIFRoZXNlIGFyZSB0aGUgcnVsZXMgYXBwbGllZCB0byBlYWNoIGZpbGUgaW4gYSBkaXJlY3RvcnkgdG8gCisgICAgICAgIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGV5IHdpbGwgYmUgc2Nhbm5lZC4gVGhlIGF0dHJpYnV0ZSBydWxlcyBhcmUgCisgICAgICAgIGFwcGxpZWQgdG8gdGhlIGZpbGUgbmFtZXMgb2YgZWFjaCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgYW5kIGlmIGVhY2ggaXMgCisgICAgICAgIGZvdW5kIHRvIGJlIHRydWUsIHRoYXQgZmlsZSBpcyBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgcGFyc2UgcnVsZXMuPC9QPgorICAgICAgPFA+QmVuZWF0aCB0aGUgUEFSU0VSVUxFUyBlbGVtZW50IGFyZSBmb3VuZCBQQVJTRVJVTEUgZWxlbWVudHMuIEFueSBudW1iZXIgCisgICAgICAgIG9mIHRoZXNlIHJ1bGVzIGNhbiBiZSBzcGVjaWZpZWQsIHRob3VnaCBlYWNoIG11c3QgaGF2ZSBhIHVuaXF1ZXMgbmFtZSAKKyAgICAgICAgYXMgc3BlY2lmaWVkbiBpbiB0aGUgZWxlbWVudCdzIE5BTUUgYXR0cmludXRlLiBBbG9uZyB3aXRoIHRoaXMgbmFtZSBhdHRyaWJ1dGUsIAorICAgICAgICB0aGUgYXR0cmlidXRlcyBGT0xMT1dTIGFuZCBQUkVDRURFUyBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIFRoZXNlIAorICAgICAgICBhcmUgdGhlIHJ1bGVzIGFwcGxpZWQgdG8gZWFjaCBsaW5lIG9mIHRleHQgaW4gYSBzZWxlY3RlZCBmaWxlIHRvIGRldGVybWluZSAKKyAgICAgICAgaWYgdGhhdCBsaW5lIG9mIHRleHQgY29udGFpbnMgb25lIG9yIG1vcmUgcmVzb3VyY2Uga2V5cy48L1A+CisgICAgICA8UD5CZW5lYXRoIHRoZSBTQ0FOIGVsZW1lbnQgYXJlIGZvdW5kIERJUkVDVE9SWSBlbGVtZW50cy4gQW55IG51bWJlciBvZiAKKyAgICAgICAgdGhlc2UgZWxlbWVudHMgY2FuIGJlIHNwZWNpZmllZC4gVGhlIHJlcXVpcmVkIExPQ0FUSU9OIGF0dHJpYnV0ZSBzcGVjaWZpZXMgCisgICAgICAgIGluIGEgbWFjaGluZSBkZXBlbmRlbnQgbWFubmVyIHRoZSBsb2NhdGlvbiBvZiBhIGRpcmVjdG9yeSBmb3Igd2hpY2ggdGhlIAorICAgICAgICBmaWxlcyBhcmUgdG8gYmUgc2Nhbm5lZCBmb3IgcmVzb3VyY2UgYnVuZGxlcy4gQW4gb3B0aW9uYWwgUkVDVVJTRV9ESVJFQ1RPUklFUyAKKyAgICAgICAgYXR0cmlidXRlIG1heSBiZSBzcGVjaWZpZWQuIElmIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gJ3RydWUnLCAKKyAgICAgICAgdGhlbiBhbGwgZGlyZWN0b3JpZXMgYmVuZWF0aCB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBhcmUgYWxzbyBzY2FubmVkLjwvUD4KKyAgICAgIDxQPkJlbmVhdGggZWFjaCBESVJFQ1RPUlkgZWxlbWVudCwgZXhhY3RseSBvbmUgUlVMRVMgZWxlbWVudHMgY2FuIGJlIHNwZWNpZmllZC5CZW5lYXRoIAorICAgICAgICB0aGlzIGVsZW1lbnQsIGFueSBudW1iZXIgb2YgQVBQTFkgRklMRSBSVUxFIGVsZW1lbnRzIG1heSBiZSBzcGVjaWZpZWQuIAorICAgICAgICBUaGUgcmVxdWlyZWQgTkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIG9mIHRoZSBmaWxlIHJ1bGVzIGRlZmluZWQgCisgICAgICAgIHByZXZpb3VzbHkgYXJlIHRvIGJlIGFwcGxpZWQuIEJlbmVhdGggdGhlc2UgZWxlbWVudCBhbnkgbnVtYmVyIG9mIEFQUExZUEFSU0VSVUxFIAorICAgICAgICBlbGVtZW50cyBtYXkgYmUgc3BlY2lmaWVkLiBUaGUgcmVxdWlyZWQgTkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIAorICAgICAgICBvZiB0aGUgcGFyc2UgcnVsZXMgZGVmaW5lZCBwcmV2aW91c2x5IGFyZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBmaWxlcyBhY2NlcHRlZCAKKyAgICAgICAgYnkgdGhlIHBhcmVudCBmaWxlIHJ1bGUuPC9QPgorICAgICAgPFA+PEI+VGhlIEV4YW1wbGUgRmlsZSBFeHBsYWluZWQ8L0I+PC9QPgorICAgICAgPFA+R2l2ZW4gdGhlIGRldGFpbHMgb2YgdGhlIGZpbGUgc3RydWN0dXJlLCB3ZSBjYW4gbm93IGV4YW1pbmUgaG93IHRoZSBleGFtcGxlIAorICAgICAgICBmaWxlIHNwZWNpZmllcyB3aGljaCBmaWxlcyB0byBzY2FuLCBhbmQgdGhlbiBob3cgaXQgc3BlY2lmaWVzIGhvdyB0byBmaW5kIAorICAgICAgICB0aGUgcmVzb3VyY2Uga2V5cyBjb250YWluZWQgaW4gdGhvc2UgZmlsZXMuPC9QPgorICAgICAgPFA+UkJSZXBvcnRlciBmaXJzdCBiZWdpbnMgYnkgZ29pbmcgdGhyb3VnaCBlYWNoIG9mIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQuIAorICAgICAgICBJbiB0aGUgZXhhbXBsZSBmaWxlIGNhc2UsIHRoZXJlIGlzIG9ubHkgb25lIGRpcmVjdG9yeS4gSXQgdGhlbiBnb2VzIHRocm91Z2ggCisgICAgICAgIGVhY2ggb2YgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGF0IGRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzIGxvb2tpbmcgCisgICAgICAgIGZvciBmaWxlcyB0aGF0IHBhc3MgdGhlICdKYXZhIEZpbGUnIGZpbGUgdGVzdC4gVGhlICdKYXZhIEZpbGUnIHRlc3Qgc2ltcGx5IAorICAgICAgICBjaGVja3MgdGhlIGZpbGUgbmFtZSB0byBzZWUgaWYgaXQgZW5kcyBpbiB0aGUgZXh0ZW5zaW9uICcuamF2YScuIElmIHRoZSAKKyAgICAgICAgZmlsZSBoYXMgc3VjaCBhbiBleHRlbnNpb24gdGhlIHBhcnNlIHJ1bGUgJ0phdmEgc3RhdGljIHJlc291cmNlJyBpcyBhcHBsaWVkIAorICAgICAgICB0byBldmVyeSBsaW5lIG9mIHRleHQgd2l0aGluIHRoYXQgZmlsZS48L1A+CisgICAgICA8UD5UaHVzIGlmIHRoZSBmb2xsb3dpbmcgZmlsZSwgbmFtZWQgU2FtcGxlLmphdmEsIHdlcmUgdG8gYmUgZm91bmQgaW4gdGhlIAorICAgICAgICBkaXJlY3RvcnkuIFRoZSB0d28gcmVzb3VyY2Uga2V5cyAnSGVsbG8nIGFuZCAnV29ybGQnIHdvdWxkIGJlIGZvdW5kLjwvUD4KKyAgICAgICAgPGJsb2NrcXVvdGU+PGNvZGU+CisgICAgICAgICAgPHByZT4KK3B1YmxpYyBjbGFzcyBTYW1wbGUgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigmcXVvdDtIZWxsbyZxdW90OykgKyAmcXVvdDsgJnF1b3Q7ICsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCZxdW90V29ybGQmcXVvdDspKTsKKwl9Cit9Cis8L3ByZT4KKyAgICAgICAgICA8L2NvZGU+PC9ibG9ja3F1b3RlPgorCisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MWMwZjkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwKQEAgLTAsMCArMSwxMDggQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+VGVtcGxhdGU8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogIHVybChpbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSJpbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InN5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InR1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ2aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJ0dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+CisgICAgICA8SDMgQUxJR049IkNFTlRFUiI+U3lzdGVtIFJlcXVpcmVtZW50czwvSDM+CisgICAgICA8UD5SQiBNYW5hZ2VyIHdpbGwgcnVuIG9uIGFueSBwbGF0Zm9ybSBzdXBwb3J0aW5nIEphdmEgMS40IG9yIGhpZ2hlci4gSXQgCisgICAgICAgIGhhcyBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzIE5ULCBXaW5kb3dzIDIwMDAsIExpbnV4LCBhbmQgTWFjIE9TIFguIEl0IGlzIAorICAgICAgICByZWNvbW1lbmRlZCB0aGF0IHRoZSBtYWNoaW5lIHJ1bm5pbmcgUkIgTWFuYWdlciBoYXZlIGF0IGxlYXN0IDY0IE1CIG9mIAorICAgICAgICBtZW1vcnkuPC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDA0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL2luZGV4Lmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODFlNjQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTU5IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgVHV0b3JpYWw8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKC4uL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3ZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9sb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9tZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InN0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9SQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8RElWIEFMSUdOPSJDRU5URVIiPiAKKyAgICAgICAgPEgyPlN0ZXAtYnktc3RlcCBUdXRvcmlhbDwvSDI+CisgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPlRoaXMgdHV0b3JpYWwgdGFrZXMgeW91IHN0ZXAgYnkgc3RlcCB0aHJvdWdoIHRoZSBwcm9jZXNzIAorICAgICAgICAgIG9mIGNyZWF0aW5nIGEgcmVzb3VyY2UgYnVuZGxlIGFuZCBtYW5hZ2luZyB0aGUgdHJhbnNsYXRpb25zIHlvdSBuZWVkIAorICAgICAgICAgIGZvciB5b3VyIGFwcGxpY2F0aW9uIG9yIHdlYiBiYXNlZCBpbnRlcmZhY2VzLiBZb3UgbWF5IGJlZ2luIHdpdGggdGhlIAorICAgICAgICAgIGZpcnN0IHN0ZXAsIG9yIHNlbGVjdCBmcm9tIGFueSBvZiB0aGUgc3RlcHMgbGlzdGVkIGJlbG93LiBUaGUgdHV0b3JpYWwgCisgICAgICAgICAgaXMgbm90IG1lYW50IHRvIGdpdmUgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2YgdGhlIGZlYXR1cmVzIG9mIFJCIE1hbmFnZXIsIAorICAgICAgICAgIGJ1dCBpdCB3aWxsIGhlbHAgeW91IGZhbWlsaWFyaXplIHdpdGggYWxsIG9mIHRoZSBiYXNpYyBmZWF0dXJlcy48L1A+CisgICAgICAgIDxIMyBBTElHTj0iTEVGVCI+IAorICAgICAgICAgIDxVTD4KKyAgICAgICAgICAgIDxMST4KKyAgICAgICAgICAgICAgPEg0PlN0ZXAgMS4gPEEgSFJFRj0ic3RlcDEuaHRtbCI+U2V0dGluZyBZb3VyIFBlcnNvbmFsIFByZWZlbmNlczwvQT48L0g0PgorICAgICAgICAgICAgPC9MST4KKyAgICAgICAgICAgIDxMST4KKyAgICAgICAgICAgICAgPEg0PlN0ZXAgMi4gPEEgSFJFRj0ic3RlcDIuaHRtbCI+Q3JlYXRpbmcgYSBOZXcgUmVzb3VyY2UgQnVuZGxlPC9BPjwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgICAgPExJPgorICAgICAgICAgICAgICA8SDQ+U3RlcCAzLiA8QSBIUkVGPSJzdGVwMy5odG1sIj5DcmVhdGluZyBHcm91cHMgd2l0aGluIHRoZSBCdW5kbGU8L0E+PC9IND4KKyAgICAgICAgICAgIDwvTEk+CisgICAgICAgICAgICA8TEk+CisgICAgICAgICAgICAgIDxIND5TdGVwIDQuIDxBIEhSRUY9InN0ZXA0Lmh0bWwiPlBvcHVsYXRpbmcgdGhlIEJ1bmRsZSB3aXRoIFJlc291cmNlczwvQT48L0g0PgorICAgICAgICAgICAgPC9MST4KKyAgICAgICAgICAgIDxMST4KKyAgICAgICAgICAgICAgPEg0PlN0ZXAgNS4gPEEgSFJFRj0ic3RlcDUuaHRtbCI+QWRkaW5nIFJlc291cmNlIEZpbGVzIGZvciBOZXcgTGFuZ3VhZ2VzPC9BPjwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgICAgPExJPgorICAgICAgICAgICAgICA8SDQ+U3RlcCA2LiA8QSBIUkVGPSJzdGVwNi5odG1sIj5TYXZpbmcgdGhlIFJlc3VsdHM8L0E+IDwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgIDwvVUw+CisgICAgICAgIDwvSDM+CisgICAgICAgIDxIND48QSBIUkVGPSJzdGVwMS5odG1sIj5HbyB0byBTdGVwIDE8L0E+PC9IND4KKyAgICAgIDwvRElWPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+Cis8IS0tCis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIyIj4KKyAgPFRSPgorICAgIDxURCBXSURUSD0iMjAwIiBCR0NPTE9SPSIjQ0NDQ0ZGIj4mbmJzcDs8L1REPgorICAgIDxURD4KKyAgICAgIDxESVYgQUxJR049IkNFTlRFUiI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBXSURUSD0iMTc1IiBIRUlHSFQ9IjUwIj48L0RJVj4KKyAgICA8L1REPgorICA8L1RSPgorICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkdDT0xPUj0iI0NDQ0NGRiI+IAorICAgICAgPFA+PEEgSFJFRj0iaW5kZXguaHRtbCI+UkJNYW5hZ2VyPC9BPjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+UkJSZXBvcnRlcjwvQT48L1A+CisgICAgICA8UD48QSBIUkVGPSIuLi90dXRvcmlhbC9zdGVwMS5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9QPgorICAgICAgPFA+VG9waWNzPC9QPgorICAgICAgPFVMPgorICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdHV0b3JpYWwvaW5kZXguaHRtbCI+U3RlcC1ieS1zdGVwIFR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgIDxMST48QSBIUkVGPSJzdGVwMS5odG1sIj5DaGFuZ2luZyBQcmVmZW5jZXM8L0E+PC9MST4KKyAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZSBGZWF0dXJlczwvQT48L0xJPgorICAgICAgPC9VTD4KKyAgICA8L1REPgorICAgIDxURD48L1REPgorICA8L1RSPgorPC9UQUJMRT4KKy0tPgorPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDEuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3ODNlOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAxLmh0bWwKQEAgLTAsMCArMSwxNjggQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciBUdXRvcmlhbCAtIFByZWZlcmVuY2VzPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi92aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJzdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPlNldHRpbmcgWW91ciBQZXJzb25hbCBQcmVmZXJlbmNlczwvSDM+CisgICAgICA8UD48Qj5HZXR0aW5nIFN0YXJ0ZWQ8L0I+PC9QPgorICAgICAgPFA+QmVmb3JlIHlvdSBjYW4gZG8gYW55dGhpbmcgd2l0aCB0aGUgcHJvZ3JhbSwgb2YgY291cnNlLCB5b3UgaGF2ZSB0byBnZXQgCisgICAgICAgIGl0IHJ1bm5pbmcuIFJCIE1hbmFnZXIgaXMgcHVyZWx5IGEgSmF2YSBhcHBsaWNhdGlvbi4gVGhlIGRvd25sb2FkIGRvZXMgCisgICAgICAgIG5vdCBjb21lIHdpdGggYSBKYXZhIHJ1bnRpbWUgZW52aXJvbm1lbnQuIEluIG9yZGVyIHRvIHVzZSBSQk1hbmFnZXIsIHlvdSAKKyAgICAgICAgd2lsbCBuZWVkIHRvIGhhdmEgYSBKYXZhIHJ1bnRpbWUgZW52aXJvbm1lbnQgaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZS4gCisgICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBhdmFpbGFibGUgdG8gbW9zdCBjb21wdXRpbmcgcGxhdGZvcm1zIGF0IDxBIEhSRUY9Imh0dHA6Ly9qYXZhLnN1bi5jb20iPlN1bidzIAorICAgICAgICBpbnRlcm5ldCBzaXRlPC9BPi4gUkIgTWFuYWdlciBoYXMgYmVlbiB0ZXN0ZWQgZm9yIEphdmEgdmVyc2lvbnMgMS4yLjIgCisgICAgICAgIGFuZCBoaWdoZXIuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSBKYXZhIHZlcnNpb24gMS4zIGlmIGl0IGlzIGF2YWlsYWJsZSAKKyAgICAgICAgZm9yIHlvdXIgc3lzdGVtLjwvUD4KKyAgICAgIDxQPlRvIHJ1biB0aGUgcHJvZ3JhbSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGZpcnN0IGdvIHRvIHRoZSBSQk1hbmFnZXIgZGlyZWN0b3J5IAorICAgICAgICBvbiB5b3VyIHN5c3RlbSwgdGhlbiBlbnRlcjo8L1A+CisgICAgICA8UD48Q09ERT5qYXZhIC1jbGFzc3BhdGggLi9saWIvUkJNYW5hZ2VyLmphcjsuL2xpYi94ZXJjZXMuamFyIGNvbS5pYm0ucmJtLlJCTWFuYWdlcjwvQ09ERT48L1A+CisgICAgICA8UD5BbHRlcm5hdGl2ZWx5LCBXaW5kb3dzIHVzZXJzIGNhbiB1c2UgdGhlIGJhdGNoIGZpbGUsIFJCTWFuYWdlci5iYXQgdG8gCisgICAgICAgIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcuIExpbnV4IGFuZCBVbml4IHVzZXJzIHRlbmQgbm90IHRvIG5lZWQgdGhlaXIgCisgICAgICAgIGhhbmRzIGhlbGQsIGFuZCBjYW4gcHJvYmFibHkgZmlndXJlIG91dCBob3cgdG8gd3JpdGUgYSBzaW1wbGUgc2NyaXB0IG9yIAorICAgICAgICBhbGlhcyB0byBydW4gdGhlIGFwcGxpY2F0aW9uIHdpdGhvdXQgaGVscC4gTWFjIE9TIFggdXNlcnMgY2FuIHJ1biB0aGUgCisgICAgICAgIHByb2dyYW0gZnJvbSB0aGUgVGVybWluYWwgYXBwbGljYXRpb24gd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBsaW5lLCBzdWJzdGl0dXRpbmcgCisgICAgICAgIGEgY29sb24gZm9yIHRoZSBzZW1pLWNvbG9uIGluIHRoZSBjbGFzc3BhdGggYXJndW1lbnQuPC9QPgorICAgICAgPFA+PEI+VGhlIERpc3BsYXk8L0I+PC9QPgorICAgICAgPFA+T25jZSB5b3UgZ2V0IHRoZSBhcHBsaWNhdGlvbiBydW5uaW5nLCB5b3Ugd2lsbCBob3BlZnVsbHkgc2VlIHNvbWV0aGluZyAKKyAgICAgICAgbGlrZSB0aGlzOjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfc2NyZWVuLmdpZiI+PC9QPgorICAgICAgPFA+VGhlIGRpc3BsYXkgbWF5IGRpZmZlciBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGluIHRoZSB2YXJpb3VzIEphdmEgVmlydHVhbCAKKyAgICAgICAgTWFjaGluZXMgYW5kIGRpZmZlcmVuY2VzIGluIExvb2sgYW5kIEZlZWxzLiBBdCB0aGUgdG9wIGlzIGEgbWVudSBiYXIgYW5kIAorICAgICAgICBhIGxvZ28uIEJlbG93IHRoZSBsb2dvIGFuZCB0byB0aGUgbGVmdCBpcyBhIHBhbmUgaW4gd2hpY2ggYWxsIG9mIHRoZSB2YXJpb3VzIAorICAgICAgICBsYW5ndWFnZSBmaWxlcyB3aWxsIGJlIGxpc3RlZCBpbiBhIHRyZWUgdmlldy4gU2luY2Ugbm8gcmVzb3VyY2UgYnVuZGxlIAorICAgICAgICBoYXMgYmVlbiBzZWxlY3RlZCwgdGhpcyB0cmVlIGlzIGN1cnJlbnRseSBlbXB0eS4gVG8gdGhlIHJpZ2h0IGlzIGEgdGFiYmVkIAorICAgICAgICBwYW5lIGluIHdoaWNoIHRocmVlIHZpZXdzIHdpbGwgYmUgc2hvd24uIFRoZSB2aWV3cyB3aWxsIGVpdGhlciBwcmVzZW50IAorICAgICAgICBpbmZvcm1hdGlvbiBvciBwcm92aWRlIGFuIGludGVyZmFjZSBmb3IgZWRpdGluZyB0aGUgdmFyaW91cyBkYXRhIGNvbnRhaW5lZCAKKyAgICAgICAgYWNyb3NzIHlvdXIgcmVzb3VyY2UgYnVuZGxlLjwvUD4KKyAgICAgIDxQPjxCPkN1c3RvbWl6aW5nIHRoZSBBcHBsaWNhdGlvbiBmb3IgWW91PC9CPjwvUD4KKyAgICAgIDxQPkdvIHRvIHRoZSBPcHRpb25zIG1lbnUgYW5kIHNlbGVjdCBQcmVmZXJlbmNlcy4gVGhlIGZpcnN0IHRpbWUgYWZ0ZXIgb3BlbmluZyAKKyAgICAgICAgdGhlIGFwcGxpY2F0aW9uLCBpdCBtYXkgdGFrZSBhIGZldyBzZWNvbmRzIHRvIGdldCB0byB0aGUgcHJlZmVyZW5jZXMgYXMgCisgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBnZXQgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHZpcnR1YWwgbWFjaGluZS5BIGRpYWxvZyAKKyAgICAgICAgYm94IHNob3VsZCBhcHBlYXIgdGhhdCBsb29rcyBzaW1pbGFyIHRvIHRoaXM6PC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9wcmVmZXJlbmNlc19kaWFsb2cuZ2lmIiBXSURUSD0iNDI5IiBIRUlHSFQ9IjI2OSI+PC9QPgorICAgICAgPFA+VGhlIGZpcnN0IHRoaW5nIHRvIGRvIGlzIHRvIGNoYW5nZSB0aGUgdXNlciBuYW1lIHRvIHlvdXIgb3duIG5hbWUuIFlvdSAKKyAgICAgICAgd2lsbCBvbmx5IGhhdmUgdG8gZG8gdGhpcyBvbmNlIHVubGVzcyBzb21lb25lIGVsc2UgdXNlcyB0aGlzIGFwcGxpY2F0aW9uIAorICAgICAgICBhbmQgY2hhbmdlcyB0aGUgbmFtZS4gU2Vjb25kLCB5b3Ugc2hvdWxkIGNoYW5nZSB0aGUgbG9vayBhbmQgZmVlbCBvZiB0aGUgCisgICAgICAgIGFwcGxpY2F0aW9uIHRvIHlvdXIgcHJlZmVyZW5jZS4gQWxsIG9mIHRoZSBsb29rIGFuZCBmZWVscyB0aGF0IHlvdXIgSlZNIAorICAgICAgICBzdXBwb3J0cyBzaG91bGQgYmUgbGlzdGVkIGluIHRoZSBkcm9wIGRvd24gYm94LiAoTm90ZSB0aGF0IGNoYW5nZXMgd2lsbCAKKyAgICAgICAgbm90IHRha2UgYWZmZWN0IHVudGlsIGFmdGVyIHlvdSBhcmUgZG9uZSBhbmQgaGF2ZSBwcmVzc2VkIHRoZSBVcGRhdGUgYnV0dG9uKS48L1A+CisgICAgICA8UD5UaGUgbGFzdCB0aGluZyB0byBjaGFuZ2UgaXMgdGhlIGxvY2FsZSB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gd29yayAKKyAgICAgICAgd2l0aCB0aGlzIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBkb3dubG9hZCBSQk1hbmFnZXIsIGl0IGlzIHNldCBieSBkZWZhdWx0IAorICAgICAgICB0byBkaXNwbGF5IGluIFUuUy4gRW5nbGlzaC4gQXMgb2YgdGhpcyB3cml0aW5nLCB5b3UgY2FuIHVzZSB0aGUgcHJvZ3JhbSAKKyAgICAgICAgaW4gRmlubmlzaCwgU3dlZGlzaCwgYW5kIEdlcm1hbiBhcyB3ZWxsLiBUaHJlZSBsaXN0cyBjaG9pY2VzIGFyZSBwb3NzaWJsZSAKKyAgICAgICAgZm9yIHNlbGVjdGluZyBhIGxvY2FsZS4gVGhlIGZpcnN0LCBjYWxsZWQgJ01hY2hpbmUgU3VwcG9ydGVkJywgbGlzdHMgYWxsIAorICAgICAgICBvZiB0aGUgbG9jYWxzIHN1cHBvcnRlZCBieSB5b3VyIEpWTS4gVGhlIHNlY29uZCwgY2FsbGVkICdEZWZpbmVkIGZvciBSQk1hbmFnZXInLCAKKyAgICAgICAgYW5hbHl6ZXMgdGhlIFJlc291cmNlIEJ1bmRsZSBmb3IgUkJNYW5hZ2VyIGFuZCBsZXRzIHlvdSBzZWxlY3QgZnJvbSB0aGUgCisgICAgICAgIGF2YWlsYWJsZSB0cmFuc2xhdGlvbiBmaWxlcy4gVGhlIHRoaXJkIG9wdGlvbiwgY2FsbGVkICdJU08gU3RhbmRhcmRzJywgCisgICAgICAgIGxpc3RzIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgMi1sZXR0ZXIgY29kZXMgZGVmaW5lZCBieSB0aGUgSVNPLiAKKyAgICAgICAgWW91IG1heSBzZWxlY3QgYW55IG9mIHRoZSB0aHJlZSBvcHRpb25zIGJ5IHVzZSBvZiB0aGUgcmFkaW8gYnV0dG9uIG9uIAorICAgICAgICB0aGUgbGVmdCBhbmQgdGhlbiBzZWxlY3QgdGhlIGVuY29kaW5nIHlvdSB3b3VsZCBsaWtlIHRvIHVzZS4gT2YgY291cnNlIAorICAgICAgICBpZiB0aGUgZW5jb2RpbmcgeW91IHNlbGVjdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFJCTWFuYWdlciwgdGhlIHRyYW5zbGF0aW9ucyAKKyAgICAgICAgaW4gdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIGJ1bmRsZSB3aWxsIGJlIHVzZWQsIHdoaWNoIGFyZSBpbiBFbmdsaXNoLiBBbHNvIAorICAgICAgICBub3RlLCB0aGF0IHRoZSBiYXNlIGNsYXNzIGxhbmd1YWdlIG1heSBub3QgYXBwZWFyIGluIHRoZSAnRGVmaW5lZCBmb3IgCisgICAgICAgIFJCTWFuYWdlcicgc2VjdGlvbiBiZWNhdXNlIHRoZSBlbmNvZGluZyBpcyBub3QgYWx3YXlzIHNwZWNpZmllZCBmb3IgdGhhdCAKKyAgICAgICAgZmlsZS4gPC9QPgorICAgICAgPFA+V2hlbiB5b3UgYXJlIGRvbmUgbWFraW5nIHlvdXIgcGVyc29uYWxpemVkIHNlbGVjdGlvbnMsIGNsaWNrIG9uIHRoZSBVcGRhdGUgCisgICAgICAgIGJ1dHRvbi4gVGhlIHByZWZlcmVuY2VzIHdpbGwgYmUgc2F2ZWQgaW4gYSBmaWxlIGNhbGxlZCBwcmVmZXJlbmNlcy5wcm9wZXJ0aWVzIAorICAgICAgICBzdG9yZWQgaW4geW91ciBSQk1hbmFnZXIgZGlyZWN0b3J5LiBZb3Ugd2lsbCBub3QgbmVlZCB0byBtYWtlIHRoZXNlIHNlbGVjdGlvbnMgCisgICAgICAgIGluIHRoZSBmdXR1cmUsIHVubGVzcyB5b3Ugd2FudCB0byBjaGFuZ2UgeW91ciBkZWZhdWwgb3B0aW9ucy48L1A+CisgICAgICA8UD48QSBIUkVGPSJpbmRleC5odG1sIj5CYWNrIHRvIHRoZSBUdXRvcmlhbCBNZW51PC9BPiAtb3ItIDxBIEhSRUY9InN0ZXAyLmh0bWwiPkZvcndhcmQgCisgICAgICAgIHRvIFN0ZXAgMjwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDIuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiZWI0NwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAyLmh0bWwKQEAgLTAsMCArMSwxNDggQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciBUdXRvcmlhbCAtIENyZWF0aW5nIFJlc291cmNlczwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0ic3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5TdGVwIDIuIENyZWF0aW5nIGEgTmV3IFJlc291cmNlIEJ1bmRsZTwvSDM+CisgICAgICA8UD48Qj5UaGluZ3MgdG8gQ29uc2lkZXI8L0I+PC9QPgorICAgICAgPFA+QSByZXNvdXJjZSBidW5kbGUgaW4gdGVybXMgb2YgdGhpcyBhcHBsaWNhdGlvbiBpcyBhIGdyb3VwIG9mIHByb3BlcnR5IAorICAgICAgICBmaWxlcyB3aXRoIHRoZSBzYW1lIGJhc2UgY2xhc3MgbmFtZS4gRm9yIGluc3RhbmNlLCB0aGUgcmVzb3VyY2UgYnVuZGxlIAorICAgICAgICBmb3IgUkIgTWFuYWdlciBpbmNsdWRlcyBmaWxlczogPGNvZGU+UkJNYW5hZ2VyLnByb3BlcnRpZXM8L0NPREU+LCA8Y29kZT5SQk1hbmFnZXJfZGUucHJvcGVydGllczwvQ09ERT4sIAorICAgICAgICA8Y29kZT5SQk1hbmdlcl9maS5wcm9wZXJ0aWVzPC9DT0RFPiwgZXRjLiBJbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIHByb2dyYW0sIAorICAgICAgICBSQiBNYW5hZ2VyIHdpbGwgYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyBkYXRhIGZyb20gCisgICAgICAgIG90aGVyIGxhbmd1YWdlIHRyYW5zbGF0aW9ucyBzY2hlbWFzIHN1Y2ggYXMgdGhlIFhNTCBpbnRlcm5hdGlvbmFsaXphdGlvbiAKKyAgICAgICAgc3RhbmRhcmQsIFRNWC48L1A+CisgICAgICA8UD5Zb3UgY2FuIGhhdmUgYXMgbWFueSBSZXNvdXJjZSBCdW5kbGVzIGFzIHlvdSBsaWtlIGZvciBhbiBhcHBsaWNhdGlvbiwgCisgICAgICAgIHRob3VnaCBtb3N0IHRlYW1zIGNob29zZSB0byB3b3JrIHdpdGgganVzdCBvbmUuIFJCIE1hbmFnZXIgYWxsb3dzIHlvdSAKKyAgICAgICAgdG8gd29yayBvbiBvbmUgcmVzb3VyY2UgYnVuZGxlIGF0IGEgdGltZSwgZWRpdGluZyBlaXRoZXIgaW5kaXZpZHVhbCB0cmFuc2xhdGlvbiAKKyAgICAgICAgZmlsZXMgb3IgZ3JvdXBzIG9mIHRyYW5zbGF0aW9uIGZpbGVzIHdpdGhpbiB0aGUgYnVuZGxlLiBXaGVuIHlvdSBjcmVhdGUgCisgICAgICAgIGEgcmVzb3VyY2UgYnVuZGxlIHlvdSB3aWxsIGJlIGNyZWF0aW5nIHRoZSBiYXNlIGNsYXNzIHRyYW5zbGF0aW9uIGZpbGUgCisgICAgICAgIGZvciB0aGF0IGJ1bmRsZS4gT3RoZXIgZmlsZXMgY2FuIGJlIGFkZGVkIGF0IGFueSB0aW1lIGxhdGVyLiBUaGUgYmFzZSAKKyAgICAgICAgY2xhc3MgdHJhbnNsYXRpb24gZmlsZSBwcm92aWRlcyBhIGRlZmF1bHQgdHJhbnNsYXRpb24gaW4gY2FzZSBsb2NhbGVzIAorICAgICAgICBhcmUgbm90IHNwZWNpZmllZCBvciBhIHJlc291cmNlIHRyYW5zbGF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSAKKyAgICAgICAgbG9jYWxlIHRoYXQgaXMgc3BlY2lmaWVkLjwvUD4KKyAgICAgIDxQPllvdSB3aWxsIGhhdmUgdG8gY2hvb3NlIGEgYmFzZSBjbGFzcyBuYW1lIGZvciB0aGUgcmVzb3VyY2UgYnVuZGxlLiBUaGF0IAorICAgICAgICBuYW1lIG1heSBoYXZlIG5vIHdoaXRlIHNwYWNlcyBhbmQgbm8gdW5kZXJzY29yZXMsIGFuZCBpdCBzaG91bGQgcmVtaW5kIAorICAgICAgICB5b3UgaW4gc29tZSB3YXkgb2YgdGhlIHByb2plY3Qgb3IgZnVuY3Rpb24gdG8gd2hpY2ggaXQgaXMgYXR0YWNoZWQuIFlvdSAKKyAgICAgICAgd2lsbCBhbHNvIGhhdmUgdG8gZW50ZXIgYSBuYW1lIGZvciB0aGUgcGVyc29uIG9yIHBlb3BsZSBpbiBjaGFyZ2Ugb2YgbWFuYWdpbmcgCisgICAgICAgIHRoZSByZXNvdXJjZSBidW5kbGUuPC9QPgorICAgICAgPFA+PEI+Q3JlYXRpbmcgdGhlIFJlc291cmNlIEJ1bmRsZTwvQj48L1A+CisgICAgICA8UD5Gcm9tIHRoZSBGaWxlIG1lbnUsIHNlbGVjdCAnTmV3IFJlc291cmNlIEJ1bmRsZS4uLicgWW91IHdpbGwgYmUgcHJvbXB0ZWQgCisgICAgICAgIHRvIGVudGVyIHRoZSBiYXNlIGNsYXNzIG5hbWUuIElmIHlvdSBlbnRlciBhIHByb3Blcmx5IGZvcm1hdHRlZCBuYW1lLCAKKyAgICAgICAgdGhlIHRyZWUgZGlzcGxheSBvbiB0aGUgbG93ZXIgbGVmdCB3aWxsIGNoYW5nZSB0byByZWZsZWN0IHRoZSBuYW1lIHlvdSAKKyAgICAgICAgZW50ZXJlZC4gQ2xpY2sgb24gdGhlIG5hbWUgb2YgeW91ciByZXNvdXJjZSBidW5kbGUsIGFuZCBtYWtlIHN1cmUgdGhlIAorICAgICAgICAnU3RhdGlzdGljcycgdGFiIGlzIHNlbGVjdGVkLiBZb3Ugc2hvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvbmV3X2J1bmRsZS5naWYiIFdJRFRIPSI1NTIiIEhFSUdIVD0iMzg1Ij48L1A+CisgICAgICA8UD5UaGUgb25seSByZXNvdXJjZSBmaWxlIHlvdSBoYXZlIGlzIHRoYXQgb2YgdGhlIGJhc2UgY2xhc3MuIFNlbGVjdCB0aGUgCisgICAgICAgICcoQmFzZSBDbGFzcyknIG5vZGUgb2YgdGhlIHRyZWUgYnkgY2xpY2tpbmcgb24gaXQuIFlvdSBzaG91bGQgbm93IHNlZSAKKyAgICAgICAgdGhlIGZvbGxvd2luZzo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL25ld19iYXNlY2xhc3MuZ2lmIiBXSURUSD0iNjc2IiBIRUlHSFQ9IjUxMSI+PC9QPgorICAgICAgPFA+VGhlIGZpZWxkcyByZXByZXNlbnRlZCBoZXJlIGhhdmUgbm8gYmVhcmluZyBvbiBob3cgdGhlIHRyYW5zbGF0aW9ucyB3aWxsIAorICAgICAgICB3b3JrIGluIHlvdXIgYXBwbGljYXRpb24sIGJ1dCBnaXZlIFJCTWFuYWdlciBzb21lIG1ldGFkYXRhIHRvIGJldHRlciBvcmdhbml6ZSAKKyAgICAgICAgdGhlIGZpbGUuIFJlc291cmNlIFRpdGxlIHNob3VsZCBiZSBhIHNob3J0IHRpdGxlIHRoYXQgcmVwcmVzZW50cyB0aGlzIAorICAgICAgICBmaWxlLCBzdWNoIGFzICdSQlR1dG9yaWFsIEJhc2UgQ2xhc3MnLiBZb3UgY2FuIGVudGVyIGFueSBjb21tZW50IGFuZCBmaWxlIAorICAgICAgICBtYW5hZ2VyIHZhbHVlIHlvdSBsaWtlLiBUaGUgbGFuZ3VhZ2UsIGNvdW50cnksIGFuZCB2YXJpYW50IGZpZWxkcyBwcm92aWRlIAorICAgICAgICBhIHBsYWNlIGZvciBsaXN0aW5nIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGxhbmd1YWdlLCBjb3VudHJ5LCBhbmQgdmFyaWFudCAKKyAgICAgICAgc28gdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gcmVseSBvbiB0d28gb3IgdGhyZWUgbGV0dGVyIGVuY29kaW5ncy4gWW91IAorICAgICAgICBjYW4gYWxzbyBsZWF2ZSB0aGVzZSBmaWVsZHMgYmxhbmsgaWYgdGhleSBhcmUgbm90IHJlbGV2YW50LiBPbmNlIHlvdSBoYXZlIAorICAgICAgICBlbnRlcmVkIHRoZXNlIHZhbHVlcyBpbiwgZmluYWxpemUgdGhlbSBieSBwcmVzc2luZyB0aGUgJ1VwZGF0ZScgYnV0dG9uLjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9InN0ZXAxLmh0bWwiPkJhY2sgdG8gU3RlcCAxPC9BPiAtb3ItIDxBIEhSRUY9InN0ZXAzLmh0bWwiPkZvcndhcmQgCisgICAgICAgIHRvIFN0ZXAgMzwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDMuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3OGVkZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAzLmh0bWwKQEAgLTAsMCArMSwxMzUgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciBUdXRvcmlhbCAtIENyZWF0aW5nIEdyb3VwczwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0ic3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPgorICAgICAgPERJViBBTElHTj0iQ0VOVEVSIj4KKyAgICAgICAgPEgzPkNyZWF0aW5nIEdyb3VwcyB3aXRoaW4gdGhlIEJ1bmRsZTwvSDM+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj48Qj5XaGF0IGlzIGEgR3JvdXA/PC9CPjwvUD4KKyAgICAgICAgPFAgQUxJR049IkxFRlQiPk9uZSBvZiB0aGUgZnVuZGFtZW50YWwgcHJvYmxlbXMgd2l0aCBtYW5hZ2luZyByZXNvdXJjZSAKKyAgICAgICAgICBidW5kbGVzIGFjcm9zcyBsYXJnZSBwcm9qZWN0cyBpcyB0aGF0IGluZGl2aWR1YWwgcmVzb3VyY2VzIG9mdGVuIGdvdCAKKyAgICAgICAgICBsb3N0IGluIHRoZSB2YXN0IG51bWJlciBvZiB0cmFuc2xhdGlvbnMuIEJ5IGNyZWF0aW5nIGdyb3VwcyB3aXRoaW4gcmVzb3VyY2VzLCAKKyAgICAgICAgICBSQk1hbmFnZXIgbWFrZXMgaXQgbXVjaCBzaW1wbGVyIHRvIG1hbmFnZSB0aGUgZGF1bnRpbmcgbnVtYmVyIG9mIHRyYW5zbGF0aW9ucy4gCisgICAgICAgICAgVGhlIHJlc291cmNlIGJ1bmRsZSBpcyBsaWtlIGEgdHJlZSB3aXRoIHRoZSBmaWxlcyBhdCB0aGUgdXBwZXIgbGV2ZWxzLiAKKyAgICAgICAgICBCZW5lYXRoIHRoZSBmaWxlIGxldmVsIGlzIHRoZSBncm91cCBsZXZlbCwgYW5kIGJlbmVhdGggdGhhdCwgdGhlIGluZGl2aWR1YWwgCisgICAgICAgICAgcmVzb3VyY2VzLjwvUD4KKyAgICAgICAgPFAgQUxJR049IkxFRlQiPlRoZSBvbmx5IG1ldGEgZGF0YSB0aGF0IGdyb3VwcyBjb250YWluIGFyZSBuYW1lIGFuZCBjb21tZW50LiAKKyAgICAgICAgICBUaGUgbmFtZSBpcyBhIHdheSBvZiBpZGVudGlmeWluZyB0aGUgZ3JvdXAgZnJvbSBhIGxpc3Qgb2YgZ3JvdXBzLCBhbmQgCisgICAgICAgICAgdGhlIGNvbW1lbnQgaXMgYSBxdWljayBkZXNjcmlwdGlvbiBhYm91dCB3aGF0IHRoZSBncm91cCBjb250YWlucy48L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj48Qj5DcmVhdGluZyBhIEdyb3VwPC9CPjwvUD4KKyAgICAgICAgPFAgQUxJR049IkxFRlQiPkxpa2UgYW55IG90aGVyIGVkaXRpbmcgdGhhdCBhZmZlY3RzIHRoZSBlbnRpcmUgcmVzb3VyY2UgCisgICAgICAgICAgYnVuZGxlLCB0aGUgY3JlYXRpb24gb2YgYSBncm91cCBjYW4gbm90IGJlIGRvbmUgZnJvbSB0aGUgaW5kaXZpZHVhbCAKKyAgICAgICAgICBsYW5ndWFnZSBmaWxlIGxldmVsLiBUd28gd2F5cyBleGlzdCB0byBjcmVhdGUgYSBncm91cC4gVGhlIGZpcnN0IGlzIAorICAgICAgICAgIHRvIHNlbGVjdCB0aGUgYmFzZSBjbGFzcyBhdCB0aGUgdG9wIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdHJlZSwgc2VsZWN0IAorICAgICAgICAgIHRoZSAnR3JvdXBzJyB0YWIsIGFuZCBjbGljayB0aGUgJ0NyZWF0ZSBHcm91cCcgYnV0dG9uLiBUaGUgc2Vjb25kIHdheSAKKyAgICAgICAgICBpcyB0byBnbyB0byB0aGUgJ09wdGlvbnMnIG1lbnUgYW5kIHNlbGVjdCAnQWRkIE5ldyBHcm91cCcuIFRoZSBzZWNvbmQgCisgICAgICAgICAgbWV0aG9kIGNhbiBiZSB1c2VkIG5vIG1hdHRlciB3aGF0IHlvdXIgY3VycmVudCB2aWV3IGlzIG9uIHRoZSBsb3dlciAKKyAgICAgICAgICByaWdodCBwYW5lbC48L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj5PbmNlIHlvdSBoYXZlIGZvbGxvd2VkIG9uZSBvZiB0aGVzZSB0d28gbWV0aG9kcywgdGhlIGZvbGxvd2luZyAKKyAgICAgICAgICBkaWFsb2cgc2hvdWxkIGFwcGVhcjo8L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2NyZWF0ZV9ncm91cC5naWYiIFdJRFRIPSI0MDgiIEhFSUdIVD0iMTA5Ij48L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj5FbnRlciBhIG5hbWUgYW5kIGNvbW1lbnQgZm9yIHRoZSBncm91cCwgYW5kIGNsaWNrIG9uICdDcmVhdGUnLiAKKyAgICAgICAgICBOb3cgeW91IGhhdmUgYSBncm91cC4gWW91IGNhbiBhZGQgbW9yZSBncm91cHMgbm93IG9yIGF0IGFueSB0aW1lLiBZb3UgCisgICAgICAgICAgY2FuIGFsc28gYmVnaW4gdG8gY3JlYXRlIG5ldyByZXNvdXJjZXMgdW5kZXIgdGhlIG5ldyBncm91cCBhcyBleHBsYWluZWQgCisgICAgICAgICAgaW4gdGhlIG5leHQgc3RlcC48L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj48QSBIUkVGPSJzdGVwMi5odG1sIj5CYWNrIHRvIFN0ZXAgMjwvQT4gLW9yLSA8QSBIUkVGPSJzdGVwNC5odG1sIj5Gb3J3YXJkIAorICAgICAgICAgIHRvIFN0ZXAgNDwvQT48L1A+CisgICAgICA8L0RJVj4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwNC5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdmMGUxCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDQuaHRtbApAQCAtMCwwICsxLDE2OCBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIFR1dG9yaWFsIC0gUG9wdWxhdGluZyB0aGUgQnVuZGxlPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi92aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJzdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPlN0ZXAgNC4gUG9wdWxhdGluZyB0aGUgQnVuZGxlIHdpdGggUmVzb3VyY2VzPC9IMz4KKyAgICAgIDxQPjxCPldvcmtpbmcgd2l0aGluIGEgR3JvdXA8L0I+PC9QPgorICAgICAgPFA+SW4gdGhlIHR1dG9yaWFsIGZpbGUsIGZvbGxvd2luZyB0aGUgcHJvY2VzcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIAorICAgICAgICBzdGVwLCBJIGNyZWF0ZWQgYSBncm91cCBjYWxsZWQgJ1F1ZXN0aW9ucycgYW5kIGdhdmUgaXQgYSBjb21tZW50LiBUbyB2aWV3IAorICAgICAgICB0aGUgZ3JvdXAgdGhhdCB5b3UgY3JlYXRlZCwgbWFrZSBzdXJlIHRoYXQgdGhlIGJhc2UgY2xhc3MgYXQgdGhlIHRvcCBvZiAKKyAgICAgICAgdGhlIGZpbGUgdHJlZSB0byB0aGUgbGVmdCBpcyBzZWxlY3RlZCwgcHJlc3MgdGhlICdHcm91cHMnIHRhYiBvbiB0aGUgcmlnaHQsIAorICAgICAgICBhbmQgc2VsZWN0IHlvdXIgZ3JvdXAgbmFtZSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4gV2l0aCBhbnkgbHVjaywgeW91IAorICAgICAgICB3aWxsIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzOjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfZ3JvdXAuZ2lmIiBXSURUSD0iNzUwIiBIRUlHSFQ9IjQzMiI+PC9QPgorICAgICAgPFA+RnJvbSB0aGlzIHZpZXcsIHRoZXJlIGFyZSBzZXZlcmFsIG9wdGlvbnMgdGhhdCBhcmUgdG8gYmUgZm91bmQgaW4gdGhlIAorICAgICAgICBzaXggYnV0dG9ucyB0byB0aGUgbG93ZXIgcmlnaHQuIFdlIGFyZSBub3cgZ29pbmcgdG8gY3JlYXRlIGEgcmVzb3VyY2UuIAorICAgICAgICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgZWl0aGVyIHByZXNzaW5nIHRoZSBidXR0b24gJ0NyZWF0ZSBSZXNvdXJjZScgCisgICAgICAgIG9yIHNlbGVjdGluZyAnQWRkIE5ldyBSZXNvdXJjZS4uLicgZnJvbSB0aGUgJ09wdGlvbnMnIG1lbnUgYXQgdGhlIHRvcCAKKyAgICAgICAgb2YgdGhlIHNjcmVlbi48L1A+CisgICAgICA8UD48Qj5GaWxsaW5nIGluIFJlc291cmNlIEluZm9ybWF0aW9uPC9CPjwvUD4KKyAgICAgIDxQPk9uY2UgeW91IGZvbGxvdyBvbmUgb2YgdGhlIGFib3ZlIHR3byBzdGVwcywgeW91IHNob3VsZCBzZWUgYSBkaWFsb2cgc2ltaWxhciAKKyAgICAgICAgdG8gdGhlIGZvbGxvd2luZzo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3Jlc291cmNlLmdpZiI+PC9QPgorICAgICAgPFA+VGhlIGdyb3VwIHNob3duIGlzIHRoZSBvbmUgY3VycmVudGx5IGJlaW5nIHZpZXdlZCB3aGVuIHlvdSBjbGlja2VkIG9uIAorICAgICAgICB0aGUgJ0NyZWF0ZSBSZXNvdXJjZScgYnV0dG9uLiBJZiB5b3UgdXNlZCB0aGUgbWVudSB0byBicmluZyB1cCB0aGlzIGRpYWxvZywgCisgICAgICAgIGl0IG1heSBiZSBhIGRpZmZlcmVudCBncm91cC4gWW91IG1heSBtb3ZlIHRoZSByZXNvdXJjZSB0byBhbnkgZ3JvdXAgeW91IAorICAgICAgICB3aXNoIGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBpbiB0aGlzIGRyb3AgZG93biBib3guIEJvdGggdGhlIGVudHJ5IGtleSBhbmQgCisgICAgICAgIHRoZSB0cmFuc2xhdGlvbiBmaWVsZHMgYXJlIHJlcXVpcmVkIGluZm9ybWF0aW9uLiBUaGVzZSBtYWtlIHVwIHRoZSBsb29rdXAgCisgICAgICAgIHZhbHVlIGFuZCB0aGUgdHJhbnNsYXRpb24gdmFsdWUgcmVzcGVjdGl2ZWx5IHN0b3JlZCBpbiB5b3VyIGJ1bmRsZS4gVGhlIAorICAgICAgICBjb21tZW50IGZpZWxkIGlzIHRoZXJlIGluIG9yZGVyIHRvIGFpZCB0aG9zZSB3aG8gd2lsbCBiZSB0cmFuc2xhdGluZyB5b3VyIAorICAgICAgICB3b3JrIGludG8gb3RoZXIgbGFuZ3VhZ2VzLiBUaGlzIGZpZWxkIHByb3ZpZGVzIGEgd2F5IGZvciB5b3UgdG8gZGVzY3JpYmUgCisgICAgICAgIHRoZSBjb250ZXh0IG9mIHRoaXMgcGFydGljdWxhciByZXNvdXJjZS48L1A+CisgICAgICA8UD5UaGVyZSBhcmUgYSBmZXcgd2F5cyB0byBjcmVhdGUgdGhlIHJlc291cmNlIG9uY2UgdGhlIGluZm9ybWF0aW9uIGlzIGVudGVyZWQuIAorICAgICAgICBQcmVzc2luZyAnQ3JlYXRlJyB3aWxsIGFkZCB0aGUgcmVzb3VyY2UgYW5kIGNsb3NlIHRoZSBkaWFsb2cuIElmIHlvdSB3aXNoIAorICAgICAgICB0byBjb250aW51ZSBjcmVhdGluZyByZXNvdXJjZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lLCBwcmVzc2luZyAnQ3JlYXRlIAorICAgICAgICAmYW1wOyBDb250aW51ZScgd2lsbCBjcmVhdGUgdGhlIHJlc291cmNlLCBjbGVhciB0aGUgaW5mb3JtYXRpb24geW91IGhhdmUgCisgICAgICAgIGp1c3QgZW50ZXJlZCwgYW5kIGFsbG93IHlvdSB0byBlbnRlciBpbiBhIG5ldyByZXNvdXJjZS4gUHJlc3NpbmcgJ0NhbmNlbCcgCisgICAgICAgIHdpbGwgY2xvc2UgdGhlIGRpYWxvZyBib3ggYW5kIGlnbm9yZSBhbnkgaW5mb3JtYXRpb24gY3VycmVudGx5IGVudGVyZWQuIAorICAgICAgICBBcyBhIHNob3J0IGN1dCwgeW91IGNhbiBhbHNvIGhpdCBlbnRlciBmcm9tIGFueSBvZiB0aGUgdGV4dCBib3hlcyBidXQgCisgICAgICAgICdUcmFuc2xhdGlvbicuIFRoaXMgd2lsbCBjcmVhdGUgdGhlIHJlc291cmNlLiBQcmVzc2luZyBlbnRlciBmcm9tIHRoZSAKKyAgICAgICAgdHJhbnNsYXRpb24gdGV4dCBib3gsIGNyZWF0ZXMgYSB0cmFuc2xhdGlvbiB0aGF0IHNwYW5zIG11bHRpcGxlIGxpbmVzIAorICAgICAgICBvZiB0ZXh0LjwvUD4KKyAgICAgIDxQPkEgc2FtcGxlIHJlc291cmNlIGNyZWF0aW9uIGlzIHNob3cgYXMgZm9sbG93czo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3Jlc291cmNlLmdpZiI+PC9QPgorICAgICAgPFA+PEI+VXNpbmcgJ0xvb2stdXBzJzwvQj48L1A+CisgICAgICA8UD5SZXNvdXJjZSBidW5kbGVzIHByb3ZpZGUgYSB3YXkgb2YgdHJhbnNsYXRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbiAKKyAgICAgICAgYXMgd2VsbC4gRm9yIGluc3RhbmNlLCB3aGF0IGlmIEkgd2FudGVkIGEgdHJhbnNsYXRpb24gYXNraW5nIHRoZSB1c2VyIAorICAgICAgICBob3cgb2xkIHRoZXkgd2VyZSwgYW5kIEkgd2FudGVkIHRvIGFzayBpdCB3aXRoIHRoZWlyIG5hbWUgaW5zZXJ0ZWQgaW50byAKKyAgICAgICAgdGhlIHF1ZXN0aW9uLiBUaGUgcGxhY2VtZW50IG9mIHRoZWlyIG5hbWUgbWlnaHQgYmUgZGlmZmVyZW50IGluIGRpZmZlcmVudCAKKyAgICAgICAgbGFuZ3VhZ2VzLiBUaGlzIGlzIHRoZSByZWFzb24gZm9yICdsb29rLXVwcycuIFRoZSBqYXZhLnRleHQgcGFja2FnZSBkZWZpbmVzIAorICAgICAgICBhIHdheSBmb3IgaW1wbGVtZW50aW5nIHRoZXNlIGxvb2stdXBzIHVzaW5nIG51bWJlcnMgc3Vycm91bmRlZCBieSBjdXJseSAKKyAgICAgICAgYnJhY2VzLiBUaHVzLCBJIG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgcmVzb3VyY2UgbGlrZSB0aGUgb25lIGJlbG93OjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvbG9va3VwX3Jlc291cmNlLmdpZiI+PC9QPgorICAgICAgPFA+T25jZSB5b3UgZW50ZXIgYW55dGhpbmcgaW50byB5b3VyIHRyYW5zbGF0aW9uIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzIAorICAgICAgICBhbmQgY2hhbmdlIHRoZSBmb2N1cyBhd2F5IGZyb20gdGhlIHRyYW5zbGF0aW9uIGZpZWxkLCB0aGUgZGlhbG9nIGJveCB3aWxsIAorICAgICAgICB1cGRhdGUgaXRzZWxmIHdpdGggYXJlYXMgZm9yIHlvdSB0byBlbnRlciBkZXNjcmlwdGlvbnMgb2YgdGhlIGxvb2stdXBzIAorICAgICAgICB5b3UgaGF2ZSBlbnRlcmVkLiBUaGlzIGZlYXR1cmUgb2YgUkJNYW5hZ2VyIGFsbG93cyBmdXR1cmUgdHJhbnNsYXRvcnMgCisgICAgICAgIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQgb2YgZWFjaCBsb29rLXVwLjwvUD4KKyAgICAgIDxQPjxCPkVkaXRpbmcgdGhlIFJlc291cmNlczwvQj48L1A+CisgICAgICA8UD5Gcm9tIHRoZSAnR3JvdXBzJyB0YWIgdmlldywgeW91IGNhbiBhdCBhbnkgdGltZSBlZGl0IHRoZSBkZWZhdWx0IHZhbHVlcyAKKyAgICAgICAgZm9yIGEgcmVzb3VyY2UuIEFzIHlvdSBlbnRlciBpbiBuZXcgcmVzb3VyY2VzIHRoZXkgd2lsbCBhcHBlYXIgaW4gdGhlIAorICAgICAgICBncm91cCB2aWV3IGFzIHNob3duOjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfZ3JvdXAuZ2lmIiBXSURUSD0iNzUwIiBIRUlHSFQ9IjQzMiI+PC9QPgorICAgICAgPFA+RG91YmxlIGNsaWNraW5nIG9uIGEgcmVzb3VyY2Ugd2lsbCBicmluZyBhIGRpYWxvZyBib3ggdXAgc2ltaWxhciB0byB0aGUgCisgICAgICAgIG9uZSBmb3IgY3JlYXRpbmcgYSByZXNvdXJjZS4gUmVtZW1iZXIgdGhhdCBpdCBpcyBvbmx5IGZyb20gdGhpcyB2aWV3IHRoYXQgCisgICAgICAgIHlvdSB3aWxsIGJlIGFibGUgdG8gY2hhbmdlIHRoZSByZXNvdXJjZSBpbiBhIHdheSB0aGF0IHdpbGwgZWZmZWN0IHRoZSAKKyAgICAgICAgZW50aXJlIGJ1bmRsZS4gVGh1cyBpdCBpcyBvbmx5IGluIHRoaXMgdmlldyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSByZXNvdXJjZSdzIAorICAgICAgICBncm91cCwga2V5IG5hbWUsIGFuZCBkZWZhdWx0IHRyYW5zbGF0aW9uIGFuZCBjb21tZW50LjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9InN0ZXAzLmh0bWwiPkJhY2sgdG8gU3RlcCAzPC9BPiAtb3ItIDxBIEhSRUY9InN0ZXA1Lmh0bWwiPkZvcndhcmQgCisgICAgICAgIHRvIFN0ZXAgNTwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDUuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXA1Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkMmU0YQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXA1Lmh0bWwKQEAgLTAsMCArMSwxNTggQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciBUdXRvcmlhbCAtIENyZWF0aW5nIFJlc291cmNlIEZpbGVzPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi92aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJzdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPlN0ZXAgNS4gQWRkaW5nIFJlc291cmNlIEZpbGVzIGZvciBOZXcgTGFuZ3VhZ2VzPC9IMz4KKyAgICAgIDxQPjxCPkNyZWF0aW5nIGEgTmV3IExhbmd1YWdlIEZpbGU8L0I+PC9QPgorICAgICAgPFA+VGhlIG9ubHkgd2F5IGJ5IHdoaWNoIHRvIGNyZWF0ZSBhIG5ldyBsYW5ndWFnZSBmaWxlIGlzIGJ5IHNlbGVjdGluZyB0aGUgCisgICAgICAgICdBZGQgTmV3IFJlc291cmNlIEZpbGUuLi4nIG9wdGlvbiBmcm9tIHRoZSAnT3B0aW9ucycgbWVudS4gV2hlbiB5b3UgZG8gCisgICAgICAgIHNvIGEgZGlhbG9nIGJveCB3aWxsIGFwcGVhciBzaW1pbGFyIHRvIHRoaXM6PC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19maWxlLmdpZiIgV0lEVEg9IjYyMCIgSEVJR0hUPSI0MjEiPjwvUD4KKyAgICAgIDxQPlRoZSB0b3AgdGhyZWUgZmllbGRzIGlkZW50aWZ5IHRoZSBmaWxlLiBUaGUgYm90dG9tIHRocmVlIHNlY3Rpb25zLCBMYW5ndWFnZSwgCisgICAgICAgIENvdW50cnksIGFuZCBWYXJpYW50IGRlZmluZSB0aGUgcm9sZSBvZiB0aGUgcmVzb3VyY2UgZmlsZSB3aXRoaW4gdGhlIGJ1bmRsZS4gCisgICAgICAgIFRoZSBvbmx5IHJlcXVpcmVkIGZpZWxkIGlzIHRoZSBlbmNvZGluZyBmaWVsZCBmb3IgdGhlIGxhbmd1YWdlLiBUaGUgZW5jb2RpbmcgCisgICAgICAgIGZpZWxkcyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZmlsZSB3aGVuZXZlciB0aGUgZmllbGRzIAorICAgICAgICBhcmUgZmlsbGVkLiBUaGUgZmlsZSBuYW1lIHdvdWxkIGZvbGxvd2luZyB0aGUgcGF0dGVybiA8Q09ERT5iYXNlY2xhc3NfbGFuZ3VhZ2VfZW5jb2RpbmdfdmFyaWFudC5wcm9wZXJ0aWVzPC9DT0RFPi4gCisgICAgICAgIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgZmlsZSB3b3VsZCBiZSBuYW1lZDxDT0RFPiBSQlR1dG9yaWFsX2RlLnByb3BlcnRpZXM8L0NPREU+LiAKKyAgICAgICAgTm90ZSB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBkZWZpbmUgZmFsbGJhY2sgZmlsZXMgZm9yIGVhY2ggbGFuZ3VhZ2UgKGkuZS4gCisgICAgICAgIGlmIHlvdSBoYXZlIGEgZmlsZSBmb3IgPENPREU+UkJUdXRvcmlhbF9kZV9ERS5wcm9wZXJ0aWVzPC9DT0RFPiwgeW91IHNob3VsZCAKKyAgICAgICAgYWxzbyBoYXZlIGEgZmlsZSBmb3IgPENPREU+UkJUdXRvcmlhbF9kZS5wcm9wZXJ0aWVzPC9DT0RFPikuPC9QPgorICAgICAgPFA+U2luY2UgdGhlcmUgbWF5IGJlIGluc3RhbmNlcyB3aGVyZSB0aGUgbGFuZ3VhZ2UgZmlsZSBiZWluZyBjcmVhdGVkIG1heSAKKyAgICAgICAgaGF2ZSBmZXcgZGlmZmVyZW5jZXMgZnJvbSB0aGUgYmFzZSBjbGFzcyBwcm9wZXJ0eSBmaWxlLCBhbiBvcHRpb24gaXMgZ2l2ZW4gCisgICAgICAgIGZvciBjb3B5aW5nIG9yIG5vdCBhbGwgb2YgdGhlIHJlc291cmNlcyBmcm9tIHRoZSBiYXNlIGNsYXNzIGZpbGUgdG8gdGhlIAorICAgICAgICBuZXcgZmlsZS4gQnkgZGVmYXVsdCwgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYW5kIGVhY2ggcmVzb3VyY2Ugd2lsbCBiZSAKKyAgICAgICAgY29waWVkIGZyb20gdGhlIGJhc2UgZmlsZSBhbmQgbWFya2VkIGFzIHVudHJhbnNsYXRlZCBpbiB0aGUgbmV3IHJlc291cmNlIAorICAgICAgICBmaWxlLjwvUD4KKyAgICAgIDxQPjxCPldvcmtpbmcgd2l0aCB0aGUgTmV3IExhbmd1YWdlIEZpbGU8L0I+PEJSPgorICAgICAgPC9QPgorICAgICAgPFA+T25jZSBhIGxhbmd1YWdlIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCwgdGhlcmUgd2lsbCBiZSByZXNvdXJjZXMgdGhhdCBuZWVkIAorICAgICAgICB0byBiZSB0cmFuc2xhdGVkLiBUaGlzIGNhbiBiZSBkb25lIGZyb20gdHdvIGRpZmZlcmVudCB2aWV3cy4gRmlyc3QsIGdvIAorICAgICAgICB0byB0aGUgdHJlZSBvbiB0aGUgbG93ZXIgbGVmdCBvZiB0aGUgc2NyZWVuIGFuZCBzZWxlY3QgdGhlIGZpbGUgdGhhdCB5b3UgCisgICAgICAgIGhhdmUganVzdCBjcmVhdGVkLiBJbiB0aGlzIGNhc2UgaXQgd2lsbCBiZSB1bmRlciB0aGUgbGFuZ3VhZ2UgZW5jb2RpbmcgCisgICAgICAgIGRlIG5vZGUgb2YgdGhlIHRyZWUuIFNlbGVjdCB0aGUgZmlsZSBieSBjbGlja2luZyBvbiBpdCBvbmNlLiBTZWxlY3RpbmcgCisgICAgICAgIHRoZSAnVW50cmFuc2xhdGVkJyB0YWIgb24gdGhlIHJpZ2h0IHNob3VsZCByZXN1bHQgaW4gYSB2aWV3IHNpbWlsYXIgdG8gCisgICAgICAgIHRoaXM6PC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY191bnRyYW5zbGF0ZWQuZ2lmIiBXSURUSD0iNzUwIiBIRUlHSFQ9IjQxNiI+IAorICAgICAgPC9QPgorICAgICAgPFA+VGhpcyBzZWN0aW9uIGRpc3BsYXlzIGFsbCBvZiB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIG1hcmtlZCBhcyB1bnRyYW5zbGF0ZWQgCisgICAgICAgIGluIHRoZSBmaWxlLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY291bGQgc2VsZWN0IHRoZSAnR3JvdXBzJyB0YWIgYW5kIHNlZSAKKyAgICAgICAgYWxsIG9mIHRoZSByZXNvdXJjZXMsIG9uZSBncm91cCBhdCBhIHRpbWUsIHdoZXRoZXIgb3Igbm90IHRoZXkgaGF2ZSBiZWVuIAorICAgICAgICBtYXJrZWQgYXMgdHJhbnNsYXRlZC4gRG91YmxlIGNsaWNraW5nIG9uIGEgcm93IGluIHRoZSB0aGUgdGFibGVzIHByZXNlbnQgCisgICAgICAgIGluIGVpdGhlciB2aWV3IHdpbGwgYnJpbmcgdXAgYSBkaWFsb2cgYm94IHNpbWlsYXIgdG8gb25lIHlvdSBoYXZlIGFsbCAKKyAgICAgICAgcmVhZHkgc2Vlbjo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3RyYW5zbGF0aW9uLmdpZiIgV0lEVEg9IjUxMyIgSEVJR0hUPSIyNjkiPjwvUD4KKyAgICAgIDxQPlRoZSB0b3AgdGhyZWUgZWRpdGFibGUgY29tcG9uZW50cyBhcmUgYWxsIGRpc2FibGVkLiBUaGlzIGlzIGJlY2F1c2UgY2hhbmdpbmcgCisgICAgICAgIHRoZW0gd291bGQgcmVxdWlyZWQgZWRpdGluZyBmaWxlcyBvdGhlciB0aGFuIHRoZSBvbmUgY3VycmVudGx5IGJlaW5nIHZpZXdlZC4gCisgICAgICAgIFRoaXMgdHlwZSBvZiBlZGl0aW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgb25seSBmcm9tIHRoZSBiYXNlIGNsYXNzLiBUbyAKKyAgICAgICAgY2hhbmdlIHRoZSB0cmFuc2xhdGlvbiB2YWx1ZSwgYWx0ZXIgdGhlIGZpZWxkIGxhYmVsZWQgJ1RyYW5zbGF0aW9uOicgd2l0aCAKKyAgICAgICAgdGhlIG5ldyB0cmFuc2xhdGlvbi4gWW91IG1heSBhbHNvIGNoYW5nZSB0aGUgcmVzb3VyY2UgY29tbWVudCBhbmQgbG9va3VwIAorICAgICAgICBjb21tZW50cyBpZiB5b3UgbGlrZSwgYnV0IHRoaXMgY2hhbmdlIHdpbGwgYmUgdmlzaWJsZSBvbmx5IGZyb20gUkJNYW5hZ2VyLiAKKyAgICAgICAgWW91IGFsc28gbWF5IGZpbmQgdGhhdCB0aGUgcmVzb3VyY2UgcmVxdWlyZXMgbm8gdHJhbnNsYXRpb24gaWYgdGhpcyBpcyAKKyAgICAgICAgdGhlIGNhc2UsIGp1c3Qgc2VsZWN0IHRoZSAnVHJhbnNsYXRlZCcgY2hlY2sgYm94IGF0IHRoZSBib3R0b20gb2YgdGhlIAorICAgICAgICBkaWFsb2cgYW5kIHByZXNzICdFZGl0Jy4gSWYgeW91IGNoYW5nZSB0aGUgdHJhbnNsYXRpb24sIHRoZSAnVHJhbnNsYXRlZCcgCisgICAgICAgIGNoZWNrIGJveCB3aWxsIGF1dG9tYXRpY2FsbHkgY2hlY2sgaXRzZWxmIHdoZW4geW91IGFyZSBmaW5pc2hlZC48L1A+CisgICAgICA8UD5Db250aW51ZSB0aGlzIHByb2Nlc3MgdW50aWwgeW91IGhhdmUgY29tcGxldGVseSB0cmFuc2xhdGVkIHRoaXMgZmlsZSwgCisgICAgICAgIG9yIGxlYXZlIHRoZSBmaWxlIHVudHJhbnNsYXRlZCwgYnV0IHNhdmUgeW91ciB3b3JrIHNvIHRoYXQgeW91IG9yIHNvbWVvbmUgCisgICAgICAgIGVsc2UgY2FuIHJldHVybiB0byBpdCBsYXRlci4gVG8gbGVhcm4gaG93IHRvIHNhdmUgeW91ciByZXN1bHRzLCBnbyB0byAKKyAgICAgICAgdGhlIG5leHQgc3RlcC48L1A+CisgICAgICA8UD48QSBIUkVGPSJzdGVwNC5odG1sIj5CYWNrIHRvIFN0ZXAgNDwvQT4gLW9yLSA8QSBIUkVGPSJzdGVwNi5odG1sIj5Gb3J3YXJkIAorICAgICAgICB0byBTdGVwIDY8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXA2Lmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwNi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMjU4MGYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwNi5odG1sCkBAIC0wLDAgKzEsMTMxIEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgVHV0b3JpYWwgLSBTYXZpbmc8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKC4uL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3ZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9sb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9tZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InN0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9SQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4KKyAgICAgIDxIMiBBTElHTj0iQ0VOVEVSIj5TdGVwIDYuIFNhdmluZyB0aGUgUmVzdWx0czwvSDI+CisgICAgICA8UD48Qj5BbHdheXMgU2F2ZSBQZXJpb2RpY2FsbHk8L0I+PC9QPgorICAgICAgPFA+Tm9uZSBvZiB0aGUgd29yayB5b3UgZG8gaW4gbWFuYWdpbmcgdGhlIHJlc291cmNlIGJ1bmRsZSBpcyBmaW5hbCB1bnRpbCAKKyAgICAgICAgeW91IGhhdmUgc2F2ZWQgdGhlIHJlc3VsdHMuIFRoZSBmaXJzdCB0aW1lIHlvdSBzYXZlIHRoZSByZXNvdXJjZSBidW5kbGUsIAorICAgICAgICB5b3Ugc2hvdWxkIHNlbGVjdCB0aGUgJ1NhdmUgUmVzb3VyY2UgQnVuZGxlIEFzLi4uJyBvcHRpb24gZnJvbSB0aGUgZmlsZSAKKyAgICAgICAgbWVudS4gU2VsZWN0IGEgZm9sZGVyIGluIHdoaWNoIHRvIHNhdmUgdGhlIGZpbGUgYW5kIGVudGVyIGluIHRoZSBiYXNlIAorICAgICAgICBjbGFzcyBuYW1lIG9yIHRoZSBiYXNlIGNsYXNzIG5hbWUgZm9sbG93ZWQgYnkgdGhlIC5wcm9wZXJ0aWVzIHN1ZmZpeCBhbmQgCisgICAgICAgIHByZXNzIHNhdmUuPC9QPgorICAgICAgPFA+T25jZSB0aGlzIGhhcyBiZWVuIGRvbmUsIGl0IGlzIHN1ZmZpY2llbnQgdG8gY2hvc2UgdGhlICdTYXZlIFJlc291cmNlIAorICAgICAgICBCdW5kbGUnIG9wdGlvbiBmcm9tIHRoZSBmaWxlIG1lbnUuIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIGEgdmVyc2lvbmluZyAKKyAgICAgICAgdG9vbCBzdWNoIGFzIE1pY3Jvc29mdCdzIFZpc3VhbCBTb3VyY2UgU2FmZSwgZXRjLiwgYmUgc3VyZSB0aGF0IHlvdSBoYXZlIAorICAgICAgICB3cml0ZSBwcml2ZWxlZ2VzIHRvIHRoZSBlbnRpcmUgYnVuZGxlIG9mIGZpbGVzLiBPdGhlcndpc2UsIHlvdSB3aWxsIHJlY2lldmUgCisgICAgICAgIHdhcm5pbmcgZnJvbSBSQk1hbmFnZXIgdGhhdCBpdCB3YXMgdW5hYmxlIHRvIHdyaXRlIHRvIGFsbCBvZiB0aGUgZmlsZXMuPC9QPgorICAgICAgPFA+QSB3YXkgdG8gZ2V0IGFyb3VuZCB0aGlzIGlzIHRvIHNhdmUgdGhlIHJlc291cmNlIGZpbGVzIGluZGl2aWR1YWxseS4gCisgICAgICAgIEluIG9yZGVyIHRvIGRvIHRoaXMsIHJpZ2h0IGNsaWNrIG9uIGEgcmVzb3VyY2UgZmlsZSBpbiB0aGUgdHJlZSB2aWV3IGFuZCAKKyAgICAgICAgc2VsZWN0IHRoZSAnU2F2ZSBSZXNvdXJjZSBGaWxlJyBvcHRpb24uIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGlmIHlvdSAKKyAgICAgICAgaGF2ZSBtYWRlIGNoYW5nZXMgdG8gdGhlIGVudGlyZSByZXNvdXJjZSBidW5kbGUsIGJ1dCBpZiB5b3UgaGF2ZSBvbmx5IAorICAgICAgICBiZWVuIGRvaW5nIHRyYW5zbGF0aW9uIHdvcmsgZm9yIGEgcGFydGljdWxhciBmaWxlLCBvciBhIGZldyBmaWxlcywgc2F2aW5nIAorICAgICAgICBpbiB0aGlzIG1hbm5lciBjYW4gYmUgdXNlZnVsLjwvUD4KKyAgICAgIDxQPklmIHlvdSBldmVyIHdhbnQgdG8gY2hhbmdlIHRoZSBsb2NhdGlvbiBvciBiYXNlIGNsYXNzIG5hbWUgb2YgdGhlIHJlc291cmNlIAorICAgICAgICBidW5kbGUsIHlvdSBtYXkgZG8gc28gYnkgcmVzYXZpbmcgd2l0aCB0aGUgJ1NhdmUgUmVzb3VyY2UgQnVuZGxlIEFzLi4uJyAKKyAgICAgICAgb3B0aW9uLjwvUD4KKyAgICAgIDxQPjxCPkdvb2QgTHVjazwvQj48L1A+CisgICAgICA8UD5Zb3Ugd2lsbCBmaW5kIHRoYXQgdXNpbmcgdGhpcyB0b29sIHdpbGwgc3BlZWQgdXAgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MgCisgICAgICAgIGZvciB5b3VyIGludGVybmF0aW9uYWwgYXBwbGljYXRpb24gb3Igd2ViIHNlcnZpY2UuIEFzIHRoaXMgaXMgb25seSBhbiAKKyAgICAgICAgYWxwaGEgdmVyc2lvbiByZWxlYXNlLCBiZSBzdXJlIHRvIGNoZWNrIGFscGhhd29ya3MgZnJlcXVlbnRseSBmb3IgdXBkYXRlcyAKKyAgICAgICAgaW4gZnVuY3Rpb25hbGl0eSBhbmQgYnVnIGZpeGVzLjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9InN0ZXA1Lmh0bWwiPkJhY2sgdG8gU3RlcCA1PC9BPjwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy9pbmRleC5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFmOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvaW5kZXguaHRtbApAQCAtMCwwICsxLDE1NSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIC0gRnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKC4uL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9sb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9tZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9SQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8RElWIEFMSUdOPSJDRU5URVIiPiAKKyAgICAgICAgPEgyPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9IMj4KKyAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+UkIgTWFuYWdlciBvZmZlcnMgZml2ZSBkaWZmZXJlbnQgd2F5cyB0byBsb29rIGF0IGFuZCAKKyAgICAgICAgICBtYW5pcHVsYXRlIHJlc291cmNlIGJ1bmRsZXMuIEZvdXIgb2YgdGhlc2Ugdmlld3MgYXJlIGZvdW5kIGluIHRoZSB0YWJzIAorICAgICAgICAgIGxvY2F0ZWQgaW4gdGhlIHJpZ2h0IHBvcnRpb24gb2YgdGhlIGRpc3BsYXkuIFRoZSBmaWZ0aCBpcyB0aGUgdHJlZSB2aWV3IAorICAgICAgICAgIGxvY2F0ZWQgdG8gdGhlIGxlZnQuIEluIHRoZSBmb2xsb3dpbmcgcGFnZXMsIHRoZSB1c2Ugb2YgZWFjaCBvZiB0aGVzZSAKKyAgICAgICAgICB2aWV3cyBpcyBleHBsYWluZWQuPC9QPgorICAgICAgICA8SDMgQUxJR049IkxFRlQiPiAKKyAgICAgICAgICA8VUw+CisgICAgICAgICAgICA8TEk+IAorICAgICAgICAgICAgICA8SDQ+VmlldyAxLiA8QSBIUkVGPSJ2aWV3MS5odG1sIj5UaGUgUmVzb3VyY2UgQnVuZGxlIFRyZWU8L0E+PC9IND4KKyAgICAgICAgICAgIDwvTEk+CisgICAgICAgICAgICA8TEk+IAorICAgICAgICAgICAgICA8SDQ+VmlldyAyLiA8QSBIUkVGPSJ2aWV3Mi5odG1sIj5UaGUgU3RhdGlzdGljcyBUYWI8L0E+PC9IND4KKyAgICAgICAgICAgIDwvTEk+CisgICAgICAgICAgICA8TEk+IAorICAgICAgICAgICAgICA8SDQ+VmlldyAzLiA8QSBIUkVGPSJ2aWV3My5odG1sIj5UaGUgVW50cmFuc2xhdGVkIFRhYjwvQT48L0g0PgorICAgICAgICAgICAgPC9MST4KKyAgICAgICAgICAgIDxMST4gCisgICAgICAgICAgICAgIDxIND5WaWV3IDQuIDxBIEhSRUY9InZpZXc0Lmh0bWwiPlRoZSBHcm91cHMgVGFiPC9BPjwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgICAgPExJPiAKKyAgICAgICAgICAgICAgPEg0PlZpZXcgNS4gPEEgSFJFRj0idmlldzUuaHRtbCI+VGhlIFNlYXJjaCBUYWI8L0E+PC9IND4KKyAgICAgICAgICAgIDwvTEk+CisgICAgICAgICAgPC9VTD4KKyAgICAgICAgPC9IMz4KKyAgICAgICAgPEg0PjxBIEhSRUY9InZpZXcxLmh0bWwiPkdvIHRvIFZpZXcgMTwvQT48L0g0PgorICAgICAgPC9ESVY+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKzwhLS0KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjIiPgorICA8VFI+CisgICAgPFREIFdJRFRIPSIyMDAiIEJHQ09MT1I9IiNDQ0NDRkYiPiZuYnNwOzwvVEQ+CisgICAgPFREPgorICAgICAgPERJViBBTElHTj0iQ0VOVEVSIj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFdJRFRIPSIxNzUiIEhFSUdIVD0iNTAiPjwvRElWPgorICAgIDwvVEQ+CisgIDwvVFI+CisgIDxUUiBWQUxJR049IlRPUCI+IAorICAgIDxURCBXSURUSD0iMjAwIiBCR0NPTE9SPSIjQ0NDQ0ZGIj4gCisgICAgICA8UD48QSBIUkVGPSJpbmRleC5odG1sIj5SQk1hbmFnZXI8L0E+PC9QPgorICAgICAgPFA+PEEgSFJFRj0iUkJSZXBvcnRlci5odG1sIj5SQlJlcG9ydGVyPC9BPjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL3N0ZXAxLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9QPgorICAgICAgPFA+PEEgSFJFRj0iZmFxLmh0bWwiPkZBUTwvQT48L1A+CisgICAgICA8UD5Ub3BpY3M8L1A+CisgICAgICA8VUw+CisgICAgICAgIDxMST48QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5TdGVwLWJ5LXN0ZXAgVHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgPExJPjxBIEhSRUY9InN0ZXAxLmh0bWwiPkNoYW5naW5nIFByZWZlbmNlczwvQT48L0xJPgorICAgICAgICA8TEk+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlIEZlYXR1cmVzPC9BPjwvTEk+CisgICAgICA8L1VMPgorICAgIDwvVEQ+CisgICAgPFREPjwvVEQ+CisgIDwvVFI+Cis8L1RBQkxFPgorLS0+Cis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3MS5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTVkOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzEuaHRtbApAQCAtMCwwICsxLDE1MCBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIC0gVGhlIFJlc291cmNlIEJ1bmRsZSBUcmVlPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi90dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPlZpZXcgMS4gVGhlIFJlc291cmNlIEJ1bmRsZSBUcmVlPC9IMz4KKyAgICAgIDxQPkxvY2F0ZWQgb24gdGhlIGxlZnQgb2YgdGhlIFJCIE1hbmFnZXIgYXBwbGljYXRpb24gaXMgYSBzZWN0aW9uIGZvciBkaXNwbGF5aW5nIAorICAgICAgICBhIHJlc291cmNlIGJ1bmRsZSBpbiBhIHRyZWUgdmlldy4gUmVzb3VyY2UgQnVuZGxlcyB1c3VhbGx5IGFyZSBtYWRlIHVwIAorICAgICAgICBvZiB0ZXh0IG9yIGNsYXNzIGZpbGVzIGluIGEgZmxhdCBkaXJlY3Rvcnkgc3RydWN0dXJlLiBIb3dldmVyLCB0aGUgbG9jYWxlIAorICAgICAgICBlbmNvZGluZ3MgZ2l2ZW4gdG8gZWFjaCBmaWxlIG1ha2VzIGEgdHJlZSB2aWV3IGEgbmF0dXJhbCB3YXkgdG8gbG9vayBhdCAKKyAgICAgICAgdGhlIGJ1bmRsZS48L1A+CisgICAgICA8UD5XaGVuIFJCIE1hbmFnZXIgaXMgaW5pdGlhbGx5IGxhdW5jaGVkLCB0aGlzIHZpZXcgaXMgZW1wdHksIHNpbmNlIHRoZXJlIAorICAgICAgICBpcyBubyBvcGVuIHJlc291cmNlIGJ1bmRsZS4gVXBvbiBvcGVuaW5nIGEgdmFsaWQgcmVzb3VyY2UgYnVuZGxlLCB0aGUgCisgICAgICAgIHRyZWUgaXMgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBvcGVuZWQgYnVuZGxlLiBJbiB0aGUgZm9sbG93aW5nIHNjcmVlbiAKKyAgICAgICAgc2hvdHMsIHlvdSB3aWxsIHNlZSB0aGUgdHJlZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSBhc3NvY2lhdGUgd2l0aCBSQiAKKyAgICAgICAgTWFuYWdlciBpdHNlbGYuPC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3RyZWVfYmFzaWMuZ2lmIiBXSURUSD0iNjQyIiBIRUlHSFQ9IjQ5OSI+PC9QPgorICAgICAgPFA+VGhlIHRvcCBtb3N0IGVsZW1lbnQgb2YgdGhlIHRyZWUgKHRoZSByb290IG9mIHRoZSB0cmVlKSByZXByZXNlbnRzIHRoZSAKKyAgICAgICAgcmVzb3VyY2UgYnVuZGxlIGFzIGEgd2hvbGUuIEJlbG93IHRoZSByb290IGFyZSByZXNvdXJjZSBmaWxlcywgd2hpY2ggYXJlIAorICAgICAgICByZXByZXNlbnRlZCB3aXRoIHRoZSBmaWxlIGljb25zIHdpdGggYSBsZXR0ZXIgaW4gdGhlIG1pZGRsZSwgYW5kIGxhbmd1YWdlLCAKKyAgICAgICAgY291bnRyeSwgYW5kIHZhcmlhbnQgYnJhbmNoZXMuIExhbmd1YWdlIGJyYW5jaGVzIGFyZSByZXByZXNlbnRlZCBieSBhbiAKKyAgICAgICAgaWNvbiB3aXRoIGEgZ2xvYmUuIEJlbmVhdGggdGhlc2UgY2FuIGJlIGxhbmd1YWdlIGJyYW5jaGVzIHJlcHJlc2VudGVkIAorICAgICAgICBieSBhbiBpY29uIHdpdGggYSBmbGFnLiBCZW5lYXRoIHRoZXNlIGNhbiBiZSB2YXJpYW50IGJyYW5jaGVzIHJlcHJlc2VudGVkIAorICAgICAgICBieSBhbiBpY29uIHdpdGggYSBjYXJ0b29uIGRpYWxvZyBzeW1ib2wuIEJlbmVhdGggYW55IG9mIHRoZSBicmFuY2ggbm9kZXMsIAorICAgICAgICByZXNvdXJjZSBmaWxlcyBjYW4gYmUgZm91bmQuPC9QPgorICAgICAgPFA+VGhlIG5hbWUgb2YgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlLCAKKyAgICAgICAgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBidW5kbGUgaXMgY2FsbGVkIFJCTWFuYWdlci4gVGhlIG5hbWUgb2YgdGhlIAorICAgICAgICBmaWxlIG5vZGVzIGluIHRoZSB0cmVlIHdpbGwgdmFyeSBhY2NvcmRpbmcgdG8gd2hlcmUgaW4gdGhlIHRyZWUgdGhleSBhcmUuIAorICAgICAgICBFYWNoIGxhbmd1YWdlIGZpbGUgd2lsbCBkaXNwbGF5IHRoZSBsYW5ndWFnZSwgY291bnRyeSwgYW5kIHZhcmlhbnQgaW5mb3JtYXRpb24gCisgICAgICAgIHRoYXQgaXQga25vd3MgYWJvdXQgZm9sbG93ZWQgYnkgdGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlJ3MgbG9jYWxlIGluIHBhcmVudGhlc2llcy4gCisgICAgICAgIFRoZSBicmFuY2ggbm9kZXMgd2lsbCBpbmRpY2F0ZSB3aGV0aGVyIHRoZXkgYXJlIGxhbmd1YWdlLCBjb3VudHJ5LCBvciAKKyAgICAgICAgdmFyaWFudCBicmFuY2hlcywgYW5kIHdpbGwgZGlzcGxheSB0aGUgZW5jb2RpbmcgYXNzb2NpYXRlZCB3aXRoIHRoYXQgYnJhbmNoLjwvUD4KKyAgICAgIDxQPlJCIE1hbmFnZXIgZnVuY3Rpb25zIGluIHR3byBiYXNpYyB3YXlzIGZvciBldmVyeXRoaW5nIGl0IGRvZXMsIGVpdGhlciAKKyAgICAgICAgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUgYXMgYSB3aG9sZSBvciBmb3IgYW4gaW5kaXZpZHVhbCByZXNvdXJjZSBmaWxlLiAKKyAgICAgICAgVG8gbWFrZSBjaGFuZ2VzIGFuZCB1cGRhdGVzIHRvIHRoZSBlbnRpcmUgcmVzb3VyY2UgYnVuZGxlLCBzZWxlY3QgdGhlIAorICAgICAgICByb290IG5vZGUgbm90YXRlZCBieSB0aGUgJ1JCJyBpY29uIGF0IHRoZSB0b3Agb2YgdGhlIHRyZWUuIFRoaXMgd2lsbCBhbHNvIAorICAgICAgICBjYXVzZSB0aGUgc3RhdGlzdGljcyBhbmQgc2VhcmNoIHZpZXdzIHRvIHByZXNlbnQgcmVzdWx0cyByZWZsZWN0aW5nIHRoZSAKKyAgICAgICAgc3RhdHVzIG9mIHRoZSBlbnRpcmUgYnVuZGxlLiBUbyB3b3JrIHdpdGggYW4gaW5kaXZpZHVhbCByZXNvdXJjZSBmaWxlLCAKKyAgICAgICAgc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSB0cmVlIGJ5IGNsaWNraW5nIG9uIGl0LiBOb3cgY2hhbmdlcyBhbmQgdmlld3Mgd2lsbCAKKyAgICAgICAgcmVmbGVjdCBvbmx5IHRoaXMgc2VsZWN0ZWQgcmVzb3VyY2UgZmlsZS48L1A+CisgICAgICA8UD5Ob3RlIHRoYXQgc2VsZWN0aW5nIHRoZSB2YXJpb3VzIGJyYW5jaCBub2RlcyBkb2VzIG5vdCBoYXZlIGFueSBtZWFuaW5nIAorICAgICAgICBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJCTWFuYWdlci4gSW4gZnV0dXJlIHZlcnNpb25zIHRoZSBhYmlsaXR5IHRvIAorICAgICAgICB3b3JrIG9uIHN1YnRyZWVzIG1heSBiZSBhZGRlZCwgYnV0IGZvciBub3cgZWl0aGVyIHNlbGVjdCB0aGUgcmVzb3VyY2UgCisgICAgICAgIGJ1bmRsZSBvciBhbiBpbmRpdmlkdWFsIGZpbGUuPC9QPgorICAgICAgPFA+VW5kZXJzdGFuZGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdvcmtpbmcgd2l0aCB0aGUgcmVzb3VyY2UgYnVuZGxlIAorICAgICAgICBhbmQgd29ya2luZyB3aXRoIGEgcmVzb3VyY2UgZmlsZSBpcyBjcnVjaWFsIHRvIHVzaW5nIFJCIE1hbmFnZXIuIE5vcm1hbGx5IAorICAgICAgICBkZXZlbG9wZXJzIGFkZGluZyByZXNvdXJjZXMgb3IgbWFuYWdlciB3aXNoaW5nIHRvIGtub3cgdGhlIHN0YXR1dHMgb2YgCisgICAgICAgIHRyYW5zbGF0aW9uIGVmZm9ydHMgd2lsbCB3b3JrIGZyb20gdGhlIHJvb3QgbGV2ZWwuIFRyYW5zbGF0b3JzIGFuZCBtYW5hZ2VycyAKKyAgICAgICAgb2YgaW5kaXZpZHVhbCByZXNvdXJjZSBmaWxlcyB3aWxsIG1vcmUgb2Z0ZW4gd29yayBmcm9tIHRoZSByZXNvdXJjZSBmaWxlIAorICAgICAgICBsZXZlbC4gT25jZSB0aGUgZGlmZmVyZW5jZSBpcyB1bmRlcnN0b29kLCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdmlld3MgCisgICAgICAgIGluIHRoZSB0YWIgd2lsbCBiZSBlYXNpZXIgdG8gdW5kZXJzdGFuZC48L1A+CisgICAgICA8UCBBTElHTj0iQ0VOVEVSIj48QSBIUkVGPSJ2aWV3Mi5odG1sIj5WaWV3IDIuIFRoZSBTdGF0aXN0aWNzIFRhYjwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzIuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXcyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0OWM0OQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXcyLmh0bWwKQEAgLTAsMCArMSwxNjEgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciAtIFRoZSBTdGF0aXN0aWNzIFRhYjwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vdHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5WaWV3IDIuIFRoZSBTdGF0aXN0aWNzIFRhYjwvSDM+CisgICAgICA8UD5UaGUgZmlyc3QgdGFiIG9uIHRoZSByaWdodCBwYW5lbCBvZiB0aGUgUkIgTWFuYWdlciBhcHBsaWNhdGlvbiBpcyB0aGUgCisgICAgICAgIFN0YXRpc3RpY3MgdGFiLiBBcyB3aXRoIGFsbCBvZiB0aGUgdGFiIHZpZXdzLCB0aGUgc3RhdGlzdGljcyB0YWIgbG9va3MgCisgICAgICAgIGFuZCBmdW5jdGlvbnMgZGlmZmVyZW50bHkgd2hlbiB3b3JraW5nIHdpdGggdGhlIHJlc291cmNlIGJ1bmRsZSBhcyBhIHdob2xlIAorICAgICAgICB0aGFuIHdoZW4gd29ya2luZyB3aXRoIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS4gRm9yIGFuIG92ZXJ2aWV3IG9mIAorICAgICAgICB0aGlzIGRpZmZlcmVuY2Ugc2VlIDxBIEhSRUY9InZpZXcxLmh0bWwiPlZpZXcgMTwvQT4uPC9QPgorICAgICAgPFA+PEI+V29ya2luZyB3aXRoIGEgUmVzb3VyY2UgQnVuZGxlPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBzY3JlZW4gc2hvdCBiZWxvdyBzaG93cyBSQiBNYW5hZ2VyIGFuZCBzb21lIHN0YXRpc3RpY3MgY29uY2VybmluZyAKKyAgICAgICAgdGhlIHJlc291cmNlIGJ1bmRsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uLjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zdGF0c19idW5kbGUuZ2lmIiBXSURUSD0iNjQyIiBIRUlHSFQ9IjU0MyI+PC9QPgorICAgICAgPFA+VGhyZWUgYmFzaWMgYXJlYXMgYXJlIGNvdmVyZWQgYnkgdGhpcyB2aWV3LCBSZXNvdXJjZSBGaWxlcywgUmVzb3VyY2UgCisgICAgICAgIEdyb3VwcywgYW5kIFJlc291cmNlIEl0ZW1zLjwvUD4KKyAgICAgIDxQPkluIHRoZSBSZXNvdXJjZSBGaWxlcyBzZWN0aW9uLCB0aGUgdG90YWwgbnVtYmVyIG9mIGluZGl2aWR1YWwgZmlsZXMgaXMgCisgICAgICAgIHNob3duIGFzIHdlbGwgYXMgdGhlIG5hbWVzIG9mIHRoZXNlIGZpbGVzIChtYWRlIHVwIG9mIHRoZSBsYW5ndWFnZSwgY291bnRyeSwgCisgICAgICAgIGFuZCB2YXJpYW50IGluZm9ybWF0aW9uIGtub3duIGFib3V0IHRoZSBmaWxlcykuIE5ldyByZXNvdXJjZSBmaWxlcyBjYW4gCisgICAgICAgIGJlIGFkZGVkIHRvIHRoZSBidW5kbGUgYnkgcHJlc3NpbmcgdGhlICdBZGQgYSBOZXcgUmVzb3VyY2UgRmlsZScgYnV0dG9uIAorICAgICAgICBvciB1c2luZyB0aGUgYWNjZWxlcmF0b3Iga2V5IChpbiB0aGlzIGNhc2UgJ04nKSBpbiB0aGUgbWFubmVyIHNwZWNpZmllZCAKKyAgICAgICAgYnkgeW91ciBvcGVyYXRpbmcgc3lzdGVtLiBOZXcgZmlsZXMgY2FuIGFsc28gYmUgYWRkZWQgdGhyb3VnaCB0aGUgT3B0aW9ucyAKKyAgICAgICAgbWVudS48L1A+CisgICAgICA8UD5JbiB0aGUgUmVzb3VyY2UgR3JvdXBzIHNlY3Rpb24sIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3JvdXBzIGFzc29jaWF0ZWQgCisgICAgICAgIHdpdGggdGhlIGJ1bmRsZSBhcyB3ZWxsIGFzIGFuIGFscGhhYmV0aWNhbCBsaXN0IG9mIHRoZSBncm91cHMgaXMgZGlzcGxheWVkLiAKKyAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gUmVzb3VyY2UgR3JvdXBzLCBzZWUgdGhlIDxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPi4gCisgICAgICAgIE5ldyBncm91cHMgY2FuIGJlIGNyZWF0ZWQgYnkgcHJlc3NpbmcgdGhlICdBZGQgYSBOZXcgUmVzb3VyZWNlIEdyb3VwJyAKKyAgICAgICAgYnV0dG9uLiBUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZnJvbSB0aGUgT3B0aW9ucyBtZW51IG9yIHRoZSBHcm91cHMgdGFiIAorICAgICAgICB2aWV3LjwvUD4KKyAgICAgIDxQPkluIHRoZSBSZXNvdXJjZSBJdGVtcyB2aWV3LCB0aGUgdG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyBpbiB0aGUgYnVuZGxlIAorICAgICAgICBpcyBkaXNwbGF5ZWQuIFRoaXMgbnVtYmVyIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIGJhc2UgCisgICAgICAgIGNsYXNzIGZpbGUsIGFzIHRoZSBvdGhlciByZXNvdXJjZSBmaWxlcyBhcmUgbm90IHJlcXVpcmVkIHRvIHBvc3NlcyBhbGwgCisgICAgICAgIG9mIHRoZSByZXNvdXJjZSBpdGVtcy4gSW4gYWRkaXRpb24sIHRoZSBudW1iZXIgb2YgZHVwbGljYXRlZCByZXNvdXJjZSAKKyAgICAgICAga2V5cyBpcyBkaXNwbGF5ZWQuIFRoaXMgbnVtYmVyIHNob3VsZCBiZSB6ZXJvIG9yIHRoZSByZXNvdXJjZSBidW5kbGUgbWF5IAorICAgICAgICBub3QgZnVuY3Rpb24gdGhlIHdheSBpdCB3YXMgaW50ZW5kZWQgdG8uIFRoZSBsaXN0IGJveCB3aWxsIGRpc3BsYXkgdGhlIAorICAgICAgICBuYW1lcyBvZiB0aGUgZHVwbGljYXRlZCBrZXlzLCBzbyB0aGF0IHRoZSBlcnJvcnMgY2FuIGJlIHJlbW92ZWQuIE5vdGUgCisgICAgICAgIHRoYXQgaWYgeW91IGNyZWF0ZSB5b3VyIFJlc291cmNlIEJ1bmRsZXMgdGhyb3VnaCBSQiBNYW5hZ2VyLCB5b3Ugc2hvdWxkIAorICAgICAgICBuZXZlciBoYXZlIGR1cGxpY2F0ZSBrZXlzLiBIb3dldmVyLCBpZiB5b3UgaW1wb3J0ZWQgdGhlIGJ1bmRsZXMgZnJvbSBhbm90aGVyIAorICAgICAgICBzb3VyY2UsIHRoaXMgZXJyb3IgY2FuIGJlIGEgY29tbW9uIG9uZS48L1A+CisgICAgICA8UD48Qj5Xb3JraW5nIHdpdGggYSBSZXNvdXJjZSBGaWxlPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBzY3JlZW4gc2hvdCBiZWxvdyBzaG93cyB0aGUgc3RhdGlzdGljcyB2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHJlc291cmNlIAorICAgICAgICBmaWxlLCBpbiB0aGlzIGNhc2UgdGhlIEdlcm1hbiAoRGV1dHNjaCkgZmlsZS4gRm9yIG91ciBleGFtcGxlLCBJIGhhdmUgCisgICAgICAgIHJlbW92ZWQgc29tZSBvZiB0aGUgdHJhbnNsYXRpb25zIGZyb20gdGhpcyBmaWxlLjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zdGF0c19maWxlLmdpZiIgV0lEVEg9IjY3MSIgSEVJR0hUPSI1NDMiPjwvUD4KKyAgICAgIDxQPlRoaXMgdmlldyBzaG93cyBzb21lIG1ldGEgZGF0YSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVzb3VyY2UgRmlsZS4gCisgICAgICAgIFRoaXMgbWV0YSBkYXRhIGhhcyBhYnNvbHV0ZWx5IG5vIGltcGFjdCBvbiB0aGUgZnVuY3Rpb25pbmcgb2YgdGhlIHJlc291cmNlIAorICAgICAgICBidW5kbGUgd2l0aGluIGFuIGFwcGxpY2F0aW9uLiBJdCBpcyB0aGVyZSBzb2xlbHkgdG8gYWlkIGRldmVsb3BtZW50IGFuZCAKKyAgICAgICAgdHJhbnNsYXRpb24gdGVhbXMgaW4gbWFuYWdpbmcgdGhlaXIgZWZmb3J0cy48L1A+CisgICAgICA8UD5UaGUgUmVzb3VyY2UgVGl0bGUgaXMgYSB3YXkgdG8gaWRlbnRpZnkgdGhpcyBmaWxlIGFuZCB3aWxsIHNob3cgYXQgdGhlIAorICAgICAgICB0b3Agb2YgbW9zdCB2aWV3cyB3aGVuIHdvcmtpbmcgd2l0aCBhIHJlc291cmNlIGZpbGUuIFRoZSBDb21tZW50IGNhbiBiZSAKKyAgICAgICAgdXNlZCB0byBzcGVjaWZ5IGFueXRoaW5nIHNwZWNpYWwgYWJvdXQgdGhpcyBmaWxlLiBUaGUgUmVzb3VyY2UgRmlsZSBNYW5hZ2VyIAorICAgICAgICBpcyB0aGUgcGVyc29uIGluIGNoYXJnZSBvZiB0cmFuc2xhdGlvbnMgaW4gdGhlIGxvY2FsZSBhc3NvY2lhdGVkIHdpdGggCisgICAgICAgIHRoZSBmaWxlLiBUaGUgTGFuZ3VhZ2UsIENvdW50cnksIGFuZCBWYXJpYW50IHJlcHJlc2VudCB0aGUgbG9uZyBuYW1lcyAKKyAgICAgICAgKGkuZS4gbm90IHRoZSBJU08gZW5jb2RpbmdzKSBvZiB0aGUgbGFuZ3VhZ2UsIGNvdW50cnksIGFuZCB2YXJpYW50IGFzc29jaWF0ZSAKKyAgICAgICAgd2l0aCB0aGUgZmlsZS4gVGhlc2UgYXJlIHRoZSBuYW1lcyB0aGF0IHNob3cgdXAgaW4gdGhlIFJlc291cmNlIFRyZWUuPC9QPgorICAgICAgPFA+QWxzbyBkaXNwbGF5ZWQgZm9yIHRoZSBzZWxlY3RlZCBmaWxlIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNsYXRpb25zIAorICAgICAgICBpbiB0aGlzIGZpbGUuIFRoaXMgbnVtYmVyIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiAKKyAgICAgICAgdHJhbnNsYXRpb25zIGluIHRoZSBidW5kbGUuIFRoZSBudW1iZXIgb2YgdW50cmFuc2xhdGVkIHJlc291cmNlIGl0ZW1zIAorICAgICAgICBpcyBhbHNvIHNob3duLiBUaGVzZSBzdGF0aXN0aWNzIGFyZSB1c2VmdWwgaW4gbW9uaXRvcmluZyB0aGUgcHJvZ3Jlc3MgCisgICAgICAgIG9mIHRyYW5zbGF0aW9uLiBUbyB3b3JrIHdpdGggdGhlIHVudHJhbnNsYXRlZCBpdGVtcywgYSBjb252ZW5pZW50IHZpZXcgCisgICAgICAgIGlzIGdpdmVuIGluIHRoZSBVbnRyYW5zbGF0ZWQgdGFiIHZpZXcuPC9QPgorICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEEgSFJFRj0idmlldzMuaHRtbCI+VmlldyAzLiBUaGUgVW50cmFuc2xhdGVkIFRhYjwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzMuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXczLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhMmM0NwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXczLmh0bWwKQEAgLTAsMCArMSwxNTUgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciAtIFRoZSBVbnRyYW5zbGF0ZWQgVGFiPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi90dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPlZpZXcgMy4gVGhlIFVudHJhbnNsYXRlZCBUYWI8L0gzPgorICAgICAgPFA+VGhlIFVudHJhbnNsYXRlZCB0YWIgdmlldywgbGlrZSBhbGwgdGFiIHZpZXdzLCBsb29rcyBhbmQgZnVuY3Rpb25zIGRpZmZlcmVudGx5IAorICAgICAgICB3aGVuIHdvcmtpbmcgd2l0aCB0aGUgcmVzb3VyY2UgYnVuZGxlIGFzIGEgd2hvbGUgdGhhbiB3aGVuIHdvcmtpbmcgd2l0aCAKKyAgICAgICAgYW4gaW5kaXZpZHVhbCByZXNvdXJjZSBmaWxlLiBGb3IgYW4gb3ZlcnZpZXcgb2YgdGhpcyBkaWZmZXJlbmNlIHNlZSA8QSBIUkVGPSJ2aWV3MS5odG1sIj5WaWV3IAorICAgICAgICAxPC9BPi4gVGhlIFVudHJhbnNsYXRlZCB0YWIgdmlldyBpcyBtb3N0IG9mdGVuIHVzZWQgd2hlbiB3b3JraW5nIHdpdGggCisgICAgICAgIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZXMsIGFuZCBpcyBwcm9iYWJseSB0aGUgbGFyZ2VzdCBjb252ZW5pZW5jZSB0aGF0IAorICAgICAgICBSQiBNYW5hZ2VyIG9mZmVycyBvdmVyIG90aGVyIG1ldGhvZHMgb2Ygd29ya2luZyB3aXRoIHJlc291cmNlIGJ1bmRsZXMuPC9QPgorICAgICAgPFA+PEI+V29ya2luZyB3aXRoIGEgUmVzb3VyY2UgQnVuZGxlPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBzY3JlZW4gc2hvdCBiZWxvdyBzaG93cyBSQiBNYW5hZ2VyIGFuZCBhIHZpZXcgb2YgdW50cmFuc2xhdGVkIGl0ZW1zIAorICAgICAgICBmb3IgdGhlIGVudGlyZSByZXNvdXJjZSBidW5kbGUuPC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfYnVuZGxlLmdpZiIgV0lEVEg9IjY3MSIgSEVJR0hUPSI1NDMiPjwvUD4KKyAgICAgIDxQPkZyb20gdGhpcyB2aWV3LCByZXNvdXJjZSBidW5kbGVzIGNhbiBub3QgYmUgZWRpdGVkLiBUbyBkbyB0aGlzIHlvdSBlaXRoZXIgCisgICAgICAgIGhhdmUgdG8gZ28gdG8gdGhlIEdyb3VwcyB0YWIgdmlldyBvciBzZWxlY3QgYW4gaW5kaXZpZHVhbCByZXNvdXJjZSBmaWxlLiAKKyAgICAgICAgVGhlIHZpZXcgaXMgdXNlZnVsIHRob3VnaCBmb3IgZ2V0dGluZyBhIHBpY3R1cmUgb2YgdGhlIHRyYW5zbGF0aW9uIHN0YXR1cyAKKyAgICAgICAgb2YgdGhlIGVudGlyZSByZXNvdXJjZSBidW5kbGUuPC9QPgorICAgICAgPFA+SW4gdGhpcyB2aWV3LCBlYWNoIG9mIHRoZSByZXNvdXJjZSBmaWxlcyBpcyByZXByZXNlbnRlZCBhbmQgdGhlIG51bWJlciAKKyAgICAgICAgb2YgdW50cmFuc2xhdGVkIGl0ZW1zIGlzIGRpc3BsYXllZCBhcyB3ZWxsIGFzIHRoZSByZXNvdXJjZSBrZXkgZm9yIGVhY2ggCisgICAgICAgIG9mIHRob3NlIGl0ZW1zLiBTY3JvbGxpbmcgdXAgYW5kIGRvd24gdGhlIHZpZXcgZ2l2ZXMgYSBjb21wbGV0ZSBsb29rIGF0IAorICAgICAgICB0aGUgdmFyaW91cyBmaWxlcy48L1A+CisgICAgICA8UD48Qj5Xb3JraW5nIHdpdGggYSBSZXNvdXJjZSBGaWxlPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBuZXh0IHNjcmVlbiBzaG90IHNob3dzIHRoZSBVbnRyYW5zbGF0ZWQgdGFiIHZpZXcgd2hlbiB3b3JraW5nIHdpdGggCisgICAgICAgIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS4gVGhpcyBpcyB0aGUgdmlldyB0cmFuc2xhdG9ycyB3aWxsIHByb2JhYmx5IAorICAgICAgICB1c2UgdGhlIG1vc3QuPC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZmlsZS5naWYiIFdJRFRIPSI2NzEiIEhFSUdIVD0iNTQzIj48L1A+CisgICAgICA8UD5MaXN0ZWQgaW4gdGhlIHRhYmxlIGlzIGVhY2ggb2YgdGhlIHJlc291cmNlIGN1cnJlbnRseSBtYXJrZWQgYXMgdW50cmFuc2xhdGVkIAorICAgICAgICAoZm9yIG1vcmUgb24gdGhlIG1ldGEgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCByZXNvdXJjZSwgc2VlIHRoZSA8QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT4pLiAKKyAgICAgICAgVGhlIHRhYmxlIHNob3dzIHRoZSByZXNvdXJjZSBrZXkgYW5kIGdyb3VwIG9mIHRoZSByZXNvdXJjZSwgd2hpY2ggY2FuIAorICAgICAgICBub3QgYmUgZWRpdGVkIGZyb20gYSByZXNvdXJjZSBmaWxlIHZpZXcsIGFuZCB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIHJlc291cmNlLCAKKyAgICAgICAgd2hpY2ggY2FuIGJlIGVkaXRlZCBoZXJlLjwvUD4KKyAgICAgIDxQPlRvIHRyYW5zbGF0ZSBhIHJlc291cmNlLCBzaW1wbHkgZG91YmxlIGNsaWNrIHRoZSByb3cgY29udGFpbmluZyB0aGUgcmVzb3VyY2UuIAorICAgICAgICBBIGRpYWxvZyBib3ggd2lsbCBwb3AgdXAgYWxsb3dpbmcgdGhlIHJlc291cmNlIGZpbGUgc3BlY2lmaWMgZWxlbWVudHMgCisgICAgICAgIG9mIHRoZSByZXNvdXJjZSB0byBiZSBlZGl0ZWQuIFRoYXQgZGlhbG9nIGJveCBpcyBzaG93biBoZXJlLiBJdHMgdXNlIGNhbiAKKyAgICAgICAgYmUgZm91bmQgaW4gdGhlIFR1dG9yaWFsLjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2RpYWxvZzAuZ2lmIiBXSURUSD0iNTEzIiBIRUlHSFQ9IjI2OSI+PC9QPgorICAgICAgPFA+SW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGxlYXZlIHRoZSB0cmFuc2xhdGlvbiBhcyBpdCBzdGFuZHMuIFRoaXMgCisgICAgICAgIGlzIGNvbW1vbiBmb3IgaW5zdGFuY2Ugd2hlbiB3b3JraW5nIHdpdGggdmFyaWFudHMgb2YgYSBsYW5ndWFnZSB3aXRoIGxpdHRsZSAKKyAgICAgICAgY2hhbmdlIGZyb20gdGhlIGxhbmd1YWdlIHBhcmVudCAoZS5nLiBDYW5hZGlhbiBFbmdsaXNoIGFuZCBVLlMuIEVuZ2xpc2ggCisgICAgICAgIGhhdmUgcmVsYXRpdmVseSBmZXcgZGlmZmVyZW5jZXMpLjwvUD4KKyAgICAgIDxQPlRoZXJlIGFyZSB0d28gd2F5cyB0byBoYW5kbGUgdGhpcy4gT25lIHdheSBpcyB0byBzZWxlY3QgdGhlIHJlc291cmNlIAorICAgICAgICBhbmQgbWFyayBpdCBhcyB0cmFuc2xhdGVkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHByZXNzaW5nIHRoZSAnTWFyayBSZXNvdXJjZSAKKyAgICAgICAgYXMgVHJhbnNsYXRlZCcgYnV0dG9uIG9yIGRvdWJsZSBjbGlja2luZyB0aGUgcmVzb3VyY2UsIGNoZWNraW5nIHRoZSAnVHJhbnNsYXRlZCcgCisgICAgICAgIGNoZWNrIGJveCBhbmQgY2xpY2tpbmcgdGhlICdFZGl0JyBidXR0b24uIFRoZSBvdGhlciB3YXkgaXMgdG8gcmVtb3ZlIHRoZSAKKyAgICAgICAgcmVzb3VyY2UgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZSBieSBzZWxlY3RpbmcgdGhlIHJlc291cmNlIGFuZCBjbGlja2luZyAKKyAgICAgICAgJ0RlbGV0ZSBSZXNvdXJjZScuPC9QPgorICAgICAgPFA+RWl0aGVyIHdheSwgdGhlIHJlc291cmNlIGJ1bmRsZSBzaG91bGQgYWN0IHRoZSBzYW1lIHdoZW4gcHJlc2VudGluZyB0cmFuc2xhdGlvbnMgCisgICAgICAgIHRvIHRoZSB1c2VyLiBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB0cmFuc2xhdGlvbiBmcm9tIHRoZSByZXNvdXJjZSBmaWxlIAorICAgICAgICBpcyB1c2VkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSB0cmFuc2xhdGlvbiBmYWxscyBiYWNrIHRvIHRoZSBvbmUgZm91bmQgCisgICAgICAgIGluIGFuIGFuY2VzdG9yIHJlc291cmNlIGZpbGUuPC9QPgorICAgICAgPFA+Tm90ZSB0aGF0IG9ubHkgb25lIHJlc291cmNlIGNhbiBiZSBlZGl0ZWQgYXQgYSB0aW1lIGluIHRoZSBjdXJyZW50IHZlcnNpb24gCisgICAgICAgIG9mIFJCIE1hbmFnZXIuIEZ1dHVyZSB2ZXJzaW9ucyB3aWxsIGFsbG93IG11bHRpcGxlIHNlbGVjdGlvbnMgb2YgcmVzb3VyY2VzIAorICAgICAgICBpbiB0aGlzIHZpZXcuPC9QPgorICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEEgSFJFRj0idmlldzQuaHRtbCI+VmlldyA0LiBUaGUgR3JvdXBzIFRhYjwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzQuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXc0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlNDI5MgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXc0Lmh0bWwKQEAgLTAsMCArMSwxNDUgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciAtIFRoZSBHcm91cHMgVGFiPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi90dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPlZpZXcgNC4gVGhlIEdyb3VwcyBUYWI8L0gzPgorICAgICAgPFA+VGhlIEdyb3VwcyB0YWIgdmlldywgbGlrZSBhbGwgdGFiIHZpZXdzLCBsb29rcyBhbmQgZnVuY3Rpb25zIGRpZmZlcmVudGx5IAorICAgICAgICB3aGVuIHdvcmtpbmcgd2l0aCB0aGUgcmVzb3VyY2UgYnVuZGxlIGFzIGEgd2hvbGUgdGhhbiB3aGVuIHdvcmtpbmcgd2l0aCAKKyAgICAgICAgYW4gaW5kaXZpZHVhbCByZXNvdXJjZSBmaWxlLiBGb3IgYW4gb3ZlcnZpZXcgb2YgdGhpcyBkaWZmZXJlbmNlIHNlZSA8QSBIUkVGPSJ2aWV3MS5odG1sIj5WaWV3IAorICAgICAgICAxPC9BPi4gUkIgTWFuYWdlciBhZGRzIGEgbGV2ZWwgb2YgaGVpcmFyY2h5IG5vdCBjb21tb25seSBmb3VuZCBpbiByZXNvdXJjZSAKKyAgICAgICAgYnVuZGxlcy4gVGhpcyBhZGR0aW9uYWwgbGV2ZWwgaXMgY2FsbGVkIEdyb3Vwcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gCisgICAgICAgIFJlc291cmNlIEdyb3VwcyBzZWUgdGhlIDxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPi48L1A+CisgICAgICA8UD48Qj5Xb3JraW5nIHdpdGggYSBSZXNvdXJjZSBCdW5kbGU8L0I+PC9QPgorICAgICAgPFA+VGhlIHNjcmVlbiBzaG90IGJlbG93IHNob3dzIFJCIE1hbmFnZXIgYW5kIGEgdmlldyBvZiBncm91cHMgZm9yIHRoZSBlbnRpcmUgCisgICAgICAgIHJlc291cmNlIGJ1bmRsZS48L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2J1bmRsZS5naWYiIFdJRFRIPSI2NzEiIEhFSUdIVD0iNTQzIj48L1A+CisgICAgICA8UD5Vbmxpa2UgdGhlIFVudHJhbnNsYXRlZCB0YWIgdmlldywgdGhpcyB2aWV3IGFsbG93cyB0aGUgZWRpdGluZyBvZiByZXNvdXJjZXMuIAorICAgICAgICBFZGl0aW5nIG9yIGFkZGluZyByZXNvdXJjZXMgYXQgdGhpcyBsZXZlbCBhZmZlY3RzIHRoZSByZXNvdXJjZSBidW5kbGUgCisgICAgICAgIGFzIGEgd2hvbGUuIFRodXMgaWYgYSByZXNvdXJjZSBoYXMgYWxsIHJlYWR5IGJlZW4gdHJhbnNsYXRlZCBpbiBhIHJlc291cmNlIAorICAgICAgICBmaWxlLCBpdCB3aWxsIGJlIG1hcmtlZCBhcyB1bnRyYW5zbGF0ZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlIGluIHRoZSBlbnRpcmUgCisgICAgICAgIGJ1bmRsZS48L1A+CisgICAgICA8UD5FZGl0aW5nIGEgcmVzb3VyY2UgaXMgYXMgc2ltcGxlIGFzIHNlbGVjdGluZyB0aGUgZ3JvdXAgZnJvbSB0aGUgZHJvcCAKKyAgICAgICAgZG93biBib3ggYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuLCBkb3VibGUgY2xpY2tpbmcgYSByZXNvdXJjZSwgbWFraW5nIAorICAgICAgICB0aGUgZGVzaXJlZCBjaGFuZ2UsIGFuZCBjbGlja2luZyAnRWRpdCcgb24gdGhlIGRpYWxvZyBib3ggcmVzdWx0aW5nIGZyb20gCisgICAgICAgIHRoZSBkb3VibGUgY2xpY2suIE9wdGlvbmFsbHksIHRoZSByZXNvdXJjZSBjYW4gYmUgZWRpdGVkIGJ5IHNlbGVjdGluZyAKKyAgICAgICAgaXQgYW5kIHByZXNzaW5nIHRoZSAnRWRpdCBSZXNvdXJjZScgYnV0dG9uIGluc3RlYWQgb2YgZG91YmxlIGNsaWNraW5nLjwvUD4KKyAgICAgIDxQPlRoZSBSZXNvdXJjZSBHcm91cCBjYW4gYWxzbyBiZSBlZGl0ZWQuIFRoZSBuYW1lIGFuZCBjb21tZW50IGFzc29jaWF0ZSAKKyAgICAgICAgd2l0aCB0aGUgZ3JvdXAgY2FuIGJlIGNoYW5nZWQgYnkgcHJlc3NpbmcgdGhlICdFZGl0IEdyb3VwJyBidXR0b24uIFByZXNzaW5nIAorICAgICAgICB0aGUgJ0RlbGV0ZSBHcm91cCcgYnV0dG9uIHdpbGwgZGVsZXRlIGJvdGggdGhlIGdyb3VwIGFuZCBhbGwgcmVzb3VyY2VzIAorICAgICAgICBjb250YWluZWQgd2l0aGluIGl0LiBBIGRpYWxvZyB3aWxsIHByb21wdCB5b3Ugd2hlbiB0aGlzIGJ1dHRvbiBpcyBwcmVzc2VkIAorICAgICAgICB0byBtYWtlIHN1cmUgdGhpcyBpcyB3aGF0IHlvdSBpbnRlbmQgdG8gZG8uPC9QPgorICAgICAgPFA+UmVzb3VyY2VzIGNyZWF0ZWQgaW4gdGhlIEdyb3VwIHZpZXcgd2lsbCBieSBkZWZhdWx0IGJlIHBsYWNlZCBpbiB0aGUgCisgICAgICAgIGdyb3VwIGN1cnJlbnRseSBiZWluZyBzaG93bi4gVGhpcyBjYW4gYmUgY2hhbmdlZCBob3dldmVyIGJ5IHNlbGVjdGluZyAKKyAgICAgICAgYW5vdGhlciBncm91cCBuYW1lIGZyb20gdGhlIHJlc291cmNlIGNyZWF0aW9uIGRpYWxvZyBib3guPC9QPgorICAgICAgPFA+VGhpcyB2aWV3IGlzIHByb2JhYmx5IHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgdmlldyBieSBkZXZlbG9wZXJzIGluc2VydGluZyAKKyAgICAgICAgbmV3IHJlc291cmNlcyBpbnRvIGEgYnVuZGxlLjwvUD4KKyAgICAgIDxQPjxCPldvcmtpbmcgd2l0aCBhIFJlc291cmNlIEZpbGU8L0I+PC9QPgorICAgICAgPFA+VGhlIG5leHQgc2NyZWVuIHNob3Qgc2hvd3MgdGhlIEdyb3VwIHRhYiB2aWV3IHdoZW4gd29ya2luZyB3aXRoIGFuIGluZGl2aWR1YWwgCisgICAgICAgIHJlc291cmNlIGZpbGUuPC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19maWxlLmdpZiIgV0lEVEg9IjY3MSIgSEVJR0hUPSI1NDMiPjwvUD4KKyAgICAgIDxQPlRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgdmlldyBtb3N0bHkgbWlycm9ycyB0aGF0IG9mIHRoZSBVbnRyYW5zbGF0ZWQgCisgICAgICAgIHRhYiB2aWV3LiBNb3JlIG9uIHRoYXQgdmlldyBpcyBmb3VuZCBpbiA8QSBIUkVGPSJ2aWV3My5odG1sIj5WaWV3IDM8L0E+LiAKKyAgICAgICAgVGhlIG9ubHkgYWRkaXRpb24gaXMgdGhhdCByZXNvdXJjZXMgYWxsIHJlYWR5IG1hcmtlZCBhcyB0cmFuc2xhdGVkIGNhbiAKKyAgICAgICAgYmUgc2VlbiBhbmQgZWRpdGVkIGZyb20gdGhpcyB2aWV3LiBTZWxlY3RpbmcgYSBncm91cCBmcm9tIHRoZSBkcm9wIGRvd24gCisgICAgICAgIGJveCB3aWxsIHVwZGF0ZSB0aGUgZGlzcGxheSB3aXRoIGFsbCByZXNvdXJjZXMsIHRyYW5zbGF0ZWQgb3Igbm90LCBmcm9tIAorICAgICAgICB0aGF0IGdyb3VwLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxBIEhSRUY9InZpZXc1Lmh0bWwiPlZpZXcgNS4gVGhlIFNlYXJjaCBUYWI8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXc1Lmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3NS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZWMwOWQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3NS5odG1sCkBAIC0wLDAgKzEsMTMxIEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgLSBUaGUgU2VhcmNoIFRhYjwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vdHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5WaWV3IDUuIFRoZSBTZWFyY2ggVGFiPC9IMz4KKyAgICAgIDxQPlRoZSBHcm91cHMgdGFiIHZpZXcsIGxpa2UgYWxsIHRhYiB2aWV3cywgbG9va3MgYW5kIGZ1bmN0aW9ucyBkaWZmZXJlbnRseSAKKyAgICAgICAgd2hlbiB3b3JraW5nIHdpdGggdGhlIHJlc291cmNlIGJ1bmRsZSBhcyBhIHdob2xlIHRoYW4gd2hlbiB3b3JraW5nIHdpdGggCisgICAgICAgIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS4gSG93ZXZlciwgdW5saWtlIHRoZSBvdGhlciB0YWIgdmlld3MsIHRoZSAKKyAgICAgICAgZGlmZmVyZW5jZXMgYXJlIG1pbmltYWwuIFNlYXJjaGluZyBmcm9tIHRoZSBidW5kbGUgcGVyZm9ybXMgdGhlIHNlYXJjaCAKKyAgICAgICAgb24gdGhlIGJhc2UgY2xhc3MgYW5kIGVkaXRzIHRvIHRoZSBmb3VuZCByZXNvdXJjZXMgYWZmZWN0IHRoZSBlbnRpcmUgYnVuZGxlLiAKKyAgICAgICAgU2VhcmNoaW5nIGZyb20gYSByZXNvdXJjZSBmaWxlIHJlc3RyaWN0cyB0aGUgc2VhcmNoIHRvIHRoYXQgZmlsZSBhbmQgdGhlIAorICAgICAgICBjaGFuZ2VzIGFyZSBhbHNvIHJlc3RyaWN0ZWQgdG8gdGhhdCByZXNvdXJjZSBmaWxlLjwvUD4KKyAgICAgIDxQPkEgc2NyZWVuIHNob3Qgb2YgdGhlIFNlYXJjaCB0YWIgdmlldyBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSBpcyBnaXZlbiAKKyAgICAgICAgYmVsb3cuIFRoZSB2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCByZXNvdXJjZSBmaWxlcyBpcyBuZWFybHkgaWRlbnRpY2FsLjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zZWFyY2guZ2lmIiBXSURUSD0iNjcxIiBIRUlHSFQ9IjU0MyI+PC9QPgorICAgICAgPFA+VGhlcmUgYXJlIHR3byBiYXNpYyBmdW5jdGlvbnMgdG8gdGhpcyB2aWV3LCBGaW5kIEFsbCBhbmQgUmVwbGFjZSBBbGwuIAorICAgICAgICBGaW5kIEFsbCB0YWtlcyB0aGUgcGFyYW1ldGVycyBnaXZlbiBpdCBhbmQgcG9wdWxhdGVzIHRoZSByZXN1bHQgdGFibGUgCisgICAgICAgIHdpdGggYW55IG1hdGNoZXMgZm91bmQgKG5vdGUgdGhhdCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJCIE1hbmFnZXIgZG9lcyAKKyAgICAgICAgbm90IHN1cHBvcnQgd2lsZCBjYXJkIGNoYXJhY3RlcnMgb3IgcmVndWxhciBleHByZXNzaW9ucykuIFRoZSByZXN1bHRpbmcgCisgICAgICAgIHRhYmxlIGNhbiBiZSBlZGl0ZWQgYXMgaW4gdGhlIG90aGVyIHZpZXdzIGJ5IGRvdWJsaW5nIGNsaWNraW5nIGEgcm93IGluIAorICAgICAgICB0aGUgdGFibGUuPC9QPgorICAgICAgPFA+UmVwbGFjZSBBbGwgd29ya3MgYnkgZmlyc3QgZmluZGluZyBhbGwgb2YgdGhlIHJlc291cmNlcyBpbiB0aGUgc2FtZSBtYW5uZXIgCisgICAgICAgIGFzIEZpbmQgQWxsIGFuZCB0aGVuIHJlcGxhY2luZyB0aGUgdGV4dCB0aGF0IGlzIGZvdW5kIHdpdGggdGhlIHRleHQgZ2l2ZW4gCisgICAgICAgIGluIHRoZSBSZXBsYWNlIHRleHQgYm94LiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBmaXJzdCBwZXJmb3JtIEZpbmQgCisgICAgICAgIEFsbCBiZWZvcmUgUmVwbGFjZSBBbGwuIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgUkIgTWFuYWdlciBkb2VzIGFuIGFsbCAKKyAgICAgICAgb3Igbm90aGluZyByZXBsYWNlLiBGdXR1cmUgdmVyc2lvbnMgbWF5IGFsbG93IHN0ZXAgYnkgc3RlcCByZXBsYWNlbWVudC48L1A+CisgICAgICA8UD5Vc2luZyB0aGUgY2hlY2sgYm94ZXMgb24gdGhlIHBhZ2UsIHlvdSBjYW4gc3BlY2lmeSBhbnkgY29tYmluYXRpb24gb2YgCisgICAgICAgIHRocmVlIHBhcnRzIG9mIHRoZSByZXNvdXJjZXMgdG8gc2VhcmNoOiBSZXNvdXJjZSBLZXlzLCBUcmFuc2xhdGlvbnMsIGFuZCAKKyAgICAgICAgQ29tbWVudHMuIEEgZm91cnRoIGNoZWNrIGJveCBhbGxvd3MgeW91IHRvIG1ha2UgdGhlIHNlYXJjaCBjYXNlIHNlbnNpdGl2ZS48L1A+CisgICAgICA8UD5UaGlzIHZpZXcgd2FzIGludHJvZHVjZWQgaW4gdmVyc2lvbiAwLjNhIG9mIFJCIE1hbmFnZXIuPC9QPgorICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEEgSFJFRj0iaW5kZXguaHRtbCI+QmFjayB0byB0aGUgRnVuY3Rpb25hbGl0eSBhbmQgVmlldyAKKyAgICAgICAgSW5kZXggPC9BPjwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0Fib3V0RGlhbG9nLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0Fib3V0RGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyNWNiOAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQWJvdXREaWFsb2cuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworCisvKiogQSBkaWFsb2cgZGlzcGxheWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFwcGxpY2F0aW9uICovCitjbGFzcyBBYm91dERpYWxvZyB7CisJcHJpdmF0ZSBzdGF0aWMgSkRpYWxvZyBkaWFsb2cgPSBudWxsOworCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RGlhbG9nKEZyYW1lIHBhcmVudCkgeworCQlpZiAoZGlhbG9nID09IG51bGwpIHsKKwkJCWRpYWxvZyA9IG5ldyBKRGlhbG9nKHBhcmVudCwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfYWJvdXRfcmJtYW5hZ2VyIiksIGZhbHNlKTsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0KKwkJZGlhbG9nLnNldFZpc2libGUodHJ1ZSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisJCWRpYWxvZy5nZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICBKTGFiZWwgbG9nb0xhYmVsID0gbnVsbDsKKwkJSkxhYmVsIHRpdGxlTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmJtYW5hZ2VyIikpOworCQlKTGFiZWwgdmVyc2lvbkxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInZlcnNpb24iLCBQYWNrYWdlLmdldFBhY2thZ2UoImNvbS5pYm0ucmJtIikuZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCkpKTsKKwkJSkxhYmVsIGNvcHlyaWdodExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImNvcHlyaWdodCIpKTsKKwkJSkxhYmVsIGNvbnRhY3RMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyYm1hbmFnZXJfY29udGFjdCIpKTsKKwkJSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOworCQlCb3ggYm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyB0aGlzQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJjb20uaWJtLnJibS5ndWkuQWJvdXREaWFsb2ciKTsKKwkJICAgIGxvZ29MYWJlbCA9IG5ldyBKTGFiZWwobmV3IEltYWdlSWNvbih0aGlzQ2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlcy8iICsKKwkJCQkJCQkJCSAgICAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibG9nb19maWxlbmFtZSIpKSkpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFJCTWFuYWdlckdVSS5kZWJ1Z01zZyhlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKwkJYm94LmFkZCh0aXRsZUxhYmVsKTsKKwkJYm94LmFkZCh2ZXJzaW9uTGFiZWwpOworCQlib3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDEwKSk7CisJCWJveC5hZGQoY29weXJpZ2h0TGFiZWwpOworCQlib3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJYm94LmFkZChjb250YWN0TGFiZWwpOworCQkKKwkJcGFuZWwuYWRkKGJveCk7CisJCWRpYWxvZy5nZXRDb250ZW50UGFuZSgpLmFkZChsb2dvTGFiZWwsIEJvcmRlckxheW91dC5XRVNUKTsKKwkJZGlhbG9nLmdldENvbnRlbnRQYW5lKCkuYWRkKHBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCisJCWRpYWxvZy5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKE1vdXNlRXZlbnQgZXYpIHsKKwkJCQloaWRlRGlhbG9nKCk7CisJCQl9CisJCX0pOworCQkKKwkJLy9kaWFsb2cudmFsaWRhdGUoKTsKKwkJZGlhbG9nLnBhY2soKTsKKwkJUG9pbnQgcGFyZW50TG9jID0gZGlhbG9nLmdldFBhcmVudCgpLmdldExvY2F0aW9uKCk7CisJCWRpYWxvZy5zZXRMb2NhdGlvbihuZXcgUG9pbnQocGFyZW50TG9jLnggKyA1MCwgcGFyZW50TG9jLnkgKyA1MCkpOworCQlkaWFsb2cuc2V0UmVzaXphYmxlKGZhbHNlKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBoaWRlRGlhbG9nKCkgeworCQlkaWFsb2cuc2V0VmlzaWJsZShmYWxzZSk7CisJCWRpYWxvZy5kaXNwb3NlKCk7CisJCWRpYWxvZyA9IG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUdyb3VwQ3JlYXRpb25EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWFkMjEyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibS5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKiBBIGRpYWxvZyB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IEJ1bmRsZSBHcm91cAorICovCitjbGFzcyBCdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7CisJUkJNYW5hZ2VyIHJibTsKKwkKKwkvLyBIZWxwZXIgZGF0YQorCWludCBsZWZ0X2NvbF93aWR0aCA9IDEyNTsKKwlpbnQgcmlnaHRfY29sX3dpZHRoID0gMjc1OworCWludCByb3dfaGVpZ2h0ID0gMjU7CisJRGltZW5zaW9uIGxlZnREaW0gPSBuZXcgRGltZW5zaW9uKGxlZnRfY29sX3dpZHRoLCByb3dfaGVpZ2h0KTsKKwlEaW1lbnNpb24gcmlnaHREaW0gPSBuZXcgRGltZW5zaW9uKHJpZ2h0X2NvbF93aWR0aCwgcm93X2hlaWdodCk7CisJCisJLy8gQ29tcG9uZW50cworCUJveCBtYWluQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwlCb3ggYm94MSA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDIgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3gzID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwkKKwlKVGV4dEFyZWEgaW5zdHJ1Y3Rpb25zQXJlYSA9IG5ldyBKVGV4dEFyZWEoIiIpOworCUpMYWJlbCBuYW1lTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2dyb3VwIikpOworCUpMYWJlbCBjb21tZW50TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2dyb3VwX2NvbW1lbnQiKSk7CisJSlRleHRGaWVsZCBuYW1lRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBjb21tZW50RmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSkJ1dHRvbiBjcmVhdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jcmVhdGUiKSk7CisJSkJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jYW5jZWwiKSk7CisJCisJCisJcHVibGljIEJ1bmRsZUdyb3VwQ3JlYXRpb25EaWFsb2coUkJNYW5hZ2VyIHJibSwgSkZyYW1lIGZyYW1lLCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwpIHsKKwkJc3VwZXIoZnJhbWUsIHRpdGxlLCBtb2RhbCk7CisJCXRoaXMucmJtID0gcmJtOworCQlpbml0Q29tcG9uZW50cygpOworCQllbmFibGVFdmVudHMoQVdURXZlbnQuS0VZX0VWRU5UX01BU0spOworCX0KKwkKKwlib29sZWFuIGNyZWF0ZUdyb3VwKCkgeworCQlpZiAocmJtID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHJibS5jcmVhdGVHcm91cChuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwgY29tbWVudEZpZWxkLmdldFRleHQoKS50cmltKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQgZXYpIHsKKwkJaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19FTlRFUikgeworCQkJYm9vbGVhbiBzdWNjZXNzID0gY3JlYXRlR3JvdXAoKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfY3JlYXRlX2dyb3VwIikgKyAiICIgKworCQkJCQkJCSAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfdHJ5X2FnYWluX2dyb3VwIik7CisJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQl9IGVsc2UgeworCQkJCXNldFZpc2libGUoZmFsc2UpOworCQkJCWRpc3Bvc2UoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfQ0FOQ0VMKSB7CisJCQljbG9zZVdpbmRvdygpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpeworCQkvLyBFcnJvciBjaGVjaworCQlpZiAocmJtID09IG51bGwpIHsKKwkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfbm9fYnVuZGxlX2Zvcl9ncm91cCIpOworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQljbG9zZVdpbmRvdygpOworCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyBJbml0aWFsaXplIHZhbHVlcworCQkKKwkJLy8gU2V0IHVwIHRoZSBjb21wb25lbnRzCisJCW5hbWVMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQluYW1lRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCWNvbW1lbnRMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQljb21tZW50RmllbGQuc2V0Q29sdW1ucygzMCk7CisJCWdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihjcmVhdGVCdXR0b24pOworCQkKKwkJYm94MS5hZGQobmFtZUxhYmVsKTsgYm94MS5hZGQobmFtZUZpZWxkKTsKKwkJYm94Mi5hZGQoY29tbWVudExhYmVsKTsgYm94Mi5hZGQoY29tbWVudEZpZWxkKTsKKwkJYm94My5hZGQoY3JlYXRlQnV0dG9uKTsKKwkJYm94My5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCWJveDMuYWRkKGNhbmNlbEJ1dHRvbik7CisJCQorCQlpbnN0cnVjdGlvbnNBcmVhLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpKTsKKwkJCisJCS8vIEFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzCisJCWNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlKRGlhbG9nIGRpYWxvZyA9IChKRGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQl9CisJCX0pOworCQkKKwkJY3JlYXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCUJ1bmRsZUdyb3VwQ3JlYXRpb25EaWFsb2cgZGlhbG9nID0KKwkJCQkJKEJ1bmRsZUdyb3VwQ3JlYXRpb25EaWFsb2cpKChKQnV0dG9uKWV2LmdldFNvdXJjZSgpKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKwkJCQlib29sZWFuIHN1Y2Nlc3MgPSBkaWFsb2cuY3JlYXRlR3JvdXAoKTsKKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJU3RyaW5nIGFsZXJ0ID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9jcmVhdGVfZ3JvdXAiKSArICIgIiArCisJCQkJCQkJCSAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfdHJ5X2FnYWluX2dyb3VwIik7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGRpYWxvZywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCQlkaWFsb2cuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQkvLyBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZyYW1lCisJCXNldExvY2F0aW9uKG5ldyBqYXZhLmF3dC5Qb2ludCg1MCwgNTApKTsKKwkJbWFpbkJveC5yZW1vdmVBbGwoKTsKKwkJbWFpbkJveC5hZGQoYm94MSk7CisJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJbWFpbkJveC5hZGQoYm94Mik7CisJCWdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCWdldENvbnRlbnRQYW5lKCkucmVtb3ZlQWxsKCk7CisJCS8vZ2V0Q29udGVudFBhbmUoKS5hZGQoaW5zdHJ1Y3Rpb25zQXJlYSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5hZGQobWFpbkJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCWdldENvbnRlbnRQYW5lKCkuYWRkKGJveDMsIEJvcmRlckxheW91dC5TT1VUSCk7CisJCXZhbGlkYXRlVHJlZSgpOworCQlwYWNrKCk7CisJCXNldFZpc2libGUodHJ1ZSk7CisJCS8vc2V0UmVzaXphYmxlKGZhbHNlKTsKKwl9CisJCisJdm9pZCBjbG9zZVdpbmRvdygpIHsKKwkJc2V0VmlzaWJsZShmYWxzZSk7CisJCWRpc3Bvc2UoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQnVuZGxlR3JvdXBFZGl0RGlhbG9nLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUdyb3VwRWRpdERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzRiZWQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUdyb3VwRWRpdERpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogQSBkaWFsb2cgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBCdW5kbGUgR3JvdXAKKyAqLworY2xhc3MgQnVuZGxlR3JvdXBFZGl0RGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7CisJQnVuZGxlR3JvdXAgZ3JvdXA7CisJCisJLy8gSGVscGVyIGRhdGEKKwlpbnQgbGVmdF9jb2xfd2lkdGggPSAxMjU7CisJaW50IHJpZ2h0X2NvbF93aWR0aCA9IDI3NTsKKwlpbnQgcm93X2hlaWdodCA9IDI1OworCURpbWVuc2lvbiBsZWZ0RGltID0gbmV3IERpbWVuc2lvbihsZWZ0X2NvbF93aWR0aCwgcm93X2hlaWdodCk7CisJRGltZW5zaW9uIHJpZ2h0RGltID0gbmV3IERpbWVuc2lvbihyaWdodF9jb2xfd2lkdGgsIHJvd19oZWlnaHQpOworCQorCS8vIENvbXBvbmVudHMKKwlCb3ggbWFpbkJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJQm94IGJveDEgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3gyID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94MyA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJCisJSkxhYmVsIG5hbWVMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZ3JvdXAiKSk7CisJSkxhYmVsIGNvbW1lbnRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZ3JvdXBfY29tbWVudCIpKTsKKwlKVGV4dEZpZWxkIG5hbWVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIGNvbW1lbnRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKQnV0dG9uIGVkaXRCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9lZGl0IikpOworCUpCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY2FuY2VsIikpOworCQorCQorCXB1YmxpYyBCdW5kbGVHcm91cEVkaXREaWFsb2coQnVuZGxlR3JvdXAgZ3JvdXAsIEpGcmFtZSBmcmFtZSwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsKSB7CisJCXN1cGVyKGZyYW1lLCB0aXRsZSwgbW9kYWwpOworCQl0aGlzLmdyb3VwID0gZ3JvdXA7CisJCWluaXRDb21wb25lbnRzKCk7CisJCWVuYWJsZUV2ZW50cyhBV1RFdmVudC5LRVlfRVZFTlRfTUFTSyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NLZXlFdmVudChLZXlFdmVudCBldikgeworCQlpZiAoZXYuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0VOVEVSKSB7CisJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0R3JvdXAoKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfbW9kaWZ5X2dyb3VwIik7CisJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfaW50ZXJuYWwiKSwKKwkJCQkJCQkJCQkJICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCX0gZWxzZSB7CisJCQkJc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJZGlzcG9zZSgpOworCQkJfQorCQl9IGVsc2UgaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19DQU5DRUwpIHsKKwkJCWNsb3NlV2luZG93KCk7CisJCX0KKwl9CisJCisJYm9vbGVhbiBlZGl0R3JvdXAoKSB7CisJCWlmIChncm91cCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCWdyb3VwLnNldE5hbWUobmFtZUZpZWxkLmdldFRleHQoKS50cmltKCkpOworCQlncm91cC5zZXRDb21tZW50KGNvbW1lbnRGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpeworCQkvLyBFcnJvciBjaGVjaworCQlpZiAoZ3JvdXAgPT0gbnVsbCkgeworCQkJU3RyaW5nIGFsZXJ0ID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9tb2RpZnlfZ3JvdXAiKTsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2ludGVybmFsIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJY2xvc2VXaW5kb3coKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKKwkJCisJCS8vIFNldCB1cCB0aGUgY29tcG9uZW50cworCQluYW1lTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJbmFtZUZpZWxkLnNldENvbHVtbnMoMzApOworCQljb21tZW50TGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJY29tbWVudEZpZWxkLnNldENvbHVtbnMoMzApOworCQkKKwkJbmFtZUZpZWxkLnNldFRleHQoZ3JvdXAuZ2V0TmFtZSgpKTsKKwkJY29tbWVudEZpZWxkLnNldFRleHQoZ3JvdXAuZ2V0Q29tbWVudCgpKTsKKwkJZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGVkaXRCdXR0b24pOworCQkKKwkJYm94MS5hZGQobmFtZUxhYmVsKTsgYm94MS5hZGQobmFtZUZpZWxkKTsKKwkJYm94Mi5hZGQoY29tbWVudExhYmVsKTsgYm94Mi5hZGQoY29tbWVudEZpZWxkKTsKKwkJYm94My5hZGQoZWRpdEJ1dHRvbik7CisJCWJveDMuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlib3gzLmFkZChjYW5jZWxCdXR0b24pOworCQkKKwkJLy8gQWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcnMKKwkJY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCUpEaWFsb2cgZGlhbG9nID0gKEpEaWFsb2cpKChKQnV0dG9uKWV2LmdldFNvdXJjZSgpKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKwkJCQlkaWFsb2cuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKKwkJCX0KKwkJfSk7CisJCQorCQllZGl0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCUJ1bmRsZUdyb3VwRWRpdERpYWxvZyBkaWFsb2cgPQorCQkJCQkoQnVuZGxlR3JvdXBFZGl0RGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJYm9vbGVhbiBzdWNjZXNzID0gZGlhbG9nLmVkaXRHcm91cCgpOworCQkJCWlmICghc3VjY2VzcykgeworCQkJCQlTdHJpbmcgYWxlcnQgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX21vZGlmeV9ncm91cCIpOworCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhkaWFsb2csIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2ludGVybmFsIiksCisJCQkJCQkJCQkJCQkgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCX0gZWxzZSB7CisJCQkJCWRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQkKKwkJLy8gQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmcmFtZQorCQlzZXRMb2NhdGlvbihuZXcgamF2YS5hd3QuUG9pbnQoNTAsIDUwKSk7CisJCW1haW5Cb3gucmVtb3ZlQWxsKCk7CisJCW1haW5Cb3guYWRkKGJveDEpOworCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCW1haW5Cb3guYWRkKGJveDIpOworCQlnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQlnZXRDb250ZW50UGFuZSgpLnJlbW92ZUFsbCgpOworCQlnZXRDb250ZW50UGFuZSgpLmFkZChtYWluQm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5hZGQoYm94MywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKwkJdmFsaWRhdGVUcmVlKCk7CisJCXBhY2soKTsKKwkJc2V0VmlzaWJsZSh0cnVlKTsKKwkJLy9zZXRSZXNpemFibGUoZmFsc2UpOworCX0KKwkKKwl2b2lkIGNsb3NlV2luZG93KCkgeworCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJZGlzcG9zZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2cuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzM2JhZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nLmphdmEKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibS5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKiBBIGRpYWxvZyB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IEJ1bmRsZSBJdGVtCisgKi8KK2NsYXNzIEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZyBleHRlbmRzIEpEaWFsb2cgeworCVJCTWFuYWdlciByYm07CisJU3RyaW5nIGdyb3VwTmFtZTsKKwlCdW5kbGVJdGVtIGl0ZW07CisJYm9vbGVhbiBmaXJzdEluaXQgPSB0cnVlOworCQorCS8vIEhlbHBlciBkYXRhCisJaW50IGxlZnRfY29sX3dpZHRoID0gMTI1OworCWludCByaWdodF9jb2xfd2lkdGggPSAyNzU7CisJaW50IHJvd19oZWlnaHQgPSAyNTsKKwlEaW1lbnNpb24gbGVmdERpbSA9IG5ldyBEaW1lbnNpb24obGVmdF9jb2xfd2lkdGgsIHJvd19oZWlnaHQpOworCURpbWVuc2lvbiByaWdodERpbSA9IG5ldyBEaW1lbnNpb24ocmlnaHRfY29sX3dpZHRoLCByb3dfaGVpZ2h0KTsKKwkKKwkvLyBDb21wb25lbnRzCisJQm94IG1haW5Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCUJveCBib3gxID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94MiA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDMgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3g0ID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94NSA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDYgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCQorCUpMYWJlbCBpbnN0cnVjdGlvbnNMYWJlbCA9IG5ldyBKTGFiZWwoIiIpOworCUpMYWJlbCBncm91cExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19ncm91cCIpKTsKKwlKTGFiZWwgbmFtZUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19rZXkiKSk7CisJSkxhYmVsIHRyYW5zTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RyYW5zbGF0aW9uIikpOworCUpMYWJlbCBjb21tZW50TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2NvbW1lbnQiKSk7CisJSkxhYmVsIGxvb2t1cExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19sb29rdXBzIikpOworCQorCUpDb21ib0JveCBncm91cENvbWJvQm94ID0gbmV3IEpDb21ib0JveCgpOworCUpUZXh0RmllbGQgbmFtZUZpZWxkID0gbmV3IEpUZXh0RmllbGQoIiIpOworCUpUZXh0RmllbGQgdHJhbnNGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIGNvbW1lbnRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIGxvb2t1cEZpZWxkc1tdID0gbnVsbDsKKwlKTGFiZWwgbm9Mb29rdXBMYWJlbCA9IG51bGw7CisJQm94IGxvb2t1cEJveCA9IG51bGw7CisJQm94IGxvb2t1cEJveGVzW10gPSBudWxsOworCUpMYWJlbCBsb29rdXBMYWJlbHNbXSA9IG51bGw7CisJCisJSkJ1dHRvbiBjcmVhdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jcmVhdGUiKSk7CisJSkJ1dHRvbiBjcmVhdGVNb3JlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlX21vcmUiKSk7CisJSkJ1dHRvbiBjYW5jZWxCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jYW5jZWwiKSk7CisJCisJSGFzaHRhYmxlIGxvb2t1cHMgPSBuZXcgSGFzaHRhYmxlKCk7CisJCisJcHVibGljIEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZyhSQk1hbmFnZXIgcmJtLCBKRnJhbWUgZnJhbWUsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCkgeworCQlzdXBlcihmcmFtZSwgdGl0bGUsIG1vZGFsKTsKKwkJdGhpcy5yYm0gPSByYm07CisJCWdyb3VwTmFtZSA9IG51bGw7CisJCWl0ZW0gPSBudWxsOworCQlpbml0Q29tcG9uZW50cygpOworCX0KKwkKKwlwdWJsaWMgQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nKFN0cmluZyBncm91cE5hbWUsIFJCTWFuYWdlciByYm0sIEpGcmFtZSBmcmFtZSwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsKSB7CisJCXN1cGVyKGZyYW1lLCB0aXRsZSwgbW9kYWwpOworCQl0aGlzLnJibSA9IHJibTsKKwkJdGhpcy5ncm91cE5hbWUgPSBncm91cE5hbWU7CisJCWl0ZW0gPSBudWxsOworCQlpbml0Q29tcG9uZW50cygpOworCX0KKwkKKwlwdWJsaWMgQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nKEJ1bmRsZUl0ZW0gaXRlbSwgUkJNYW5hZ2VyIHJibSwgSkZyYW1lIGZyYW1lLCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwpIHsKKwkJc3VwZXIoZnJhbWUsIHRpdGxlLCBtb2RhbCk7CisJCXRoaXMuaXRlbSA9IGl0ZW07CisJCXRoaXMucmJtID0gcmJtOworCQlncm91cE5hbWUgPSBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0TmFtZSgpOworCQlpbml0Q29tcG9uZW50cygpOworCX0KKwkKKwlib29sZWFuIGNyZWF0ZUl0ZW0oKSB7CisJCWlmIChyYm0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlIYXNodGFibGUgbG9va3VwSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKwkJaWYgKGxvb2t1cEJveGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGxvb2t1cEJveGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIG5hbWVUZXh0ID0gbG9va3VwTGFiZWxzW2ldLmdldFRleHQoKS50cmltKCk7CisJCQkJU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5zdWJzdHJpbmcobmFtZVRleHQuaW5kZXhPZigieyIpKzEsbmFtZVRleHQuaW5kZXhPZigifSIpKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBsb29rdXBGaWVsZHNbaV0uZ2V0VGV4dCgpLnRyaW0oKTsKKwkJCQlsb29rdXBIYXNoLnB1dChuYW1lLHZhbHVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmJtLmNyZWF0ZUl0ZW0obmFtZUZpZWxkLmdldFRleHQoKS50cmltKCksIHRyYW5zRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwKKwkJCQkJCQkgICgoQnVuZGxlR3JvdXApZ3JvdXBDb21ib0JveC5nZXRTZWxlY3RlZEl0ZW0oKSkuZ2V0TmFtZSgpLAorCQkJCQkJCSAgY29tbWVudEZpZWxkLmdldFRleHQoKS50cmltKCksIGxvb2t1cEhhc2gpOworCX0KKwkKKwlib29sZWFuIGVkaXRJdGVtKCkgeworCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCUhhc2h0YWJsZSBsb29rdXBIYXNoID0gbmV3IEhhc2h0YWJsZSgpOworCQlpZiAobG9va3VwQm94ZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaT0wOyBpIDwgbG9va3VwQm94ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgbmFtZVRleHQgPSBsb29rdXBMYWJlbHNbaV0uZ2V0VGV4dCgpLnRyaW0oKTsKKwkJCQlTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LnN1YnN0cmluZyhuYW1lVGV4dC5pbmRleE9mKCJ7IikrMSxuYW1lVGV4dC5pbmRleE9mKCJ9IikpOworCQkJCVN0cmluZyB2YWx1ZSA9IGxvb2t1cEZpZWxkc1tpXS5nZXRUZXh0KCkudHJpbSgpOworCQkJCWxvb2t1cEhhc2gucHV0KG5hbWUsdmFsdWUpOworCQkJfQorCQl9CisJCXJldHVybiByYm0uZWRpdEl0ZW0oaXRlbSwgbmFtZUZpZWxkLmdldFRleHQoKS50cmltKCksCisJCQkJCQkJdHJhbnNGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCAoKEJ1bmRsZUdyb3VwKWdyb3VwQ29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldE5hbWUoKSwKKwkJCQkJCQljb21tZW50RmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwgbG9va3VwSGFzaCk7IAorCX0KKwkKKwlwcml2YXRlIHZvaWQgY2xlYXJDb21wb25lbnRzKCkgeworCQluYW1lRmllbGQuc2V0VGV4dCgiIik7CisJCXRyYW5zRmllbGQuc2V0VGV4dCgiIik7CisJCWNvbW1lbnRGaWVsZC5zZXRUZXh0KCIiKTsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfRU5URVIgJiYgZXYuZ2V0SUQoKSA9PSBLZXlFdmVudC5LRVlfUkVMRUFTRUQpIHsKKwkJCWlmICh0cmFuc0ZpZWxkLmhhc0ZvY3VzKCkpIHsKKwkJCQkvLyBJZiB3ZSBhcmUgaW4gdGhlIHRyYW5zbGF0aW9uIGZpZWxkLCB0aGVuIGVudGVyIHNob3VsZCBjcmVhdGUgYSBuZXcgbGluZSBjaGFyYWN0ZXIsIG5vdCBleGl0IHRoZSBkaWFsb2cKKwkJCQlpbnQgY2FyZXRQb3MgPSB0cmFuc0ZpZWxkLmdldENhcmV0UG9zaXRpb24oKTsKKwkJCQlTdHJpbmcgb2xkVGV4dCA9IHRyYW5zRmllbGQuZ2V0VGV4dCgpOworCQkJCXRyYW5zRmllbGQuc2V0VGV4dChvbGRUZXh0LnN1YnN0cmluZygwLGNhcmV0UG9zKSArICJcbiIgKyBvbGRUZXh0LnN1YnN0cmluZyhjYXJldFBvcyxvbGRUZXh0Lmxlbmd0aCgpKSk7CisJCQkJdHJhbnNGaWVsZC5zZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKzEpOworCQkJCXZhbGlkYXRlKCk7CisJCQkJc2V0U2l6ZShnZXRQcmVmZXJyZWRTaXplKCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nIGRpYWxvZyA9IHRoaXM7CisJCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKwkJCWlmIChkaWFsb2cuaXRlbSA9PSBudWxsKSBzdWNjZXNzID0gZGlhbG9nLmNyZWF0ZUl0ZW0oKTsKKwkJCWVsc2Ugc3VjY2VzcyA9IGRpYWxvZy5lZGl0SXRlbSgpOworCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJU3RyaW5nIGFsZXJ0ID0gKGl0ZW0gPT0gbnVsbCA/IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfY3JlYXRlX2l0ZW0iKSA6CisJCQkJCQkJCQkJCSAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfbW9kaWZ5X2l0ZW0iKSk7CisJCQkJYWxlcnQgKz0gIiAiICsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl90cnlfYWdhaW5faXRlbSIpOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGRpYWxvZywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwKKwkJCQkJCQkJCQkJICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCX0gZWxzZSB7CisJCQkJKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS51cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJCQkJKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS5pbnZhbGlkYXRlKCk7CisJCQkJLy8oKFJCTWFuYWdlckdVSSlkaWFsb2cuZ2V0UGFyZW50KCkpLnZhbGlkYXRlTXlUcmVlKCk7CisJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZXYuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0VTQ0FQRSkgeworCQkJY2xvc2VXaW5kb3coKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKXsKKwkJZW5hYmxlRXZlbnRzKEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKKwkJLy8gRXJyb3IgY2hlY2sKKwkJaWYgKHJibSA9PSBudWxsIHx8IHJibS5nZXRCdW5kbGVzKCkgPT0gbnVsbCkgeworCQkJU3RyaW5nIGFsZXJ0ID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9ub19idW5kbGVfZm9yX2l0ZW0iKTsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJY2xvc2VXaW5kb3coKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKKwkJQnVuZGxlIG1haW5CdW5kbGUgPSAoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZmlyc3RFbGVtZW50KCk7CisJCWlmIChmaXJzdEluaXQpIHsKKwkJCWdyb3VwQ29tYm9Cb3ggPSBuZXcgSkNvbWJvQm94KG1haW5CdW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKSk7CisJCQlpZiAoZ3JvdXBOYW1lICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwQ29tYm9Cb3guZ2V0SXRlbUNvdW50KCk7IGkrKykgeworCQkJCQlCdW5kbGVHcm91cCBiZyA9IChCdW5kbGVHcm91cClncm91cENvbWJvQm94LmdldEl0ZW1BdChpKTsKKwkJCQkJaWYgKGJnLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkgeworCQkJCQkJZ3JvdXBDb21ib0JveC5zZXRTZWxlY3RlZEluZGV4KGkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkKKwkJaWYgKGZpcnN0SW5pdCAmJiBpdGVtICE9IG51bGwpIHsKKwkJCS8vIFdlIGFyZSBlZGl0aW5nLCBub3QgY3JlYXRpbmcgYW4gaXRlbQorCQkJY3JlYXRlQnV0dG9uLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZWRpdCIpKTsKKwkJCWNyZWF0ZU1vcmVCdXR0b24uc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9lZGl0X21vcmUiKSk7CisJCQlpZiAoaXRlbS5nZXRLZXkoKSAhPSBudWxsKSBuYW1lRmllbGQuc2V0VGV4dChpdGVtLmdldEtleSgpKTsKKwkJCWlmIChpdGVtLmdldENvbW1lbnQoKSAhPSBudWxsKSBjb21tZW50RmllbGQuc2V0VGV4dChpdGVtLmdldENvbW1lbnQoKSk7CisJCQlpZiAoaXRlbS5nZXRUcmFuc2xhdGlvbigpICE9IG51bGwpIHRyYW5zRmllbGQuc2V0VGV4dChpdGVtLmdldFRyYW5zbGF0aW9uKCkpOworCQkJaWYgKGl0ZW0uZ2V0TG9va3VwcygpICE9IG51bGwpIGxvb2t1cHMgPSBpdGVtLmdldExvb2t1cHMoKTsKKwkJfQorCQkKKwkJU3RyaW5nIGN1cnJlbnRUcmFucyA9IHRyYW5zRmllbGQuZ2V0VGV4dCgpOworCQkvLyAqKiBMT09LVVBTICoqCisJCS8vIFVwZGF0ZSB0aGUgbG9va3VwcyBpZiBuZWNlc3NhcnkKKwkJaWYgKGxvb2t1cEJveGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGxvb2t1cEJveGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIG5hbWVUZXh0ID0gbG9va3VwTGFiZWxzW2ldLmdldFRleHQoKS50cmltKCk7CisJCQkJU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5zdWJzdHJpbmcobmFtZVRleHQuaW5kZXhPZigieyIpKzEsbmFtZVRleHQuaW5kZXhPZigifSIpKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBsb29rdXBGaWVsZHNbaV0uZ2V0VGV4dCgpLnRyaW0oKTsKKwkJCQlsb29rdXBzLnB1dChuYW1lLHZhbHVlKTsKKwkJCX0KKwkJfQorCQkvLyBSZW1vdmUgb2xkIGxvb2t1cHMgaWYgbmVjZXNzYXJ5CisJCUVudW1lcmF0aW9uIGtleXMgPSBsb29rdXBzLmtleXMoKTsKKwkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCVN0cmluZyBuYW1lID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7CisJCQlpZiAoY3VycmVudFRyYW5zLmluZGV4T2YoInsiICsgbmFtZSArICJ9IikgPCAwKSB7CisJCQkJbG9va3Vwcy5yZW1vdmUobmFtZSk7CisJCQl9CisJCX0KKwkJLy8gQWRkIG5ldyBsb29rdXBzIGlmIG5lY2Nlc2FyeQorCQlpZiAoY3VycmVudFRyYW5zICE9IG51bGwgJiYgY3VycmVudFRyYW5zLmluZGV4T2YoInsiKSA+PSAwKSB7CisJCQl3aGlsZSAoY3VycmVudFRyYW5zLmluZGV4T2YoInsiKSA+PSAwKSB7CisJCQkJY3VycmVudFRyYW5zID0gY3VycmVudFRyYW5zLnN1YnN0cmluZyhjdXJyZW50VHJhbnMuaW5kZXhPZigieyIpKzEsY3VycmVudFRyYW5zLmxlbmd0aCgpKTsKKwkJCQlTdHJpbmcgbmFtZSA9IGN1cnJlbnRUcmFucy5zdWJzdHJpbmcoMCxjdXJyZW50VHJhbnMuaW5kZXhPZigifSIpKTsKKwkJCQlpZiAoIWxvb2t1cHMuY29udGFpbnNLZXkobmFtZSkpIHsKKwkJCQkJbG9va3Vwcy5wdXQobmFtZSwiIik7CisJCQkJfQorCQkJfQorCQl9CisJCS8vIFJlbW92ZSBjb21wb25lbnRzCisJCWJveDUucmVtb3ZlQWxsKCk7CisJCQorCQkvLyBOb3cgY3JlYXRlIHRoZSB2aXN1YWwgY29tcG9uZW50cyBmb3IgdGhlIGxvb2t1cHMKKwkJaWYgKGxvb2t1cHMuc2l6ZSgpID4gMCkgeworCQkJbm9Mb29rdXBMYWJlbCA9IG51bGw7CisJCQlsb29rdXBCb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQkJbG9va3VwQm94ZXMgPSBuZXcgQm94W2xvb2t1cHMuc2l6ZSgpXTsKKwkJCWxvb2t1cEZpZWxkcyA9IG5ldyBKVGV4dEZpZWxkW2xvb2t1cHMuc2l6ZSgpXTsKKwkJCWxvb2t1cExhYmVscyA9IG5ldyBKTGFiZWxbbG9va3Vwcy5zaXplKCldOworCQkJaW50IGNvdW50ID0gMDsKKwkJCWtleXMgPSBsb29rdXBzLmtleXMoKTsKKwkJCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWxvb2t1cHMuZ2V0KG5hbWUpOworCQkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiTG9va3VwOiAiICsgbmFtZSArICIgLT4gIiArIHZhbHVlKTsKKwkJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2cobG9va3Vwcy50b1N0cmluZygpKTsKKwkJCQlsb29rdXBCb3hlc1tjb3VudF0gPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCQkJCWxvb2t1cEZpZWxkc1tjb3VudF0gPSBuZXcgSlRleHRGaWVsZCgodmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUpKTsKKwkJCQlsb29rdXBMYWJlbHNbY291bnRdID0gbmV3IEpMYWJlbCgieyIgKyBuYW1lICsgIn0iKTsKKwkJCQlsb29rdXBCb3hlc1tjb3VudF0uYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsKKwkJCQlsb29rdXBCb3hlc1tjb3VudF0uYWRkKGxvb2t1cExhYmVsc1tjb3VudF0pOworCQkJCWxvb2t1cEJveGVzW2NvdW50XS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCQkJbG9va3VwQm94ZXNbY291bnRdLmFkZChsb29rdXBGaWVsZHNbY291bnRdKTsKKwkJCQlsb29rdXBCb3guYWRkKGxvb2t1cEJveGVzW2NvdW50XSk7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvb2t1cEJveCA9IG51bGw7CisJCQlsb29rdXBCb3hlcyA9IG51bGw7CisJCQlsb29rdXBGaWVsZHMgPSBudWxsOworCQkJbG9va3VwTGFiZWxzID0gbnVsbDsKKwkJCW5vTG9va3VwTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibm9uZSIpKTsKKwkJfQorCQkKKwkJLy8gU2V0IHVwIHRoZSBjb21wb25lbnRzCisJCWlmIChmaXJzdEluaXQpIHsKKwkJCWdyb3VwTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJCWdyb3VwQ29tYm9Cb3guc2V0UHJlZmVycmVkU2l6ZShyaWdodERpbSk7CisJCQluYW1lTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJCW5hbWVGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJCWNvbW1lbnRMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQkJY29tbWVudEZpZWxkLnNldENvbHVtbnMoMzApOworCQkJdHJhbnNMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQkJdHJhbnNGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJCWxvb2t1cExhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCQkKKwkJCWJveDEuYWRkKGdyb3VwTGFiZWwpOyBib3gxLmFkZChncm91cENvbWJvQm94KTsKKwkJCWJveDIuYWRkKG5hbWVMYWJlbCk7IGJveDIuYWRkKG5hbWVGaWVsZCk7CisJCQlib3g0LmFkZChjb21tZW50TGFiZWwpOyBib3g0LmFkZChjb21tZW50RmllbGQpOworCQkJYm94My5hZGQodHJhbnNMYWJlbCk7IGJveDMuYWRkKHRyYW5zRmllbGQpOworCQkJCisJCQljcmVhdGVCdXR0b24uc2V0TW5lbW9uaWMoUkJNYW5hZ2VyTWVudUJhci5nZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jcmVhdGVfdHJpZ2dlciIpKSk7CisJCQljcmVhdGVNb3JlQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlX21vcmVfdHJpZ2dlciIpKSk7CisJCQlnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY3JlYXRlQnV0dG9uKTsKKwkJfQorCQlib3g1LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7IGJveDUuYWRkKGxvb2t1cExhYmVsKTsgYm94NS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCWlmIChub0xvb2t1cExhYmVsICE9IG51bGwpIHsKKwkJCW5vTG9va3VwTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShyaWdodERpbSk7CisJCQlib3g1LmFkZChub0xvb2t1cExhYmVsKTsKKwkJfQorCQllbHNlCisJCQlib3g1LmFkZChsb29rdXBCb3gpOworCQlpZiAoZmlyc3RJbml0KSB7CisJCQlib3g2LmFkZChjcmVhdGVCdXR0b24pOworCQkJYm94Ni5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCQlpZiAoaXRlbSA9PSBudWxsKQorCQkJCWJveDYuYWRkKGNyZWF0ZU1vcmVCdXR0b24pOworCQkJYm94Ni5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCQlib3g2LmFkZChjYW5jZWxCdXR0b24pOworCQl9CisJCQorCQlpbnN0cnVjdGlvbnNMYWJlbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSk7CisJCQorCQkvLyBBZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVycworCQlpZiAoZmlyc3RJbml0KSB7CisJCQljYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlKRGlhbG9nIGRpYWxvZyA9IChKRGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJCWRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9KTsKKwkJCisJCQljcmVhdGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlCdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2cgZGlhbG9nID0KKwkJCQkJCShCdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2cpKChKQnV0dG9uKWV2LmdldFNvdXJjZSgpKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKwkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisJCQkJCWlmIChkaWFsb2cuaXRlbSA9PSBudWxsKSBzdWNjZXNzID0gZGlhbG9nLmNyZWF0ZUl0ZW0oKTsKKwkJCQkJZWxzZSBzdWNjZXNzID0gZGlhbG9nLmVkaXRJdGVtKCk7CisJCQkJCWlmICghc3VjY2VzcykgeworCQkJCQkJU3RyaW5nIGFsZXJ0ID0gKGl0ZW0gPT0gbnVsbCA/IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfY3JlYXRlX2l0ZW0iKSA6CisJCQkJCQkJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9tb2RpZnlfaXRlbSIpKTsKKwkJCQkJCWFsZXJ0ICs9ICIgIiArIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfdHJ5X2FnYWluX2l0ZW0iKTsKKwkJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGRpYWxvZywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwKKwkJCQkJCQkJCQkJCQkgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS51cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJCQkJCQkoKFJCTWFuYWdlckdVSSlkaWFsb2cuZ2V0UGFyZW50KCkpLmludmFsaWRhdGUoKTsKKwkJCQkJCS8vKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS52YWxpZGF0ZU15VHJlZSgpOworCQkJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQkJCisJCQljcmVhdGVNb3JlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nIGRpYWxvZyA9CisJCQkJCQkoQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCQkJCQlpZiAoZGlhbG9nLml0ZW0gPT0gbnVsbCkgc3VjY2VzcyA9IGNyZWF0ZUl0ZW0oKTsKKwkJCQkJZWxzZSBzdWNjZXNzID0gZGlhbG9nLmVkaXRJdGVtKCk7CisJCQkJCWlmICghc3VjY2VzcykgeworCQkJCQkJU3RyaW5nIGFsZXJ0ID0gKGl0ZW0gPT0gbnVsbCA/IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfY3JlYXRlX2l0ZW0iKSA6CisJCQkJCQkJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9tb2RpZnlfaXRlbSIpKTsKKwkJCQkJCWFsZXJ0ICs9ICIgIiArIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfdHJ5X2FnYWluX2l0ZW0iKTsKKwkJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGRpYWxvZywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwKKwkJCQkJCQkJCQkJCQkgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS51cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJCQkJCQkoKFJCTWFuYWdlckdVSSlkaWFsb2cuZ2V0UGFyZW50KCkpLmludmFsaWRhdGUoKTsKKwkJCQkJCS8vKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS52YWxpZGF0ZU15VHJlZSgpOworCQkJCQkJZGlhbG9nLmNsZWFyQ29tcG9uZW50cygpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCQorCQkJdHJhbnNGaWVsZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZXYpIHt9CisJCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZXYpIHsKKwkJCQkJQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nIGRpYWxvZyA9CisJCQkJCQkoQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nKSgoSlRleHRGaWVsZClldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJCWZpcnN0SW5pdCA9IGZhbHNlOworCQkJCQlkaWFsb2cuaW5pdENvbXBvbmVudHMoKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQkKKwkJLy8gQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmcmFtZQorCQlpZiAoZmlyc3RJbml0KQorCQkJc2V0TG9jYXRpb24obmV3IGphdmEuYXd0LlBvaW50KDUwLCA1MCkpOworCQltYWluQm94LnJlbW92ZUFsbCgpOworCQkvL21haW5Cb3guYWRkKGluc3RydWN0aW9uc0xhYmVsKTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3gxKTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3gyKTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3gzKTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3g0KTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQlpZiAobm9Mb29rdXBMYWJlbCA9PSBudWxsKSB7CisJCQltYWluQm94LmFkZChib3g1KTsKKwkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJfQorCQltYWluQm94LmFkZChib3g2KTsKKwkJZ2V0Q29udGVudFBhbmUoKS5hZGQobWFpbkJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCXZhbGlkYXRlVHJlZSgpOworCQlwYWNrKCk7CisJCXNldFZpc2libGUodHJ1ZSk7CisJCS8vc2V0UmVzaXphYmxlKGZhbHNlKTsKKwkJZmlyc3RJbml0ID0gZmFsc2U7CisJfQorCQorCXZvaWQgY2xvc2VXaW5kb3coKSB7CisJCXNldFZpc2libGUoZmFsc2UpOworCQlkaXNwb3NlKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUl0ZW1EaWFsb2cuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQnVuZGxlSXRlbURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZWM1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUl0ZW1EaWFsb2cuamF2YQpAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS4qOworCisvL0EgZGlhbG9nIHdoaWNoIGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgQnVuZGxlIEl0ZW0gaW4gYW4gZWRpdGFibGUgd2F5CisKK2NsYXNzIEJ1bmRsZUl0ZW1EaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIgeworCVJCTWFuYWdlciByYm07CisJQnVuZGxlSXRlbSBpdGVtOworCVN0cmluZyB1c2VyOworCWJvb2xlYW4gZmlyc3RJbml0ID0gdHJ1ZTsJCisJCisJLy8gSGVscGVyIGRhdGEKKwlpbnQgbGVmdF9jb2xfd2lkdGggPSAxMjU7CisJaW50IHJpZ2h0X2NvbF93aWR0aCA9IDM3NTsKKwlpbnQgcm93X2hlaWdodCA9IDI1OworCURpbWVuc2lvbiBsZWZ0RGltID0gbmV3IERpbWVuc2lvbihsZWZ0X2NvbF93aWR0aCwgcm93X2hlaWdodCk7CisJRGltZW5zaW9uIHJpZ2h0RGltID0gbmV3IERpbWVuc2lvbihyaWdodF9jb2xfd2lkdGgsIHJvd19oZWlnaHQpOworCQorCS8vIENvbXBvbmVudHMKKwlCb3ggbWFpbkJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJQm94IGJveDAgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3gxID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94MiA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDMgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3g0ID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94NSA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDYgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3g3ID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94OCA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJCisJSkxhYmVsIGdyb3VwTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2dyb3VwIikpOyAKKwlKTGFiZWwga2V5TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2tleSIpKTsKKwlKTGFiZWwgZGVmVHJhbnNMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZGVmYXVsdF90cmFuc2xhdGlvbiIpKTsKKwlKTGFiZWwgdHJhbnNMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdHJhbnNsYXRpb24iKSk7CisJSkxhYmVsIGNvbW1lbnRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfY29tbWVudCIpKTsKKwlKTGFiZWwgbG9va3VwTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2xvb2t1cHMiKSk7CisJSkxhYmVsIGNyZWF0ZWRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfY3JlYXRlZCIpKTsKKwlKTGFiZWwgbW9kaWZpZWRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfbW9kaWZpZWQiKSk7CisJCisJSkNvbWJvQm94IGdyb3VwQ29tYm9Cb3g7CisJSlRleHRGaWVsZCBrZXlGaWVsZDsKKwlKVGV4dEZpZWxkIHRyYW5zRmllbGQ7CisJSlRleHRGaWVsZCBkZWZUcmFuc0ZpZWxkOworCUpUZXh0RmllbGQgY29tbWVudEZpZWxkOworCUpMYWJlbCBjcmVhdGVkTGFiZWwyOworCUpMYWJlbCBtb2RpZmllZExhYmVsMjsKKwlKTGFiZWwgbG9va3VwTGFiZWwyID0gbnVsbDsKKwlKQ2hlY2tCb3ggdHJhbnNDaGVja0JveDsKKwlKQnV0dG9uIHNhdmVCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9lZGl0IikpOworCUpCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY2FuY2VsIikpOworCUJveCBsb29rdXBCb3ggPSBudWxsOworCUJveCBsb29rdXBzW10gPSBudWxsOworCUpMYWJlbCBsb29rdXBMYWJlbHNbXSA9IG51bGw7CisJSlRleHRGaWVsZCBsb29rdXBGaWVsZHNbXSA9IG51bGw7CisJCisJcHVibGljIEJ1bmRsZUl0ZW1EaWFsb2coUkJNYW5hZ2VyIHJibSwgQnVuZGxlSXRlbSBpdGVtLCBTdHJpbmcgdXNlciwgSkZyYW1lIGZyYW1lLCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwpIHsKKwkJc3VwZXIoZnJhbWUsIHRpdGxlLCBtb2RhbCk7CisJCXRoaXMucmJtID0gcmJtOworCQl0aGlzLnVzZXIgPSB1c2VyOworCQl0aGlzLml0ZW0gPSBpdGVtOworCQlpbml0Q29tcG9uZW50cygpOworCQllbmFibGVFdmVudHMoQVdURXZlbnQuS0VZX0VWRU5UX01BU0spOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQgZXYpIHsKKwkJaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19FTlRFUiAmJiBldi5nZXRJRCgpID09IEtleUV2ZW50LktFWV9SRUxFQVNFRCkgeworCQkJYWN0aW9uUGVyZm9ybWVkKG51bGwpOworCQl9IGVsc2UgaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19DQU5DRUwpIHsKKwkJCWNsb3NlV2luZG93KCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCl7CisJCS8vIEVycm9yIGNoZWNrCisJCWlmIChpdGVtID09IG51bGwpIGNsb3NlV2luZG93KCk7CisJCWlmICghZmlyc3RJbml0KSBjbG9zZVdpbmRvdygpOworCQkKKwkJLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKKwkJRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQpOworCQlCdW5kbGUgYnVuZGxlID0gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpOworCQkKKwkJLy8gTG9va3VwIHRoZSBkZWZhdWx0IHRyYW5zbGF0aW9uCisJCVN0cmluZyBkZWZUcmFucyA9IG5ldyBTdHJpbmcoKTsKKwkJT2JqZWN0IG8gPSAoKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmZpcnN0RWxlbWVudCgpKS5hbGxJdGVtcy5nZXQoaXRlbS5nZXRLZXkoKSk7CisJCWlmIChvICE9IG51bGwpCisJCQlkZWZUcmFucyA9ICgoQnVuZGxlSXRlbSlvKS5nZXRUcmFuc2xhdGlvbigpOworCQkKKwkJa2V5RmllbGQgPSBuZXcgSlRleHRGaWVsZChpdGVtLmdldEtleSgpKTsKKwkJa2V5RmllbGQuc2V0RW5hYmxlZChmYWxzZSk7CisJCWRlZlRyYW5zRmllbGQgPSBuZXcgSlRleHRGaWVsZChkZWZUcmFucyk7CisJCWRlZlRyYW5zRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7CisJCXRyYW5zRmllbGQgPSBuZXcgSlRleHRGaWVsZChpdGVtLmdldFRyYW5zbGF0aW9uKCkpOworCQljb21tZW50RmllbGQgPSBuZXcgSlRleHRGaWVsZChpdGVtLmdldENvbW1lbnQoKSk7CisJCVN0cmluZyBjcmVhdGVkW10gPSB7ZGYuZm9ybWF0KGl0ZW0uZ2V0Q3JlYXRlZERhdGUoKSksIGl0ZW0uZ2V0Q3JlYXRvcigpfTsKKwkJU3RyaW5nIG1vZGlmaWVkW10gPSB7ZGYuZm9ybWF0KGl0ZW0uZ2V0TW9kaWZpZWREYXRlKCkpLCBpdGVtLmdldE1vZGlmaWVyKCl9OworCQlTdHJpbmcgY3JlYXRlZFN0cmluZyA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2RhdGVfcGVyc29uIiwgY3JlYXRlZCk7CisJCVN0cmluZyBtb2RpZmllZFN0cmluZyA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2RhdGVfcGVyc29uIiwgbW9kaWZpZWQpOworCQljcmVhdGVkTGFiZWwyID0gbmV3IEpMYWJlbChpdGVtLmdldENyZWF0b3IoKSA9PSBudWxsID8gZGYuZm9ybWF0KGl0ZW0uZ2V0Q3JlYXRlZERhdGUoKSkgOiBjcmVhdGVkU3RyaW5nKTsKKwkJbW9kaWZpZWRMYWJlbDIgPSBuZXcgSkxhYmVsKGl0ZW0uZ2V0TW9kaWZpZXIoKSA9PSBudWxsID8gZGYuZm9ybWF0KGl0ZW0uZ2V0TW9kaWZpZWREYXRlKCkpIDogbW9kaWZpZWRTdHJpbmcpOworCQl0cmFuc0NoZWNrQm94ID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19jaGVja2JveF90cmFuc2xhdGVkIiksaXRlbS5pc1RyYW5zbGF0ZWQoKSk7CisJCQorCQlncm91cENvbWJvQm94ID0gbmV3IEpDb21ib0JveChidW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKSk7CisJCWZvciAoaW50IGk9MDsgaSA8IGdyb3VwQ29tYm9Cb3guZ2V0SXRlbUNvdW50KCk7IGkrKykgeworCQkJQnVuZGxlR3JvdXAgYmcgPSAoQnVuZGxlR3JvdXApZ3JvdXBDb21ib0JveC5nZXRJdGVtQXQoaSk7CisJCQlpZiAoYmcuZ2V0TmFtZSgpLmVxdWFscyhpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0TmFtZSgpKSkgeworCQkJCWdyb3VwQ29tYm9Cb3guc2V0U2VsZWN0ZWRJbmRleChpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlncm91cENvbWJvQm94LnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwkJLy8gU2V0IHVwIHRoZSBjb21wb25lbnRzCisJCWdyb3VwTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJZ3JvdXBDb21ib0JveC5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJa2V5TGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJLy9rZXlGaWVsZC5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJa2V5RmllbGQuc2V0Q29sdW1ucygzMCk7CisJCWRlZlRyYW5zTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJLy9kZWZUcmFuc0ZpZWxkLnNldFByZWZlcnJlZFNpemUocmlnaHREaW0pOworCQlkZWZUcmFuc0ZpZWxkLnNldENvbHVtbnMoMzApOworCQl0cmFuc0xhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCS8vdHJhbnNGaWVsZC5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJdHJhbnNGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJY29tbWVudExhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCS8vY29tbWVudEZpZWxkLnNldFByZWZlcnJlZFNpemUocmlnaHREaW0pOworCQljb21tZW50RmllbGQuc2V0Q29sdW1ucygzMCk7CisJCWxvb2t1cExhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCWNyZWF0ZWRMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQljcmVhdGVkTGFiZWwyLnNldFByZWZlcnJlZFNpemUocmlnaHREaW0pOworCQltb2RpZmllZExhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCW1vZGlmaWVkTGFiZWwyLnNldFByZWZlcnJlZFNpemUocmlnaHREaW0pOworCQkvLyBTcGVjaWFsIHNldHVwIGZvciB0aGUgbG9va3VwIGl0ZW1zIGlmIHRoZXkgZXhpc3QKKwkJaWYgKGl0ZW0uZ2V0TG9va3VwcygpLnNpemUoKSA8IDEpIHsKKwkJCWxvb2t1cExhYmVsMiA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJub25lIikpOworCQkJbG9va3VwTGFiZWwyLnNldFByZWZlcnJlZFNpemUocmlnaHREaW0pOworCQl9IGVsc2UgeworCQkJbG9va3VwQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCWxvb2t1cHMgPSBuZXcgQm94W2l0ZW0uZ2V0TG9va3VwcygpLnNpemUoKV07CisJCQlsb29rdXBMYWJlbHMgPSBuZXcgSkxhYmVsW2l0ZW0uZ2V0TG9va3VwcygpLnNpemUoKV07CisJCQlsb29rdXBGaWVsZHMgPSBuZXcgSlRleHRGaWVsZFtpdGVtLmdldExvb2t1cHMoKS5zaXplKCldOworCQkJRW51bWVyYXRpb24ga2V5cyA9IGl0ZW0uZ2V0TG9va3VwcygpLmtleXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbS5nZXRMb29rdXBzKCkuc2l6ZSgpOyBpKyspIHsKKwkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOworCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpaXRlbS5nZXRMb29rdXBzKCkuZ2V0KG5hbWUpOworCQkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiWCAtIExvb2t1cDogIiArIG5hbWUgKyAiIC0+ICIgKyB2YWx1ZSk7CisJCQkJbG9va3Vwc1tpXSA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJCQkJbG9va3VwTGFiZWxzW2ldID0gbmV3IEpMYWJlbCgieyIgKyBuYW1lICsgIn0iKTsKKwkJCQlsb29rdXBMYWJlbHNbaV0uc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDMwLHJvd19oZWlnaHQpKTsKKwkJCQlsb29rdXBGaWVsZHNbaV0gPSBuZXcgSlRleHRGaWVsZCh2YWx1ZSk7CisJCQkJbG9va3VwRmllbGRzW2ldLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihyaWdodF9jb2xfd2lkdGgtMzUscm93X2hlaWdodCkpOworCQkJCWxvb2t1cHNbaV0uYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsKKwkJCQlsb29rdXBzW2ldLmFkZChsb29rdXBMYWJlbHNbaV0pOworCQkJCWxvb2t1cHNbaV0uYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQkJCWxvb2t1cHNbaV0uYWRkKGxvb2t1cEZpZWxkc1tpXSk7CisJCQkJbG9va3VwQm94LmFkZChsb29rdXBzW2ldKTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcnMKKwkJaWYgKGZpcnN0SW5pdCkgeworCQkJY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJSkRpYWxvZyBkaWFsb2cgPSAoSkRpYWxvZykoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworCQkJCQlkaWFsb2cuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQkJfQorCQkJfSk7CisJCQorCQkJc2F2ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCWdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihzYXZlQnV0dG9uKTsKKworCQkJdHJhbnNGaWVsZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBUcmFuc2xhdGlvbkZvY3VzTGlzdGVuZXIoaXRlbS5nZXRUcmFuc2xhdGlvbigpLHRyYW5zQ2hlY2tCb3gpKTsKKwkJfQorCQkKKwkJYm94MC5hZGQoZ3JvdXBMYWJlbCk7IGJveDAuYWRkKGdyb3VwQ29tYm9Cb3gpOworCQlib3gxLmFkZChrZXlMYWJlbCk7IGJveDEuYWRkKGtleUZpZWxkKTsKKwkJYm94OC5hZGQoZGVmVHJhbnNMYWJlbCk7IGJveDguYWRkKGRlZlRyYW5zRmllbGQpOworCQlib3gyLmFkZCh0cmFuc0xhYmVsKTsgYm94Mi5hZGQodHJhbnNGaWVsZCk7CisJCWJveDMuYWRkKGNvbW1lbnRMYWJlbCk7IGJveDMuYWRkKGNvbW1lbnRGaWVsZCk7CisJCWJveDQuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsgYm94NC5hZGQobG9va3VwTGFiZWwpOworCQlpZiAobG9va3VwTGFiZWwyICE9IG51bGwpIHsKKwkJCWJveDQuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQkJYm94NC5hZGQobG9va3VwTGFiZWwyKTsKKwkJfSBlbHNlIGlmIChsb29rdXBCb3ggIT0gbnVsbCkgeworCQkJYm94NC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCQlib3g0LmFkZChsb29rdXBCb3gpOworCQl9CisJCWJveDUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsgYm94NS5hZGQoY3JlYXRlZExhYmVsKTsKKwkJYm94NS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7IGJveDUuYWRkKGNyZWF0ZWRMYWJlbDIpOworCQlib3g2LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7IGJveDYuYWRkKG1vZGlmaWVkTGFiZWwpOworCQlib3g2LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsgYm94Ni5hZGQobW9kaWZpZWRMYWJlbDIpOworCQlib3g3LmFkZCh0cmFuc0NoZWNrQm94KTsgYm94Ny5hZGQoc2F2ZUJ1dHRvbik7IGJveDcuYWRkKGNhbmNlbEJ1dHRvbik7CisJCQorCQkvLyBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZyYW1lCisJCXNldExvY2F0aW9uKG5ldyBqYXZhLmF3dC5Qb2ludCg1MCwgNTApKTsKKwkJbWFpbkJveC5yZW1vdmVBbGwoKTsKKwkJbWFpbkJveC5hZGQoYm94MCk7CisJCW1haW5Cb3guYWRkKGJveDEpOworCQltYWluQm94LmFkZChib3g4KTsKKwkJbWFpbkJveC5hZGQoYm94Mik7CisJCW1haW5Cb3guYWRkKGJveDMpOworCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCW1haW5Cb3guYWRkKGJveDQpOworCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCW1haW5Cb3guYWRkKGJveDUpOworCQltYWluQm94LmFkZChib3g2KTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3g3KTsKKwkJZ2V0Q29udGVudFBhbmUoKS5hZGQobWFpbkJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCXZhbGlkYXRlVHJlZSgpOworCQlwYWNrKCk7CisJCXNldFZpc2libGUodHJ1ZSk7CisJCS8vc2V0UmVzaXphYmxlKGZhbHNlKTsKKwkJCisJCWZpcnN0SW5pdCA9IGZhbHNlOworCX0KKwkKKwl2b2lkIGNsb3NlV2luZG93KCkgeworCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJZGlzcG9zZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJaWYgKGV2ID09IG51bGwgJiYgdHJhbnNGaWVsZC5oYXNGb2N1cygpKSB7CisJCQkvLyBJZiB3ZSBhcmUgaW4gdGhlIHRyYW5zbGF0aW9uIGZpZWxkLCB0aGVuIGVudGVyIHNob3VsZCBjcmVhdGUgYSBuZXcgbGluZSBjaGFyYWN0ZXIsIG5vdCBleGl0IHRoZSBkaWFsb2cKKwkJCWludCBjYXJldFBvcyA9IHRyYW5zRmllbGQuZ2V0Q2FyZXRQb3NpdGlvbigpOworCQkJU3RyaW5nIG9sZFRleHQgPSB0cmFuc0ZpZWxkLmdldFRleHQoKTsKKwkJCXRyYW5zRmllbGQuc2V0VGV4dChvbGRUZXh0LnN1YnN0cmluZygwLGNhcmV0UG9zKSArICJcbiIgKyBvbGRUZXh0LnN1YnN0cmluZyhjYXJldFBvcyxvbGRUZXh0Lmxlbmd0aCgpKSk7CisJCQl0cmFuc0ZpZWxkLnNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MrMSk7CisJCQl2YWxpZGF0ZSgpOworCQkJc2V0U2l6ZShnZXRQcmVmZXJyZWRTaXplKCkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyBUaGlzIGFjdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgJ0VkaXQnIGJ1dHRvbiBpcyBwcmVzc2VkCisJCWl0ZW0uc2V0VHJhbnNsYXRpb24odHJhbnNGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKKwkJaWYgKCFpdGVtLmdldEtleSgpLmVxdWFscyhrZXlGaWVsZC5nZXRUZXh0KCkpKSBpdGVtLnNldEtleShrZXlGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKKwkJaXRlbS5zZXRDb21tZW50KGNvbW1lbnRGaWVsZC5nZXRUZXh0KCkpOworCQlpdGVtLnNldE1vZGlmaWVkRGF0ZShuZXcgRGF0ZSgpKTsKKwkJaXRlbS5zZXRNb2RpZmllcih1c2VyKTsKKwkJaXRlbS5zZXRUcmFuc2xhdGVkKHRyYW5zQ2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKKwkJaWYgKHRyYW5zQ2hlY2tCb3guaXNTZWxlY3RlZCgpKSB7CisJCQkvLyBSZW1vdmUgdGhpcyBpdGVtIGZyb20gdGhlIHVudHJhbnNsYXRlZCBpdGVtcywgaWYgaXQgaXMgdGhlcmUKKwkJCWl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKS5yZW1vdmVVbnRyYW5zbGF0ZWRJdGVtKGl0ZW0uZ2V0S2V5KCkpOworCQl9IGVsc2UgeworCQkJaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpLmFkZFVudHJhbnNsYXRlZEl0ZW0oaXRlbSk7CisJCX0KKwkJaWYgKGxvb2t1cHMgIT0gbnVsbCkgeworCQkJaXRlbS5zZXRMb29rdXBzKG5ldyBIYXNodGFibGUoKSk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBsb29rdXBzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIG5hbWUgPSBsb29rdXBMYWJlbHNbaV0uZ2V0VGV4dCgpLnRyaW0oKTsKKwkJCQlpZiAobmFtZS5pbmRleE9mKCJ7IikgPj0gMCkgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZigieyIpKzEsbmFtZS5sZW5ndGgoKSk7CisJCQkJaWYgKG5hbWUuaW5kZXhPZigifSIpID49IDApIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoIn0iKSk7CisJCQkJU3RyaW5nIHZhbHVlID0gbG9va3VwRmllbGRzW2ldLmdldFRleHQoKS50cmltKCk7CisJCQkJaXRlbS5nZXRMb29rdXBzKCkucHV0KG5hbWUsdmFsdWUpOworCQkJfQorCQl9CisJCWNsb3NlV2luZG93KCk7CisJfQorfQorIAorLyoqCisgKiBBIGxpc3RlbmVyIHdoaWNoIGNoZWNrcyBhIHRyYW5zbGF0aW9uIGJveCB0byBzZWUgaWYgaXQgY2hhbmdlcywgaWYgaXQgZG9lcywgaXQgbWFya3MgdGhlIHdvcmQgYXMgdHJhbnNsYXRlZCBpbiBhIGNoZWNrIGJveAorICovCitjbGFzcyBUcmFuc2xhdGlvbkZvY3VzTGlzdGVuZXIgaW1wbGVtZW50cyBGb2N1c0xpc3RlbmVyIHsKKwlTdHJpbmcgb3JpZ2luYWw7CisJSkNoZWNrQm94IGNib3g7CisJYm9vbGVhbiBzZWxlY3RlZDsKKwkKKwlwdWJsaWMgVHJhbnNsYXRpb25Gb2N1c0xpc3RlbmVyKFN0cmluZyBvcmlnaW5hbCwgSkNoZWNrQm94IGNib3gpIHsKKwkJdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOworCQl0aGlzLmNib3ggPSBjYm94OworCQlzZWxlY3RlZCA9IGNib3guaXNTZWxlY3RlZCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGV2KSB7fQorCQorCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2KSB7CisJCUpUZXh0RmllbGQgZmllbGQgPSAoSlRleHRGaWVsZClldi5nZXRTb3VyY2UoKTsKKwkJaWYgKGZpZWxkLmdldFRleHQoKS5lcXVhbHMob3JpZ2luYWwpKSB7CisJCQljYm94LnNldFNlbGVjdGVkKHNlbGVjdGVkKTsKKwkJCXJldHVybjsKKwkJfQorCQljYm94LnNldFNlbGVjdGVkKHRydWUpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9QcmVmZXJlbmNlc0RpYWxvZy5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9QcmVmZXJlbmNlc0RpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2M2NlODcKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1ByZWZlcmVuY2VzRGlhbG9nLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibS5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogRGlhbG9nIHRvIGRpc3BsYXkgdG8gYSB1c2VyIGFib3V0IHRoZWlyIHByZWZlcmVuY2VzLiAKKyAqLworY2xhc3MgUHJlZmVyZW5jZXNEaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIHsKKwlTdHJpbmcgdXNlck5hbWU7CisJTG9jYWxlIGxvY2FsZTsKKwlMb29rQW5kRmVlbCBsYWY7CisJUkJNYW5hZ2VyR1VJIGd1aTsKKwkKKwkvLyAqKiBDT01QT05FTlRTICoqCisJSlRleHRGaWVsZCAgIG5hbWVGaWVsZDsKKwlKUmFkaW9CdXR0b24gbWFjaGluZVJhZGlvOworCUpSYWRpb0J1dHRvbiBkZWZpbmVkUmFkaW87CisJSlJhZGlvQnV0dG9uIGlzb1JhZGlvOworCUpDb21ib0JveCAgICBtYWNoaW5lQ29tYm87CisJSkNvbWJvQm94ICAgIGRlZmluZWRDb21ibzsKKwlKQ29tYm9Cb3ggICAgaXNvTGFuZ0NvbWJvOworCUpDb21ib0JveCAgICBpc29Db3VuQ29tYm87CisJSkNvbWJvQm94ICAgIGxhZkNvbWJvOworCUpCdXR0b24gICAgICBva0J1dHRvbjsKKwlKQnV0dG9uICAgICAgY2FuY2VsQnV0dG9uOworCQorCXB1YmxpYyBQcmVmZXJlbmNlc0RpYWxvZyhSQk1hbmFnZXJHVUkgZ3VpKSB7CisJCXN1cGVyKGd1aSwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfcHJlZmVyZW5jZXMiKSwgdHJ1ZSk7CisJCXRoaXMuZ3VpID0gZ3VpOworCQl1c2VyTmFtZSA9IGd1aS5nZXRVc2VyKCk7CisJCWxvY2FsZSA9IFJlc291cmNlcy5nZXRMb2NhbGUoKTsKKwkJbGFmID0gVUlNYW5hZ2VyLmdldExvb2tBbmRGZWVsKCk7CisJCQorCQlpbml0Q29tcG9uZW50cygpOworCQllbmFibGVFdmVudHMoQVdURXZlbnQuS0VZX0VWRU5UX01BU0spOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQgZXYpIHsKKwkJaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19FTlRFUikgeworCQkJdXBkYXRlUHJlZmVyZW5jZXMoKTsKKwkJfSBlbHNlIGlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfQ0FOQ0VMKSB7CisJCQl0aGlzV2luZG93Q2xvc2luZygpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKwkJVUlNYW5hZ2VyLkxvb2tBbmRGZWVsSW5mbyBsYWZpW10gPSBVSU1hbmFnZXIuZ2V0SW5zdGFsbGVkTG9va0FuZEZlZWxzKCk7CisJCVN0cmluZyBsYWZuW10gPSBuZXcgU3RyaW5nW2xhZmkubGVuZ3RoXTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgbGFmaS5sZW5ndGg7IGkrKykgeworCQkJbGFmbltpXSA9IGxhZmlbaV0uZ2V0TmFtZSgpOworCQl9CisJCQorCQkvLyBDT01QT05FTlRTCisJCQorCQlKUGFuZWwgcGFuZWwxID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgcGFuZWwyID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgcGFuZWwzID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgcGFuZWw0ID0gbmV3IEpQYW5lbCgpOworCQlCb3ggICAgbWFpbkJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCUJveCAgICBsb2NhbGVCb3gxID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJQm94ICAgIGxvY2FsZUJveDIgPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQlKUGFuZWwgbG9jYWxlUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJCQorCQlEaW1lbnNpb24gbG9jYWxlRGltMSA9IG5ldyBEaW1lbnNpb24oMjAwLDI1KTsKKwkJRGltZW5zaW9uIGxvY2FsZURpbTIgPSBuZXcgRGltZW5zaW9uKDE1MCwyNSk7CisJCURpbWVuc2lvbiBsb2NhbGVEaW0zID0gbmV3IERpbWVuc2lvbig1MCwyNSk7CisJCQorCQlKTGFiZWwgbmFtZUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19wcmVmZXJlbmNlc191c2VybmFtZSIpKTsKKwkJSkxhYmVsIGxhZkxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19wcmVmZXJlbmNlc19sb29rYW5kZmVlbCIpKTsKKwkJSkxhYmVsIHdhcm5MYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX3dhcm5pbmciKSk7CisJCUpMYWJlbCB1bmRlcnNjb3JlTGFiZWwgPSBuZXcgSkxhYmVsKCJfIik7CisJCQorCQluYW1lRmllbGQgPSBuZXcgSlRleHRGaWVsZCh1c2VyTmFtZSk7CisJCW1hY2hpbmVSYWRpbyA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX21hY2hpbmUiKSwgZmFsc2UpOworCQlkZWZpbmVkUmFkaW8gPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9kZWZpbmVkIiksIHRydWUpOworCQlpc29SYWRpbyA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX2lzbyIpLCBmYWxzZSk7CisJCW1hY2hpbmVDb21ibyA9IG5ldyBKQ29tYm9Cb3goTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKSk7CisJCWRlZmluZWRDb21ibyA9IG5ldyBKQ29tYm9Cb3goUmVzb3VyY2VzLmdldEF2YWlsYWJsZUxvY2FsZXMoKSk7CisJCWlzb0xhbmdDb21ibyA9IG5ldyBKQ29tYm9Cb3goTG9jYWxlLmdldElTT0xhbmd1YWdlcygpKTsKKwkJaXNvQ291bkNvbWJvID0gbmV3IEpDb21ib0JveChMb2NhbGUuZ2V0SVNPQ291bnRyaWVzKCkpOworCQlsYWZDb21ibyA9IG5ldyBKQ29tYm9Cb3gobGFmbik7CisJCW9rQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fdXBkYXRlIikpOworCQljYW5jZWxCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jYW5jZWwiKSk7CisJCQorCQltYWNoaW5lUmFkaW8uc2V0UHJlZmVycmVkU2l6ZShsb2NhbGVEaW0xKTsKKwkJZGVmaW5lZFJhZGlvLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMSk7CisJCWlzb1JhZGlvLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMSk7CisJCQorCQluYW1lTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsb2NhbGVEaW0xKTsKKwkJbGFmTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsb2NhbGVEaW0xKTsKKwkJCisJCS8vbG9jYWxlUGFuZWwuc2V0UHJlZmVycmVkU2l6ZShsb2NhbGVEaW0yKTsKKwkJbWFjaGluZUNvbWJvLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMik7CisJCWRlZmluZWRDb21iby5zZXRQcmVmZXJyZWRTaXplKGxvY2FsZURpbTIpOworCQkKKwkJbmFtZUZpZWxkLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMik7CisJCWxhZkNvbWJvLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMik7CisJCQorCQlpc29MYW5nQ29tYm8uc2V0UHJlZmVycmVkU2l6ZShsb2NhbGVEaW0zKTsKKwkJaXNvQ291bkNvbWJvLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMyk7CisJCQorCQkvLyBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXMgaW4gdGhlIGNvbWJvIGJveGVzCisJCVN0cmluZyBsYWZuYW1lID0gVUlNYW5hZ2VyLmdldExvb2tBbmRGZWVsKCkuZ2V0TmFtZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxhZkNvbWJvLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKwkJCWlmIChsYWZDb21iby5nZXRJdGVtQXQoaSkudG9TdHJpbmcoKS5lcXVhbHMobGFmbmFtZSkpIHsKKwkJCQlsYWZDb21iby5zZXRTZWxlY3RlZEluZGV4KGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCVN0cmluZyBsb2NuYW1lID0gUmVzb3VyY2VzLmdldExvY2FsZSgpLnRvU3RyaW5nKCk7CisJCVN0cmluZyBsb2NsYW5nID0gUmVzb3VyY2VzLmdldExvY2FsZSgpLmdldExhbmd1YWdlKCk7CisJCVN0cmluZyBsb2Njb3VuID0gUmVzb3VyY2VzLmdldExvY2FsZSgpLmdldENvdW50cnkoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYWNoaW5lQ29tYm8uZ2V0SXRlbUNvdW50KCk7IGkrKykgeworCQkJaWYgKG1hY2hpbmVDb21iby5nZXRJdGVtQXQoaSkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKGxvY25hbWUpKSB7CisJCQkJbWFjaGluZUNvbWJvLnNldFNlbGVjdGVkSW5kZXgoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZpbmVkQ29tYm8uZ2V0SXRlbUNvdW50KCk7IGkrKykgeworCQkJaWYgKGRlZmluZWRDb21iby5nZXRJdGVtQXQoaSkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKGxvY25hbWUpKSB7CisJCQkJZGVmaW5lZENvbWJvLnNldFNlbGVjdGVkSW5kZXgoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpc29MYW5nQ29tYm8uZ2V0SXRlbUNvdW50KCk7IGkrKykgeworCQkJaWYgKGlzb0xhbmdDb21iby5nZXRJdGVtQXQoaSkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKGxvY2xhbmcpKSB7CisJCQkJaXNvTGFuZ0NvbWJvLnNldFNlbGVjdGVkSW5kZXgoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpc29Db3VuQ29tYm8uZ2V0SXRlbUNvdW50KCk7IGkrKykgeworCQkJaWYgKGlzb0NvdW5Db21iby5nZXRJdGVtQXQoaSkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKGxvY2NvdW4pKSB7CisJCQkJaXNvQ291bkNvbWJvLnNldFNlbGVjdGVkSW5kZXgoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCS8vIFNldCB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwCisJCUJ1dHRvbkdyb3VwIGdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7CisJCWdyb3VwLmFkZChtYWNoaW5lUmFkaW8pOworCQlncm91cC5hZGQoZGVmaW5lZFJhZGlvKTsKKwkJZ3JvdXAuYWRkKGlzb1JhZGlvKTsKKwkJCisJCW5hbWVGaWVsZC5zZXRDb2x1bW5zKDE1KTsKKwkJCisJCS8vIEFkZCBhY3Rpb24gbGlzdGVuZXJzCisJCWNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQl0aGlzV2luZG93Q2xvc2luZygpOworCQkJfQorCQl9KTsKKwkJCisJCW9rQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXVwZGF0ZVByZWZlcmVuY2VzKCk7CisJCQl9CisJCX0pOworCQlnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24ob2tCdXR0b24pOworCQkKKwkJcGFuZWwzLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZSIpKSk7CisJCXBhbmVsMy5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCisJCWxvY2FsZVBhbmVsLmFkZChpc29MYW5nQ29tYm8pOworCQlsb2NhbGVQYW5lbC5hZGQodW5kZXJzY29yZUxhYmVsKTsKKwkJbG9jYWxlUGFuZWwuYWRkKGlzb0NvdW5Db21ibyk7CisJCQorCQlsb2NhbGVCb3gxLmFkZChtYWNoaW5lUmFkaW8pOworCQlsb2NhbGVCb3gxLmFkZChkZWZpbmVkUmFkaW8pOworCQlsb2NhbGVCb3gxLmFkZChpc29SYWRpbyk7CisJCWxvY2FsZUJveDIuYWRkKG1hY2hpbmVDb21ibyk7CisJCWxvY2FsZUJveDIuYWRkKGRlZmluZWRDb21ibyk7CisJCWxvY2FsZUJveDIuYWRkKGxvY2FsZVBhbmVsKTsKKwkJbG9jYWxlQm94MS5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQlsb2NhbGVCb3gyLmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCQorCQlwYW5lbDEuYWRkKG5hbWVMYWJlbCk7CisJCXBhbmVsMS5hZGQobmFtZUZpZWxkKTsKKwkJcGFuZWwyLmFkZChsYWZMYWJlbCk7CisJCXBhbmVsMi5hZGQobGFmQ29tYm8pOworCQlwYW5lbDMuYWRkKGxvY2FsZUJveDEsIEJvcmRlckxheW91dC5XRVNUKTsKKwkJcGFuZWwzLmFkZChsb2NhbGVCb3gyLCBCb3JkZXJMYXlvdXQuRUFTVCk7CisJCXBhbmVsMy5hZGQod2FybkxhYmVsLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQlwYW5lbDQuYWRkKG9rQnV0dG9uKTsKKwkJcGFuZWw0LmFkZChjYW5jZWxCdXR0b24pOworCQkKKwkJbWFpbkJveC5hZGQocGFuZWwxKTsKKwkJbWFpbkJveC5hZGQocGFuZWwyKTsKKwkJbWFpbkJveC5hZGQocGFuZWwzKTsKKwkJbWFpbkJveC5hZGQocGFuZWw0KTsKKwkJCisJCWdldENvbnRlbnRQYW5lKCkuYWRkKG1haW5Cb3gpOworCQkvL3ZhbGlkYXRlKCk7CisJCXBhY2soKTsKKwkJc2V0VmlzaWJsZSh0cnVlKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHRoaXNXaW5kb3dDbG9zaW5nKCkgeworCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJZGlzcG9zZSgpOworCX0KKwkKKwl2b2lkIHVwZGF0ZVByZWZlcmVuY2VzKCkgeworCQkvLyBTZXQgdGhlIHVzZXIgbmFtZQorCQlndWkuc2V0VXNlcihuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCS8vIFNldCB0aGUgbG9vayBhbmQgZmVlbAorCQl0cnkgeworCQkJVUlNYW5hZ2VyLkxvb2tBbmRGZWVsSW5mbyBsYWZpW10gPSBVSU1hbmFnZXIuZ2V0SW5zdGFsbGVkTG9va0FuZEZlZWxzKCk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBsYWZpLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGxhZmlbaV0uZ2V0TmFtZSgpLmVxdWFscyhsYWZDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKSkgeworCQkJCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwobGFmaVtpXS5nZXRDbGFzc05hbWUoKSk7CisJCQkJCWd1aS51cGRhdGVVSSgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBjaGFuZ2UgdGhlIGxvb2sgYW5kIGZlZWwiKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworCQl9CisJCS8vIFNldCB0aGUgbG9jYWxlCisJCVN0cmluZyBsYW5ndWFnZSA9IG51bGw7CisJCVN0cmluZyBjb3VudHJ5ID0gbnVsbDsKKwkJU3RyaW5nIHZhcmlhbnQgPSBudWxsOworCQlpZiAoZGVmaW5lZFJhZGlvLmlzU2VsZWN0ZWQoKSkgeworCQkJU3RyaW5nIGVuY29kaW5nID0gIiI7CisJCQlpZiAoZGVmaW5lZENvbWJvLmdldFNlbGVjdGVkSXRlbSgpICE9IG51bGwpIHsKKwkJCQllbmNvZGluZyA9IGRlZmluZWRDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOworCQkJfQorCQkJbGFuZ3VhZ2UgPSBSZXNvdXJjZXMuZ2V0TGFuZ3VhZ2UoZW5jb2RpbmcpOworCQkJY291bnRyeSA9IFJlc291cmNlcy5nZXRDb3VudHJ5KGVuY29kaW5nKTsKKwkJCXZhcmlhbnQgPSBSZXNvdXJjZXMuZ2V0VmFyaWFudChlbmNvZGluZyk7CisJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIkJlZm9yZTogIiArIGxhbmd1YWdlICsgIl8iICsgY291bnRyeSArICJfIiArIHZhcmlhbnQpOworCQkJaWYgKGNvdW50cnkgPT0gbnVsbCkgY291bnRyeSA9IG5ldyBTdHJpbmcoKTsKKwkJCWlmICh2YXJpYW50ID09IG51bGwpIGxvY2FsZSA9IG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpOworCQkJZWxzZSBsb2NhbGUgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50KTsKKwkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiQWZ0ZXI6ICIgKyBsb2NhbGUudG9TdHJpbmcoKSk7CisJCX0gZWxzZSBpZiAobWFjaGluZVJhZGlvLmlzU2VsZWN0ZWQoKSkgeworCQkJU3RyaW5nIGVuY29kaW5nID0gbWFjaGluZUNvbWJvLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCk7CisJCQlsYW5ndWFnZSA9IFJlc291cmNlcy5nZXRMYW5ndWFnZShlbmNvZGluZyk7CisJCQljb3VudHJ5ID0gUmVzb3VyY2VzLmdldENvdW50cnkoZW5jb2RpbmcpOworCQkJdmFyaWFudCA9IFJlc291cmNlcy5nZXRWYXJpYW50KGVuY29kaW5nKTsKKwkJCWlmIChjb3VudHJ5ID09IG51bGwpIGNvdW50cnkgPSBuZXcgU3RyaW5nKCk7CisJCQlpZiAodmFyaWFudCA9PSBudWxsKSBsb2NhbGUgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKKwkJCWVsc2UgbG9jYWxlID0gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCk7CisJCX0gZWxzZSBpZiAoaXNvUmFkaW8uaXNTZWxlY3RlZCgpKSB7CisJCQlsYW5ndWFnZSA9IGlzb0xhbmdDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOworCQkJY291bnRyeSA9IGlzb0NvdW5Db21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOworCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCkgbG9jYWxlID0gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSk7CisJCQllbHNlIGxvY2FsZSA9IG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHZhcmlhbnQpOworCQl9CisJCVJlc291cmNlcy5zZXRMb2NhbGUobG9jYWxlKTsKKwkJZ3VpLnVwZGF0ZUxvY2FsZShsb2NhbGUpOworCQkJCisJCS8vIFdyaXRlIHRoZSBwcmVmZXJlbmNlcworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJ1c2VybmFtZSIsIGd1aS5nZXRVc2VyKCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJsb29rYW5kZmVlbCIsIFVJTWFuYWdlci5nZXRMb29rQW5kRmVlbCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgibG9jYWxlIiwgbG9jYWxlLnRvU3RyaW5nKCkpOworCQl0cnkgeworCQkJUHJlZmVyZW5jZXMuc2F2ZVByZWZlcmVuY2VzKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9wcmVmZXJlbmNlc19zYXZlIiksCisJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJaW9lLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwkJfQorCQkKKwkJLy8gQ2xvc2UgdGhlIHdpbmRvdworCQl0aGlzV2luZG93Q2xvc2luZygpOworCX0KK30KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJHcm91cFBhbmVsLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCR3JvdXBQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjQxOWYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCR3JvdXBQYW5lbC5qYXZhCkBAIC0wLDAgKzEsNTMwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS4qOworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CisKK2ltcG9ydCBjb20uaWJtLnJibS4qOworCisvKioKKyAqIFRoZSBjbGFzcyB1c2VkIHRvIGRpc3BsYXkgZ3JvdXBzCisgKi8KK2NsYXNzIFJCR3JvdXBQYW5lbCBleHRlbmRzIEpQYW5lbCB7CisJUkJNYW5hZ2VyIHJibTsKKwlCdW5kbGUgYnVuZGxlOworCVJCTWFuYWdlckdVSSBsaXN0ZW5lcjsKKwkKKwkvLyBDb21wb25lbnRzCisJSkxhYmVsICAgICAgakxhYmVsR3JvdXBUaXRsZTsKKwlKTGFiZWwgICAgICBqTGFiZWxHcm91cE5hbWVUaXRsZTsKKwlKTGFiZWwgICAgICBqTGFiZWxHcm91cENvbW1lbnRUaXRsZTsKKwlKTGFiZWwgICAgICBqTGFiZWxHcm91cENvbW1lbnQ7CisJSkNvbWJvQm94ICAgakNvbWJvQm94R3JvdXA7CisJSlRhYmxlICAgICAgalRhYmxlR3JvdXBUYWJsZTsKKwlKU2Nyb2xsUGFuZSBqU2Nyb2xsUGFuZUdyb3VwVGFibGU7CisJCisJLy8gQ29tcG9uZW50cyAtIE1hbmFnZXIKKwlKTGlzdCAgICAgICBqTGlzdEdyb3VwOworCUpCdXR0b24gICAgIGNyZWF0ZUl0ZW1CdXR0b247CisJSkJ1dHRvbiAgICAgY3JlYXRlR3JvdXBCdXR0b247CisJSkJ1dHRvbiAgICAgZWRpdEl0ZW1CdXR0b247CisJSkJ1dHRvbiAgICAgZWRpdEdyb3VwQnV0dG9uOworCUpCdXR0b24gICAgIGRlbGV0ZUl0ZW1CdXR0b247CisJSkJ1dHRvbiAgICAgZGVsZXRlR3JvdXBCdXR0b247CisJSlBhbmVsICAgICAgaXRlbVBhbmVsOworCUpQYW5lbCAgICAgIGdyb3VwUGFuZWw7CisJCisJcHVibGljIFJCR3JvdXBQYW5lbChSQk1hbmFnZXJHVUkgZ3VpKSB7CisJCXN1cGVyKCk7CisJCWxpc3RlbmVyID0gZ3VpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRCdW5kbGUoQnVuZGxlIGIpIHsKKwkJcmJtID0gbnVsbDsKKwkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisJCQlidW5kbGUgPSBiOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfSBlbHNlIGlmIChidW5kbGUgIT0gYikgeworCQkJYnVuZGxlID0gYjsKKwkJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFJCTWFuYWdlciBtKSB7CisJCWJ1bmRsZSA9IG51bGw7CisJCWlmIChyYm0gPT0gbnVsbCkgeworCQkJcmJtID0gbTsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSBpZiAocmJtICE9IG0pIHsKKwkJCXJibSA9IG07CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudHMoKSB7CisJCWlmIChyYm0gIT0gbnVsbCB8fCBidW5kbGUgIT0gbnVsbCkgeworCQkJcmJtID0gbnVsbDsKKwkJCWJ1bmRsZSA9IG51bGw7CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9CisJfQorCQorCS8vIE1hcmtzIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBhcyB0cmFuc2xhdGVkIGFuZCByZW1vdmVzIGZyb20gdGhpcyB2aWV3CisJcHJpdmF0ZSB2b2lkIG1hcmtTZWxlY3RlZFJlc291cmNlQXNUcmFuc2xhdGVkKCkgeworCQlpZiAoYnVuZGxlID09IG51bGwpIHJldHVybjsKKwkJaWYgKGpUYWJsZUdyb3VwVGFibGUuZ2V0U2VsZWN0ZWRSb3coKSA8IDApIHJldHVybjsKKwkJaWYgKGpUYWJsZUdyb3VwVGFibGUuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEdyb3VwSXRlbXNUYWJsZU1vZGVsKSB7CisJCQlpbnQgcm93ID0galRhYmxlR3JvdXBUYWJsZS5nZXRTZWxlY3RlZFJvdygpOworCQkJR3JvdXBJdGVtc1RhYmxlTW9kZWwgbW9kZWwgPSAoR3JvdXBJdGVtc1RhYmxlTW9kZWwpalRhYmxlR3JvdXBUYWJsZS5nZXRNb2RlbCgpOworCQkJQnVuZGxlSXRlbSBpdGVtID0gbW9kZWwuZ2V0QnVuZGxlSXRlbShyb3cpOworCQkJaXRlbS5zZXRUcmFuc2xhdGVkKHRydWUpOworCQkJbW9kZWwudXBkYXRlKCk7CisJCX0KKwl9CisJCisJLy8gUmVtb3ZlcyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZQorCXByaXZhdGUgdm9pZCBkZWxldGVTZWxlY3RlZFJlc291cmNlKCkgeworCQlpZiAoYnVuZGxlID09IG51bGwpIHJldHVybjsKKwkJaWYgKGpUYWJsZUdyb3VwVGFibGUuZ2V0U2VsZWN0ZWRSb3coKSA8IDApIHJldHVybjsKKwkJaWYgKGpUYWJsZUdyb3VwVGFibGUuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEdyb3VwSXRlbXNUYWJsZU1vZGVsKSB7CisJCQlpbnQgcm93ID0galRhYmxlR3JvdXBUYWJsZS5nZXRTZWxlY3RlZFJvdygpOworCQkJR3JvdXBJdGVtc1RhYmxlTW9kZWwgbW9kZWwgPSAoR3JvdXBJdGVtc1RhYmxlTW9kZWwpalRhYmxlR3JvdXBUYWJsZS5nZXRNb2RlbCgpOworCQkJQnVuZGxlSXRlbSBpdGVtID0gbW9kZWwuZ2V0QnVuZGxlSXRlbShyb3cpOworCQkJaWYgKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSAhPSBudWxsICYmIGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKSAhPSBudWxsKSB7CisJCQkJQnVuZGxlIHBhcmVudEJ1bmRsZSA9IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKTsKKwkJCQlwYXJlbnRCdW5kbGUucmVtb3ZlSXRlbShpdGVtLmdldEtleSgpKTsKKwkJCX0KKwkJCW1vZGVsLnVwZGF0ZSgpOworCQl9CisJfQorCQkKKwlwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisJCS8vIEluaXRpYWxpemUgY29tcG9uZW50cworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCWpMYWJlbEdyb3VwVGl0bGUgICAgICAgICAgPSBuZXcgSkxhYmVsKGJ1bmRsZS5uYW1lKTsKKwkJCWpDb21ib0JveEdyb3VwICAgICAgICAgICAgPSBuZXcgSkNvbWJvQm94KG5ldyBHcm91cENvbWJvQm94TW9kZWwoYnVuZGxlKSk7CisJCQkKKwkJCWpUYWJsZUdyb3VwVGFibGUgICAgICAgICAgPSBuZXcgSlRhYmxlKG5ldyBHcm91cEl0ZW1zVGFibGVNb2RlbCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpKTsKKwkJCWpTY3JvbGxQYW5lR3JvdXBUYWJsZSAgICAgPSBuZXcgSlNjcm9sbFBhbmUoalRhYmxlR3JvdXBUYWJsZSk7CisJCQlqTGFiZWxHcm91cE5hbWVUaXRsZSAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2Vncm91cF9ncm91cF9uYW1lIikpOworCQkJakxhYmVsR3JvdXBDb21tZW50VGl0bGUgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlZ3JvdXBfZ3JvdXBfY29tbWVudCIpKTsKKwkJCWpMYWJlbEdyb3VwQ29tbWVudCAgICAgICAgPSBuZXcgSkxhYmVsKCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldENvbW1lbnQoKSk7CisJCQkKKwkJCS8vIExvd2VyIHBhbmVsIGNvbXBvbmVudHMKKwkJCUpQYW5lbCAgbG93ZXJQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwkJCUpCdXR0b24gZGVsZXRlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZGVsZXRlX3Jlc291cmNlIikpOworCQkJSkJ1dHRvbiB0cmFuc2xhdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9tYXJrX3RyYW5zbGF0ZWQiKSk7CisJCQkKKwkJCWRlbGV0ZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZV90cmlnZ2VyIikpKTsKKwkJCXRyYW5zbGF0ZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX21hcmtfdHJhbnNsYXRlZF90cmlnZ2VyIikpKTsKKwkJCWxvd2VyUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2V1bnRyYW5zX3NlbGVjdGVkX3Jlc291cmNlc19vcHRpb25zIikpKTsKKwkJCWxvd2VyUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsMikpOworCQkJCisJCQlqTGFiZWxHcm91cE5hbWVUaXRsZS5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkxFRlQpOworCQkJCisJCQlqVGFibGVHcm91cFRhYmxlLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOworCQkJalRhYmxlR3JvdXBUYWJsZS5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCQorCQkJakNvbWJvQm94R3JvdXAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEdyb3VwQ29tYm9BY3Rpb25MaXN0ZW5lcih0aGlzKSk7CisJCQkKKwkJCWpMYWJlbEdyb3VwVGl0bGUuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDE4KSk7CisJCQkKKwkJCS8vIEFkZCBhY3Rpb24gbGlzdGVuZXJzCisJCQlkZWxldGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCWRlbGV0ZVNlbGVjdGVkUmVzb3VyY2UoKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJdHJhbnNsYXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQltYXJrU2VsZWN0ZWRSZXNvdXJjZUFzVHJhbnNsYXRlZCgpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQkvLyBVcGRhdGUgdGhlIGRpc3BsYXkKKwkJCXNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKKwkJCUdyaWRCYWdDb25zdHJhaW50cyBnYmMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CisJCQlyZW1vdmVBbGwoKTsKKwkJCWxvd2VyUGFuZWwuYWRkKGRlbGV0ZUJ1dHRvbik7CisJCQlsb3dlclBhbmVsLmFkZCh0cmFuc2xhdGVCdXR0b24pOworCisJCQlnYmMud2VpZ2h0eCA9IDEuMDsKKwkJCWdiYy53ZWlnaHR5ID0gMC4wOworCQkJZ2JjLmdyaWR3aWR0aCA9IEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVI7CisJCQlnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOworCQkJYWRkKGpMYWJlbEdyb3VwVGl0bGUsIGdiYyk7CisJCQlnYmMud2VpZ2h0eCA9IDAuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSAxOworCQkJYWRkKGpMYWJlbEdyb3VwTmFtZVRpdGxlLCBnYmMpOworCQkJZ2JjLndlaWdodHggPSAxLjA7CisJCQlnYmMuZ3JpZHdpZHRoID0gR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUjsKKwkJCWFkZChqQ29tYm9Cb3hHcm91cCwgZ2JjKTsKKwkJCWdiYy53ZWlnaHR4ID0gMC4wOworCQkJZ2JjLmdyaWR3aWR0aCA9IDE7CisJCQlhZGQoakxhYmVsR3JvdXBDb21tZW50VGl0bGUsIGdiYyk7CisJCQlnYmMud2VpZ2h0eCA9IDEuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSOworCQkJYWRkKGpMYWJlbEdyb3VwQ29tbWVudCwgZ2JjKTsKKwkJCWdiYy5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEg7CisJCQlnYmMud2VpZ2h0eSA9IDEuMDsKKwkJCWFkZChqU2Nyb2xsUGFuZUdyb3VwVGFibGUsIGdiYyk7CisJCQlnYmMud2VpZ2h0eSA9IDAuMDsKKwkJCWdiYy5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7CisJCQlhZGQobG93ZXJQYW5lbCwgZ2JjKTsKKwkJfSBlbHNlIGlmIChyYm0gIT0gbnVsbCkgeworCQkJQnVuZGxlIG1haW5CdW5kbGUgPSAoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZmlyc3RFbGVtZW50KCk7CisJCQlqTGFiZWxHcm91cFRpdGxlICAgICAgICAgID0gbmV3IEpMYWJlbChyYm0uZ2V0QmFzZUNsYXNzKCkgKyAiIC0gIiArIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZ3JvdXBzIikpOworCQkJakNvbWJvQm94R3JvdXAgICAgICAgICAgICA9IG5ldyBKQ29tYm9Cb3gobmV3IEdyb3VwQ29tYm9Cb3hNb2RlbChtYWluQnVuZGxlKSk7Ly9tYWluQnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCkpOworCQkJCisJCQlqTGlzdEdyb3VwICAgICAgICAgICAgICAgID0gbmV3IEpMaXN0KG5ldyBHcm91cEl0ZW1zTGlzdE1vZGVsKChCdW5kbGVHcm91cClqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKSkpOworCQkJalNjcm9sbFBhbmVHcm91cFRhYmxlICAgICA9IG5ldyBKU2Nyb2xsUGFuZShqTGlzdEdyb3VwKTsKKwkJCWpMYWJlbEdyb3VwTmFtZVRpdGxlICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZWdyb3VwX2dyb3VwX25hbWUiKSk7CisJCQlqTGFiZWxHcm91cENvbW1lbnRUaXRsZSAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2Vncm91cF9ncm91cF9jb21tZW50IikpOworCQkJdHJ5IHsKKwkJCQlqTGFiZWxHcm91cENvbW1lbnQgICAgPSBuZXcgSkxhYmVsKCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldENvbW1lbnQoKSk7CisJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKwkJCQlqTGFiZWxHcm91cENvbW1lbnQgICAgPSBuZXcgSkxhYmVsKCIiKTsKKwkJCX0KKwkJCQorCQkJY3JlYXRlSXRlbUJ1dHRvbiAgICAgICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NyZWF0ZV9yZXNvdXJjZSIpKTsKKwkJCWNyZWF0ZUdyb3VwQnV0dG9uICAgICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jcmVhdGVfZ3JvdXAiKSk7CisJCQlkZWxldGVJdGVtQnV0dG9uICAgICAgICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZGVsZXRlX3Jlc291cmNlIikpOworCQkJZGVsZXRlR3JvdXBCdXR0b24gICAgICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2RlbGV0ZV9ncm91cCIpKTsKKwkJCWVkaXRJdGVtQnV0dG9uICAgICAgICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9lZGl0X3Jlc291cmNlIikpOworCQkJZWRpdEdyb3VwQnV0dG9uICAgICAgICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2VkaXRfZ3JvdXAiKSk7CisJCQkKKwkJCWl0ZW1QYW5lbCAgICAgICAgICAgICAgICAgPSBuZXcgSlBhbmVsKCk7CisJCQlncm91cFBhbmVsICAgICAgICAgICAgICAgID0gbmV3IEpQYW5lbCgpOworCQkJCisJCQlpdGVtUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2Vncm91cF9pdGVtX29wdGlvbnMiKSkpOworCQkJZ3JvdXBQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZWdyb3VwX2dyb3VwX29wdGlvbnMiKSkpOworCQkJaXRlbVBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLDMpKTsKKwkJCWdyb3VwUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsMykpOworCQkJaXRlbVBhbmVsLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oMjAwMDAsNTApKTsKKwkJCWdyb3VwUGFuZWwuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigyMDAwMCw1MCkpOworCQkJCisJCQljcmVhdGVJdGVtQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlX3Jlc291cmNlX3RyaWdnZXIiKSkpOworCQkJZWRpdEl0ZW1CdXR0b24uc2V0TW5lbW9uaWMoUkJNYW5hZ2VyTWVudUJhci5nZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9lZGl0X3Jlc291cmNlX3RyaWdnZXIiKSkpOworCQkJZGVsZXRlSXRlbUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZV90cmlnZ2VyIikpKTsKKwkJCWNyZWF0ZUdyb3VwQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlX2dyb3VwX3RyaWdnZXIiKSkpOworCQkJCisJCQlqTGlzdEdyb3VwLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOworCQkJCisJCQlqQ29tYm9Cb3hHcm91cC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgR3JvdXBDb21ib0FjdGlvbkxpc3RlbmVyKHRoaXMpKTsKKwkJCQorCQkJakxhYmVsR3JvdXBUaXRsZS5zZXRGb250KG5ldyBGb250KCJTYW5zU2VyaWYiLEZvbnQuUExBSU4sMTgpKTsKKworCQkJLy8gQWRkIHRoZSBsaXN0ZW5lcnMKKwkJCWpMaXN0R3JvdXAuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGV2KSB7IAorCQkJCQlpZihldi5nZXRDbGlja0NvdW50KCkgPT0gMiAmJiBldi5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEpMaXN0KSB7CisJCQkJCQkvLyBBIGRvdWJsZSBjbGljayBtZWFucyB0aGV5IHdhbnQgdG8gZWRpdCBhIGJ1bmRsZSBpdGVtCisJCQkJCQlpZiAoKChKTGlzdClldi5nZXRTb3VyY2UoKSkuZ2V0U2VsZWN0ZWRWYWx1ZSgpICE9IG51bGwpCisJCQkJCQkJbmV3IEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZygoQnVuZGxlSXRlbSkoKEpMaXN0KWV2LmdldFNvdXJjZSgpKS5nZXRTZWxlY3RlZFZhbHVlKCksCisJCQkJCQkJCWxpc3RlbmVyLnJibSwgbGlzdGVuZXIsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2VkaXRfaXRlbSIpLCB0cnVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQkJCisJCQljcmVhdGVJdGVtQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQluZXcgQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nKCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldE5hbWUoKSwKKwkJCQkJCQkJCQkJCSBsaXN0ZW5lci5yYm0sIGxpc3RlbmVyLAorCQkJCQkJCQkJCQkJIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX25ld19pdGVtIiksIHRydWUpOworCQkJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCQkJfQorCQkJfSk7CisJCQljcmVhdGVHcm91cEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQllZGl0SXRlbUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCWlmIChqTGlzdEdyb3VwLmdldFNlbGVjdGVkVmFsdWUoKSAhPSBudWxsKQorCQkJCQkJbmV3IEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZygoQnVuZGxlSXRlbSlqTGlzdEdyb3VwLmdldFNlbGVjdGVkVmFsdWUoKSwKKwkJCQkJCQlsaXN0ZW5lci5yYm0sIGxpc3RlbmVyLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9lZGl0X2l0ZW0iKSwgdHJ1ZSk7CisJCQkJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJCQl9CisJCQl9KTsKKwkJCWVkaXRHcm91cEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCW5ldyBCdW5kbGVHcm91cEVkaXREaWFsb2coKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpLAorCQkJCQkJCQkJCQkgIGxpc3RlbmVyLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9lZGl0X2dyb3VwIiksIHRydWUpOworCQkJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCQkJfQorCQkJfSk7CisJCQlkZWxldGVHcm91cEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCWludCByZXNwb25zZSA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKGxpc3RlbmVyLAorCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfd2FybmluZ19kZWxldGVfZ3JvdXAiKSwKKwkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2RlbGV0ZV9ncm91cCIpLCBKT3B0aW9uUGFuZS5PS19DQU5DRUxfT1BUSU9OLAorCQkJCQkJSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKwkJCQkJaWYgKHJlc3BvbnNlID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgeworCQkJCQkJLy8gRGVsZXRlIHRoZSBncm91cCAKKwkJCQkJCWludCBpbmRleCA9IGpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSW5kZXgoKTsKKwkJCQkJCUJ1bmRsZUdyb3VwIGdyb3VwID0gKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpOworCQkJCQkJaWYgKGdyb3VwLmdldE5hbWUoKS5lcXVhbHMoIlVuZ3JvdXBlZCBJdGVtcyIpKQorCQkJCQkJCXJldHVybjsKKwkJCQkJCWlmIChpbmRleCA8IGpDb21ib0JveEdyb3VwLmdldEl0ZW1Db3VudCgpLTEpCisJCQkJCQkJakNvbWJvQm94R3JvdXAuc2V0U2VsZWN0ZWRJbmRleChpbmRleCsxKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlqQ29tYm9Cb3hHcm91cC5zZXRTZWxlY3RlZEluZGV4KGluZGV4LTEpOworCQkJCQkJcmJtLmRlbGV0ZUdyb3VwKGdyb3VwLmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQlkZWxldGVJdGVtQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJaW50IHJlc3BvbnNlID0gSk9wdGlvblBhbmUuc2hvd0NvbmZpcm1EaWFsb2cobGlzdGVuZXIsCisJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ193YXJuaW5nX2RlbGV0ZV9pdGVtIiksCisJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9kZWxldGVfaXRlbSIpLCBKT3B0aW9uUGFuZS5PS19DQU5DRUxfT1BUSU9OLAorCQkJCQkJSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKwkJCQkJaWYgKHJlc3BvbnNlID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgeworCQkJCQkJT2JqZWN0IG8gPSBqTGlzdEdyb3VwLmdldFNlbGVjdGVkVmFsdWUoKTsKKwkJCQkJCWlmIChvICE9IG51bGwpIHsKKwkJCQkJCQlCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSkgbzsKKwkJCQkJCQloYW5kbGVEZWxldGVJdGVtKGl0ZW0uZ2V0S2V5KCkpOworCQkJCQkJCS8vcGFuZWwucmJtLmRlbGV0ZUl0ZW0oaXRlbS5nZXRLZXkoKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQkvLyBVcGRhdGUgdGhlIGRpc3BsYXkKKwkJCXNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKKwkJCUdyaWRCYWdDb25zdHJhaW50cyBnYmMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CisJCQlyZW1vdmVBbGwoKTsKKwkJCWl0ZW1QYW5lbC5hZGQoY3JlYXRlSXRlbUJ1dHRvbiwgQm9yZGVyTGF5b3V0LldFU1QpOworCQkJaXRlbVBhbmVsLmFkZChlZGl0SXRlbUJ1dHRvbiwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQlpdGVtUGFuZWwuYWRkKGRlbGV0ZUl0ZW1CdXR0b24sIEJvcmRlckxheW91dC5FQVNUKTsKKwkJCWdyb3VwUGFuZWwuYWRkKGNyZWF0ZUdyb3VwQnV0dG9uLCBCb3JkZXJMYXlvdXQuV0VTVCk7CisJCQlncm91cFBhbmVsLmFkZChlZGl0R3JvdXBCdXR0b24sIEJvcmRlckxheW91dC5DRU5URVIpOworCQkJZ3JvdXBQYW5lbC5hZGQoZGVsZXRlR3JvdXBCdXR0b24sIEJvcmRlckxheW91dC5FQVNUKTsKKworCQkJCisJCQlnYmMud2VpZ2h0eCA9IDEuMDsKKwkJCWdiYy53ZWlnaHR5ID0gMC4wOworCQkJZ2JjLmdyaWR3aWR0aCA9IEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVI7CisJCQlnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOworCQkJYWRkKGpMYWJlbEdyb3VwVGl0bGUsIGdiYyk7CisJCQlnYmMud2VpZ2h0eCA9IDAuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSAxOworCQkJYWRkKGpMYWJlbEdyb3VwTmFtZVRpdGxlLCBnYmMpOworCQkJZ2JjLndlaWdodHggPSAxLjA7CisJCQlnYmMuZ3JpZHdpZHRoID0gR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUjsKKwkJCWFkZChqQ29tYm9Cb3hHcm91cCwgZ2JjKTsKKwkJCWdiYy53ZWlnaHR4ID0gMC4wOworCQkJZ2JjLmdyaWR3aWR0aCA9IDE7CisJCQlhZGQoakxhYmVsR3JvdXBDb21tZW50VGl0bGUsIGdiYyk7CisJCQlnYmMud2VpZ2h0eCA9IDEuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSOworCQkJYWRkKGpMYWJlbEdyb3VwQ29tbWVudCwgZ2JjKTsKKwkJCWdiYy5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEg7CisJCQlnYmMud2VpZ2h0eSA9IDEuMDsKKwkJCWFkZChqU2Nyb2xsUGFuZUdyb3VwVGFibGUsIGdiYyk7CisJCQlnYmMud2VpZ2h0eSA9IDAuMDsKKwkJCWdiYy5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7CisJCQlhZGQoZ3JvdXBQYW5lbCwgZ2JjKTsKKwkJCWFkZChpdGVtUGFuZWwsIGdiYyk7CisJCX0gZWxzZSB7CisJCQlyZW1vdmVBbGwoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGVDb21wb25lbnRzKCkgeworCQkvLyBJbml0aWFsaXplIGNvbXBvbmVudHMKKwkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisJCQlqTGFiZWxHcm91cFRpdGxlLnNldFRleHQoYnVuZGxlLm5hbWUpOworCQkJCisJCQkoKEdyb3VwSXRlbXNUYWJsZU1vZGVsKWpUYWJsZUdyb3VwVGFibGUuZ2V0TW9kZWwoKSkuc2V0R3JvdXAoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKTsKKwkJCWpMYWJlbEdyb3VwQ29tbWVudC5zZXRUZXh0KCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldENvbW1lbnQoKSk7CisJCQkKKwkJCWpUYWJsZUdyb3VwVGFibGUuc2V0U2VsZWN0aW9uTW9kZShMaXN0U2VsZWN0aW9uTW9kZWwuU0lOR0xFX1NFTEVDVElPTik7CisJCQkKKwkJCS8vIFVwZGF0ZSB0aGUgZ3JvdXAgY29tbWVudAorCQkJakxhYmVsR3JvdXBDb21tZW50LnNldFRleHQoKChCdW5kbGVHcm91cClqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKSkuZ2V0Q29tbWVudCgpKTsKKwkJCSgoR3JvdXBDb21ib0JveE1vZGVsKWpDb21ib0JveEdyb3VwLmdldE1vZGVsKCkpLnVwZGF0ZSgpOworCQl9IGVsc2UgaWYgKHJibSAhPSBudWxsKSB7CisJCQkKKwkJCS8vIFVwZGF0ZSB0aGUgbGlzdCBvZiBncm91cHMKKy8vCQkJdHJ5IHsKKwkJCQkoKEdyb3VwQ29tYm9Cb3hNb2RlbClqQ29tYm9Cb3hHcm91cC5nZXRNb2RlbCgpKS51cGRhdGUoKTsKKy8vCQkJfQorLy8JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisJCQkvLyBVcGRhdGUgdGhlIGdyb3VwIGNvbW1lbnQKKwkJCWlmICgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVsbCkKKwkJCQlqTGFiZWxHcm91cENvbW1lbnQuc2V0VGV4dCgoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKS5nZXRDb21tZW50KCkpOworCQkJZWxzZQorCQkJCWpMYWJlbEdyb3VwQ29tbWVudC5zZXRUZXh0KCIiKTsKKwkJCS8vIFVwZGF0ZSB0aGUgbGlzdCBvZiByZXNvdXJjZXMKKwkJCUxpc3RNb2RlbCBsbW9kZWwgPSBqTGlzdEdyb3VwLmdldE1vZGVsKCk7CisJCQlpZiAobG1vZGVsIGluc3RhbmNlb2YgR3JvdXBJdGVtc0xpc3RNb2RlbCkgeworCQkJCS8vKChHcm91cEl0ZW1zTGlzdE1vZGVsKWxtb2RlbCkudXBkYXRlKCk7CisJCQkJKChHcm91cEl0ZW1zTGlzdE1vZGVsKWxtb2RlbCkuc2V0R3JvdXAoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCUdyb3VwSXRlbXNMaXN0TW9kZWwgbmV3TW9kZWwgPSBuZXcgR3JvdXBJdGVtc0xpc3RNb2RlbCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpOworCQkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiTGlzdCBNb2RlbCBub3QgYXMgYW50aWNpcGF0ZWQ6ICIgKyBsbW9kZWwuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCQkJCWpMaXN0R3JvdXAuc2V0TW9kZWwobmV3TW9kZWwpOworCQkJCW5ld01vZGVsLnVwZGF0ZSgpOworCQkJfQorCQl9IGVsc2UgeworCQkJUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKCJVcGRhdGUsIGJ1dCBubyBhY3RpdmUgY29tcG9uZW50cyIpOworCQkJcmVtb3ZlQWxsKCk7CisJCX0KKwkJLy92YWxpZGF0ZSgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaGFuZGxlRGVsZXRlSXRlbShTdHJpbmcga2V5KSB7CisJCWlmIChyYm0gIT0gbnVsbCkgcmJtLmRlbGV0ZUl0ZW0oa2V5KTsKKwl9Cit9CisKKy8qKgorICogVGhlIGFjdGlvbiBsaXN0ZW5lciB3aGljaCBtb25pdG9ycyBjaGFuZ2VzIGluIHRoZSBncm91cCB0byBkaXNwbGF5CisgKi8KK2NsYXNzIEdyb3VwQ29tYm9BY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKwlSQkdyb3VwUGFuZWwgcGFuZWw7CisJCisJcHJvdGVjdGVkIEdyb3VwQ29tYm9BY3Rpb25MaXN0ZW5lcihSQkdyb3VwUGFuZWwgcGFuZWwpIHsKKwkJdGhpcy5wYW5lbCA9IHBhbmVsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJcGFuZWwudXBkYXRlQ29tcG9uZW50cygpOworCX0KK30KKworLyoqCisgKiBUaGUgbGlzdCBtb2RlbCBmb3IgZ3JvdXBzCisgKi8KK2NsYXNzIEdyb3VwSXRlbXNMaXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdExpc3RNb2RlbCB7CisJQnVuZGxlR3JvdXAgZ3JvdXA7CisJCisJcHVibGljIHZvaWQgc2V0R3JvdXAoQnVuZGxlR3JvdXAgZ3JvdXApIHsKKwkJdGhpcy5ncm91cCA9IGdyb3VwOworCQl1cGRhdGUoKTsKKwl9CisJCisJcHVibGljIEdyb3VwSXRlbXNMaXN0TW9kZWwoQnVuZGxlR3JvdXAgZ3JvdXApIHsKKwkJdGhpcy5ncm91cCA9IGdyb3VwOworCX0KKwkKKwlwdWJsaWMgaW50IGdldFNpemUoKSB7CisJCWlmIChncm91cCA9PSBudWxsKQorCQkJcmV0dXJuIDA7CisJCWludCByZXN1bHQgPSBncm91cC5nZXRJdGVtQ291bnQoKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7CisJCXJldHVybiBncm91cC5nZXRCdW5kbGVJdGVtKGluZGV4KTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlmaXJlQ29udGVudHNDaGFuZ2VkKHRoaXMsIDAsIGdldFNpemUoKS0xKTsKKwl9Cit9CisKKy8qKgorICogVGhlIHRhYmxlIG1vZGVsIGZvciBzZWFyY2hlZCBJdGVtcworICovCitjbGFzcyBHcm91cENvbWJvQm94TW9kZWwgZXh0ZW5kcyBEZWZhdWx0Q29tYm9Cb3hNb2RlbCB7CisJQnVuZGxlIGJ1bmRsZTsKKwkKKwlwdWJsaWMgR3JvdXBDb21ib0JveE1vZGVsIChCdW5kbGUgYnVuZGxlKSB7CisJCXRoaXMuYnVuZGxlID0gYnVuZGxlOworCQlzZXRTZWxlY3RlZEl0ZW0oYnVuZGxlLmdldEJ1bmRsZUdyb3VwKDApKTsKKwl9CisJCisJcHVibGljIGludCBnZXRTaXplKCkgeworCQlyZXR1cm4gYnVuZGxlLmdldEdyb3VwQ291bnQoKTsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7CisJCXJldHVybiBidW5kbGUuZ2V0QnVuZGxlR3JvdXAoaW5kZXgpOworCX0KKwkKKwlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKKwkJcmV0dXJuIHN1cGVyLmdldFNlbGVjdGVkSXRlbSgpOworCQkvL3JldHVybiBnZXRFbGVtZW50QXQoMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJZmlyZUNvbnRlbnRzQ2hhbmdlZCh0aGlzLCAwLCBnZXRTaXplKCktMSk7CisJfQorfQorCisvKioKKyAqIFRoZSB0YWJsZSBtb2RlbCBmb3IgYnVuZGxlIGdyb3VwcworICovCitjbGFzcyBHcm91cEl0ZW1zVGFibGVNb2RlbCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCB7CisJQnVuZGxlR3JvdXAgZ3JvdXA7CisJCisJcHVibGljIEdyb3VwSXRlbXNUYWJsZU1vZGVsKEJ1bmRsZUdyb3VwIGdyb3VwKSB7CisJCXRoaXMuZ3JvdXAgPSBncm91cDsKKwl9CisJCisJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsgcmV0dXJuIDM7IH0KKwkJICAgIAorCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7CisJCXJldHVybiBncm91cC5nZXRJdGVtQ291bnQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0R3JvdXAoQnVuZGxlR3JvdXAgYmcpIHsKKwkJZ3JvdXAgPSBiZzsKKwkJZmlyZVRhYmxlQ2hhbmdlZChuZXcgVGFibGVNb2RlbEV2ZW50KHRoaXMpKTsKKwl9CisJCQkKKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvdywgaW50IGNvbCkgeworCQlCdW5kbGVJdGVtIGl0ZW0gPSBncm91cC5nZXRCdW5kbGVJdGVtKHJvdyk7CisJCQkJCisJCVN0cmluZyByZXRTdHIgPSBudWxsOworCQkJCQorCQlzd2l0Y2goY29sKSB7CisJCWNhc2UgMDoKKwkJCXJldFN0ciA9IGl0ZW0uZ2V0S2V5KCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmV0U3RyID0gaXRlbS5nZXRUcmFuc2xhdGlvbigpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXJldFN0ciA9IChpdGVtLmdldENvbW1lbnQoKSA9PSBudWxsID8gIiIgOiBpdGVtLmdldENvbW1lbnQoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldFN0ciA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFibGVfY2VsbF9lcnJvciIpOworCQl9CisJCQkJCisJCXJldHVybiByZXRTdHI7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sKSB7CisJCWlmIChjb2wgPT0gMCkgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2Vncm91cF9jb2x1bW5fa2V5Iik7CisJCWVsc2UgaWYgKGNvbCA9PSAxKSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZWdyb3VwX2NvbHVtbl90cmFuc2xhdGlvbiIpOworCQllbHNlIGlmIChjb2wgPT0gMikgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2Vncm91cF9jb2x1bW5fY29tbWVudCIpOworCQllbHNlIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYmxlX2NvbHVtbl9lcnJvciIpOworCX0KKwkKKwlwdWJsaWMgQnVuZGxlSXRlbSBnZXRCdW5kbGVJdGVtKGludCByb3cpIHsKKwkJaWYgKHJvdyA+PSBncm91cC5nZXRJdGVtQ291bnQoKSkKKwkJICAgIHJldHVybiBudWxsOworCQlyZXR1cm4gZ3JvdXAuZ2V0QnVuZGxlSXRlbShyb3cpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCWZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCTWFuYWdlckdVSS5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQk1hbmFnZXJHVUkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWY0NTY2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQk1hbmFnZXJHVUkuamF2YQpAQCAtMCwwICsxLDE4MTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibS5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuKjsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS4qOworCisvKioKKyAqIFRoZSBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UgZm9yIHdvcmtpbmcgd2l0aCBhbmQgdGhyb3VnaCBhIFJlc291cmNlIEJ1bmRsZSBNYW5hZ2VyLiBUaGUgR1VJIGhhcyBubyBwdWJsaWMgbWFpbgorICogbWV0aG9kLiBJdCBpcyBpbnN0ZWFkIGluc3RhbnRpYXRlZCBmcm9tIHJ1bm5pbmcgdGhlIG1haW4gbWV0aG9kIGluIFJCTWFuYWdlci4gRm9yIGhlbHAgd2l0aCB1c2luZyB0aGlzIGludGVyZmFjZSwKKyAqIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gdGhlIHByb2plY3QuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCTWFuYWdlckdVSSBleHRlbmRzIEpGcmFtZSBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyLCBNb3VzZUxpc3RlbmVyLCBDaGFuZ2VMaXN0ZW5lciwgVHJlZVNlbGVjdGlvbkxpc3RlbmVyCit7CisJLy8gQ09OU1RBTlRTCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJ1ZmZlciA9IDIwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBkaW1NYWluID0gbmV3IERpbWVuc2lvbig3NTAsNTUwKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaW1lbnNpb24gZGltTWFpbk1heCA9IG5ldyBEaW1lbnNpb24oMjAwMCwxNTAwKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaW1lbnNpb24gZGltTWFpbk1pbiA9IG5ldyBEaW1lbnNpb24oNTUwLDM1MCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbVRvcCA9IG5ldyBEaW1lbnNpb24oZGltTWFpbi53aWR0aCAtIGJ1ZmZlciw1MCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbVRvcE1heCA9IG5ldyBEaW1lbnNpb24oZGltTWFpbk1heC53aWR0aCAtIGJ1ZmZlciw1MCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbVRvcE1pbiA9IG5ldyBEaW1lbnNpb24oZGltTWFpbk1pbi53aWR0aCAtIGJ1ZmZlciw1MCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbUJvdHRvbSA9IG5ldyBEaW1lbnNpb24oZGltTWFpbi53aWR0aCAtIGJ1ZmZlcixkaW1NYWluLmhlaWdodC1kaW1Ub3AuaGVpZ2h0IC0gYnVmZmVyKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaW1lbnNpb24gZGltQm90dG9tTWF4ID0gbmV3IERpbWVuc2lvbihkaW1NYWluTWF4LndpZHRoIC0gYnVmZmVyLGRpbU1haW5NYXguaGVpZ2h0LWRpbVRvcE1pbi5oZWlnaHQgLSBidWZmZXIpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBkaW1Cb3R0b21NaW4gPSBuZXcgRGltZW5zaW9uKGRpbU1haW5NaW4ud2lkdGggLSBidWZmZXIsZGltTWFpbk1pbi5oZWlnaHQtZGltVG9wTWF4LmhlaWdodCAtIGJ1ZmZlcik7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbUxlZnQgPSBuZXcgRGltZW5zaW9uKDE3NSxkaW1Cb3R0b20uaGVpZ2h0IC0gYnVmZmVyKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaW1lbnNpb24gZGltUmlnaHQgPSBuZXcgRGltZW5zaW9uKGRpbU1haW4ud2lkdGgtZGltTGVmdC53aWR0aCAtIGJ1ZmZlcixkaW1Cb3R0b20uaGVpZ2h0IC0gYnVmZmVyKTsKKwkKKwkvKioKKwkgKiBVc2VkIGZvciB0b2dnbGluZyB0aGUgZGVidWcgbW9kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCS8qKgorCSAqIFVzZWQgdG8gY291bnQgZGVidWcgbWVzc2FnZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBkZWJ1Z2NvdW50ID0gMDsKKwkKKwkvLyBtZW1iZXIgZGVjbGFyYXRpb25zCisJCisJLy8gKiogREFUQSAqKgorCVJCTWFuYWdlciByYm0gPSBudWxsOworCVN0cmluZyB1c2VyTmFtZSA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidW5rbm93bl91c2VyIik7CisJCisJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBhY3RpdmVOb2RlID0gbnVsbDsKKwkKKwkvLyAqKiBNQUlOIE1FTlUgKioKKwlSQk1hbmFnZXJNZW51QmFyICAgICAgICAgak1lbnVCYXJNYWluID0gbnVsbDsKKworCS8vICoqIENPTlRFTlQgUEFORVMgKioKKwlCb3ggICAgICAgICAgYm94TWFpbiA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJLy9KUGFuZWwgICAgICAgalBhbmVsVG9wID0gbmV3IEpQYW5lbCgpOworCUpQYW5lbCAgICAgICBqUGFuZWxCb3R0b20gPSBuZXcgSlBhbmVsKCk7CisJSlNwbGl0UGFuZSAgIGpTcGxpdFBhbmVNYWluID0gbmV3IEpTcGxpdFBhbmUoSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElUKTsKKworCS8vICoqIFNQTElUIFBBTkUgQ09NUE9ORU5UUyAqKgorCUpUcmVlICAgICAgICBqVHJlZURpc3BsYXkgPSBuZXcgSlRyZWUoKTsKKwlKVGFiYmVkUGFuZSAgalRhYmJlZFBhbmVNYWluID0gbmV3IEpUYWJiZWRQYW5lKCk7CisJUkJTdGF0aXN0aWNzUGFuZWwgICAgICAgIGpQYW5lbFN0YXRzID0gbmV3IFJCU3RhdGlzdGljc1BhbmVsKCk7CisJUkJVbnRyYW5zbGF0ZWRQYW5lbCAgICAgIGpQYW5lbFVudHJhbnMgPSBuZXcgUkJVbnRyYW5zbGF0ZWRQYW5lbCh0aGlzKTsKKwlSQkdyb3VwUGFuZWwgICAgICAgICAgICAgalBhbmVsR3JvdXBzID0gbmV3IFJCR3JvdXBQYW5lbCh0aGlzKTsKKwlSQlNlYXJjaFBhbmVsICAgICAgICAgICAgalBhbmVsU2VhcmNoID0gbmV3IFJCU2VhcmNoUGFuZWwodGhpcyk7CisJSlNjcm9sbFBhbmUgIGpTY3JvbGxQYW5lVHJlZSA9IG5ldyBKU2Nyb2xsUGFuZShqVHJlZURpc3BsYXksCisJCQkJCQkJCQkJCQkJU2Nyb2xsUGFuZUNvbnN0YW50cy5WRVJUSUNBTF9TQ1JPTExCQVJfQVNfTkVFREVELAorCQkJCQkJCQkJCQkJCVNjcm9sbFBhbmVDb25zdGFudHMuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQVNfTkVFREVEKTsKKwkvLyAqKiBQUk9KRUNUIFZJRVcgU1BMSVQgUEFORSBDT01QT05FTlRTCisJSlRhYmJlZFBhbmUgICAgICAgICAgICAgIHRyZWVUYWJiZWRQYW5lID0gbmV3IEpUYWJiZWRQYW5lKCk7CisJSlRyZWUgICAgICAgICAgICAgICAgICAgIHByb2plY3RUcmVlID0gbmV3IEpUcmVlKCk7CisJSlNjcm9sbFBhbmUgICAgICAgICAgICAgIHByb2plY3RTY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHByb2plY3RUcmVlLCAKKwkJCQkJCQkJCQkJCQkJCQlTY3JvbGxQYW5lQ29uc3RhbnRzLlZFUlRJQ0FMX1NDUk9MTEJBUl9BU19ORUVERUQsCisJCQkJCQkJCQkJCQkJCQkJU2Nyb2xsUGFuZUNvbnN0YW50cy5IT1JJWk9OVEFMX1NDUk9MTEJBUl9BU19ORUVERUQpOworCVJCUHJvamVjdEl0ZW1QYW5lbCAgICAgICBwcm9qZWN0UGFuZWwgPSBuZXcgUkJQcm9qZWN0SXRlbVBhbmVsKHRoaXMpOworCVJCUHJvamVjdCAgICAgICAgICAgICAgICBwcm9qZWN0ID0gbnVsbDsKKwkKKwkvLyAqKiBGaWxlIENob29zZXIgKioKKwlKRmlsZUNob29zZXIgb3BlbkZpbGVDaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworCUpGaWxlQ2hvb3NlciBzYXZlRmlsZUNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisJSkZpbGVDaG9vc2VyIHByb2plY3RGaWxlQ2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKwkKKwkvKioKKwkgKiBDcmVhdGlvbiBvZiB0aGUgR1VJIHNob3VsZCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIGNhbGxzIHRvIGluaXRDb21wb25lbnRzKCkgYW5kIHNldFZpc2libGUodHJ1ZSkuCisJICogVGhlc2UgbWV0aG9kcyB3ZXJlIG5vdCBjYWxsZWQgYnkgZGVmYXVsdCBmb3IgcHJvZ3JhbW1pbmcgZGlzY3JldGlvbgorCSAqLworCQorCXB1YmxpYyBSQk1hbmFnZXJHVUkoKQorCXsKKwl9CisJCisJLyoqCisJICogSW5oZXJpdHMgZnJvbSBKRnJhbWUudmFsaWRhdGUoKSwgd2l0aCBzb21lIGNvbXBvbmVudCB1cGRhdGVzCisJICovCisJCisJcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisJCXN1cGVyLnZhbGlkYXRlKCk7CisJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwl9CisJCisJLyoqCisJICogSW5pdGlhbCBjb25zdHJ1Y3Rpb24gb2YgYWxsIG9mIHRoZSBHVUkgY29tcG9uZW50cy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCisJICogY29uc3RydWN0aW9uIG9mIHRoZSBHVUkgb2JqZWN0LgorCSAqLworCQorCXB1YmxpYyB2b2lkIGluaXRDb21wb25lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJdGhpcy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOworCQkvLyB0aGUgZm9sbG93aW5nIGNvZGUgc2V0cyB0aGUgZnJhbWUncyBpbml0aWFsIHN0YXRlCisJCQorCQlvcGVuRmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKwkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKwkJCQkKKwkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworCQkJCWlmICghKG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkpIHJldHVybiBmYWxzZTsKKwkJCQlpZiAobmFtZS5pbmRleE9mKCJfIikgPiAwKSByZXR1cm4gZmFsc2U7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCisJCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQkJCXJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbiIpOworCQkJfQorCQl9KTsKKwkJCisJCXNhdmVGaWxlQ2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCkgeworCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHJldHVybiB0cnVlOworCQkJCQorCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7CisJCQkJaWYgKCEobmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKSkgcmV0dXJuIGZhbHNlOworCQkJCWlmIChuYW1lLmluZGV4T2YoIl8iKSA+IDApIHJldHVybiBmYWxzZTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCQkJcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uIik7CisJCQl9CisJCX0pOworCQkKKwkJcHJvamVjdEZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisJCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisJCQkJCisJCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKKwkJCQlpZiAoIShuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5yYnByb2plY3QiKSkpIHJldHVybiBmYWxzZTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCQorCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCQlyZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfcHJvamVjdF9maWx0ZXJfZGVzY3JpcHRpb24iKTsJCisJCQl9CisJCX0pOworCisgICAgICAgIC8vICoqIFRoZSBNYWluIHByb2dyYW0gaWNvbiAqKgorICAgICAgICBzZXRJY29uSW1hZ2UoKG5ldyBJbWFnZUljb24oZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiaW1hZ2VzL3RyZWVfaWNvbl9idW5kbGUuZ2lmIikpKS5nZXRJbWFnZSgpKTsKKwkJCisJCS8vICoqIE1BSU4gTUVOVSBCQVIgSVRFTVMgKioKKwkJak1lbnVCYXJNYWluID0gbmV3IFJCTWFuYWdlck1lbnVCYXIodGhpcyk7CisJCQorCQkvLyAqKiBESVNQTEFZIFRSRUUgKioKKwkJLy9qU2Nyb2xsUGFuZVRyZWUuc2V0U2l6ZShkaW1MZWZ0KTsKKwkJdXBkYXRlRGlzcGxheVRyZWUoKTsKKwkJdXBkYXRlUHJvamVjdFRyZWUoKTsKKwkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQkKKwkJalBhbmVsU3RhdHMuc2V0U2l6ZShkaW1SaWdodCk7CisJCWpQYW5lbFVudHJhbnMuc2V0U2l6ZShkaW1SaWdodCk7CisJCWpQYW5lbEdyb3Vwcy5zZXRTaXplKGRpbVJpZ2h0KTsKKwkJalBhbmVsU2VhcmNoLnNldFNpemUoZGltUmlnaHQpOworCQkKKwkJLy8gKiogTUFJTiBUQUJCRUQgUEFORSAqKgorCQlqVGFiYmVkUGFuZU1haW4uc2V0U2l6ZShkaW1SaWdodCk7CisJCWpUYWJiZWRQYW5lTWFpbi5hZGRUYWIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJfc3RhdGlzdGljcyIpLCBqUGFuZWxTdGF0cyk7CisJCWpUYWJiZWRQYW5lTWFpbi5hZGRUYWIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJfdW50cmFuc2xhdGVkIiksIGpQYW5lbFVudHJhbnMpOworCQlqVGFiYmVkUGFuZU1haW4uYWRkVGFiKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX2dyb3VwcyIpLCBqUGFuZWxHcm91cHMpOworCQlqVGFiYmVkUGFuZU1haW4uYWRkVGFiKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX3NlYXJjaCIpLCBqUGFuZWxTZWFyY2gpOworCQkKKwkJLy8gKiogTEVGVCBUQUJCRUQgUEFORSAqKgorCQl0cmVlVGFiYmVkUGFuZS5zZXRTaXplKGRpbUxlZnQpOworCQl0cmVlVGFiYmVkUGFuZS5zZXRQcmVmZXJyZWRTaXplKGRpbUxlZnQpOworCQl0cmVlVGFiYmVkUGFuZS5hZGRUYWIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJfYnVuZGxlIiksIGpTY3JvbGxQYW5lVHJlZSk7CisJCXRyZWVUYWJiZWRQYW5lLmFkZFRhYihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYl9wcm9qZWN0IiksIHByb2plY3RTY3JvbGxQYW5lKTsKKwkJdHJlZVRhYmJlZFBhbmUuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCQorCQkvLyAqKiBNQUlOIFNQTElUIFBBTkUgKioKKwkJLy9qU3BsaXRQYW5lTWFpbi5zZXRTaXplKGRpbUJvdHRvbSk7CisJCS8valNwbGl0UGFuZU1haW4uc2V0TGVmdENvbXBvbmVudChqU2Nyb2xsUGFuZVRyZWUpOworCQlqU3BsaXRQYW5lTWFpbi5zZXRMZWZ0Q29tcG9uZW50KHRyZWVUYWJiZWRQYW5lKTsKKwkJalNwbGl0UGFuZU1haW4uc2V0UmlnaHRDb21wb25lbnQoalRhYmJlZFBhbmVNYWluKTsKKwkJalNwbGl0UGFuZU1haW4uc2V0Q29udGludW91c0xheW91dCh0cnVlKTsKKwkJCisJCS8vICoqIEJPVFRPTSBQQU5FTCAqKgorCQkvL2pQYW5lbEJvdHRvbS5zZXRQcmVmZXJyZWRTaXplKGRpbUJvdHRvbSk7CisJCWpQYW5lbEJvdHRvbS5zZXRNYXhpbXVtU2l6ZShkaW1Cb3R0b21NYXgpOworCQlqUGFuZWxCb3R0b20uc2V0TWluaW11bVNpemUoZGltQm90dG9tTWluKTsKKwkJalBhbmVsQm90dG9tLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoQ29sb3IuYmxhY2spKTsKKwkJalBhbmVsQm90dG9tLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KDEsMSkpOworCQlqUGFuZWxCb3R0b20ucmVtb3ZlQWxsKCk7CisJCWpQYW5lbEJvdHRvbS5hZGQoalNwbGl0UGFuZU1haW4sIEJvcmRlckxheW91dC5DRU5URVIpOworCQkKKwkJLy8gKiogTUFJTiBGUkFNRSBTRVRVUCAqKgorCQlkaW1NYWluLmhlaWdodCArPSBqTWVudUJhck1haW4uZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKKwkJc2V0U2l6ZShkaW1NYWluKTsKKwkJKChKQ29tcG9uZW50KWdldENvbnRlbnRQYW5lKCkpLnNldE1heGltdW1TaXplKGRpbU1haW5NYXgpOworCQkoKEpDb21wb25lbnQpZ2V0Q29udGVudFBhbmUoKSkuc2V0TWluaW11bVNpemUoZGltTWFpbk1pbik7CisJCXNldEpNZW51QmFyKGpNZW51QmFyTWFpbik7CisJCWdldENvbnRlbnRQYW5lKCkucmVtb3ZlQWxsKCk7CisJCWdldENvbnRlbnRQYW5lKCkuYWRkKGpQYW5lbEJvdHRvbSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCXNldFRpdGxlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVzb3VyY2VfYnVuZGxlX21hbmFnZXIiKSk7CisJCXZhbGlkYXRlVHJlZSgpOworCQkKKwkJYWRkV2luZG93TGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpIHsKKwkJCQl0aGlzV2luZG93Q2xvc2luZyhlKTsKKwkJCX0KKwkJfSk7CisJfQorICAKKyAgCXByaXZhdGUgYm9vbGVhbiBtU2hvd24gPSBmYWxzZTsKKwkKKwkvKioKKwkgKiBSZXZlYWxzIHRoZSBwcml2YXRlIG1ldGhvZCBvZiBKRnJhbWUudmFsaWRhdGVUcmVlKCkKKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZU15VHJlZSgpIHsKKwkJdmFsaWRhdGVUcmVlKCk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2UgRmlsZSAoaS5lLiBFbmdsaXNoLCBFbmdsaXNoIENhbmFkYSwgRmlubmlzaCwgZXRjLikKKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBjcmVhdGVSZXNvdXJjZUZpbGUoKSB7CisJCW5ldyBSZXNvdXJjZUNyZWF0aW9uRGlhbG9nKHJibSwgdGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfbmV3X2ZpbGUiKSwgdHJ1ZSk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZ3JvdXAgZm9yIGdyb3VwaW5nIEJ1bmRsZUl0ZW1zCisJICovCisJCisJcHVibGljIHZvaWQgY3JlYXRlQnVuZGxlR3JvdXAoKSB7CisJCW5ldyBCdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nKHJibSwgdGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfbmV3X2dyb3VwIiksIHRydWUpOworCQl1cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQnVuZGxlSXRlbQorCSAqLworCQorCXB1YmxpYyB2b2lkIGNyZWF0ZUJ1bmRsZUl0ZW0oKSB7CisJCW5ldyBCdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2cocmJtLCB0aGlzLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9uZXdfaXRlbSIpLCB0cnVlKTsKKwkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCX0KKwkKKwkvKioKKwkgKiBIYW5kbGVzIGV2ZW50cyBnZW5lcmF0ZWQKKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoVHJlZVNlbGVjdGlvbkV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRTb3VyY2UoKSA9PSBwcm9qZWN0VHJlZSkgdXBkYXRlUHJvamVjdFBhbmVscygpOworCQllbHNlIGlmIChldi5nZXRTb3VyY2UoKSA9PSBqVHJlZURpc3BsYXkpIHsKKwkJCVRyZWVQYXRoIHNlbFBhdGggPSBqVHJlZURpc3BsYXkuZ2V0U2VsZWN0aW9uUGF0aCgpOworCQkJYWN0aXZlTm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXNlbFBhdGguZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKKwkJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwkJCS8qCisJCQlpbnQgc2VsUm93ID0galRyZWVEaXNwbGF5LmdldFJvd0ZvckxvY2F0aW9uKGV2LmdldFgoKSwgZXYuZ2V0WSgpKTsKKwkJCVRyZWVQYXRoIHNlbFBhdGggPSBqVHJlZURpc3BsYXkuZ2V0UGF0aEZvckxvY2F0aW9uKGV2LmdldFgoKSwgZXYuZ2V0WSgpKTsKKwkJCWlmIChzZWxSb3cgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChldi5nZXRDbGlja0NvdW50KCkgPT0gMSAmJiBldi5nZXRTb3VyY2UoKSA9PSBqVHJlZURpc3BsYXkpIHsKKwkJCQkKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk90aGVyIHRyZWUiKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0Q2xpY2tDb3VudCgpID09IDEgJiYgZXYuZ2V0U291cmNlKCkgPT0gcHJvamVjdFRyZWUpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlIHByZXNzZWQiKTsKKwkJCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CQorCQkJfSBlbHNlIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcudmFsdWVPZihldi5nZXRDbGlja0NvdW50KCkpICsgIiAiICsgZXYuZ2V0U291cmNlKCkudG9TdHJpbmcoKSk7CisJCQkKKwkJCSovCisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRTb3VyY2UoKSA9PSB0cmVlVGFiYmVkUGFuZSkgeworCQkJaW50IGluZGV4ID0gdHJlZVRhYmJlZFBhbmUuZ2V0U2VsZWN0ZWRJbmRleCgpOwkKKwkJCVN0cmluZyB0aXRsZSA9IHRyZWVUYWJiZWRQYW5lLmdldFRpdGxlQXQoaW5kZXgpOworCQkJaWYgKHRpdGxlLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYl9idW5kbGUiKSkpIHsKKwkJCQlqU3BsaXRQYW5lTWFpbi5zZXRSaWdodENvbXBvbmVudChqVGFiYmVkUGFuZU1haW4pOworCQkJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwkJCX0gZWxzZSBpZiAodGl0bGUuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX3Byb2plY3QiKSkpIHsKKwkJCQlqU3BsaXRQYW5lTWFpbi5zZXRSaWdodENvbXBvbmVudChwcm9qZWN0UGFuZWwpOworCQkJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJaWYgKGV2LmdldElEKCkgPT0gQWN0aW9uRXZlbnQuQUNUSU9OX1BFUkZPUk1FRCkgeworCQkJaWYgKGV2LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSk1lbnVJdGVtICYmICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCkgIT0gbnVsbCAmJgorCQkJCSgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiX18iKSkgeyAgICAgICAgICAgICAgIC8vIE1lbnUgLT4gRmlsZSAtPiBfX1JlY2VudCBGaWxlCisJCQkJLy8gVGhpcyBpdGVtIGlzIGEgcmVjZW50IGZpbGUgc2VsZWN0aW9uLiBXZSBuZWVkIHRvIG9wZW4gdGhhdCBmaWxlCisJCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9ICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCk7CisJCQkJZmlsZUxvY2F0aW9uID0gZmlsZUxvY2F0aW9uLnN1YnN0cmluZygyLGZpbGVMb2NhdGlvbi5sZW5ndGgoKSk7CisJCQkJdHJ5IHsKKwkJCQkJcmJtID0gbmV3IFJCTWFuYWdlcihuZXcgRmlsZShmaWxlTG9jYXRpb24pKTsKKwkJCQkJdXBkYXRlRGlzcGxheVRyZWUoKTsKKwkJCQkJdXBkYXRlUHJvamVjdFRyZWUoKTsKKwkJCQkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfb3BlbmluZ19maWxlIiwgZXYuZ2V0QWN0aW9uQ29tbWFuZCgpKSwKKwkJCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZXJyb3Jfb3BlbmluZ19maWxlIiksCisJCQkJCQkJCQkJCQkgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCQlyYm0gPSBudWxsOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9zYXZlIikpICYmCisJCQkJCSAgICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCkgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAvLyBQb3B1cCBUcmVlIE1lbnUgLT4gU2F2ZQorCQkJCVN0cmluZyBzZWxlY3RlZEVuY29kaW5nID0gKChKTWVudUl0ZW0pZXYuZ2V0U291cmNlKCkpLmdldE5hbWUoKTsKKwkJCQlzYXZlUmVzb3VyY2VzKHNlbGVjdGVkRW5jb2RpbmcpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX2hpZGUiKSkgJiYKKwkJCQkJICAgKChKTWVudUl0ZW0pZXYuZ2V0U291cmNlKCkpLmdldE5hbWUoKSAhPSBudWxsKSB7ICAgICAgICAgICAgICAgIC8vIFBvcHVwIFRyZWUgTWVudSAtPiBIaWRlCisJCQkJU3RyaW5nIHNlbGVjdGVkRW5jb2RpbmcgPSAoKEpNZW51SXRlbSlldi5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpOworCQkJCS8vIFNob3VsZCBJIHByb21wdCBmb3IgdGhpcz8KKwkJCQloaWRlUmVzb3VyY2VzKHNlbGVjdGVkRW5jb2RpbmcpOworCQkJfSAgZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9kZWxldGUiKSkgJiYKKwkJCQkJICAgKChKTWVudUl0ZW0pZXYuZ2V0U291cmNlKCkpLmdldE5hbWUoKSAhPSBudWxsKSB7ICAgICAgICAgICAgICAgIC8vIFBvcHVwIFRyZWUgTWVudSAtPiBEZWxldGUKKwkJCQlTdHJpbmcgc2VsZWN0ZWRFbmNvZGluZyA9ICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCk7CisJCQkJaW50IHJlc3BvbnNlID0gSk9wdGlvblBhbmUuc2hvd0NvbmZpcm1EaWFsb2codGhpcywKKwkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZGVsZXRlX3dhcm5pbmciKSwKKwkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfcXVpdCIpLCBKT3B0aW9uUGFuZS5ZRVNfTk9fQ0FOQ0VMX09QVElPTiwKKwkJCQkJSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKwkJCQlpZiAocmVzcG9uc2UgPT0gSk9wdGlvblBhbmUuWUVTX09QVElPTikgeworCQkJCQlkZWxldGVSZXNvdXJjZXMoc2VsZWN0ZWRFbmNvZGluZyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX25ld19wcm9qZWN0IikpKSB7CisJCQkJU3RyaW5nIHJlc3BvbnNlID0gSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKHRoaXMsICAgICAgICAgICAgICAgICAgIC8vIFBvcHVwIFByb2plY3QgTWVudSAtPiBOZXcgUHJvamVjdAorCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19uZXdfcHJvamVjdCIpLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9uZXdfcHJvamVjdCIpLAorCQkJCQlKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFKTsKKwkJCQlpZiAocmVzcG9uc2UgPT0gbnVsbCB8fCByZXNwb25zZS50cmltKCkuZXF1YWxzKCIiKSkgcmV0dXJuOworCQkJCXByb2plY3QgPSBuZXcgUkJQcm9qZWN0KHJlc3BvbnNlKTsKKwkJCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCQkJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9vcGVuX3Byb2plY3QiKSkpIHsKKwkJCQlpbnQgcmVzdWx0ID0gcHJvamVjdEZpbGVDaG9vc2VyLnNob3dPcGVuRGlhbG9nKHRoaXMpOyAgICAgICAgICAgICAgICAvLyBQb3B1cCBQcm9qZWN0IE1lbnUgLT4gT3BlbiBQcm9qZWN0CisJCQkJaWYgKHJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKwkJCQkJRmlsZSBmID0gcHJvamVjdEZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOworCQkJCQl0cnkgeworCQkJCQkJcHJvamVjdCA9IG5ldyBSQlByb2plY3QoZik7CisJCQkJCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCQkJCQkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisJCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9jcmVhdGluZ19wcm9qZWN0IiksCisJCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfc2F2ZV9wcm9qZWN0IikpKSB7CisJCQkJaW50IHJlc3VsdCA9IHByb2plY3RGaWxlQ2hvb3Nlci5zaG93U2F2ZURpYWxvZyh0aGlzKTsgICAgICAgICAgICAgICAgLy8gUG9wdXAgUHJvamVjdCBNZW51IC0+IFNhdmUgUHJvamVjdAorCQkJCWlmIChyZXN1bHQgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7CisJCQkJCUZpbGUgZiA9IHByb2plY3RGaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXByb2plY3Qud3JpdGUoZik7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKwkJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3NhdmluZ19wcm9qZWN0IiksCisJCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfYWRkX3Byb2plY3RfYnVuZGxlIikpKSB7CisJCQkJaW50IHJlc3VsdCA9IG9wZW5GaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyh0aGlzKTsgICAgICAgICAgICAgICAgICAgLy8gUG9wdXAgUHJvamVjdCBNZW51IC0+IEFkZCBCdW5kbGUKKwkJCQlpZiAocmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworCQkJCQlGaWxlIGYgPSBvcGVuRmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisJCQkJCXRyeSB7CisJCQkJCQlwcm9qZWN0LmFkZEJ1bmRsZShmLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQkJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCQkJCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKwkJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2FkZGluZ19wcm9qZWN0X2J1bmRsZSIpLAorCQkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2Vycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX3JlbW92ZV9wcm9qZWN0X2J1bmRsZSIpKSkgeworCQkJCVN0cmluZyBidW5kbGVOYW1lID0gKChKTWVudUl0ZW0pZXYuZ2V0U291cmNlKCkpLmdldE5hbWUoKTsgICAgICAgICAgIC8vIFBvcHVwIFByb2plY3QgTWVudSAtPiBSZW1vdmUgQnVuZGxlCisJCQkJcHJvamVjdC5yZW1vdmVCdW5kbGUoYnVuZGxlTmFtZSk7CisJCQkJdXBkYXRlUHJvamVjdFRyZWUoKTsKKwkJCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfc2VsZWN0X3Byb2plY3RfYnVuZGxlIikpKSB7CisJCQkJU3RyaW5nIGJ1bmRsZU5hbWUgPSAoKEpNZW51SXRlbSlldi5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpOyAgICAgICAgICAgLy8gUG9wdXAgUHJvamVjdCBNZW51IC0+IFNlbGVjdCBCdW5kbGUKKwkJCQlSQk1hbmFnZXIgYnVuZGxlID0gcHJvamVjdC5nZXRCdW5kbGUoYnVuZGxlTmFtZSk7CisJCQkJcmJtID0gYnVuZGxlOworCQkJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCQkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3F1aXQiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBRdWl0CisJCQkJdGhpc1dpbmRvd0Nsb3NpbmcobnVsbCk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX25ldyIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IE5ldyBSZXNvdXJjZSBCdW5kbGUKKwkJCQlwcm9tcHRGb3JTYXZlKG51bGwpOworCQkJCVN0cmluZyBvbGRVc2VyID0gZ2V0VXNlcigpOworCQkJCWlmIChyYm0gIT0gbnVsbCAmJiByYm0uZ2V0VXNlcigpICE9IG51bGwgJiYgIShyYm0uZ2V0VXNlcigpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVua25vd25fdXNlciIpKSkpCisJCQkJCW9sZFVzZXIgPSByYm0uZ2V0VXNlcigpOworCQkJCVN0cmluZyByZXNwb25zZSA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyh0aGlzLAorCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19uZXdfYmFzZWNsYXNzIiksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX25ld19idW5kbGUiKSwKKwkJCQkJSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSk7CisJCQkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKwkJCQkJLy8gVGVzdCB0aGUgcmVzcG9uc2UgZm9yIHdoaXRlIHNwYWNlCisJCQkJCWlmIChyZXNwb25zZS5pbmRleE9mKCIgIikgPiAwIHx8IHJlc3BvbnNlLmluZGV4T2YoIlx0IikgPiAwIHx8IHJlc3BvbnNlLmluZGV4T2YoIlxuIikgPiAwKSB7CisJCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLAorCQkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfYmFzZWNsYXNzX3doaXRlc3BhY2UiKSArICJcbiIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2J1bmRsZV9ub3RfY3JlYXRlZCIpLAorCQkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2Vycm9yX2NyZWF0aW5nX2J1bmRsZSIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJibSA9IG5ldyBSQk1hbmFnZXIocmVzcG9uc2UpOworCQkJCQkJdXBkYXRlRGlzcGxheVRyZWUoKTsKKwkJCQkJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCQkJCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCQkJCQl1cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gVXBkYXRlIHRoZSB1c2VyIGluZm9ybWF0aW9uCisJCQkJaWYgKG9sZFVzZXIuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidW5rbm93bl91c2VyIikpKSB7CisJCQkJCVN0cmluZyB1c2VyID0gSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKHRoaXMsCisJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ191c2VyX25hbWUiKSwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfdXNlcl9uYW1lIiksCisJCQkJCQlKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFKTsKKwkJCQkJaWYgKHVzZXIgIT0gbnVsbCAmJiAhKHVzZXIuZXF1YWxzKCIiKSkpIHNldFVzZXIodXNlcik7CisJCQkJfSBlbHNlIHJibS5zZXRVc2VyKG9sZFVzZXIpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX29wZW4iKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBPcGVuIFJlc291cmNlIEJ1bmRsZQorCQkJCXByb21wdEZvclNhdmUobnVsbCk7CisJCQkJU3RyaW5nIG9sZFVzZXIgPSBnZXRVc2VyKCk7CisJCQkJaWYgKHJibSAhPSBudWxsICYmIHJibS5nZXRVc2VyKCkgIT0gbnVsbCAmJiAhKHJibS5nZXRVc2VyKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidW5rbm93bl91c2VyIikpKSkKKwkJCQkJb2xkVXNlciA9IHJibS5nZXRVc2VyKCk7CisJCQkJb3BlbkZpbGVDaG9vc2VyLnNldFNlbGVjdGVkRmlsZShuZXcgRmlsZSgiUmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgIlJCTWFuYWdlci5wcm9wZXJ0aWVzIikpOworCQkJCWludCBzdGF0dXMgPSBvcGVuRmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2codGhpcyk7CisJCQkJaWYgKHN0YXR1cyA9PSBKRmlsZUNob29zZXIuQ0FOQ0VMX09QVElPTikgeworCQkJCQkvLyBGaWxlIG9wZW5pbmcgY2FuY2VsZWQKKwkJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBKRmlsZUNob29zZXIuRVJST1JfT1BUSU9OKSB7CisJCQkJCS8vIEVycm9yIGluIGZpbGUgb3BlbgorCQkJCX0gZWxzZSB7CisJCQkJCS8vIEEgZmlsZSBoYXMgYmVlbiBzZWxlY3RlZAorCQkJCQl0cnkgeworCQkJCQkJcmJtID0gbmV3IFJCTWFuYWdlcihvcGVuRmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkpOworCQkJCQkJdXBkYXRlRGlzcGxheVRyZWUoKTsKKwkJCQkJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCQkJCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCQkJLy8gU2hvdWxkIHByb3ZpZGUgc29tZSBhbGVydCBoZXJlCisJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBvcGVuIHRoZSBmaWxlICIgKyBvcGVuRmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKworCQkJCQkJCQkJCSAgICI6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKKwkJCQkJCXJibSA9IG51bGw7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHJibSA9PSBudWxsKSByZXR1cm47CisJCQkJLy8gVXBkYXRlIHRoZSB1c2VyIGluZm9ybWF0aW9uCisJCQkJaWYgKG9sZFVzZXIuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidW5rbm93bl91c2VyIikpKSB7CisJCQkJCVN0cmluZyB1c2VyID0gSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKHRoaXMsCisJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ191c2VyX25hbWUiKSwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfdXNlcl9uYW1lIiksCisJCQkJCQlKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFKTsKKwkJCQkJaWYgKHVzZXIgIT0gbnVsbCAmJiAhKHVzZXIuZXF1YWxzKCIiKSkpCisJCQkJCQlzZXRVc2VyKHVzZXIpOworCQkJCX0gZWxzZQorCQkJCQlyYm0uc2V0VXNlcihvbGRVc2VyKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9zYXZlIikpKSB7CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IEZpbGUgLT4gU2F2ZSBSZXNvdXJjZSBCdW5kbGUKKwkJCQlzYXZlUmVzb3VyY2VzKCk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfc2F2ZWFzIikpKSB7CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IEZpbGUgLT4gU2F2ZSBSZXNvdXJjZSBCdW5kbGUgQXMKKwkJCQlzYXZlUmVzb3VyY2VzQXMoKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllcyIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IEltcG9ydCAtPiBQcm9wZXJ0aWVzCisJCQkJaWYgKHJibSA9PSBudWxsIHx8IHJibS5nZXRCdW5kbGVzKCkgPT0gbnVsbCkgcmV0dXJuOworCQkJCVJCUHJvcGVydGllc0ltcG9ydGVyIGltcG9ydGVyID0gbmV3IFJCUHJvcGVydGllc0ltcG9ydGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Byb3BlcnRpZXNfdGl0bGUiKSwgcmJtLCB0aGlzKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfamF2YSIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IEltcG9ydCAtPiBKYXZhCisJCQkJaWYgKHJibSA9PSBudWxsIHx8IHJibS5nZXRCdW5kbGVzKCkgPT0gbnVsbCkgcmV0dXJuOworCQkJCVJCSmF2YUltcG9ydGVyIGltcG9ydGVyID0gbmV3IFJCSmF2YUltcG9ydGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2phdmFfdGl0bGUiKSwgcmJtLCB0aGlzKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfVE1YIikpKSB7CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IEZpbGUgLT4gSW1wb3J0IC0+IFRNWAorCQkJCWlmIChyYm0gPT0gbnVsbCB8fCByYm0uZ2V0QnVuZGxlcygpID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlSQlRNWEltcG9ydGVyIGltcG9ydGVyID0gbmV3IFJCVE1YSW1wb3J0ZXIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfVE1YX3RpdGxlIiksIHJibSwgdGhpcyk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1hMRiIpKSkgeworCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBJbXBvcnQgLT4gWExJRkYKKwkJCQlpZiAocmJtID09IG51bGwgfHwgcmJtLmdldEJ1bmRsZXMoKSA9PSBudWxsKQorCQkJCSAgICByZXR1cm47CisJCQkJUkJ4bGlmZkltcG9ydGVyIGltcG9ydGVyID0gbmV3IFJCeGxpZmZJbXBvcnRlcihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9YTEZfdGl0bGUiKSwgcmJtLCB0aGlzKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfcHJvcGVydGllcyIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IEV4cG9ydCAtPiBQcm9wZXJ0aWVzCisJCQkJUkJQcm9wZXJ0aWVzRXhwb3J0ZXIgZXhwID0gbmV3IFJCUHJvcGVydGllc0V4cG9ydGVyKCk7CisJCQkJdHJ5IHsKKwkJCQkJaWYgKHJibSAhPSBudWxsICYmIHJibS5nZXRCdW5kbGVzKCkgIT0gbnVsbCkKKwkJCQkJCWV4cC5leHBvcnQocmJtKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9leHBvcnQiKSwKKwkJCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X2phdmEiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBFeHBvcnQgLT4gSmF2YQorCQkJCVJCSmF2YUV4cG9ydGVyIGV4cCA9IG5ldyBSQkphdmFFeHBvcnRlcigpOworCQkJCXRyeSB7CisJCQkJCWlmIChyYm0gIT0gbnVsbCAmJiByYm0uZ2V0QnVuZGxlcygpICE9IG51bGwpIGV4cC5leHBvcnQocmJtKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9leHBvcnQiKSwKKwkJCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X0lDVSIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IEV4cG9ydCAtPiBKYXZhCisJCQkJUkJJQ1VFeHBvcnRlciBleHAgPSBuZXcgUkJJQ1VFeHBvcnRlcigpOworCQkJCXRyeSB7CisJCQkJCWlmIChyYm0gIT0gbnVsbCAmJiByYm0uZ2V0QnVuZGxlcygpICE9IG51bGwpIGV4cC5leHBvcnQocmJtKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9leHBvcnQiKSwKKwkJCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X1RNWCIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IEV4cG9ydCAtPiBUTVgKKwkJCQlSQlRNWEV4cG9ydGVyIGV4cCA9IG5ldyBSQlRNWEV4cG9ydGVyKCk7CisJCQkJdHJ5IHsKKwkJCQkJaWYgKHJibSAhPSBudWxsICYmIHJibS5nZXRCdW5kbGVzKCkgIT0gbnVsbCkgZXhwLmV4cG9ydChyYm0pOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2V4cG9ydCIpLAorCQkJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfWExGIikpKSB7CisJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IEV4cG9ydCAtPiBYTElGRgorCQkJCVJCeGxpZmZFeHBvcnRlciBleHAgPSBuZXcgUkJ4bGlmZkV4cG9ydGVyKCk7CisJCQkJdHJ5IHsKKwkJCQkJaWYgKHJibSAhPSBudWxsICYmIHJibS5nZXRCdW5kbGVzKCkgIT0gbnVsbCkKKwkJCQkJICAgIGV4cC5leHBvcnQocmJtKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9leHBvcnQiKSwKKwkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZmlsZSIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBPcHRpb25zIC0+IEFkZCBOZXcgUmVzb3VyY2UKKwkJCQljcmVhdGVSZXNvdXJjZUZpbGUoKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRncm91cCIpKSB8fAorCQkJCQkgICBldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NyZWF0ZV9ncm91cCIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBPcHRpb25zIC0+IEFkZCBOZXcgR3JvdXAKKwkJCQljcmVhdGVCdW5kbGVHcm91cCgpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGVudHJ5IikpKSB7CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IE9wdGlvbnMgLT4gQWRkIE5ldyBFbnRyeQorCQkJCWNyZWF0ZUJ1bmRsZUl0ZW0oKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19wcmVmZXJlbmNlcyIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBPcHRpb25zIC0+IFByZWZlcmVuY2VzCisJCQkJUHJlZmVyZW5jZXNEaWFsb2cgcGQgPSBuZXcgUHJlZmVyZW5jZXNEaWFsb2codGhpcyk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2hlbHBfYWJvdXQiKSkpIHsgCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IEhlbHAgLT4gQWJvdXQgUkJNYW5hZ2VyCisJCQkJQWJvdXREaWFsb2cuc2hvd0RpYWxvZyh0aGlzKTsKKwkJCX0gZWxzZSBSQk1hbmFnZXJHVUkuZGVidWdNc2coIk1pc3NlZCBBY3Rpb24gQ29tbWFuZDogIiArIGV2LmdldEFjdGlvbkNvbW1hbmQoKSk7CisJCQkKKwkJfQorCQkKKwl9CisJCisJLyoqCisJICogSGFuZGxlcyBldmVudHMgZ2VuZXJhdGVkCisJICovCisJCisJcHVibGljIHZvaWQgbW91c2VQb3B1cChNb3VzZUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRTb3VyY2UoKSA9PSBqVHJlZURpc3BsYXkpIHsKKwkJCWludCBzZWxSb3cgPSBqVHJlZURpc3BsYXkuZ2V0Um93Rm9yTG9jYXRpb24oZXYuZ2V0WCgpLCBldi5nZXRZKCkpOworCQkJVHJlZVBhdGggc2VsUGF0aCA9IGpUcmVlRGlzcGxheS5nZXRQYXRoRm9yTG9jYXRpb24oZXYuZ2V0WCgpLCBldi5nZXRZKCkpOworCQkJaWYgKHNlbFJvdyAhPSAtMSkgeworCQkJICAgIGlmIChldi5nZXRDbGlja0NvdW50KCkgPT0gMSkgeworCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlzZWxQYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCk7CisJCQkJCU9iamVjdCBvYmogPSBub2RlLmdldFVzZXJPYmplY3QoKTsKKwkJCQkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgQnVuZGxlKSkgcmV0dXJuOworCQkJCQlCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlvYmo7CisJCQkJCVN0cmluZyBlbmNvZGluZyA9IGJ1bmRsZS5lbmNvZGluZzsKKwkJCQkJaWYgKGVuY29kaW5nID09IG51bGwpIGVuY29kaW5nID0gbmV3IFN0cmluZygpOworCQkJCQkJCQorCQkJCQkvLyBDcmVhdGUgdGhlIG1lbnUgdG8gZGlzcGxheQorCQkJCQlKUG9wdXBNZW51IHBvcHVwTWVudSA9IG5ldyBKUG9wdXBNZW51KCk7CisJCQkJCUpNZW51SXRlbSBzYXZlSXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfc2F2ZSIpKTsKKwkJCQkJSk1lbnVJdGVtIGhpZGVJdGVtID0gbmV3IEpNZW51SXRlbShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9oaWRlIikpOworCQkJCQlKTWVudUl0ZW0gZGVsZXRlSXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfZGVsZXRlIikpOworCQkJCQkJCQorCQkJCQlzYXZlSXRlbS5zZXROYW1lKGVuY29kaW5nKTsgc2F2ZUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCWhpZGVJdGVtLnNldE5hbWUoZW5jb2RpbmcpOyBoaWRlSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJZGVsZXRlSXRlbS5zZXROYW1lKGVuY29kaW5nKTsgZGVsZXRlSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJCQkKKwkJCQkJcG9wdXBNZW51LmFkZChzYXZlSXRlbSk7CisJCQkJCWlmIChub2RlLmdldExldmVsKCkgIT0gMSkgeworCQkJCQkJcG9wdXBNZW51LmFkZChoaWRlSXRlbSk7CisJCQkJCQlwb3B1cE1lbnUuYWRkKGRlbGV0ZUl0ZW0pOworCQkJCQl9CisJCQkJCQkJCisJCQkJCXBvcHVwTWVudS5zaG93KGV2LmdldENvbXBvbmVudCgpLCBldi5nZXRYKCksIGV2LmdldFkoKSk7CisJCQkgICAgfQorCQkJfQorCQl9IGVsc2UgaWYgKGV2LmdldFNvdXJjZSgpID09IHByb2plY3RUcmVlKSB7CisJCQlpbnQgc2VsUm93ID0gcHJvamVjdFRyZWUuZ2V0Um93Rm9yTG9jYXRpb24oZXYuZ2V0WCgpLCBldi5nZXRZKCkpOworCQkJVHJlZVBhdGggc2VsUGF0aCA9IHByb2plY3RUcmVlLmdldFBhdGhGb3JMb2NhdGlvbihldi5nZXRYKCksIGV2LmdldFkoKSk7CisJCQlpZiAoc2VsUm93ICE9IC0xICYmIGV2LmdldENsaWNrQ291bnQoKSA9PSAxKSB7CisJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpc2VsUGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOworCQkJCU9iamVjdCBvYmogPSBub2RlLmdldFVzZXJPYmplY3QoKTsKKwkJCQlpZiAob2JqID09IG51bGwpIHJldHVybjsKKwkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQkJSlBvcHVwTWVudSBwb3B1cE1lbnUgPSBuZXcgSlBvcHVwTWVudSgpOworCQkJCQlKTWVudUl0ZW0gbmV3SXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfbmV3X3Byb2plY3QiKSk7CisJCQkJCUpNZW51SXRlbSBvcGVuSXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfb3Blbl9wcm9qZWN0IikpOworCQkJCQlKTWVudUl0ZW0gc2F2ZUl0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX3NhdmVfcHJvamVjdCIpKTsKKwkJCQkJbmV3SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJb3Blbkl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCXNhdmVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQlwb3B1cE1lbnUuYWRkKG5ld0l0ZW0pOworCQkJCQlwb3B1cE1lbnUuYWRkKG9wZW5JdGVtKTsKKwkJCQkJcG9wdXBNZW51LmFkZChzYXZlSXRlbSk7CisJCQkJCXBvcHVwTWVudS5zaG93KGV2LmdldENvbXBvbmVudCgpLCBldi5nZXRYKCksIGV2LmdldFkoKSk7CisJCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSQlByb2plY3QpIHsKKwkJCQkJSlBvcHVwTWVudSBwb3B1cE1lbnUgPSBuZXcgSlBvcHVwTWVudSgpOworCQkJCQlKTWVudUl0ZW0gbmV3SXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfbmV3X3Byb2plY3QiKSk7CisJCQkJCUpNZW51SXRlbSBvcGVuSXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfb3Blbl9wcm9qZWN0IikpOworCQkJCQlKTWVudUl0ZW0gc2F2ZUl0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX3NhdmVfcHJvamVjdCIpKTsKKwkJCQkJSk1lbnVJdGVtIGFkZEl0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX2FkZF9wcm9qZWN0X2J1bmRsZSIpKTsKKwkJCQkJbmV3SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJb3Blbkl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCXNhdmVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQlhZGRJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQlwb3B1cE1lbnUuYWRkKG5ld0l0ZW0pOworCQkJCQlwb3B1cE1lbnUuYWRkKG9wZW5JdGVtKTsKKwkJCQkJcG9wdXBNZW51LmFkZChzYXZlSXRlbSk7CisJCQkJCXBvcHVwTWVudS5hZGQoYWRkSXRlbSk7CisJCQkJCXBvcHVwTWVudS5zaG93KGV2LmdldENvbXBvbmVudCgpLCBldi5nZXRYKCksIGV2LmdldFkoKSk7CisJCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSQk1hbmFnZXIpIHsKKwkJCQkJUkJNYW5hZ2VyIHJibSA9IChSQk1hbmFnZXIpb2JqOworCQkJCQlKUG9wdXBNZW51IHBvcHVwTWVudSA9IG5ldyBKUG9wdXBNZW51KCk7CisJCQkJCUpNZW51SXRlbSBzZWxlY3RJdGVtID0gbmV3IEpNZW51SXRlbShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9zZWxlY3RfcHJvamVjdF9idW5kbGUiKSk7CisJCQkJCUpNZW51SXRlbSByZW1vdmVJdGVtID0gbmV3IEpNZW51SXRlbShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9yZW1vdmVfcHJvamVjdF9idW5kbGUiKSk7CisJCQkJCXNlbGVjdEl0ZW0uc2V0TmFtZShyYm0uZ2V0QmFzZUNsYXNzKCkpOworCQkJCQlyZW1vdmVJdGVtLnNldE5hbWUocmJtLmdldEJhc2VDbGFzcygpKTsKKwkJCQkJc2VsZWN0SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJcmVtb3ZlSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJcG9wdXBNZW51LmFkZChzZWxlY3RJdGVtKTsKKwkJCQkJcG9wdXBNZW51LmFkZChyZW1vdmVJdGVtKTsKKwkJCQkJcG9wdXBNZW51LnNob3coZXYuZ2V0Q29tcG9uZW50KCksIGV2LmdldFgoKSwgZXYuZ2V0WSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZXYpICB7CisJCWlmIChldi5pc1BvcHVwVHJpZ2dlcigpKSB7CisJCQltb3VzZVBvcHVwKGV2KTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKE1vdXNlRXZlbnQgZXYpIHsKKwkJaWYgKGV2LmlzUG9wdXBUcmlnZ2VyKCkpIHsKKwkJCW1vdXNlUG9wdXAoZXYpOworCQkJcmV0dXJuOworCQl9CisJCS8vIE5vdCB0aGUgcG9wdXAgdHJpZ2dlcgorCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3VzZUVudGVyZWQoTW91c2VFdmVudCBldikgIHsgfQorCQorCXB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZXYpICAgeyB9CisJCisJcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgZXYpIHsKKwkJaWYgKGV2LmdldENsaWNrQ291bnQoKSA9PSAyICYmIGV2LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSlRhYmxlKSB7CisJCQkvLyBXZSBhcmUgZ29pbmcgdG8gZGlzcGxheSB0aGUgZWRpdCBmcmFtZSBmb3IgdGhlIGl0ZW0gc2VsZWN0ZWQKKwkJCUJ1bmRsZUl0ZW0gaXRlbSA9IG51bGw7CisJCQlKVGFibGUgdGFibGUgPSAoSlRhYmxlKSBldi5nZXRTb3VyY2UoKTsKKwkJCWlmICh0YWJsZS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsKSB7CisJCQkJaW50IHJvdyA9IHRhYmxlLmdldFNlbGVjdGVkUm93KCk7CisJCQkJVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsIG1vZGVsID0gKFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCl0YWJsZS5nZXRNb2RlbCgpOworCQkJCWl0ZW0gPSBtb2RlbC5nZXRCdW5kbGVJdGVtKHJvdyk7CisJCQkJQnVuZGxlSXRlbURpYWxvZyBiaURpYWxvZyA9IG5ldyBCdW5kbGVJdGVtRGlhbG9nKHJibSwgaXRlbSwgKHJibSA9PSBudWxsID8gIiIgOiByYm0uZ2V0VXNlcigpKSwKKwkJCQkJCQkJCQkJCQkJCSB0aGlzLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9lZGl0X2l0ZW0iKSwgdHJ1ZSk7CisJCQkJbW9kZWwudXBkYXRlKCk7CisJCQl9IGVsc2UgaWYgKHRhYmxlLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBTZWFyY2hJdGVtc1RhYmxlTW9kZWwpIHsKKwkJCQlpbnQgcm93ID0gdGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJCQlTZWFyY2hJdGVtc1RhYmxlTW9kZWwgbW9kZWwgPSAoU2VhcmNoSXRlbXNUYWJsZU1vZGVsKXRhYmxlLmdldE1vZGVsKCk7CisJCQkJaXRlbSA9IG1vZGVsLmdldEJ1bmRsZUl0ZW0ocm93KTsKKwkJCQlCdW5kbGVJdGVtRGlhbG9nIGJpRGlhbG9nID0gbmV3IEJ1bmRsZUl0ZW1EaWFsb2cocmJtLCBpdGVtLCAocmJtID09IG51bGwgPyAiIiA6IHJibS5nZXRVc2VyKCkpLAorCQkJCQkJCQkJCQkJCQkJIHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2VkaXRfaXRlbSIpLCB0cnVlKTsKKwkJCQltb2RlbC51cGRhdGUoKTsKKwkJCX0gZWxzZSBpZiAodGFibGUuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEdyb3VwSXRlbXNUYWJsZU1vZGVsKSB7CisJCQkJaW50IHJvdyA9IHRhYmxlLmdldFNlbGVjdGVkUm93KCk7CisJCQkJR3JvdXBJdGVtc1RhYmxlTW9kZWwgbW9kZWwgPSAoR3JvdXBJdGVtc1RhYmxlTW9kZWwpdGFibGUuZ2V0TW9kZWwoKTsKKwkJCQlpdGVtID0gbW9kZWwuZ2V0QnVuZGxlSXRlbShyb3cpOworCQkJCUJ1bmRsZUl0ZW1EaWFsb2cgYmlEaWFsb2cgPSBuZXcgQnVuZGxlSXRlbURpYWxvZyhyYm0sIGl0ZW0sIChyYm0gPT0gbnVsbCA/ICIiIDogcmJtLmdldFVzZXIoKSksCisJCQkJCQkJCQkJCQkJCQkgdGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZWRpdF9pdGVtIiksIHRydWUpOworCQkJCW1vZGVsLnVwZGF0ZSgpOworCQkJfQorCQkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3RQYW5lbHMoKSB7CisJCXByb2plY3RQYW5lbC51cGRhdGVDb21wb25lbnRzKCk7CisJfQorCQorCS8vIFVwZGF0ZSB0aGUgZGlzcGxheSBvZiB0aGUgbWFpbiBwYW5lbHMgKHN0YXRzLCB1bnRyYW5zLCBncm91cHMpLiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgbmV3IHRyZWUgc2VsZWN0aW9uCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlzcGxheVBhbmVscygpIHsKKwkJZGVidWdNc2coIlVwZGF0aW5nIERpc3BsYXkgUGFuZWxzIik7CisJCQorCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKKwkJaWYgKGFjdGl2ZU5vZGUgPT0gbnVsbCkgcmV0dXJuOworCQlPYmplY3QgbyA9IGFjdGl2ZU5vZGUuZ2V0VXNlck9iamVjdCgpOworCQlpZiAobyA9PSBudWxsKQorCQkJcmV0dXJuOworCQlpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJLy8gQSBub2RlIHRoYXQgaXMgbm90IGEgcm9vdCB3YXMgc2VsZWN0ZWQuLi4uIEkgbmVlZCB0byBkbyBzb21ldGhpbmcgaGVyZQorCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpbzsKKwkJCWlmIChyYm0gPT0gbnVsbCkgcmV0dXJuOworCQkJaWYgKHN0ci5lcXVhbHMocmJtLmdldEJhc2VDbGFzcygpKSkgeworCQkJCS8vIFRoZSBiYXNlIGNsYXNzIG5vZGUgd2FzIHNlbGVjdGVkCisJCQkJalBhbmVsU3RhdHMuc2V0TWFuYWdlcihyYm0pOworCQkJCWpQYW5lbFVudHJhbnMuc2V0TWFuYWdlcihyYm0pOworCQkJCWpQYW5lbEdyb3Vwcy5zZXRNYW5hZ2VyKHJibSk7CisJCQkJalBhbmVsU2VhcmNoLnNldE1hbmFnZXIocmJtKTsKKwkJCX0gZWxzZSB7CisJCQkJalBhbmVsU3RhdHMucmVtb3ZlRWxlbWVudHMoKTsKKwkJCQlqUGFuZWxVbnRyYW5zLnJlbW92ZUVsZW1lbnRzKCk7CisJCQkJalBhbmVsR3JvdXBzLnJlbW92ZUVsZW1lbnRzKCk7CisJCQkJalBhbmVsU2VhcmNoLnJlbW92ZUVsZW1lbnRzKCk7CisJCQl9CisJCQkvL3JldHVybjsKKwkJfQorCQllbHNlIGlmIChvIGluc3RhbmNlb2YgQnVuZGxlKSB7CisJCQlidW5kbGUgPSAoQnVuZGxlKSBhY3RpdmVOb2RlLmdldFVzZXJPYmplY3QoKTsKKwkJCWpQYW5lbFN0YXRzLnNldEJ1bmRsZShidW5kbGUpOworCQkJalBhbmVsVW50cmFucy5zZXRCdW5kbGUoYnVuZGxlKTsKKwkJCWpQYW5lbEdyb3Vwcy5zZXRCdW5kbGUoYnVuZGxlKTsKKwkJCWpQYW5lbFNlYXJjaC5zZXRCdW5kbGUoYnVuZGxlKTsKKwkJfQorCQllbHNlCisJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coby50b1N0cmluZygpKTsKKwkJCisJCWpQYW5lbFN0YXRzLnVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJalBhbmVsVW50cmFucy51cGRhdGVDb21wb25lbnRzKCk7CisJCWpQYW5lbEdyb3Vwcy51cGRhdGVDb21wb25lbnRzKCk7CisJCWpQYW5lbFNlYXJjaC51cGRhdGVDb21wb25lbnRzKCk7CisJCQorCQl2YWxpZGF0ZVRyZWUoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlUHJvamVjdFRyZWUoKSB7CisJCWRlYnVnTXNnKCJVcGRhdGluZyBQcm9qZWN0IFRyZWVzIik7CisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJvb3QgPSBudWxsOworCQkKKwkJaWYgKHByb2plY3QgIT0gbnVsbCkgeworCQkJcm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHByb2plY3QpOworCQkJZm9yIChpbnQgaT0wOyBpIDwgcHJvamVjdC5nZXRTaXplKCk7IGkrKykgeworCQkJCVJCTWFuYWdlciByYm0gPSBwcm9qZWN0LmdldEJ1bmRsZShpKTsKKwkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGJ1bmRsZU5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShyYm0pOworCQkJCXJvb3QuYWRkKGJ1bmRsZU5vZGUpOworCQkJCUJ1bmRsZSBtYWluQnVuZGxlID0gKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmZpcnN0RWxlbWVudCgpOworCQkJCVZlY3RvciBncm91cHMgPSBtYWluQnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisJCQkJZm9yIChpbnQgaj0wOyBqIDwgZ3JvdXBzLnNpemUoKTsgaisrKSB7CisJCQkJCUJ1bmRsZUdyb3VwIGdyb3VwID0gKEJ1bmRsZUdyb3VwKWdyb3Vwcy5lbGVtZW50QXQoaik7CisJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgZ3JvdXBOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoZ3JvdXApOworCQkJCQlidW5kbGVOb2RlLmFkZChncm91cE5vZGUpOworCQkJCQlWZWN0b3IgaXRlbXMgPSBncm91cC5nZXRJdGVtc0FzVmVjdG9yKCk7CisJCQkJCWZvciAoaW50IGs9MDsgayA8IGl0ZW1zLnNpemUoKTsgaysrKSB7CisJCQkJCQlCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtcy5lbGVtZW50QXQoayk7CisJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGl0ZW1Ob2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoaXRlbSk7CisJCQkJCQlncm91cE5vZGUuYWRkKGl0ZW1Ob2RlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChyYm0gIT0gbnVsbCkgeworCQkJLy8gVGhlcmUgaXMgYSByZXNvdXJjZSBidW5kbGUgb3BlbiwgYnV0IG5vIHByb2plY3QKKwkJCXJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm5vX3Byb2plY3QiKSk7CisJCQlCdW5kbGUgbWFpbkJ1bmRsZSA9IChCdW5kbGUpcmJtLmdldEJ1bmRsZXMoKS5maXJzdEVsZW1lbnQoKTsKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgYnVuZGxlTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHJibSk7Ly8ocmJtLmdldEJhc2VDbGFzcygpKTsKKwkJCXJvb3QuYWRkKGJ1bmRsZU5vZGUpOworCQkJVmVjdG9yIGdyb3VwcyA9IG1haW5CdW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGdyb3Vwcy5zaXplKCk7IGkrKykgeworCQkJCUJ1bmRsZUdyb3VwIGdyb3VwID0gKEJ1bmRsZUdyb3VwKWdyb3Vwcy5lbGVtZW50QXQoaSk7CisJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBncm91cE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShncm91cCk7CisJCQkJYnVuZGxlTm9kZS5hZGQoZ3JvdXBOb2RlKTsKKwkJCQlWZWN0b3IgaXRlbXMgPSBncm91cC5nZXRJdGVtc0FzVmVjdG9yKCk7CisJCQkJZm9yIChpbnQgaj0wOyBqIDwgaXRlbXMuc2l6ZSgpOyBqKyspIHsKKwkJCQkJQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlbXMuZWxlbWVudEF0KGopOworCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGl0ZW1Ob2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoaXRlbSk7CisJCQkJCWdyb3VwTm9kZS5hZGQoaXRlbU5vZGUpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm5vX3Byb2plY3RfYnVuZGxlIikpOworCQl9CisJCQorCQkvLyBDcmVhdGUgdGhlIHRyZWUgZnJvbSB0aGUgcm9vdHMKKwkJcHJvamVjdFRyZWUgPSBuZXcgSlRyZWUocm9vdCk7CisJCXByb2plY3RUcmVlLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7CisJCXByb2plY3RUcmVlLmFkZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJcHJvamVjdFRyZWUuc2V0Q2VsbFJlbmRlcmVyKFJCVHJlZUNlbGxSZW5kZXJlci5nZXRJbnN0YW5jZSgpKTsKKwkJcHJvamVjdFNjcm9sbFBhbmUuZ2V0Vmlld3BvcnQoKS5yZW1vdmVBbGwoKTsKKwkJcHJvamVjdFNjcm9sbFBhbmUuZ2V0Vmlld3BvcnQoKS5hZGQocHJvamVjdFRyZWUpOworCQlyZXBhaW50KCk7CisJCXZhbGlkYXRlVHJlZSgpOworCQlyZXR1cm47CisJfQorCQorCS8vIFVwZGF0ZSB0aGUgZGlzcGxheSBvZiB0aGUgdHJlZSBmaWxlIG1hcC4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSB0cmVlIGlzIGNoYW5nZWQvdXBkYXRlZAorCXB1YmxpYyB2b2lkIHVwZGF0ZURpc3BsYXlUcmVlKCkgeworCQlkZWJ1Z01zZygiVXBkYXRpbmcgRGlzcGxheSBUcmVlcyIpOworCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByb290ID0gbnVsbDsKKwkJCisJCWlmIChyYm0gPT0gbnVsbCB8fCByYm0uZ2V0QnVuZGxlcygpID09IG51bGwpIHsKKwkJCXJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm5vX3Jlc291cmNlX2J1bmRsZSIpKTsKKwkJfSBlbHNlIHsKKwkJCS8vIEZyb20gaGVyZSBvbiBvdXQsIHRoZXJlIGlzIGEgZGVmaW5lZCByZXNvdXJjZSBidW5kbGUgbWFuYWdlcgorCQkJQnVuZGxlIG1haW5CdW5kbGUgPSAoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZmlyc3RFbGVtZW50KCk7CisJCQlyb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocmJtLmdldEJhc2VDbGFzcygpKTsKKwkJCS8vIEFkZCB0aGUgYmFzZSBjbGFzcworCQkJcm9vdC5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUobWFpbkJ1bmRsZSkpOworCQkJCisJCQkvL0RlZmF1bHRNdXRhYmxlVHJlZU5vZGUgY3Vyck5vZGUgPSByb290OworCQkJZm9yIChpbnQgaSA9IDE7IGkgPCByYm0uZ2V0QnVuZGxlcygpLnNpemUoKTsgaSsrKSB7CisJCQkJQnVuZGxlIGN1cnJCdW5kbGUgPSAoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZWxlbWVudEF0KGkpOworCQkJCVN0cmluZyB2YXJpYW50ID0gY3VyckJ1bmRsZS5nZXRWYXJpYW50RW5jb2RpbmcoKTsKKwkJCQlTdHJpbmcgY291bnRyeSA9IGN1cnJCdW5kbGUuZ2V0Q291bnRyeUVuY29kaW5nKCk7CisJCQkJU3RyaW5nIGxhbmd1YWdlID0gY3VyckJ1bmRsZS5nZXRMYW5ndWFnZUVuY29kaW5nKCk7CisJCQkJLy9EZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGxhbmd1YWdlTm9kZSA9IG51bGw7CisJCQkJLy8gTG9vayBmb3IgYSBub2RlIHJlcHJlc2VudGluZyB0aGlzIGxhbmd1YWdlCisJCQkJaWYgKGxhbmd1YWdlID09IG51bGwgfHwgbGFuZ3VhZ2UuZXF1YWxzKCIiKSkgY29udGludWU7CisJCQkJYm9vbGVhbiBsYW5ndWFnZU5vZGVGb3VuZCA9IGZhbHNlOworCQkJCWZvciAoaW50IGo9MDsgaiA8IHJvb3QuZ2V0Q2hpbGRDb3VudCgpOyBqKyspIHsKKwkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBsYW5nTm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXJvb3QuZ2V0Q2hpbGRBdChqKTsKKwkJCQkJT2JqZWN0IG8gPSBsYW5nTm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQkJCWlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CisJCQkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKW87CisJCQkJCWlmIChzdHIuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV9sYW5ndWFnZV9ub2RlIiwgbGFuZ3VhZ2UpKSkgeworCQkJCQkJLy8gVGhlcmUgaXMgYSBub24tbGVhZiBub2RlIHdpdGggdGhpcyBsYW5ndWFnZQorCQkJCQkJbGFuZ3VhZ2VOb2RlRm91bmQgPSB0cnVlOworCQkJCQkJaWYgKGNvdW50cnkgPT0gbnVsbCB8fCBjb3VudHJ5LmVxdWFscygiIikpCisJCQkJCQkJIGxhbmdOb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQllbHNlIHsKKwkJCQkJCQkvLyBXZSBuZWVkIHRvIGxvb2sgYXQgY291bnRyeSwgdmFyaWFudAorCQkJCQkJCWJvb2xlYW4gY291bnRyeU5vZGVGb3VuZCA9IGZhbHNlOworCQkJCQkJCWZvciAoaW50IGs9MDsgayA8IGxhbmdOb2RlLmdldENoaWxkQ291bnQoKTsgaysrKSB7CisJCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgY291bnRyeU5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlsYW5nTm9kZS5nZXRDaGlsZEF0KGspOworCQkJCQkJCQlPYmplY3QgbzIgPSBjb3VudHJ5Tm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQkJCQkJCWlmIChvMiA9PSBudWxsIHx8ICEobzIgaW5zdGFuY2VvZiBTdHJpbmcpKSBjb250aW51ZTsKKwkJCQkJCQkJU3RyaW5nIHN0cjIgPSAoU3RyaW5nKW8yOworCQkJCQkJCQlpZiAoc3RyMi5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX2NvdW50cnlfbm9kZSIsIGNvdW50cnkpKSkgeworCQkJCQkJCQkJLy8gVGhlcmUgaXMgYSBub24tbGVhZiBub2RlIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCQkJCWNvdW50cnlOb2RlRm91bmQgPSB0cnVlOworCQkJCQkJCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCB8fCB2YXJpYW50LmVxdWFscygiIikpIHsKKwkJCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCQkvLyBXZSBuZWVkIHRvIGxvb2sgYXQgdmFyaWFudAorCQkJCQkJCQkJCWJvb2xlYW4gdmFyaWFudE5vZGVGb3VuZCA9IGZhbHNlOworCQkJCQkJCQkJCWZvciAoaW50IGw9MDsgbCA8IGNvdW50cnlOb2RlLmdldENoaWxkQ291bnQoKTsgbCsrKSB7CisJCQkJCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdmFyaWFudE5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSljb3VudHJ5Tm9kZS5nZXRDaGlsZEF0KGwpOworCQkJCQkJCQkJCQlPYmplY3QgbzMgPSB2YXJpYW50Tm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQkJCQkJCQkJCWlmIChvMyA9PSBudWxsIHx8ICEobzMgaW5zdGFuY2VvZiBTdHJpbmcpKSBjb250aW51ZTsKKwkJCQkJCQkJCQkJU3RyaW5nIHN0cjMgPSAoU3RyaW5nKW8zOworCQkJCQkJCQkJCQlpZiAoc3RyMy5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX3ZhcmlhbnRfbm9kZSIpKSkgeworCQkJCQkJCQkJCQkJdmFyaWFudE5vZGVGb3VuZCA9IHRydWU7CisJCQkJCQkJCQkJCQl2YXJpYW50Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCQkJCQl9IAorCQkJCQkJCQkJCX0gLy8gZW5kIGZvciAtIGNvdW50cnkgbm9kZSBsb29wCisJCQkJCQkJCQkJaWYgKCF2YXJpYW50Tm9kZUZvdW5kKSB7CisJCQkJCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdmFyaWFudE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfdmFyaWFudF9ub2RlIikpOworCQkJCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQodmFyaWFudE5vZGUpOworCQkJCQkJCQkJCQl2YXJpYW50Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0gLy8gZW5kIGZvciAtIGxhbmd1YWdlIG5vZGUgbG9vcAorCQkJCQkJCWlmICghY291bnRyeU5vZGVGb3VuZCkgeworCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGNvdW50cnlOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX2NvdW50cnlfbm9kZSIsIGNvdW50cnkpKTsKKwkJCQkJCQkJbGFuZ05vZGUuYWRkKGNvdW50cnlOb2RlKTsKKwkJCQkJCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCB8fCB2YXJpYW50LmVxdWFscygiIikpIHsKKwkJCQkJCQkJCWNvdW50cnlOb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkvLyBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHZhcmlhbnQJCisJCQkJCQkJCQlib29sZWFuIHZhcmlhbnROb2RlRm91bmQgPSBmYWxzZTsKKwkJCQkJCQkJCWZvciAoaW50IGw9MDsgbCA8IGNvdW50cnlOb2RlLmdldENoaWxkQ291bnQoKTsgbCsrKSB7CisJCQkJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB2YXJpYW50Tm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKWNvdW50cnlOb2RlLmdldENoaWxkQXQobCk7CisJCQkJCQkJCQkJT2JqZWN0IG8zID0gdmFyaWFudE5vZGUuZ2V0VXNlck9iamVjdCgpOworCQkJCQkJCQkJCWlmIChvMyA9PSBudWxsIHx8ICEobzMgaW5zdGFuY2VvZiBTdHJpbmcpKSBjb250aW51ZTsKKwkJCQkJCQkJCQlTdHJpbmcgc3RyMyA9IChTdHJpbmcpbzM7CisJCQkJCQkJCQkJaWYgKHN0cjMuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV92YXJpYW50X25vZGUiKSkpIHsKKwkJCQkJCQkJCQkJdmFyaWFudE5vZGVGb3VuZCA9IHRydWU7CisJCQkJCQkJCQkJCXZhcmlhbnROb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQkJCQkJfSAKKwkJCQkJCQkJCX0gLy8gZW5kIGZvciAtIGNvdW50cnkgbm9kZSBsb29wCisJCQkJCQkJCQlpZiAoIXZhcmlhbnROb2RlRm91bmQpIHsKKwkJCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHZhcmlhbnROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX3ZhcmlhbnRfbm9kZSIpKTsKKwkJCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQodmFyaWFudE5vZGUpOworCQkJCQkJCQkJCXZhcmlhbnROb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFsYW5ndWFnZU5vZGVGb3VuZCkgeworCQkJCQkvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5vZGUgZm9yIHRoaXMgY291bnRyeQorCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGxhbmdOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX2xhbmd1YWdlX25vZGUiLCBsYW5ndWFnZSkpOworCQkJCQlyb290LmFkZChsYW5nTm9kZSk7CisJCQkJCWlmIChjb3VudHJ5ID09IG51bGwgfHwgY291bnRyeS5lcXVhbHMoIiIpKSB7CisJCQkJCQlsYW5nTm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gV2UgbmVlZCB0byBsb29rIGF0IHRoZSBjb3VudHJ5LCB2YXJpYW50CisJCQkJCQlib29sZWFuIGNvdW50cnlOb2RlRm91bmQgPSBmYWxzZTsKKwkJCQkJCWZvciAoaW50IGs9MDsgayA8IGxhbmdOb2RlLmdldENoaWxkQ291bnQoKTsgaysrKSB7CisJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBjb3VudHJ5Tm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKWxhbmdOb2RlLmdldENoaWxkQXQoayk7CisJCQkJCQkJT2JqZWN0IG8yID0gY291bnRyeU5vZGUuZ2V0VXNlck9iamVjdCgpOworCQkJCQkJCWlmIChvMiA9PSBudWxsIHx8ICEobzIgaW5zdGFuY2VvZiBTdHJpbmcpKSBjb250aW51ZTsKKwkJCQkJCQlTdHJpbmcgc3RyMiA9IChTdHJpbmcpbzI7CisJCQkJCQkJaWYgKHN0cjIuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV9jb3VudHJ5X25vZGUiLCBjb3VudHJ5KSkpIHsKKwkJCQkJCQkJLy8gVGhlcmUgaXMgYSBub24tbGVhZiBub2RlIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJCQkJY291bnRyeU5vZGVGb3VuZCA9IHRydWU7CisJCQkJCQkJCWlmICh2YXJpYW50ID09IG51bGwgfHwgdmFyaWFudC5lcXVhbHMoIiIpKSB7CisJCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJLy8gV2UgbmVlZCB0byBsb29rIGF0IHZhcmlhbnQKKwkJCQkJCQkJCWJvb2xlYW4gdmFyaWFudE5vZGVGb3VuZCA9IGZhbHNlOworCQkJCQkJCQkJZm9yIChpbnQgbD0wOyBsIDwgY291bnRyeU5vZGUuZ2V0Q2hpbGRDb3VudCgpOyBsKyspIHsKKwkJCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHZhcmlhbnROb2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpY291bnRyeU5vZGUuZ2V0Q2hpbGRBdChsKTsKKwkJCQkJCQkJCQlPYmplY3QgbzMgPSB2YXJpYW50Tm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQkJCQkJCQkJaWYgKG8zID09IG51bGwgfHwgIShvMyBpbnN0YW5jZW9mIFN0cmluZykpIGNvbnRpbnVlOworCQkJCQkJCQkJCVN0cmluZyBzdHIzID0gKFN0cmluZylvMzsKKwkJCQkJCQkJCQlpZiAoc3RyMy5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX3ZhcmlhbnRfbm9kZSIpKSkgeworCQkJCQkJCQkJCQl2YXJpYW50Tm9kZUZvdW5kID0gdHJ1ZTsKKwkJCQkJCQkJCQkJdmFyaWFudE5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJCQl9IAorCQkJCQkJCQkJfSAvLyBlbmQgZm9yIC0gY291bnRyeSBub2RlIGxvb3AKKwkJCQkJCQkJCWlmICghdmFyaWFudE5vZGVGb3VuZCkgeworCQkJCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdmFyaWFudE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfdmFyaWFudF9ub2RlIikpOworCQkJCQkJCQkJCWNvdW50cnlOb2RlLmFkZCh2YXJpYW50Tm9kZSk7CisJCQkJCQkJCQkJdmFyaWFudE5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0gLy8gZW5kIGZvciAtIGxhbmd1YWdlIG5vZGUgbG9vcAorCQkJCQkJaWYgKCFjb3VudHJ5Tm9kZUZvdW5kKSB7CisJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBjb3VudHJ5Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV9jb3VudHJ5X25vZGUiLCBjb3VudHJ5KSk7CisJCQkJCQkJbGFuZ05vZGUuYWRkKGNvdW50cnlOb2RlKTsKKwkJCQkJCQlpZiAodmFyaWFudCA9PSBudWxsIHx8IHZhcmlhbnQuZXF1YWxzKCIiKSkgeworCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8vIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgdmFyaWFudAkKKwkJCQkJCQkJYm9vbGVhbiB2YXJpYW50Tm9kZUZvdW5kID0gZmFsc2U7CisJCQkJCQkJCWZvciAoaW50IGw9MDsgbCA8IGNvdW50cnlOb2RlLmdldENoaWxkQ291bnQoKTsgbCsrKSB7CisJCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHZhcmlhbnROb2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpY291bnRyeU5vZGUuZ2V0Q2hpbGRBdChsKTsKKwkJCQkJCQkJCU9iamVjdCBvMyA9IHZhcmlhbnROb2RlLmdldFVzZXJPYmplY3QoKTsKKwkJCQkJCQkJCWlmIChvMyA9PSBudWxsIHx8ICEobzMgaW5zdGFuY2VvZiBTdHJpbmcpKSBjb250aW51ZTsKKwkJCQkJCQkJCVN0cmluZyBzdHIzID0gKFN0cmluZylvMzsKKwkJCQkJCQkJCWlmIChzdHIzLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfdmFyaWFudF9ub2RlIikpKSB7CisJCQkJCQkJCQkJdmFyaWFudE5vZGVGb3VuZCA9IHRydWU7CisJCQkJCQkJCQkJdmFyaWFudE5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJCX0gCisJCQkJCQkJCX0gLy8gZW5kIGZvciAtIGNvdW50cnkgbm9kZSBsb29wCisJCQkJCQkJCWlmICghdmFyaWFudE5vZGVGb3VuZCkgeworCQkJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB2YXJpYW50Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV92YXJpYW50X25vZGUiLCB2YXJpYW50KSk7CisJCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQodmFyaWFudE5vZGUpOworCQkJCQkJCQkJdmFyaWFudE5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gQ3JlYXRlIHRoZSB0cmVlIGZyb20gdGhlIHJvb3RzCisJCWpUcmVlRGlzcGxheSA9IG5ldyBKVHJlZShyb290KTsKKwkJalRyZWVEaXNwbGF5LmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7CisJCWpUcmVlRGlzcGxheS5hZGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCWpUcmVlRGlzcGxheS5zZXRDZWxsUmVuZGVyZXIoUkJUcmVlQ2VsbFJlbmRlcmVyLmdldEluc3RhbmNlKCkpOworCQlqU2Nyb2xsUGFuZVRyZWUuZ2V0Vmlld3BvcnQoKS5yZW1vdmVBbGwoKTsKKwkJalNjcm9sbFBhbmVUcmVlLmdldFZpZXdwb3J0KCkuYWRkKGpUcmVlRGlzcGxheSk7CisJCXJlcGFpbnQoKTsKKwkJdmFsaWRhdGVUcmVlKCk7CisJCXJldHVybjsKKwl9CisJCisJLyoqCisJICogSW5oZXJpdHMgZnJvbSBKRnJhbWUuYWRkTm90aWZ5KCksIGJ1dCBhbHNvIGluc2VydHMgdGhlIG1lbnUgYmFyCisJICovCisJCisJcHVibGljIHZvaWQgYWRkTm90aWZ5KCkgCisJeworCQlzdXBlci5hZGROb3RpZnkoKTsKKwkJCisJCWlmIChtU2hvd24pCisJCQlyZXR1cm47CisJCQkKKwkJLy8gcmVzaXplIGZyYW1lIHRvIGFjY291bnQgZm9yIG1lbnViYXIKKwkJSk1lbnVCYXIgak1lbnVCYXIgPSBnZXRKTWVudUJhcigpOworCQlpZiAoak1lbnVCYXIgIT0gbnVsbCkgeworCQkJaW50IGpNZW51QmFySGVpZ2h0ID0gak1lbnVCYXIuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKKwkJCURpbWVuc2lvbiBkaW1lbnNpb24gPSBnZXRTaXplKCk7CisJCQlkaW1lbnNpb24uaGVpZ2h0ICs9IGpNZW51QmFySGVpZ2h0OworCQkJc2V0U2l6ZShkaW1lbnNpb24pOworCQl9CisKKwkJbVNob3duID0gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiBpdCBtYXkgYmUgYXBwcm9wcmlhdGUgdG8gY2hlY2sgd2l0aCB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gc2F2ZSB0aGUgZmlsZQorCSAqLworCQorCWJvb2xlYW4gcHJvbXB0Rm9yU2F2ZShTdHJpbmcgbWVzc2FnZSkgeworCQlpZiAocmJtICE9IG51bGwpIHsKKwkJCWludCByZXNwb25zZSA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKHRoaXMsCisJCQkJKG1lc3NhZ2UgPT0gbnVsbCA/IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3NhdmUiKSA6IG1lc3NhZ2UpLAorCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX3F1aXQiKSwgSk9wdGlvblBhbmUuWUVTX05PX0NBTkNFTF9PUFRJT04sCisJCQkJSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSk7CisJCQlpZiAocmVzcG9uc2UgPT0gSk9wdGlvblBhbmUuQ0FOQ0VMX09QVElPTikgcmV0dXJuIGZhbHNlOworCQkJaWYgKHJlc3BvbnNlID09IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKKwkJCQlyZXR1cm4gc2F2ZVJlc291cmNlcygpOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkZWxldGVSZXNvdXJjZXMoU3RyaW5nIGVuY29kaW5nKSB7CisJCWlmIChyYm0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCXRyeSB7CisJCQlyYm0uZXJhc2VGaWxlKGVuY29kaW5nKTsJCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9kZWxldGluZyIsIGlvZS5nZXRNZXNzYWdlKCkpLAorCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWlmIChSQk1hbmFnZXJHVUkuZGVidWcpIFN5c3RlbS5lcnIucHJpbnRsbihpb2UpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgaGlkZVJlc291cmNlcyhTdHJpbmcgZW5jb2RpbmcpIHsKKwkJcmJtLmhpZGVSZXNvdXJjZShlbmNvZGluZyk7CisJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCX0KKwkKKwkvKioKKwkgKiBTYXZlIGEgcGFydGljdWxhciByZXNvdXJjZXMgZmlsZSB3aXRoaW4gdGhlIGJ1bmRsZS4KKwkgKi8KKwkKKwlwdWJsaWMgYm9vbGVhbiBzYXZlUmVzb3VyY2VzKFN0cmluZyBlbmNvZGluZykgeworCQlpZiAocmJtID09IG51bGwpIHJldHVybiBmYWxzZTsgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorCQlyZXR1cm4gc2F2ZVJlc291cmNlcyhyYm0sIGVuY29kaW5nKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gc2F2ZVJlc291cmNlcyhSQk1hbmFnZXIgYnVuZGxlLCBTdHJpbmcgZW5jb2RpbmcpIHsKKwkJdHJ5IHsKKwkJCWJ1bmRsZS53cml0ZVRvRmlsZShlbmNvZGluZyk7CQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfc2F2aW5nIiwgaW9lLmdldE1lc3NhZ2UoKSksCisJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJaWYgKFJCTWFuYWdlckdVSS5kZWJ1ZykgU3lzdGVtLmVyci5wcmludGxuKGlvZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIENhbGxlZCB3aGVuIHRoZSByZXNvdXJjZXMgYXJlIHRvIGJlIHNhdmVkCisJICovCisJCisJcHVibGljIGJvb2xlYW4gc2F2ZVJlc291cmNlcygpIHsKKwkJaWYgKHJibSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIHNhdmVSZXNvdXJjZXMocmJtKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gc2F2ZVJlc291cmNlcyhSQk1hbmFnZXIgYnVuZGxlKSB7CisJCXRyeSB7CisJCQlidW5kbGUud3JpdGVUb0ZpbGUoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3NhdmluZyIsIGlvZS5nZXRNZXNzYWdlKCkpLAorCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWlmIChSQk1hbmFnZXJHVUkuZGVidWcpIFN5c3RlbS5lcnIucHJpbnRsbihpb2UpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgcmVzb3VyY2UgYnVuZGxlIGlzIHRvIGJlIHNhdmVkLCBidXQgZGlzcGxheXMgYSB3aW5kb3cgdG8gdGhlIHVzZXIgYWxsb3dpbmcgdGhlbQorCSAqIHRvIHNlbGVjdGUgdGhlIGZpbGUgZGVzdGluYXRpb24gb2YgdGhlIGZvbGRlciBpbiB3aGljaCB0byBzYXZlIHRoZSBidW5kbGUgYXMgd2VsbCBhcyB0aGUgYmFzZQorCSAqIGNsYXNzIG5hbWUgZm9yIHRoZSBidW5kbGUuCisJICovCisJCisJcHVibGljIGJvb2xlYW4gc2F2ZVJlc291cmNlc0FzKCkgeworCQlpZiAocmJtID09IG51bGwpIHJldHVybiB0cnVlOworCQlpbnQgcmVzdWx0ID0gc2F2ZUZpbGVDaG9vc2VyLnNob3dTYXZlRGlhbG9nKHRoaXMpOworCQlpZiAocmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworCQkJdHJ5IHsKKwkJCQlGaWxlIG5ld0ZpbGUgPSBzYXZlRmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisJCQkJU3RyaW5nIGZpbGVOYW1lID0gbmV3RmlsZS5nZXROYW1lKCk7CisJCQkJU3RyaW5nIGJhc2VOYW1lID0gZmlsZU5hbWU7CisJCQkJaWYgKGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpCisJCQkJCWJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsYmFzZU5hbWUubGVuZ3RoKCktMTEpOworCQkJCXJibS5zZXRCYXNlQ2xhc3MoYmFzZU5hbWUpOworCQkJCXJibS5zZXRGaWxlRGlyZWN0b3J5KG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKKwkJCQlyYm0ud3JpdGVUb0ZpbGUoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfc2F2aW5nIiwgaW9lLmdldE1lc3NhZ2UoKSksCisJCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQlpZiAoUkJNYW5hZ2VyR1VJLmRlYnVnKSBTeXN0ZW0uZXJyLnByaW50bG4oaW9lKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXZvaWQgdXBkYXRlTG9jYWxlKExvY2FsZSBsKSB7CisJCS8vIFVwZGF0ZSB0aGUgbWVudWJhcnMKKwkJak1lbnVCYXJNYWluLnVwZGF0ZUxvY2FsZSgpOworCQkKKwkJdXBkYXRlTG9jYWxlKGdldENvbnRlbnRQYW5lKCksIGwpOworCQl1cGRhdGVMb2NhbGUob3BlbkZpbGVDaG9vc2VyLCBsKTsKKwkJdXBkYXRlTG9jYWxlKHNhdmVGaWxlQ2hvb3NlciwgbCk7CisJCS8vIFJlZHJhdyB0aGUgcGFuZXMKKwkJdXBkYXRlRGlzcGxheVRyZWUoKTsKKwkJdXBkYXRlUHJvamVjdFRyZWUoKTsKKwkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQl1cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJCS8vIHVwZGF0ZSB0aGUgdGFiIHRpdGxlcworCQlqVGFiYmVkUGFuZU1haW4uc2V0VGl0bGVBdCgwLFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX3N0YXRpc3RpY3MiKSk7CisJCWpUYWJiZWRQYW5lTWFpbi5zZXRUaXRsZUF0KDEsUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJfdW50cmFuc2xhdGVkIikpOworCQlqVGFiYmVkUGFuZU1haW4uc2V0VGl0bGVBdCgyLFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX2dyb3VwcyIpKTsKKwkJc2V0VGl0bGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXNvdXJjZV9idW5kbGVfbWFuYWdlciIpKTsKKwl9CisJCisJc3RhdGljIHZvaWQgdXBkYXRlTG9jYWxlKENvbnRhaW5lciBjLCBMb2NhbGUgbCkgeworCQlDb21wb25lbnQgY29tcFtdID0gYy5nZXRDb21wb25lbnRzKCk7CisJCWZvciAoaW50IGk9MDsgaSA8IGNvbXAubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChjb21wW2ldIGluc3RhbmNlb2YgSkNvbXBvbmVudCkgeworCQkJCSgoSkNvbXBvbmVudCljb21wW2ldKS5zZXRMb2NhbGUobCk7CisJCQl9CisJCQlpZiAoY29tcFtpXSBpbnN0YW5jZW9mIENvbnRhaW5lcikgeworCQkJCXVwZGF0ZUxvY2FsZSgoQ29udGFpbmVyKWNvbXBbaV0sbCk7CisJCQl9CisJCX0KKwkJaWYgKGMgaW5zdGFuY2VvZiBKTWVudSkgeworCQkJY29tcCA9ICgoSk1lbnUpYykuZ2V0TWVudUNvbXBvbmVudHMoKTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGNvbXAubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoY29tcFtpXSBpbnN0YW5jZW9mIEpDb21wb25lbnQpIHsKKwkJCQkJKChKQ29tcG9uZW50KWNvbXBbaV0pLnNldExvY2FsZShsKTsKKwkJCQl9CisJCQkJaWYgKGNvbXBbaV0gaW5zdGFuY2VvZiBDb250YWluZXIpIHsKKwkJCQkJdXBkYXRlTG9jYWxlKChDb250YWluZXIpY29tcFtpXSxsKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCQkKKwl2b2lkIHVwZGF0ZVVJKCkgeworCQl1cGRhdGVVSShnZXRDb250ZW50UGFuZSgpKTsKKwkJak1lbnVCYXJNYWluLnVwZGF0ZVVJKCk7CisJCXVwZGF0ZVVJKGpNZW51QmFyTWFpbik7CisJCXVwZGF0ZVVJKG9wZW5GaWxlQ2hvb3Nlcik7CisJCXVwZGF0ZVVJKHNhdmVGaWxlQ2hvb3Nlcik7CisJfQorCQorCXN0YXRpYyB2b2lkIHVwZGF0ZVVJKENvbnRhaW5lciBjKSB7CisJCUNvbXBvbmVudCBjb21wW10gPSBjLmdldENvbXBvbmVudHMoKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgY29tcC5sZW5ndGg7IGkrKykgeworCQkJaWYgKGNvbXBbaV0gaW5zdGFuY2VvZiBKQ29tcG9uZW50KSB7CisJCQkJKChKQ29tcG9uZW50KWNvbXBbaV0pLnVwZGF0ZVVJKCk7CisJCQl9CisJCQlpZiAoY29tcFtpXSBpbnN0YW5jZW9mIENvbnRhaW5lcikgeworCQkJCXVwZGF0ZVVJKChDb250YWluZXIpY29tcFtpXSk7CisJCQl9CisJCX0KKwkJaWYgKGMgaW5zdGFuY2VvZiBKTWVudSkgeworCQkJY29tcCA9ICgoSk1lbnUpYykuZ2V0TWVudUNvbXBvbmVudHMoKTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGNvbXAubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoY29tcFtpXSBpbnN0YW5jZW9mIEpDb21wb25lbnQpIHsKKwkJCQkJKChKQ29tcG9uZW50KWNvbXBbaV0pLnVwZGF0ZVVJKCk7CisJCQkJfQorCQkJCWlmIChjb21wW2ldIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7CisJCQkJCXVwZGF0ZVVJKChDb250YWluZXIpY29tcFtpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCS8vIENsb3NlIHRoZSB3aW5kb3cgd2hlbiB0aGUgY2xvc2UgYm94IGlzIGNsaWNrZWQKKwl2b2lkIHRoaXNXaW5kb3dDbG9zaW5nKGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50IGUpCisJeworCQlpZiAocHJvbXB0Rm9yU2F2ZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19xdWl0X3NhdmUiKSkpIHsKKwkJCXNldFZpc2libGUoZmFsc2UpOworCQkJZGlzcG9zZSgpOworCQkJU3lzdGVtLmV4aXQoMCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgdXNlck5hbWUpIHsKKwkJdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOworCQlpZiAocmJtICE9IG51bGwpIHJibS5zZXRVc2VyKHVzZXJOYW1lKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRVc2VyKCkgeworCQlyZXR1cm4gdXNlck5hbWU7CisJfQorCQorCXB1YmxpYyBCdW5kbGVJdGVtIGdldFNlbGVjdGVkUHJvamVjdEJ1bmRsZUl0ZW0oKSB7CisJCVRyZWVQYXRoIHBhdGggPSBwcm9qZWN0VHJlZS5nZXRTZWxlY3Rpb25QYXRoKCk7CisJCWlmIChwYXRoID09IG51bGwpIHJldHVybiBudWxsOworCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlwYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCk7CisJCU9iamVjdCBvYmogPSBub2RlLmdldFVzZXJPYmplY3QoKTsKKwkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgQnVuZGxlSXRlbSkpIHJldHVybiBudWxsOworCQlyZXR1cm4gKEJ1bmRsZUl0ZW0pb2JqOworCX0KKwkKKwlwdWJsaWMgUkJNYW5hZ2VyIGdldFNlbGVjdGVkUHJvamVjdEJ1bmRsZSgpIHsKKwkJVHJlZVBhdGggcGF0aCA9IHByb2plY3RUcmVlLmdldFNlbGVjdGlvblBhdGgoKTsKKwkJaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCWZvciAoaW50IGk9MDsgaSA8IHBhdGguZ2V0UGF0aENvdW50KCk7IGkrKykgeworCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpcGF0aC5nZXRQYXRoQ29tcG9uZW50KGkpOworCQkJT2JqZWN0IG9iaiA9IG5vZGUuZ2V0VXNlck9iamVjdCgpOworCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFJCTWFuYWdlcikgcmV0dXJuIChSQk1hbmFnZXIpb2JqOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWdNc2coU3RyaW5nIG1zZykgeworCQlpZiAoZGVidWcpIFN5c3RlbS5vdXQucHJpbnRsbigiRGVidWcgTWVzc2FnZSBbIiArIGRlYnVnY291bnQrKyArICJdOiAiICsgbXNnKTsKKwl9Cit9CisKK2NsYXNzIFJCVHJlZUNlbGxSZW5kZXJlciBleHRlbmRzIERlZmF1bHRUcmVlQ2VsbFJlbmRlcmVyIHsKKwlwcml2YXRlIHN0YXRpYyBSQlRyZWVDZWxsUmVuZGVyZXIgY2VsbFJlbmQgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiBidW5kbGVJY29uICAgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiBsYW5ndWFnZUljb24gPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiBjb3VudHJ5SWNvbiAgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiB2YXJpYW50SWNvbiAgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiBmaWxlSWNvbiAgICAgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiBncm91cEljb24gICAgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiBpdGVtSWNvbiAgICAgPSBudWxsOworCXByaXZhdGUgc3RhdGljIEltYWdlSWNvbiBwcm9qZWN0SWNvbiAgPSBudWxsOworCQorCXByaXZhdGUgUkJUcmVlQ2VsbFJlbmRlcmVyKCkgeworCQkKKwl9CisJCisJcHVibGljIENvbXBvbmVudCBnZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUcmVlIHRyZWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBleHBhbmRlZCwKKwkJCQkJCQkJCQkJCSAgYm9vbGVhbiBsZWFmLCBpbnQgcm93LCBib29sZWFuIGhhc0ZvY3VzKSB7CisJCXN1cGVyLmdldFRyZWVDZWxsUmVuZGVyZXJDb21wb25lbnQodHJlZSwgdmFsdWUsIHNlbGVjdGVkLCBleHBhbmRlZCwgbGVhZiwgcm93LCBoYXNGb2N1cyk7CisJCQorCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSl2YWx1ZTsKKwkJaW50IGxldmVsID0gbm9kZS5nZXRMZXZlbCgpOworCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgQnVuZGxlR3JvdXApIHsKKwkJCXNldEljb24oZ3JvdXBJY29uKTsKKwkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCdW5kbGVJdGVtKSB7CisJCQlzZXRJY29uKGl0ZW1JY29uKTsKKwkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSQk1hbmFnZXIpIHsKKwkJCXNldEljb24oYnVuZGxlSWNvbik7CisJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUkJQcm9qZWN0KSB7CisJCQlzZXRJY29uKHByb2plY3RJY29uKTsKKwkJfSBlbHNlIGlmIChsZWFmKSB7CisJCQlpZiAobGV2ZWwgIT0gMCkgc2V0SWNvbihmaWxlSWNvbik7CQorCQl9IGVsc2UgewkKKwkJCWlmIChsZXZlbCA9PSAwKSB7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZylvYmopLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm5vX3Byb2plY3QiKSkpIAorCQkJCQlzZXRJY29uKHByb2plY3RJY29uKTsKKwkJCQllbHNlIHNldEljb24oYnVuZGxlSWNvbik7CisJCQl9CisJCQllbHNlIGlmIChsZXZlbCA9PSAxKSBzZXRJY29uKGxhbmd1YWdlSWNvbik7CisJCQllbHNlIGlmIChsZXZlbCA9PSAyKSBzZXRJY29uKGNvdW50cnlJY29uKTsKKwkJCWVsc2UgaWYgKGxldmVsID09IDMpIHNldEljb24odmFyaWFudEljb24pOworCQl9CisJCQorCQlyZXR1cm4gdGhpczsKKwl9CisJCisJcHVibGljIHN0YXRpYyBSQlRyZWVDZWxsUmVuZGVyZXIgZ2V0SW5zdGFuY2UoKSB7CisJCWlmIChjZWxsUmVuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIHRoaXNDbGFzcyA9IENsYXNzLmZvck5hbWUoImNvbS5pYm0ucmJtLmd1aS5SQk1hbmFnZXJHVUkiKTsKKwkJCSAgICAvLyBDcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBpY29ucworICAgICAgICAgICAgICAgIEltYWdlIHNjYWxlZEltYWdlID0gKG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvdHJlZV9pY29uX2J1bmRsZS5naWYiKSkpLmdldEltYWdlKCkuZ2V0U2NhbGVkSW5zdGFuY2UoMTYsIDE2LCBJbWFnZS5TQ0FMRV9ERUZBVUxUKTsKKwkJCSAgICBidW5kbGVJY29uICAgPSBuZXcgSW1hZ2VJY29uKHNjYWxlZEltYWdlKTsKKwkJCSAgICBsYW5ndWFnZUljb24gPSBuZXcgSW1hZ2VJY29uKHRoaXNDbGFzcy5nZXRSZXNvdXJjZSgiaW1hZ2VzL3RyZWVfaWNvbl9sYW5ndWFnZS5naWYiKSk7CisJCQkgICAgY291bnRyeUljb24gID0gbmV3IEltYWdlSWNvbih0aGlzQ2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlcy90cmVlX2ljb25fY291bnRyeS5naWYiKSk7CisJCQkgICAgdmFyaWFudEljb24gID0gbmV3IEltYWdlSWNvbih0aGlzQ2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlcy90cmVlX2ljb25fdmFyaWFudC5naWYiKSk7CisJCQkgICAgZmlsZUljb24gICAgID0gbmV3IEltYWdlSWNvbih0aGlzQ2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlcy90cmVlX2ljb25fZmlsZS5naWYiKSk7CisJCQkgICAgZ3JvdXBJY29uICAgID0gbmV3IEltYWdlSWNvbih0aGlzQ2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlcy90cmVlX2ljb25fZ3JvdXAuZ2lmIikpOworCQkJICAgIGl0ZW1JY29uICAgICA9IG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvdHJlZV9pY29uX2l0ZW0uZ2lmIikpOworCQkJICAgIHByb2plY3RJY29uICA9IG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvdHJlZV9pY29uX3Byb2plY3QuZ2lmIikpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisJCQkvLyBDcmVhdGUgdGhlIGluc3RhbmNlIG9mIHRoZSByZW5kZXJlcgorCQkJY2VsbFJlbmQgPSBuZXcgUkJUcmVlQ2VsbFJlbmRlcmVyKCk7CisJCX0KKwkJcmV0dXJuIGNlbGxSZW5kOworCX0KK30KKworLyoqCisgKiBUYWJsZSBtb2RlbCBmb3IgcmVzb3VyY2UgYnVuZGxlIHByb2plY3RzCisgKi8KK2NsYXNzIFJCUHJvamVjdCB7CisJamF2YS51dGlsLkxpc3QgYnVuZGxlTmFtZXM7CisJamF2YS51dGlsLkxpc3QgYnVuZGxlRmlsZU5hbWVzOworCWphdmEudXRpbC5MaXN0IGJ1bmRsZXM7CisJU3RyaW5nIHByb2plY3ROYW1lOworCQorCXB1YmxpYyBSQlByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7CisJCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKKwkJYnVuZGxlTmFtZXMgPSBuZXcgamF2YS51dGlsLkxpbmtlZExpc3QoKTsKKwkJYnVuZGxlRmlsZU5hbWVzID0gbmV3IGphdmEudXRpbC5MaW5rZWRMaXN0KCk7CisJCWJ1bmRsZXMgPSBuZXcgamF2YS51dGlsLkxpbmtlZExpc3QoKTsKKwl9CisJCisJcHVibGljIFJCUHJvamVjdChGaWxlIGlucHV0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdGhpcyhpbnB1dEZpbGUuZ2V0TmFtZSgpKTsKKwkJCisJCWlmIChwcm9qZWN0TmFtZS5pbmRleE9mKCIuIikgPiAwKSB7CisJCQlwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lLnN1YnN0cmluZygwLHByb2plY3ROYW1lLmxhc3RJbmRleE9mKCIuIikpOworCQl9CisJCQorCQlGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIoaW5wdXRGaWxlKTsKKwkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOworCQlTdHJpbmcgbGluZSA9IG51bGw7CisJCWludCBsaW5lY291bnQgPSAwOworCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQlpZiAobGluZWNvdW50ICUgMiA9PSAwKSB7CisJCQkJYnVuZGxlTmFtZXMuYWRkKGxpbmUudHJpbSgpKTsKKwkJCX0gZWxzZSB7CisJCQkJYnVuZGxlRmlsZU5hbWVzLmFkZChsaW5lLnRyaW0oKSk7CisJCQl9CisJCQlsaW5lY291bnQrKzsKKwkJfQorCQlmci5jbG9zZSgpOworCQl0cnkgeworCQkJZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlRmlsZU5hbWVzLnNpemUoKTsgaSsrKSB7CisJCQkJUkJNYW5hZ2VyIHJibSA9IG5ldyBSQk1hbmFnZXIobmV3IEZpbGUoKFN0cmluZylidW5kbGVGaWxlTmFtZXMuZ2V0KGkpKSk7CisJCQkJYnVuZGxlcy5hZGQocmJtKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhuZXcgSkZyYW1lKCksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfbG9hZF9wcm9qZWN0IiksCisJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCQlidW5kbGVOYW1lcy5jbGVhcigpOworCQkJYnVuZGxlRmlsZU5hbWVzLmNsZWFyKCk7CisJCX0KKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHByb2plY3ROYW1lOyB9CisJCisJcHVibGljIGludCBnZXRTaXplKCkgeyByZXR1cm4gYnVuZGxlTmFtZXMuc2l6ZSgpOyB9CisJCisJcHVibGljIFN0cmluZyBnZXRCdW5kbGVOYW1lKGludCBpbmRleCkgeworCQlyZXR1cm4gKFN0cmluZylidW5kbGVOYW1lcy5nZXQoaW5kZXgpOwkKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChTdHJpbmcpYnVuZGxlRmlsZU5hbWVzLmdldChpbmRleCk7CQorCX0KKwkKKwlwdWJsaWMgUkJNYW5hZ2VyIGdldEJ1bmRsZShpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChSQk1hbmFnZXIpYnVuZGxlcy5nZXQoaW5kZXgpOworCX0KKwkKKwlwdWJsaWMgUkJNYW5hZ2VyIGdldEJ1bmRsZShTdHJpbmcgYnVuZGxlTmFtZSkgeworCQlpbnQgaW5kZXggPSBidW5kbGVOYW1lcy5pbmRleE9mKGJ1bmRsZU5hbWUpOworCQlpZiAoaW5kZXggPj0gMCkgcmV0dXJuIGdldEJ1bmRsZShpbmRleCk7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCB3cml0ZShGaWxlIG91dHB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihvdXRwdXRGaWxlKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlTmFtZXMuc2l6ZSgpOyBpKyspIHsKKwkJCWZ3LndyaXRlKChTdHJpbmcpYnVuZGxlTmFtZXMuZ2V0KGkpKTsKKwkJCWZ3LndyaXRlKCJcbiIpOworCQkJZncud3JpdGUoKFN0cmluZylidW5kbGVGaWxlTmFtZXMuZ2V0KGkpKTsKKwkJCWlmIChpICE9IGJ1bmRsZU5hbWVzLnNpemUoKS0xKSBmdy53cml0ZSgiXG4iKTsKKwkJfQorCQlmdy5mbHVzaCgpOworCQlmdy5jbG9zZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRCdW5kbGUoU3RyaW5nIGJ1bmRsZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlSQk1hbmFnZXIgYnVuZGxlID0gbmV3IFJCTWFuYWdlcihuZXcgRmlsZShidW5kbGVGaWxlTmFtZSkpOworCQlidW5kbGVzLmFkZChidW5kbGUpOworCQlidW5kbGVOYW1lcy5hZGQoYnVuZGxlLmdldEJhc2VDbGFzcygpKTsKKwkJYnVuZGxlRmlsZU5hbWVzLmFkZChidW5kbGVGaWxlTmFtZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUJ1bmRsZShTdHJpbmcgYnVuZGxlTmFtZSkgeworCQlpbnQgaW5kZXggPSBidW5kbGVOYW1lcy5pbmRleE9mKGJ1bmRsZU5hbWUpOworCQlpZiAoaW5kZXggPj0gMCkgeworCQkJYnVuZGxlTmFtZXMucmVtb3ZlKGluZGV4KTsKKwkJCWJ1bmRsZUZpbGVOYW1lcy5yZW1vdmUoaW5kZXgpOworCQkJYnVuZGxlcy5yZW1vdmUoaW5kZXgpOworCQl9CisJfQorfQorCitjbGFzcyBSQk1hbmFnZXJNZW51QmFyIGV4dGVuZHMgSk1lbnVCYXIgeworCVJCTWFuYWdlckdVSSAgICAgICAgICAgICBsaXN0ZW5lcjsKKwkKKwlKTWVudSAgICAgICAgak1lbnVGaWxlID0gbmV3IEpNZW51KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbnUgLT4gRmlsZQorCUpNZW51SXRlbSAgICBqTWVudUZpbGVOZXdSZXNvdXJjZUJ1bmRsZSA9IG5ldyBKTWVudUl0ZW0oKTsgICAgICAgICAgICAgICAgCisJSk1lbnVJdGVtICAgIGpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcyA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudSAgICAgICAgak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUgPSBuZXcgSk1lbnUoKTsgICAgICAgICAgICAgICAgIC8vIE1lbnUgLT4gRmlsZSAtPiBJbXBvcnQKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlSW1wb3J0SmF2YSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlSW1wb3J0UHJvcGVydGllcyA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlSW1wb3J0VE1YID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudUZpbGVJbXBvcnRYTEYgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnUgICAgICAgIGpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlID0gbmV3IEpNZW51KCk7ICAgICAgICAgICAgICAgICAvLyBNZW51IC0+IEZpbGUgLT4gRXhwb3J0CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUV4cG9ydEphdmEgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUV4cG9ydElDVSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlRXhwb3J0UHJvcGVydGllcyA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlRXhwb3J0VE1YID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudUZpbGVFeHBvcnRYTEYgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUV4aXQgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnUgICAgICAgIGpNZW51RWRpdCA9IG5ldyBKTWVudSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW51IC0+IEVkaXQKKwlKTWVudUl0ZW0gICAgak1lbnVFZGl0Q3V0ID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudUVkaXRDb3B5ID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudUVkaXRQYXN0ZSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVFZGl0RGVsZXRlID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51ICAgICAgICBqTWVudU9wdGlvbnMgPSBuZXcgSk1lbnUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVudSAtPiBPcHRpb25zCisJSk1lbnVJdGVtICAgIGpNZW51T3B0aW9uc0FkZE5ld0VudHJ5ID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudU9wdGlvbnNBZGROZXdHcm91cCA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVPcHRpb25zQWRkTmV3UmVzb3VyY2VGaWxlID0gbmV3IEpNZW51SXRlbSgpOworCS8vSk1lbnVJdGVtICAgIGpNZW51T3B0aW9uc1Byb2plY3RWaWV3ZXIgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51T3B0aW9uc1ByZWZlcmVuY2VzID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51ICAgICAgICBqTWVudVZpZXcgPSBuZXcgSk1lbnUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVudSAtPiBWaWV3CisJSk1lbnVJdGVtICAgIGpNZW51Vmlld1ZpZXdTdGF0aXN0aWNzID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51ICAgICAgICBqTWVudUhlbHAgPSBuZXcgSk1lbnUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVudSAtPiBIZWxwCisJSk1lbnVJdGVtICAgIGpNZW51SGVscEFib3V0UmVzb3VyY2VCdW5kbGVNYW5hZ2VyID0gbmV3IEpNZW51SXRlbSgpOworCQorCXZvaWQgdXBkYXRlTG9jYWxlKCkgeworCQkvL0ZJTEUKKwkJak1lbnVGaWxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGUiKSk7CisJCWpNZW51RmlsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlTmV3UmVzb3VyY2VCdW5kbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9uZXciKSk7CisJCWpNZW51RmlsZU5ld1Jlc291cmNlQnVuZGxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX25ld190cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlT3BlblJlc291cmNlQnVuZGxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfb3BlbiIpKTsKKwkJak1lbnVGaWxlT3BlblJlc291cmNlQnVuZGxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX29wZW5fdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3NhdmUiKSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9zYXZlX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3NhdmVhcyIpKTsKKwkJak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlQXMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfc2F2ZWFzX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydCIpKTsKKwkJak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVJbXBvcnRKYXZhLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X2phdmEiKSk7CisJCWpNZW51RmlsZUltcG9ydEphdmEuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X2phdmFfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUltcG9ydFByb3BlcnRpZXMuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllcyIpKTsKKwkJak1lbnVGaWxlSW1wb3J0UHJvcGVydGllcy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllc190cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlSW1wb3J0VE1YLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1RNWCIpKTsKKwkJak1lbnVGaWxlSW1wb3J0VE1YLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9UTVhfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUltcG9ydFhMRi5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9YTEYiKSk7CisJCWpNZW51RmlsZUltcG9ydFhMRi5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfWExGX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydCIpKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRKYXZhLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X2phdmEiKSk7CisJCWpNZW51RmlsZUV4cG9ydEphdmEuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X2phdmFfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4cG9ydElDVS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9JQ1UiKSk7CisJCWpNZW51RmlsZUV4cG9ydElDVS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfSUNVX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRQcm9wZXJ0aWVzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXMiKSk7CisJCWpNZW51RmlsZUV4cG9ydFByb3BlcnRpZXMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXNfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4cG9ydFRNWC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9UTVgiKSk7CisJCWpNZW51RmlsZUV4cG9ydFRNWC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfVE1YX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRYTEYuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfWExGIikpOworCQlqTWVudUZpbGVFeHBvcnRYTEYuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X1hMRl90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhpdC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3F1aXQiKSk7CisJCWpNZW51RmlsZUV4aXQuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfcXVpdF90cmlnZ2VyIikpKTsKKwkJLy9FRElUCisJCWpNZW51RWRpdC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0IikpOworCQlqTWVudUVkaXQuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfdHJpZ2dlciIpKSk7CisJCWpNZW51RWRpdEN1dC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2N1dCIpKTsKKwkJak1lbnVFZGl0Q3V0LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2N1dF90cmlnZ2VyIikpKTsKKwkJak1lbnVFZGl0Q29weS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2NvcHkiKSk7CisJCWpNZW51RWRpdENvcHkuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfY29weV90cmlnZ2VyIikpKTsKKwkJak1lbnVFZGl0UGFzdGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9wYXN0ZSIpKTsKKwkJak1lbnVFZGl0UGFzdGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfcGFzdGVfdHJpZ2dlciIpKSk7CisJCWpNZW51RWRpdERlbGV0ZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2RlbGV0ZSIpKTsKKwkJak1lbnVFZGl0RGVsZXRlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2RlbGV0ZV90cmlnZ2VyIikpKTsKKwkJLy9PUFRJT05TCisJCWpNZW51T3B0aW9ucy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zIikpOworCQlqTWVudU9wdGlvbnMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfdHJpZ2dlciIpKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld0VudHJ5LnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZW50cnkiKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld0VudHJ5LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGVudHJ5X3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNBZGROZXdHcm91cC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGdyb3VwIikpOworCQlqTWVudU9wdGlvbnNBZGROZXdHcm91cC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRncm91cF90cmlnZ2VyIikpKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3UmVzb3VyY2VGaWxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZmlsZSIpKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3UmVzb3VyY2VGaWxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGZpbGVfdHJpZ2dlciIpKSk7CisJCS8vak1lbnVPcHRpb25zUHJvamVjdFZpZXdlci5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyIikpOworCQkvL2pNZW51T3B0aW9uc1Byb2plY3RWaWV3ZXIuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXJfdHJpZ2dlciIpKSk7CisJCWpNZW51T3B0aW9uc1ByZWZlcmVuY2VzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfcHJlZmVyZW5jZXMiKSk7CisJCWpNZW51T3B0aW9uc1ByZWZlcmVuY2VzLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3ByZWZlcmVuY2VzX3RyaWdnZXIiKSkpOworCQkvL1ZJRVcKKwkJak1lbnVWaWV3LnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3ZpZXciKSk7CisJCWpNZW51Vmlldy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdmlld190cmlnZ2VyIikpKTsKKwkJak1lbnVWaWV3Vmlld1N0YXRpc3RpY3Muc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdmlld19zdGF0aXN0aWNzIikpOworCQlqTWVudVZpZXdWaWV3U3RhdGlzdGljcy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdmlld19zdGF0aXN0aWNzX3RyaWdnZXIiKSkpOworCQkvL0hFTFAKKwkJak1lbnVIZWxwLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2hlbHAiKSk7CisJCWpNZW51SGVscC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc190cmlnZ2VyIikpKTsKKwkJak1lbnVIZWxwQWJvdXRSZXNvdXJjZUJ1bmRsZU1hbmFnZXIuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfaGVscF9hYm91dCIpKTsKKwkJak1lbnVIZWxwQWJvdXRSZXNvdXJjZUJ1bmRsZU1hbmFnZXIuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2hlbHBfYWJvdXRfdHJpZ2dlciIpKSk7CisJfQorCQorCXB1YmxpYyBSQk1hbmFnZXJNZW51QmFyKFJCTWFuYWdlckdVSSBndWkpIHsKKwkJc3VwZXIoKTsJCisJCQorICAgICAgICBib29sZWFuIHhtbEF2YWlsYWJsZTsKKwkJdHJ5IHsKKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyIik7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIiKTsKKyAgICAgICAgICAgIHhtbEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgeG1sQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIH0KKwkJbGlzdGVuZXIgPSBndWk7CisJCQorCQkvLyBBZGQgdGhlIG1lbnVzIHRvIHRoZSBtZW51IGJhciAKKwkJc2V0VmlzaWJsZSh0cnVlKTsKKwkJYWRkKGpNZW51RmlsZSk7CisJCS8vYWRkKGpNZW51RWRpdCk7CisJCWFkZChqTWVudU9wdGlvbnMpOworCQkvL2FkZChqTWVudVZpZXcpOworCQlhZGQoak1lbnVIZWxwKTsKKworCQkvLyBBZGQgRmlsZSBNZW51IEl0ZW1zIHRvIHRoZSBGaWxlIE1lbnUKKwkJak1lbnVGaWxlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlIikpOworCQlqTWVudUZpbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZS5hZGQoak1lbnVGaWxlTmV3UmVzb3VyY2VCdW5kbGUpOworCQlqTWVudUZpbGUuYWRkKGpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZSk7CisJCWpNZW51RmlsZS5hZGQoak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlKTsKKwkJak1lbnVGaWxlLmFkZChqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcyk7CisJCWpNZW51RmlsZS5hZGRTZXBhcmF0b3IoKTsKKwkJak1lbnVGaWxlLmFkZChqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZSk7CisJCWpNZW51RmlsZS5hZGQoak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUpOworCQlqTWVudUZpbGUuYWRkU2VwYXJhdG9yKCk7CisJCS8vIEFkZCB0aGUgcmVjZW50IGZpbGVzIHRvIHRoZSBmaWxlIG1lbnUKKwkJVmVjdG9yIHJlY2VudEZpbGVzID0gUHJlZmVyZW5jZXMuZ2V0UmVjZW50RmlsZXNQcmVmZXJlbmNlcygpOworCQlpZiAocmVjZW50RmlsZXMuc2l6ZSgpID4gMCkgeworCQkJZm9yIChpbnQgaT0wOyBpIDwgcmVjZW50RmlsZXMuc2l6ZSgpOyBpKz0yKSB7CisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXJlY2VudEZpbGVzLmVsZW1lbnRBdChpKTsKKwkJCQlTdHJpbmcgbG9jYXRpb24gPSAoU3RyaW5nKXJlY2VudEZpbGVzLmVsZW1lbnRBdChpKzEpOworCQkJCUpNZW51SXRlbSByZWNlbnRNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCQlyZWNlbnRNZW51SXRlbS5zZXRWaXNpYmxlKHRydWUpOworCQkJCXJlY2VudE1lbnVJdGVtLnNldFRleHQobmFtZSk7CisJCQkJcmVjZW50TWVudUl0ZW0uc2V0TmFtZSgiX18iICsgbG9jYXRpb24udHJpbSgpKTsKKwkJCQlyZWNlbnRNZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQkJak1lbnVGaWxlLmFkZChyZWNlbnRNZW51SXRlbSk7CisJCQl9CisJCQlqTWVudUZpbGUuYWRkU2VwYXJhdG9yKCk7CisJCX0KKwkJak1lbnVGaWxlLmFkZChqTWVudUZpbGVFeGl0KTsKKwkJCisJCS8vak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUltcG9ydEphdmEpOworCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5hZGQoak1lbnVGaWxlSW1wb3J0UHJvcGVydGllcyk7CisgICAgICAgIGpNZW51RmlsZUltcG9ydFRNWC5zZXRFbmFibGVkKHhtbEF2YWlsYWJsZSk7CisJCWpNZW51RmlsZUltcG9ydFJlc291cmNlQnVuZGxlLmFkZChqTWVudUZpbGVJbXBvcnRUTVgpOworICAgICAgICBqTWVudUZpbGVJbXBvcnRYTEYuc2V0RW5hYmxlZCh4bWxBdmFpbGFibGUpOworCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5hZGQoak1lbnVGaWxlSW1wb3J0WExGKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUV4cG9ydEphdmEpOworCQlqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZS5hZGQoak1lbnVGaWxlRXhwb3J0SUNVKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUV4cG9ydFByb3BlcnRpZXMpOworICAgICAgICBqTWVudUZpbGVFeHBvcnRUTVguc2V0RW5hYmxlZCh4bWxBdmFpbGFibGUpOworCQlqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZS5hZGQoak1lbnVGaWxlRXhwb3J0VE1YKTsKKyAgICAgICAgak1lbnVGaWxlRXhwb3J0WExGLnNldEVuYWJsZWQoeG1sQXZhaWxhYmxlKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUV4cG9ydFhMRik7CisKKwkJak1lbnVGaWxlTmV3UmVzb3VyY2VCdW5kbGUuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlTmV3UmVzb3VyY2VCdW5kbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9uZXciKSk7CisJCWpNZW51RmlsZU5ld1Jlc291cmNlQnVuZGxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX25ld190cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlTmV3UmVzb3VyY2VCdW5kbGUuc2V0QWNjZWxlcmF0b3IoS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgKKyAgICAgICAgICAgICAgICAgIEtleUV2ZW50LlZLX04sIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOworCQlqTWVudUZpbGVOZXdSZXNvdXJjZUJ1bmRsZS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVPcGVuUmVzb3VyY2VCdW5kbGUuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlT3BlblJlc291cmNlQnVuZGxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfb3BlbiIpKTsKKwkJak1lbnVGaWxlT3BlblJlc291cmNlQnVuZGxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX29wZW5fdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZS5zZXRBY2NlbGVyYXRvcihLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuVktfTywgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLKSk7CisJCWpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3NhdmUiKSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9zYXZlX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGUuc2V0QWNjZWxlcmF0b3IoS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgKKyAgICAgICAgICAgICAgICAgIEtleUV2ZW50LlZLX1MsIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGUuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZUFzLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZUFzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfc2F2ZWFzIikpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9zYXZlYXNfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZUFzLnNldEFjY2VsZXJhdG9yKEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisgICAgICAgICAgICAgICAgICBLZXlFdmVudC5WS19TLCBBY3Rpb25FdmVudC5DVFJMX01BU0sgfCBBY3Rpb25FdmVudC5TSElGVF9NQVNLKSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZUFzLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUltcG9ydFJlc291cmNlQnVuZGxlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUltcG9ydFJlc291cmNlQnVuZGxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0IikpOworCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUltcG9ydFJlc291cmNlQnVuZGxlLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUltcG9ydEphdmEuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlSW1wb3J0SmF2YS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9qYXZhIikpOworCQlqTWVudUZpbGVJbXBvcnRKYXZhLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9qYXZhX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVJbXBvcnRKYXZhLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUltcG9ydFByb3BlcnRpZXMuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlSW1wb3J0UHJvcGVydGllcy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzIikpOworCQlqTWVudUZpbGVJbXBvcnRQcm9wZXJ0aWVzLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVJbXBvcnRQcm9wZXJ0aWVzLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUltcG9ydFRNWC5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVJbXBvcnRUTVguc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfVE1YIikpOworCQlqTWVudUZpbGVJbXBvcnRUTVguc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1RNWF90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlSW1wb3J0VE1YLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUltcG9ydFhMRi5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVJbXBvcnRYTEYuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfWExGIikpOworCQlqTWVudUZpbGVJbXBvcnRYTEYuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1hMRl90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlSW1wb3J0WExGLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0IikpOworCQlqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUV4cG9ydEphdmEuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlRXhwb3J0SmF2YS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9qYXZhIikpOworCQlqTWVudUZpbGVFeHBvcnRKYXZhLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9qYXZhX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRKYXZhLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51RmlsZUV4cG9ydElDVS5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVFeHBvcnRJQ1Uuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfSUNVIikpOworCQlqTWVudUZpbGVFeHBvcnRJQ1Uuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X0lDVV90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhwb3J0SUNVLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKworCQlqTWVudUZpbGVFeHBvcnRQcm9wZXJ0aWVzLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUV4cG9ydFByb3BlcnRpZXMuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfcHJvcGVydGllcyIpKTsKKwkJak1lbnVGaWxlRXhwb3J0UHJvcGVydGllcy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfcHJvcGVydGllc190cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhwb3J0UHJvcGVydGllcy5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVFeHBvcnRUTVguc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlRXhwb3J0VE1YLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X1RNWCIpKTsKKwkJak1lbnVGaWxlRXhwb3J0VE1YLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9UTVhfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4cG9ydFRNWC5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVFeHBvcnRYTEYuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlRXhwb3J0WExGLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X1hMRiIpKTsKKwkJak1lbnVGaWxlRXhwb3J0WExGLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9YTEZfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4cG9ydFhMRi5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJak1lbnVGaWxlRXhpdC5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVFeGl0LnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfcXVpdCIpKTsKKwkJak1lbnVGaWxlRXhpdC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9xdWl0X3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeGl0LnNldEFjY2VsZXJhdG9yKEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisgICAgICAgICAgICAgICAgICBLZXlFdmVudC5WS19RLCBBY3Rpb25FdmVudC5DVFJMX01BU0spKTsKKwkJak1lbnVGaWxlRXhpdC5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJLy8gQWRkIEVkaXQgTWVudSBJdGVtcyB0byB0aGUgRWRpdCBNZW51CisJCWpNZW51RWRpdC5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUVkaXQuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdCIpKTsKKwkJak1lbnVFZGl0LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X3RyaWdnZXIiKSkpOworCQlqTWVudUVkaXQuYWRkKGpNZW51RWRpdEN1dCk7CisJCWpNZW51RWRpdC5hZGQoak1lbnVFZGl0Q29weSk7CisJCWpNZW51RWRpdC5hZGQoak1lbnVFZGl0UGFzdGUpOworCQlqTWVudUVkaXQuYWRkKGpNZW51RWRpdERlbGV0ZSk7CisKKwkJak1lbnVFZGl0Q3V0LnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RWRpdEN1dC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2N1dCIpKTsKKwkJak1lbnVFZGl0Q3V0LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2N1dF90cmlnZ2VyIikpKTsKKwkJak1lbnVFZGl0Q3V0LnNldEFjY2VsZXJhdG9yKEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisJCQkJS2V5RXZlbnQuVktfWCwgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLKSk7CisKKwkJak1lbnVFZGl0Q29weS5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUVkaXRDb3B5LnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfY29weSIpKTsKKwkJak1lbnVFZGl0Q29weS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9jb3B5X3RyaWdnZXIiKSkpOworCQlqTWVudUVkaXRDb3B5LnNldEFjY2VsZXJhdG9yKEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisJCQkJS2V5RXZlbnQuVktfQywgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLKSk7CisKKwkJak1lbnVFZGl0UGFzdGUuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVFZGl0UGFzdGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9wYXN0ZSIpKTsKKwkJak1lbnVFZGl0UGFzdGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfcGFzdGVfdHJpZ2dlciIpKSk7CisJCWpNZW51RWRpdFBhc3RlLnNldEFjY2VsZXJhdG9yKEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisJCQkJS2V5RXZlbnQuVktfViwgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLKSk7CisJCQorCQlqTWVudUVkaXREZWxldGUuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVFZGl0RGVsZXRlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfZGVsZXRlIikpOworCQlqTWVudUVkaXREZWxldGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfZGVsZXRlX3RyaWdnZXIiKSkpOworCisJCS8vIEFkZCBPcHRpb25zIE1lbnUgSXRlbXMgdG8gdGhlIE9wdGlvbnMgTWVudQorCQlqTWVudU9wdGlvbnMuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVPcHRpb25zLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnMiKSk7CisJCWpNZW51T3B0aW9ucy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc190cmlnZ2VyIikpKTsKKwkJak1lbnVPcHRpb25zLmFkZChqTWVudU9wdGlvbnNBZGROZXdFbnRyeSk7CisJCWpNZW51T3B0aW9ucy5hZGQoak1lbnVPcHRpb25zQWRkTmV3R3JvdXApOworCQlqTWVudU9wdGlvbnMuYWRkKGpNZW51T3B0aW9uc0FkZE5ld1Jlc291cmNlRmlsZSk7CisJCS8vak1lbnVPcHRpb25zLmFkZFNlcGFyYXRvcigpOworCQkvL2pNZW51T3B0aW9ucy5hZGQoak1lbnVPcHRpb25zUHJvamVjdFZpZXdlcik7CisJCWpNZW51T3B0aW9ucy5hZGRTZXBhcmF0b3IoKTsKKwkJak1lbnVPcHRpb25zLmFkZChqTWVudU9wdGlvbnNQcmVmZXJlbmNlcyk7CisKKwkJak1lbnVPcHRpb25zQWRkTmV3RW50cnkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3RW50cnkuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRlbnRyeSIpKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3RW50cnkuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZW50cnlfdHJpZ2dlciIpKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld0VudHJ5LmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCWpNZW51T3B0aW9uc0FkZE5ld0dyb3VwLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld0dyb3VwLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZ3JvdXAiKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld0dyb3VwLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGdyb3VwX3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNBZGROZXdHcm91cC5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJak1lbnVPcHRpb25zQWRkTmV3UmVzb3VyY2VGaWxlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld1Jlc291cmNlRmlsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGZpbGUiKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld1Jlc291cmNlRmlsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRmaWxlX3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNBZGROZXdSZXNvdXJjZUZpbGUuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkKKwkJLyoKKwkJak1lbnVPcHRpb25zUHJvamVjdFZpZXdlci5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudU9wdGlvbnNQcm9qZWN0Vmlld2VyLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXIiKSk7CisJCWpNZW51T3B0aW9uc1Byb2plY3RWaWV3ZXIuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXJfdHJpZ2dlciIpKSk7CisJCWpNZW51T3B0aW9uc1Byb2plY3RWaWV3ZXIuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkqLworCQkKKwkJak1lbnVPcHRpb25zUHJlZmVyZW5jZXMuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVPcHRpb25zUHJlZmVyZW5jZXMuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19wcmVmZXJlbmNlcyIpKTsKKwkJak1lbnVPcHRpb25zUHJlZmVyZW5jZXMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfcHJlZmVyZW5jZXNfdHJpZ2dlciIpKSk7CisJCWpNZW51T3B0aW9uc1ByZWZlcmVuY2VzLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKworCQkvLyBBZGQgVmlldyBNZW51IEl0ZW1zIHRvIHRoZSBWaWV3IE1lbnUKKwkJak1lbnVWaWV3LnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51Vmlldy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV92aWV3IikpOworCQlqTWVudVZpZXcuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3ZpZXdfdHJpZ2dlciIpKSk7CisJCWpNZW51Vmlldy5hZGQoak1lbnVWaWV3Vmlld1N0YXRpc3RpY3MpOworCisJCWpNZW51Vmlld1ZpZXdTdGF0aXN0aWNzLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51Vmlld1ZpZXdTdGF0aXN0aWNzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3ZpZXdfc3RhdGlzdGljcyIpKTsKKwkJak1lbnVWaWV3Vmlld1N0YXRpc3RpY3Muc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3ZpZXdfc3RhdGlzdGljc190cmlnZ2VyIikpKTsKKworCQkvLyBBZGQgSGVscCBNZW51IEl0ZW1zIHRvIHRoZSBIZWxwIE1lbnUKKwkJak1lbnVIZWxwLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51SGVscC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9oZWxwIikpOworCQlqTWVudUhlbHAuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2hlbHBfdHJpZ2dlciIpKSk7CisJCWpNZW51SGVscC5hZGQoak1lbnVIZWxwQWJvdXRSZXNvdXJjZUJ1bmRsZU1hbmFnZXIpOworCisJCWpNZW51SGVscEFib3V0UmVzb3VyY2VCdW5kbGVNYW5hZ2VyLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51SGVscEFib3V0UmVzb3VyY2VCdW5kbGVNYW5hZ2VyLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2hlbHBfYWJvdXQiKSk7CisJCWpNZW51SGVscEFib3V0UmVzb3VyY2VCdW5kbGVNYW5hZ2VyLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9oZWxwX2Fib3V0X3RyaWdnZXIiKSkpOworCQlqTWVudUhlbHBBYm91dFJlc291cmNlQnVuZGxlTWFuYWdlci5zZXRBY2NlbGVyYXRvcihLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorCQkJCUtleUV2ZW50LlZLX0gsIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOworCQlqTWVudUhlbHBBYm91dFJlc291cmNlQnVuZGxlTWFuYWdlci5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgaW50IGdldEtleUV2ZW50S2V5KFN0cmluZyBjaGFyYWN0ZXIpIHsKKwkJaWYgKGNoYXJhY3RlciA9PSBudWxsKSByZXR1cm4gS2V5RXZlbnQuVktfQTsKKwkJY2hhcmFjdGVyID0gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7CisJCisJCWlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiQSIpKSByZXR1cm4gS2V5RXZlbnQuVktfQTsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIkIiKSkgcmV0dXJuIEtleUV2ZW50LlZLX0I7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJDIikpIHJldHVybiBLZXlFdmVudC5WS19DOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiRCIpKSByZXR1cm4gS2V5RXZlbnQuVktfRDsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIkUiKSkgcmV0dXJuIEtleUV2ZW50LlZLX0U7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJGIikpIHJldHVybiBLZXlFdmVudC5WS19GOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiRyIpKSByZXR1cm4gS2V5RXZlbnQuVktfRzsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIkgiKSkgcmV0dXJuIEtleUV2ZW50LlZLX0g7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJJIikpIHJldHVybiBLZXlFdmVudC5WS19JOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiSiIpKSByZXR1cm4gS2V5RXZlbnQuVktfSjsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIksiKSkgcmV0dXJuIEtleUV2ZW50LlZLX0s7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJMIikpIHJldHVybiBLZXlFdmVudC5WS19MOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiTSIpKSByZXR1cm4gS2V5RXZlbnQuVktfTTsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIk4iKSkgcmV0dXJuIEtleUV2ZW50LlZLX047CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJPIikpIHJldHVybiBLZXlFdmVudC5WS19POworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiUCIpKSByZXR1cm4gS2V5RXZlbnQuVktfUDsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIlEiKSkgcmV0dXJuIEtleUV2ZW50LlZLX1E7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJSIikpIHJldHVybiBLZXlFdmVudC5WS19SOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiUyIpKSByZXR1cm4gS2V5RXZlbnQuVktfUzsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIlQiKSkgcmV0dXJuIEtleUV2ZW50LlZLX1Q7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJVIikpIHJldHVybiBLZXlFdmVudC5WS19VOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiViIpKSByZXR1cm4gS2V5RXZlbnQuVktfVjsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIlciKSkgcmV0dXJuIEtleUV2ZW50LlZLX1c7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJYIikpIHJldHVybiBLZXlFdmVudC5WS19YOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiWSIpKSByZXR1cm4gS2V5RXZlbnQuVktfWTsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIloiKSkgcmV0dXJuIEtleUV2ZW50LlZLX1o7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCIwIikpIHJldHVybiBLZXlFdmVudC5WS18wOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiMSIpKSByZXR1cm4gS2V5RXZlbnQuVktfMTsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIjIiKSkgcmV0dXJuIEtleUV2ZW50LlZLXzI7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCIzIikpIHJldHVybiBLZXlFdmVudC5WS18zOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiNCIpKSByZXR1cm4gS2V5RXZlbnQuVktfNDsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIjUiKSkgcmV0dXJuIEtleUV2ZW50LlZLXzU7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCI2IikpIHJldHVybiBLZXlFdmVudC5WS182OworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiNyIpKSByZXR1cm4gS2V5RXZlbnQuVktfNzsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIjgiKSkgcmV0dXJuIEtleUV2ZW50LlZLXzg7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCI5IikpIHJldHVybiBLZXlFdmVudC5WS185OworCisJCXJldHVybiBLZXlFdmVudC5WS19BOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJQcm9qZWN0SXRlbVBhbmVsLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCUHJvamVjdEl0ZW1QYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MWRmMzUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCUHJvamVjdEl0ZW1QYW5lbC5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKi8KK2NsYXNzIFJCUHJvamVjdEl0ZW1QYW5lbCBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKwlSQk1hbmFnZXJHVUkgZ3VpOworCQorCS8vIFZpc3VhbCBDb21wb25lbnRzCisJQm94IG1haW5Cb3g7CisJSlRleHRGaWVsZCBpdGVtRmllbGRzW107CisJSkxhYmVsICAgICBpdGVtTGFiZWxzW107CisJSkJ1dHRvbiAgICBjb21taXRCdXR0b25zW107CisJSkJ1dHRvbiAgICBjb21taXRCdXR0b247CisJSkxhYmVsICAgICB0aXRsZUxhYmVsOworCUpMYWJlbCAgICAga2V5TGFiZWw7CisJSkxhYmVsICAgICBjb21tZW50TGFiZWw7CisJCisJcHVibGljIFJCUHJvamVjdEl0ZW1QYW5lbChSQk1hbmFnZXJHVUkgZ3VpKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZ3VpID0gZ3VpOworCQlpbml0Q29tcG9uZW50cygpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJSkJ1dHRvbiBidXR0b24gPSAoSkJ1dHRvbilldi5nZXRTb3VyY2UoKTsKKwkJU3RyaW5nIGJ1dHRvbk5hbWUgPSBidXR0b24uZ2V0TmFtZSgpOworCQlpZiAoYnV0dG9uTmFtZSA9PSBudWxsKSB7CisJCQkvLyBTYXZlIGFsbCBjb21wb25lbnRzCisJCQlSQk1hbmFnZXIgYnVuZGxlID0gZ3VpLmdldFNlbGVjdGVkUHJvamVjdEJ1bmRsZSgpOworCQkJVmVjdG9yIGJ1bmRsZXMgPSBidW5kbGUuZ2V0QnVuZGxlcygpOworCQkJZm9yIChpbnQgaT0wOyBpIDwgaXRlbUZpZWxkcy5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBlbmNvZGluZyA9IGNvbW1pdEJ1dHRvbnNbaV0uZ2V0TmFtZSgpOworCQkJCVN0cmluZyB0cmFuc2xhdGlvbiA9IGl0ZW1GaWVsZHNbaV0uZ2V0VGV4dCgpOworCQkJCVN0cmluZyBrZXkgPSBpdGVtRmllbGRzW2ldLmdldE5hbWUoKTsKKwkJCQlmb3IgKGludCBqPTA7IGogPCBidW5kbGVzLnNpemUoKTsgaisrKSB7CisJCQkJCUJ1bmRsZSByYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChqKTsKKwkJCQkJaWYgKHJidW5kbGUuZW5jb2RpbmcuZXF1YWxzKGVuY29kaW5nKSkgeworCQkJCQkJQnVuZGxlSXRlbSBpdGVtID0gcmJ1bmRsZS5nZXRCdW5kbGVJdGVtKGtleSk7CisJCQkJCQlpZiAoaXRlbSAhPSBudWxsKSBpdGVtLnNldFRyYW5zbGF0aW9uKHRyYW5zbGF0aW9uKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZ3VpLnNhdmVSZXNvdXJjZXMoYnVuZGxlKTsKKwkJfSBlbHNlIHsKKwkJCS8vIFNhdmUgYSBwYXJ0aWN1bGFyIGVuY29kaW5nCisJCQlTdHJpbmcgZW5jb2RpbmcgPSBidXR0b25OYW1lOworCQkJUkJNYW5hZ2VyIGJ1bmRsZSA9IGd1aS5nZXRTZWxlY3RlZFByb2plY3RCdW5kbGUoKTsKKwkJCWludCBpbmRleCA9IC0xOworCQkJZm9yIChpbnQgaT0wOyBpIDwgY29tbWl0QnV0dG9ucy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChjb21taXRCdXR0b25zW2ldID09IGJ1dHRvbikgeworCQkJCQlpbmRleCA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCVN0cmluZyB0cmFuc2xhdGlvbiA9IGl0ZW1GaWVsZHNbaW5kZXhdLmdldFRleHQoKTsKKwkJCVN0cmluZyBrZXkgPSBpdGVtRmllbGRzW2luZGV4XS5nZXROYW1lKCk7CisJCQlWZWN0b3IgYnVuZGxlcyA9IGJ1bmRsZS5nZXRCdW5kbGVzKCk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisJCQkJQnVuZGxlIHJidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworCQkJCWlmIChyYnVuZGxlLmVuY29kaW5nLmVxdWFscyhlbmNvZGluZykpIHsKKwkJCQkJQnVuZGxlSXRlbSBpdGVtID0gcmJ1bmRsZS5nZXRCdW5kbGVJdGVtKGtleSk7CisJCQkJCWlmIChpdGVtICE9IG51bGwpIHsKKwkJCQkJCWl0ZW0uc2V0VHJhbnNsYXRpb24odHJhbnNsYXRpb24pOworCQkJCQkJUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKCJTZXQgdHJhbnNsYXRpb24gdG8gOiAiICsgdHJhbnNsYXRpb24pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJICAgIFJCTWFuYWdlckdVSS5kZWJ1Z01zZygiSXRlbSB3YXMgbnVsbCIpOworCQkJCQlicmVhazsKKwkJCQl9IAorCQkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiQ29tcGFyZWQgIiArIHJidW5kbGUuZW5jb2RpbmcgKyAiIHdpdGggIiArIGVuY29kaW5nKTsKKwkJCX0KKwkJCWd1aS5zYXZlUmVzb3VyY2VzKGJ1bmRsZSwgZW5jb2RpbmcpOworCQl9CisJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkgeworCQlzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJSlBhbmVsIHRvcFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgyLDEpKTsKKwkJdGl0bGVMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2RlZmF1bHRfdGl0bGUiKSwgU3dpbmdDb25zdGFudHMuQ0VOVEVSKTsKKwkJdGl0bGVMYWJlbC5zZXRGb250KG5ldyBGb250KCJzZXJpZiIsRm9udC5CT0xELDE4KSk7CisJCUpQYW5lbCBjb21tZW50UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDIsMSkpOworCQlKTGFiZWwgY29tbWVudExhYmVsMiA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2NvbW1lbnQiKSwgU3dpbmdDb25zdGFudHMuTEVGVCk7CisJCWNvbW1lbnRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2NvbW1lbnRfbm9uZSIpLCBTd2luZ0NvbnN0YW50cy5MRUZUKTsKKwkJY29tbWVudFBhbmVsLmFkZChjb21tZW50TGFiZWwyKTsKKwkJY29tbWVudFBhbmVsLmFkZChjb21tZW50TGFiZWwpOworCQl0b3BQYW5lbC5hZGQodGl0bGVMYWJlbCk7CisJCXRvcFBhbmVsLmFkZChjb21tZW50UGFuZWwpOworCQlKUGFuZWwgY2VudGVyUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCW1haW5Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQlKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKG1haW5Cb3gsCisJCQkJCQkJCQkJCQlTY3JvbGxQYW5lQ29uc3RhbnRzLlZFUlRJQ0FMX1NDUk9MTEJBUl9BU19ORUVERUQsCisJCQkJCQkJCQkJCQlTY3JvbGxQYW5lQ29uc3RhbnRzLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisJCWNlbnRlclBhbmVsLmFkZChzY3JvbGxQYW5lLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworCQljZW50ZXJQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSk7CisJCUpQYW5lbCBib3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5SSUdIVCkpOworCQljb21taXRCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInByb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbl9hbGwiKSk7CisJCWNvbW1pdEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJYm90UGFuZWwuYWRkKGNvbW1pdEJ1dHRvbik7CisJCWFkZCh0b3BQYW5lbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJYWRkKGNlbnRlclBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJYWRkKGJvdFBhbmVsLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQkKKwkJdXBkYXRlQ29tcG9uZW50cygpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGVDb21wb25lbnRzKCkgeworCQlCdW5kbGVJdGVtIGl0ZW0gPSBndWkuZ2V0U2VsZWN0ZWRQcm9qZWN0QnVuZGxlSXRlbSgpOworCQkKKwkJaWYgKGl0ZW0gPT0gbnVsbCkgeworCQkJY29tbWVudExhYmVsLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2NvbW1lbnRfbm9uZSIpKTsKKwkJCXRpdGxlTGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInByb2plY3RfcGFuZWxfZGVmYXVsdF90aXRsZSIpKTsKKwkJCWl0ZW1GaWVsZHMgPSBudWxsOworCQkJaXRlbUxhYmVscyA9IG51bGw7CisJCQljb21taXRCdXR0b25zID0gbnVsbDsKKwkJCWNvbW1pdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBjb21tZW50ID0gaXRlbS5nZXRDb21tZW50KCk7CisJCQlTdHJpbmcga2V5ID0gaXRlbS5nZXRLZXkoKTsKKwkJCWNvbW1lbnRMYWJlbC5zZXRUZXh0KGNvbW1lbnQpOworCQkJdGl0bGVMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF90aXRsZSIsIGtleSkpOworCQkJCisJCQlSQk1hbmFnZXIgbWFuYWdlciA9IGd1aS5nZXRTZWxlY3RlZFByb2plY3RCdW5kbGUoKTsKKwkJCVZlY3RvciBidW5kbGVzID0gbWFuYWdlci5nZXRCdW5kbGVzKCk7CisJCQlpdGVtRmllbGRzID0gbmV3IEpUZXh0RmllbGRbYnVuZGxlcy5zaXplKCldOworCQkJaXRlbUxhYmVscyA9IG5ldyBKTGFiZWxbYnVuZGxlcy5zaXplKCldOworCQkJY29tbWl0QnV0dG9ucyA9IG5ldyBKQnV0dG9uW2J1bmRsZXMuc2l6ZSgpXTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQlCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKwkJCQlCdW5kbGVJdGVtIGJ1bmRsZUl0ZW0gPSBidW5kbGUuZ2V0QnVuZGxlSXRlbShrZXkpOworCQkJCS8vYm9vbGVhbiB0cmFuc2xhdGVkID0gYnVuZGxlSXRlbS5pc1RyYW5zbGF0ZWQoKTsKKwkJCQlKTGFiZWwgZW5jb2RpbmdMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2J1bmRsZSIsIGJ1bmRsZS50b1N0cmluZygpKSwKKwkJCQkJCQkJCQkJCSAgU3dpbmdDb25zdGFudHMuTEVGVCk7CisJCQkJaWYgKGJ1bmRsZUl0ZW0gPT0gbnVsbCB8fCAhYnVuZGxlSXRlbS5pc1RyYW5zbGF0ZWQoKSkgeworCQkJCSAgICBlbmNvZGluZ0xhYmVsLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2J1bmRsZV91bnRyYW5zbGF0ZWQiLAorCQkJCQkJCQkJCQkJCQkJCQlidW5kbGUudG9TdHJpbmcoKSkpOworCQkJCX0KKwkJCQlTdHJpbmcgZmllbGRUZXh0ID0gKGJ1bmRsZUl0ZW0gPT0gbnVsbCA/IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9pdGVtX2luaGVyaXRzIikgOgorCQkJCQkJCQkJCQkJCQkgYnVuZGxlSXRlbS5nZXRUcmFuc2xhdGlvbigpKTsKKwkJCQlKVGV4dEZpZWxkIGl0ZW1GaWVsZCA9IG5ldyBKVGV4dEZpZWxkKGZpZWxkVGV4dCk7CisJCQkJaXRlbUZpZWxkLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24odGhpcy5nZXRTaXplKCkud2lkdGgtMTUwLCAyMDApKTsKKwkJCQlpdGVtRmllbGQuc2V0TmFtZShrZXkpOworCQkJCUpCdXR0b24gY29tbWl0SXRlbUJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uIikpOworCQkJCWNvbW1pdEl0ZW1CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJY29tbWl0SXRlbUJ1dHRvbi5zZXROYW1lKGJ1bmRsZS5lbmNvZGluZyk7CisJCQkJaXRlbUZpZWxkc1tpXSA9IGl0ZW1GaWVsZDsKKwkJCQlpdGVtTGFiZWxzW2ldID0gZW5jb2RpbmdMYWJlbDsKKwkJCQljb21taXRCdXR0b25zW2ldID0gY29tbWl0SXRlbUJ1dHRvbjsKKwkJCX0KKwkJCWNvbW1pdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQl9CisJCQorCQltYWluQm94LnJlbW92ZUFsbCgpOworCQlpZiAoaXRlbUZpZWxkcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpPTA7IGkgPCBpdGVtRmllbGRzLmxlbmd0aDsgaSsrKSB7CisJCQkJSlBhbmVsIGJ1bmRsZVBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJCWJ1bmRsZVBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoQ29sb3IuZGFya0dyYXkpKTsKKwkJCQlidW5kbGVQYW5lbC5hZGQoaXRlbUxhYmVsc1tpXSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJCQlidW5kbGVQYW5lbC5hZGQoaXRlbUZpZWxkc1tpXSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQkJYnVuZGxlUGFuZWwuYWRkKGNvbW1pdEJ1dHRvbnNbaV0sIEJvcmRlckxheW91dC5FQVNUKTsKKwkJCQltYWluQm94LmFkZChidW5kbGVQYW5lbCk7CisJCQl9CisJCX0KKwkJCisJCXJldmFsaWRhdGUoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJTZWFyY2hQYW5lbC5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQlNlYXJjaFBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3ZmQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJTZWFyY2hQYW5lbC5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKiBUaGUgY2xhc3MgdXNlZCB0byBkaXNwbGF5IHVudHJhbnNsYXRlZCBpdGVtcworICovCitjbGFzcyBSQlNlYXJjaFBhbmVsIGV4dGVuZHMgSlBhbmVsIHsKKwlSQk1hbmFnZXIgcmJtOworCUJ1bmRsZSBidW5kbGU7CisJUkJNYW5hZ2VyR1VJIGxpc3RlbmVyOworCQorCS8vIENvbXBvbmVudHMKKwlKTGFiZWwgdGl0bGVMYWJlbCAgICAgICA9IG5ldyBKTGFiZWwoKTsKKwlKTGFiZWwgZmluZExhYmVsICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJzZWFyY2hfZmluZCIpKTsKKwlKTGFiZWwgcmVwbGFjZUxhYmVsICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJzZWFyY2hfcmVwbGFjZSIpKTsKKwkKKwlKVGV4dEZpZWxkIGZpbmRGaWVsZCAgICA9IG5ldyBKVGV4dEZpZWxkKCk7CisJSlRleHRGaWVsZCByZXBsYWNlRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOworCQorCUpDaGVja0JveCBrZXlzQ2hlY2sgICAgID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInNlYXJjaF9rZXlzIiksIGZhbHNlKTsKKwlKQ2hlY2tCb3ggdHJhbnNDaGVjayAgICA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJzZWFyY2hfdmFsdWVzIiksIHRydWUpOworCUpDaGVja0JveCBjb21tZW50c0NoZWNrID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInNlYXJjaF9jb21tZW50cyIpLCBmYWxzZSk7CisJSkNoZWNrQm94IGNhc2VDaGVjayAgICAgPSBuZXcgSkNoZWNrQm94KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigic2VhcmNoX2Nhc2Vfc2Vuc2l0aXZlIiksIGZhbHNlKTsKKwkKKwlKQnV0dG9uIGZpbmRCdXR0b24gICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX3NlYXJjaF9maW5kX2FsbCIpKTsKKwlKQnV0dG9uIHJlcGxhY2VCdXR0b24gICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbCIpKTsKKwkKKwlTZWFyY2hJdGVtc1RhYmxlTW9kZWwgICAgIG1vZGVsOworCUpUYWJsZSAgICAgICAgICAgICAgICAgICAgdGFibGU7CisJSlNjcm9sbFBhbmUgICAgICAgICAgICAgICB0YWJsZVNjcm9sbDsKKwkKKwlwdWJsaWMgUkJTZWFyY2hQYW5lbChSQk1hbmFnZXJHVUkgZ3VpKSB7CisJCXN1cGVyKCk7CisJCWxpc3RlbmVyID0gZ3VpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRCdW5kbGUoQnVuZGxlIGIpIHsKKwkJcmJtID0gbnVsbDsKKwkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisJCQlidW5kbGUgPSBiOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfSBlbHNlIGlmIChidW5kbGUgIT0gYikgeworCQkJYnVuZGxlID0gYjsKKwkJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFJCTWFuYWdlciBtKSB7CisJCWJ1bmRsZSA9IG51bGw7CisJCWlmIChyYm0gPT0gbnVsbCkgeworCQkJcmJtID0gbTsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSBpZiAocmJtICE9IG0pIHsKKwkJCXJibSA9IG07CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudHMoKSB7CisJCWlmIChyYm0gIT0gbnVsbCB8fCBidW5kbGUgIT0gbnVsbCkgeworCQkJcmJtID0gbnVsbDsKKwkJCWJ1bmRsZSA9IG51bGw7CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TZWFyY2goKSB7CisJCVN0cmluZyBzZWFyY2hfdGVybSA9IGZpbmRGaWVsZC5nZXRUZXh0KCkudHJpbSgpOworCQlpZiAoc2VhcmNoX3Rlcm0ubGVuZ3RoKCkgPCAxKSByZXR1cm47CisJCWlmIChidW5kbGUgIT0gbnVsbCkgeworCQkJcGVyZm9ybVNlYXJjaChzZWFyY2hfdGVybSwgYnVuZGxlLCBjYXNlQ2hlY2suaXNTZWxlY3RlZCgpKTsKKwkJfSBlbHNlIGlmIChyYm0gIT0gbnVsbCkgeworCQkJcGVyZm9ybVNlYXJjaChzZWFyY2hfdGVybSwgKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmVsZW1lbnRBdCgwKSwgY2FzZUNoZWNrLmlzU2VsZWN0ZWQoKSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1TZWFyY2goU3RyaW5nIHRlcm0sIEJ1bmRsZSBidW5kbGUsIGJvb2xlYW4gY2FzZV9zZW5zaXRpdmUpIHsKKwkJVmVjdG9yIHJldF92ID0gbmV3IFZlY3RvcigpOworCQlFbnVtZXJhdGlvbiBrZXlzID0gYnVuZGxlLmFsbEl0ZW1zLmtleXMoKTsKKwkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKwkJCUJ1bmRsZUl0ZW0gaXRlbSA9IChCdW5kbGVJdGVtKWJ1bmRsZS5hbGxJdGVtcy5nZXQoa2V5KTsKKwkJCWlmIChjYXNlX3NlbnNpdGl2ZSkgeworCQkJCWlmIChrZXlzQ2hlY2suaXNTZWxlY3RlZCgpICYmIGtleS5pbmRleE9mKHRlcm0pID49IDApIHsKKwkJCQkJcmV0X3YuYWRkRWxlbWVudChpdGVtKTsKKwkJCQkJY29udGludWU7CisJCQkJfSAvLyBlbmQgaWYgLSBrZXlzCisJCQkJaWYgKHRyYW5zQ2hlY2suaXNTZWxlY3RlZCgpICYmIGl0ZW0uZ2V0VHJhbnNsYXRpb24oKS5pbmRleE9mKHRlcm0pID49IDApIHsKKwkJCQkJcmV0X3YuYWRkRWxlbWVudChpdGVtKTsKKwkJCQkJY29udGludWU7CisJCQkJfSAvLyBlbmQgaWYgLSB0cmFuc2xhdGlvbnMKKwkJCQlpZiAoY29tbWVudHNDaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCQkJaWYgKGl0ZW0uZ2V0Q29tbWVudCgpLmluZGV4T2YodGVybSkgPj0gMCkgeworCQkJCQkJcmV0X3YuYWRkRWxlbWVudChpdGVtKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCUhhc2h0YWJsZSBsb29rdXBzID0gaXRlbS5nZXRMb29rdXBzKCk7CisJCQkJCUVudW1lcmF0aW9uIGVudW0yID0gbG9va3Vwcy5rZXlzKCk7CisJCQkJCXdoaWxlIChlbnVtMi5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCQkJU3RyaW5nIGxvb2t1cF9rZXkgPSAoU3RyaW5nKWVudW0yLm5leHRFbGVtZW50KCk7CisJCQkJCQlTdHJpbmcgbG9va3VwX3ZhbHVlID0gKFN0cmluZylsb29rdXBzLmdldChsb29rdXBfa2V5KTsKKwkJCQkJCWlmIChsb29rdXBfdmFsdWUuaW5kZXhPZih0ZXJtKSA+PSAwKSB7CisJCQkJCQkJcmV0X3YuYWRkRWxlbWVudChpdGVtKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfSAvLyBlbmQgd2hpbGUKKwkJCQl9IC8vIGVuZCBpZiAtIGNvbW1lbnRzCisJCQl9IGVsc2UgeworCQkJCS8vIE5vdCBjYXNlIHNlbnNpdGl2ZQkKKwkJCQlpZiAoa2V5c0NoZWNrLmlzU2VsZWN0ZWQoKSAmJiBrZXkudG9VcHBlckNhc2UoKS5pbmRleE9mKHRlcm0udG9VcHBlckNhc2UoKSkgPj0gMCkgeworCQkJCQlyZXRfdi5hZGRFbGVtZW50KGl0ZW0pOworCQkJCQljb250aW51ZTsKKwkJCQl9IC8vIGVuZCBpZiAtIGtleXMKKwkJCQlpZiAodHJhbnNDaGVjay5pc1NlbGVjdGVkKCkgJiYgaXRlbS5nZXRUcmFuc2xhdGlvbigpLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXJtLnRvVXBwZXJDYXNlKCkpID49IDApIHsKKwkJCQkJcmV0X3YuYWRkRWxlbWVudChpdGVtKTsKKwkJCQkJY29udGludWU7CisJCQkJfSAvLyBlbmQgaWYgLSB0cmFuc2xhdGlvbnMKKwkJCQlpZiAoY29tbWVudHNDaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCQkJaWYgKGl0ZW0uZ2V0Q29tbWVudCgpLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXJtLnRvVXBwZXJDYXNlKCkpID49IDApIHsKKwkJCQkJCXJldF92LmFkZEVsZW1lbnQoaXRlbSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlIYXNodGFibGUgbG9va3VwcyA9IGl0ZW0uZ2V0TG9va3VwcygpOworCQkJCQlFbnVtZXJhdGlvbiBlbnVtMiA9IGxvb2t1cHMua2V5cygpOworCQkJCQl3aGlsZSAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQkJCVN0cmluZyBsb29rdXBfa2V5ID0gKFN0cmluZyllbnVtMi5uZXh0RWxlbWVudCgpOworCQkJCQkJU3RyaW5nIGxvb2t1cF92YWx1ZSA9IChTdHJpbmcpbG9va3Vwcy5nZXQobG9va3VwX2tleSk7CisJCQkJCQlpZiAobG9va3VwX3ZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXJtLnRvVXBwZXJDYXNlKCkpID49IDApIHsKKwkJCQkJCQlyZXRfdi5hZGRFbGVtZW50KGl0ZW0pOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQl9IC8vIGVuZCB3aGlsZQorCQkJCX0gLy8gZW5kIGlmIC0gY29tbWVudHMKKwkJCX0KKwkJfSAvLyBlbmQgd2hpbGUKKwkJbW9kZWwuc2V0SXRlbXMocmV0X3YpOworCQltb2RlbC51cGRhdGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVJlcGxhY2UoKSB7CisJCVN0cmluZyBzZWFyY2hfdGVybSA9IGZpbmRGaWVsZC5nZXRUZXh0KCkudHJpbSgpOworCQlTdHJpbmcgcmVwbGFjZV90ZXJtID0gcmVwbGFjZUZpZWxkLmdldFRleHQoKS50cmltKCk7CisJCXBlcmZvcm1TZWFyY2goKTsKKwkJaWYgKHNlYXJjaF90ZXJtLmxlbmd0aCgpIDwgMSB8fCByZXBsYWNlX3Rlcm0ubGVuZ3RoKCkgPCAxKSByZXR1cm47CisJCWlmIChrZXlzQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLAorCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfbm9fa2V5X3JlcGxhY2UiKSwKKwkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIndhcm5pbmciKSwgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKKwkJfQorCQlWZWN0b3IgaXRlbXMgPSBtb2RlbC5nZXRCdW5kbGVJdGVtcygpOworCQlmb3IgKGludCBpPTA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgeworCQkJQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlbXMuZWxlbWVudEF0KGkpOworCQkJaWYgKHRyYW5zQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQkJaXRlbS5zZXRUcmFuc2xhdGlvbihyZXBsYWNlKGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSwgc2VhcmNoX3Rlcm0sIHJlcGxhY2VfdGVybSkpOworCQkJfQorCQkJaWYgKGNvbW1lbnRzQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQkJaXRlbS5zZXRDb21tZW50KHJlcGxhY2UoaXRlbS5nZXRDb21tZW50KCksIHNlYXJjaF90ZXJtLCByZXBsYWNlX3Rlcm0pKTsKKwkJCX0KKwkJfQorCQltb2RlbC51cGRhdGUoKTsKKwl9CisJCisJLy8gUmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiBtYXRjaCBpbiBvcmlnaW5hbCB3aXRoIHJlcGxhY2UKKwkKKwlwcml2YXRlIFN0cmluZyByZXBsYWNlKFN0cmluZyBvcmlnaW5hbCwgU3RyaW5nIG1hdGNoLCBTdHJpbmcgcmVwbGFjZSkgeworCQlpbnQgY3VycmVudF9pbmRleCA9IC0xOworCQl3aGlsZSAob3JpZ2luYWwuaW5kZXhPZihtYXRjaCwrK2N1cnJlbnRfaW5kZXgpID49IDApIHsKKwkJCWN1cnJlbnRfaW5kZXggPSBvcmlnaW5hbC5pbmRleE9mKG1hdGNoLCBjdXJyZW50X2luZGV4KTsKKwkJCW9yaWdpbmFsID0gb3JpZ2luYWwuc3Vic3RyaW5nKDAsY3VycmVudF9pbmRleCkgKyByZXBsYWNlICsKKwkJCQkJICAgb3JpZ2luYWwuc3Vic3RyaW5nKGN1cnJlbnRfaW5kZXgrbWF0Y2gubGVuZ3RoKCksIG9yaWdpbmFsLmxlbmd0aCgpKTsKKwkJfQorCQlyZXR1cm4gb3JpZ2luYWw7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRDb21wb25lbnRzKCkgeworCQkvLyBJbml0aWFsaXplIGNvbXBvbmVudHMKKwkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisJCQl0aXRsZUxhYmVsLnNldFRleHQoYnVuZGxlLm5hbWUpOworCQl9CisJCWVsc2UgaWYgKHJibSAhPSBudWxsKSB7CisJCQl0aXRsZUxhYmVsLnNldFRleHQocmJtLmdldEJhc2VDbGFzcygpICsgIiAtICIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInNlYXJjaCIpKTsKKwkJfQorCQltb2RlbCA9IG5ldyBTZWFyY2hJdGVtc1RhYmxlTW9kZWwobmV3IFZlY3RvcigpKTsKKwkJCisJCXRpdGxlTGFiZWwuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDE4KSk7CisJCQorCQlyZW1vdmVBbGwoKTsKKwkJc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCXRhYmxlID0gbmV3IEpUYWJsZShtb2RlbCk7CisJCXRhYmxlU2Nyb2xsID0gbmV3IEpTY3JvbGxQYW5lKHRhYmxlKTsKKwkJCisJCXRhYmxlLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9JTlRFUlZBTF9TRUxFQ1RJT04pOworCQl0YWJsZS5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCURpbWVuc2lvbiBkaW0gPSBuZXcgRGltZW5zaW9uKDc1LDE1KTsKKwkJCisJCWZpbmRGaWVsZC5zZXRDb2x1bW5zKDIwKTsKKwkJcmVwbGFjZUZpZWxkLnNldENvbHVtbnMoMjApOworCQlmaW5kTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShkaW0pOworCQlyZXBsYWNlTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShkaW0pOworCQkKKwkJSlBhbmVsIGlubmVyUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCUpQYW5lbCBzb3V0aFBhbmVsID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgd2VzdFBhbmVsMSA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisJCUpQYW5lbCB3ZXN0UGFuZWwyID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKKwkJQm94IHJpZ2h0Qm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJQm94IGxlZnRCb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQkKKwkJLy8gQWRkIGFjdGlvbiBsaXN0ZW5lcnMKKwkJZmluZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXBlcmZvcm1TZWFyY2goKTsKKwkJCX0KKwkJfSk7CisJCQorCQlyZXBsYWNlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJcGVyZm9ybVJlcGxhY2UoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlmaW5kQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fc2VhcmNoX2ZpbmRfYWxsX3RyaWdnZXIiKSkpOworCQlyZXBsYWNlQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fc2VhcmNoX3JlcGxhY2VfYWxsX3RyaWdnZXIiKSkpOworCQkKKwkJLy8gUGxhY2UgY29tcG9uZW50cworCQl3ZXN0UGFuZWwxLmFkZChmaW5kTGFiZWwpOworCQl3ZXN0UGFuZWwxLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJd2VzdFBhbmVsMS5hZGQoZmluZEZpZWxkKTsKKwkJCisJCXdlc3RQYW5lbDIuYWRkKHJlcGxhY2VMYWJlbCk7CisJCXdlc3RQYW5lbDIuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQl3ZXN0UGFuZWwyLmFkZChyZXBsYWNlRmllbGQpOworCQkKKwkJbGVmdEJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsR2x1ZSgpKTsKKwkJbGVmdEJveC5hZGQod2VzdFBhbmVsMSk7CisJCWxlZnRCb3guYWRkKHdlc3RQYW5lbDIpOworCQkvL2xlZnRCb3guYWRkKGNhc2VDaGVjayk7CisJCQorCQlyaWdodEJveC5hZGQoa2V5c0NoZWNrKTsKKwkJcmlnaHRCb3guYWRkKHRyYW5zQ2hlY2spOworCQlyaWdodEJveC5hZGQoY29tbWVudHNDaGVjayk7CisJCQorCQlzb3V0aFBhbmVsLmFkZChmaW5kQnV0dG9uKTsKKwkJc291dGhQYW5lbC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCXNvdXRoUGFuZWwuYWRkKHJlcGxhY2VCdXR0b24pOworCQlzb3V0aFBhbmVsLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDEwKSk7CisJCXNvdXRoUGFuZWwuYWRkKGNhc2VDaGVjayk7CisJCQorCQlpbm5lclBhbmVsLmFkZCh0aXRsZUxhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworCQlpbm5lclBhbmVsLmFkZChsZWZ0Qm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJaW5uZXJQYW5lbC5hZGQocmlnaHRCb3gsIEJvcmRlckxheW91dC5FQVNUKTsKKwkJaW5uZXJQYW5lbC5hZGQoc291dGhQYW5lbCwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKwkJCisJCWFkZChpbm5lclBhbmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworCQlhZGQodGFibGVTY3JvbGwsIEJvcmRlckxheW91dC5DRU5URVIpOworCQorCQlpZiAocmJtID09IG51bGwgJiYgYnVuZGxlID09IG51bGwpIHsKKwkJCXJlbW92ZUFsbCgpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbXBvbmVudHMoKSB7CisJCQorCX0KK30KKworLy8gVGhlIHRhYmxlIG1vZGVsIGZvciBzZWFyY2hlZCBJdGVtcworCitjbGFzcyBTZWFyY2hJdGVtc1RhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgeworCVZlY3RvciBpdGVtczsKKwkKKwlwdWJsaWMgU2VhcmNoSXRlbXNUYWJsZU1vZGVsKFZlY3RvciBpdGVtcykgeworCQl0aGlzLml0ZW1zID0gaXRlbXM7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFZlY3RvciBpdGVtcykgeworCQl0aGlzLml0ZW1zID0gaXRlbXM7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7IHJldHVybiAzOyB9CisJCSAgICAKKwlwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgeworCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvdywgaW50IGNvbCkgeworCQlCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtcy5lbGVtZW50QXQocm93KTsKKwkJU3RyaW5nIHJldFN0ciA9IG51bGw7CisJCQkJCisJCXN3aXRjaChjb2wpIHsKKwkJY2FzZSAwOgorCQkJcmV0U3RyID0gaXRlbS5nZXRLZXkoKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlyZXRTdHIgPSBpdGVtLmdldFRyYW5zbGF0aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcmV0U3RyID0gKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSA9PSBudWxsID8gIiIgOiBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0TmFtZSgpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0U3RyID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJsZV9jZWxsX2Vycm9yIik7CisJCX0KKwkJCQkKKwkJcmV0dXJuIHJldFN0cjsKKwl9CisJCQkKKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbCkgeworCQlpZiAoY29sID09IDApIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdldW50cmFuc19jb2x1bW5fa2V5Iik7CisJCWVsc2UgaWYgKGNvbCA9PSAxKSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXVudHJhbnNfY29sdW1uX3RyYW5zbGF0aW9uIik7CisJCWVsc2UgaWYgKGNvbCA9PSAyKSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXVudHJhbnNfY29sdW1uX2dyb3VwIik7CisJCWVsc2UgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFibGVfY29sdW1uX2Vycm9yIik7CisJfQorCQorCXB1YmxpYyBCdW5kbGVJdGVtIGdldEJ1bmRsZUl0ZW0oaW50IHJvdykgeworCQlyZXR1cm4gKEJ1bmRsZUl0ZW0paXRlbXMuZWxlbWVudEF0KHJvdyk7CisJfQorCQorCXB1YmxpYyBWZWN0b3IgZ2V0QnVuZGxlSXRlbXMoKSB7CisJCXJldHVybiBpdGVtczsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlmaXJlVGFibGVEYXRhQ2hhbmdlZCgpOworCX0KK30KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJTdGF0aXN0aWNzUGFuZWwuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJTdGF0aXN0aWNzUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWM4ZTMzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQlN0YXRpc3RpY3NQYW5lbC5qYXZhCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkpUZXh0Q29tcG9uZW50OworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKiBUaGUgY2xhc3MgdXNlZCB0byBkaXNwbGF5IHN0YXRpc3RpY3MKKyAqLworY2xhc3MgUkJTdGF0aXN0aWNzUGFuZWwgZXh0ZW5kcyBKUGFuZWwgeworCVJCTWFuYWdlciByYm07CisJQnVuZGxlIGJ1bmRsZTsKKwkKKwkvLyBDb21wb25lbnRzIC0gQnVuZGxlCisJSkxhYmVsICAgICBqTGFiZWxTdGF0c1RpdGxlOworCQkKKwlKTGFiZWwgICAgIGpMYWJlbFN0YXRzTmFtZTsKKwlKTGFiZWwgICAgIGpMYWJlbFN0YXRzQ29tbWVudDsKKwlKTGFiZWwgICAgIGpMYWJlbFN0YXRzTWFuYWdlcjsKKwlKTGFiZWwgICAgIGpMYWJlbFN0YXRzTGFuZ3VhZ2U7CisJSkxhYmVsICAgICBqTGFiZWxTdGF0c0NvdW50cnk7CisJSkxhYmVsICAgICBqTGFiZWxTdGF0c1ZhcmlhbnQ7CisJSkxhYmVsICAgICBqTGFiZWxTdGF0c051bVRyYW5zOworCUpMYWJlbCAgICAgakxhYmVsU3RhdHNOdW1VbnRyYW5zOworCQkKKwlKVGV4dEZpZWxkIGpUZXh0RmllbGRTdGF0c05hbWU7CisJSlRleHRGaWVsZCBqVGV4dEZpZWxkU3RhdHNDb21tZW50OworCUpUZXh0RmllbGQgalRleHRGaWVsZFN0YXRzTWFuYWdlcjsKKwlKVGV4dEZpZWxkIGpUZXh0RmllbGRTdGF0c0xhbmd1YWdlOworCUpUZXh0RmllbGQgalRleHRGaWVsZFN0YXRzQ291bnRyeTsKKwlKVGV4dEZpZWxkIGpUZXh0RmllbGRTdGF0c1ZhcmlhbnQ7CisJCisJSkJ1dHRvbiAgICB1cGRhdGVCdXR0b247CisJCisJQm94ICAgICAgICBib3hTdGF0c0xlZnRSaWdodDE7CisJQm94ICAgICAgICBib3hTdGF0c0xlZnRSaWdodDI7CisJCisJLy8gQ29tcG9uZW50cyAtIGJ1bmRsZSBtYW5hZ2VyCisJSkxhYmVsICAgICAgdGl0bGVMYWJlbDsKKwlKTGFiZWwgICAgICBudW1GaWxlTGFiZWw7CisJSkxhYmVsICAgICAgbnVtRHVwTGFiZWw7CisJSkxhYmVsICAgICAgbnVtR3JvdXBMYWJlbDsKKwlKTGFiZWwgICAgICBudW1JdGVtTGFiZWw7CisJCisJSkxpc3QgICAgICAgZ3JvdXBMaXN0OworCUpMaXN0ICAgICAgIGZpbGVMaXN0OworCUpMaXN0ICAgICAgIGR1cExpc3Q7CisJCisJSlNjcm9sbFBhbmUgZ3JvdXBTY3JvbGw7CisJSlNjcm9sbFBhbmUgZHVwU2Nyb2xsOworCUpTY3JvbGxQYW5lIGZpbGVTY3JvbGw7CisJCisJSlBhbmVsICAgICAgZmlsZVBhbmVsOworCUpQYW5lbCAgICAgIGl0ZW1QYW5lbDsKKwlKUGFuZWwgICAgICBncm91cFBhbmVsOworCQorCUpCdXR0b24gICAgIGZpbGVCdXR0b247CisJSkJ1dHRvbiAgICAgZ3JvdXBCdXR0b247CisJSkJ1dHRvbiAgICAgaXRlbUJ1dHRvbjsKKwkKKwlCb3ggICAgICAgICBtYWluQm94OworCUJveCAgICAgICAgIGR1cEJveDsKKwkKKwkKKwlwdWJsaWMgdm9pZCBzZXRCdW5kbGUoQnVuZGxlIGIpIHsKKwkJcmJtID0gbnVsbDsKKwkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisJCQlidW5kbGUgPSBiOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfSBlbHNlIGlmIChidW5kbGUgIT0gYikgeworCQkJYnVuZGxlID0gYjsKKwkJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFJCTWFuYWdlciBtKSB7CisJCWJ1bmRsZSA9IG51bGw7CisJCWlmIChyYm0gPT0gbnVsbCkgeworCQkJcmJtID0gbTsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSBpZiAocmJtICE9IG0pIHsKKwkJCXJibSA9IG07CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRWxlbWVudHMoKSB7CisJCWlmIChyYm0gIT0gbnVsbCB8fCBidW5kbGUgIT0gbnVsbCkgeworCQkJcmJtID0gbnVsbDsKKwkJCWJ1bmRsZSA9IG51bGw7CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9CisJfQkKKwkJCisJcHVibGljIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisJCS8vIEluaXRpYWxpemUgY29tcG9uZW50cworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiSW5pdGlhbGl6aW5nIGNvbXBvbmVudHMgZm9yIFJlc291cmNlIEZpbGUiKTsKKwkJCWludCB1bnRyYW5zbGF0ZWQgPSBidW5kbGUuZ2V0VW50cmFuc2xhdGVkSXRlbXNTaXplKCk7CisJCQkKKwkJCWpMYWJlbFN0YXRzVGl0bGUgICAgICAgICAgPSBuZXcgSkxhYmVsKGJ1bmRsZS5uYW1lKTsKKwkJCisJCQlqTGFiZWxTdGF0c05hbWUgICAgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlc3RhdHNfdGl0bGUiKSk7CisJCQlqTGFiZWxTdGF0c0NvbW1lbnQgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlc3RhdHNfY29tbWVudCIpKTsKKwkJCWpMYWJlbFN0YXRzTWFuYWdlciAgICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2VzdGF0c19tYW5hZ2VyIikpOworCQkJakxhYmVsU3RhdHNMYW5ndWFnZSAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX2xhbmd1YWdlIikpOworCQkJakxhYmVsU3RhdHNDb3VudHJ5ICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX2NvdW50cnkiKSk7CisJCQlqTGFiZWxTdGF0c1ZhcmlhbnQgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlc3RhdHNfdmFyaWFudCIpKTsKKwkJCWpMYWJlbFN0YXRzTnVtVHJhbnMgICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2VzdGF0c19pdGVtX2NvdW50IikgKyAiICIgKworCQkJCQkJCQkJCQkJICAgU3RyaW5nLnZhbHVlT2YoYnVuZGxlLmFsbEl0ZW1zLnNpemUoKSkpOworCQkJakxhYmVsU3RhdHNOdW1VbnRyYW5zICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX3RyYW5zbGF0aW9uX2NvdW50IikgKyAKKwkJCQkJCQkJCQkJCSAgIFN0cmluZy52YWx1ZU9mKHVudHJhbnNsYXRlZCkpOworCQkKKwkJCWpUZXh0RmllbGRTdGF0c05hbWUgICAgICAgPSBuZXcgSlRleHRGaWVsZCgoYnVuZGxlLm5hbWUgPT0gbnVsbCA/IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidW50aXRsZWQiKSA6IGJ1bmRsZS5uYW1lKSk7CisJCQlqVGV4dEZpZWxkU3RhdHNDb21tZW50ICAgID0gbmV3IEpUZXh0RmllbGQoKGJ1bmRsZS5jb21tZW50ID09IG51bGwgPyAiIiA6IGJ1bmRsZS5jb21tZW50KSk7CisJCQlqVGV4dEZpZWxkU3RhdHNNYW5hZ2VyICAgID0gbmV3IEpUZXh0RmllbGQoKGJ1bmRsZS5tYW5hZ2VyID09IG51bGwgPyAiIiA6IGJ1bmRsZS5tYW5hZ2VyKSk7CisJCQlqVGV4dEZpZWxkU3RhdHNMYW5ndWFnZSAgID0gbmV3IEpUZXh0RmllbGQoKGJ1bmRsZS5sYW5ndWFnZSA9PSBudWxsID8gIiIgOiBidW5kbGUubGFuZ3VhZ2UpLDI1KTsKKwkJCWpUZXh0RmllbGRTdGF0c0NvdW50cnkgICAgPSBuZXcgSlRleHRGaWVsZCgoYnVuZGxlLmNvdW50cnkgPT0gbnVsbCA/ICIiIDogYnVuZGxlLmNvdW50cnkpLDI1KTsKKwkJCWpUZXh0RmllbGRTdGF0c1ZhcmlhbnQgICAgPSBuZXcgSlRleHRGaWVsZCgoYnVuZGxlLnZhcmlhbnQgPT0gbnVsbCA/ICIiIDogYnVuZGxlLnZhcmlhbnQpLDI1KTsKKwkJCisJCQlib3hTdGF0c0xlZnRSaWdodDEgICAgICAgID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwkJCWJveFN0YXRzTGVmdFJpZ2h0MiAgICAgICAgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOwkKKwkJCisJCQl1cGRhdGVCdXR0b24gICAgICAgICAgICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fdXBkYXRlIikpOworCQkJdXBkYXRlQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fdXBkYXRlX3RyaWdnZXIiKSkpOworCQkJCisJCQkvLyBTZXQgdXAgdGhlIGNvbXBvbmVudHMKKwkJCWpMYWJlbFN0YXRzVGl0bGUuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDE4KSk7CisJCQkKKwkJCUJ1dHRvbkVuYWJsZXJGb2N1c0xpc3RlbmVyIGJlZmwgPSBuZXcgQnV0dG9uRW5hYmxlckZvY3VzTGlzdGVuZXIodXBkYXRlQnV0dG9uKTsKKwkJCQorCQkJLy8gQWRkIGxpc3RlbmVycworCQkJdXBkYXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQl1cGRhdGVCdW5kbGVJbmZvKCk7CisJCQkJfQorCQkJfSk7CisJCQkKKwkJCWpUZXh0RmllbGRTdGF0c05hbWUuYWRkRm9jdXNMaXN0ZW5lcihiZWZsKTsKKwkJCWpUZXh0RmllbGRTdGF0c0NvbW1lbnQuYWRkRm9jdXNMaXN0ZW5lcihiZWZsKTsKKwkJCWpUZXh0RmllbGRTdGF0c01hbmFnZXIuYWRkRm9jdXNMaXN0ZW5lcihiZWZsKTsKKwkJCWpUZXh0RmllbGRTdGF0c0xhbmd1YWdlLmFkZEZvY3VzTGlzdGVuZXIoYmVmbCk7CisJCQlqVGV4dEZpZWxkU3RhdHNDb3VudHJ5LmFkZEZvY3VzTGlzdGVuZXIoYmVmbCk7CisJCQlqVGV4dEZpZWxkU3RhdHNWYXJpYW50LmFkZEZvY3VzTGlzdGVuZXIoYmVmbCk7CisJCQkKKwkJCWpUZXh0RmllbGRTdGF0c05hbWUuc2V0Q29sdW1ucygzNSk7CisJCQlqVGV4dEZpZWxkU3RhdHNDb21tZW50LnNldENvbHVtbnMoMzUpOworCQkJalRleHRGaWVsZFN0YXRzTWFuYWdlci5zZXRDb2x1bW5zKDM1KTsKKwkJCWpUZXh0RmllbGRTdGF0c0xhbmd1YWdlLnNldENvbHVtbnMoMjUpOworCQkJalRleHRGaWVsZFN0YXRzQ291bnRyeS5zZXRDb2x1bW5zKDI1KTsKKwkJCWpUZXh0RmllbGRTdGF0c1ZhcmlhbnQuc2V0Q29sdW1ucygyNSk7CisJCQkKKwkJCS8vdXBkYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCisJCQkvLyBVcGRhdGUgdGhlIGRpc3BsYXkKKwkJCWlmIChtYWluQm94ICE9IG51bGwpeworCQkJCW1haW5Cb3gucmVtb3ZlQWxsKCk7CisJCQl9IGVsc2UgeworCQkJCW1haW5Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQkJfQorCQkJaWYgKGR1cEJveCAhPSBudWxsKQorCQkJCWR1cEJveC5yZW1vdmVBbGwoKTsKKwkJCXJlbW92ZUFsbCgpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNUaXRsZSk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCgxMCkpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNOYW1lKTsKKwkJCW1haW5Cb3guYWRkKGpUZXh0RmllbGRTdGF0c05hbWUpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNDb21tZW50KTsKKwkJCW1haW5Cb3guYWRkKGpUZXh0RmllbGRTdGF0c0NvbW1lbnQpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNNYW5hZ2VyKTsKKwkJCW1haW5Cb3guYWRkKGpUZXh0RmllbGRTdGF0c01hbmFnZXIpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNMYW5ndWFnZSk7CisJCQltYWluQm94LmFkZChqVGV4dEZpZWxkU3RhdHNMYW5ndWFnZSk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCQltYWluQm94LmFkZChqTGFiZWxTdGF0c0NvdW50cnkpOworCQkJbWFpbkJveC5hZGQoalRleHRGaWVsZFN0YXRzQ291bnRyeSk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCQltYWluQm94LmFkZChqTGFiZWxTdGF0c1ZhcmlhbnQpOworCQkJbWFpbkJveC5hZGQoalRleHRGaWVsZFN0YXRzVmFyaWFudCk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCQltYWluQm94LmFkZChqTGFiZWxTdGF0c051bVRyYW5zKTsKKwkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJCW1haW5Cb3guYWRkKGpMYWJlbFN0YXRzTnVtVW50cmFucyk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCgxMCkpOworCQkJbWFpbkJveC5hZGQodXBkYXRlQnV0dG9uKTsKKwkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsKKwkJCWlmICghKGdldExheW91dCgpIGluc3RhbmNlb2YgRmxvd0xheW91dCkpIHsKKwkJCQlzZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoKSk7CisJCQl9CisJCQlhZGQobWFpbkJveCk7CisJCX0gZWxzZSBpZiAocmJtICE9IG51bGwpIHsKKwkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiSW5pdGlhbGl6aW5nIGNvbXBvbmVudHMgZm9yIFJlc291cmNlIEJ1bmRsZSIpOworCQkJdGl0bGVMYWJlbCAgICAgICAgICA9IG5ldyBKTGFiZWwocmJtLmdldEJhc2VDbGFzcygpICsgIiAtICIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2VjbGFzcyIpKTsKKwkJCisJCQludW1GaWxlTGFiZWwgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2VzdGF0c19maWxlX2NvdW50IikgKyAiICIgKyByYm0uZ2V0TnVtYmVyTGFuZ3VhZ2VzKCkpOworCQkJbnVtR3JvdXBMYWJlbCAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlc3RhdHNfZ3JvdXBfY291bnQiKSArICIgIiArIHJibS5nZXROdW1iZXJHcm91cHMoKSk7CisJCQludW1JdGVtTGFiZWwgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2VzdGF0c19pdGVtX2NvdW50IikgKyAiICIgKyByYm0uZ2V0TnVtYmVyVG90YWxUcmFuc2xhdGlvbnMoKSk7CisJCQludW1EdXBMYWJlbCAgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2VzdGF0c19kdXBsaWNhdGVzX2NvdW50IikgKyAiICIgKyByYm0uZ2V0TnVtYmVyRHVwbGljYXRlcygpKTsKKwkJCQorCQkJZmlsZUxpc3QgICAgICAgICAgICA9IG5ldyBKTGlzdChyYm0uZ2V0TGFuZ3VhZ2VMaXN0aW5nVmVjdG9yKCkpOworCQkJZ3JvdXBMaXN0ICAgICAgICAgICA9IG5ldyBKTGlzdChyYm0uZ2V0R3JvdXBMaXN0aW5nVmVjdG9yKCkpOworCQkJZHVwTGlzdCAgICAgICAgICAgICA9IG5ldyBKTGlzdChyYm0uZ2V0RHVwbGljYXRlc0xpc3RpbmdWZWN0b3IoKSk7CisJCQkKKwkJCWZpbGVCdXR0b24gICAgICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9hZGRfZmlsZSIpKTsKKwkJCWdyb3VwQnV0dG9uICAgICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9hZGRfZ3JvdXAiKSk7CisJCQlpdGVtQnV0dG9uICAgICAgICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fYWRkX3Jlc291cmNlIikpOworCQkJCisJCQlmaWxlUGFuZWwgICAgICAgICAgID0gbmV3IEpQYW5lbCgpOworCQkJZ3JvdXBQYW5lbCAgICAgICAgICA9IG5ldyBKUGFuZWwoKTsKKwkJCWl0ZW1QYW5lbCAgICAgICAgICAgPSBuZXcgSlBhbmVsKCk7CisJCQkKKwkJCWZpbGVTY3JvbGwgICAgICAgICAgPSBuZXcgSlNjcm9sbFBhbmUoZmlsZUxpc3QpOworCQkJZ3JvdXBTY3JvbGwgICAgICAgICA9IG5ldyBKU2Nyb2xsUGFuZShncm91cExpc3QpOworCQkJZHVwU2Nyb2xsICAgICAgICAgICA9IG5ldyBKU2Nyb2xsUGFuZShkdXBMaXN0KTsKKwkJCQorCQkJaWYgKG1haW5Cb3ggPT0gbnVsbCkgeworCQkJCW1haW5Cb3ggICAgICAgICA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCQl9IGVsc2UgeworCQkJCW1haW5Cb3gucmVtb3ZlQWxsKCk7CisJCQl9CisJCQlkdXBCb3ggICAgICAgICAgICAgID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCQorCQkJLy8gU2V0IHVwIHRoZSBjb21wb25lbnRzCisJCQlmaWxlUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQlncm91cFBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJaXRlbVBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJCisJCQlmaWxlUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkJIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZXN0YXRzX2ZpbGVfZ3JvdXAiKSkpOworCQkJZ3JvdXBQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCQkJCQkgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlc3RhdHNfZ3JvdXBfZ3JvdXAiKSkpOworCQkJaXRlbVBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJCSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2VzdGF0c19pdGVtX2dyb3VwIikpKTsKKwkJCQorCQkJdGl0bGVMYWJlbC5zZXRGb250KG5ldyBGb250KCJTYW5zU2VyaWYiLEZvbnQuUExBSU4sMTgpKTsKKwkJCQorCQkJZmlsZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2FkZF9maWxlX3RyaWdnZXIiKSkpOworCQkJZ3JvdXBCdXR0b24uc2V0TW5lbW9uaWMoUkJNYW5hZ2VyTWVudUJhci5nZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9hZGRfZ3JvdXBfdHJpZ2dlciIpKSk7CisJCQlpdGVtQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fYWRkX3Jlc291cmNlX3RyaWdnZXIiKSkpOworCQkJCisJCQkvLyBBZGQgbGlzdGVuZXJzCisJCQlmaWxlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlDb250YWluZXIgYyA9ICgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCk7CisJCQkJCVJCTWFuYWdlckdVSSBndWkgPSBudWxsOworCQkJCQl3aGlsZSAoIShjLmdldFBhcmVudCgpIGluc3RhbmNlb2YgUkJNYW5hZ2VyR1VJKSkgYyA9IGMuZ2V0UGFyZW50KCk7CisJCQkJCWd1aSA9IChSQk1hbmFnZXJHVUkpYy5nZXRQYXJlbnQoKTsKKwkJCQkJZ3VpLmNyZWF0ZVJlc291cmNlRmlsZSgpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQlncm91cEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJQ29udGFpbmVyIGMgPSAoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpOworCQkJCQlSQk1hbmFnZXJHVUkgZ3VpID0gbnVsbDsKKwkJCQkJd2hpbGUgKCEoYy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFJCTWFuYWdlckdVSSkpIGMgPSBjLmdldFBhcmVudCgpOworCQkJCQlndWkgPSAoUkJNYW5hZ2VyR1VJKWMuZ2V0UGFyZW50KCk7CisJCQkJCWd1aS5jcmVhdGVCdW5kbGVHcm91cCgpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQlpdGVtQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlDb250YWluZXIgYyA9ICgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCk7CisJCQkJCVJCTWFuYWdlckdVSSBndWkgPSBudWxsOworCQkJCQl3aGlsZSAoIShjLmdldFBhcmVudCgpIGluc3RhbmNlb2YgUkJNYW5hZ2VyR1VJKSkgYyA9IGMuZ2V0UGFyZW50KCk7CisJCQkJCWd1aSA9IChSQk1hbmFnZXJHVUkpYy5nZXRQYXJlbnQoKTsKKwkJCQkJZ3VpLmNyZWF0ZUJ1bmRsZUl0ZW0oKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJLy8gVXBkYXRlIHRoZSBkaXNwbGF5CisJCQlmaWxlUGFuZWwucmVtb3ZlQWxsKCk7CisJCQlmaWxlUGFuZWwuYWRkKG51bUZpbGVMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJCWZpbGVQYW5lbC5hZGQoZmlsZVNjcm9sbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQlmaWxlUGFuZWwuYWRkKGZpbGVCdXR0b24sIEJvcmRlckxheW91dC5TT1VUSCk7CisJCQkKKwkJCWdyb3VwUGFuZWwucmVtb3ZlQWxsKCk7CisJCQlncm91cFBhbmVsLmFkZChudW1Hcm91cExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworCQkJZ3JvdXBQYW5lbC5hZGQoZ3JvdXBTY3JvbGwsIEJvcmRlckxheW91dC5DRU5URVIpOworCQkJZ3JvdXBQYW5lbC5hZGQoZ3JvdXBCdXR0b24sIEJvcmRlckxheW91dC5TT1VUSCk7CisJCQkKKwkJCWR1cEJveC5yZW1vdmVBbGwoKTsKKwkJCWR1cEJveC5hZGQobnVtRHVwTGFiZWwpOworCQkJZHVwQm94LmFkZChkdXBTY3JvbGwpOworCQkJCisJCQlpdGVtUGFuZWwucmVtb3ZlQWxsKCk7CisJCQlpdGVtUGFuZWwuYWRkKG51bUl0ZW1MYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJCWl0ZW1QYW5lbC5hZGQoZHVwQm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCWl0ZW1QYW5lbC5hZGQoaXRlbUJ1dHRvbiwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKwkJCQorCQkJbWFpbkJveC5yZW1vdmVBbGwoKTsKKwkJCW1haW5Cb3guYWRkKHRpdGxlTGFiZWwpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoMTApKTsKKwkJCW1haW5Cb3guYWRkKGZpbGVQYW5lbCk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCgxMCkpOworCQkJbWFpbkJveC5hZGQoZ3JvdXBQYW5lbCk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCgxMCkpOworCQkJbWFpbkJveC5hZGQoaXRlbVBhbmVsKTsKKwkJCQorCQkJcmVtb3ZlQWxsKCk7CisJCQlpZiAoIShnZXRMYXlvdXQoKSBpbnN0YW5jZW9mIEJvcmRlckxheW91dCkpCisJCQkJc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQlhZGQobWFpbkJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0gZWxzZSB7CisJCQlyZW1vdmVBbGwoKTsJCisJCX0KKwkJcmVwYWludCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGVDb21wb25lbnRzKCkgeworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCWludCB1bnRyYW5zbGF0ZWQgPSBidW5kbGUuZ2V0VW50cmFuc2xhdGVkSXRlbXNTaXplKCk7CisJCQkKKwkJCWpMYWJlbFN0YXRzVGl0bGUuc2V0VGV4dChidW5kbGUubmFtZSk7CisJCQorCQkJalRleHRGaWVsZFN0YXRzTmFtZS5zZXRUZXh0KGJ1bmRsZS5uYW1lID09IG51bGwgPyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVudGl0bGVkIikgOiBidW5kbGUubmFtZSk7CisJCQlqVGV4dEZpZWxkU3RhdHNDb21tZW50LnNldFRleHQoYnVuZGxlLmNvbW1lbnQgPT0gbnVsbCA/ICIiIDogYnVuZGxlLmNvbW1lbnQpOworCQkJalRleHRGaWVsZFN0YXRzTWFuYWdlci5zZXRUZXh0KGJ1bmRsZS5tYW5hZ2VyID09IG51bGwgPyAiIiA6IGJ1bmRsZS5tYW5hZ2VyKTsKKwkJCWpUZXh0RmllbGRTdGF0c0xhbmd1YWdlLnNldFRleHQoYnVuZGxlLmxhbmd1YWdlID09IG51bGwgPyAiIiA6IGJ1bmRsZS5sYW5ndWFnZSk7CisJCQlqVGV4dEZpZWxkU3RhdHNDb3VudHJ5LnNldFRleHQoYnVuZGxlLmNvdW50cnkgPT0gbnVsbCA/ICIiIDogYnVuZGxlLmNvdW50cnkpOworCQkJalRleHRGaWVsZFN0YXRzVmFyaWFudC5zZXRUZXh0KGJ1bmRsZS52YXJpYW50ID09IG51bGwgPyAiIiA6IGJ1bmRsZS52YXJpYW50KTsKKwkJCWpMYWJlbFN0YXRzTnVtVHJhbnMuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlc3RhdHNfaXRlbV9jb3VudCIpICsgIiAiICsKKwkJCQkJICAgU3RyaW5nLnZhbHVlT2YoYnVuZGxlLmFsbEl0ZW1zLnNpemUoKSkpOworCQkJakxhYmVsU3RhdHNOdW1VbnRyYW5zLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX3RyYW5zbGF0aW9uX2NvdW50IikgKyAKKwkJCQkJICAgU3RyaW5nLnZhbHVlT2YodW50cmFuc2xhdGVkKSk7CisJCX0gZWxzZSBpZiAocmJtID09IG51bGwpIHsKKwkJCXJlbW92ZUFsbCgpOworCQl9CisJCQorCX0KKwkKKwl2b2lkIHVwZGF0ZUJ1bmRsZUluZm8oKSB7CisJCWJ1bmRsZS5uYW1lICAgICA9IGpUZXh0RmllbGRTdGF0c05hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJYnVuZGxlLmNvbW1lbnQgID0galRleHRGaWVsZFN0YXRzQ29tbWVudC5nZXRUZXh0KCkudHJpbSgpOworCQlidW5kbGUubWFuYWdlciAgPSBqVGV4dEZpZWxkU3RhdHNNYW5hZ2VyLmdldFRleHQoKS50cmltKCk7CisJCWJ1bmRsZS5sYW5ndWFnZSA9IGpUZXh0RmllbGRTdGF0c0xhbmd1YWdlLmdldFRleHQoKS50cmltKCk7CisJCWJ1bmRsZS5jb3VudHJ5ICA9IGpUZXh0RmllbGRTdGF0c0NvdW50cnkuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJYnVuZGxlLnZhcmlhbnQgID0galRleHRGaWVsZFN0YXRzVmFyaWFudC5nZXRUZXh0KCkudHJpbSgpOworCQl1cGRhdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJfQorCQorCXB1YmxpYyBSQlN0YXRpc3RpY3NQYW5lbCgpIHsKKwkJc3VwZXIoKTsKKwkJYnVuZGxlID0gbnVsbDsKKwkJcmJtID0gbnVsbDsKKwl9CisJCit9CisKK2NsYXNzIEJ1dHRvbkVuYWJsZXJGb2N1c0xpc3RlbmVyIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lciB7CisJSkJ1dHRvbiBidXR0b247CisJU3RyaW5nIGJlZm9yZVRleHQgPSBudWxsOworCQorCXB1YmxpYyBCdXR0b25FbmFibGVyRm9jdXNMaXN0ZW5lcihKQnV0dG9uIGJ1dHRvbikgeworCQlzdXBlcigpOworCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKKwl9CisJCisJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBldikgeworCQlPYmplY3QgbyA9IGV2LmdldFNvdXJjZSgpOworCQlpZiAobyBpbnN0YW5jZW9mIEpUZXh0Q29tcG9uZW50KSB7CisJCQlKVGV4dENvbXBvbmVudCBqdGMgPSAoSlRleHRDb21wb25lbnQpbzsKKwkJCWJlZm9yZVRleHQgPSBqdGMuZ2V0VGV4dCgpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2KSB7CisJCU9iamVjdCBvID0gZXYuZ2V0U291cmNlKCk7CisJCWlmIChvIGluc3RhbmNlb2YgSlRleHRDb21wb25lbnQpIHsKKwkJCUpUZXh0Q29tcG9uZW50IGp0YyA9IChKVGV4dENvbXBvbmVudClvOworCQkJU3RyaW5nIGFmdGVyVGV4dCA9IGp0Yy5nZXRUZXh0KCk7CisJCQlpZiAoIWFmdGVyVGV4dC5lcXVhbHMoYmVmb3JlVGV4dCkpIGJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCQl9IGVsc2UgYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJfQorfQorCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCVW50cmFuc2xhdGVkUGFuZWwuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJVbnRyYW5zbGF0ZWRQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODdkYTQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCVW50cmFuc2xhdGVkUGFuZWwuamF2YQpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogVGhlIGNsYXNzIHVzZWQgdG8gZGlzcGxheSB1bnRyYW5zbGF0ZWQgaXRlbXMKKyAqLworY2xhc3MgUkJVbnRyYW5zbGF0ZWRQYW5lbCBleHRlbmRzIEpQYW5lbCB7CisJUkJNYW5hZ2VyIHJibTsKKwlCdW5kbGUgYnVuZGxlOworCVJCTWFuYWdlckdVSSBsaXN0ZW5lcjsKKwkKKwkvLyBDb21wb25lbnRzIC0gQnVuZGxlCisJSkxhYmVsICAgICAgICAgICAgICAgICAgICAgIGpMYWJlbFVudHJhbnNUaXRsZTsKKwlVbnRyYW5zbGF0ZWRJdGVtc1RhYmxlTW9kZWwgdW50cmFuc1RhYmxlTW9kZWw7CisJSlRhYmxlICAgICAgICAgICAgICAgICAgICAgIGpUYWJsZVVudHJhbnM7CisJSlNjcm9sbFBhbmUgICAgICAgICAgICAgICAgIGpTY3JvbGxQYW5lVW50cmFuc1RhYmxlOworCQorCS8vIENvbXBvbmVudHMgLSBCdW5kbGUgTWFuYWdlcgorCUJveCAgICAgICAgICAgICAgICAgICAgICAgICBtYWluQm94OworCUpQYW5lbCAgICAgICAgICAgICAgICAgICAgICBtYWluUGFuZWxzW107CisJSkxhYmVsICAgICAgICAgICAgICAgICAgICAgIG51bVVudHJhbnNMYWJlbHNbXTsKKwlKU2Nyb2xsUGFuZSAgICAgICAgICAgICAgICAgbWFpblNjcm9sbDsKKwlKU2Nyb2xsUGFuZSAgICAgICAgICAgICAgICAgbGlzdFNjcm9sbHNbXTsKKwlKTGlzdCAgICAgICAgICAgICAgICAgICAgICAgdW50cmFuc0xpc3RzW107CisJCisJcHVibGljIFJCVW50cmFuc2xhdGVkUGFuZWwoUkJNYW5hZ2VyR1VJIGd1aSkgeworCQlzdXBlcigpOworCQlsaXN0ZW5lciA9IGd1aTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QnVuZGxlKEJ1bmRsZSBiKSB7CisJCXJibSA9IG51bGw7CisJCWlmIChidW5kbGUgPT0gbnVsbCkgeworCQkJYnVuZGxlID0gYjsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSBpZiAoYnVuZGxlICE9IGIpIHsKKwkJCWJ1bmRsZSA9IGI7CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFuYWdlcihSQk1hbmFnZXIgbSkgeworCQlidW5kbGUgPSBudWxsOworCQlpZiAocmJtID09IG51bGwpIHsKKwkJCXJibSA9IG07CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9IGVsc2UgaWYgKHJibSAhPSBtKSB7CisJCQlyYm0gPSBtOworCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRzKCkgeworCQlpZiAocmJtICE9IG51bGwgfHwgYnVuZGxlICE9IG51bGwpIHsKKwkJCXJibSA9IG51bGw7CisJCQlidW5kbGUgPSBudWxsOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfQorCX0JCisJCisJLy8gTWFya3MgdGhlIHNlbGVjdGVkIHJlc291cmNlIGFzIHRyYW5zbGF0ZWQgYW5kIHJlbW92ZXMgZnJvbSB0aGlzIHZpZXcKKwlwcml2YXRlIHZvaWQgbWFya1NlbGVjdGVkUmVzb3VyY2VBc1RyYW5zbGF0ZWQoKSB7CisJCWlmIChidW5kbGUgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoalRhYmxlVW50cmFucy5nZXRTZWxlY3RlZFJvdygpIDwgMCkgcmV0dXJuOworCQlpZiAoalRhYmxlVW50cmFucy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsKSB7CisJCQlpbnQgcm93ID0galRhYmxlVW50cmFucy5nZXRTZWxlY3RlZFJvdygpOworCQkJVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsIG1vZGVsID0gKFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbClqVGFibGVVbnRyYW5zLmdldE1vZGVsKCk7CisJCQlCdW5kbGVJdGVtIGl0ZW0gPSBtb2RlbC5nZXRCdW5kbGVJdGVtKHJvdyk7CisJCQlpdGVtLnNldFRyYW5zbGF0ZWQodHJ1ZSk7CisJCQltb2RlbC51cGRhdGUoKTsKKwkJfQorCX0KKwkKKwkvLyBSZW1vdmVzIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBmcm9tIHRoZSByZXNvdXJjZSBmaWxlCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVNlbGVjdGVkUmVzb3VyY2UoKSB7CisJCWlmIChidW5kbGUgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoalRhYmxlVW50cmFucy5nZXRTZWxlY3RlZFJvdygpIDwgMCkgcmV0dXJuOworCQlpZiAoalRhYmxlVW50cmFucy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsKSB7CisJCQlpbnQgcm93ID0galRhYmxlVW50cmFucy5nZXRTZWxlY3RlZFJvdygpOworCQkJVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsIG1vZGVsID0gKFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbClqVGFibGVVbnRyYW5zLmdldE1vZGVsKCk7CisJCQlCdW5kbGVJdGVtIGl0ZW0gPSBtb2RlbC5nZXRCdW5kbGVJdGVtKHJvdyk7CisJCQlpZiAoaXRlbS5nZXRQYXJlbnRHcm91cCgpICE9IG51bGwgJiYgaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpICE9IG51bGwpIHsKKwkJCQlCdW5kbGUgYnVuZGxlID0gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpOworCQkJCWJ1bmRsZS5yZW1vdmVJdGVtKGl0ZW0uZ2V0S2V5KCkpOworCQkJfQorCQkJbW9kZWwudXBkYXRlKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHByaW50VGFibGUoKSB7CisJCVByaW50Sm9iIHBqb2IgPSBnZXRUb29sa2l0KCkuZ2V0UHJpbnRKb2IobmV3IEZyYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnRpbmcgVGVzdCIsIG51bGwpOworCisgICAgICAgIGlmIChwam9iICE9IG51bGwpIHsgICAgICAgICAgCisgICAgICAgICAgICBHcmFwaGljcyBwZyA9IHBqb2IuZ2V0R3JhcGhpY3MoKTsKKworICAgICAgICAgICAgaWYgKHBnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvL2pUYWJsZVVudHJhbnMucHJpbnQocGcpOworICAgICAgICAgICAgICAgIERpbWVuc2lvbiBwYWdlX2RpbSA9IHBqb2IuZ2V0UGFnZURpbWVuc2lvbigpOworCQkJCXBnLnNldENvbG9yKENvbG9yLmJsYWNrKTsKKwkJCQlpbnQgeV9vZmYgPSA1MDsKKwkJCQlpbnQgeF9vZmYgPSAzMDsKKwkJCQlUYWJsZU1vZGVsIG1vZGVsID0galRhYmxlVW50cmFucy5nZXRNb2RlbCgpOworCQkJCXBnLnNldEZvbnQobmV3IEZvbnQoIlNhbnNTZXJpZiIsIEZvbnQuQk9MRCwgMTQpKTsKKwkJCQlwZy5kcmF3U3RyaW5nKCJVbnRyYW5zbGF0ZWQgSXRlbXM6ICAgICAgIFBhZ2UgMSIsIHhfb2ZmLCB5X29mZik7CisJCQkJcGcuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIiwgRm9udC5QTEFJTiwgMTApKTsKKwkJCQkKKwkJCQlmb3IgKGludCBpPTAgOyBpIDwgbW9kZWwuZ2V0Um93Q291bnQoKTsgaSsrKSB7CisJCQkJCWlmICh5X29mZiA8IHBhZ2VfZGltLmhlaWdodCAtIDUwKSB7CisJCQkJCQl5X29mZiArPSAxNTsKKwkJCQkJCVN0cmluZyBrZXkgPSBtb2RlbC5nZXRWYWx1ZUF0KGksIDApLnRvU3RyaW5nKCk7CisJCQkJCQlTdHJpbmcgdHJhbnNsYXRpb24gPSBtb2RlbC5nZXRWYWx1ZUF0KGksMSkudG9TdHJpbmcoKTsKKwkJCQkJCXBnLmRyYXdTdHJpbmcoa2V5ICsgIiAtPiAiICsgdHJhbnNsYXRpb24sIHhfb2ZmLCB5X29mZik7CisJCQkJCX0KKwkJCQl9CisJCQkJcGcuZGlzcG9zZSgpOyAvLyBmbHVzaCBwYWdlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwam9iLmVuZCgpOworCisgICAgICAgIH0KKwl9CisJCisJcHVibGljIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisJCS8vIEluaXRpYWxpemUgY29tcG9uZW50cworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCWpMYWJlbFVudHJhbnNUaXRsZSAgICAgICAgPSBuZXcgSkxhYmVsKGJ1bmRsZS5uYW1lKTsKKwkJCXVudHJhbnNUYWJsZU1vZGVsICAgICAgICAgPSBuZXcgVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsKGJ1bmRsZSk7CisJCQlqVGFibGVVbnRyYW5zICAgICAgICAgICAgID0gbmV3IEpUYWJsZSh1bnRyYW5zVGFibGVNb2RlbCk7CisJCQlqU2Nyb2xsUGFuZVVudHJhbnNUYWJsZSAgID0gbmV3IEpTY3JvbGxQYW5lKGpUYWJsZVVudHJhbnMpOworCQorCQkJLy8gTG93ZXIgcGFuZWwgY29tcG9uZW50cworCQkJSlBhbmVsICBsb3dlclBhbmVsID0gbmV3IEpQYW5lbCgpOworCQkJSkJ1dHRvbiBkZWxldGVCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9kZWxldGVfcmVzb3VyY2UiKSk7CisJCQlKQnV0dG9uIHRyYW5zbGF0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX21hcmtfdHJhbnNsYXRlZCIpKTsKKwkJCUpCdXR0b24gcHJpbnRCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9wcmludF90YWJsZSIpKTsKKwkJCQorCQkJZGVsZXRlQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZGVsZXRlX3Jlc291cmNlX3RyaWdnZXIiKSkpOworCQkJdHJhbnNsYXRlQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fbWFya190cmFuc2xhdGVkX3RyaWdnZXIiKSkpOworCQkJbG93ZXJQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXVudHJhbnNfc2VsZWN0ZWRfcmVzb3VyY2VzX29wdGlvbnMiKSkpOworCQkJbG93ZXJQYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwyKSk7CisJCQkKKwkJCWpUYWJsZVVudHJhbnMuc2V0U2VsZWN0aW9uTW9kZShMaXN0U2VsZWN0aW9uTW9kZWwuU0lOR0xFX1NFTEVDVElPTik7CisJCQlqVGFibGVVbnRyYW5zLmFkZE1vdXNlTGlzdGVuZXIobGlzdGVuZXIpOworCQkJCisJCQlqTGFiZWxVbnRyYW5zVGl0bGUuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDE4KSk7CisJCQkKKwkJCS8vIEFkZCBhY3Rpb24gbGlzdGVuZXJzCisJCQlkZWxldGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlkZWxldGVTZWxlY3RlZFJlc291cmNlKCk7CisJCQkJfQorCQkJfSk7CisJCQl0cmFuc2xhdGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQltYXJrU2VsZWN0ZWRSZXNvdXJjZUFzVHJhbnNsYXRlZCgpOworCQkJCX0KKwkJCX0pOworCQkJcHJpbnRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlwcmludFRhYmxlKCk7CisJCQkJfQorCQkJfSk7CQorCQkJCisJCQlyZW1vdmVBbGwoKTsKKwkJCXNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJbG93ZXJQYW5lbC5hZGQoZGVsZXRlQnV0dG9uKTsKKwkJCWxvd2VyUGFuZWwuYWRkKHRyYW5zbGF0ZUJ1dHRvbik7CisJCQkvL2xvd2VyUGFuZWwuYWRkKHByaW50QnV0dG9uKTsKKwkJCWFkZChqTGFiZWxVbnRyYW5zVGl0bGUsIEJvcmRlckxheW91dC5OT1JUSCk7CisJCQlhZGQoalNjcm9sbFBhbmVVbnRyYW5zVGFibGUsIEJvcmRlckxheW91dC5DRU5URVIpOworCQkJYWRkKGxvd2VyUGFuZWwsIEJvcmRlckxheW91dC5TT1VUSCk7CisJCX0gZWxzZSBpZiAocmJtICE9IG51bGwpIHsKKwkJCQorCQkJaW50IGxhbmdDb3VudCA9IDA7ICAgICAgIC8vIFRoZSBudW1iZXIgb2YgbGFuZ3VhZ2VzIHdpdGggdW50cmFuc2xhdGVkIEl0ZW1zCisJCQlmb3IgKGludCBpPTA7IGkgPCByYm0uZ2V0QnVuZGxlcygpLnNpemUoKTsgaSsrKSB7CisJCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpcmJtLmdldEJ1bmRsZXMoKS5lbGVtZW50QXQoaSk7CisJCQkJaWYgKGJ1bmRsZS5nZXRVbnRyYW5zbGF0ZWRJdGVtc1NpemUoKSA+IDApIGxhbmdDb3VudCsrOworCQkJfQorCQkJCisJCQkvLyBJbml0aWFsaXplIHRoZSBjb21wb25lbnRzCisJCQltYWluUGFuZWxzICAgICAgICAgICAgICAgPSBuZXcgSlBhbmVsW2xhbmdDb3VudF07CisJCQludW1VbnRyYW5zTGFiZWxzICAgICAgICAgPSBuZXcgSkxhYmVsW2xhbmdDb3VudF07CisJCQlsaXN0U2Nyb2xscyAgICAgICAgICAgICAgPSBuZXcgSlNjcm9sbFBhbmVbbGFuZ0NvdW50XTsKKwkJCXVudHJhbnNMaXN0cyAgICAgICAgICAgICA9IG5ldyBKTGlzdFtsYW5nQ291bnRdOworCQkJCisJCQltYWluQm94ICAgICAgICAgICAgICAgICAgPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQkJbWFpblNjcm9sbCAgICAgICAgICAgICAgID0gbmV3IEpTY3JvbGxQYW5lKG1haW5Cb3gpOworCQkJakxhYmVsVW50cmFuc1RpdGxlICAgICAgID0gbmV3IEpMYWJlbChyYm0uZ2V0QmFzZUNsYXNzKCkgKyAiIC0gIiArIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidW50cmFuc2xhdGVkX2l0ZW1zIikpOworCQkJCisJCQkvLyBTZXQgY29tcG9uZW50IHByb3BlcnRpZXMKKwkJCWpMYWJlbFVudHJhbnNUaXRsZS5zZXRGb250KG5ldyBGb250KCJTYW5zU2VyaWYiLEZvbnQuUExBSU4sMTgpKTsKKwkJCW1haW5Cb3guYWRkKGpMYWJlbFVudHJhbnNUaXRsZSk7CisJCQkKKwkJCWludCBjb3VudCA9IDA7CisJCQlmb3IgKGludCBpPTA7IGkgPCByYm0uZ2V0QnVuZGxlcygpLnNpemUoKTsgaSsrKSB7CisJCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpcmJtLmdldEJ1bmRsZXMoKS5lbGVtZW50QXQoaSk7CisJCQkJaWYgKGJ1bmRsZS5nZXRVbnRyYW5zbGF0ZWRJdGVtc1NpemUoKSA+IDApIHsKKwkJCQkJbWFpblBhbmVsc1tjb3VudF0gPSBuZXcgSlBhbmVsKCk7CisJCQkJCW1haW5QYW5lbHNbY291bnRdLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJCQludW1VbnRyYW5zTGFiZWxzW2NvdW50XSA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNldW50cmFuc191bnRyYW5zX2NvdW50IikgKworCQkJCQkJCQkJCQkJCQkgYnVuZGxlLmdldFVudHJhbnNsYXRlZEl0ZW1zU2l6ZSgpKTsKKwkJCQkJLy8gVE9ETzogSW1wbGVtZW50IGEgTGlzdCBNb2RlbCBmb3IgdGhpcyBsaXN0LCByZW1vdmUgdXNlIG9mIHZlY3RvcgorCQkJCQl1bnRyYW5zTGlzdHNbY291bnRdID0gbmV3IEpMaXN0KGJ1bmRsZS5nZXRVbnRyYW5zbGF0ZWRJdGVtc0FzVmVjdG9yKCkpOworCQkJCQlsaXN0U2Nyb2xsc1tjb3VudF0gPSBuZXcgSlNjcm9sbFBhbmUodW50cmFuc0xpc3RzW2NvdW50XSk7CisJCQkJCQorCQkJCQltYWluUGFuZWxzW2NvdW50XS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoCisJCQkJCQkJCQkJCQlCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNldW50cmFuc19maWxlIikgKyAiICIgKyBidW5kbGUudG9TdHJpbmcoKSkpOworCQkJCQltYWluUGFuZWxzW2NvdW50XS5yZW1vdmVBbGwoKTsKKwkJCQkJbWFpblBhbmVsc1tjb3VudF0uYWRkKG51bVVudHJhbnNMYWJlbHNbY291bnRdLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworCQkJCQltYWluUGFuZWxzW2NvdW50XS5hZGQobGlzdFNjcm9sbHNbY291bnRdLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCQkJCisJCQkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJCQkJbWFpbkJveC5hZGQobWFpblBhbmVsc1tjb3VudF0pOworCQkJCQkKKwkJCQkJY291bnQrKzsKKwkJCQl9CisJCQl9CisJCQltYWluU2Nyb2xsLnNldFByZWZlcnJlZFNpemUoZ2V0U2l6ZSgpKTsKKwkJCXJlbW92ZUFsbCgpOworCQkJYWRkKG1haW5TY3JvbGwpOworCQl9IGVsc2UgeworCQkJcmVtb3ZlQWxsKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpIHsKKwkJLy8gVXBkYXRlIGNvbXBvbmVudHMKKwkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisJCQlqTGFiZWxVbnRyYW5zVGl0bGUuc2V0VGV4dChidW5kbGUubmFtZSk7CisJCQl1bnRyYW5zVGFibGVNb2RlbC5zZXRCdW5kbGUoYnVuZGxlKTsKKwkJfSBlbHNlIGlmIChyYm0gIT0gbnVsbCkgeworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfSBlbHNlIHsKKwkJCXJlbW92ZUFsbCgpOworCQl9CisJfQorfQorCisvKioKKyAqIFRoZSB0YWJsZSBtb2RlbCBmb3IgdW50cmFuc2xhdGVkIEl0ZW1zCisgKi8KKworY2xhc3MgVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsKKwlCdW5kbGUgYnVuZGxlOworCQorCXB1YmxpYyBVbnRyYW5zbGF0ZWRJdGVtc1RhYmxlTW9kZWwoQnVuZGxlIGJ1bmRsZSkgeworCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKwkJdGhpcy5idW5kbGUgPSBidW5kbGU7CisJCXVwZGF0ZSgpOworCX0KKwkKKwlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgeyByZXR1cm4gMzsgfQorCQkgICAgCisJcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKKwkJcmV0dXJuIGJ1bmRsZS5nZXRVbnRyYW5zbGF0ZWRJdGVtc1NpemUoKTsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3csIGludCBjb2wpIHsKKwkJQnVuZGxlSXRlbSBpdGVtID0gYnVuZGxlLmdldFVudHJhbnNsYXRlZEl0ZW0ocm93KTsKKwkJU3RyaW5nIHJldFN0ciA9IG51bGw7CisJCQkJCisJCXN3aXRjaChjb2wpIHsKKwkJY2FzZSAwOgorCQkJcmV0U3RyID0gaXRlbS5nZXRLZXkoKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlyZXRTdHIgPSBpdGVtLmdldFRyYW5zbGF0aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcmV0U3RyID0gKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSA9PSBudWxsID8gIiIgOiBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0TmFtZSgpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0U3RyID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJsZV9jZWxsX2Vycm9yIik7CisJCX0KKwkJCQkKKwkJcmV0dXJuIHJldFN0cjsKKwl9CisJCQkKKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbCkgeworCQlpZiAoY29sID09IDApIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdldW50cmFuc19jb2x1bW5fa2V5Iik7CisJCWVsc2UgaWYgKGNvbCA9PSAxKSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXVudHJhbnNfY29sdW1uX3RyYW5zbGF0aW9uIik7CisJCWVsc2UgaWYgKGNvbCA9PSAyKSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXVudHJhbnNfY29sdW1uX2dyb3VwIik7CisJCWVsc2UgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFibGVfY29sdW1uX2Vycm9yIik7CisJfQorCQorCXB1YmxpYyBCdW5kbGVJdGVtIGdldEJ1bmRsZUl0ZW0oaW50IHJvdykgeworCQlyZXR1cm4gYnVuZGxlLmdldFVudHJhbnNsYXRlZEl0ZW0ocm93KTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlmaXJlVGFibGVEYXRhQ2hhbmdlZCgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SZXNvdXJjZUNyZWF0aW9uRGlhbG9nLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1Jlc291cmNlQ3JlYXRpb25EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEyYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SZXNvdXJjZUNyZWF0aW9uRGlhbG9nLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibS5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKiBBIGRpYWxvZyBmb3IgY3JlYXRpbmcgbmV3IFJlc291cmNlIEZpbGVzCisgKi8KK2NsYXNzIFJlc291cmNlQ3JlYXRpb25EaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIHsKKwlSQk1hbmFnZXIgcmJtOworCVJCTWFuYWdlckdVSSBndWk7CisJCisJLy8gQ29tcG9uZW50cworCUJveCBtYWluQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwlCb3ggaW5mb0JveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJSlBhbmVsIGluZm9QYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwlKUGFuZWwgaW5mb1RpdGxlUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJSlBhbmVsIGluZm9Db21tZW50UGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJSlBhbmVsIGluZm9NYW5hZ2VyUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJSlBhbmVsIGxhbmdQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwlKUGFuZWwgY291blBhbmVsID0gbmV3IEpQYW5lbCgpOworCUpQYW5lbCB2YXJpUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJSlBhbmVsIGJ1dHRQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwkKKwlKTGFiZWwgaW5zdHJ1Y3Rpb25zTGFiZWwgPSBuZXcgSkxhYmVsKCIiKTsKKwlKTGFiZWwgdGl0bGVMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZmlsZV90aXRsZSIpKTsKKwlKTGFiZWwgY29tbWVudExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19maWxlX2NvbW1lbnQiKSk7CisJSkxhYmVsIG1hbmFnZXJMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZmlsZV9tYW5hZ2VyIikpOworCUpMYWJlbCBlbmMxTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2VuY29kaW5nIikpOworCUpMYWJlbCBlbmMyTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2VuY29kaW5nIikpOworCUpMYWJlbCBlbmMzTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2VuY29kaW5nIikpOworCUpMYWJlbCBuYW0xTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX25hbWUiKSk7CisJSkxhYmVsIG5hbTJMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfbmFtZSIpKTsKKwlKTGFiZWwgbmFtM0xhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19uYW1lIikpOworCQorCUpUZXh0RmllbGQgdGl0bGVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIGNvbW1lbnRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIG1hbmFnZXJGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIGVuYzFGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIGVuYzJGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIGVuYzNGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIG5hbTFGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIG5hbTJGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIG5hbTNGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwkKKwlKQ2hlY2tCb3ggY29weUNoZWNrQm94ID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19jaGVja2JveF9jb3B5X2VsZW1lbnRzIiksIHRydWUpOworCQorCUpCdXR0b24gY3JlYXRlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlIikpOworCUpCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY2FuY2VsIikpOworCQorCXB1YmxpYyBSZXNvdXJjZUNyZWF0aW9uRGlhbG9nKFJCTWFuYWdlciByYm0sIEpGcmFtZSBmcmFtZSwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsKSB7CisJCXN1cGVyKGZyYW1lLCB0aXRsZSwgbW9kYWwpOworCQl0aGlzLmd1aSA9IChSQk1hbmFnZXJHVUkpZnJhbWU7CisJCXRoaXMucmJtID0gcmJtOworCQlpbml0Q29tcG9uZW50cygpOworCQllbmFibGVFdmVudHMoQVdURXZlbnQuS0VZX0VWRU5UX01BU0spOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQgZXYpIHsKKwkJaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19FTlRFUikgeworCQkJYm9vbGVhbiBzdWNjZXNzID0gY3JlYXRlUmVzb3VyY2UoKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfY3JlYXRlX2ZpbGUiKSArICIgIiArCisJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl90cnlfYWdhaW5fZmlsZSIpOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQlkaXNwb3NlKCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZXYuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0NBTkNFTCkgeworCQkJY2xvc2VXaW5kb3coKTsKKwkJfQorCX0KKwkKKwlib29sZWFuIGNyZWF0ZVJlc291cmNlKCkgeworCQlpZiAocmJtID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJU3RyaW5nIGVuY29kaW5nID0gZW5jMUZpZWxkLmdldFRleHQoKS50cmltKCk7CisJCVN0cmluZyBlbmMyID0gZW5jMkZpZWxkLmdldFRleHQoKS50cmltKCk7CisJCWlmIChlbmMyICE9IG51bGwgJiYgIWVuYzIuZXF1YWxzKCIiKSkgZW5jb2RpbmcgKz0gIl8iICsgZW5jMjsKKwkJU3RyaW5nIGVuYzMgPSBlbmMzRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJaWYgKGVuYzMgIT0gbnVsbCAmJiAhZW5jMy5lcXVhbHMoIiIpKSBlbmNvZGluZyArPSAiXyIgKyBlbmMzOworCQlib29sZWFuIHJldCA9IHJibS5jcmVhdGVSZXNvdXJjZSh0aXRsZUZpZWxkLmdldFRleHQoKS50cmltKCksIGNvbW1lbnRGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCBtYW5hZ2VyRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwKKwkJCQkJCQllbmNvZGluZywgbmFtMUZpZWxkLmdldFRleHQoKS50cmltKCksIG5hbTJGaWVsZC5nZXRUZXh0KCkudHJpbSgpLAorCQkJCQkJCW5hbTNGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCBjb3B5Q2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKKwkJaWYgKHJldCkgeyAKKwkJCWd1aS51cGRhdGVEaXNwbGF5VHJlZSgpOworCQkJZ3VpLnVwZGF0ZVByb2plY3RUcmVlKCk7CisJCQlndWkudXBkYXRlUHJvamVjdFBhbmVscygpOworCQl9CisJCXJldHVybiByZXQ7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRDb21wb25lbnRzKCl7CisJCS8vIEVycm9yIGNoZWNrCisJCWlmIChyYm0gPT0gbnVsbCkgeworCQkJU3RyaW5nIGFsZXJ0ID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9ub19idW5kbGVfZm9yX2ZpbGUiKTsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJY2xvc2VXaW5kb3coKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKKwkJaW50IHRlbXBXaWR0aCA9IDE3NTsKKwkJRGltZW5zaW9uIGxhYmVsRGltID0gbmV3IERpbWVuc2lvbih0ZW1wV2lkdGgsIDMwKTsKKwkJdGl0bGVMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxhYmVsRGltKTsKKwkJY29tbWVudExhYmVsLnNldFByZWZlcnJlZFNpemUobGFiZWxEaW0pOworCQltYW5hZ2VyTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsYWJlbERpbSk7CisJCQorCQlpbmZvUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZmlsZV9pbmZvIikpKTsKKwkJbGFuZ1BhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2xhbmd1YWdlIikpKTsKKwkJY291blBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2NvdW50cnkiKSkpOworCQl2YXJpUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdmFyaWFudCIpKSk7CisJCQorCQl0aXRsZUZpZWxkLnNldENvbHVtbnMoMzApOworCQljb21tZW50RmllbGQuc2V0Q29sdW1ucygzMCk7CisJCW1hbmFnZXJGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJCisJCWVuYzFGaWVsZC5zZXRDb2x1bW5zKDMpOworCQllbmMyRmllbGQuc2V0Q29sdW1ucygzKTsKKwkJZW5jM0ZpZWxkLnNldENvbHVtbnMoMyk7CisJCW5hbTFGaWVsZC5zZXRDb2x1bW5zKDIwKTsKKwkJbmFtMkZpZWxkLnNldENvbHVtbnMoMjApOworCQluYW0zRmllbGQuc2V0Q29sdW1ucygyMCk7CisJCQorCQkvLyBTZXQgdXAgdGhlIGNvbXBvbmVudHMKKwkJaW5mb1RpdGxlUGFuZWwuYWRkKHRpdGxlTGFiZWwpOyBpbmZvVGl0bGVQYW5lbC5hZGQodGl0bGVGaWVsZCk7CisJCWluZm9Db21tZW50UGFuZWwuYWRkKGNvbW1lbnRMYWJlbCk7IGluZm9Db21tZW50UGFuZWwuYWRkKGNvbW1lbnRGaWVsZCk7CisJCWluZm9NYW5hZ2VyUGFuZWwuYWRkKG1hbmFnZXJMYWJlbCk7IGluZm9NYW5hZ2VyUGFuZWwuYWRkKG1hbmFnZXJGaWVsZCk7CisJCWluZm9Cb3guYWRkKGluZm9UaXRsZVBhbmVsKTsKKwkJaW5mb0JveC5hZGQoaW5mb0NvbW1lbnRQYW5lbCk7CisJCWluZm9Cb3guYWRkKGluZm9NYW5hZ2VyUGFuZWwpOworCQlpbmZvUGFuZWwuYWRkKGluZm9Cb3gpOworCQkKKwkJbGFuZ1BhbmVsLmFkZChlbmMxTGFiZWwpOyBsYW5nUGFuZWwuYWRkKGVuYzFGaWVsZCk7IGxhbmdQYW5lbC5hZGQobmFtMUxhYmVsKTsgbGFuZ1BhbmVsLmFkZChuYW0xRmllbGQpOworCQljb3VuUGFuZWwuYWRkKGVuYzJMYWJlbCk7IGNvdW5QYW5lbC5hZGQoZW5jMkZpZWxkKTsgY291blBhbmVsLmFkZChuYW0yTGFiZWwpOyBjb3VuUGFuZWwuYWRkKG5hbTJGaWVsZCk7CisJCXZhcmlQYW5lbC5hZGQoZW5jM0xhYmVsKTsgdmFyaVBhbmVsLmFkZChlbmMzRmllbGQpOyB2YXJpUGFuZWwuYWRkKG5hbTNMYWJlbCk7IHZhcmlQYW5lbC5hZGQobmFtM0ZpZWxkKTsKKwkJCisJCWJ1dHRQYW5lbC5hZGQoY3JlYXRlQnV0dG9uKTsgYnV0dFBhbmVsLmFkZChjYW5jZWxCdXR0b24pOworCQkKKwkJLy8gQWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcnMKKwkJY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCUpEaWFsb2cgZGlhbG9nID0gKEpEaWFsb2cpKChKQnV0dG9uKWV2LmdldFNvdXJjZSgpKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKwkJCQlkaWFsb2cuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKKwkJCX0KKwkJfSk7CisJCQorCQljcmVhdGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJUmVzb3VyY2VDcmVhdGlvbkRpYWxvZyBkaWFsb2cgPQorCQkJCQkoUmVzb3VyY2VDcmVhdGlvbkRpYWxvZykoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGRpYWxvZy5jcmVhdGVSZXNvdXJjZSgpOworCQkJCWlmICghc3VjY2VzcykgeworCQkJCQlTdHJpbmcgYWxlcnQgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2NyZWF0ZV9maWxlIikgKyAiICIgKworCQkJCQkJCQkgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3RyeV9hZ2Fpbl9maWxlIik7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGRpYWxvZywgYWxlcnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCQlkaWFsb2cuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCWdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihjcmVhdGVCdXR0b24pOworCQkKKwkJLy8gQ29tcGxldGUgdGhlIGNvbXBvbmVudCBsYXlvdXQKKwkJbWFpbkJveC5yZW1vdmVBbGwoKTsKKwkJLy9tYWluQm94LmFkZChpbnN0cnVjdGlvbnNMYWJlbCk7CisJCW1haW5Cb3guYWRkKGluZm9QYW5lbCk7CisJCW1haW5Cb3guYWRkKGxhbmdQYW5lbCk7CisJCW1haW5Cb3guYWRkKGNvdW5QYW5lbCk7CisJCW1haW5Cb3guYWRkKHZhcmlQYW5lbCk7CisJCW1haW5Cb3guYWRkKGNvcHlDaGVja0JveCk7CisJCW1haW5Cb3guYWRkKGJ1dHRQYW5lbCk7CisJCQorCQlzZXRMb2NhdGlvbihuZXcgamF2YS5hd3QuUG9pbnQoNTAsIDUwKSk7CisJCWdldENvbnRlbnRQYW5lKCkuYWRkKG1haW5Cb3gsIEJvcmRlckxheW91dC5DRU5URVIpOworCQl2YWxpZGF0ZVRyZWUoKTsKKwkJcGFjaygpOworCQlzZXRWaXNpYmxlKHRydWUpOworCQkvL3NldFJlc2l6YWJsZShmYWxzZSk7CisJfQorCQorCXZvaWQgY2xvc2VXaW5kb3coKSB7CisJCXNldFZpc2libGUoZmFsc2UpOworCQlkaXNwb3NlKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDAyN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjoyYWEyMjBjMmE3MzIyMzBjMWVmMjc5Mjk5NjY3Y2U3YjY5ODQ1ZDhhYmRjYmVlZWNlMmY1NDhkNTRmZWFmYjU5CitzaXplIDE2MTkKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9idW5kbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2J1bmRsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmZTM4YQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9idW5kbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjBkMDIyNjc1NDMwOTZiYTVkMmRkYzM0OTRkNDg4NzY5Y2ZjMTM5Njk4NjAwNDk0OTNkMzM5OTI3OGNiNDI0YWIKK3NpemUgMTA4NgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2NvdW50cnkuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2NvdW50cnkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTdhY2QKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fY291bnRyeS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MmZjZThlZTc5NjA5NmNiYzFhNmFmNmM0YzFjZTFhMzU3MTJkM2E1YWVlNGVkNTdiOWM0ZTNkNDY3N2RmZTlkZgorc2l6ZSA1NzYKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9maWxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9maWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ4ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2ZpbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjkxMmY5NDZlN2NiNGRjMjllYzUyZmUwODk1OTUxMWIxYmJmNTgyYmI0M2UyNTI3YTI0MzlmMTM3YjMxZmIzMGIKK3NpemUgMjg1CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fZ3JvdXAuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2dyb3VwLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDcxZGFkCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2dyb3VwLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo2ZjZkMjEyZjQ2ZGEwZWEyMDc2Y2RiY2QyMjM3NmIzZTczODA2Y2E0MWZjM2NkZTk1NTU2MDA4OWRlMmQ1MDA0CitzaXplIDM2OQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2l0ZW0uZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2l0ZW0uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmU3NjQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25faXRlbS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6ODBhYWEwOThiNWY3NmFiMjI1MzRlM2VlMTRjODBjYzI5ZmY0NjJmOTE0YzFlODdmZTUzNjgwODc5ODgwZmE5Ygorc2l6ZSAyMDAKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9sYW5ndWFnZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fbGFuZ3VhZ2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYTJlZTEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fbGFuZ3VhZ2UuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmNkZmQ1OGM4YWY5YzBiYjgzYjNmYWQ2OGU5MGM4ZDhmMGNhYmEyOGY1NzFlZDJhYzYyZDZhOGMzYzQ4NjAxOWYKK3NpemUgMTA3OApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX3Byb2plY3QuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX3Byb2plY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTIyMjkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fcHJvamVjdC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6YjFhOTFkM2VlNzkyYjFkMTliNWUzNGMwY2YzMjA3YjVmMGI3NDVmYjU1OTFjMmNiNTZjYTFlYWQ0ZDkwNWE3Yworc2l6ZSAyOTEKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl92YXJpYW50LmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl92YXJpYW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDAyYjQwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX3ZhcmlhbnQuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjRmZWQ2YTQ4OTgyMjhmZGNmOTdhOTgyZmY0M2E3OTAxNDkyOTliN2NhOTNmMmY0MmI0M2U0ZTRlYjU4ZGU2NzkKK3NpemUgNDUwCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vaW5zdGFsbC5iYXQgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGYzNzAxMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9pbnN0YWxsLmJhdApAQCAtMCwwICsxLDY0IEBACitAZWNobyBvZmYKKworcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCityZW0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKK3JlbSAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2NhbGwgY29tcGlsZS5iYXQgLU8KKworZWNobyAqIE1ha2luZyBEaXJlY3RvcmllcworCitta2RpciB6aXAKK2NkIHppcAorbWtkaXIgbGliCitta2RpciBkb2NzCitjZCBkb2NzCitta2RpciBJbWFnZXMKK2NkIEltYWdlcworbWtkaXIgU2NyZWVuc2hvdHMKK2NkIC4uCitta2RpciBUdXRvcmlhbAorbWtkaXIgVmlld3MKK2NkIC4uCitta2RpciBSZXBvcnRzCitjZCAuLgorCitlY2hvICogQ29weWluZyBGaWxlcworCitlY2hvICoqIENvcHlpbmcgQmF0Y2ggRmlsZXMgYW5kIFByb3BlcnRpZXMKKworY29weSBSQk1hbmFnZXIuamFyIHppcAorY29weSBSQlJlcG9ydGVyLmJhdCB6aXAKK2NvcHkgcmJtYW5hZ2VyX3NjYW5uZXIueG1sIHppcAorY29weSByZXNvdXJjZXNccHJlZmVyZW5jZXMucHJvcGVydGllcyB6aXAKK2F0dHJpYiAtciB6aXAvcHJlZmVyZW5jZXMucHJvcGVydGllcworCitlY2hvICoqIENvcHlpbmcgRG9jdW1lbnRhdGlvbgorCitjZCBkb2NzCitjb3B5ICouaHRtbCAuLlx6aXBcZG9jc1wKK2NkIEltYWdlcworY29weSAqLmdpZiAuLlwuLlx6aXBcZG9jc1xJbWFnZXNcCitjb3B5ICouanBnIC4uXC4uXHppcFxkb2NzXEltYWdlc1wKK2NkIFNjcmVlbnNob3RzCitjb3B5ICouZ2lmIC4uXC4uXC4uXHppcFxkb2NzXEltYWdlc1xTY3JlZW5zaG90c1wKK2NvcHkgKi5qcGcgLi5cLi5cLi5cemlwXGRvY3NcSW1hZ2VzXFNjcmVlbnNob3RzXAorY2QgLi5cLi5cVHV0b3JpYWwKK2NvcHkgKi5odG1sIC4uXC4uXHppcFxkb2NzXFR1dG9yaWFsXAorY2QgLi5cVmlld3MKK2NvcHkgKi5odG1sIC4uXC4uXHppcFxkb2NzXFZpZXdzXAorY2QgLi5cLi4KKworZWNobyAqKiBDb3B5aW5nIEphciBGaWxlcworCitjZCBsaWIKK2NvcHkgKi5qYXIgLi5cemlwXGxpYlwKK2NkIC4uCisKK2VjaG8gKiogQ29weWluZyBMaWNlbnNlCitjb3B5IC4uXC4uXC4uXGxpY2Vuc2UuaHRtbCB6aXAKKworQGVjaG8gKiBEaXJlY3RvcnkgY3JlYXRlZDogemlwCitAZWNobyAqKiBEb24ndCBmb3JnZXQgdG8gbW9kaWZ5IHByZWZlcmVuY2VzLnByb3BlcnRpZXMKK3BhdXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL21hbmlmZXN0LnN0dWIgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vbWFuaWZlc3Quc3R1YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzY3NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL21hbmlmZXN0LnN0dWIKQEAgLTAsMCArMSwxMiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitTcGVjaWZpY2F0aW9uLVRpdGxlOiBSZXNvdXJjZSBCdW5kbGUgTWFuYWdlcgorU3BlY2lmaWNhdGlvbi1WZXJzaW9uOiAwLjcuMQorU3BlY2lmaWNhdGlvbi1WZW5kb3I6IElCTSBDb3Jwb3JhdGlvbgorSW1wbGVtZW50YXRpb24tVGl0bGU6IFJlc291cmNlIEJ1bmRsZSBNYW5hZ2VyCitJbXBsZW1lbnRhdGlvbi1WZXJzaW9uOiAwLjcuMQorSW1wbGVtZW50YXRpb24tVmVuZG9yOiBJQk0gQ29ycG9yYXRpb24KK0ltcGxlbWVudGF0aW9uLVZlbmRvci1JZDogY29tLmlibQorTWFpbi1DbGFzczogY29tLmlibS5yYm0uUkJNYW5hZ2VyCitDbGFzcy1QYXRoOiBsaWIveGVyY2VzLmphcgorCitOYW1lOiBjb20vaWJtL3JibQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3ByZWZlcmVuY2VzLnByb3BlcnRpZXMgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcHJlZmVyZW5jZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNmZTgwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3ByZWZlcmVuY2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorI1JCTWFuYWdlciBQcmVmZXJlbmNlcworI0ZyaSBNYXkgMTAgMDg6NTc6MTkgUERUIDIwMDIKK3JlcG9ydGVyX2Zvcm1hdF9odG1sX2ZpbGU9cmVwb3J0Lmh0bWwKK3VzZXJuYW1lPVVua25vd24KK3JlcG9ydGVyX2Zvcm1hdF90ZXh0X2RldGFpbD1IaWdoCityZXBvcnRlcl9mb3JtYXRfeG1sX2RldGFpbD1IaWdoCityZXBvcnRlcl9mb3JtYXRfaG10bF9lbmFibGVkPVllcworcmVwb3J0ZXJfZW5hYmxlZD1ZZXMKK3JlcG9ydGVyX2Zvcm1hdF94bWxfZmlsZT1yZXBvcnQueG1sCityZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2hvdXI9MQorcmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF92YWx1ZT0xCityZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsX3VuaXRzPUhvdXJzCityZXBvcnRlcl9wZXJmb3JtX3NjYW49WWVzCityZXBvcnRlcl9mb3JtYXRfdGV4dF9maWxlPXJlcG9ydC50eHQKK3JlcG9ydGVyX2Zvcm1hdF94bWxfZW5hYmxlZD1ZZXMKK3JlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfZGF5PVNhdHVyZGF5Citsb2NhbGU9ZW4KK3JlcG9ydGVyX2ludGVydmFsPVNlcXVlbnRpYWwKK3JlY2VudGZpbGVsb2MzPQorcmVjZW50ZmlsZWxvYzI9CityZWNlbnRmaWxlbG9jMT0KK3JlY2VudGZpbGVsb2MwPQorcmVwb3J0ZXJfc2Nhbl9maWxlPS4vcmJtYW5hZ2VyX3NjYW5uZXIueG1sCityZXBvcnRlcl9mb3JtYXRfaHRtbF9lbmFibGVkPVllcworcmVjZW50ZmlsZWlkMz0KK3JlY2VudGZpbGVpZDI9CityZWNlbnRmaWxlaWQxPQorcmVjZW50ZmlsZWlkMD0KK3JlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfbWludXRlPTAwCityZXBvcnRlcl9mb3JtYXRfdGV4dF9lbmFibGVkPVllcworcmVwb3J0ZXJfYmFzZV9jbGFzc19maWxlPQorcmVwb3J0ZXJfb3V0cHV0X2RpcmVjdG9yeT0KK3JlcG9ydGVyX2Zvcm1hdF9odG1sX2RldGFpbD1IaWdoCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmJtYW5hZ2VyX3NjYW5uZXIueG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3JibWFuYWdlcl9zY2FubmVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2RhYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3JibWFuYWdlcl9zY2FubmVyLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiID8+IAorPFJCRmlsZVNjYW5uZXIgbmFtZT0iUkJNYW5hZ2VyIFNjYW5uZXIiIGZpbGVuYW1lPSJyYm1hbmFnZXJfc2Nhbm5lci54bWwiPgorCTxGaWxlUnVsZXM+CisJCTwhLS0gIEZpbGVSdWxlcyBjYW4gaGF2ZSBhdHRyaWJ1dGVzIHN0YXJ0c193aXRoLCBlbmRzX3dpdGgsIGFuZCBjb250YWlucyAtLT4gCisJCTxGaWxlUnVsZSBuYW1lPSJKYXZhIEZpbGUiIGVuZHNfd2l0aD0iLmphdmEiIC8+IAorCQk8RmlsZVJ1bGUgbmFtZT0iWFNMIEZpbGUiIGVuZHNfd2l0aD0iLnhzbCIgLz4gCisJPC9GaWxlUnVsZXM+CisJPFBhcnNlUnVsZXM+CisJCTwhLS0gIFBhcnNlUnVsZXMgY2FuIGhhdmUgYXR0cmlidXRlcyBmb2xsb3dzIGFuZCBwcmVjZWRlcyAtLT4gCisJCTxQYXJzZVJ1bGUgbmFtZT0iSmF2YSBzdGF0aWMgcmVzb3VyY2UiIGZvbGxvd3M9IlJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigmcXVvdDsiIHByZWNlZGVzPSImcXVvdDsiIC8+CisJPC9QYXJzZVJ1bGVzPgorCTxTY2FuPgorCQk8RGlyZWN0b3J5IGxvY2F0aW9uPSIuIiByZWN1cnNlX2RpcmVjdG9yaWVzPSJ0cnVlIj4KKwkJCTxSdWxlcz4KKwkJCQk8QXBwbHlGaWxlUnVsZSBuYW1lPSJKYXZhIEZpbGUiPgorCQkJCQk8QXBwbHlQYXJzZVJ1bGUgbmFtZT0iSmF2YSBzdGF0aWMgcmVzb3VyY2UiIC8+CisJCQkJPC9BcHBseUZpbGVSdWxlPgorCQkJPC9SdWxlcz4KKwkJPC9EaXJlY3Rvcnk+CisJPC9TY2FuPgorPC9SQkZpbGVTY2FubmVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZWFkbWUudHh0IGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZjFlOAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBSQk1hbmFnZXIgKFJlc291cmNlIEJ1bmRsZSBNYW5hZ2VyKQorCitUbyBydW4gdGhlIFJCTWFuYWdlci5qYXIsIGRvdWJsZSBjbGljayBvbiBSQk1hbmFnZXIuamFyIGluIFdpbmRvd3MKKwlvciBydW4gImphdmEgLWphciBSQk1hbmFnZXIuamFyIiBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCitUbyBjcmVhdGUgdGhlIFJCTWFuYWdlci5qYXIgZmlsZSwgdXNlOiBjb21waWxlLmJhdAorVG8gY3JlYXRlIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCB1c2U6IGluc3RhbGwuYmF0CisKK0hlbHAgYW5kIGRvY3VtZW50YXRpb24gYXJlIGNvbnRhaW5lZCBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuCisKK1RoaXMgdmVyc2lvbiBvZiB0aGUgUkJNYW5hZ2VyIHJlcXVpcmVzIHZlcnNpb24gMy4xLjAgb2YgdGhlCit4ZXJjZXMuamFyIGZpbGUgdG8gY29tcGlsZSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgaXQgZm9yIGJhc2ljCitmdW5jdGlvbmFsaXR5LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyLnByb3BlcnRpZXMgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkY2I2NDgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTIxMyBAQAorIyBAZmlsZSAgICAgICAgICBSZXNvdXJjZSBCdW5kbGUgTWFuYWdlciBCYXNlIENsYXNzCisjIEBmaWxlRW5jb2RpbmcgIAorIyBAZmlsZUxhbmd1YWdlICBFbmdsaXNoCisjIEBmaWxlQ291bnRyeSAgIFUuUy4KKyMgQGZpbGVWYXJpYW50ICAgCisjIEBmaWxlTWFuYWdlciAgIEphcmVkIEphY2tzb24KKyMgQGZpbGVDb21tZW50ICAgVGhpcyBpcyB0aGUgQmFzZSBDbGFzcyBvZiB0aGUgdHJhbnNsYXRpb24gcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbgorCisKKyMKKyMgQGdyb3VwIEJhc2UgQ2xhc3MgR3JvdXBzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbiBJdGVtcyBmb3IgdGhlIEJhc2UgQ2xhc3MgR3JvdXAgdGFiYmVkIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX2NvbW1lbnQ9R3JvdXBcIENvbW1lbnRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX25hbWU9R3JvdXBcIE5hbWVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX29wdGlvbnM9UmVzb3VyY2VcIEdyb3VwXCBPcHRpb25zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitiYXNlZ3JvdXBfaXRlbV9vcHRpb25zPVJlc291cmNlXCBJdGVtXCBPcHRpb25zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZmlsZV9ncm91cD1SZXNvdXJjZVwgRmlsZXMKKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBTdGF0aXN0aWNzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBBbGwgdHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGFwcGVhcmluZyBvbiB0aGUgc3RhdGlzdGljcyBwYW5lIGZvciB0aGUgYmFzZSBjbGFzcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZHVwbGljYXRlc19jb3VudD1OdW1iZXJcIG9mXCBEdXBsaWNhdGVcIFJlc291cmNlXCBLZXlzXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19maWxlX2NvdW50PU51bWJlclwgb2ZcIFJlc291cmNlXCBGaWxlc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZ3JvdXBfY291bnQ9TnVtYmVyXCBvZlwgUmVzb3VyY2VcIEdyb3Vwc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZ3JvdXBfZ3JvdXA9UmVzb3VyY2VcIEdyb3VwcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2l0ZW1fY291bnQ9TnVtYmVyXCBvZlwgUmVzb3VyY2VcIEl0ZW1zXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19pdGVtX2dyb3VwPVJlc291cmNlXCBJdGVtcworCisjCisjIEBncm91cCBCYXNlIENsYXNzIFVudHJhbnNsYXRlZCBJdGVtcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGFwcGVhcmluZyBvbiB0aGUgQmFzZSBDbGFzcyBVbnRyYW5zbGF0ZWQgSXRlbXMgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgZmlsZSBiZWluZyB2aWV3ZWQKK2Jhc2V1bnRyYW5zX2ZpbGU9RmlsZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHJlc291cmNlIGl0ZW1zIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBmaWxlCitiYXNldW50cmFuc191bnRyYW5zX2NvdW50PU51bWJlclwgb2ZcIFVudHJhbnNsYXRlZFwgSXRlbXNcOgorCisjCisjIEBncm91cCBCdXR0b24gTmFtZXMKKyMKKyMgQGdyb3VwQ29tbWVudCBUaGUgbmFtZXMgZGlzcGxheWVkIG9uIHRoZSB2YXJpb3VzIGJ1dHRvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgbGFuZ3VhZ2UgZmlsZQorYnV0dG9uX2FkZF9maWxlPUFkZFwgYVwgTmV3XCBSZXNvdXJjZVwgRmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9hZGRfZmlsZV90cmlnZ2VyPW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCitidXR0b25fYWRkX2dyb3VwPUFkZFwgYVwgTmV3XCBSZXNvdXJjZVwgR3JvdXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2dyb3VwX3RyaWdnZXI9ZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgdHJhbnNsYXRpb24gaXRlbQorYnV0dG9uX2FkZF9yZXNvdXJjZT1BZGRcIGFcIE5ld1wgUmVzb3VyY2VcIEl0ZW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX3Jlc291cmNlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgYSBAbW9kaWZpZXIgYQorIyBAY29tbWVudCBHZW5lcmljIGJ1dHRvbiBmb3IgY2FuY2VsaW5nIGFjdGlvbnMKK2J1dHRvbl9jYW5jZWw9Q2FuY2VsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciBhIGNob2ljZSBvciBzZWxlY3Rpb24gb3B0aW9uCitidXR0b25fY2hvb3NlPUNob29zZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jaG9vc2VfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBnZW5lcmljIGNyZWF0aW9uIG9mIGdyb3VwcywgaXRlbXMsIGZpbGVzLCBldGMuCitidXR0b25fY3JlYXRlPUNyZWF0ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgYSBAbW9kaWZpZXIgYQorIyBAY29tbWVudCBGb3IgY3JlYXRpb24gb2YgYSByZXNvdXJjZSBncm91cAorYnV0dG9uX2NyZWF0ZV9ncm91cD1DcmVhdGVcIEdyb3VwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9ncm91cF90cmlnZ2VyPWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTAyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBjcmVhdGluZyBhbiBpdGVtIHRoZW4gY29udGludWluZyBjcmVhdGluZyBtb3JlIGl0ZW1zCitidXR0b25fY3JlYXRlX21vcmU9Q3JlYXRlXCAmXCBDb250aW51ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfbW9yZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIGEgQG1vZGlmaWVyIGEKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIHJlc291cmNlIHRyYW5zbGF0aW9uIGl0ZW0KK2J1dHRvbl9jcmVhdGVfcmVzb3VyY2U9Q3JlYXRlXCBSZXNvdXJjZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfcmVzb3VyY2VfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIGEgQG1vZGlmaWVyIGEKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciByZW1vdmluZyBhIGdyb3VwIGFuZCBpdHMgY29udGVudHMKK2J1dHRvbl9kZWxldGVfZ3JvdXA9RGVsZXRlXCBHcm91cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgYSBAbW9kaWZpZXIgYQorIyBAY29tbWVudCBCdXR0b24gZm9yIHBlcm1hbmVudGx5IHJlbW92aW5nIGEgcmVzb3VyY2UgZnJvbSB0aGUgYnVuZGxlCitidXR0b25fZGVsZXRlX3Jlc291cmNlPURlbGV0ZVwgUmVzb3VyY2UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fZGVsZXRlX3Jlc291cmNlX3RyaWdnZXI9ZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEdlbmVyaWMgZWRpdCBidXR0b24KK2J1dHRvbl9lZGl0PUVkaXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIGEgQG1vZGlmaWVyIGEKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBlZGl0aW5nIGdyb3VwIG5hbWUgYW5kIGNvbW1lbnQKK2J1dHRvbl9lZGl0X2dyb3VwPUVkaXRcIEdyb3VwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBhIEBtb2RpZmllciBhCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyByZXNvdXJjZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGtleSBhbmQgdHJhbnNsYXRpb24KK2J1dHRvbl9lZGl0X3Jlc291cmNlPUVkaXRcIFJlc291cmNlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2VkaXRfcmVzb3VyY2VfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3IgaW5pdGlhdGluZyBhbiBpbXBvcnQgb2YgcmVzb3VyY2VzIGZyb20gYW4gYWx0ZXJuYXRlIHNvdXJjZQorYnV0dG9uX2ltcG9ydD1JbXBvcnQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25faW1wb3J0X3RyaWdnZXI9aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gYWxsb3dzIGEgc2VsZWN0ZWQgcmVzb3VyY2UgdG8gYmUgbWFya2VkIGFzIHRyYW5zbGF0ZWQgd2l0aG91dCBmdXJ0aGVyIGVkaXRpbmcKK2J1dHRvbl9tYXJrX3RyYW5zbGF0ZWQ9TWFya1wgUmVzb3VyY2VcIGFzXCBUcmFuc2xhdGVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX21hcmtfdHJhbnNsYXRlZF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBhZGRpbmcgdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRvIHRoZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9hZGQ9QWRkXCBDdXJyZW50XCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9hZGRfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY2xvc2luZyB0aGUgcHJvamVjdCB3aW5kb3cKK2J1dHRvbl9wcm9qZWN0X2Nsb3NlPUNsb3NlXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfY2xvc2VfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK2J1dHRvbl9wcm9qZWN0X25ldz1OZXdcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9uZXdfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3Igb3BlbmluZyBhIHByb2plY3QgZmlsZQorYnV0dG9uX3Byb2plY3Rfb3Blbj1PcGVuXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3Rfb3Blbl90cmlnZ2VyPW8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciByZW1vdmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlIGJ1bmRsZSBmcm9tIHRoZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9yZW1vdmU9UmVtb3ZlXCBTZWxlY3Rpb24KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9yZW1vdmVfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY2F1c2luZyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgYnVuZGxlIHRvIGJlIHRoZSBvbmUgYmVpbmcgZWRpdGVkIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uCitidXR0b25fcHJvamVjdF9zZWxlY3Q9RWRpdFwgU2VsZWN0ZWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9zZWxlY3RfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwZXJmb3JtaW5nIGEgY29tcGxldGUgc2VhcmNoCitidXR0b25fc2VhcmNoX2ZpbmRfYWxsPUZpbmRcIEFsbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9zZWFyY2hfZmluZF9hbGxfdHJpZ2dlcj1mCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwZXJmb3JtaW5nIGNvbXBsZXRlIHNlYXJjaCBhbmQgcmVwbGFjZQorYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbD1SZXBsYWNlXCBBbGwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fc2VhcmNoX3JlcGxhY2VfYWxsX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciB1cGRhdGluZyBpbmZvcm1hdGlvbgorYnV0dG9uX3VwZGF0ZT1VcGRhdGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fdXBkYXRlX3RyaWdnZXI9dQorCisjCisjIEBncm91cCBEaWFsb2dzCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb25zIHZhcmlvdXMgZGlhbG9nIGJveGVzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHdldGhlciBvciBub3QgYSBuZXcgZmlsZSB3aWxsIGJlIHBvcHVsYXRlZCBmcm9tIHRoZSBlbGVtZW50cyBpbiB0aGUgYmFzZSBjbGFzcworZGlhbG9nX2NoZWNrYm94X2NvcHlfZWxlbWVudHM9Q29weVwgZW50cmllc1wgZnJvbVwgdGhlXCBiYXNlXCBjbGFzc1wgdG9cIHRoZVwgbmV3XCBmaWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdG9yIG9mIHdldGhlciBhbiBpdGVtIGlzIHRyYW5zbGF0ZWQgb3Igbm90CitkaWFsb2dfY2hlY2tib3hfdHJhbnNsYXRlZD1UcmFuc2xhdGVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfY29tbWVudD1Db21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19jb3VudHJ5PUNvdW50cnkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19jcmVhdGVkPUNyZWF0ZWRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2NyZWF0b3I9Q3JlYXRlZFwgQnlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEB7MX0gVGhlIGRhdGUKKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIGludm9sdmVkCisjIEBjb21tZW50IFRoZSBkYXRlIGFuZCBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGEgY3JlYXRpb24gb3IgbW9kaWZpY2F0aW9uIG9mIGFuIGl0ZW0KK2RpYWxvZ19kYXRlX3BlcnNvbj17MH1cIGJ5XCB7MX0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWZhdWx0X2NvbW1lbnQ9RGVmYXVsdFwgQ29tbWVudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVmYXVsdF90cmFuc2xhdGlvbj1EZWZhdWx0XCBUcmFuc2xhdGlvblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVsZXRlX2ZpbGU9RGVsZXRlXCBhXCBSZXNvdXJjZVwgRmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9ncm91cD1EZWxldGVcIGFcIFJlc291cmNlXCBHcm91cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9pdGVtPURlbGV0ZVwgYVwgUmVzb3VyY2VcIEl0ZW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgV2FybmluZyBkaXNwbGF5ZWQgd2hlbiBhIHVzZXIgYXNrcyBmb3IgYSBkZWxldGlvbiBvZiBhIGZpbGUuIFByb21wdHMgZm9yICdZZXMnIG9yICdObycKK2RpYWxvZ19kZWxldGVfd2FybmluZz1XYXJuaW5nXCFcIFRoZVwgZGVsZXRpb25cIG9wZXJhdGlvblwgY2FuXCBub1wgYmVcIHVuZG9uZS5cbkFyZVwgeW91XCBzdXJlXCB5b3VcIHdhbnRcIHRvXCBjb250aW51ZT8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19lbmNvZGluZz1FbmNvZGluZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9jb21tZW50PVJlc291cmNlXCBGaWxlXCBDb21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbj1CYXNlXCBDbGFzc1wgUHJvcGVydHlcIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERlc2NyaXB0aW9uIG9mIEZpbGUgRmlsdGVyIGZvciBSQlJlcG9ydGVyIFhNTCBzY2FuIGNvbmZpZ3VyYXRpb24gZmlsZXMKK2RpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbl9zY2FuPVhNTFwgUkJSZXBvcnRlclwgU2NhblwgRmlsZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX2luZm89RmlsZVwgSW5mb3JtYXRpb24KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX21hbmFnZXI9UmVzb3VyY2VcIE1hbmFnZXJcIE5hbWVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfdGl0bGU9UmVzb3VyY2VcIEZpbGVcIFRpdGxlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19ncm91cD1Hcm91cFwgTmFtZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZ3JvdXBfY29tbWVudD1Hcm91cFwgQ29tbWVudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfa2V5PUVudHJ5XCBLZXlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2xhbmd1YWdlPUxhbmd1YWdlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfbG9va3Vwcz1Mb29rdXBzXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19tb2RpZmllZD1MYXN0XCBNb2RpZmllZFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfbW9kaWZpZXI9TGFzdFwgTW9kaWZpZWRcIEJ5XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgbmFtZSBvZiBhIGxhbmd1YWdlLCBjb3VudHJ5LCBvciB2YXJpYW50IG9mIGEgbGFuZ3VhZ2UgZmlsZQorZGlhbG9nX25hbWU9TmFtZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG5hbWUgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUsIGJlZm9yZSBjcmVhdGluZyB0aGF0IGJ1bmRsZQorZGlhbG9nX25ld19iYXNlY2xhc3M9UGxlYXNlXCBlbnRlclwgYVwgYmFzZVwgY2xhc3NcIG5hbWVcIGZvclwgdGhlXCBuZXdcIHJlc291cmNlXCBidW5kbGUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERpYWxvZyBwb3B1cCB3aW5kb3cgdGV4dCBwcm9tcHRpbmcgdGhlIHVzZXIgZm9yIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK2RpYWxvZ19uZXdfcHJvamVjdD1QbGVhc2VcIGVudGVyXCBhXCB0aXRsZVwgZm9yXCB5b3VyXCBuZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZXMgbWFraW5nIGl0IHRocm91Z2ggdGhlIGZpbHRlciB1cG9uIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUKK2RpYWxvZ19vcGVuX2ZpbGVfZmlsdGVyPUJhc2VcIENsYXNzXCBQcm9wZXJ0eVwgRmlsZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGlzIGlzIGEgc2VjdGlvbiBoZWFkaW5nIGZvciBzZXR0aW5nIHRoZSBsb2NhbGUKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGU9TG9jYWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgTG9jYWxlcyBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGUgcHJvcGVydGllcyBmaWxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX2RlZmluZWQ9RGVmaW5lZFwgZm9yXCBSQk1hbmFnZXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfaXNvPUlTT1wgU3RhbmRhcmRzXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBMb2NhbGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBKYXZhIFZpcnR1YWwgTWFjaGluZQorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9tYWNoaW5lPU1hY2hpbmVcIFN1cHBvcnRlZFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV93YXJuaW5nPU5PVEVcOlwgTG9jYWxlXCBjaGFuZ2VzXCBhcmVcIG5vdFwgYXBwbGllZFwgdW50aWxcIGFwcGxpY2F0aW9uXCBpc1wgcmVzdGFydGVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9va2FuZGZlZWw9TG9va1wgQW5kXCBGZWVsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc191c2VybmFtZT1Vc2VyXCBOYW1lXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGVzY3JpcHRvciB0aGF0IGdvZXMgaW50byBHVUkgZmlsZSBjaG9vc2VyCitkaWFsb2dfcHJvamVjdF9maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbj1SQk1hbmFnZXJcIFByb2plY3RcIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEZpbGUgRmlsdGVyIGRlc2NyaXB0aW9uIGZvciByZXNvdXJjZSBidW5kbGUgcHJvamVjdCBmaWxlcworZGlhbG9nX3Byb2plY3RfZmlsdGVyX2Rlc2NyaXB0aW9uPVJlc291cmNlXCBCdW5kbGVcIFByb2plY3RzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gdGhhdCBubyBwcm9qZWN0IGlzIG9wZW4sIHBsYWNlZCBpbiB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aGVyZSB0aGUgcHJvamVjdCBuYW1lIHdvdWxkIG5vcm1hbGx5IGdvCitkaWFsb2dfcHJvamVjdF9ub25lX3NlbGVjdGVkPU5vXCBBY3RpdmVcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdAorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIHdpbmRvdyBzaG93aW5nIGFsbCB0aGUgcmVzb3VyY2UgYnVuZGxlcyBpbiBhIHByb2plY3QKK2RpYWxvZ19wcm9qZWN0X3RpdGxlPVJlc291cmNlXCBCdW5kbGVcIFByb2plY3RcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgUHJvbXB0cyB0aGUgdXNlciBpZiB0aGV5IHdvdWxkIGxpa2UgdG8gc2F2ZSBjaGFuZ2VzIGJlZm9yZSBleGl0aW5nCitkaWFsb2dfcXVpdF9zYXZlPVdvdWxkXCB5b3VcIGxpa2VcIHRvXCBzYXZlXCB5b3VyXCBjaGFuZ2VzXCBiZWZvcmVcIHF1aXRpbmdcIFJCTWFuYWdlcj8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQSBnZW5lcmljIHByb3BtcHQgdG8gYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2lzaCB0byBzYXZlIGNoYW5nZXMKK2RpYWxvZ19zYXZlPVdvdWxkXCB5b3VcIGxpa2VcIHRvXCBzYXZlXCB5b3VyXCBjaGFuZ2VzXCB0b1wgdGhlXCByZXNvdXJjZVwgYnVuZGxlPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3NlYXJjaF9vcHRpb25zPVNlYXJjaFwgT3B0aW9ucworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3NlYXJjaF9wYXJhbT1TZWFyY2hcIEZvclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIHRpdGxlIG9mIHRoZSBhYm91dCBkaWFsb2cgYm94CitkaWFsb2dfdGl0bGVfYWJvdXRfcmJtYW5hZ2VyPUFib3V0XCBSQk1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAxLTIyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGRpYWxvZyBwcm9tcHRpbmcgZm9yIGRlbGV0aW9uIG9mIGFuIGVudGlyZSByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX2RlbGV0ZV9ncm91cD1EZWxldGVcIFJlc291cmNlXCBHcm91cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjIgQG1vZGlmaWVkIDIwMDEtMDEtMjIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSB3aGVuIHByb21wdGluZyB0byBkZWxldGUgYSByZXNvdXJjZQorZGlhbG9nX3RpdGxlX2RlbGV0ZV9pdGVtPURlbGV0ZVwgUmVzb3VyY2UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lZGl0X2dyb3VwPUVkaXRcIGFcIFJlc291cmNlXCBHcm91cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2VkaXRfaXRlbT1FZGl0XCBhXCBSZXNvdXJjZVwgSXRlbQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lcnJvcj1FcnJvcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2Vycm9yX2NyZWF0aW5nX2J1bmRsZT1FcnJvclwgQ3JlYXRpbmdcIFJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAxLTIyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIHdoZW4gb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZSBub3QgY3JlYXRlZCBieSBSQk1hbmFnZXIKK2RpYWxvZ190aXRsZV9lcnJvcl9ub3RfcmJtYW5hZ2VyX2Zvcm1hdD1FcnJvclw6XCBVbnJlYWRhYmxlXCBSZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRpdGxlIG9uIGEgd2FybmluZyBkaWFsb2cgdGhhdCBJL08gbWFsZnVuY3Rpb25lZCBvcGVuaW5nIGEgZmlsZQorZGlhbG9nX3RpdGxlX2Vycm9yX29wZW5pbmdfZmlsZT1FcnJvclwgT3BlbmluZ1wgRmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgZm9yIGEgZGlhbG9nIGJveCBmb3IgZW50ZXJpbmcgc3BlY2lhbCBwYXJhbWV0ZXJzIG5lZWRlZCB0byBleHBvcnQgYSByZXNvdXJjZSBidW5kbGUgdG8gamF2YSBjbGFzcyBjb2RlCitkaWFsb2dfdGl0bGVfZXhwb3J0X2phdmFfb3B0aW9ucz1FeHBvcnRcIFBhcmFtZXRlcnNcOlwgSmF2YVwgY2xhc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGEgZGlhbG9nIHdpdGggYSBwcm9ncmVzcyBiYXIgZ292ZXJuaW5nIGltcG9ydCBzdGF0dXMKK2RpYWxvZ190aXRsZV9pbXBvcnRfcHJvZ3Jlc3M9SW1wb3J0XCBQcm9ncmVzcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBuZXcgYnVuZGxlCitkaWFsb2dfdGl0bGVfbmV3X2J1bmRsZT1DcmVhdGVcIGFcIE5ld1wgUmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBmaWxlCitkaWFsb2dfdGl0bGVfbmV3X2ZpbGU9Q3JlYXRlXCBhXCBOZXdcIFJlc291cmNlXCBGaWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCitkaWFsb2dfdGl0bGVfbmV3X2dyb3VwPUNyZWF0ZVwgYVwgTmV3XCBSZXNvdXJjZVwgR3JvdXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2UKK2RpYWxvZ190aXRsZV9uZXdfaXRlbT1DcmVhdGVcIGFcIE5ld1wgUmVzb3VyY2VcIEl0ZW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGl0bGUgb2YgdGhlIGRpYWxvZyBib3ggc2hvd2luZyB3aGVuIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKK2RpYWxvZ190aXRsZV9uZXdfcHJvamVjdD1OZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9wcmVmZXJlbmNlcz1QcmVmZXJlbmNlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRpdGxlIGZvciBjb25maXJtaW5nIGV4aXQgZnJvbSBhcHBsaWNhdGlvbgorZGlhbG9nX3RpdGxlX3F1aXQ9UXVpdFwgUkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfc2VhcmNoPVNlYXJjaAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX3VzZXJfbmFtZT1FbnRlclwgVXNlclwgTmFtZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3RyYW5zbGF0aW9uPVRyYW5zbGF0aW9uXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ191c2VyX25hbWU9UGxlYXNlXCBlbnRlclwgeW91clwgbmFtZS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ192YXJpYW50PVZhcmlhbnQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ193YXJuaW5nX2RlbGV0ZV9ncm91cD1EZWxldGluZ1wgdGhpc1wgZ3JvdXBcIHdpbGxcIGNhdXNlXCBhbGxcIGl0ZW1zXCBpblwgdGhlXCBncm91cFwgdG9cIGJlXCBwZXJtYW5lbnRseVwgcmVtb3ZlZC5cIERvXCB5b3VcIHdpc2hcIHRvXCBjb250aW51ZT8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ193YXJuaW5nX2RlbGV0ZV9pdGVtPURlbGV0aW5nXCB0aGVcIHJzb3VyY2VcIGl0ZW1cIHdpbGxcIGNhdXNlXCBpdFwgdG9cIGJlXCBwZXJtYW5lbnRseVwgcmVtb3ZlZC5cIERvXCB5b3VcIHdpc2hcIHRvXCBjb250aW51ZT8KKworIworIyBAZ3JvdXAgRXJyb3IgTWVzc2FnZXMKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZXJyb3I9RXJyb3IKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIGFkZCBhIHJlc291cmNlIGJ1bmRsZSB0byBhIHByb2plY3QuCitlcnJvcl9hZGRpbmdfcHJvamVjdF9idW5kbGU9QW5cIGVycm9yXCBvY2N1cnJlZFwgdHJ5aW5nXCB0b1wgYWRkXCB0aGVcIFJlc291cmNlXCBCdW5kbGVcIHlvdVwgc2VsZWN0ZWQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9iYXNlY2xhc3Nfd2hpdGVzcGFjZT1SZXNvdXJjZVwgbmFtZXNcIGNhblwgbm90XCBoYXZlXCBhbnlcIHdoaXRlXCBzcGFjZVwgY2hhcmFjdGVyc1wgaW5cIHRoZW0uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9idW5kbGVfbm90X2NyZWF0ZWQ9Tm9cIFJlc291cmNlXCBCdW5kbGVcIHdhc1wgY3JlYXRlZC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX2NyZWF0ZV9maWxlPUFcIHByb2JsZW1cIHdhc1wgZW5jb3VudGVyZWRcIHRyeWluZ1wgdG9cIGNyZWF0ZVwgdGhlXCByZXNvdXJjZVwgZmlsZS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX2NyZWF0ZV9ncm91cD1BXCBwcm9ibGVtXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBjcmVhdGVcIHRoZVwgZ3JvdXAuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfaXRlbT1BXCBwcm9ibGVtXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBjcmVhdGVcIHRoZVwgZW50cnkuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIGNyZWF0aW5nIGEgcHJvamVjdAorZXJyb3JfY3JlYXRpbmdfcHJvamVjdD1BblwgZXJyb3JcIHdhc1wgZW5jb3VudGVyZWRcIHRyeWluZ1wgdG9cIGNyZWF0ZVwgYVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbWVzc2FnZSBmcm9tIGFuIElPRXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gZGVsZXRlIGEgZmlsZQorZXJyb3JfZGVsZXRpbmc9VGhlcmVcIHdhc1wgYW5cIGVycm9yXCB0cnlpbmdcIHRvXCBkZWxldGVcIHRoZVwgZmlsZVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQW4gZXJyb3IgdGhhdCBvY2N1cnMgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgZmlsZSwgYnV0IHRoZSB2aXJ0dWFsIG1hY2hpbmUgY2FuIG5vdCBkbyBzbworZXJyb3JfZGVsZXRpb25fbm90X3Bvc3NpYmxlPVJCTWFuYWdlclwgd2FzXCB1bmFibGVcIHRvXCBkZWxldGVcIHRoZVwgZmlsZS5cIFBlcm1pc3Npb25cIGRlbmllZC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIGZvciBleHBvcnRpbmcgcmVzb3VyY2UgYnVuZGxlcworZXJyb3JfZXhwb3J0PVRoZXJlXCBoYXNcIGJlZW5cIGFuXCBlcnJvclwgZXhwb3J0aW5nXCB0aGVcIHJlc291cmNlXCBidW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX2ludGVybmFsPUludGVybmFsXCBFcnJvcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2ZpbGU9QW5cIGVycm9yXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBtb2RpZnlcIHRoZVwgcmVzb3VyY2VcIGZpbGUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfZ3JvdXA9VGhlcmVcIHdhc1wgYVwgcHJvYmxlbVwgdHJ5aW5nXCB0b1wgbW9kaWZ5XCB0aGlzXCBncm91cC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9pdGVtPUFuXCBwcm9ibGVtXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBtb2RpZnlcIHRoZVwgZW50cnkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX25vX2J1bmRsZV9mb3JfZmlsZT1Jblwgb3JkZXJcIHRvXCBjcmVhdGVcIGFcIHJlc291cmNlXCBmaWxlLFwgeW91XCBtdXN0XCBmaXJzdFwgb3Blblwgb3JcIGNyZWF0ZVwgYVwgUmVzb3VyY2VcIEJ1bmRsZS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX25vX2J1bmRsZV9mb3JfZ3JvdXA9SW5cIG9yZGVyXCB0b1wgY3JlYXRlXCBhXCBncm91cCxcIHlvdVwgbXVzdFwgZmlyc3RcIG9wZW5cIG9yXCBjcmVhdGVcIGFcIFJlc291cmNlXCBCdW5kbGUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0byBjcmVhdGUgYSByZXNvdXJjZSwgd2l0aG91dCBhbiBvcGVuIHJlc291cmNlIGJ1bmRsZQorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9pdGVtPVBsZWFzZVwgY3JlYXRlXCBvclwgb3BlblwgYVwgcmVzb3VyY2VcIGJ1bmRsZVwgYmVmb3JlXCBhdHRlbXB0aW5nXCB0b1wgY3JlYXRlXCBhXCByZXNvdXJjZVwgaXRlbS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitlcnJvcl9ub19rZXlfcmVwbGFjZT1SZXBsYWNlXCBkb2VzXCBub3RcIGZ1bmN0aW9uXCBmb3JcIFJlc291cmNlXCBLZXlzLlwgQWxsXCBvdGhlclwgcmVwbGFjZXNcIHdpbGxcIGJlXCBwZXJmb3JtZWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAxLTIyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiB0aGF0IFJCTWFuYWdlciBjYW4gbm90IHJlYWQgdGhlIGZpbGUgYXMgY3JlYXRlZCBieSBSQk1hbmFnZXIKK2Vycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0PVRoZVwgc2VsZWN0ZWRcIHJlc291cmNlXCBidW5kbGVcIHdhc1wgbm90XCBjcmVhdGVkXCBieVwgUkJNYW5hZ2VyXCBvclwgaGFzXCBiZWVuXCBkYW1hZ2VkLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd291bGQgbm90IG9wZW4KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBvY2N1cmluZyBvbiBhbiBJL08gZXJyb3IgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlCitlcnJvcl9vcGVuaW5nX2ZpbGU9Q291bGRcIG5vdFwgb3BlblwgdGhlXCBmaWxlXCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBSQk1hbmFnZXIgZW5jb3VudGVycyBhbiBlcnJvciB3cml0aW5nIHByZWZlcmVuY2VzIHRvIHRoZSBmaWxlIHN5c3RlbQorZXJyb3JfcHJlZmVyZW5jZXNfc2F2ZT1UaGVyZVwgd2FzXCBhblwgZXJyb3JcIGF0dGVtcHRpbmdcIHRvXCBzYXZlXCB5b3VyXCBwcmVmZXJlbmNlcy4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQKKyMgQGNvbW1lbnQgQSBtZXNzYWdlIHByZXNlbnRlZCB0byB0aGUgdXNlciB3aGVuIGFuIGVycm9yIG9jY3VycyBpbiBzYXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZQorZXJyb3Jfc2F2aW5nPVRoZXJlXCB3YXNcIGFuXCBlcnJvclwgc2F2aW5nXCB0aGVcIHJlc291cmNlXCBidW5kbGVcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIHNhdmluZyBhIHByb2plY3QKK2Vycm9yX3NhdmluZ19wcm9qZWN0PUFuXCBlcnJvclwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgc2F2ZVwgdGhlXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjIgQG1vZGlmaWVkIDIwMDEtMDEtMjIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTdWdnZXN0IHRyeWluZyB0byBpbXBvcnQgdGhlIHJlc291cmNlIGJ1bmRsZSBpbnN0ZWFkIG9mIG9wZW5pbmcgaXQuCitlcnJvcl9zdWdnZXN0X2ltcG9ydF9wcm9wZXJ0aWVzPVRyeVwgaW1wb3J0aW5nXCB0aGVcIHJlc291cmNlXCBidW5kbGVcIGluc3RlYWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX3RyeV9hZ2Fpbl9maWxlPVBsZWFzZVwgdHJ5XCBhZ2Fpblwgd2l0aFwgZGlmZmVyZW50XCBlbmNvZGluZ1wgdmFsdWVzLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5fZ3JvdXA9UGxlYXNlXCB0cnlcIGFnYWluXCB3aXRoXCBhXCBkaWZmZXJlbnRcIGdyb3VwXCBuYW1lLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5faXRlbT1QbGVhc2VcIHRyeVwgYWdhaW5cIHdpdGhcIGFcIGRpZmZlcmVudFwgZW50cnlcIGtleS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVmFsdWUgaW5zZXJ0ZWQgaW50byB0YWJsZSBjZWxscyB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cmVkCit0YWJsZV9jZWxsX2Vycm9yPSpFcnJvcioKKworIworIyBAZ3JvdXAgRXhwb3J0CisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGRlYWxpbmcgd2l0aCBleHBvcnQgb3B0aW9ucworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE9wdGlvbiBmb3IgdGhlIHBhcmFtZXRlciBmb3IgY3JlYXRlZCBhIHByb3RlY3RlZCBjbGFzcworZXhwb3J0X2phdmFfY2xhc3NfcHJvdGVjdGVkPUNyZWF0ZVwgYVwgcHJvdGVjdGVkXCBjbGFzcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBzZXR0aW5nIHRoZSBjcmVhdGVkIGNsYXNzIGFzIHB1YmxpYworZXhwb3J0X2phdmFfY2xhc3NfcHVibGljPUNyZWF0ZVwgYVwgcHVibGljXCBjbGFzcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgcHJvdGVjdGVkIG1ldGhvZHMgaW4gdGhlIGphdmEgY2xhc3MKK2V4cG9ydF9qYXZhX21ldGhvZHNfcHJvdGVjdGVkPUNyZWF0ZVwgcHJvdGVjdGVkXCBtZXRob2RzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcGFyYW1ldGVyIGZvciBjcmVhdGluZyBwdWJsaWMgbWV0aG9kcworZXhwb3J0X2phdmFfbWV0aG9kc19wdWJsaWM9Q3JlYXRlXCBwdWJsaWNcIG1ldGhvZHMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGl0bGUgb2YgYSBjaGVjayBib3ggZm9sbG93ZWQgYnkgYSB0ZXh0IGZpZWxkIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBhIHBhY2thZ2UgaW4gdGhlIGdlbmVyYXRlZCBqYXZhIGNsYXNzIGFuZCB3aGF0IHRoZSBwYWNrYWdlIHNob3VsZCBiZSBjYWxsZWQKK2V4cG9ydF9qYXZhX3BhY2thZ2U9U3BlY2lmeVwgYVwgcGFja2FnZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRleHQgcGxhY2VkIGluIGEgbGFiZWwgYXQgdGhlIHRvcCBvZiB0aGUgZGlhbG9nIGJveCBmb3Igc3BlY2lmeWluZyBwYXJhbWV0ZXJzIGNvbmNlcm5pbmcgdGhlIGV4cG9ydCBvZiByZXNvdXJjZSBidW5kbGVzIGludG8gYSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV90aXRsZT1QbGVhc2VcIHNwZWNpZnlcIHRoZVwgZm9sbG93aW5nXCBwYXJhbWV0ZXJzXCBmb3JcIHlvdXJcIEphdmFcIGNsYXNzXDoKKworIworIyBAZ3JvdXAgR2VuZXJhbAorIworIyBAZ3JvdXBDb21tZW50IFNvbWUgaXRlbXMgdGhhdCBhcmUgY29tbW9uIGFjY3Jvc3MgZ3JvdXBzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgZmlsZSBvciBjbGFzcyBjb21wb3NlZCBvZiB0aGUgZGVmYXVsdCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBidW5kbGUKK2Jhc2VjbGFzcz1CYXNlXCBDbGFzcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDQtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEdlb3JnZQorIyBAY29tbWVudCBUaGlzIGlzIHRoZSBsZWdhbCBjb3B5cmlnaHQgbm90aWNlCitjb3B5cmlnaHQ9KEMpXCBDb3B5cmlnaHRcIElCTVwgQ29ycC5cIDIwMDAtMjAwNFwgLVwgQWxsXCBSaWdodHNcIFJlc2VydmVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlcm5lcmFsIHVzZSBmb3IgZmlsZSBkaXJlY3RvcmllcworZGlyZWN0b3J5PURpcmVjdG9yeQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZ3JvdXBzPUdyb3VwcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSBuYW1lIG9mIHRoZSBpbWFnZSBmaWxlIGluIHRoZSAnSW1hZ2VzJyBkaXJlY3RvcnkgdGhhdCByZXByZXNlbnRzIHRoZSBsb2dvIHNlZW4gYXQgdGhlIHRvcCBvZiB0aGUgYXBwbGljYXRpb24KK2xvZ29fZmlsZW5hbWU9VGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUcmVlIG5vZGUgdGl0bGUgd2hlbiB2aWV3aW5nIGEgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBwcm9qZWN0IHZpZXcgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgcHJvamVjdAorbm9fcHJvamVjdD1EZWZhdWx0XCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRyZWUgbm9kZSB0aXRsZSBkZWZhdWx0ZWQgdG8gd2hlbiBubyByZXNvdXJjZSBidW5kbGUgb3IgcHJvamVjdCBoYXMgYmVlbiBvcGVuZWQgYnkgdGhlIHVzZXIKK25vX3Byb2plY3RfYnVuZGxlPU5vXCBQcm9qZWN0XCBvclwgUmVzb3VyY2VcIEJ1bmRsZVwgT3BlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSB0b3AgdHJlZSBub2RlIHRpdGxlLCB3aGVuIG5vIHJlc291cmNlIGJ1bmRsZSBoYXMgYmVlbiBvcGVuZWQgb3IgY3JlYXRlZAorbm9fcmVzb3VyY2VfYnVuZGxlPU5vXCBSZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitub25lPU5vbmUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUHJvamVjdCB0YWJsZSBjb2x1bW4gbmFtZSAtIExvY2F0aW9uIG9mIGEgcmVzb3VyY2UgYnVuZGxlCitwcm9qZWN0X3RhYmxlX2ZpbGVfbG9jYXRpb249RmlsZVwgTG9jYXRpb24KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGFibGUgQ29sdW1uIE5hbWUgZm9yIHJlc291cmNlIGJ1bmRsZSBuYW1lCitwcm9qZWN0X3RhYmxlX3Jlc291cmNlX2J1bmRsZT1SZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQW4gYWJicmV2aWF0ZWQgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uCityYm1hbmFnZXI9UkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwNC0wNi0yOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgR2VvcmdlCisjIEBjb21tZW50IAorcmJtYW5hZ2VyX2NvbnRhY3Q9QXV0aG9yc1w6XCBKYXJlZFwgSmFja3NvblwgJlwgR2VvcmdlXCBSaG90ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgZnVsbCBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24KK3Jlc291cmNlX2J1bmRsZV9tYW5hZ2VyPVJlc291cmNlXCBCdW5kbGVcIE1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK3RhYmxlX2NvbHVtbl9lcnJvcj1UYWJsZVwgQ29sdW1uXCBFcnJvcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDEtMDEtMjIgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBDb3VudHJ5IElTTyBjb2RlCisjIEBjb21tZW50IE5vZGUgdGl0bGUsIHVuZGVyIHdoaWNoIGFsbCBmaWxlcyBvZiB0aGUgc2FtZSBjb3VudHJ5LCBsYW5ndWFnZSByZXNpZGUKK3RyZWVfY291bnRyeV9ub2RlPUNvdW50cnlcIENvZGVcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQHswfSBMYW5ndWFnZSBFbmNvZGluZworIyBAY29tbWVudCBUaGUgbm9kZSBiZWxvdyB3aGljaCBsYW5ndWFnZXMgb2Ygb25lIGVuY29kaW5nIGFyZSBncm91cGVkCit0cmVlX2xhbmd1YWdlX25vZGU9TGFuZ3VhZ2VcIENvZGVcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCit0cmVlX3ZhcmlhbnRfbm9kZT1WYXJpYW50c1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIG5hbWUgYXNzaWduZWQgYXMgYSB1c2VyIG5hbWUgd2hlbiB0aGUgdXNlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQKK3Vua25vd25fdXNlcj1Vbmtub3duCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCit1bnRpdGxlZD1VbnRpdGxlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAordW50cmFuc2xhdGVkX2l0ZW1zPVVudHJhbnNsYXRlZFwgSXRlbXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAezB9IFRoZSB2ZXJzaW9uIG51bWJlcgorIyBAY29tbWVudCBUaGUgdmVyc2lvbiBvZiB0aGlzIGFwcGxpY2F0aW9uCit2ZXJzaW9uPVZlcnNpb25cIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBnZW5lcmFsIHVzZSBXYXJuaW5nCit3YXJuaW5nPVdhcm5pbmcKKworIworIyBAZ3JvdXAgSW1wb3J0CisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGRlYWxpbmcgd2l0aCBpbXBvcnQgb3B0aW9ucworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBmaWxlIGNob29zZXIgZm9yIGNob29zaW5nIFRNWCBmaWxlcworaW1wb3J0X1RNWF9maWxlX2Rlc2NyaXB0aW9uPVRNWFwgRmlsZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBUTVggWE1MIGZpbGVzCitpbXBvcnRfVE1YX3RpdGxlPVRNWFwgRmlsZVwgSW1wb3J0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IFRpdGxlIGZvciB0aGUgZmlsZSBjaG9vc2VyIGZvciBjaG9vc2luZyBYTElGRiAoLnhsZikgZmlsZXMKK2ltcG9ydF9YTEZfZmlsZV9kZXNjcmlwdGlvbj1YTElGRlwgRmlsZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBYTElGRiAoLnhsZikgZmlsZXMKK2ltcG9ydF9YTEZfdGl0bGU9WExJRkZcIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGNvbmZsY2l0cyBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcworaW1wb3J0X2NvbmZsaWN0X3Byb21wdD1Qcm9tcHRcIGZvclwgZWFjaFwgY29uZmxpY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIHNwZWNpZnlpbmcgd2hldGhlciBhIGdyb3VwIGZvdW5kIGluIHRoZSB0YXJnZXQgYnV0IG5vdCBmb3VuZCBpbiB0aGUgYWN0aXZlIHJlc291cmNlIGJ1bmRsZSBzaG91bGQgYmUgY3JlYXRlZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlIG9yIG5vdAoraW1wb3J0X2RlZmF1bHRfZ3JvdXBfY3JlYXRpb249Q3JlYXRlXCBncm91cHNcIG5vdFwgZXhpc3RpbmdcIGluXCB0aGVcIGN1cnJlbnRcIGJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRvaW4gZm9yIG1hcmtpbmcgdGhlIGluY29taW5nIHZhbHVlcyBhcyB0cmFuc2xhdGVkIG9yIG5vdAoraW1wb3J0X2RlZmF1bHRfdHJhbnNsYXRlZD1NYXJrXCBhc1wgdHJhbnNsYXRlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3Igb3B0aW9ucyBzcGVjaWZ5aW5nIHRoZSBtZXRhIGRhdGEgdG8gYmUgYXBwbGllZCB0byBpbmRpdmlkdWFsIHJlc291cmNlcyBpZiBpdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBpbXBvcnQgc291cmNlCitpbXBvcnRfZGVmYXVsdF92YWx1ZXM9RGVmYXVsdFwgVmFsdWVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIGxvY2FsZSBlbmNvZGluZyBvZiB0aGUgZmlsZSBpbiBxdWVzdGlvbgorIyBAY29tbWVudCBJbnN0cnVjdGlvbnMgZm9yIHByb21wdGluZyB0aGUgdXNlciB0byByZXNvbHZlIGEgY29uZmxpY3Qgd2hlbiBpbXBvcnRpbmcgcmVzb3VyY2VzIGZyb20gYSBsb2NhbGUgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCByZXNvdXJjZSBidW5kbGUKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2Nob29zZT1UaGVcIGVuY29kaW5nXCB7MH1cIGRvZXNcIG5vdFwgZXhpc3QuXCBTZWxlY3RcIGFuXCBvcHRpb25cIHRvXCByZXNvbHZlXCBvclwgY2FuY2VsXCB0b1wgaWdub3JlXCB0aGlzXCBjb25mbGljdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCBhIG5ldyBmaWxlIGlzIGdlbmVyYXRlZCwgYnV0IG5vdCBwb3B1bGF0ZWQKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2dlbmVyYXRlX2VtcHR5PUdlbmVyYXRlXCBhXCBuZXcsXCBlbXB0eVwgcmVzb3VyY2VcIGZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQgYW5kIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgZXhpc3RpbmcgcmVzb3VyY2VzCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9wb3B1bGF0ZT1HZW5lcmF0ZVwgYVwgbmV3XCByZXNvdXJjZVwgZmlsZVwgYW5kXCBwb3B1bGF0ZVwgaXRcIHdpdGhcIHRoZVwgYmFzZVwgY2xhc3NcIHJlc291cmNlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIGZpbGUgY29uZmxpY3RzIGluIHdoaWNoIHRoZSBjb25mbGljdHMgYXJlIGlnbm9yZWQKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2lnbm9yZT1Ta2lwXCBhbmRcIGlnbm9yZVwgYWxsXCByZXNvdXJjZXNcIGZyb21cIGxvY2FsZXNcIG5vdFwgZXhpc3RhbnRcIGluXCB0aGVcIGN1cnJlbnRcIHJlc291cmNlXCBidW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHNlY3Rpb24gbGlzdGluZyBvcHRpb25zIGZvciB3aGF0IHRvIGRvIHdoZW4gYW4gaW1wb3J0ZWQgdmFsdWUgZXhpc3RzIGluIGEgbG9jYWxlIG5vdCBkZWZpbmVkIGluIHRoZSBleGlzdGluZyByZXNvdXJjZSBidW5kbGUKK2ltcG9ydF9maWxlX2NvbmZsaWN0cz1NaXNzaW5nXCBSZXNvdXJjZVwgRmlsZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU2VsZWN0aW9uIG9mIHRoZSBkZWZhdWx0IGdyb3VwLiBBIGxpc3Qgb2YgZ3JvdXBzIHdpbGwgYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGlzIHJlc291cmNlIGluIGEgQ29tYm9Cb3gKK2ltcG9ydF9pbnNlcnRfZ3JvdXA9SW5zZXJ0XCBpbnRvXCBncm91cFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciB0aGUgdHlwZXMgb2YgZmlsZXMgYWNjZXB0ZWQgZm9yIHRoaXMgaW1wb3J0IHR5cGUKK2ltcG9ydF9qYXZhX2ZpbGVfZGVzY3JpcHRpb249SmF2YVwgTGlzdFJlc291cmNlQnVuZGxlXCBCYXNlXCBDbGFzc2VzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBkaWFsb2cgcHJvbXB0aW5nIGZvciBpbXBvcnQgZnJvbSBqYXZhIGNsYXNzZXMKK2ltcG9ydF9qYXZhX3RpdGxlPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgQ2xhc3NcIEltcG9ydAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBpbmRpY2F0aW5nIHNlY3Rpb24gY29udGFpbmluZyB1c2VyIG9wdGlvbnMKK2ltcG9ydF9vcHRpb25zPUltcG9ydFwgT3B0aW9ucworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZmlsZSBjaG9vc2VyIGZvciBzZWxlY3Rpb24gb2YgcmVzb3VyY2UgYnVuZGxlcyBzdG9yZWQgaW4gLnByb3BlcnRpZXMgZmlsZXMKK2ltcG9ydF9wcm9wZXJ0aWVzX2ZpbGVfZGVzY3JpcHRpb249UmVzb3VyY2VcIEJ1bmRsZVwgQmFzZVwgQ2xhc3NlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgZm9yIGltcG9ydGluZyBmcm9tIHByb3BlcnRpZXMgZmlsZXMgKGNyZWF0ZWQgb3Igbm90IGJ5IFJCTWFuYWdlcikKK2ltcG9ydF9wcm9wZXJ0aWVzX3RpdGxlPVJlc291cmNlXCBCdW5kbGVcIFByb3BlcnRpZXNcIEZpbGVzXCBJbXBvcnQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTAyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHsxfSBFbmNvZGluZyBvZiB0aGUgcmVzb3VyY2UgdmFsdWUgd2l0aCBhIGNvbmZsaWN0CisjIEB7MH0gVGhlIGtleSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgaW4gY29uZmxpY3QKKyMgQGNvbW1lbnQgVGhpcyBpcyBhIHdhcm5pbmcgYW5kIGluc3RydWN0aW9uIGZvciB3aGVuIGEgcmVzb3VyY2UgY29uZmxpY3Qgb2NjdXJzIGR1cmluZyBhbiBpbXBvcnQKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2U9VGhlXCBrZXlcIHswfVwgYWxsXCByZWFkeVwgZXhpc3RzXCBpblwgdGhlXCB7MX1cIHJlc291cmNlXCBidW5kbGUuQ2hvb3NlXCBhblwgb3B0aW9uXCB0b1wgcmVzb2x2ZVwgdGhpc1wgY29uZmxpY3RcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIGl0ZW0KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlIGFjY29yZGluZyB0byB0aGUgaW1wb3J0IGZpbGUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2Vfc291cmNlPUltcG9ydFwgVHJhbnNsYXRpb25cOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIHRyYW5zbGF0aW9uIHZhbHVlIG9mIHRoZSByZXNvdXJjZSBpdGVtCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIHRyYW5zbGF0aW9uIHZhbHVlIGhlbGQgYnkgdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUgZHVyaW5nIGEgdHJhbnNsYXRpb24gcmVzb3VyY2UgY29uZmxpY3QKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2VfdGFyZ2V0PVJlc291cmNlXCBCdW5kbGVcIHRyYW5zbGF0aW9uXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyByZXNvdXJjZSBjb25mbGljdHMgYnkgaWdub3JpbmcgaW1wb3J0IHZhbHVlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfaWdub3JlPUlnbm9yZVwgdGhlXCBjb25mbGljdFwgYW5kXCBsZWF2ZVwgdGhlXCBvcmlnaW5hbFwgcmVzb3VyY2VcIHVuY2hhbmdlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyBjb25mbGljdHMgYnkgdXNpbmcgdGhlIGltcG9ydCB2YWx1ZQoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X292ZXJ3cml0ZT1PdmVyd3JpdGVcIHJlc291cmNlXCB3aXRoXCB0aGVcIHZhbHVlXCBmcm9tXCB0aGVcIGltcG9ydFwgZmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBsaXN0aW5nIG9wdGlvbnMgZm9yIHJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiByZXNvdXJjZXMKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdHM9UmVzb3VyY2VcIENvbmZsaWN0cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZQorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBzb3VyY2UgZmlsZSBmb3IgdGhlIGltcG9ydAoraW1wb3J0X3NvdXJjZV9maWxlPVNvdXJjZVwgRmlsZVw6XCB7MH0KKworIworIyBAZ3JvdXAgTWVudSBJdGVtcworIworIyBAZ3JvdXBDb21tZW50IFRoZXNlIHJlc291cmNlcyByZXByZXNlbnQgYWxsIG9mIHRoZSBtZW51IGFuZCBtZW51IGl0ZW0gdGl0bGVzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGhlIG1lbnUgdGl0bGUgY292ZXJpbmcgY29weWluZywgcGFzdGluZywgZGVsZXRpbmcgb2YgaXRlbXMKK21lbnVfZWRpdD1FZGl0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2NvcHk9Q29weQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jb3B5X3RyaWdnZXI9YworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jdXQ9Q3V0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2N1dF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfZGVsZXRlPURlbGV0ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9kZWxldGVfdHJpZ2dlcj1kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X3Bhc3RlPVBhc3RlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X3Bhc3RlX3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9lZGl0JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2VkaXRfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIHRoZSBvcGVuaW5nLCBzYXZpbmcsIGV0Yy4gZG9jdW1lbnRzIGFuZCBleGl0aW5nIHRoZSBwcm9ncmFtCittZW51X2ZpbGU9RmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCByZXNvdXJjZSBidW5kbGVzIGluIGEgdmFyaWV0eSBvZiBmb3JtYXRzCittZW51X2ZpbGVfZXhwb3J0PUV4cG9ydFwgUmVzb3VyY2VcIEJ1bmRsZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAyLTA1LTE3IEBtb2RpZmllZCAyMDAyLTA1LTE3IEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgQWJsaXR5IHRvIGV4cG9ydCB0byBJQ1UgUmVzb3VyY2UgQnVuZGxlIGZpbGVzCittZW51X2ZpbGVfZXhwb3J0X0lDVT1JQ1VcIEZpbGVzLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMi0wNS0xNyBAbW9kaWZpZWQgMjAwMi0wNS0xNyBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9JQ1VfdHJpZ2dlcj1pCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFibGl0eSB0byBleHBvcnQgdG8gVE1YIFhNTCBmaWxlcworbWVudV9maWxlX2V4cG9ydF9UTVg9VE1YXCBGaWxlcy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfVE1YX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCBYTElGRiBYTUwgZmlsZXMKK21lbnVfZmlsZV9leHBvcnRfWExGPVhMSUZGXCBGaWxlcy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfWExGX3RyaWdnZXI9eAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCB0byBqYXZhIGZpbGVzIHRoYXQgY29tcGlsZSB0byBiZSBMaXN0UmVzb3VyY2VCdW5kbGUgY2xhc3MgZXh0ZW5zaW9ucworbWVudV9maWxlX2V4cG9ydF9qYXZhPUNvbXBpbGFibGVcIEphdmFcIEZpbGVzLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBFeHBvcnQgYWJpbGl0eSB0byBwcm9wZXJ0aWVzIGZpbGVzIG1pbnVzIHRoZSBtZXRhZGF0YQorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzPU1pbmltYWxcIFByb3BlcnRpZXNcIEZpbGVzLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfdHJpZ2dlcj14CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgaW1wb3J0IGFuZCBtZXJnaW5nIGFub3RoZXIgcmVzb3VyY2UgZmlsZSB3aXRoIHRoZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9pbXBvcnQ9TWVyZ2VcIChJbXBvcnRcIGludG8pXCBUb1wgUmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJsaWl0eSBmcm9tIFhNTCBUTVggZG9jdW1lbnRzCittZW51X2ZpbGVfaW1wb3J0X1RNWD1UTVhcIERvY3VtZW50cy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfVE1YX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDYgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIFhNTCBYTElGRiAoLnhsZikgZmlsZXMKK21lbnVfZmlsZV9pbXBvcnRfWExGPVhMSUZGXCBEb2N1bWVudHMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTA2IEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X1hMRl90cmlnZ2VyPVgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBqYXZhIGNsYXNzZXMgKExpc3RSZXNvdXJjZUJ1bmRsZSkKK21lbnVfZmlsZV9pbXBvcnRfamF2YT1MaXN0UmVzb3VyY2VCdW5kbGVcIEphdmFcIENsYXNzZXMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X2phdmFfdHJpZ2dlcj1qCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEltcG9ydCBhYmlsaXR5IGZyb20gcHJvcGVydGllcyBmaWxlcyBub3QgZ2VuZXJhdGVkIGJ5IFJCTWFuYWdlcgorbWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzPVNpbXBsZVwgUmVzb3VyY2VcIEJ1bmRsZXMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXNfdHJpZ2dlcj1TCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF90cmlnZ2VyPW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBidW5kbGUKK21lbnVfZmlsZV9uZXc9TmV3XCBSZXNvdXJjZVwgQnVuZGxlLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9maWxlX25ld190cmlnZ2VyPW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlCittZW51X2ZpbGVfb3Blbj1PcGVuXCBSZXNvdXJjZVwgQnVuZGxlLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9maWxlX29wZW5fdHJpZ2dlcj1vCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgY2xvc2luZyB0aGUgYXBwbGljYXRpb24KK21lbnVfZmlsZV9xdWl0PVF1aXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfcXVpdF90cmlnZ2VyPXEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBzYXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZSBiZWluZyB3b3JrZWQgd2l0aAorbWVudV9maWxlX3NhdmU9U2F2ZVwgUmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgYQorIyBAY29tbWVudCAKK21lbnVfZmlsZV9zYXZlX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIHNhdmluZyBhIHJlc291cmNlIGJ1bmRsZSB0byBhIHBhcnRpY3VsYXIgbG9jYXRpb24gYW5kIGZpbGUgbmFtZQorbWVudV9maWxlX3NhdmVhcz1TYXZlXCBSZXNvdXJjZVwgQnVuZGxlXCBBcy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9zYXZlYXNfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X2ZpbGUnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfZmlsZV90cmlnZ2VyPWYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3IgaGVscCBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbQorbWVudV9oZWxwPUhlbHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBpdGVtIHdoaWNoIGJyaW5ncyB1cCBhIGRpYWxvZyBkZXNjcmliaW5nIHRoZSBhcHBsaWNhdGlvbgorbWVudV9oZWxwX2Fib3V0PUFib3V0XCBSZXNvdXJjZVwgQnVuZGxlXCBNYW5hZ2VyLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9oZWxwX2Fib3V0X3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9oZWxwJyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2hlbHBfdHJpZ2dlcj1oCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIG9wdGlvbnMgc3VjaCBhcyBjcmVhdGluZyBuZXcgcmVzb3VyY2VzLCBncm91cHMsIGFuZCByZXNvdXJjZSBmaWxlcworbWVudV9vcHRpb25zPU9wdGlvbnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBpdGVtCittZW51X29wdGlvbnNfYWRkZW50cnk9QWRkXCBOZXdcIEVudHJ5Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX2FkZGVudHJ5X3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGZpbGUgZm9yIGEgcGFydGljdWxhciBsYW5ndWFnZS9jb3VudHJ5L3ZhcmlhbnQKK21lbnVfb3B0aW9uc19hZGRmaWxlPUFkZFwgTmV3XCBSZXNvdXJjZVwgRmlsZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRmaWxlX3RyaWdnZXI9ZgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCittZW51X29wdGlvbnNfYWRkZ3JvdXA9QWRkXCBOZXdcIEdyb3VwLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX2FkZGdyb3VwX3RyaWdnZXI9ZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjUgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgZWRpdGluZyB0aGUgdXNlcidzIHByZWZlcmVuY2VzIGZvciB0aGUgYXBwbGljYXRpb24KK21lbnVfb3B0aW9uc19wcmVmZXJlbmNlcz1QcmVmZXJlbmNlcy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjUgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX3ByZWZlcmVuY2VzX3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IGl0ZW0gdGhhdCBtYWtlcyB2aXNpYmxlIHRoZSBwcm9qZWN0IHZpZXdlcgorbWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyPU9wZW5cIFByb2plY3RcIFZpZXdlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19wcm9qZWN0X3ZpZXdlcl90cmlnZ2VyPXYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfb3B0aW9ucycgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9vcHRpb25zX3RyaWdnZXI9bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGFkZGluZyBhIG5ldyByZXNvdXJjZSBidW5kbGUgdG8gdGhlIHByb2plY3QKK21lbnVfdHJlZV9hZGRfcHJvamVjdF9idW5kbGU9QWRkXCBSZXNvdXJjZVwgQnVuZGxlLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgZGVsZXRpbmcgcGVybWFuZW50bHkgYSByZXNvdXJjZSBmaWxlCittZW51X3RyZWVfZGVsZXRlPURlbGV0ZVwgUmVzb3VyY2VcIEZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciByZW1vdmluZyBhIHNwZWNpZmljIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgdHJlZSB2aWV3IG9mIHRoZSByZXNvdXJjZSBidW5kbGUKK21lbnVfdHJlZV9oaWRlPUhpZGVcIFJlc291cmNlXCBGaWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcHJvamVjdAorbWVudV90cmVlX25ld19wcm9qZWN0PU5ld1wgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorbWVudV90cmVlX29wZW5fcHJvamVjdD1PcGVuXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBwcm9qZWN0IHRyZWUKK21lbnVfdHJlZV9yZW1vdmVfcHJvamVjdF9idW5kbGU9UmVtb3ZlXCBmcm9tXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igc2F2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgYnVuZGxlIGZpbGUKK21lbnVfdHJlZV9zYXZlPVNhdmVcIFJlc291cmNlXCBGaWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igc2F2aW5nIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlIHByb2plY3QgZmlsZSwgbm90IHRoZSByZXNvdXJjZSBidW5kbGVzIHRoZW1zZWx2ZXMgd2l0aGluIHRoZSBwcm9qZWN0CittZW51X3RyZWVfc2F2ZV9wcm9qZWN0PVNhdmVcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3RcIEZpbGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBmb3Igc2VsZWN0aW5nIGEgcmVzb3VyY2UgYnVuZGxlIGZyb20gdGhlIHByb2plY3QgdHJlZSB0byBiZSBlZGl0ZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSB0cmVlCittZW51X3RyZWVfc2VsZWN0X3Byb2plY3RfYnVuZGxlPVdvcmtcIHdpdGhcIHRoaXNcIFJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3IgY2hhbmdpbmcgdGhlIGRpc3BsYXkgYmVpbmcgc2VlbiBieSB0aGUgdXNlcgorbWVudV92aWV3PVZpZXcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBpdGVtIHRoYXQgdGFrZXMgeW91IGRpcmVjdGx5IHRvIHRoZSBzdGF0aXN0aWNzIHBhbmVsIGZvciB0aGUgZW50aXJlIGJ1bmRsZQorbWVudV92aWV3X3N0YXRpc3RpY3M9Vmlld1wgUmVzb3VyY2VcIEJ1bmRsZVwgU3RhdGlzdGljcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfdmlld19zdGF0aXN0aWNzX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV92aWV3JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X3ZpZXdfdHJpZ2dlcj12CisKKyMKKyMgQGdyb3VwIFByb2plY3QgUGFuZWwKKyMKKyMgQGdyb3VwQ29tbWVudCBQYW5lbCBhc3NvY2lhdGVkIHdpdGggUHJvamVjdCBlZGl0aW5nCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisjIEBjb21tZW50IExhYmVsIGluZGljYXRvciBhc3NvY2lhdGluZyBhIHRleHQgYm94IGNvbnRhaW5pbmcgYSB0cmFuc2xhdGlvbiB3aXRoIHRoZSByZXNvdXJjZSBidW5kbGUgdGhlIHRyYW5zbGF0aW9uIGNvbWVzIGZyb20KK3Byb2plY3RfcGFuZWxfYnVuZGxlPVJlc291cmNlXCBCdW5kbGVcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gTmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisjIEBjb21tZW50IFNwZWNpYWwgaW5kaWNhdG9yIG9mIHRoZSByZXNvdXJjZSBpdGVtIHJlc291cmNlIGJ1bmRsZSB3aGVuIHRoZSBpdGVtIGlzIHVudHJhbnNsYXRlZAorcHJvamVjdF9wYW5lbF9idW5kbGVfdW50cmFuc2xhdGVkPVJlc291cmNlXCBCdW5kbGVcOlwgezB9XCAoVW50cmFuc2xhdGVkKQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBMYWJlbCB0ZXh0IG1hcmtpbmcgdGhlIGxpbmUgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgYSByZXNvdXJjZSBjb21tZW50Citwcm9qZWN0X3BhbmVsX2NvbW1lbnQ9QmFzZVwgQ2xhc3NcIFJlc291cmNlXCBDb21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTGFiZWwgdGV4dCBmb3IgYSBjb21tZW50IHdoZW4gbm9uZSBpcyBmb3VuZCBmb3IgYSByZXNvdXJjZQorcHJvamVjdF9wYW5lbF9jb21tZW50X25vbmU9Tm9cIGNvbW1lbnRcIHN1cHBsaWVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBzaG93biBvbiB0aGUgcHJvamVjdCBwYW5lbCBmb3IgY29tbWl0dGluZyBjaGFuZ2UgdG8gb25lIHJlc291cmNlIG9ubHkKK3Byb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbj1Db21taXRcIENoYW5nZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgb24gdGhlIHByb2plY3QgcGFuZWwgZm9yIHNhdmluZyBhbGwgb2YgdGhlIHJlc291cmNlcyBkaXNwbGF5ZWQuIFRoaXMgbWVhbnMgbXVsdGlwbGUgcmVzb3VyY2UgZmlsZXMgZ2V0IHNhdmVkLgorcHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uX2FsbD1Db21taXRcIEFsbFwgUmVzb3VyY2VcIENoYW5nZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGVmYXVsdCB0aXRsZSBzaG93biBvbiB0aGUgcHJvamVjdCBwYW5lbCB3aGVuIG5vIHBhcnRpY3VsYXIgcmVzb3VyY2UgaGFzIGJlZW4gc2VsZWN0ZWQKK3Byb2plY3RfcGFuZWxfZGVmYXVsdF90aXRsZT1Qcm9qZWN0XCBSZXNvdXJjZVwgRWRpdGluZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUZXh0IGZpZWxkIG1hcmtlciBmb3IgdGhlIHRyYW5zbGF0aW9uIG9mIGEgcmVzb3VyY2Ugd2hlbiB0aGF0IHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgZW5jb2RpbmcgZmlsZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGgKK3Byb2plY3RfcGFuZWxfaXRlbV9pbmhlcml0cz08Tm9cIFRyYW5zbGF0aW9uXDpcIFJlc291cmNlXCBJbmhlcml0c1wgZnJvbVwgcGFyZW50PgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBrZXkgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlCisjIEBjb21tZW50IFRpdGxlIG9uIHRoZSBwcm9qZWN0IHBhbmVsIHdoaWxlIGEgcmVzb3VyY2UgaXMgc2VsZWN0ZWQKK3Byb2plY3RfcGFuZWxfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmdcOlwgezB9CisKKyMKKyMgQGdyb3VwIFJCUmVwb3J0ZXIKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgZm9yIHRoZSBSQlJlcG9ydGVyIGFwcGxpY2F0aW9uCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIHNlbGVjdGluZyBmaWxlIGxvY2F0aW9ucyBmb3IgaW5wdXQvb3V0cHV0CityZXBvcnRlcl9idXR0b25fY2hvb3NlPUNob29zZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEJ1dHRvbiBpbmRpY2F0aW5nIHRoZSByZXBvcnQgZ2VuZXJhdGlvbiBzaG91bGQgb2NjdXIgaW1tZWRpYXRlbHkKK3JlcG9ydGVyX2J1dHRvbl9ub3c9VXBkYXRlXCBOb3cKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTI5IEBtb2RpZmllZCAyMDAwLTExLTI5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBzYXZpbmcgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXMgZGVmYXVsdAorcmVwb3J0ZXJfYnV0dG9uX3NhdmVfZGVmYXVsdHM9U2F2ZVwgdGhlXCBDdXJyZW50XCBTZXR0aW5nc1wgYXNcIERlZmF1bHRzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQnV0dG9uIHRvIGFjdGl2YXRlIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfYnV0dG9uX3N0YXJ0PVN0YXJ0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQnV0dG9uIHRvIGRlYWN0aXZlIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfYnV0dG9uX3N0b3A9U3RvcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IExldmVsIG9mIGRldGFpbDogbW9zdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUKK3JlcG9ydGVyX2RldGFpbF9oaWdoPUhpZ2gKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uIG9wdGlvbiBvZiB0aGUgbGV2ZWwgb2YgZGV0YWlsIGluIHJlcG9ydGluZworcmVwb3J0ZXJfZGV0YWlsX2xldmVsPURldGFpbFwgTGV2ZWxcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IExldmVsIG9mIGRldGFpbDogc3RhbmRhcmQKK3JlcG9ydGVyX2RldGFpbF9ub3JtYWw9Tm9ybWFsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdDogSFRNTAorcmVwb3J0ZXJfZm9ybWF0X2h0bWw9SFRNTAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEFuIG91dHB1dCBmb3JtYXQgdHlwZTogcGxhaW4gdGV4dAorcmVwb3J0ZXJfZm9ybWF0X3RleHQ9VGV4dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEFuIG91dHB1dCBmb3JtYXQ6IFhNTAorcmVwb3J0ZXJfZm9ybWF0X3htbD1YTUwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIGZpbGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0byByZXBvcnQgb24KK3JlcG9ydGVyX2lucHV0X2J1bmRsZT1SZXNvdXJjZVwgQnVuZGxlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIHRoYXQgcmVwb3J0aW5nIHdpbGwgaGFwcGVuIGF0IGEgc3BlY2lpZmllZCB0aW1lIG9mIGRheS4gRm9sbG93ZWQgYnkgYSB0aW1lIGFuZCBkYXkgb3B0aW9uLgorcmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZD1SZXBvcnRcIGF0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGV4dCBpbmRpY2F0aW9uIG9mIHNlcXVlbnRpYWwgcmVwb3J0aW5nIHBhdXNlZCBmb3IgYSBkZWZpbmVkIGludGVydmFsIGJldHdlZW4gcmVwb3J0aW5nLiBJbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG51bWJlciBhbmQgYSB1bml0IG9mIG1lYXN1cmUgb2YgdGltZQorcmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbD1SZXBvcnRcIGV2ZXJ5CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQHswfSBEYXRlL1RpbWUgb2YgbGFzdCByZXBvcnQgZ2VuZXJhdGlvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSB0aW1lIG9mIHRoZSBsYXN0IHJlcG9ydAorcmVwb3J0ZXJfbGFzdF9yZXBvcnQ9TGFzdFwgUmVwb3J0XDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEB7MH0gRGF0ZS9UaW1lIG9mIG5leHQgcmVwb3J0CisjIEBjb21tZW50IEluZGljYXRpb24gb2Ygd2hlbiB0aGUgbmV4dCByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQKK3JlcG9ydGVyX25leHRfcmVwb3J0PU5leHRcIFJlcG9ydFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHJlcG9ydHMgYXJlIHBsYWNlZAorcmVwb3J0ZXJfb3V0cHV0X2RpcmVjdG9yeT1PdXRwdXRcIERpcmVjdG9yeVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQgZm9ybWF0CityZXBvcnRlcl9vdXRwdXRfZmlsZT1GaWxlXCBOYW1lXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3Igc2V0dGluZyBpbnRlcnZhbCBvZiByZXBvcnRpbmcKK3JlcG9ydGVyX3BhbmVsX2ludGVydmFsPVJlcG9ydFwgSW50ZXJ2YWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3IgY29uZmlndXJhYmxlIG9wdGlvbnMgb2YgdGhlIHJlcG9ydGluZworcmVwb3J0ZXJfcGFuZWxfb3B0aW9ucz1SZXBvcnRcIE9wdGlvbnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBTdWJwYW5lbCB0aXRsZSBmb3IgY2hvb3Npbmcgb3V0cHV0IGZvcm1hdHMgZm9yIHRoZSByZXBvcnRzCityZXBvcnRlcl9wYW5lbF9vdXRwdXRfZm9ybWF0PU91dHB1dFwgRm9ybWF0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIGluZGljYXRpb24gb2YgcnVubmluZyBzdGF0dXMgb2YgdGhlIHJlcG9ydGVyCityZXBvcnRlcl9wYW5lbF9zdGF0dXM9U3RhdHVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFNob3J0IHRpdGxlIGZvciBzZWxlY3RpbmcgYSBjb2RlIHNjYW4gY29uZmlndXJhdGlvbiBmaWxlCityZXBvcnRlcl9wZXJmb3JtX3NjYW49Q29kZVwgU2NhblwgRmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFF1aWNrIGluZGljYXRpb24gdGhhdCB0aGUgcmVwb3J0ZXIgaXMgYWN0aXZlIChwZXJoYXBzIHdhaXRpbmcpCityZXBvcnRlcl9zdGF0dXNfcnVubmluZz1TdGFydGVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgUXVpY2sgc3RhdHVzIGluZGljYXRpb24gdGhhdCB0aGUgcmVwb3J0ZXIgaXMgbm90IGFjdGl2ZQorcmVwb3J0ZXJfc3RhdHVzX3N0b3BwZWQ9U3RvcHBlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IGRheXMgb3B0aW9uCityZXBvcnRlcl90aW1lX2RheXM9RGF5cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IGV2ZXJ5IGRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZXZlcnlkYXk9RXZlcnlcIGRheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IGZyaWRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZnJpZGF5PUZyaWRheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IGhvdXJzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9ob3Vycz1Ib3VycworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IG1pbnV0ZXMgb3B0aW9uCityZXBvcnRlcl90aW1lX21pbnV0ZXM9TWludXRlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IG1vbmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfbW9uZGF5PU1vbmRheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IHNhdHVyZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9zYXR1cmRheT1TYXR1cmRheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IHN1bmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfc3VuZGF5PVN1bmRheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IHRodXJzZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV90aHVyc2RheT1UaHVyc2RheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IHR1ZXNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3R1ZXNkYXk9VHVlc2RheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IHdlZG5lc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfd2VkbmVzZGF5PVdlZG5lc2RheQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRpdGxlIG9mIHRoZSBhcHBsaWNhdGlvbgorcmVzb3VyY2VfYnVuZGxlX3JlcG9ydGVyPVJCUmVwb3J0ZXIKKworIworIyBAZ3JvdXAgU2VhcmNoIGFuZCBSZXBsYWNlCisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGZvdW5kIG9uIHRoZSBzZWFyY2ggdGFiIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZW5lcmFsIHNlYXJjaCB0aXRsZQorc2VhcmNoPVNlYXJjaAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBtYWtpbmcgdGhlIHNlYXJjaCBjYXNlIHNlbnNpdGl2ZSBvciBub3QKK3NlYXJjaF9jYXNlX3NlbnNpdGl2ZT1DYXNlXCBTZW5zaXRpdmVcIFNlYXJjaAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBzZWFyY2hpbmcgdGhyb3VnaCByZXNvdXJjZSBjb21tZW50cworc2VhcmNoX2NvbW1lbnRzPUNvbW1lbnRzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiB0aGUgZmllbGQgZm9yIGVudGVyaW5nIHRleHQgdG8gc2VhcmNoIG9uCitzZWFyY2hfZmluZD1GaW5kXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IHNlbGVjdGlvbiBmb3Igc2VhcmNoaW5nIG9wdGlvbiB0aHJvdWdoIHJlc291cmNlIGtleXMKK3NlYXJjaF9rZXlzPVJlc291cmNlXCBLZXlzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiB0aGUgZmllbGQgZm9yIGVudGVyaW5nIHRleHQgZm9yIHJlcGxhY2luZyB0aGUgZm91bmQgdmFsdWUKK3NlYXJjaF9yZXBsYWNlPVJlcGxhY2VcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0cmFuc2xhdGlvbiB2YWx1ZXMKK3NlYXJjaF92YWx1ZXM9VHJhbnNsYXRpb25zCisKKyMKKyMgQGdyb3VwIFRhYnMKKyMKKyMgQGdyb3VwQ29tbWVudCBHVUkgVGFicyBpbiB0aGUgbWFpbiBwYW5lbAorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdVSSBUYWIgZm9yIFRhYmJlZCBQYW5lIG92ZXIgdGhlIHRyZWUgc2hvd2luZyBhIHNpbmdsZSByZXNvdXJjZSBidW5kbGUgYW5kIGl0cyB2YXJpb3VzIGZpbGVzCit0YWJfYnVuZGxlPUJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRhYiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIHZhcmlvdXMgZ3JvdXBzIGluIHRoZSBidW5kbGUKK3RhYl9ncm91cHM9R3JvdXBzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdVSSBUYWIgZm9yIHRhYiBvdmVyIHRyZWUgc2hvd2luZyBhIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0Cit0YWJfcHJvamVjdD1Qcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwYW5lIGFsbG93aW5nIGZvciBzZWFyY2ggYW5kIHJlcGxhY2UgZnVuY3Rpb25zCit0YWJfc2VhcmNoPVNlYXJjaAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRhYiBmb3Igc3RhdGlzdGljcyBkaXNwbGF5IGZvciBlaXRoZXIgdGhlIFJlc291cmNlIEJ1bmRsZSBhcyBhIHdob2xlIG9yIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgZmlsZXMKK3RhYl9zdGF0aXN0aWNzPVN0YXRpc3RpY3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUYWIgZm9yIGRpc3BsYXkgb2YgdW50cmFuc2xhdGVkIGl0ZW1zIGluIHRoZSBkaWZmZXJlbnQgbGFuZ3VhZ2UgZmlsZXMKK3RhYl91bnRyYW5zbGF0ZWQ9VW50cmFuc2xhdGVkCisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgR3JvdXBzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IENvbHVtbiB0aXRsZSBmb3IgaXRlbSBjb21tZW50cworbGFuZ3VhZ2Vncm91cF9jb2x1bW5fY29tbWVudD1Db21tZW50CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQ29sdW1uIHRpdGxlIGZvciBpdGVtJ3MgcmVzb3VyY2Uga2V5CitsYW5ndWFnZWdyb3VwX2NvbHVtbl9rZXk9UmVzb3VyY2VcIEtleQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorbGFuZ3VhZ2Vncm91cF9jb2x1bW5fdHJhbnNsYXRpb249VHJhbnNsYXRpb24KKworIworIyBAZ3JvdXAgVHJhbnNsYXRpb24gRmlsZSBTdGF0aXN0aWNzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgZm9yIHN0cmluZ3MgaW4gdGhlIGxhbmd1YWdlIGZpbGUgc3RhdGlzdGljcyBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBBIGNvbW1lbnQgZ2l2ZW4gdG8gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfY29tbWVudD1Db21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgY291bnRyeSBiZWluZyBkZXNjcmliZWQgYnkgdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfY291bnRyeT1Db3VudHJ5XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBpbiB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19pdGVtX2NvdW50PU51bWJlclwgb2ZcIFJlc291cmNlc1wgaW5cIHRoaXNcIExhbmd1YWdlXCBGaWxlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgbGFuZ3VhZ2UgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2xhbmd1YWdlPUxhbmd1YWdlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgbmFtZSBvZiBhIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhlIHRyYW5zbGF0aW9ucyBpbiB0aGlzIGxhbmd1YWdlIGZpbGUKK2xhbmd1YWdlc3RhdHNfbWFuYWdlcj1SZXNvdXJjZVwgRmlsZVwgTWFuYWdlclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxhbmd1YWdlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdGl0bGU9UmVzb3VyY2VcIFRpdGxlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBOdW1iZXIgb2YgcmVzb3VyY2VzIG5lZWRpbmcgdHJhbnNsYXRpb24gaW4gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdHJhbnNsYXRpb25fY291bnQ9TnVtYmVyXCBvZlwgVW50cmFuc2xhdGVkXCBSZXNvdXJjZVwgSXRlbXNcIGluXCB0aGlzXCBGaWxlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgbGFuZ3VhZ2UvcmVnaW9uIHZhcmlhbnQgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX3ZhcmlhbnQ9VmFyaWFudFw6CisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgVW50cmFuc2xhdGVkIEl0ZW1zIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSBjb2x1bW4gdGl0bGUgZm9yIGdyb3VwIG5hbWVzIG9mIGl0ZW1zIGluIHRoZSByb3dzCitsYW5ndWFnZXVudHJhbnNfY29sdW1uX2dyb3VwPUdyb3VwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIGtleSBvZiB0aGUgaXRlbSBhIHJvdworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9rZXk9UmVzb3VyY2VcIEtleQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSB0cmFuc2xhdGVkIHZhbHVlIG9mIGFuIGl0ZW0gaW4gYSByb3cKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fdHJhbnNsYXRpb249VHJhbnNsYXRpb24KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgY292ZXJpbmcgYnV0dG9ucyB0aGF0IGFwcGx5IHRvIGEgc2VsZWN0ZWQgcmVzb3VyY2UgZnJvbSBhIHRhYmxlIG9mIHJlc291cmNlcworbGFuZ3VhZ2V1bnRyYW5zX3NlbGVjdGVkX3Jlc291cmNlc19vcHRpb25zPU9wdGlvbnNcIGZvclwgU2VsZWN0ZWRcIFJlc291cmNlcwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXJfZGUucHJvcGVydGllcyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyX2RlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwYjkwNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyX2RlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMjEzIEBACisjIEBmaWxlICAgICAgICAgIFJCTS9HZXJtYW4KKyMgQGZpbGVFbmNvZGluZyAgZGUKKyMgQGZpbGVMYW5ndWFnZSAgRGV1dHNjaAorIyBAZmlsZUNvdW50cnkgICAKKyMgQGZpbGVWYXJpYW50ICAgCisjIEBmaWxlTWFuYWdlciAgIE1hcnRpbiBHZXJsYWNoCisjIEBmaWxlQ29tbWVudCAgIAorCisKKyMKKyMgQGdyb3VwIEJhc2UgQ2xhc3MgR3JvdXBzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbiBJdGVtcyBmb3IgdGhlIEJhc2UgQ2xhc3MgR3JvdXAgdGFiYmVkIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX2NvbW1lbnQ9R3J1cHBlbmtvbW1lbnRhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitiYXNlZ3JvdXBfZ3JvdXBfbmFtZT1HcnVwcGVubmFtZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitiYXNlZ3JvdXBfZ3JvdXBfb3B0aW9ucz1SZXNvdXJjZW5ncnVwcGVuLU9wdGlvbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitiYXNlZ3JvdXBfaXRlbV9vcHRpb25zPVJlc291cmNlbi1PcHRpb25lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2ZpbGVfZ3JvdXA9UmVzb3VyY2VuZGF0ZWllbgorCisjCisjIEBncm91cCBCYXNlIENsYXNzIFN0YXRpc3RpY3MgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IEFsbCB0cmFuc2xhdGlvbnMgZm9yIHN0cmluZ3MgYXBwZWFyaW5nIG9uIHRoZSBzdGF0aXN0aWNzIHBhbmUgZm9yIHRoZSBiYXNlIGNsYXNzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19kdXBsaWNhdGVzX2NvdW50PUFuemFobFwgbWVocmZhY2hlclwgUmVzb3VyY2Vuc2NobFx1MDBGQ3NzZWxcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2ZpbGVfY291bnQ9QW56YWhsXCBSZXNvdXJjZW5kYXRlaWVuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19ncm91cF9jb3VudD1BbnphaGxcIFJlc291cmNlbmdydXBwZW5cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2dyb3VwX2dyb3VwPVJlc291cmNlbmdydXBwZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19pdGVtX2NvdW50PUFuemFobFwgUmVzb3VyY2VuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19pdGVtX2dyb3VwPVJlc291cmNlbgorCisjCisjIEBncm91cCBCYXNlIENsYXNzIFVudHJhbnNsYXRlZCBJdGVtcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGFwcGVhcmluZyBvbiB0aGUgQmFzZSBDbGFzcyBVbnRyYW5zbGF0ZWQgSXRlbXMgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgZmlsZSBiZWluZyB2aWV3ZWQKK2Jhc2V1bnRyYW5zX2ZpbGU9RGF0ZWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiByZXNvdXJjZSBpdGVtcyBub3QgdHJhbnNsYXRlZCBpbiB0aGUgZmlsZQorYmFzZXVudHJhbnNfdW50cmFuc19jb3VudD1BbnphaGxcIG5pY2h0XCBcdTAwRkNiZXJzZXR6dGVyXCBSZXNvdXJjZW5cOgorCisjCisjIEBncm91cCBCdXR0b24gTmFtZXMKKyMKKyMgQGdyb3VwQ29tbWVudCBUaGUgbmFtZXMgZGlzcGxheWVkIG9uIHRoZSB2YXJpb3VzIGJ1dHRvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgbGFuZ3VhZ2UgZmlsZQorYnV0dG9uX2FkZF9maWxlPVJlc291cmNlbmRhdGVpXCBoaW56dWZcdTAwRkNnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAyLTEyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2ZpbGVfdHJpZ2dlcj1oCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorYnV0dG9uX2FkZF9ncm91cD1SZXNvdXJjZW5ncnVwcGVcIGhpbnp1Zlx1MDBGQ2dlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9hZGRfZ3JvdXBfdHJpZ2dlcj1nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSB0cmFuc2xhdGlvbiBpdGVtCitidXR0b25fYWRkX3Jlc291cmNlPVJlc291cmNlXCBoaW56dWZcdTAwRkNnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX3Jlc291cmNlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIGNhbmNlbGluZyBhY3Rpb25zCitidXR0b25fY2FuY2VsPUFiYnJlY2hlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZW5lcmljIGJ1dHRvbiBmb3IgYSBjaG9pY2Ugb3Igc2VsZWN0aW9uIG9wdGlvbgorYnV0dG9uX2Nob29zZT1BdXN3XHUwMEU0aGxlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jaG9vc2VfdHJpZ2dlcj1BCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBnZW5lcmljIGNyZWF0aW9uIG9mIGdyb3VwcywgaXRlbXMsIGZpbGVzLCBldGMuCitidXR0b25fY3JlYXRlPUVyemV1Z2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBGb3IgY3JlYXRpb24gb2YgYSByZXNvdXJjZSBncm91cAorYnV0dG9uX2NyZWF0ZV9ncm91cD1HcnVwcGVcIGVyemV1Z2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9ncm91cF90cmlnZ2VyPWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBjcmVhdGluZyBhbiBpdGVtIHRoZW4gY29udGludWluZyBjcmVhdGluZyBtb3JlIGl0ZW1zCitidXR0b25fY3JlYXRlX21vcmU9RXJ6ZXVnZW5cICZcIFdlaXRlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfbW9yZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSByZXNvdXJjZSB0cmFuc2xhdGlvbiBpdGVtCitidXR0b25fY3JlYXRlX3Jlc291cmNlPVJlc291cmNlXCBlcnpldWdlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDItMTIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfcmVzb3VyY2VfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0xMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcmVtb3ZpbmcgYSBncm91cCBhbmQgaXRzIGNvbnRlbnRzCitidXR0b25fZGVsZXRlX2dyb3VwPUdydXBwZVwgbFx1MDBGNnNjaGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBCdXR0b24gZm9yIHBlcm1hbmVudGx5IHJlbW92aW5nIGEgcmVzb3VyY2UgZnJvbSB0aGUgYnVuZGxlCitidXR0b25fZGVsZXRlX3Jlc291cmNlPVJlc291cmNlXCBsXHUwMEY2c2NoZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAyLTEyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fZGVsZXRlX3Jlc291cmNlX3RyaWdnZXI9bAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEdlbmVyaWMgZWRpdCBidXR0b24KK2J1dHRvbl9lZGl0PUJlYXJiZWl0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyBncm91cCBuYW1lIGFuZCBjb21tZW50CitidXR0b25fZWRpdF9ncm91cD1HcnVwcGVcIGJlYXJiZWl0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyByZXNvdXJjZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGtleSBhbmQgdHJhbnNsYXRpb24KK2J1dHRvbl9lZGl0X3Jlc291cmNlPVJlc291cmNlXCBiZWFyYmVpdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0xMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2VkaXRfcmVzb3VyY2VfdHJpZ2dlcj1iCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3IgaW5pdGlhdGluZyBhbiBpbXBvcnQgb2YgcmVzb3VyY2VzIGZyb20gYW4gYWx0ZXJuYXRlIHNvdXJjZQorYnV0dG9uX2ltcG9ydD1JbXBvcnRpZXJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9pbXBvcnRfdHJpZ2dlcj1pCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiBhbGxvd3MgYSBzZWxlY3RlZCByZXNvdXJjZSB0byBiZSBtYXJrZWQgYXMgdHJhbnNsYXRlZCB3aXRob3V0IGZ1cnRoZXIgZWRpdGluZworYnV0dG9uX21hcmtfdHJhbnNsYXRlZD1SZXNvdXJjZVwgYWxzXCBcdTAwRkNiZXJzZXR6dFwgbWFya2llcmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX21hcmtfdHJhbnNsYXRlZF90cmlnZ2VyPW0KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgYWRkaW5nIHRoZSBjdXJyZW50IHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgbWFpbiBhcHBsaWNhdGlvbiB0byB0aGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfYWRkPUFkZFwgQ3VycmVudFwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X2FkZF90cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY2xvc2luZyB0aGUgcHJvamVjdCB3aW5kb3cKK2J1dHRvbl9wcm9qZWN0X2Nsb3NlPUNsb3NlXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X2Nsb3NlX3RyaWdnZXI9YworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfbmV3PU5ld1wgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9uZXdfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIG9wZW5pbmcgYSBwcm9qZWN0IGZpbGUKK2J1dHRvbl9wcm9qZWN0X29wZW49T3BlblwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9vcGVuX3RyaWdnZXI9bworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciByZW1vdmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlIGJ1bmRsZSBmcm9tIHRoZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9yZW1vdmU9UmVtb3ZlXCBTZWxlY3Rpb24KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfcmVtb3ZlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjYXVzaW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBidW5kbGUgdG8gYmUgdGhlIG9uZSBiZWluZyBlZGl0ZWQgaW4gdGhlIG1haW4gYXBwbGljYXRpb24KK2J1dHRvbl9wcm9qZWN0X3NlbGVjdD1FZGl0XCBTZWxlY3RlZAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9zZWxlY3RfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwZXJmb3JtaW5nIGEgY29tcGxldGUgc2VhcmNoCitidXR0b25fc2VhcmNoX2ZpbmRfYWxsPUFsbGVcIGZpbmRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9zZWFyY2hfZmluZF9hbGxfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwZXJmb3JtaW5nIGNvbXBsZXRlIHNlYXJjaCBhbmQgcmVwbGFjZQorYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbD1BbGxlXCBlcnNldHplbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9zZWFyY2hfcmVwbGFjZV9hbGxfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIHVwZGF0aW5nIGluZm9ybWF0aW9uCitidXR0b25fdXBkYXRlPVx1MDBDNG5kZXJuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0xMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX3VwZGF0ZV90cmlnZ2VyPW4KKworIworIyBAZ3JvdXAgRGlhbG9ncworIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9ucyB2YXJpb3VzIGRpYWxvZyBib3hlcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB3ZXRoZXIgb3Igbm90IGEgbmV3IGZpbGUgd2lsbCBiZSBwb3B1bGF0ZWQgZnJvbSB0aGUgZWxlbWVudHMgaW4gdGhlIGJhc2UgY2xhc3MKK2RpYWxvZ19jaGVja2JveF9jb3B5X2VsZW1lbnRzPUVpbnRyXHUwMEU0Z2VcIGF1c1wgZGVyXCBCYXNpc2tsYXNzZVwgaW5cIGRpZVwgbmV1ZVwgRGF0ZWlcIFx1MDBGQ2Jlcm5laG1lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEluZGljYXRvciBvZiB3ZXRoZXIgYW4gaXRlbSBpcyB0cmFuc2xhdGVkIG9yIG5vdAorZGlhbG9nX2NoZWNrYm94X3RyYW5zbGF0ZWQ9XHUwMERDYmVyc2V0enQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19jb21tZW50PUtvbW1lbnRhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfY291bnRyeT1MYW5kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfY3JlYXRlZD1FcnpldWd0XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19jcmVhdG9yPUVyemV1Z3RcIGR1cmNoXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAezF9IFRoZSBkYXRlCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiBpbnZvbHZlZAorIyBAY29tbWVudCBUaGUgZGF0ZSBhbmQgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhIGNyZWF0aW9uIG9yIG1vZGlmaWNhdGlvbiBvZiBhbiBpdGVtCitkaWFsb2dfZGF0ZV9wZXJzb249ezB9XCBhbVwgezF9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVmYXVsdF9jb21tZW50PURlZmF1bHQtS29tbWVudGFyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWZhdWx0X3RyYW5zbGF0aW9uPURlZmF1bHQtXHUwMERDYmVyc2V0enVuZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVsZXRlX2ZpbGU9UmVzb3VyY2VuZGF0ZWlcIGxcdTAwRjZzY2hlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9ncm91cD1SZXNvdXJjZW5ncnVwcGVcIGxcdTAwRjZzY2hlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9pdGVtPVJlc291cmNlXCBsXHUwMEY2c2NoZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBXYXJuaW5nIGRpc3BsYXllZCB3aGVuIGEgdXNlciBhc2tzIGZvciBhIGRlbGV0aW9uIG9mIGEgZmlsZS4gUHJvbXB0cyBmb3IgJ1llcycgb3IgJ05vJworZGlhbG9nX2RlbGV0ZV93YXJuaW5nPVdhcm51bmdcIVwgRGllc2VcIE9wZXJhdGlvblwga2FublwgbmljaHRcIHJ1ZWNrZ2FlbmdpZ1wgZ2VtYWNodFxud2VyZGVuLlwgU2luZFwgU2llXCBzaWNocmUsXCBkYXNzXCBzaWVcIGZvcnRmYWhyZW5cIG1vZWNodGVuPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2VuY29kaW5nPUVuY29kaW5nXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX2NvbW1lbnQ9UmVzb3VyY2VuZGF0ZWlrb21tZW50YXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uPUJhc2lza2xhc3Nlbi1SZXNvdXJjZW5kYXRlaWVuXCAoLnByb3BlcnRpZXMpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERlc2NyaXB0aW9uIG9mIEZpbGUgRmlsdGVyIGZvciBSQlJlcG9ydGVyIFhNTCBzY2FuIGNvbmZpZ3VyYXRpb24gZmlsZXMKK2RpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbl9zY2FuPVhNTFwgUkJSZXBvcnRlclwgU2NhblwgRGF0ZWllbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfaW5mbz1EYXRlaWluZm9ybWF0aW9uZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX21hbmFnZXI9TmFtZVwgZGVzXCBSZXNvdXJjZW5tYW5hZ2Vyc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV90aXRsZT1UaXRlbFwgZGVyXCBSZXNvdXJjZW5kYXRlaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfZ3JvdXA9R3J1cHBlbm5hbWVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2dyb3VwX2NvbW1lbnQ9R3J1cHBlbmtvbW1lbnRhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfa2V5PUVpbnRyYWdzc2NobFx1MDBGQ3NzZWxcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2xhbmd1YWdlPVNwcmFjaGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19sb29rdXBzPVBhcmFtZXRlclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfbW9kaWZpZWQ9WnVsZXR6dFwgZ2VcdTAwRTRuZGVydFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfbW9kaWZpZXI9WnVsZXR6dFwgZ2VcdTAwRTRuZGVydFwgZHVyY2hcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBuYW1lIG9mIGEgbGFuZ3VhZ2UsIGNvdW50cnksIG9yIHZhcmlhbnQgb2YgYSBsYW5ndWFnZSBmaWxlCitkaWFsb2dfbmFtZT1OYW1lXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIGEgbmFtZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSwgYmVmb3JlIGNyZWF0aW5nIHRoYXQgYnVuZGxlCitkaWFsb2dfbmV3X2Jhc2VjbGFzcz1CaXR0ZVwgZ2ViZW5cIFNpZVwgZWluZW5cIE5hbWVuXCBmXHUwMEZDclwgZGllXCBCYXNpc2tsYXNzZVwgZGVzXCBuZXVlblwgUmVzb3VyY2UtQnVuZGxlc1wgZWluLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGlhbG9nIHBvcHVwIHdpbmRvdyB0ZXh0IHByb21wdGluZyB0aGUgdXNlciBmb3IgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorZGlhbG9nX25ld19wcm9qZWN0PVBsZWFzZVwgZW50ZXJcIGFcIHRpdGxlXCBmb3JcIHlvdXJcIG5ld1wgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWxlcyBtYWtpbmcgaXQgdGhyb3VnaCB0aGUgZmlsdGVyIHVwb24gb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZQorZGlhbG9nX29wZW5fZmlsZV9maWx0ZXI9QmFzaXNrbGFzc2VuLVJlc291cmNlbmRhdGVpZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGlzIGlzIGEgc2VjdGlvbiBoZWFkaW5nIGZvciBzZXR0aW5nIHRoZSBsb2NhbGUKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGU9TG9jYWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTG9jYWxlcyBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGUgcHJvcGVydGllcyBmaWxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX2RlZmluZWQ9RGVmaW5pZXJ0XCBmXHUwMEZDclwgUkJNYW5hZ2VyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9pc289SVNPLVN0YW5kYXJkc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTG9jYWxlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgSmF2YSBWaXJ0dWFsIE1hY2hpbmUKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfbWFjaGluZT1Wb25cIGRpZXNlbVwgU3lzdGVtXCB1bnRlcnN0XHUwMEZDdHp0XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV93YXJuaW5nPUFOTUVSS1VOR1w6XCBcdTAwQzRuZGVydW5nZW5cIGRlclwgTG9jYWxlXCB3aXJrZW5cIHNpY2hcIGVyc3RcIGJlaW1cIG5cdTAwRTRjaHN0ZW5cIFN0YXJ0XCBkZXJcIEFud2VuZHVuZ1wgYXVzLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvb2thbmRmZWVsPUxvb2tcIEFuZFwgRmVlbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfdXNlcm5hbWU9QmVudXR6ZXJuYW1lXDoKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERlc2NyaXB0b3IgdGhhdCBnb2VzIGludG8gR1VJIGZpbGUgY2hvb3NlcgorZGlhbG9nX3Byb2plY3RfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb249UkJNYW5hZ2VyXCBQcm9qZWN0XCBGaWxlcworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRmlsZSBGaWx0ZXIgZGVzY3JpcHRpb24gZm9yIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0IGZpbGVzCitkaWFsb2dfcHJvamVjdF9maWx0ZXJfZGVzY3JpcHRpb249UmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdHMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gdGhhdCBubyBwcm9qZWN0IGlzIG9wZW4sIHBsYWNlZCBpbiB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aGVyZSB0aGUgcHJvamVjdCBuYW1lIHdvdWxkIG5vcm1hbGx5IGdvCitkaWFsb2dfcHJvamVjdF9ub25lX3NlbGVjdGVkPU5vXCBBY3RpdmVcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHByb2plY3QKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSB3aW5kb3cgc2hvd2luZyBhbGwgdGhlIHJlc291cmNlIGJ1bmRsZXMgaW4gYSBwcm9qZWN0CitkaWFsb2dfcHJvamVjdF90aXRsZT1SZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0XDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFByb21wdHMgdGhlIHVzZXIgaWYgdGhleSB3b3VsZCBsaWtlIHRvIHNhdmUgY2hhbmdlcyBiZWZvcmUgZXhpdGluZworZGlhbG9nX3F1aXRfc2F2ZT1NXHUwMEY2Y2h0ZW5cIFNpZVwgSWhyZVwgXHUwMEM0bmRlcnVuZ2VuXCB2b3JcIGJlZW5kZW5cIHZvblwgUkJNYW5hZ2VyXCBzcGVpY2hlcm4/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEEgZ2VuZXJpYyBwcm9wbXB0IHRvIGFzayB0aGUgdXNlciBpZiB0aGV5IHdpc2ggdG8gc2F2ZSBjaGFuZ2VzCitkaWFsb2dfc2F2ZT1NXHUwMEY2Y2h0ZW5cIFNpZVwgSWhyZVwgXHUwMEM0bmRlcnVuZ2VuXCBzcGVpY2hlcm4/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfc2VhcmNoX29wdGlvbnM9U3VjaG9wdGlvbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfc2VhcmNoX3BhcmFtPVN1Y2hlXCBuYWNoXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgdGl0bGUgb2YgdGhlIGFib3V0IGRpYWxvZyBib3gKK2RpYWxvZ190aXRsZV9hYm91dF9yYm1hbmFnZXI9XHUwMERDYmVyXCBSQk1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGRpYWxvZyBwcm9tcHRpbmcgZm9yIGRlbGV0aW9uIG9mIGFuIGVudGlyZSByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX2RlbGV0ZV9ncm91cD1SZXNvdXJjZW5ncnVwcGVuXCBsXHUwMEY2c2NoZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgd2hlbiBwcm9tcHRpbmcgdG8gZGVsZXRlIGEgcmVzb3VyY2UKK2RpYWxvZ190aXRsZV9kZWxldGVfaXRlbT1SZXNvdXJjZVwgbFx1MDBGNnNjaGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZWRpdF9ncm91cD1SZXNvdXJjZW5ncnVwcGVcIGJlYXJiZWl0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lZGl0X2l0ZW09UmVzb3VyY2VcIGJlYXJiZWl0ZW4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2Vycm9yPUVycm9yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZXJyb3JfY3JlYXRpbmdfYnVuZGxlPUZlaGxlclwgYmVpbVwgZXJ6ZXVnZW5cIGRlc1wgUmVzb3VyY2UtQnVuZGxlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjIgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgd2hlbiBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlIG5vdCBjcmVhdGVkIGJ5IFJCTWFuYWdlcgorZGlhbG9nX3RpdGxlX2Vycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0PUZlaGxlclw6XCBSZXNvdXJjZVwgQnVuZGxlXCBpc3RcIG5pY2h0XCBsZXNiYXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBUaXRsZSBvbiBhIHdhcm5pbmcgZGlhbG9nIHRoYXQgSS9PIG1hbGZ1bmN0aW9uZWQgb3BlbmluZyBhIGZpbGUKK2RpYWxvZ190aXRsZV9lcnJvcl9vcGVuaW5nX2ZpbGU9RmVobGVyXCBiZWltXCBPZWZmbmVuXCBkZXJcIERhdGVpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBhIGRpYWxvZyBib3ggZm9yIGVudGVyaW5nIHNwZWNpYWwgcGFyYW1ldGVycyBuZWVkZWQgdG8gZXhwb3J0IGEgcmVzb3VyY2UgYnVuZGxlIHRvIGphdmEgY2xhc3MgY29kZQorZGlhbG9nX3RpdGxlX2V4cG9ydF9qYXZhX29wdGlvbnM9RXhwb3J0LVBhcmFtZXRlclw6XCBKYXZhLUtsYXNzZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgYSBkaWFsb2cgd2l0aCBhIHByb2dyZXNzIGJhciBnb3Zlcm5pbmcgaW1wb3J0IHN0YXR1cworZGlhbG9nX3RpdGxlX2ltcG9ydF9wcm9ncmVzcz1JbXBvcnRzZm9ydHNjaHJpdHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgbmV3IGJ1bmRsZQorZGlhbG9nX3RpdGxlX25ld19idW5kbGU9TmV1ZXNcIFJlc291cmNlLUJ1bmRsZVwgZXJ6ZXVnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZmlsZQorZGlhbG9nX3RpdGxlX25ld19maWxlPU5ldWVcIFJlc291cmNlbmRhdGVpXCBlcnpldWdlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX25ld19ncm91cD1OZXVlXCBSZXNvdXJjZW5ncnVwcGVcIGVyemV1Z2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIHJlc291cmNlCitkaWFsb2dfdGl0bGVfbmV3X2l0ZW09TmV1ZVwgUmVzb3VyY2VcIGVyemV1Z2VuCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUaXRsZSBvZiB0aGUgZGlhbG9nIGJveCBzaG93aW5nIHdoZW4gY3JlYXRpbmcgYSBuZXcgcHJvamVjdAorZGlhbG9nX3RpdGxlX25ld19wcm9qZWN0PU5ld1wgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX3ByZWZlcmVuY2VzPUVpbnN0ZWxsdW5nZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaXRsZSBmb3IgY29uZmlybWluZyBleGl0IGZyb20gYXBwbGljYXRpb24KK2RpYWxvZ190aXRsZV9xdWl0PVJCTWFuYWdlclwgYmVlbmRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX3NlYXJjaD1TdWNoZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX3VzZXJfbmFtZT1CZW51dHplcm5hbWVuXCBlaW5nZWJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3RyYW5zbGF0aW9uPVx1MDBEQ2JlcnNldHp0dW5nXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ191c2VyX25hbWU9Qml0dGVcIGdlYmVuXCBTaWVcIElocmVuXCBOYW1lblwgZWluLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3ZhcmlhbnQ9VmFyaWFudGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ193YXJuaW5nX2RlbGV0ZV9ncm91cD1EYXNcIExcdTAwRjZzY2hlblwgZGllc2VyXCBHcnVwcGVcIGJld2lya3RcIGRpZVwgcGVybWFuZW50ZVwgTFx1MDBGNnNjaHVuZ1wgYWxsZXJcIFJlc291cmNlblwgZGllc2VyXCBHcnVwcGUuXCBNXHUwMEY2Y2h0ZW5cIFNpZVwgZGllXCBHcnVwcGVcIGRlbm5vY2hcIGxcdTAwRjZzY2hlbj8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ193YXJuaW5nX2RlbGV0ZV9pdGVtPU1cdTAwRjZjaHRlblwgU2llXCBkaWVzZVwgUmVzb3VyY2VcIHdpcmtsaWNoXCBsXHUwMEY2c2NoZW4/CisKKyMKKyMgQGdyb3VwIEVycm9yIE1lc3NhZ2VzCisjCisjIEBncm91cENvbW1lbnQgCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yPUZlaGxlcgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIGFkZCBhIHJlc291cmNlIGJ1bmRsZSB0byBhIHByb2plY3QuCitlcnJvcl9hZGRpbmdfcHJvamVjdF9idW5kbGU9QW5cIGVycm9yXCBvY2N1cnJlZFwgdHJ5aW5nXCB0b1wgYWRkXCB0aGVcIFJlc291cmNlXCBCdW5kbGVcIHlvdVwgc2VsZWN0ZWQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9iYXNlY2xhc3Nfd2hpdGVzcGFjZT1SZXNvdXJjZW5uYW1lblwgZFx1MDBGQ3JmZW5cIGtlaW5lXCBXaGl0ZS1TcGFjZXNcIGVudGhhbHRlbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yX2J1bmRsZV9ub3RfY3JlYXRlZD1Fc1wgd3VyZGVcIGtlaW5cIFJlc291cmNlLUJ1bmRsZVwgZXJ6ZXVndC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yX2NyZWF0ZV9maWxlPUJlaW1cIEVyemV1Z2VuXCBkZXJcIFJlc291cmNlbmRhdGVpXCBpc3RcIGVpblwgUHJvYmxlbVwgYXVmZ2V0cmV0ZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfZ3JvdXA9QmVpbVwgRXJ6ZXVnZW5cIGRlclwgUmVzb3VyY2VuZ3J1cHBlXCBpc3RcIGVpblwgUHJvYmxlbVwgYXVmZ2V0cmV0ZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfaXRlbT1CZWltXCBFcnpldWdlblwgZGVzXCBFaW50cmFnc1wgaXN0XCBlaW5cIFByb2JsZW1cIGF1ZmdldHJldGVuLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIHdoZW4gY3JlYXRpbmcgYSBwcm9qZWN0CitlcnJvcl9jcmVhdGluZ19wcm9qZWN0PUFuXCBlcnJvclwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgY3JlYXRlXCBhXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBtZXNzYWdlIGZyb20gYW4gSU9FeGNlcHRpb24gdGhhdCBpcyB0aHJvd24KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSB3aGVuIHRyeWluZyB0byBkZWxldGUgYSBmaWxlCitlcnJvcl9kZWxldGluZz1CZWltXCBsXHUwMEY2c2NoZW5cIGRlclwgRGF0ZWlcIHswfVwgaXN0XCBlaW5cIEZlaGxlclwgYXVmZ2V0cmV0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBBbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkZWxldGUgYSBmaWxlLCBidXQgdGhlIHZpcnR1YWwgbWFjaGluZSBjYW4gbm90IGRvIHNvCitlcnJvcl9kZWxldGlvbl9ub3RfcG9zc2libGU9UkJNYW5hZ2VyXCBrb25udGVcIGRpZVwgRGF0ZWlcIG5pY2h0XCBsb2VzY2hlbi5cIFp1Z2FuZ1wgdmVyd2VpZ2VydC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIGZvciBleHBvcnRpbmcgcmVzb3VyY2UgYnVuZGxlcworZXJyb3JfZXhwb3J0PUVpblwgRmVobGVyXCBpc3RcIGJlaW1cIEV4cG9ydGllcmVuXCBkZXNcIFJlc291cmNlbmJcdTAwRkNuZGVsc1wgYXVmZ2V0cmV0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yX2ludGVybmFsPUludGVybmVyXCBGZWhsZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9maWxlPUJlaW1cIFx1MDBDNG5kZXJuXCBkZXJcIFJlc291cmNlbmRhdGVpXCBpc3RcIGVpblwgUHJvYmxlbVwgYXVmZ2V0cmV0ZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfZ3JvdXA9QmVpbVwgXHUwMEM0bmRlcm5cIGRlclwgUmVzb3VyY2VuZ3J1cHBlXCBpc3RcIGVpblwgUHJvYmxlbVwgYXVmZ2V0cmV0ZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfaXRlbT1CZWltXCBcdTAwQzRuZGVyblwgZGVzXCBFaW50cmFnc1wgaXN0XCBlaW5cIFByb2JsZW1cIGF1ZmdldHJldGVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9maWxlPVVtXCBlaW5lXCBSZXNvdXJjZW5kYXRlaVwgenVcIGVyemV1Z2VuLFwgbVx1MDBGQ3NzZW5cIFNpZVwgenVuXHUwMEU0Y2hzdFwgZWluXCBSZXNvdXJjZS1CdW5kbGVcIGVyemV1Z2VuXCBvZGVyXCBcdTAwRjZmZm5lbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yX25vX2J1bmRsZV9mb3JfZ3JvdXA9VW1cIGVpbmVcIFJlc291cmNlbmdydXBwZVwgenVcIGVyemV1Z2VuLFwgbVx1MDBGQ3NzZW5cIFNpZVwgenVuXHUwMEU0Y2hzdFwgZWluXCBSZXNvdXJjZS1CdW5kbGVcIGVyemV1Z2VuXCBvZGVyXCBcdTAwRjZmZm5lbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIGNyZWF0ZSBhIHJlc291cmNlLCB3aXRob3V0IGFuIG9wZW4gcmVzb3VyY2UgYnVuZGxlCitlcnJvcl9ub19idW5kbGVfZm9yX2l0ZW09VW1cIGVpbmVcIFJlc291cmNlXCB6dVwgZXJ6ZXVnZW4sXCBtXHUwMEZDc3NlblwgU2llXCB6dW5cdTAwRTRjaHN0XCBlaW5cIFJlc291cmNlLUJ1bmRsZVwgZXJ6ZXVnZW5cIG9kZXJcIFx1MDBGNmZmbmVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2Vycm9yX25vX2tleV9yZXBsYWNlPUVyc2V0emVuXCBmXHUwMEZDclwgUmVzb3VyY2Vuc2NobFx1MDBGQ3NzZWxcIGlzdFwgbmljaHRcIGVybGF1YnQuXCBBbGxlXCBhbmRlcmVuXCBFcnNldHp1bmdlblwgd2VyZGVuXCBkdXJjaGdlZlx1MDBGQ2hydC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiB0aGF0IFJCTWFuYWdlciBjYW4gbm90IHJlYWQgdGhlIGZpbGUgYXMgY3JlYXRlZCBieSBSQk1hbmFnZXIKK2Vycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0PURpZVwgYXVzZ2V3XHUwMEU0aGx0ZVwgUmVzb3VyY2VcIHd1cmRlXCBuaWNodFwgdm9tXCBSQk1hbmFnZXJcIGVyemV1Z3RcIG9kZXJcIGlzdFwgYmVzY2hcdTAwRTRkaWd0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd291bGQgbm90IG9wZW4KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBvY2N1cmluZyBvbiBhbiBJL08gZXJyb3IgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlCitlcnJvcl9vcGVuaW5nX2ZpbGU9S29ubnRlXCBkaWVcIERhdGVpXCB7MH1cIG5pY2h0XCBcdTAwRjZmZm5lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIFJCTWFuYWdlciBlbmNvdW50ZXJzIGFuIGVycm9yIHdyaXRpbmcgcHJlZmVyZW5jZXMgdG8gdGhlIGZpbGUgc3lzdGVtCitlcnJvcl9wcmVmZXJlbmNlc19zYXZlPUVpblwgRmVobGVyXCBpc3RcIGJlaW1cIFNwZWljaGVyblwgZGVyXCBFaW5zdGVsbHVuZ2VuXCBhdWZnZXRyZXRlbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQKKyMgQGNvbW1lbnQgQSBtZXNzYWdlIHByZXNlbnRlZCB0byB0aGUgdXNlciB3aGVuIGFuIGVycm9yIG9jY3VycyBpbiBzYXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZQorZXJyb3Jfc2F2aW5nPUJlaW1cIFNwZWljaGVyblwgZGVzXCBSZXNvdXJjZVwgQnVuZGxlc1wgaXN0XCBlaW5cIEZlaGxlclwgYXVmZ2V0cmV0ZW5cOlwgezB9CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBzYXZpbmcgYSBwcm9qZWN0CitlcnJvcl9zYXZpbmdfcHJvamVjdD1BblwgZXJyb3JcIHdhc1wgZW5jb3VudGVyZWRcIHRyeWluZ1wgdG9cIHNhdmVcIHRoZVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU3VnZ2VzdCB0cnlpbmcgdG8gaW1wb3J0IHRoZSByZXNvdXJjZSBidW5kbGUgaW5zdGVhZCBvZiBvcGVuaW5nIGl0LgorZXJyb3Jfc3VnZ2VzdF9pbXBvcnRfcHJvcGVydGllcz1WZXJzdWNoZW5cIFNpZVwgYWx0ZXJuYXRpdlwgZGFzXCBSZXNvdXJjZW5iXHUwMEZDbmRlbFwgenVcIGltcG9ydGllcmVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2ZpbGU9Qml0dGVcIHdcdTAwRTRobGVuXCBTaWVcIGFuZGVyZVwgRW5jb2RpbmctV2VydGUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5fZ3JvdXA9Qml0dGVcIHdcdTAwRTRobGVuXCBTaWVcIGVpbmVuXCBhbmRlcmVuXCBHcnVwcGVubmFtZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5faXRlbT1CaXR0ZVwgd1x1MDBFNGhsZW5cIFNpZVwgZWluZW5cIGFuZGVyZW5cIEVpbnRyYWdzc2NobFx1MDBGQ3NzZWwuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFZhbHVlIGluc2VydGVkIGludG8gdGFibGUgY2VsbHMgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJlZAordGFibGVfY2VsbF9lcnJvcj0qRmVobGVyKgorCisjCisjIEBncm91cCBFeHBvcnQKKyMKKyMgQGdyb3VwQ29tbWVudCBSZXNvdXJjZXMgZGVhbGluZyB3aXRoIGV4cG9ydCBvcHRpb25zCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHRoZSBwYXJhbWV0ZXIgZm9yIGNyZWF0ZWQgYSBwcm90ZWN0ZWQgY2xhc3MKK2V4cG9ydF9qYXZhX2NsYXNzX3Byb3RlY3RlZD0ncHJvdGVjdGVkXCBjbGFzcydcIGVyc3RlbGxlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcGFyYW1ldGVyIHNldHRpbmcgdGhlIGNyZWF0ZWQgY2xhc3MgYXMgcHVibGljCitleHBvcnRfamF2YV9jbGFzc19wdWJsaWM9J3B1YmxpY1wgY2xhc3MnXCBlcnN0ZWxsZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgcHJvdGVjdGVkIG1ldGhvZHMgaW4gdGhlIGphdmEgY2xhc3MKK2V4cG9ydF9qYXZhX21ldGhvZHNfcHJvdGVjdGVkPSdwcm90ZWN0ZWRcIG1ldGhvZHMnXCBlcnN0ZWxsZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgcHVibGljIG1ldGhvZHMKK2V4cG9ydF9qYXZhX21ldGhvZHNfcHVibGljPSdwdWJsaWNcIG1ldGhvZHMnXCBlcnN0ZWxsZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBUaXRsZSBvZiBhIGNoZWNrIGJveCBmb2xsb3dlZCBieSBhIHRleHQgZmllbGQgZm9yIHNwZWNpZnlpbmcgd2hldGhlciBvciBub3QgdG8gdXNlIGEgcGFja2FnZSBpbiB0aGUgZ2VuZXJhdGVkIGphdmEgY2xhc3MgYW5kIHdoYXQgdGhlIHBhY2thZ2Ugc2hvdWxkIGJlIGNhbGxlZAorZXhwb3J0X2phdmFfcGFja2FnZT1HZWJlblwgc2llXCBlaW5cICdwYWNrYWdlJ1wgYW5cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluCisjIEBjb21tZW50IFRleHQgcGxhY2VkIGluIGEgbGFiZWwgYXQgdGhlIHRvcCBvZiB0aGUgZGlhbG9nIGJveCBmb3Igc3BlY2lmeWluZyBwYXJhbWV0ZXJzIGNvbmNlcm5pbmcgdGhlIGV4cG9ydCBvZiByZXNvdXJjZSBidW5kbGVzIGludG8gYSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV90aXRsZT1CaXR0ZVwgZ2ViZW5cIFNpZVwgZGllXCBmb2xnZW5kZW5cIFBhcmFtZXRlclwgZnVlclwgZGllXCBKYXZhLUtsYXNzZVwgYW5cOgorCisjCisjIEBncm91cCBHZW5lcmFsCisjCisjIEBncm91cENvbW1lbnQgU29tZSBpdGVtcyB0aGF0IGFyZSBjb21tb24gYWNjcm9zcyBncm91cHMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBmaWxlIG9yIGNsYXNzIGNvbXBvc2VkIG9mIHRoZSBkZWZhdWx0IHRyYW5zbGF0aW9ucyBmb3IgdGhlIGJ1bmRsZQorYmFzZWNsYXNzPUJhc2lza2xhc3NlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwNC0wNi0yOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgR2VvcmdlCisjIEBjb21tZW50IFRoaXMgaXMgdGhlIGxlZ2FsIGNvcHlyaWdodCBub3RpY2UKK2NvcHlyaWdodD0oQylcIENvcHlyaWdodFwgSUJNXCBDb3JwLlwgMjAwMC0yMDA0XCAtXCBBbGxlXCBSZWNodGVcIHZvcmJlaGFsdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlcm5lcmFsIHVzZSBmb3IgZmlsZSBkaXJlY3RvcmllcworZGlyZWN0b3J5PVZlcnplaWNobmlzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitncm91cHM9R3J1cHBlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBuYW1lIG9mIHRoZSBpbWFnZSBmaWxlIGluIHRoZSAnSW1hZ2VzJyBkaXJlY3RvcnkgdGhhdCByZXByZXNlbnRzIHRoZSBsb2dvIHNlZW4gYXQgdGhlIHRvcCBvZiB0aGUgYXBwbGljYXRpb24KK2xvZ29fZmlsZW5hbWU9VGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVHJlZSBub2RlIHRpdGxlIHdoZW4gdmlld2luZyBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB2aWV3IHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIHByb2plY3QKK25vX3Byb2plY3Q9RGVmYXVsdFwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVHJlZSBub2RlIHRpdGxlIGRlZmF1bHRlZCB0byB3aGVuIG5vIHJlc291cmNlIGJ1bmRsZSBvciBwcm9qZWN0IGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlcgorbm9fcHJvamVjdF9idW5kbGU9Tm9cIFByb2plY3RcIG9yXCBSZXNvdXJjZVwgQnVuZGxlXCBPcGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIHRvcCB0cmVlIG5vZGUgdGl0bGUsIHdoZW4gbm8gcmVzb3VyY2UgYnVuZGxlIGhhcyBiZWVuIG9wZW5lZCBvciBjcmVhdGVkCitub19yZXNvdXJjZV9idW5kbGU9S2VpblwgUmVzb3VyY2UtQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitub25lPUtlaW4oZSkKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFByb2plY3QgdGFibGUgY29sdW1uIG5hbWUgLSBMb2NhdGlvbiBvZiBhIHJlc291cmNlIGJ1bmRsZQorcHJvamVjdF90YWJsZV9maWxlX2xvY2F0aW9uPUZpbGVcIExvY2F0aW9uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUYWJsZSBDb2x1bW4gTmFtZSBmb3IgcmVzb3VyY2UgYnVuZGxlIG5hbWUKK3Byb2plY3RfdGFibGVfcmVzb3VyY2VfYnVuZGxlPVJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBBbiBhYmJyZXZpYXRlZCBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24KK3JibWFuYWdlcj1SQk1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDA0LTA2LTI5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBHZW9yZ2UKKyMgQGNvbW1lbnQgCityYm1hbmFnZXJfY29udGFjdD1BdXRvclw6XCBKYXJlZFwgSmFja3NvblwgJlwgR2VvcmdlXCBSaG90ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgZnVsbCBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24KK3Jlc291cmNlX2J1bmRsZV9tYW5hZ2VyPVJlc291cmNlXCBCdW5kbGVcIE1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK3RhYmxlX2NvbHVtbl9lcnJvcj1UYWJlbGxlbnNwYWx0ZW5mZWhsZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAezB9IENvdW50cnkgSVNPIGNvZGUKKyMgQGNvbW1lbnQgTm9kZSB0aXRsZSwgdW5kZXIgd2hpY2ggYWxsIGZpbGVzIG9mIHRoZSBzYW1lIGNvdW50cnksIGxhbmd1YWdlIHJlc2lkZQordHJlZV9jb3VudHJ5X25vZGU9TFx1MDBFNG5kZXItQ29kZVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAezB9IExhbmd1YWdlIEVuY29kaW5nCisjIEBjb21tZW50IFRoZSBub2RlIGJlbG93IHdoaWNoIGxhbmd1YWdlcyBvZiBvbmUgZW5jb2RpbmcgYXJlIGdyb3VwZWQKK3RyZWVfbGFuZ3VhZ2Vfbm9kZT1TcHJhY2hlbi1Db2RlXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAordHJlZV92YXJpYW50X25vZGU9VmFyaWFudGVuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbmFtZSBhc3NpZ25lZCBhcyBhIHVzZXIgbmFtZSB3aGVuIHRoZSB1c2VyIG5hbWUgaXMgbm90IHNwZWNpZmllZAordW5rbm93bl91c2VyPVVuYmVrYW5udAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAordW50aXRsZWQ9VW5iZW5hbm50CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCit1bnRyYW5zbGF0ZWRfaXRlbXM9TmljaHRcIFx1MDBGQ2JlcnNldHp0ZVwgUmVzb3VyY2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQHswfSBUaGUgdmVyc2lvbiBudW1iZXIKKyMgQGNvbW1lbnQgVGhlIHZlcnNpb24gb2YgdGhpcyBhcHBsaWNhdGlvbgordmVyc2lvbj1WZXJzaW9uXCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZ2VuZXJhbCB1c2UgV2FybmluZword2FybmluZz1XYXJudW5nCisKKyMKKyMgQGdyb3VwIEltcG9ydAorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBkZWFsaW5nIHdpdGggaW1wb3J0IG9wdGlvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZmlsZSBjaG9vc2VyIGZvciBjaG9vc2luZyBUTVggZmlsZXMKK2ltcG9ydF9UTVhfZmlsZV9kZXNjcmlwdGlvbj1UTVhcIERhdGVpZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBUTVggWE1MIGZpbGVzCitpbXBvcnRfVE1YX3RpdGxlPVRNWFwgRGF0ZWlcIGltXCBwb3J0aWVyZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSBmaWxlIGNob29zZXIgZm9yIGNob29zaW5nIFhMSUZGICgueGxmKSBmaWxlcworaW1wb3J0X1hMRl9maWxlX2Rlc2NyaXB0aW9uPVhMSUZGXCBEYXRlaWVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gWExJRkYgKC54bGYpIGZpbGVzCitpbXBvcnRfWExGX3RpdGxlPVhMSUZGXCBEYXRlaVwgaW1cIHBvcnRpZXJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyBjb25mbGNpdHMgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMKK2ltcG9ydF9jb25mbGljdF9wcm9tcHQ9QmVpXCBqZWRlbVwgS29uZmlsa3RcIG5hY2hmcmFnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIHNwZWNpZnlpbmcgd2hldGhlciBhIGdyb3VwIGZvdW5kIGluIHRoZSB0YXJnZXQgYnV0IG5vdCBmb3VuZCBpbiB0aGUgYWN0aXZlIHJlc291cmNlIGJ1bmRsZSBzaG91bGQgYmUgY3JlYXRlZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlIG9yIG5vdAoraW1wb3J0X2RlZmF1bHRfZ3JvdXBfY3JlYXRpb249R3J1cHBlblwgZXJ6ZXVnZW4sXCBkaWVcIG5pY2h0XCBpbVwgYWt0dWVsbGVuXCBCXHUwMEZDbmRlbFwgZW50aGFsdGVuXCBzaW5kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdG9pbiBmb3IgbWFya2luZyB0aGUgaW5jb21pbmcgdmFsdWVzIGFzIHRyYW5zbGF0ZWQgb3Igbm90CitpbXBvcnRfZGVmYXVsdF90cmFuc2xhdGVkPUFsc1wgXHUwMEZDYmVyc2V0enRcIG1hcmtpZXJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3Igb3B0aW9ucyBzcGVjaWZ5aW5nIHRoZSBtZXRhIGRhdGEgdG8gYmUgYXBwbGllZCB0byBpbmRpdmlkdWFsIHJlc291cmNlcyBpZiBpdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBpbXBvcnQgc291cmNlCitpbXBvcnRfZGVmYXVsdF92YWx1ZXM9Vm9yZWluc3RlbGx1bmdlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBsb2NhbGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUgaW4gcXVlc3Rpb24KKyMgQGNvbW1lbnQgSW5zdHJ1Y3Rpb25zIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gcmVzb2x2ZSBhIGNvbmZsaWN0IHdoZW4gaW1wb3J0aW5nIHJlc291cmNlcyBmcm9tIGEgbG9jYWxlIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlCitpbXBvcnRfZmlsZV9jb25mbGljdF9jaG9vc2U9RGllXCBDb2RpZXJ1bmdcIHswfVwgZXhpc3RpZXJ0XCBuaWNodC5cIFdcdTAwRTRobGVuXCBTaWVcIGVpbmVcIE9wdGlvbixcIHVtXCBkYXNcIFByb2JsZW1cIHp1XCBsXHUwMEY2c2VuLFwgb2RlclwgQ2FuY2VsXCB1bVwgZGVuXCBLb25mbGlrdFwgenVcIGlnbm9yaWVyZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQsIGJ1dCBub3QgcG9wdWxhdGVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9lbXB0eT1FaW5lXCBuZXVlLFwgbGVlcmVcIFJlc291cmNlbmRhdGVpXCBlcnpldWdlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCBhIG5ldyBmaWxlIGlzIGdlbmVyYXRlZCBhbmQgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBleGlzdGluZyByZXNvdXJjZXMKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2dlbmVyYXRlX3BvcHVsYXRlPUVpbmVcIG5ldWVcIFJlc291cmNlbmRhdGVpXCBlcnpldWdlblwgdW5kXCBtaXRcIGRlblwgUmVzb3VyY2VuXCBkZXJcIEJhc2lza2xhc3NlXCBmXHUwMEZDbGxlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIGZpbGUgY29uZmxpY3RzIGluIHdoaWNoIHRoZSBjb25mbGljdHMgYXJlIGlnbm9yZWQKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2lnbm9yZT1BbGxlXCBSZXNvdXJjZW5cIGF1c1wgTG9rYWxncnVwcGVuLFwgZGllXCBuaWNodFwgaW5cIGltXCBha3R1ZWxsZW5cIFJlc291cmNlbmJcdTAwRkNuZGVsXCBleGlzdGllcmVuLFwgXHUwMEZDYmVyc3ByaW5nZW5cIHVuZFwgaWdub3JpZXJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3Igc2VjdGlvbiBsaXN0aW5nIG9wdGlvbnMgZm9yIHdoYXQgdG8gZG8gd2hlbiBhbiBpbXBvcnRlZCB2YWx1ZSBleGlzdHMgaW4gYSBsb2NhbGUgbm90IGRlZmluZWQgaW4gdGhlIGV4aXN0aW5nIHJlc291cmNlIGJ1bmRsZQoraW1wb3J0X2ZpbGVfY29uZmxpY3RzPVJlc291cmNlbmRhdGVpXCBuaWNodFwgZ2VmdW5kZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU2VsZWN0aW9uIG9mIHRoZSBkZWZhdWx0IGdyb3VwLiBBIGxpc3Qgb2YgZ3JvdXBzIHdpbGwgYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGlzIHJlc291cmNlIGluIGEgQ29tYm9Cb3gKK2ltcG9ydF9pbnNlcnRfZ3JvdXA9RWluZlx1MDBGQ2dlblwgaW5cIEdydXBwZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciB0aGUgdHlwZXMgb2YgZmlsZXMgYWNjZXB0ZWQgZm9yIHRoaXMgaW1wb3J0IHR5cGUKK2ltcG9ydF9qYXZhX2ZpbGVfZGVzY3JpcHRpb249SmF2YVwgTGlzdFJlc291cmNlQnVuZGxlXCBCYXNpc2tsYXNzZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGRpYWxvZyBwcm9tcHRpbmcgZm9yIGltcG9ydCBmcm9tIGphdmEgY2xhc3NlcworaW1wb3J0X2phdmFfdGl0bGU9SmF2YVwgTGlzdFJlc291cmNlQnVuZGxlXCBLbGFzc2VuaW1wb3J0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGluZGljYXRpbmcgc2VjdGlvbiBjb250YWluaW5nIHVzZXIgb3B0aW9ucworaW1wb3J0X29wdGlvbnM9SW1wb3J0b3B0aW9uZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGZpbGUgY2hvb3NlciBmb3Igc2VsZWN0aW9uIG9mIHJlc291cmNlIGJ1bmRsZXMgc3RvcmVkIGluIC5wcm9wZXJ0aWVzIGZpbGVzCitpbXBvcnRfcHJvcGVydGllc19maWxlX2Rlc2NyaXB0aW9uPUJhc2lza2xhc3NlblwgZGVzXCBSZXNvdXJjZW5iXHUwMEZDbmRlbHMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzIChjcmVhdGVkIG9yIG5vdCBieSBSQk1hbmFnZXIpCitpbXBvcnRfcHJvcGVydGllc190aXRsZT1Qcm9wZXJ0eS1EYXRlaWVuXCBpbXBvcnRpZXJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezF9IEVuY29kaW5nIG9mIHRoZSByZXNvdXJjZSB2YWx1ZSB3aXRoIGEgY29uZmxpY3QKKyMgQHswfSBUaGUga2V5IHZhbHVlIG9mIHRoZSByZXNvdXJjZSBpbiBjb25mbGljdAorIyBAY29tbWVudCBUaGlzIGlzIGEgd2FybmluZyBhbmQgaW5zdHJ1Y3Rpb24gZm9yIHdoZW4gYSByZXNvdXJjZSBjb25mbGljdCBvY2N1cnMgZHVyaW5nIGFuIGltcG9ydAoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZT1EZXJcIFNjaGxcdTAwRkNzc2VsXCB7MH1cIGV4aXN0aWVydFwgYmVyZWl0c1wgaW1cIFJlc291cmNlbmJcdTAwRkNuZGVsXCB7MX0uXCBXXHUwMEU0aGxlblwgU2llXCBlaW5lXCBPcHRpb25cIGF1cyxcIHVtXCBkaWVzZW5cIEtvbmZsaWt0XCB6dVwgbFx1MDBGNnNlblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIHRyYW5zbGF0aW9uIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UgaXRlbQorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgYWNjb3JkaW5nIHRvIHRoZSBpbXBvcnQgZmlsZQoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZV9zb3VyY2U9XHUwMERDYmVyc2V0enVuZ1wgaW1wb3J0aWVyZW5cOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIHRyYW5zbGF0aW9uIHZhbHVlIG9mIHRoZSByZXNvdXJjZSBpdGVtCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIHRyYW5zbGF0aW9uIHZhbHVlIGhlbGQgYnkgdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUgZHVyaW5nIGEgdHJhbnNsYXRpb24gcmVzb3VyY2UgY29uZmxpY3QKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2VfdGFyZ2V0PVx1MDBEQ2JlcnN0enVuZ1wgZGVzXCBSZXNvdXJjZW5iXHUwMEZDbmRlbHNcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIHJlc291cmNlIGNvbmZsaWN0cyBieSBpZ25vcmluZyBpbXBvcnQgdmFsdWUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9pZ25vcmU9S29uZmxpa3RcIGlnbm9yaWVyZW5cIHVuZFwgT3JpZ2luYWxyZXNvdXJjZVwgYmVpYmVoYWx0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgY29uZmxpY3RzIGJ5IHVzaW5nIHRoZSBpbXBvcnQgdmFsdWUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9vdmVyd3JpdGU9UmVzb3VyY2VcIG1pdFwgZGVtXCBXZXJ0XCBhdXNcIGRlclwgSW1wb3J0ZGF0ZWlcIFx1MDBGQ2JlcnNjaHJlaWJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBsaXN0aW5nIG9wdGlvbnMgZm9yIHJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiByZXNvdXJjZXMKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdHM9UmVzb3VyY2Vua29uZmxpa3RlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIHNvdXJjZSBmaWxlIGZvciB0aGUgaW1wb3J0CitpbXBvcnRfc291cmNlX2ZpbGU9UXVlbGxkYXRlaVw6XCB7MH0KKworIworIyBAZ3JvdXAgTWVudSBJdGVtcworIworIyBAZ3JvdXBDb21tZW50IFRoZXNlIHJlc291cmNlcyByZXByZXNlbnQgYWxsIG9mIHRoZSBtZW51IGFuZCBtZW51IGl0ZW0gdGl0bGVzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBtZW51IHRpdGxlIGNvdmVyaW5nIGNvcHlpbmcsIHBhc3RpbmcsIGRlbGV0aW5nIG9mIGl0ZW1zCittZW51X2VkaXQ9QmVhcmJlaXRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jb3B5PUtvcGllcmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2NvcHlfdHJpZ2dlcj1rCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2N1dD1BdXNzY2huZWlkZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY3V0X3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9kZWxldGU9TFx1MDBGNnNjaGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2RlbGV0ZV90cmlnZ2VyPWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfcGFzdGU9RWluZlx1MDBGQ2dlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9wYXN0ZV90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X2VkaXQnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfZWRpdF90cmlnZ2VyPWIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIHRoZSBvcGVuaW5nLCBzYXZpbmcsIGV0Yy4gZG9jdW1lbnRzIGFuZCBleGl0aW5nIHRoZSBwcm9ncmFtCittZW51X2ZpbGU9RGF0ZWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQWJpbGl0eSB0byBleHBvcnQgcmVzb3VyY2UgYnVuZGxlcyBpbiBhIHZhcmlldHkgb2YgZm9ybWF0cworbWVudV9maWxlX2V4cG9ydD1SZXNvdXJjZW5iXHUwMEZDbmRlbFwgZXhwb3J0aWVyZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAyLTA1LTE3IEBtb2RpZmllZCAyMDAyLTA1LTE3IEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgQWJsaXR5IHRvIGV4cG9ydCB0byBJQ1UgUmVzb3VyY2UgQnVuZGxlIGZpbGVzCittZW51X2ZpbGVfZXhwb3J0X0lDVT1JQ1VcIERva3VtZW50ZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDItMDUtMTcgQG1vZGlmaWVkIDIwMDItMDUtMTcgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfSUNVX3RyaWdnZXI9aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmxpdHkgdG8gZXhwb3J0IHRvIFRNWCBYTUwgZmlsZXMKK21lbnVfZmlsZV9leHBvcnRfVE1YPVRNWFwgRGF0ZWllbi4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfVE1YX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCB4CittZW51X2ZpbGVfZXhwb3J0X1hMRj1YTElGRlwgRGF0ZWllbi4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfWExGX3RyaWdnZXI9eAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCB0byBqYXZhIGZpbGVzIHRoYXQgY29tcGlsZSB0byBiZSBMaXN0UmVzb3VyY2VCdW5kbGUgY2xhc3MgZXh0ZW5zaW9ucworbWVudV9maWxlX2V4cG9ydF9qYXZhPUtvbXBpbGllcmJhcmVcIEphdmFcIERhdGVpZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X2phdmFfdHJpZ2dlcj1qCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEV4cG9ydCBhYmlsaXR5IHRvIHByb3BlcnRpZXMgZmlsZXMgbWludXMgdGhlIG1ldGFkYXRhCittZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXM9TWluaW1hbGVcIEVpZ2Vuc2NoYWZ0c2RhdGVpZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXNfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF90cmlnZ2VyPXgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgaW1wb3J0IGFuZCBtZXJnaW5nIGFub3RoZXIgcmVzb3VyY2UgZmlsZSB3aXRoIHRoZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9pbXBvcnQ9UmVzb3VyY2UtQnVuZGxlXCBhdXNcIERhdGVpXCBpbXBvcnRpZXJlbi4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJsaWl0eSBmcm9tIFhNTCBUTVggZG9jdW1lbnRzCittZW51X2ZpbGVfaW1wb3J0X1RNWD1UTVhcIERva3VtZW50ZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfVE1YX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIFhNTCBYTElGRiAoLnhsZikgZmlsZXMKK21lbnVfZmlsZV9pbXBvcnRfWExGPVhMSUZGXCBEb2t1bWVudGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgWAorbWVudV9maWxlX2ltcG9ydF9YTEZfdHJpZ2dlcj14CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEltcG9ydCBhYmlsaXR5IGZyb20gamF2YSBjbGFzc2VzIChMaXN0UmVzb3VyY2VCdW5kbGUpCittZW51X2ZpbGVfaW1wb3J0X2phdmE9TGlzdFJlc291cmNlQnVuZGxlXCBKYXZhXCBLbGFzc2VuLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIHByb3BlcnRpZXMgZmlsZXMgbm90IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIKK21lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllcz1FaW5mYWNoZVwgUmVzb3VyY2VuYlx1MDBGQ25kZWwuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXNfdHJpZ2dlcj1TCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfdHJpZ2dlcj1tCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZQorbWVudV9maWxlX25ldz1OZXUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbWVudV9maWxlX25ld190cmlnZ2VyPW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3Igb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZQorbWVudV9maWxlX29wZW49XHUwMEQ2ZmZuZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbWVudV9maWxlX29wZW5fdHJpZ2dlcj1mCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNsb3NpbmcgdGhlIGFwcGxpY2F0aW9uCittZW51X2ZpbGVfcXVpdD1CZWVuZGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfZmlsZV9xdWl0X3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBzYXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZSBiZWluZyB3b3JrZWQgd2l0aAorbWVudV9maWxlX3NhdmU9U3BlaWNoZXJuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfZmlsZV9zYXZlX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBzYXZpbmcgYSByZXNvdXJjZSBidW5kbGUgdG8gYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUKK21lbnVfZmlsZV9zYXZlYXM9U3BlaWNoZXJuXCB1bnRlci4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfc2F2ZWFzX3RyaWdnZXI9dQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfZmlsZScgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9maWxlX3RyaWdnZXI9ZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3IgaGVscCBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbQorbWVudV9oZWxwPUhpbGZlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IGl0ZW0gd2hpY2ggYnJpbmdzIHVwIGEgZGlhbG9nIGRlc2NyaWJpbmcgdGhlIGFwcGxpY2F0aW9uCittZW51X2hlbHBfYWJvdXQ9XHUwMERDYmVyXCBSZXNvdXJjZVwgQnVuZGxlXCBNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfaGVscF9hYm91dF90cmlnZ2VyPWIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X2hlbHAnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfaGVscF90cmlnZ2VyPWgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIG9wdGlvbnMgc3VjaCBhcyBjcmVhdGluZyBuZXcgcmVzb3VyY2VzLCBncm91cHMsIGFuZCByZXNvdXJjZSBmaWxlcworbWVudV9vcHRpb25zPU9wdGlvbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGl0ZW0KK21lbnVfb3B0aW9uc19hZGRlbnRyeT1OZXVlblwgRWludHJhZ1wgaGluenVmXHUwMEZDZ2VuLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRlbnRyeV90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlL2NvdW50cnkvdmFyaWFudAorbWVudV9vcHRpb25zX2FkZGZpbGU9TmV1ZVwgUmVzb3VyY2VuZGF0ZWlcIGhpbnp1Zlx1MDBGQ2dlbi4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZmlsZV90cmlnZ2VyPWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZ3JvdXAKK21lbnVfb3B0aW9uc19hZGRncm91cD1OZXVlXCBSZXNvdXJjZW5ncnVwcGVcIGhpbnp1Zlx1MDBGQ2dlbi4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZ3JvdXBfdHJpZ2dlcj1nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBlZGl0aW5nIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMgZm9yIHRoZSBhcHBsaWNhdGlvbgorbWVudV9vcHRpb25zX3ByZWZlcmVuY2VzPUVpbnN0ZWxsdW5nZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19wcmVmZXJlbmNlc190cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSB0aGF0IG1ha2VzIHZpc2libGUgdGhlIHByb2plY3Qgdmlld2VyCittZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXI9T3BlblwgUHJvamVjdFwgVmlld2VyCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19wcm9qZWN0X3ZpZXdlcl90cmlnZ2VyPXYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X29wdGlvbnMnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfb3B0aW9uc190cmlnZ2VyPW8KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgYWRkaW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZSB0byB0aGUgcHJvamVjdAorbWVudV90cmVlX2FkZF9wcm9qZWN0X2J1bmRsZT1BZGRcIFJlc291cmNlXCBCdW5kbGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBkZWxldGluZyBwZXJtYW5lbnRseSBhIHJlc291cmNlIGZpbGUKK21lbnVfdHJlZV9kZWxldGU9UmVzb3VyY2VuZGF0ZWlcIGxcdTAwRjZzY2hlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgcmVtb3ZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHRyZWUgdmlldyBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCittZW51X3RyZWVfaGlkZT1SZXNvdXJjZW5kYXRlaVwgbmljaHRcIG1laHJcIGFuemVpZ2VuCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKK21lbnVfdHJlZV9uZXdfcHJvamVjdD1OZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuLi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0CittZW51X3RyZWVfb3Blbl9wcm9qZWN0PU9wZW5cIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuLi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBwcm9qZWN0IHRyZWUKK21lbnVfdHJlZV9yZW1vdmVfcHJvamVjdF9idW5kbGU9UmVtb3ZlXCBmcm9tXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBzYXZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBidW5kbGUgZmlsZQorbWVudV90cmVlX3NhdmU9UmVzb3VyY2VuZGF0ZWlcIHNwZWljaGVybgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBzYXZpbmcgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UgcHJvamVjdCBmaWxlLCBub3QgdGhlIHJlc291cmNlIGJ1bmRsZXMgdGhlbXNlbHZlcyB3aXRoaW4gdGhlIHByb2plY3QKK21lbnVfdHJlZV9zYXZlX3Byb2plY3Q9U2F2ZVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdFwgRmlsZS4uLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBmb3Igc2VsZWN0aW5nIGEgcmVzb3VyY2UgYnVuZGxlIGZyb20gdGhlIHByb2plY3QgdHJlZSB0byBiZSBlZGl0ZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSB0cmVlCittZW51X3RyZWVfc2VsZWN0X3Byb2plY3RfYnVuZGxlPVdvcmtcIHdpdGhcIHRoaXNcIFJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIGNoYW5naW5nIHRoZSBkaXNwbGF5IGJlaW5nIHNlZW4gYnkgdGhlIHVzZXIKK21lbnVfdmlldz1BbnNpY2h0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IGl0ZW0gdGhhdCB0YWtlcyB5b3UgZGlyZWN0bHkgdG8gdGhlIHN0YXRpc3RpY3MgcGFuZWwgZm9yIHRoZSBlbnRpcmUgYnVuZGxlCittZW51X3ZpZXdfc3RhdGlzdGljcz1SZXNvdXJjZVwgQnVuZGxlXCBTdGF0aXN0aWsKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbWVudV92aWV3X3N0YXRpc3RpY3NfdHJpZ2dlcj1zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV92aWV3JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X3ZpZXdfdHJpZ2dlcj1hCisKKyMKKyMgQGdyb3VwIFByb2plY3QgUGFuZWwKKyMKKyMgQGdyb3VwQ29tbWVudCBQYW5lbCBhc3NvY2lhdGVkIHdpdGggUHJvamVjdCBlZGl0aW5nCisKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorIyBAY29tbWVudCBMYWJlbCBpbmRpY2F0b3IgYXNzb2NpYXRpbmcgYSB0ZXh0IGJveCBjb250YWluaW5nIGEgdHJhbnNsYXRpb24gd2l0aCB0aGUgcmVzb3VyY2UgYnVuZGxlIHRoZSB0cmFuc2xhdGlvbiBjb21lcyBmcm9tCitwcm9qZWN0X3BhbmVsX2J1bmRsZT1SZXNvdXJjZVwgQnVuZGxlXDpcIHswfQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBOYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUKKyMgQGNvbW1lbnQgU3BlY2lhbCBpbmRpY2F0b3Igb2YgdGhlIHJlc291cmNlIGl0ZW0gcmVzb3VyY2UgYnVuZGxlIHdoZW4gdGhlIGl0ZW0gaXMgdW50cmFuc2xhdGVkCitwcm9qZWN0X3BhbmVsX2J1bmRsZV91bnRyYW5zbGF0ZWQ9UmVzb3VyY2VcIEJ1bmRsZVw6XCB7MH1cIChVbnRyYW5zbGF0ZWQpCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBMYWJlbCB0ZXh0IG1hcmtpbmcgdGhlIGxpbmUgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgYSByZXNvdXJjZSBjb21tZW50Citwcm9qZWN0X3BhbmVsX2NvbW1lbnQ9QmFzZVwgQ2xhc3NcIFJlc291cmNlXCBDb21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IExhYmVsIHRleHQgZm9yIGEgY29tbWVudCB3aGVuIG5vbmUgaXMgZm91bmQgZm9yIGEgcmVzb3VyY2UKK3Byb2plY3RfcGFuZWxfY29tbWVudF9ub25lPU5vXCBjb21tZW50XCBzdXBwbGllZAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIHNob3duIG9uIHRoZSBwcm9qZWN0IHBhbmVsIGZvciBjb21taXR0aW5nIGNoYW5nZSB0byBvbmUgcmVzb3VyY2Ugb25seQorcHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uPUNvbW1pdFwgQ2hhbmdlCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgb24gdGhlIHByb2plY3QgcGFuZWwgZm9yIHNhdmluZyBhbGwgb2YgdGhlIHJlc291cmNlcyBkaXNwbGF5ZWQuIFRoaXMgbWVhbnMgbXVsdGlwbGUgcmVzb3VyY2UgZmlsZXMgZ2V0IHNhdmVkLgorcHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uX2FsbD1Db21taXRcIEFsbFwgUmVzb3VyY2VcIENoYW5nZXMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERlZmF1bHQgdGl0bGUgc2hvd24gb24gdGhlIHByb2plY3QgcGFuZWwgd2hlbiBubyBwYXJ0aWN1bGFyIHJlc291cmNlIGhhcyBiZWVuIHNlbGVjdGVkCitwcm9qZWN0X3BhbmVsX2RlZmF1bHRfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmcKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRleHQgZmllbGQgbWFya2VyIGZvciB0aGUgdHJhbnNsYXRpb24gb2YgYSByZXNvdXJjZSB3aGVuIHRoYXQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBlbmNvZGluZyBmaWxlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aAorcHJvamVjdF9wYW5lbF9pdGVtX2luaGVyaXRzPTxOb1wgVHJhbnNsYXRpb25cOlwgUmVzb3VyY2VcIEluaGVyaXRzXCBmcm9tXCBwYXJlbnQ+CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBrZXkgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlCisjIEBjb21tZW50IFRpdGxlIG9uIHRoZSBwcm9qZWN0IHBhbmVsIHdoaWxlIGEgcmVzb3VyY2UgaXMgc2VsZWN0ZWQKK3Byb2plY3RfcGFuZWxfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmdcOlwgezB9CisKKyMKKyMgQGdyb3VwIFJCUmVwb3J0ZXIKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgZm9yIHRoZSBSQlJlcG9ydGVyIGFwcGxpY2F0aW9uCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3Igc2VsZWN0aW5nIGZpbGUgbG9jYXRpb25zIGZvciBpbnB1dC9vdXRwdXQKK3JlcG9ydGVyX2J1dHRvbl9jaG9vc2U9QXVzd1x1MDBFNGhsZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiBpbmRpY2F0aW5nIHRoZSByZXBvcnQgZ2VuZXJhdGlvbiBzaG91bGQgb2NjdXIgaW1tZWRpYXRlbHkKK3JlcG9ydGVyX2J1dHRvbl9ub3c9RXJ6ZXVnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTI5IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBzYXZpbmcgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXMgZGVmYXVsdAorcmVwb3J0ZXJfYnV0dG9uX3NhdmVfZGVmYXVsdHM9TW9tZW50YW5lXCBFaW5zdGVsbHVuZ2VuXCBhbHNcIFZvcmVpbnN0ZWxsdW5nZW5cIHNwZWljaGVybgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRvIGFjdGl2YXRlIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfYnV0dG9uX3N0YXJ0PVN0YXJ0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdG8gZGVhY3RpdmUgdGhlIHJlcG9ydGVyCityZXBvcnRlcl9idXR0b25fc3RvcD1TdG9wCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBMZXZlbCBvZiBkZXRhaWw6IG1vc3QgaW5mb3JtYXRpb24gYXZhaWxhYmxlCityZXBvcnRlcl9kZXRhaWxfaGlnaD1Ib2NoCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uIG9wdGlvbiBvZiB0aGUgbGV2ZWwgb2YgZGV0YWlsIGluIHJlcG9ydGluZworcmVwb3J0ZXJfZGV0YWlsX2xldmVsPURldGFpbHN0dWZlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IExldmVsIG9mIGRldGFpbDogc3RhbmRhcmQKK3JlcG9ydGVyX2RldGFpbF9ub3JtYWw9Tm9ybWFsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0OiBIVE1MCityZXBvcnRlcl9mb3JtYXRfaHRtbD1IVE1MCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0IHR5cGU6IHBsYWluIHRleHQKK3JlcG9ydGVyX2Zvcm1hdF90ZXh0PVRleHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFuIG91dHB1dCBmb3JtYXQ6IFhNTAorcmVwb3J0ZXJfZm9ybWF0X3htbD1YTUwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgZmlsZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIHJlcG9ydCBvbgorcmVwb3J0ZXJfaW5wdXRfYnVuZGxlPVJlc291cmNlbmJcdTAwRkNuZGVsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gdGhhdCByZXBvcnRpbmcgd2lsbCBoYXBwZW4gYXQgYSBzcGVjaWlmaWVkIHRpbWUgb2YgZGF5LiBGb2xsb3dlZCBieSBhIHRpbWUgYW5kIGRheSBvcHRpb24uCityZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkPUJlcmljaHRlblwgdW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiBzZXF1ZW50aWFsIHJlcG9ydGluZyBwYXVzZWQgZm9yIGEgZGVmaW5lZCBpbnRlcnZhbCBiZXR3ZWVuIHJlcG9ydGluZy4gSW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBudW1iZXIgYW5kIGEgdW5pdCBvZiBtZWFzdXJlIG9mIHRpbWUKK3JlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWw9QmVyaWNodGVuXCBhbGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IERhdGUvVGltZSBvZiBsYXN0IHJlcG9ydCBnZW5lcmF0aW9uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIHRpbWUgb2YgdGhlIGxhc3QgcmVwb3J0CityZXBvcnRlcl9sYXN0X3JlcG9ydD1MZXR6dGVyXCBCZXJpY2h0XDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBEYXRlL1RpbWUgb2YgbmV4dCByZXBvcnQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB3aGVuIHRoZSBuZXh0IHJlcG9ydCB3aWxsIGJlIGdlbmVyYXRlZAorcmVwb3J0ZXJfbmV4dF9yZXBvcnQ9Tlx1MDBFNGNoc3RlclwgQmVyaWNodFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIG91dHB1dCBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgcmVwb3J0cyBhcmUgcGxhY2VkCityZXBvcnRlcl9vdXRwdXRfZGlyZWN0b3J5PUF1c2dhYmV2ZXJ6ZWljaG5pc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dCBmb3JtYXQKK3JlcG9ydGVyX291dHB1dF9maWxlPURhdGVpbmFtZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3Igc2V0dGluZyBpbnRlcnZhbCBvZiByZXBvcnRpbmcKK3JlcG9ydGVyX3BhbmVsX2ludGVydmFsPUJlcmljaHRzaW50ZXJ2YWxsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3IgY29uZmlndXJhYmxlIG9wdGlvbnMgb2YgdGhlIHJlcG9ydGluZworcmVwb3J0ZXJfcGFuZWxfb3B0aW9ucz1CZXJpY2h0c29wdGlvbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTdWJwYW5lbCB0aXRsZSBmb3IgY2hvb3Npbmcgb3V0cHV0IGZvcm1hdHMgZm9yIHRoZSByZXBvcnRzCityZXBvcnRlcl9wYW5lbF9vdXRwdXRfZm9ybWF0PUF1c2dhYmVmb3JtYXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGZvciBpbmRpY2F0aW9uIG9mIHJ1bm5pbmcgc3RhdHVzIG9mIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfcGFuZWxfc3RhdHVzPVN0YXR1cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTaG9ydCB0aXRsZSBmb3Igc2VsZWN0aW5nIGEgY29kZSBzY2FuIGNvbmZpZ3VyYXRpb24gZmlsZQorcmVwb3J0ZXJfcGVyZm9ybV9zY2FuPUNvZGVcIFNjYW5cIERhdGVpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBRdWljayBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlcG9ydGVyIGlzIGFjdGl2ZSAocGVyaGFwcyB3YWl0aW5nKQorcmVwb3J0ZXJfc3RhdHVzX3J1bm5pbmc9R2VzdGFydGV0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBRdWljayBzdGF0dXMgaW5kaWNhdGlvbiB0aGF0IHRoZSByZXBvcnRlciBpcyBub3QgYWN0aXZlCityZXBvcnRlcl9zdGF0dXNfc3RvcHBlZD1HZXN0b3BwdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZGF5cyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZGF5cz1UYWdlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBldmVyeSBkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX2V2ZXJ5ZGF5PUplZGVuXCBUYWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGZyaWRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZnJpZGF5PUZyZWl0YWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGhvdXJzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9ob3Vycz1TdHVuZGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBtaW51dGVzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9taW51dGVzPU1pbnV0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IG1vbmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfbW9uZGF5PU1vbnRhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgc2F0dXJkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3NhdHVyZGF5PVNvbm5hYmVuZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgc3VuZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9zdW5kYXk9U29ubnRhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgdGh1cnNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3RodXJzZGF5PURvbm5lcnN0YWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHR1ZXNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3R1ZXNkYXk9RGllbnN0YWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHdlZG5lc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfd2VkbmVzZGF5PU1pdHR3b2NoCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGl0bGUgb2YgdGhlIGFwcGxpY2F0aW9uCityZXNvdXJjZV9idW5kbGVfcmVwb3J0ZXI9UkJSZXBvcnRlcgorCisjCisjIEBncm91cCBTZWFyY2ggYW5kIFJlcGxhY2UKKyMKKyMgQGdyb3VwQ29tbWVudCBSZXNvdXJjZXMgZm91bmQgb24gdGhlIHNlYXJjaCB0YWIgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyYWwgc2VhcmNoIHRpdGxlCitzZWFyY2g9U3VjaGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3IgbWFraW5nIHRoZSBzZWFyY2ggY2FzZSBzZW5zaXRpdmUgb3Igbm90CitzZWFyY2hfY2FzZV9zZW5zaXRpdmU9R3JvXHUwMERGLS9LbGVpbnNjaHJlaWJ1bmdcIGJlYWNodGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBvcHRpb24gZm9yIHNlYXJjaGluZyB0aHJvdWdoIHJlc291cmNlIGNvbW1lbnRzCitzZWFyY2hfY29tbWVudHM9S29tbWVudGFyZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IHRvIHNlYXJjaCBvbgorc2VhcmNoX2ZpbmQ9U3VjaGVuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IHNlbGVjdGlvbiBmb3Igc2VhcmNoaW5nIG9wdGlvbiB0aHJvdWdoIHJlc291cmNlIGtleXMKK3NlYXJjaF9rZXlzPVNjaGxcdTAwRkNzc2VsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiB0aGUgZmllbGQgZm9yIGVudGVyaW5nIHRleHQgZm9yIHJlcGxhY2luZyB0aGUgZm91bmQgdmFsdWUKK3NlYXJjaF9yZXBsYWNlPUVyc2V0emVuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdHJhbnNsYXRpb24gdmFsdWVzCitzZWFyY2hfdmFsdWVzPVx1MDBEQ2JlcnNldHp1bmdlbgorCisjCisjIEBncm91cCBUYWJzCisjCisjIEBncm91cENvbW1lbnQgR1VJIFRhYnMgaW4gdGhlIG1haW4gcGFuZWwKKworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR1VJIFRhYiBmb3IgVGFiYmVkIFBhbmUgb3ZlciB0aGUgdHJlZSBzaG93aW5nIGEgc2luZ2xlIHJlc291cmNlIGJ1bmRsZSBhbmQgaXRzIHZhcmlvdXMgZmlsZXMKK3RhYl9idW5kbGU9QnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGFiIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgdmFyaW91cyBncm91cHMgaW4gdGhlIGJ1bmRsZQordGFiX2dyb3Vwcz1HcnVwcGVuCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHVUkgVGFiIGZvciB0YWIgb3ZlciB0cmVlIHNob3dpbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAordGFiX3Byb2plY3Q9UHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGFuZSBhbGxvd2luZyBmb3Igc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9ucwordGFiX3NlYXJjaD1TdWNoZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRhYiBmb3Igc3RhdGlzdGljcyBkaXNwbGF5IGZvciBlaXRoZXIgdGhlIFJlc291cmNlIEJ1bmRsZSBhcyBhIHdob2xlIG9yIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgZmlsZXMKK3RhYl9zdGF0aXN0aWNzPVN0YXRpc3RpaworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRhYiBmb3IgZGlzcGxheSBvZiB1bnRyYW5zbGF0ZWQgaXRlbXMgaW4gdGhlIGRpZmZlcmVudCBsYW5ndWFnZSBmaWxlcwordGFiX3VudHJhbnNsYXRlZD1OaWNodFwgXHUwMEZDYmVyc2V0enQKKworIworIyBAZ3JvdXAgVHJhbnNsYXRpb24gRmlsZSBHcm91cHMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IAorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQ29sdW1uIHRpdGxlIGZvciBpdGVtIGNvbW1lbnRzCitsYW5ndWFnZWdyb3VwX2NvbHVtbl9jb21tZW50PUtvbW1lbnRhcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IENvbHVtbiB0aXRsZSBmb3IgaXRlbSdzIHJlc291cmNlIGtleQorbGFuZ3VhZ2Vncm91cF9jb2x1bW5fa2V5PVJlc291cmNlLVNjaGxcdTAwRkNzc2VsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitsYW5ndWFnZWdyb3VwX2NvbHVtbl90cmFuc2xhdGlvbj1cdTAwRENiZXJzZXR6dW5nCisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgU3RhdGlzdGljcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGluIHRoZSBsYW5ndWFnZSBmaWxlIHN0YXRpc3RpY3MgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQSBjb21tZW50IGdpdmVuIHRvIHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2NvbW1lbnQ9S29tbWVudGFyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgY291bnRyeSBiZWluZyBkZXNjcmliZWQgYnkgdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfY291bnRyeT1MYW5kXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBpbiB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19pdGVtX2NvdW50PUFuemFobFwgUmVzb3VyY2VuXCBpblwgZGVyXCBSZXNvdXJjZW5kYXRlaVwgZlx1MDBGQ3JcIGRpZXNlXCBTcHJhY2hlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbGFuZ3VhZ2UgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2xhbmd1YWdlPVNwcmFjaGVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBuYW1lIG9mIGEgcGVyc29uIHJlc3BvbnNpYmxlIGZvciB0aGUgdHJhbnNsYXRpb25zIGluIHRoaXMgbGFuZ3VhZ2UgZmlsZQorbGFuZ3VhZ2VzdGF0c19tYW5hZ2VyPVJlc291cmNlbm1hbmFnZXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBuYW1lIGdpdmVuIHRvIHRoZSBsYW5ndWFnZSBmaWxlCitsYW5ndWFnZXN0YXRzX3RpdGxlPVRpdGVsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBOdW1iZXIgb2YgcmVzb3VyY2VzIG5lZWRpbmcgdHJhbnNsYXRpb24gaW4gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdHJhbnNsYXRpb25fY291bnQ9QW56YWhsXCBuaWNodFwgXHUwMEZDYmVyc2V0enRlclwgUmVzb3VyY2VuXCBpblwgZGllc2VyXCBEYXRlaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIGxhbmd1YWdlL3JlZ2lvbiB2YXJpYW50IGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c192YXJpYW50PVZhcmlhbnRlXDoKKworIworIyBAZ3JvdXAgVHJhbnNsYXRpb24gRmlsZSBVbnRyYW5zbGF0ZWQgSXRlbXMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IAorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIGNvbHVtbiB0aXRsZSBmb3IgZ3JvdXAgbmFtZXMgb2YgaXRlbXMgaW4gdGhlIHJvd3MKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fZ3JvdXA9R3J1cHBlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIGtleSBvZiB0aGUgaXRlbSBhIHJvdworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9rZXk9UmVzb3VyY2UtU2NobFx1MDBGQ3NzZWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiBhbiBpdGVtIGluIGEgcm93CitsYW5ndWFnZXVudHJhbnNfY29sdW1uX3RyYW5zbGF0aW9uPVx1MDBEQ2JlcnNldHp1bmcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgY292ZXJpbmcgYnV0dG9ucyB0aGF0IGFwcGx5IHRvIGEgc2VsZWN0ZWQgcmVzb3VyY2UgZnJvbSBhIHRhYmxlIG9mIHJlc291cmNlcworbGFuZ3VhZ2V1bnRyYW5zX3NlbGVjdGVkX3Jlc291cmNlc19vcHRpb25zPU9wdGlvbmVuXCBmXHUwMEZDclwgZGllXCBhdXNnZXdcdTAwRTRobHRlblwgUmVzb3VyY2VuCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlcl9maS5wcm9wZXJ0aWVzIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXJfZmkucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWYzNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXJfZmkucHJvcGVydGllcwpAQCAtMCwwICsxLDEyMTYgQEAKKyMgQGZpbGUgICAgICAgICAgUkJNYW5hZ2VyCisjIEBmaWxlRW5jb2RpbmcgIGZpCisjIEBmaWxlTGFuZ3VhZ2UgIEZpbm5pc2gKKyMgQGZpbGVDb3VudHJ5ICAgCisjIEBmaWxlVmFyaWFudCAgIAorIyBAZmlsZU1hbmFnZXIgICBKdXNzaSBNeWxseW3ka2kKKyMgQGZpbGVDb21tZW50ICAgVGhpcyBpcyB0aGUgRmlubmlzaCB0cmFuc2xhdGlvbiBvZiB0aGUgUkJNYW5hZ2VyIEdVSS4KKworCisjCisjIEBncm91cCBCYXNlIENsYXNzIEdyb3VwcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb24gSXRlbXMgZm9yIHRoZSBCYXNlIENsYXNzIEdyb3VwIHRhYmJlZCBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX2NvbW1lbnQ9UmVzdXJzc2lyeWhtXHUwMEU0blwga29tbWVudHRpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX25hbWU9UmVzdXJzc2lyeWhtXHUwMEU0blwgbmltaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX29wdGlvbnM9UmVzdXJzc2lyeWhtXHUwMEU0blwgdG9pbWlubm90CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2l0ZW1fb3B0aW9ucz1SZXN1cnNzaW5cIHRvaW1pbm5vdAorCisjCisjIEBncm91cCBCYXNlIENsYXNzIFN0YXRpc3RpY3MgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IEFsbCB0cmFuc2xhdGlvbnMgZm9yIHN0cmluZ3MgYXBwZWFyaW5nIG9uIHRoZSBzdGF0aXN0aWNzIHBhbmUgZm9yIHRoZSBiYXNlIGNsYXNzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZHVwbGljYXRlc19jb3VudD1SZXN1cnNzaW5cIGtvcGlvaWRlblwgbVx1MDBFNFx1MDBFNHJcdTAwRTRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19maWxlX2NvdW50PVJlc3Vyc3NpdGllZG9zdG9qZW5cIG1cdTAwRTRcdTAwRTRyXHUwMEU0XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZ3JvdXBfY291bnQ9UmVzdXJzc2lyeWhtaWVuXCBtXHUwMEU0XHUwMEU0clx1MDBFNFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2dyb3VwX2dyb3VwPVJlc3Vyc3NpcnlobVx1MDBFNHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfaXRlbV9jb3VudD1SZXN1cnNzaWVuXCBtXHUwMEU0XHUwMEU0clx1MDBFNFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2l0ZW1fZ3JvdXA9UmVzdXJzc2l0CisKKyMKKyMgQGdyb3VwIEJhc2UgQ2xhc3MgVW50cmFuc2xhdGVkIEl0ZW1zIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgYXBwZWFyaW5nIG9uIHRoZSBCYXNlIENsYXNzIFVudHJhbnNsYXRlZCBJdGVtcyBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgZmlsZSBiZWluZyB2aWV3ZWQKK2Jhc2V1bnRyYW5zX2ZpbGU9VGllZG9zdG9cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgcmVzb3VyY2UgaXRlbXMgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGZpbGUKK2Jhc2V1bnRyYW5zX3VudHJhbnNfY291bnQ9S1x1MDBFNFx1MDBFNG50XHUwMEU0bVx1MDBFNHR0XHUwMEY2bWllblwgcmVzdXJzc2llblwgbVx1MDBFNFx1MDBFNHJcdTAwRTRcOgorCisjCisjIEBncm91cCBCdXR0b24gTmFtZXMKKyMKKyMgQGdyb3VwQ29tbWVudCBUaGUgbmFtZXMgZGlzcGxheWVkIG9uIHRoZSB2YXJpb3VzIGJ1dHRvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19maWxlX2dyb3VwPVJlc3Vyc3NpdGllZG9zdG90CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGxhbmd1YWdlIGZpbGUKK2J1dHRvbl9hZGRfZmlsZT1MaXNcdTAwRTRcdTAwRTRcIHV1c2lcIHJlc3Vyc3NpdGllZG9zdG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2ZpbGVfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZ3JvdXAKK2J1dHRvbl9hZGRfZ3JvdXA9TGlzXHUwMEU0XHUwMEU0XCB1dXNpXCByZXN1cnNzaXJ5aG1cdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2dyb3VwX3RyaWdnZXI9eQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIHRyYW5zbGF0aW9uIGl0ZW0KK2J1dHRvbl9hZGRfcmVzb3VyY2U9TGlzXHUwMEU0XHUwMEU0XCB1dXNpXCByZXN1cnNzaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9hZGRfcmVzb3VyY2VfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIGNhbmNlbGluZyBhY3Rpb25zCitidXR0b25fY2FuY2VsPVBlcnV1dGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIGEgY2hvaWNlIG9yIHNlbGVjdGlvbiBvcHRpb24KK2J1dHRvbl9jaG9vc2U9VmFsaXRzZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jaG9vc2VfdHJpZ2dlcj12CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZ2VuZXJpYyBjcmVhdGlvbiBvZiBncm91cHMsIGl0ZW1zLCBmaWxlcywgZXRjLgorYnV0dG9uX2NyZWF0ZT1MaXNcdTAwRTRcdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBGb3IgY3JlYXRpb24gb2YgYSByZXNvdXJjZSBncm91cAorYnV0dG9uX2NyZWF0ZV9ncm91cD1MdW9cIHV1c2lcIHJ5aG1cdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX2dyb3VwX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIGNyZWF0aW5nIGFuIGl0ZW0gdGhlbiBjb250aW51aW5nIGNyZWF0aW5nIG1vcmUgaXRlbXMKK2J1dHRvbl9jcmVhdGVfbW9yZT1MdW9cICZcIEphdGthCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9tb3JlX3RyaWdnZXI9bAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSByZXNvdXJjZSB0cmFuc2xhdGlvbiBpdGVtCitidXR0b25fY3JlYXRlX3Jlc291cmNlPUx1b1wgdXVzaVwgcmVzdXJzc2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX3Jlc291cmNlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfdHJpZ2dlcj1sCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciByZW1vdmluZyBhIGdyb3VwIGFuZCBpdHMgY29udGVudHMKK2J1dHRvbl9kZWxldGVfZ3JvdXA9UG9pc3RhXCByZXN1cnNzaXJ5aG1cdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBCdXR0b24gZm9yIHBlcm1hbmVudGx5IHJlbW92aW5nIGEgcmVzb3VyY2UgZnJvbSB0aGUgYnVuZGxlCitidXR0b25fZGVsZXRlX3Jlc291cmNlPVBvaXN0YVwgcmVzdXJzc2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fZGVsZXRlX3Jlc291cmNlX3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBHZW5lcmljIGVkaXQgYnV0dG9uCitidXR0b25fZWRpdD1NdXV0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyBncm91cCBuYW1lIGFuZCBjb21tZW50CitidXR0b25fZWRpdF9ncm91cD1NdXV0YVwgcmVzdXJzc2lyeWhtXHUwMEU0XHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBlZGl0aW5nIHJlc291cmNlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcga2V5IGFuZCB0cmFuc2xhdGlvbgorYnV0dG9uX2VkaXRfcmVzb3VyY2U9TXV1dGFcIHJlc3Vyc3NpYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9lZGl0X3Jlc291cmNlX3RyaWdnZXI9bQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIGluaXRpYXRpbmcgYW4gaW1wb3J0IG9mIHJlc291cmNlcyBmcm9tIGFuIGFsdGVybmF0ZSBzb3VyY2UKK2J1dHRvbl9pbXBvcnQ9SGFlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2ltcG9ydF90cmlnZ2VyPWgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIGFsbG93cyBhIHNlbGVjdGVkIHJlc291cmNlIHRvIGJlIG1hcmtlZCBhcyB0cmFuc2xhdGVkIHdpdGhvdXQgZnVydGhlciBlZGl0aW5nCitidXR0b25fbWFya190cmFuc2xhdGVkPU1lcmtpdHNlXCBSZXN1cnNzaVwgS1x1MDBFNFx1MDBFNG5uZXR5a3NpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX21hcmtfdHJhbnNsYXRlZF90cmlnZ2VyPW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBCdXR0b24gZm9yIGFkZGluZyB0aGUgY3VycmVudCByZXNvdXJjZSBidW5kbGUgaW4gdGhlIG1haW4gYXBwbGljYXRpb24gdG8gdGhlIHByb2plY3QKK2J1dHRvbl9wcm9qZWN0X2FkZD1MaXNcdTAwRTRcdTAwRTRcIFRcdTAwRTRtXHUwMEU0XCBSZXN1cnNzaWtva29lbG1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9hZGRfdHJpZ2dlcj1sCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjbG9zaW5nIHRoZSBwcm9qZWN0IHdpbmRvdworYnV0dG9uX3Byb2plY3RfY2xvc2U9U3VsamVcIFByb2pla3RpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9jbG9zZV90cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9uZXc9VXVzaVwgUHJvamVrdGkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X25ld190cmlnZ2VyPXUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBCdXR0b24gZm9yIG9wZW5pbmcgYSBwcm9qZWN0IGZpbGUKK2J1dHRvbl9wcm9qZWN0X29wZW49QXZhYVwgUHJvamVrdGkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X29wZW5fdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciByZW1vdmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJlc291cmNlIGJ1bmRsZSBmcm9tIHRoZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9yZW1vdmU9UG9pc3RhXCBWYWxpdHR1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9yZW1vdmVfdHJpZ2dlcj1wCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjYXVzaW5nIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBidW5kbGUgdG8gYmUgdGhlIG9uZSBiZWluZyBlZGl0ZWQgaW4gdGhlIG1haW4gYXBwbGljYXRpb24KK2J1dHRvbl9wcm9qZWN0X3NlbGVjdD1NdXV0YVwgVmFsaXR0dWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X3NlbGVjdF90cmlnZ2VyPW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzZWFyY2gKK2J1dHRvbl9zZWFyY2hfZmluZF9hbGw9RXRzaVwgS2Fpa2tpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX3NlYXJjaF9maW5kX2FsbF90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHBlcmZvcm1pbmcgY29tcGxldGUgc2VhcmNoIGFuZCByZXBsYWNlCitidXR0b25fc2VhcmNoX3JlcGxhY2VfYWxsPU11dXRhXCBLYWlra2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fc2VhcmNoX3JlcGxhY2VfYWxsX3RyaWdnZXI9bQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBHZW5lcmljIGJ1dHRvbiBmb3IgdXBkYXRpbmcgaW5mb3JtYXRpb24KK2J1dHRvbl91cGRhdGU9UFx1MDBFNGl2aXRcdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fdXBkYXRlX3RyaWdnZXI9cAorCisjCisjIEBncm91cCBEaWFsb2dzCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb25zIHZhcmlvdXMgZGlhbG9nIGJveGVzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkYWlsb2dfdGl0bGVfcHJlZmVyZW5jZXM9QXNldHVrc2V0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEluZGljYXRpb24gb2Ygd2V0aGVyIG9yIG5vdCBhIG5ldyBmaWxlIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20gdGhlIGVsZW1lbnRzIGluIHRoZSBiYXNlIGNsYXNzCitkaWFsb2dfY2hlY2tib3hfY29weV9lbGVtZW50cz1Lb3Bpb2lcIHJlc3Vyc3NpdFwgcGVydXN0aWVkb3N0b3N0YVwgdFx1MDBFNGhcdTAwRTRuXCB0aWVkb3N0b29uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEluZGljYXRvciBvZiB3ZXRoZXIgYW4gaXRlbSBpcyB0cmFuc2xhdGVkIG9yIG5vdAorZGlhbG9nX2NoZWNrYm94X3RyYW5zbGF0ZWQ9S1x1MDBFNFx1MDBFNG5uZXR0eQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19jb21tZW50PUtvbW1lbnR0aVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2NvdW50cnk9TWFhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2NyZWF0ZWQ9THVvdHVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19jcmVhdG9yPUx1b251dFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEB7MX0gVGhlIGRhdGUKKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIGludm9sdmVkCisjIEBjb21tZW50IFRoZSBkYXRlIGFuZCBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGEgY3JlYXRpb24gb3IgbW9kaWZpY2F0aW9uIG9mIGFuIGl0ZW0KK2RpYWxvZ19kYXRlX3BlcnNvbj17MX1cICh7MH0pCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2RlZmF1bHRfY29tbWVudD1Lb21tZW50aW5cIG9sZXR1c2Fydm9cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19kZWZhdWx0X3RyYW5zbGF0aW9uPUtcdTAwRTRcdTAwRTRublx1MDBGNmtzZW5cIG9sZXR1c2Fydm9cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfZmlsZT1Qb2lzdGFcIHJlc3Vyc3NpdGllZG9zdG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVsZXRlX2dyb3VwPVBvaXN0YVwgcmVzdXJzc2lyeWhtXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9pdGVtPVBvaXN0YVwgcmVzdXJzc2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBXYXJuaW5nIGRpc3BsYXllZCB3aGVuIGEgdXNlciBhc2tzIGZvciBhIGRlbGV0aW9uIG9mIGEgZmlsZS4gUHJvbXB0cyBmb3IgJ1llcycgb3IgJ05vJworZGlhbG9nX2RlbGV0ZV93YXJuaW5nPVZhcm9pdHVzXCFcIFBvaXN0by1vcGVyYWF0aW90YVwgZWlcIHZvaVwgcGVydXV0dGFhLlxuSGFsdWF0a29cIHZhcm1hc3RpXCBqYXRrYWE/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2VuY29kaW5nPUVuY29kaW5nXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9jb21tZW50PVJlc3Vyc3NpdGllZG9zdG9uXCBrb21tZW50dGlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbj1CYXNlXCBDbGFzc2luXCByZXN1cnNzaXRpZWRvc3RvdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEZXNjcmlwdGlvbiBvZiBGaWxlIEZpbHRlciBmb3IgUkJSZXBvcnRlciBYTUwgc2NhbiBjb25maWd1cmF0aW9uIGZpbGVzCitkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb25fc2Nhbj1YTUxcIFJCUmVwb3J0ZXJcIFNjYW5cIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfaW5mbz1UaWVkb3N0b25cIHRpZWRvdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX21hbmFnZXI9UmVzdXJzc2ltYW5hZ2VyaW5cIG5pbWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX3RpdGxlPVJlc3Vyc3NpdGllZG9zdG9uXCBvdHNpa2tvXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZ3JvdXA9UnlobVx1MDBFNG5cIG5pbWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19ncm91cF9jb21tZW50PVJ5aG1cdTAwRTRuXCBrb21tZW50dGlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19rZXk9UmVzdXJzc2luXCB0dW5uaXN0ZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2xhbmd1YWdlPUtpZWxpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2xvb2t1cHM9SGFrdVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX21vZGlmaWVkPU11dXRldHR1XCB2aWltZWtzaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX21vZGlmaWVyPVZpaW1laXNpblwgbXV1dHRhamFcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgbmFtZSBvZiBhIGxhbmd1YWdlLCBjb3VudHJ5LCBvciB2YXJpYW50IG9mIGEgbGFuZ3VhZ2UgZmlsZQorZGlhbG9nX25hbWU9TmltaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBuYW1lIGZvciB0aGUgcmVzb3VyY2UgYnVuZGxlLCBiZWZvcmUgY3JlYXRpbmcgdGhhdCBidW5kbGUKK2RpYWxvZ19uZXdfYmFzZWNsYXNzPU9sZVwgaHl2XHUwMEU0XCBqYVwgc3lcdTAwRjZ0XHUwMEU0XCBCYXNlXCBDbGFzc2luXCBuaW1pXCB1dWRlbGxlXCByZXN1cnNzaWtva29lbG1hbGxlLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGlhbG9nIHBvcHVwIHdpbmRvdyB0ZXh0IHByb21wdGluZyB0aGUgdXNlciBmb3IgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorZGlhbG9nX25ld19wcm9qZWN0PVBsZWFzZVwgZW50ZXJcIGFcIHRpdGxlXCBmb3JcIHlvdXJcIG5ld1wgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgQSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZXMgbWFraW5nIGl0IHRocm91Z2ggdGhlIGZpbHRlciB1cG9uIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUKK2RpYWxvZ19vcGVuX2ZpbGVfZmlsdGVyPUJhc2VcIENsYXNzaW5cIHJlc3Vyc3NpdGllZG9zdG90CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoaXMgaXMgYSBzZWN0aW9uIGhlYWRpbmcgZm9yIHNldHRpbmcgdGhlIEFsdWUKK2RpYWxvZ19wcmVmZXJlbmNlc19BbHVlPUFsdWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgQWx1ZXMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZXMgZm9yIHRoZSBhcHBsaWNhdGlvbgorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9kZWZpbmVkPU1cdTAwRTRcdTAwRTRyaXRlbHR5XCByZXN1cnNzaXRpZWRvc3RvaXNzYVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX2lzbz1JU09cIHN0YW5kYXJkaXRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBMb2NhbGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBKYXZhIFZpcnR1YWwgTWFjaGluZQorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9tYWNoaW5lPVR1ZXR0dVwga29uZXR5eXBwaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX3dhcm5pbmc9SFVPTVw6XCBBbHVlZW5cIHZhaWh0b1wgYXN0dXVcIHZvaW1hYW5cIHZhc3RhXCBrdW5cIHNvdmVsbHVzXCBrXHUwMEU0eW5uaXN0ZXRcdTAwRTRcdTAwRTRuXCB1dWRlc3RhYW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9va2FuZGZlZWw9TG9va1wgQW5kXCBGZWVsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfdXNlcm5hbWU9S1x1MDBFNHl0dFx1MDBFNGpcdTAwRTR0dW5udXNcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IERlc2NyaXB0b3IgdGhhdCBnb2VzIGludG8gR1VJIGZpbGUgY2hvb3NlcgorZGlhbG9nX3Byb2plY3RfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb249UkJNYW5hZ2VyXCBQcm9qZWt0aXRpZWRvc3RvdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRmlsZSBGaWx0ZXIgZGVzY3JpcHRpb24gZm9yIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0IGZpbGVzCitkaWFsb2dfcHJvamVjdF9maWx0ZXJfZGVzY3JpcHRpb249UmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdHMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIHRoYXQgbm8gcHJvamVjdCBpcyBvcGVuLCBwbGFjZWQgaW4gdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgd2hlcmUgdGhlIHByb2plY3QgbmFtZSB3b3VsZCBub3JtYWxseSBnbworZGlhbG9nX3Byb2plY3Rfbm9uZV9zZWxlY3RlZD1Qcm9qZWt0aWFcIEVpXCBWYWxpdHR1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdAorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIHdpbmRvdyBzaG93aW5nIGFsbCB0aGUgcmVzb3VyY2UgYnVuZGxlcyBpbiBhIHByb2plY3QKK2RpYWxvZ19wcm9qZWN0X3RpdGxlPVByb2pla3RpblwgUmVzdXJzc2lrb2tvZWxtYXRcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFByb21wdHMgdGhlIHVzZXIgaWYgdGhleSB3b3VsZCBsaWtlIHRvIHNhdmUgY2hhbmdlcyBiZWZvcmUgZXhpdGluZworZGlhbG9nX3F1aXRfc2F2ZT1IYWx1YXRrb1wgdGFsbGVudGFhXCBtdXV0b2tzZXRcIGVubmVuXCBwb2lzdHVtaXN0YT8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQSBnZW5lcmljIHByb3BtcHQgdG8gYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2lzaCB0byBzYXZlIGNoYW5nZXMKK2RpYWxvZ19zYXZlPUhhbHVhdGtvXCB0YWxsZXR0YWFcIG11dXRva3NldFwgcmVzdXJzc2lrb2tvZWxtYWFuPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19zZWFyY2hfb3B0aW9ucz1FdHNpbnRcdTAwRTRwYXJhbWV0cml0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3NlYXJjaF9wYXJhbT1FdHNpXCB0ZWtzdGlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgdGl0bGUgb2YgdGhlIGFib3V0IGRpYWxvZyBib3gKK2RpYWxvZ190aXRsZV9hYm91dF9yYm1hbmFnZXI9VGlldG9qYVwgUmVzdXJzc2ltYW5hZ2VyaXN0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZGlhbG9nIHByb21wdGluZyBmb3IgZGVsZXRpb24gb2YgYW4gZW50aXJlIHJlc291cmNlIGdyb3VwCitkaWFsb2dfdGl0bGVfZGVsZXRlX2dyb3VwPVBvaXN0YVwgUmVzdXJzc2lyeWhtXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIHdoZW4gcHJvbXB0aW5nIHRvIGRlbGV0ZSBhIHJlc291cmNlCitkaWFsb2dfdGl0bGVfZGVsZXRlX2l0ZW09UG9pc3RhXCBSZXN1cnNzaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lZGl0X2dyb3VwPU11dXRhXCByZXN1cnNzaXJ5aG1cdTAwRTRcdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZWRpdF9pdGVtPU11dXRhXCByZXN1cnNzaWEKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2Vycm9yPUVycm9yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2Vycm9yX2NyZWF0aW5nX2J1bmRsZT1WaXJoZVwgdXV0dGFcIHJlc3Vyc3Npa29rb2VsbWFhXCBsdW90YWVzc2EKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIHdoZW4gb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZSBub3QgY3JlYXRlZCBieSBSQk1hbmFnZXIKK2RpYWxvZ190aXRsZV9lcnJvcl9ub3RfcmJtYW5hZ2VyX2Zvcm1hdD1WaXJoZVw6XCBSZXN1cnNzaXRpZWRvc3RvYVwgZWlcIHZvaWRhXCBsdWtlYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IFRpdGxlIG9uIGEgd2FybmluZyBkaWFsb2cgdGhhdCBJL08gbWFsZnVuY3Rpb25lZCBvcGVuaW5nIGEgZmlsZQorZGlhbG9nX3RpdGxlX2Vycm9yX29wZW5pbmdfZmlsZT1UaWVkb3N0b2FcIEVpXCBWb2lkYVwgQXZhdGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgZm9yIGEgZGlhbG9nIGJveCBmb3IgZW50ZXJpbmcgc3BlY2lhbCBwYXJhbWV0ZXJzIG5lZWRlZCB0byBleHBvcnQgYSByZXNvdXJjZSBidW5kbGUgdG8gamF2YSBjbGFzcyBjb2RlCitkaWFsb2dfdGl0bGVfZXhwb3J0X2phdmFfb3B0aW9ucz1UYWxsZXR1c3BhcmFtZXRyaXRcOlwgSmF2YVwgbHVva2thCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBhIGRpYWxvZyB3aXRoIGEgcHJvZ3Jlc3MgYmFyIGdvdmVybmluZyBpbXBvcnQgc3RhdHVzCitkaWFsb2dfdGl0bGVfaW1wb3J0X3Byb2dyZXNzPUhhdW5cIEVkaXN0eW1pbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBuZXcgYnVuZGxlCitkaWFsb2dfdGl0bGVfbmV3X2J1bmRsZT1MdW9cIHV1c2lcIHJlc3Vyc3Npa29rb2VsbWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGZpbGUKK2RpYWxvZ190aXRsZV9uZXdfZmlsZT1MdW9cIHV1c2lcIHJlc3Vyc3NpdGllZG9zdG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCitkaWFsb2dfdGl0bGVfbmV3X2dyb3VwPUx1b1wgdXVzaVwgcmVzdXJzc2lyeWhtXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyByZXNvdXJjZQorZGlhbG9nX3RpdGxlX25ld19pdGVtPUx1b1wgdXVzaVwgcmVzdXJzc2kKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRpdGxlIG9mIHRoZSBkaWFsb2cgYm94IHNob3dpbmcgd2hlbiBjcmVhdGluZyBhIG5ldyBwcm9qZWN0CitkaWFsb2dfdGl0bGVfbmV3X3Byb2plY3Q9TmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX3ByZWZlcmVuY2VzPUFzZXR1a3NldAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaXRsZSBmb3IgY29uZmlybWluZyBleGl0IGZyb20gYXBwbGljYXRpb24KK2RpYWxvZ190aXRsZV9xdWl0PVBvaXN0dVwgUmVzdXJzc2ltYW5hZ2VyaXN0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9zZWFyY2g9RXRzaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV91c2VyX25hbWU9U3lcdTAwRjZ0XHUwMEU0XCBrXHUwMEU0eXR0XHUwMEU0alx1MDBFNHR1bm51cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ190cmFuc2xhdGlvbj1LXHUwMEU0XHUwMEU0bm5cdTAwRjZzXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfdXNlcl9uYW1lPVN5XHUwMEY2dFx1MDBFNFwgbmltZXNpLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ192YXJpYW50PU11dW5uZWxtYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ193YXJuaW5nX2RlbGV0ZV9ncm91cD1SZXN1cnNzaXJ5aG1cdTAwRTRuXCBwb2lzdGFtaW5lblwgcG9pc3RhYVwgbXlcdTAwRjZzXCBrYWlra2lcIHJ5aG1cdTAwRTRzc1x1MDBFNFwgb2xldmF0XCByZXN1cnNzaXRcIHB5c3l2XHUwMEU0c3RpLlwgSGFsdWF0a29cIGphdGthYT8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfaXRlbT1SZXN1cnNzaVwgcG9pc3RldGFhblwgcHlzeXZcdTAwRTRzdGkuXCBIYWx1YXRrb1wgamF0a2FhPworCisjCisjIEBncm91cCBFcnJvciBNZXNzYWdlcworIworIyBAZ3JvdXBDb21tZW50IAorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3I9VmlyaGUKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRyeWluZyB0byBhZGQgYSByZXNvdXJjZSBidW5kbGUgdG8gYSBwcm9qZWN0LgorZXJyb3JfYWRkaW5nX3Byb2plY3RfYnVuZGxlPUFuXCBlcnJvclwgb2NjdXJyZWRcIHRyeWluZ1wgdG9cIGFkZFwgdGhlXCBSZXNvdXJjZVwgQnVuZGxlXCB5b3VcIHNlbGVjdGVkLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX2Jhc2VjbGFzc193aGl0ZXNwYWNlPVJlc3Vyc3NpblwgbmltZXNzXHUwMEU0XCBlaVwgdm9pXCBvbGxhXCB2XHUwMEU0bGlseVx1MDBGNm50aVx1MDBFNC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl9idW5kbGVfbm90X2NyZWF0ZWQ9UmVzdXJzc2lrb2tvZWxtYWFcIGVpXCBsdW90dS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfZmlsZT1SZXN1cnNzaXRpZWRvc3RvblwgbHVvbnRpXCBlcFx1MDBFNG9ubmlzdHVpLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX2NyZWF0ZV9ncm91cD1SZXN1cnNzaXJ5aG1cdTAwRTRuXCBsdW9udGlcIGVwXHUwMEU0b25uaXN0dWkuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfY3JlYXRlX2l0ZW09UmVzdXJzc2luXCBsdW9udGlcIGVwXHUwMEU0b25uaXN0dWkuCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBjcmVhdGluZyBhIHByb2plY3QKK2Vycm9yX2NyZWF0aW5nX3Byb2plY3Q9QW5cIGVycm9yXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBjcmVhdGVcIGFcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQHswfSBUaGUgbWVzc2FnZSBmcm9tIGFuIElPRXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gZGVsZXRlIGEgZmlsZQorZXJyb3JfZGVsZXRpbmc9VGllZG9zdG9hXCB7MH1cIGVpXCB2b2l0dVwgcG9pc3RhYS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBBbiBlcnJvciB0aGF0IG9jY3VycyB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkZWxldGUgYSBmaWxlLCBidXQgdGhlIHZpcnR1YWwgbWFjaGluZSBjYW4gbm90IGRvIHNvCitlcnJvcl9kZWxldGlvbl9ub3RfcG9zc2libGU9VGllZG9zdG9hXCBlaVwgdm9pdHVcIHBvaXN0YWEuXCBUaWVkb3N0b1wgb25cIHN1b2phdHR1LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2UgZm9yIGV4cG9ydGluZyByZXNvdXJjZSBidW5kbGVzCitlcnJvcl9leHBvcnQ9UmVzdXJzc2l0aWVkb3N0b25cIHRhbGxldHVzXCBlcFx1MDBFNG9ubmlzdHVpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfaW50ZXJuYWw9U2lzXHUwMEU0aW5lblwgdmlyaGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfZmlsZT1SZXN1cnNzaXRpZWRvc3RvblwgbXV1dG9zXCBlcFx1MDBFNG9ubmlzdHVpLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9ncm91cD1SZXN1cnNzaXJ5aG1cdTAwRTRuXCBtdXV0b3NcIGVwXHUwMEU0b25uaXN0dWkuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2l0ZW09UmVzdXJzc2luXCBtdXV0b3NcIGVwXHUwMEU0b25uaXN0dWkuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9maWxlPUF2YWFcIHRhaVwgbHVvXCB1dXNpXCByZXN1cnNzaWtva29lbG1hXCBlbnNpbixcIHNpdHRlblwgdm9pdFwgbHVvZGFcIHV1ZGVuXCByZXN1cnNzaXRpZWRvc3Rvbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl9ub19idW5kbGVfZm9yX2dyb3VwPUF2YWFcIHRhaVwgbHVvXCB1dXNpXCByZXN1cnNzaWtva29lbG1hXCBlbnNpbixcIHNpdHRlblwgdm9pdFwgbHVvZGFcIHV1ZGVuXCByZXN1cnNzaXJ5aG1cdTAwRTRuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIGNyZWF0ZSBhIHJlc291cmNlLCB3aXRob3V0IGFuIG9wZW4gcmVzb3VyY2UgYnVuZGxlCitlcnJvcl9ub19idW5kbGVfZm9yX2l0ZW09QXZhYVwgdGFpXCBsdW9cIHV1c2lcIHJlc3Vyc3Npa29rb2VsbWFcIGVuc2luLFwgc2l0dGVuXCB2b2l0XCBsdW9kYVwgdXVkZW5cIHJlc3Vyc3Npbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitlcnJvcl9ub19rZXlfcmVwbGFjZT1Lb3J2YWEtdG9pbWl0b1wgZWlcIHZhaWt1dGFcIHJlc3Vyc3NpYXZhaW1paW4uXCBNdXV0XCBrb3J2YXVrc2V0XCB0ZWhkXHUwMEU0XHUwMEU0bgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIHRoYXQgUkJNYW5hZ2VyIGNhbiBub3QgcmVhZCB0aGUgZmlsZSBhcyBjcmVhdGVkIGJ5IFJCTWFuYWdlcgorZXJyb3Jfbm90X3JibWFuYWdlcl9mb3JtYXQ9VmFsaXR0dVwgcmVzdXJzc2l0aWVkb3N0b1wgZWlcIG9sZVwgUkJNYW5hZ2VyaW5cIGx1b21hXCB0YWlcIHRpZWRvc3RvXCBvblwgdmlvaXR0dW51dC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd291bGQgbm90IG9wZW4KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBvY2N1cmluZyBvbiBhbiBJL08gZXJyb3IgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlCitlcnJvcl9vcGVuaW5nX2ZpbGU9VGllZG9zdG9hXCB7MH1cIGVpXCB2b2l0dVwgYXZhdGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBSQk1hbmFnZXIgZW5jb3VudGVycyBhbiBlcnJvciB3cml0aW5nIHByZWZlcmVuY2VzIHRvIHRoZSBmaWxlIHN5c3RlbQorZXJyb3JfcHJlZmVyZW5jZXNfc2F2ZT1Bc2V0dXN0ZW5cIHRhbGx0dXNcIGVwXHUwMEU0b25uaXN0dWkuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkCisjIEBjb21tZW50IEEgbWVzc2FnZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgd2hlbiBhbiBlcnJvciBvY2N1cnMgaW4gc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUKK2Vycm9yX3NhdmluZz1SZXN1cnNzaWtva29lbG1hblwgdGFsbGV0dWtzZXNzYVwgdGFwYWh0dWlcIHZpcmhlXDpcIHswfQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIHdoZW4gc2F2aW5nIGEgcHJvamVjdAorZXJyb3Jfc2F2aW5nX3Byb2plY3Q9QW5cIGVycm9yXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBzYXZlXCB0aGVcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFN1Z2dlc3QgdHJ5aW5nIHRvIGltcG9ydCB0aGUgcmVzb3VyY2UgYnVuZGxlIGluc3RlYWQgb2Ygb3BlbmluZyBpdC4KK2Vycm9yX3N1Z2dlc3RfaW1wb3J0X3Byb3BlcnRpZXM9WXJpdFx1MDBFNFwgcmVzdXJzc2l0aWVkb3N0b25cIGhha3VhXCBhdmF1a3Nlblwgc2lqYXN0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX3RyeV9hZ2Fpbl9maWxlPVN5XHUwMEY2dFx1MDBFNFwgdXVkZXRcIGVuY29kaW5nLWFydm90XCBqYVwgeXJpdFx1MDBFNFwgc2l0dGVuXCB1dWRlc3RhYW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2dyb3VwPVlyaXRcdTAwRTRcIHV1ZGVzdGFhblwgdG9pc2VsbGFcIHJlc3Vyc3NpcnlobVx1MDBFNG5cIG5pbWVsbFx1MDBFNC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5faXRlbT1Zcml0XHUwMEU0XCB1dWRlc3RhYW5cIHRvaXNlbGxhXCByZXN1cnNzaW5cIG5pbWVsbFx1MDBFNC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVmFsdWUgaW5zZXJ0ZWQgaW50byB0YWJsZSBjZWxscyB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cmVkCit0YWJsZV9jZWxsX2Vycm9yPSpWaXJoZSoKKworIworIyBAZ3JvdXAgRXhwb3J0CisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGRlYWxpbmcgd2l0aCBleHBvcnQgb3B0aW9ucworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgT3B0aW9uIGZvciB0aGUgcGFyYW1ldGVyIGZvciBjcmVhdGVkIGEgcHJvdGVjdGVkIGNsYXNzCitleHBvcnRfamF2YV9jbGFzc19wcm90ZWN0ZWQ9THVvXCBzdW9qYXR0dVwgbHVva2thCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgc2V0dGluZyB0aGUgY3JlYXRlZCBjbGFzcyBhcyBwdWJsaWMKK2V4cG9ydF9qYXZhX2NsYXNzX3B1YmxpYz1MdW9cIGp1bGtpbmVuXCBsdW9ra2EKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgcHJvdGVjdGVkIG1ldGhvZHMgaW4gdGhlIGphdmEgY2xhc3MKK2V4cG9ydF9qYXZhX21ldGhvZHNfcHJvdGVjdGVkPUx1b1wgc3VvamF0dHVcIG1ldG9kaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcGFyYW1ldGVyIGZvciBjcmVhdGluZyBwdWJsaWMgbWV0aG9kcworZXhwb3J0X2phdmFfbWV0aG9kc19wdWJsaWM9THVvXCBqdWxraW5lblwgbWV0b2RpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgVGl0bGUgb2YgYSBjaGVjayBib3ggZm9sbG93ZWQgYnkgYSB0ZXh0IGZpZWxkIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBhIHBhY2thZ2UgaW4gdGhlIGdlbmVyYXRlZCBqYXZhIGNsYXNzIGFuZCB3aGF0IHRoZSBwYWNrYWdlIHNob3VsZCBiZSBjYWxsZWQKK2V4cG9ydF9qYXZhX3BhY2thZ2U9QW5uYVwgcGFrZXRpblwgbmltaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgVGV4dCBwbGFjZWQgaW4gYSBsYWJlbCBhdCB0aGUgdG9wIG9mIHRoZSBkaWFsb2cgYm94IGZvciBzcGVjaWZ5aW5nIHBhcmFtZXRlcnMgY29uY2VybmluZyB0aGUgZXhwb3J0IG9mIHJlc291cmNlIGJ1bmRsZXMgaW50byBhIGphdmEgY2xhc3MKK2V4cG9ydF9qYXZhX3RpdGxlPUFubmFcIHNldXJhYXZhdFwgcGFyYW1ldHJpdFwgSmF2YS1sdW9rYWxsZVw6CisKKyMKKyMgQGdyb3VwIEdlbmVyYWwKKyMKKyMgQGdyb3VwQ29tbWVudCBTb21lIGl0ZW1zIHRoYXQgYXJlIGNvbW1vbiBhY2Nyb3NzIGdyb3VwcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBmaWxlIG9yIGNsYXNzIGNvbXBvc2VkIG9mIHRoZSBkZWZhdWx0IHRyYW5zbGF0aW9ucyBmb3IgdGhlIGJ1bmRsZQorYmFzZWNsYXNzPUJhc2VcIENsYXNzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwNC0wNi0yOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgR2VvcmdlCisjIEBjb21tZW50IFRoaXMgaXMgdGhlIGxlZ2FsIGNvcHlyaWdodCBub3RpY2UKK2NvcHlyaWdodD0oQylcIENvcHlyaWdodFwgSUJNXCBDb3JwLlwgMjAwMC0yMDA0XCAtXCBLYWlra2lcIG9pa2V1ZGV0XCBwaWRcdTAwRTR0ZXR0eQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZXJuZXJhbCB1c2UgZm9yIGZpbGUgZGlyZWN0b3JpZXMKK2RpcmVjdG9yeT1IYWtlbWlzdG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitncm91cHM9UnlobVx1MDBFNHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIG5hbWUgb2YgdGhlIGltYWdlIGZpbGUgaW4gdGhlICdJbWFnZXMnIGRpcmVjdG9yeSB0aGF0IHJlcHJlc2VudHMgdGhlIGxvZ28gc2VlbiBhdCB0aGUgdG9wIG9mIHRoZSBhcHBsaWNhdGlvbgorbG9nb19maWxlbmFtZT1UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUcmVlIG5vZGUgdGl0bGUgd2hlbiB2aWV3aW5nIGEgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBwcm9qZWN0IHZpZXcgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgcHJvamVjdAorbm9fcHJvamVjdD1EZWZhdWx0XCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUcmVlIG5vZGUgdGl0bGUgZGVmYXVsdGVkIHRvIHdoZW4gbm8gcmVzb3VyY2UgYnVuZGxlIG9yIHByb2plY3QgaGFzIGJlZW4gb3BlbmVkIGJ5IHRoZSB1c2VyCitub19wcm9qZWN0X2J1bmRsZT1Ob1wgUHJvamVjdFwgb3JcIFJlc291cmNlXCBCdW5kbGVcIE9wZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIHRvcCB0cmVlIG5vZGUgdGl0bGUsIHdoZW4gbm8gcmVzb3VyY2UgYnVuZGxlIGhhcyBiZWVuIG9wZW5lZCBvciBjcmVhdGVkCitub19yZXNvdXJjZV9idW5kbGU9UmVzdXJzc2lrb2tvZWxtYWFcIGVpXCBvbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitub25lPUVpXCBvbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBQcm9qZWN0IHRhYmxlIGNvbHVtbiBuYW1lIC0gTG9jYXRpb24gb2YgYSByZXNvdXJjZSBidW5kbGUKK3Byb2plY3RfdGFibGVfZmlsZV9sb2NhdGlvbj1UaWVkb3N0b25cIFNpamFpbnRpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgVGFibGUgQ29sdW1uIE5hbWUgZm9yIHJlc291cmNlIGJ1bmRsZSBuYW1lCitwcm9qZWN0X3RhYmxlX3Jlc291cmNlX2J1bmRsZT1SZXN1cnNzaWtva29lbG1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEFuIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbgorcmJtYW5hZ2VyPVJCTWFuYWdlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDQtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEdlb3JnZQorIyBAY29tbWVudCAKK3JibWFuYWdlcl9jb250YWN0PVRla2lqXHUwMEU0XDpcIEphcmVkXCBKYWNrc29uXCAmXCBHZW9yZ2VcIFJob3RlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgZnVsbCBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24KK3Jlc291cmNlX2J1bmRsZV9tYW5hZ2VyPVJlc3Vyc3NpbWFuYWdlcmkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCit0YWJsZV9jb2x1bW5fZXJyb3I9VmlyaGVcIHRhdWx1a29uXCBzYXJha2tlZXNzYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAezB9IAorIyBAY29tbWVudCBOb2RlIHRpdGxlLCB1bmRlciB3aGljaCBhbGwgZmlsZXMgb2YgdGhlIHNhbWUgY291bnRyeSwgbGFuZ3VhZ2UgcmVzaWRlCit0cmVlX2NvdW50cnlfbm9kZT1NYWFrb29kaVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQHswfSBMYW5ndWFnZSBFbmNvZGluZworIyBAY29tbWVudCBUaGUgbm9kZSBiZWxvdyB3aGljaCBsYW5ndWFnZXMgb2Ygb25lIGVuY29kaW5nIGFyZSBncm91cGVkCit0cmVlX2xhbmd1YWdlX25vZGU9S2llbGlrb29kaVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCit0cmVlX3ZhcmlhbnRfbm9kZT1NdXVubmVsbWlhXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIG5hbWUgYXNzaWduZWQgYXMgYSB1c2VyIG5hbWUgd2hlbiB0aGUgdXNlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQKK3Vua25vd25fdXNlcj1UdW5uaXN0YW1hdG9uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAordW50aXRsZWQ9RWlcIG5pbWVcdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCit1bnRyYW5zbGF0ZWRfaXRlbXM9S1x1MDBFNFx1MDBFNG50XHUwMEU0bVx1MDBFNHR0XHUwMEY2bVx1MDBFNHRcIHJlc3Vyc3NpdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAezB9IFRoZSB2ZXJzaW9uIG51bWJlcgorIyBAY29tbWVudCBUaGUgdmVyc2lvbiBvZiB0aGlzIGFwcGxpY2F0aW9uCit2ZXJzaW9uPVZlcnNpb1wgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGdlbmVyYWwgdXNlIFdhcm5pbmcKK3dhcm5pbmc9VmFyb2l0dXMKKworIworIyBAZ3JvdXAgSW1wb3J0CisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGRlYWxpbmcgd2l0aCBpbXBvcnQgb3B0aW9ucworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBmaWxlIGNob29zZXIgZm9yIGNob29zaW5nIFRNWCBmaWxlcworaW1wb3J0X1RNWF9maWxlX2Rlc2NyaXB0aW9uPVRNWC10aWVkb3N0b3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBUTVggWE1MIGZpbGVzCitpbXBvcnRfVE1YX3RpdGxlPVRNWC10aWVkb3N0b25cIGhha3UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSBmaWxlIGNob29zZXIgZm9yIGNob29zaW5nIFhMSUZGICgueGxmKSBmaWxlcworaW1wb3J0X1hMRl9maWxlX2Rlc2NyaXB0aW9uPVhMSUZGLXRpZWRvc3RvdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBEaWFsb3QgdGl0bGUgZm9yIGltcG9ydGluZyBmcm9tIFhMSUZGICgueGxmKSBmaWxlcworaW1wb3J0X1hMRl90aXRsZT1YTElGRi10aWVkb3N0b25cIGhha3UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgY29uZmxjaXRzIG9uIGEgY2FzZSBieSBjYXNlIGJhc2lzCitpbXBvcnRfY29uZmxpY3RfcHJvbXB0PUt5c3lcIGpva2Fpc2VuXCBvbmdlbG1hblwga29oZGFsbGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIHNwZWNpZnlpbmcgd2hldGhlciBhIGdyb3VwIGZvdW5kIGluIHRoZSB0YXJnZXQgYnV0IG5vdCBmb3VuZCBpbiB0aGUgYWN0aXZlIHJlc291cmNlIGJ1bmRsZSBzaG91bGQgYmUgY3JlYXRlZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlIG9yIG5vdAoraW1wb3J0X2RlZmF1bHRfZ3JvdXBfY3JlYXRpb249THVvXCByZXN1cnNzaXJ5aG1cdTAwRTR0XCBqb2l0YVwgZWlcIG9sZVwgbnlreWlzZXNzXHUwMEU0XCB0aWVkb3N0b3NzYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRvaW4gZm9yIG1hcmtpbmcgdGhlIGluY29taW5nIHZhbHVlcyBhcyB0cmFuc2xhdGVkIG9yIG5vdAoraW1wb3J0X2RlZmF1bHRfdHJhbnNsYXRlZD1NZXJraXRzZVwga1x1MDBFNFx1MDBFNG5uZXR5a3NpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBvcHRpb25zIHNwZWNpZnlpbmcgdGhlIG1ldGEgZGF0YSB0byBiZSBhcHBsaWVkIHRvIGluZGl2aWR1YWwgcmVzb3VyY2VzIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGltcG9ydCBzb3VyY2UKK2ltcG9ydF9kZWZhdWx0X3ZhbHVlcz1PbGV0dXNhcnZvdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBsb2NhbGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUgaW4gcXVlc3Rpb24KKyMgQGNvbW1lbnQgSW5zdHJ1Y3Rpb25zIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gcmVzb2x2ZSBhIGNvbmZsaWN0IHdoZW4gaW1wb3J0aW5nIHJlc291cmNlcyBmcm9tIGEgbG9jYWxlIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlCitpbXBvcnRfZmlsZV9jb25mbGljdF9jaG9vc2U9RW5jb2RpbmdcIHswfVwgZWlcIG9sZVwgb2xlbWFzc2EuXCBWYWxpdHNlXCBrdWlua2FcIGhhbHVhdFwgcmF0a2Fpc3RhXCBvbmdlbG1hbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCBhIG5ldyBmaWxlIGlzIGdlbmVyYXRlZCwgYnV0IG5vdCBwb3B1bGF0ZWQKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2dlbmVyYXRlX2VtcHR5PUx1b1wgdXVzaVwgdHloalx1MDBFNFwgcmVzdXJzc2l0aWVkb3N0bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCBhIG5ldyBmaWxlIGlzIGdlbmVyYXRlZCBhbmQgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBleGlzdGluZyByZXNvdXJjZXMKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2dlbmVyYXRlX3BvcHVsYXRlPUx1b1wgdXVzaVwgcmVzdXJzc2l0aWVkb3N0b1wgamFcIGtvcGlvaVwgQmFzZVwgQ2xhc3NpblwgcmVzdXJzc2l0XCBzaWloZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCB0aGUgY29uZmxpY3RzIGFyZSBpZ25vcmVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9pZ25vcmU9SHlwcFx1MDBFNFx1MDBFNFwgbmlpZGVuXCByZXN1cnNzaWVuXCB5bGlcIGpvaWRlblwgQWx1ZS1hc2V0dXNcIGVpXCBvbGVcIG55a3lpc2Vzc1x1MDBFNFwgcmVzdXJzc2l0aWVkb3N0b3NzYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3Igc2VjdGlvbiBsaXN0aW5nIG9wdGlvbnMgZm9yIHdoYXQgdG8gZG8gd2hlbiBhbiBpbXBvcnRlZCB2YWx1ZSBleGlzdHMgaW4gYSBsb2NhbGUgbm90IGRlZmluZWQgaW4gdGhlIGV4aXN0aW5nIHJlc291cmNlIGJ1bmRsZQoraW1wb3J0X2ZpbGVfY29uZmxpY3RzPVB1dXR0dXZhdFwgcmVzdXJzc2l0aWVkb3N0b3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU2VsZWN0aW9uIG9mIHRoZSBkZWZhdWx0IGdyb3VwLiBBIGxpc3Qgb2YgZ3JvdXBzIHdpbGwgYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGlzIHJlc291cmNlIGluIGEgQ29tYm9Cb3gKK2ltcG9ydF9pbnNlcnRfZ3JvdXA9U2lqb2l0YVwgcmVzdXJzc2lyeWhtXHUwMEU0XHUwMEU0blw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciB0aGUgdHlwZXMgb2YgZmlsZXMgYWNjZXB0ZWQgZm9yIHRoaXMgaW1wb3J0IHR5cGUKK2ltcG9ydF9qYXZhX2ZpbGVfZGVzY3JpcHRpb249SmF2YVwgTGlzdFJlc291cmNlQnVuZGxlXCBCYXNlXCBDbGFzc2l0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBkaWFsb2cgcHJvbXB0aW5nIGZvciBpbXBvcnQgZnJvbSBqYXZhIGNsYXNzZXMKK2ltcG9ydF9qYXZhX3RpdGxlPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgQ2xhc3NpZW5cIEhha3UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgaW5kaWNhdGluZyBzZWN0aW9uIGNvbnRhaW5pbmcgdXNlciBvcHRpb25zCitpbXBvcnRfb3B0aW9ucz1IYWt1cGFyYW1ldHJpdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZmlsZSBjaG9vc2VyIGZvciBzZWxlY3Rpb24gb2YgcmVzb3VyY2UgYnVuZGxlcyBzdG9yZWQgaW4gLnByb3BlcnRpZXMgZmlsZXMKK2ltcG9ydF9wcm9wZXJ0aWVzX2ZpbGVfZGVzY3JpcHRpb249UmVzdXJzc2l0aWVkb3N0b25cIEJhc2VcIENsYXNzaXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzIChjcmVhdGVkIG9yIG5vdCBieSBSQk1hbmFnZXIpCitpbXBvcnRfcHJvcGVydGllc190aXRsZT1SZXN1cnNzaXRpZWRvc3RvamVuXCBoYWt1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MX0gRW5jb2Rpbmcgb2YgdGhlIHJlc291cmNlIHZhbHVlIHdpdGggYSBjb25mbGljdAorIyBAezB9IFRoZSBrZXkgdmFsdWUgb2YgdGhlIHJlc291cmNlIGluIGNvbmZsaWN0CisjIEBjb21tZW50IFRoaXMgaXMgYSB3YXJuaW5nIGFuZCBpbnN0cnVjdGlvbiBmb3Igd2hlbiBhIHJlc291cmNlIGNvbmZsaWN0IG9jY3VycyBkdXJpbmcgYW4gaW1wb3J0CitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlPUF2YWludGFcIHswfVwgZWlcIG9sZVwgb2xlbWFzc2FcIHJlc3Vyc3Npa29rb2VsbWFzc2FcIHsxfS5WYWxpdHNlXCBrdWlua2FcIGhhbHVhdFwgcmF0a2Fpc3RhXCBvbmdlbG1hblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIHRyYW5zbGF0aW9uIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UgaXRlbQorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgYWNjb3JkaW5nIHRvIHRoZSBpbXBvcnQgZmlsZQoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZV9zb3VyY2U9SGFlXCBrXHUwMEU0XHUwMEU0bm5cdTAwRjZzXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgaXRlbQorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBoZWxkIGJ5IHRoZSBhY3RpdmUgcmVzb3VyY2UgYnVuZGxlIGR1cmluZyBhIHRyYW5zbGF0aW9uIHJlc291cmNlIGNvbmZsaWN0CitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlX3RhcmdldD1SZXN1cnNzaXRpZWRvc3Rvblwga1x1MDBFNFx1MDBFNG5uXHUwMEY2c1w6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgcmVzb3VyY2UgY29uZmxpY3RzIGJ5IGlnbm9yaW5nIGltcG9ydCB2YWx1ZQoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2lnbm9yZT1PaGl0YVwgb25nZWxtYVwgamFcIFx1MDBFNGxcdTAwRTRcIG11dXRhXCByZXN1cnNzaWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgY29uZmxpY3RzIGJ5IHVzaW5nIHRoZSBpbXBvcnQgdmFsdWUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9vdmVyd3JpdGU9S29ydmFhXCByZXN1cnNzaVwgdGllZG9zdG9zdGFcIGhhZXR1bGxhXCBhcnZvbGxhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGxpc3Rpbmcgb3B0aW9ucyBmb3IgcmVzb2x2aW5nIGNvbmZsaWN0cyBiZXR3ZWVuIHJlc291cmNlcworaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0cz1SZXN1cnNzaWVuXCBvbmdlbG1hdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZQorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBzb3VyY2UgZmlsZSBmb3IgdGhlIGltcG9ydAoraW1wb3J0X3NvdXJjZV9maWxlPVRpZWRvc3RvXDpcIHswfQorCisjCisjIEBncm91cCBNZW51IEl0ZW1zCisjCisjIEBncm91cENvbW1lbnQgVGhlc2UgcmVzb3VyY2VzIHJlcHJlc2VudCBhbGwgb2YgdGhlIG1lbnUgYW5kIG1lbnUgaXRlbSB0aXRsZXMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBtZW51IHRpdGxlIGNvdmVyaW5nIGNvcHlpbmcsIHBhc3RpbmcsIGRlbGV0aW5nIG9mIGl0ZW1zCittZW51X2VkaXQ9TXV1dGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY29weT1Lb3Bpb2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY29weV90cmlnZ2VyPWsKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY3V0PUxlaWtrYWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY3V0X3RyaWdnZXI9bAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9kZWxldGU9UG9pc3RhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2RlbGV0ZV90cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfcGFzdGU9U2lqb2l0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9wYXN0ZV90cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9lZGl0JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2VkaXRfdHJpZ2dlcj1tCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3IgdGhlIG9wZW5pbmcsIHNhdmluZywgZXRjLiBkb2N1bWVudHMgYW5kIGV4aXRpbmcgdGhlIHByb2dyYW0KK21lbnVfZmlsZT1UaWVkb3N0bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCByZXNvdXJjZSBidW5kbGVzIGluIGEgdmFyaWV0eSBvZiBmb3JtYXRzCittZW51X2ZpbGVfZXhwb3J0PVJlc3Vyc3Npa29rb2VsbWFuXCBzaWlydG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAyLTA1LTE3IEBtb2RpZmllZCAyMDAyLTA1LTE3IEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgQWJsaXR5IHRvIGV4cG9ydCB0byBJQ1UgUmVzb3VyY2UgQnVuZGxlIGZpbGVzCittZW51X2ZpbGVfZXhwb3J0X0lDVT1JQ1UtdGllZG9zdG90Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMi0wNS0xNyBAbW9kaWZpZWQgMjAwMi0wNS0xNyBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9JQ1VfdHJpZ2dlcj1pCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFibGl0eSB0byBleHBvcnQgdG8gVE1YIFhNTCBmaWxlcworbWVudV9maWxlX2V4cG9ydF9UTVg9VE1YLXRpZWRvc3RvdC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfVE1YX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgeAorbWVudV9maWxlX2V4cG9ydF9YTEY9WExJRkYtdGllZG9zdG90Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9YTEZfdHJpZ2dlcj14CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFiaWxpdHkgdG8gZXhwb3J0IHRvIGphdmEgZmlsZXMgdGhhdCBjb21waWxlIHRvIGJlIExpc3RSZXNvdXJjZUJ1bmRsZSBjbGFzcyBleHRlbnNpb25zCittZW51X2ZpbGVfZXhwb3J0X2phdmE9SmF2YS10aWVkb3N0b3QuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X2phdmFfdHJpZ2dlcj1qCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEV4cG9ydCBhYmlsaXR5IHRvIHByb3BlcnRpZXMgZmlsZXMgbWludXMgdGhlIG1ldGFkYXRhCittZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXM9UGVsa2tcdTAwRTRcIFByb3BlcnR5LXRpZWRvc3RvLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfdHJpZ2dlcj1zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBpbXBvcnQgYW5kIG1lcmdpbmcgYW5vdGhlciByZXNvdXJjZSBmaWxlIHdpdGggdGhlIGJ1bmRsZSBiZWluZyB3b3JrZWQgd2l0aAorbWVudV9maWxlX2ltcG9ydD1MdWVcIHJlc3Vyc3Npa29rb2VsbWFcIHRpZWRvc3Rvc3RhLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEltcG9ydCBhYmxpaXR5IGZyb20gWE1MIFRNWCBkb2N1bWVudHMKK21lbnVfZmlsZV9pbXBvcnRfVE1YPVRNWC10aWVkb3N0b3QuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X1RNWF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IEltcG9ydCBhYmlsaXR5IGZyb20gWE1MIFhMSUZGICgueGxmKSBmaWxlcworbWVudV9maWxlX2ltcG9ydF9YTEY9WExJRkYtdGllZG9zdG90Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IFgKK21lbnVfZmlsZV9pbXBvcnRfWExGX3RyaWdnZXI9eAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIGphdmEgY2xhc3NlcyAoTGlzdFJlc291cmNlQnVuZGxlKQorbWVudV9maWxlX2ltcG9ydF9qYXZhPUphdmEtdGllZG9zdG90Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIHByb3BlcnRpZXMgZmlsZXMgbm90IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIKK21lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllcz1Za3NpbmtlcnRhaXNldFwgcmVzdXJzc2lrb2tvZWxtYXQuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXNfdHJpZ2dlcj1wCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X3RyaWdnZXI9bAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlCittZW51X2ZpbGVfbmV3PVV1c2lcIHJlc3Vyc3Npa29rb2VsbWEuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfZmlsZV9uZXdfdHJpZ2dlcj11CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlCittZW51X2ZpbGVfb3Blbj1BdmFhXCByZXN1cnNzaWtva29lbG1hLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfb3Blbl90cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNsb3NpbmcgdGhlIGFwcGxpY2F0aW9uCittZW51X2ZpbGVfcXVpdD1Qb2lzdHUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfZmlsZV9xdWl0X3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3Igc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9zYXZlPVRhbGxldGFcIHJlc3Vyc3Npa29rb2VsbWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfZmlsZV9zYXZlX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3Igc2F2aW5nIGEgcmVzb3VyY2UgYnVuZGxlIHRvIGEgcGFydGljdWxhciBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lCittZW51X2ZpbGVfc2F2ZWFzPVRhbGxldGFcIHJlc3Vyc3Npa29rb2VsbWFcIG5pbWVsbFx1MDBFNC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbWVudV9maWxlX3NhdmVhc190cmlnZ2VyPW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9maWxlJyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2ZpbGVfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3IgaGVscCBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbQorbWVudV9oZWxwPUFwdWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IGl0ZW0gd2hpY2ggYnJpbmdzIHVwIGEgZGlhbG9nIGRlc2NyaWJpbmcgdGhlIGFwcGxpY2F0aW9uCittZW51X2hlbHBfYWJvdXQ9TGlzXHUwMEU0dGlldG9qYVwgUmVzdXJzc2ltYW5hZ2VyaXN0YS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbWVudV9oZWxwX2Fib3V0X3RyaWdnZXI9bAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X2hlbHAnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfaGVscF90cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciBvcHRpb25zIHN1Y2ggYXMgY3JlYXRpbmcgbmV3IHJlc291cmNlcywgZ3JvdXBzLCBhbmQgcmVzb3VyY2UgZmlsZXMKK21lbnVfb3B0aW9ucz1Bc2V0dWtzZXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGl0ZW0KK21lbnVfb3B0aW9uc19hZGRlbnRyeT1MaXNcdTAwRTRcdTAwRTRcIHJlc3Vyc3NpLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZW50cnlfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBmaWxlIGZvciBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UvY291bnRyeS92YXJpYW50CittZW51X29wdGlvbnNfYWRkZmlsZT1MaXNcdTAwRTRcdTAwRTRcIHJlc3Vyc3NpdGllZG9zdG8uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRmaWxlX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZ3JvdXAKK21lbnVfb3B0aW9uc19hZGRncm91cD1MaXNcdTAwRTRcdTAwRTRcIHJlc3Vyc3NpcnlobVx1MDBFNC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX2FkZGdyb3VwX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGVkaXRpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBmb3IgdGhlIGFwcGxpY2F0aW9uCittZW51X29wdGlvbnNfcHJlZmVyZW5jZXM9QXNldHVrc2V0Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX3ByZWZlcmVuY2VzX3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IE1lbnUgaXRlbSB0aGF0IG1ha2VzIHZpc2libGUgdGhlIHByb2plY3Qgdmlld2VyCittZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXI9QXZhYVwgUHJvamVrdGluXHUwMEU0eXR0XHUwMEY2CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXJfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfb3B0aW9ucycgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9vcHRpb25zX3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBhZGRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlIHRvIHRoZSBwcm9qZWN0CittZW51X3RyZWVfYWRkX3Byb2plY3RfYnVuZGxlPUFkZFwgUmVzb3VyY2VcIEJ1bmRsZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgZGVsZXRpbmcgcGVybWFuZW50bHkgYSByZXNvdXJjZSBmaWxlCittZW51X3RyZWVfZGVsZXRlPVBvaXN0YVwgUmVzdXJzc2l0aWVkb3N0bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgcmVtb3ZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHRyZWUgdmlldyBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCittZW51X3RyZWVfaGlkZT1QaWlsb3RhXCBSZXN1cnNzaXRpZWRvc3RvCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKK21lbnVfdHJlZV9uZXdfcHJvamVjdD1OZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuLi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0CittZW51X3RyZWVfb3Blbl9wcm9qZWN0PU9wZW5cIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuLi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBwcm9qZWN0IHRyZWUKK21lbnVfdHJlZV9yZW1vdmVfcHJvamVjdF9idW5kbGU9UmVtb3ZlXCBmcm9tXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBzYXZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBidW5kbGUgZmlsZQorbWVudV90cmVlX3NhdmU9VGFsbGV0YVwgUmVzdXJzc2l0aWVkb3N0bworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBzYXZpbmcgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UgcHJvamVjdCBmaWxlLCBub3QgdGhlIHJlc291cmNlIGJ1bmRsZXMgdGhlbXNlbHZlcyB3aXRoaW4gdGhlIHByb2plY3QKK21lbnVfdHJlZV9zYXZlX3Byb2plY3Q9U2F2ZVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdFwgRmlsZS4uLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBmb3Igc2VsZWN0aW5nIGEgcmVzb3VyY2UgYnVuZGxlIGZyb20gdGhlIHByb2plY3QgdHJlZSB0byBiZSBlZGl0ZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSB0cmVlCittZW51X3RyZWVfc2VsZWN0X3Byb2plY3RfYnVuZGxlPVdvcmtcIHdpdGhcIHRoaXNcIFJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciBjaGFuZ2luZyB0aGUgZGlzcGxheSBiZWluZyBzZWVuIGJ5IHRoZSB1c2VyCittZW51X3ZpZXc9Tlx1MDBFNHl0dFx1MDBGNgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgaXRlbSB0aGF0IHRha2VzIHlvdSBkaXJlY3RseSB0byB0aGUgc3RhdGlzdGljcyBwYW5lbCBmb3IgdGhlIGVudGlyZSBidW5kbGUKK21lbnVfdmlld19zdGF0aXN0aWNzPU5cdTAwRTR5dFx1MDBFNFwgcmVzdXJzc2lrb2tvZWxtYW5cIHRpbGFzdG90aWVkb3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfdmlld19zdGF0aXN0aWNzX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X3ZpZXcnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfdmlld190cmlnZ2VyPW4KKworIworIyBAZ3JvdXAgUHJvamVjdCBQYW5lbAorIworIyBAZ3JvdXBDb21tZW50IFBhbmVsIGFzc29jaWF0ZWQgd2l0aCBQcm9qZWN0IGVkaXRpbmcKKworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisjIEBjb21tZW50IExhYmVsIGluZGljYXRvciBhc3NvY2lhdGluZyBhIHRleHQgYm94IGNvbnRhaW5pbmcgYSB0cmFuc2xhdGlvbiB3aXRoIHRoZSByZXNvdXJjZSBidW5kbGUgdGhlIHRyYW5zbGF0aW9uIGNvbWVzIGZyb20KK3Byb2plY3RfcGFuZWxfYnVuZGxlPVJlc291cmNlXCBCdW5kbGVcOlwgezB9CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IE5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorIyBAY29tbWVudCBTcGVjaWFsIGluZGljYXRvciBvZiB0aGUgcmVzb3VyY2UgaXRlbSByZXNvdXJjZSBidW5kbGUgd2hlbiB0aGUgaXRlbSBpcyB1bnRyYW5zbGF0ZWQKK3Byb2plY3RfcGFuZWxfYnVuZGxlX3VudHJhbnNsYXRlZD1SZXNvdXJjZVwgQnVuZGxlXDpcIHswfVwgKFVudHJhbnNsYXRlZCkKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IExhYmVsIHRleHQgbWFya2luZyB0aGUgbGluZSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiBhIHJlc291cmNlIGNvbW1lbnQKK3Byb2plY3RfcGFuZWxfY29tbWVudD1CYXNlXCBDbGFzc1wgUmVzb3VyY2VcIENvbW1lbnRcOgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTGFiZWwgdGV4dCBmb3IgYSBjb21tZW50IHdoZW4gbm9uZSBpcyBmb3VuZCBmb3IgYSByZXNvdXJjZQorcHJvamVjdF9wYW5lbF9jb21tZW50X25vbmU9Tm9cIGNvbW1lbnRcIHN1cHBsaWVkCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgc2hvd24gb24gdGhlIHByb2plY3QgcGFuZWwgZm9yIGNvbW1pdHRpbmcgY2hhbmdlIHRvIG9uZSByZXNvdXJjZSBvbmx5Citwcm9qZWN0X3BhbmVsX2NvbW1pdF9idXR0b249Q29tbWl0XCBDaGFuZ2UKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBvbiB0aGUgcHJvamVjdCBwYW5lbCBmb3Igc2F2aW5nIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGRpc3BsYXllZC4gVGhpcyBtZWFucyBtdWx0aXBsZSByZXNvdXJjZSBmaWxlcyBnZXQgc2F2ZWQuCitwcm9qZWN0X3BhbmVsX2NvbW1pdF9idXR0b25fYWxsPUNvbW1pdFwgQWxsXCBSZXNvdXJjZVwgQ2hhbmdlcworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGVmYXVsdCB0aXRsZSBzaG93biBvbiB0aGUgcHJvamVjdCBwYW5lbCB3aGVuIG5vIHBhcnRpY3VsYXIgcmVzb3VyY2UgaGFzIGJlZW4gc2VsZWN0ZWQKK3Byb2plY3RfcGFuZWxfZGVmYXVsdF90aXRsZT1Qcm9qZWN0XCBSZXNvdXJjZVwgRWRpdGluZworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGV4dCBmaWVsZCBtYXJrZXIgZm9yIHRoZSB0cmFuc2xhdGlvbiBvZiBhIHJlc291cmNlIHdoZW4gdGhhdCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCBmb3IgdGhlIGVuY29kaW5nIGZpbGUgaXQgaXMgYXNzb2NpYXRlZCB3aXRoCitwcm9qZWN0X3BhbmVsX2l0ZW1faW5oZXJpdHM9PE5vXCBUcmFuc2xhdGlvblw6XCBSZXNvdXJjZVwgSW5oZXJpdHNcIGZyb21cIHBhcmVudD4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIGtleSBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UKKyMgQGNvbW1lbnQgVGl0bGUgb24gdGhlIHByb2plY3QgcGFuZWwgd2hpbGUgYSByZXNvdXJjZSBpcyBzZWxlY3RlZAorcHJvamVjdF9wYW5lbF90aXRsZT1Qcm9qZWN0XCBSZXNvdXJjZVwgRWRpdGluZ1w6XCB7MH0KKworIworIyBAZ3JvdXAgUkJSZXBvcnRlcgorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBmb3IgdGhlIFJCUmVwb3J0ZXIgYXBwbGljYXRpb24KKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBzZWxlY3RpbmcgZmlsZSBsb2NhdGlvbnMgZm9yIGlucHV0L291dHB1dAorcmVwb3J0ZXJfYnV0dG9uX2Nob29zZT1WYWxpdHNlLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gaW5kaWNhdGluZyB0aGUgcmVwb3J0IGdlbmVyYXRpb24gc2hvdWxkIG9jY3VyIGltbWVkaWF0ZWx5CityZXBvcnRlcl9idXR0b25fbm93PVBcdTAwRTRpdml0XHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3Igc2F2aW5nIHRoZSBjdXJyZW50IHNldHRpbmdzIGFzIGRlZmF1bHQKK3JlcG9ydGVyX2J1dHRvbl9zYXZlX2RlZmF1bHRzPVRhbGxldGFcIG55a3lpc2V0XCBhc2V0dWtzZXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0byBhY3RpdmF0ZSB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX2J1dHRvbl9zdGFydD1BbG9pdGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0byBkZWFjdGl2ZSB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX2J1dHRvbl9zdG9wPVB5c1x1MDBFNHl0XHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBMZXZlbCBvZiBkZXRhaWw6IG1vc3QgaW5mb3JtYXRpb24gYXZhaWxhYmxlCityZXBvcnRlcl9kZXRhaWxfaGlnaD1QYWxqb24KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24gb3B0aW9uIG9mIHRoZSBsZXZlbCBvZiBkZXRhaWwgaW4gcmVwb3J0aW5nCityZXBvcnRlcl9kZXRhaWxfbGV2ZWw9VGllZG9uXCBtXHUwMEU0XHUwMEU0clx1MDBFNFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBMZXZlbCBvZiBkZXRhaWw6IHN0YW5kYXJkCityZXBvcnRlcl9kZXRhaWxfbm9ybWFsPU5vcm1hYWxpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0OiBIVE1MCityZXBvcnRlcl9mb3JtYXRfaHRtbD1IVE1MCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0IHR5cGU6IHBsYWluIHRleHQKK3JlcG9ydGVyX2Zvcm1hdF90ZXh0PVRla3N0aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdDogWE1MCityZXBvcnRlcl9mb3JtYXRfeG1sPVhNTAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiBmaWxlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gcmVwb3J0IG9uCityZXBvcnRlcl9pbnB1dF9idW5kbGU9UmVzdXJzc2lrb2tvZWxtYVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIHRoYXQgcmVwb3J0aW5nIHdpbGwgaGFwcGVuIGF0IGEgc3BlY2lpZmllZCB0aW1lIG9mIGRheS4gRm9sbG93ZWQgYnkgYSB0aW1lIGFuZCBkYXkgb3B0aW9uLgorcmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZD1SYXBvcnRvaW50aWFqYW5rb2h0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGV4dCBpbmRpY2F0aW9uIG9mIHNlcXVlbnRpYWwgcmVwb3J0aW5nIHBhdXNlZCBmb3IgYSBkZWZpbmVkIGludGVydmFsIGJldHdlZW4gcmVwb3J0aW5nLiBJbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG51bWJlciBhbmQgYSB1bml0IG9mIG1lYXN1cmUgb2YgdGltZQorcmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbD1SYXBvcnRvaW50aXZcdTAwRTRsaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBEYXRlL1RpbWUgb2YgbGFzdCByZXBvcnQgZ2VuZXJhdGlvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSB0aW1lIG9mIHRoZSBsYXN0IHJlcG9ydAorcmVwb3J0ZXJfbGFzdF9yZXBvcnQ9VmlpbWVpc2luXCByYXBvcnR0aVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gRGF0ZS9UaW1lIG9mIG5leHQgcmVwb3J0CisjIEBjb21tZW50IEluZGljYXRpb24gb2Ygd2hlbiB0aGUgbmV4dCByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQKK3JlcG9ydGVyX25leHRfcmVwb3J0PVNldXJhYXZhXCByYXBvcnR0aVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIG91dHB1dCBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgcmVwb3J0cyBhcmUgcGxhY2VkCityZXBvcnRlcl9vdXRwdXRfZGlyZWN0b3J5PVRhbGxldHVzaGFrZW1pc3RvXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0IGZvcm1hdAorcmVwb3J0ZXJfb3V0cHV0X2ZpbGU9VGllZG9zdG9uXCBuaW1pXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGZvciBzZXR0aW5nIGludGVydmFsIG9mIHJlcG9ydGluZworcmVwb3J0ZXJfcGFuZWxfaW50ZXJ2YWw9UmFwb3J0b2ludGl2XHUwMEU0bGkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGZvciBjb25maWd1cmFibGUgb3B0aW9ucyBvZiB0aGUgcmVwb3J0aW5nCityZXBvcnRlcl9wYW5lbF9vcHRpb25zPVJhcG9ydG9pbnRpcGFyYW1ldHJpdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU3VicGFuZWwgdGl0bGUgZm9yIGNob29zaW5nIG91dHB1dCBmb3JtYXRzIGZvciB0aGUgcmVwb3J0cworcmVwb3J0ZXJfcGFuZWxfb3V0cHV0X2Zvcm1hdD1UdWxvc3R1c211b3RvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3IgaW5kaWNhdGlvbiBvZiBydW5uaW5nIHN0YXR1cyBvZiB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX3BhbmVsX3N0YXR1cz1UaWxhbm5lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFNob3J0IHRpdGxlIGZvciBzZWxlY3RpbmcgYSBjb2RlIHNjYW4gY29uZmlndXJhdGlvbiBmaWxlCityZXBvcnRlcl9wZXJmb3JtX3NjYW49Q29kZVwgU2NhblwgLXRpZWRvc3RvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBRdWljayBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlcG9ydGVyIGlzIGFjdGl2ZSAocGVyaGFwcyB3YWl0aW5nKQorcmVwb3J0ZXJfc3RhdHVzX3J1bm5pbmc9S1x1MDBFNHlubmlzc1x1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUXVpY2sgc3RhdHVzIGluZGljYXRpb24gdGhhdCB0aGUgcmVwb3J0ZXIgaXMgbm90IGFjdGl2ZQorcmVwb3J0ZXJfc3RhdHVzX3N0b3BwZWQ9UHlzXHUwMEU0eXRldHR5CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBkYXlzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9kYXlzPVBcdTAwRTRpdlx1MDBFNFx1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZXZlcnkgZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9ldmVyeWRheT1Kb2thXCBwXHUwMEU0aXZcdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGZyaWRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZnJpZGF5PVBlcmphbnRhaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgaG91cnMgb3B0aW9uCityZXBvcnRlcl90aW1lX2hvdXJzPVR1bnRpYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgbWludXRlcyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfbWludXRlcz1NaW51dXR0aWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IG1vbmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfbW9uZGF5PU1hYW5hbnRhaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgc2F0dXJkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3NhdHVyZGF5PUxhdWFudGFpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBzdW5kYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3N1bmRheT1TdW5udW50YWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHRodXJzZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV90aHVyc2RheT1Ub3JzdGFpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCB0dWVzZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV90dWVzZGF5PVRpaXN0YWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHdlZG5lc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfd2VkbmVzZGF5PUtlc2tpdmlpa2tvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBvZiB0aGUgYXBwbGljYXRpb24KK3Jlc291cmNlX2J1bmRsZV9yZXBvcnRlcj1SQlJlcG9ydGVyCisKKyMKKyMgQGdyb3VwIFNlYXJjaCBhbmQgUmVwbGFjZQorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBmb3VuZCBvbiB0aGUgc2VhcmNoIHRhYiBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJhbCBzZWFyY2ggdGl0bGUKK3NlYXJjaD1FdHNpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBvcHRpb24gZm9yIG1ha2luZyB0aGUgc2VhcmNoIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdAorc2VhcmNoX2Nhc2Vfc2Vuc2l0aXZlPUlzb3RcIGphXCBwaWVuZXRcIGtpcmphaW1ldFwgb3ZhdFwgc2Ftb2phCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBvcHRpb24gZm9yIHNlYXJjaGluZyB0aHJvdWdoIHJlc291cmNlIGNvbW1lbnRzCitzZWFyY2hfY29tbWVudHM9S29tbWVudGl0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiB0aGUgZmllbGQgZm9yIGVudGVyaW5nIHRleHQgdG8gc2VhcmNoIG9uCitzZWFyY2hfZmluZD1FdHNpXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IHNlbGVjdGlvbiBmb3Igc2VhcmNoaW5nIG9wdGlvbiB0aHJvdWdoIHJlc291cmNlIGtleXMKK3NlYXJjaF9rZXlzPVJlc3Vyc3NpYXZhaW1ldAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IGZvciByZXBsYWNpbmcgdGhlIGZvdW5kIHZhbHVlCitzZWFyY2hfcmVwbGFjZT1Lb3J2YWFcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0cmFuc2xhdGlvbiB2YWx1ZXMKK3NlYXJjaF92YWx1ZXM9S1x1MDBFNFx1MDBFNG5uXHUwMEY2a3NldAorCisjCisjIEBncm91cCBUYWJzCisjCisjIEBncm91cENvbW1lbnQgR1VJIFRhYnMgaW4gdGhlIG1haW4gcGFuZWwKKworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR1VJIFRhYiBmb3IgVGFiYmVkIFBhbmUgb3ZlciB0aGUgdHJlZSBzaG93aW5nIGEgc2luZ2xlIHJlc291cmNlIGJ1bmRsZSBhbmQgaXRzIHZhcmlvdXMgZmlsZXMKK3RhYl9idW5kbGU9QnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRhYiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIHZhcmlvdXMgZ3JvdXBzIGluIHRoZSBidW5kbGUKK3RhYl9ncm91cHM9UnlobVx1MDBFNHQKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdVSSBUYWIgZm9yIHRhYiBvdmVyIHRyZWUgc2hvd2luZyBhIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0Cit0YWJfcHJvamVjdD1Qcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwYW5lIGFsbG93aW5nIGZvciBzZWFyY2ggYW5kIHJlcGxhY2UgZnVuY3Rpb25zCit0YWJfc2VhcmNoPUV0c2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGFiIGZvciBzdGF0aXN0aWNzIGRpc3BsYXkgZm9yIGVpdGhlciB0aGUgUmVzb3VyY2UgQnVuZGxlIGFzIGEgd2hvbGUgb3IgcGFydGljdWxhciBsYW5ndWFnZSBmaWxlcwordGFiX3N0YXRpc3RpY3M9VGlsYXN0b3RpZWRvdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGFiIGZvciBkaXNwbGF5IG9mIHVudHJhbnNsYXRlZCBpdGVtcyBpbiB0aGUgZGlmZmVyZW50IGxhbmd1YWdlIGZpbGVzCit0YWJfdW50cmFuc2xhdGVkPUtcdTAwRTRcdTAwRTRudFx1MDBFNG1cdTAwRTR0dFx1MDBGNm1cdTAwRTR0CisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgR3JvdXBzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBDb2x1bW4gdGl0bGUgZm9yIGl0ZW0gY29tbWVudHMKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX2NvbW1lbnQ9S29tbWVudHRpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IENvbHVtbiB0aXRsZSBmb3IgaXRlbSdzIHJlc291cmNlIGtleQorbGFuZ3VhZ2Vncm91cF9jb2x1bW5fa2V5PVJlc3Vyc3NpblwgYXZhaW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitsYW5ndWFnZWdyb3VwX2NvbHVtbl90cmFuc2xhdGlvbj1LXHUwMEU0XHUwMEU0bm5cdTAwRjZzCisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgU3RhdGlzdGljcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGluIHRoZSBsYW5ndWFnZSBmaWxlIHN0YXRpc3RpY3MgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEEgY29tbWVudCBnaXZlbiB0byB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19jb21tZW50PUtvbW1lbnR0aVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBjb3VudHJ5IGJlaW5nIGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19jb3VudHJ5PU1hYVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2l0ZW1fY291bnQ9UmVzdXJzc2llblwgbVx1MDBFNFx1MDBFNHJcdTAwRTRcIHRcdTAwRTRzc1x1MDBFNFwgcmVzdXJzc2l0aWVkb3N0b3NzYVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBsYW5ndWFnZSBkZXNjcmliZWQgYnkgdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfbGFuZ3VhZ2U9S2llbGlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgbmFtZSBvZiBhIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhlIHRyYW5zbGF0aW9ucyBpbiB0aGlzIGxhbmd1YWdlIGZpbGUKK2xhbmd1YWdlc3RhdHNfbWFuYWdlcj1SZXN1cnNzaXRpZWRvc3Rvblwgb21pc3RhamFcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgbmFtZSBnaXZlbiB0byB0aGUgbGFuZ3VhZ2UgZmlsZQorbGFuZ3VhZ2VzdGF0c190aXRsZT1SZXN1cnNzaXRpZWRvc3RvblwgbmltaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE51bWJlciBvZiByZXNvdXJjZXMgbmVlZGluZyB0cmFuc2xhdGlvbiBpbiB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c190cmFuc2xhdGlvbl9jb3VudD1LXHUwMEU0XHUwMEU0bnRcdTAwRTRtXHUwMEU0dHRcdTAwRjZtaWVuXCByZXN1cnNzaWVuXCBtXHUwMEU0XHUwMEU0clx1MDBFNFwgdFx1MDBFNHNzXHUwMEU0XCByZXN1cnNzaXRpZWRvc3Rvc3NhXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIGxhbmd1YWdlL3JlZ2lvbiB2YXJpYW50IGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c192YXJpYW50PU11dW5uZWxtYVw6CisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgVW50cmFuc2xhdGVkIEl0ZW1zIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgY29sdW1uIHRpdGxlIGZvciBncm91cCBuYW1lcyBvZiBpdGVtcyBpbiB0aGUgcm93cworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9ncm91cD1SZXN1cnNzaXJ5aG1cdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIGtleSBvZiB0aGUgaXRlbSBhIHJvdworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9rZXk9UmVzdXJzc2luXCBhdmFpbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiBhbiBpdGVtIGluIGEgcm93CitsYW5ndWFnZXVudHJhbnNfY29sdW1uX3RyYW5zbGF0aW9uPUtcdTAwRTRcdTAwRTRublx1MDBGNnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgY292ZXJpbmcgYnV0dG9ucyB0aGF0IGFwcGx5IHRvIGEgc2VsZWN0ZWQgcmVzb3VyY2UgZnJvbSBhIHRhYmxlIG9mIHJlc291cmNlcworbGFuZ3VhZ2V1bnRyYW5zX3NlbGVjdGVkX3Jlc291cmNlc19vcHRpb25zPVZhbGl0dHVqZW5cIHJlc3Vyc3NpZW5cIHBhcmFtZXRyaXQKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyX3N2LnByb3BlcnRpZXMgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlcl9zdi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzZlOTAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlcl9zdi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTIxNiBAQAorIyBAZmlsZSAgICAgICAgICBSQk1hbmFnZXIKKyMgQGZpbGVFbmNvZGluZyAgc3YKKyMgQGZpbGVMYW5ndWFnZSAgU3dlZGlzaAorIyBAZmlsZUNvdW50cnkgICAKKyMgQGZpbGVWYXJpYW50ICAgCisjIEBmaWxlTWFuYWdlciAgIFN0ZWZhbiBFZGx1bmQKKyMgQGZpbGVDb21tZW50ICAgCisKKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBHcm91cHMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9uIEl0ZW1zIGZvciB0aGUgQmFzZSBDbGFzcyBHcm91cCB0YWJiZWQgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9jb21tZW50PUdydXBwXCBrb21tZW50YXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX25hbWU9R3J1cHBcIG5hbW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX29wdGlvbnM9UmVzdXJzZ3J1cHBcIGFsdGVybmF0aXYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2l0ZW1fb3B0aW9ucz1SZXN1cnNcIHNha1wgYWx0ZXJuYXRpdgorCisjCisjIEBncm91cCBCYXNlIENsYXNzIFN0YXRpc3RpY3MgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IEFsbCB0cmFuc2xhdGlvbnMgZm9yIHN0cmluZ3MgYXBwZWFyaW5nIG9uIHRoZSBzdGF0aXN0aWNzIHBhbmUgZm9yIHRoZSBiYXNlIGNsYXNzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2R1cGxpY2F0ZXNfY291bnQ9QW50YWxcIGtvcGllcmFkZVwgcmVzdXJzbnlja2xhcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZmlsZV9jb3VudD1BbnRhbFwgcmVzdXJzZmlsZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2dyb3VwX2NvdW50PUFudGFsXCByZXN1cnNncnVwcGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19ncm91cF9ncm91cD1SZXN1cnNcIGdydXBwZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2l0ZW1fY291bnQ9QW50YWxcIHJlc3Vyc1wgc2FrZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2l0ZW1fZ3JvdXA9UmVzdXJzc2FrCisKKyMKKyMgQGdyb3VwIEJhc2UgQ2xhc3MgVW50cmFuc2xhdGVkIEl0ZW1zIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgYXBwZWFyaW5nIG9uIHRoZSBCYXNlIENsYXNzIFVudHJhbnNsYXRlZCBJdGVtcyBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIGZpbGUgYmVpbmcgdmlld2VkCitiYXNldW50cmFuc19maWxlPUZpbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgcmVzb3VyY2UgaXRlbXMgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGZpbGUKK2Jhc2V1bnRyYW5zX3VudHJhbnNfY291bnQ9QW50YWxcIG9vdmVyc2F0dGFcIHNha2VyCisKKyMKKyMgQGdyb3VwIEJ1dHRvbiBOYW1lcworIworIyBAZ3JvdXBDb21tZW50IFRoZSBuYW1lcyBkaXNwbGF5ZWQgb24gdGhlIHZhcmlvdXMgYnV0dG9ucworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19maWxlX2dyb3VwPVJlc3Vyc1wgZmlsZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgbGFuZ3VhZ2UgZmlsZQorYnV0dG9uX2FkZF9maWxlPUxhZ2dcIHRpbGxcIG55XCByZXN1cnNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2ZpbGVfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCitidXR0b25fYWRkX2dyb3VwPUxhZ2dcIHRpbGxcIHJlc3Vyc1wgZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2dyb3VwX3RyaWdnZXI9ZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSB0cmFuc2xhdGlvbiBpdGVtCitidXR0b25fYWRkX3Jlc291cmNlPUxhZ2dcIHRpbGxcIHJlc3Vyc3NhaworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9hZGRfcmVzb3VyY2VfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciBjYW5jZWxpbmcgYWN0aW9ucworYnV0dG9uX2NhbmNlbD1BdmJyeXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIGEgY2hvaWNlIG9yIHNlbGVjdGlvbiBvcHRpb24KK2J1dHRvbl9jaG9vc2U9Vlx1MDBFNGxqCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2Nob29zZV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZ2VuZXJpYyBjcmVhdGlvbiBvZiBncm91cHMsIGl0ZW1zLCBmaWxlcywgZXRjLgorYnV0dG9uX2NyZWF0ZT1Ta2FwYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBGb3IgY3JlYXRpb24gb2YgYSByZXNvdXJjZSBncm91cAorYnV0dG9uX2NyZWF0ZV9ncm91cD1Ta2FwYVwgZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX2dyb3VwX3RyaWdnZXI9ZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIGNyZWF0aW5nIGFuIGl0ZW0gdGhlbiBjb250aW51aW5nIGNyZWF0aW5nIG1vcmUgaXRlbXMKK2J1dHRvbl9jcmVhdGVfbW9yZT1Ta2FwYVwgb2NoXCBGb3J0c1x1MDBFNHR0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9tb3JlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgcmVzb3VyY2UgdHJhbnNsYXRpb24gaXRlbQorYnV0dG9uX2NyZWF0ZV9yZXNvdXJjZT1Ta2FwYVwgcmVzdXJzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9yZXNvdXJjZV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTAyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX3RyaWdnZXI9YworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBCdXR0b24gZm9yIHJlbW92aW5nIGEgZ3JvdXAgYW5kIGl0cyBjb250ZW50cworYnV0dG9uX2RlbGV0ZV9ncm91cD1UYVwgYm9ydFwgZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBwZXJtYW5lbnRseSByZW1vdmluZyBhIHJlc291cmNlIGZyb20gdGhlIGJ1bmRsZQorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZT1UYVwgYm9ydFwgcmVzdXJzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZV90cmlnZ2VyPWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEdlbmVyaWMgZWRpdCBidXR0b24KK2J1dHRvbl9lZGl0PUVkaXRlcmEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBlZGl0aW5nIGdyb3VwIG5hbWUgYW5kIGNvbW1lbnQKK2J1dHRvbl9lZGl0X2dyb3VwPUVkaXRlcmFcIGdydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyByZXNvdXJjZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGtleSBhbmQgdHJhbnNsYXRpb24KK2J1dHRvbl9lZGl0X3Jlc291cmNlPUVkaXRlcmFcIHJlc3VycworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9lZGl0X3Jlc291cmNlX3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIGluaXRpYXRpbmcgYW4gaW1wb3J0IG9mIHJlc291cmNlcyBmcm9tIGFuIGFsdGVybmF0ZSBzb3VyY2UKK2J1dHRvbl9pbXBvcnQ9SW1wb3J0ZXJhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2ltcG9ydF90cmlnZ2VyPWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIGFsbG93cyBhIHNlbGVjdGVkIHJlc291cmNlIHRvIGJlIG1hcmtlZCBhcyB0cmFuc2xhdGVkIHdpdGhvdXQgZnVydGhlciBlZGl0aW5nCitidXR0b25fbWFya190cmFuc2xhdGVkPU1hcmtlcmFcIHNvbVwgXHUwMEY2dmVyc2F0dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9tYXJrX3RyYW5zbGF0ZWRfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGFkZGluZyB0aGUgY3VycmVudCByZXNvdXJjZSBidW5kbGUgaW4gdGhlIG1haW4gYXBwbGljYXRpb24gdG8gdGhlIHByb2plY3QKK2J1dHRvbl9wcm9qZWN0X2FkZD1BZGRcIEN1cnJlbnRcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9hZGRfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNsb3NpbmcgdGhlIHByb2plY3Qgd2luZG93CitidXR0b25fcHJvamVjdF9jbG9zZT1DbG9zZVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9jbG9zZV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK2J1dHRvbl9wcm9qZWN0X25ldz1OZXdcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfbmV3X3RyaWdnZXI9bgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBvcGVuaW5nIGEgcHJvamVjdCBmaWxlCitidXR0b25fcHJvamVjdF9vcGVuPU9wZW5cIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3Rfb3Blbl90cmlnZ2VyPW8KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNvdXJjZSBidW5kbGUgZnJvbSB0aGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfcmVtb3ZlPVJlbW92ZVwgU2VsZWN0aW9uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X3JlbW92ZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY2F1c2luZyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgYnVuZGxlIHRvIGJlIHRoZSBvbmUgYmVpbmcgZWRpdGVkIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uCitidXR0b25fcHJvamVjdF9zZWxlY3Q9RWRpdFwgU2VsZWN0ZWQKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3Rfc2VsZWN0X3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHNlYXJjaAorYnV0dG9uX3NlYXJjaF9maW5kX2FsbD1IaXR0YVwgYWxsYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9zZWFyY2hfZmluZF9hbGxfdHJpZ2dlcj1mCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwZXJmb3JtaW5nIGNvbXBsZXRlIHNlYXJjaCBhbmQgcmVwbGFjZQorYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbD1FcnNcdTAwRTR0dFwgYWxsYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9zZWFyY2hfcmVwbGFjZV9hbGxfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBHZW5lcmljIGJ1dHRvbiBmb3IgdXBkYXRpbmcgaW5mb3JtYXRpb24KK2J1dHRvbl91cGRhdGU9VXBkYXRlcmEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fdXBkYXRlX3RyaWdnZXI9dQorCisjCisjIEBncm91cCBEaWFsb2dzCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb25zIHZhcmlvdXMgZGlhbG9nIGJveGVzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGFpbG9nX3RpdGxlX3ByZWZlcmVuY2VzPUluc3RhbGxuaW5nYXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEluZGljYXRpb24gb2Ygd2V0aGVyIG9yIG5vdCBhIG5ldyBmaWxlIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20gdGhlIGVsZW1lbnRzIGluIHRoZSBiYXNlIGNsYXNzCitkaWFsb2dfY2hlY2tib3hfY29weV9lbGVtZW50cz1Lb3BpZXJhXCBzYWtlclwgZnJhblwgYmFza2xhc3NcIHRpbGxcIG55XCBmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEluZGljYXRvciBvZiB3ZXRoZXIgYW4gaXRlbSBpcyB0cmFuc2xhdGVkIG9yIG5vdAorZGlhbG9nX2NoZWNrYm94X3RyYW5zbGF0ZWQ9T3ZlcnNhdHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2NvbW1lbnQ9S29tZW50YXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfY291bnRyeT1MYW5kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19jcmVhdGVkPVNrYXBhZFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19jcmVhdG9yPVNrYXBhcmVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQHsxfSBUaGUgZGF0ZQorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSBwZXJzb24gaW52b2x2ZWQKKyMgQGNvbW1lbnQgVGhlIGRhdGUgYW5kIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYSBjcmVhdGlvbiBvciBtb2RpZmljYXRpb24gb2YgYW4gaXRlbQorZGlhbG9nX2RhdGVfcGVyc29uPXswfVwgYXZcIHsxfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVmYXVsdF9jb21tZW50PVNrb25zdmFyZGVcIGZvclwga29tbWVudGFyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2RlZmF1bHRfdHJhbnNsYXRpb249U2tvbnN2YXJkZVwgZm9yXCBvdmVyc2F0dG5pbmcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9maWxlPVRhXCBib3J0XCByZXN1cnNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9ncm91cD1UYVwgYm9ydFwgcmVzdXJzXCBncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVsZXRlX2l0ZW09VGFcIGJvcnRcIHJlc3Vyc3NhaworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBXYXJuaW5nIGRpc3BsYXllZCB3aGVuIGEgdXNlciBhc2tzIGZvciBhIGRlbGV0aW9uIG9mIGEgZmlsZS4gUHJvbXB0cyBmb3IgJ1llcycgb3IgJ05vJworZGlhbG9nX2RlbGV0ZV93YXJuaW5nPVZhcm5pbmdcIVwgUmFkZXJpbmdlblwga2FuXCBpbnRlXCBcdTAwRTVuZ3Jhcy5cblx1MDBDNHJcIGR1XCBzXHUwMEU0a2VyXCBhdHRcIGR1XCB2aWxsXCBmb3J0c1x1MDBFNHR0YT8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2VuY29kaW5nPUtvZG5pbmdcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9jb21tZW50PUtvbW1lbnRhclwgZm9yXCByZXN1cnNmaWxcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb249QmFza2xhc3NcIGVnZW5za2Fwc2ZpbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEZXNjcmlwdGlvbiBvZiBGaWxlIEZpbHRlciBmb3IgUkJSZXBvcnRlciBYTUwgc2NhbiBjb25maWd1cmF0aW9uIGZpbGVzCitkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb25fc2Nhbj1YTUxcIFJCUmVwb3J0ZXJcIGxcdTAwRTRzXCBmaWxlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9pbmZvPUZpbFwgaW5mb3JtYXRpb24KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfbWFuYWdlcj1OYW1uXCBmb3JcIHJlc3Vyc2FnYXJlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfdGl0bGU9VGl0ZWxcIGZvclwgcmVzdXJzZmlsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2dyb3VwPUdydXBwXCBuYW1uXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2dyb3VwX2NvbW1lbnQ9R3J1cHBcIGtvbW1lbnRhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19rZXk9Tnlja2VsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2xhbmd1YWdlPVNwcmFrCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19sb29rdXBzPVVwcGxldG5pbmdhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19tb2RpZmllZD1TZW5hc3RcIG1vZGlmaWVyYWRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfbW9kaWZpZXI9U2VuYXN0XCBtb2RpZmllcmFkXCBhdlw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgbmFtZSBvZiBhIGxhbmd1YWdlLCBjb3VudHJ5LCBvciB2YXJpYW50IG9mIGEgbGFuZ3VhZ2UgZmlsZQorZGlhbG9nX25hbWU9TmFtblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIGEgbmFtZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSwgYmVmb3JlIGNyZWF0aW5nIHRoYXQgYnVuZGxlCitkaWFsb2dfbmV3X2Jhc2VjbGFzcz1NYXRhXCBpblwgZW5cIG55XCBiYXNrbGFzc25hbW5cIGZvclwgcmVzdXJzZmlsZW4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBEaWFsb2cgcG9wdXAgd2luZG93IHRleHQgcHJvbXB0aW5nIHRoZSB1c2VyIGZvciB0aGUgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0CitkaWFsb2dfbmV3X3Byb2plY3Q9UGxlYXNlXCBlbnRlclwgYVwgdGl0bGVcIGZvclwgeW91clwgbmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZXMgbWFraW5nIGl0IHRocm91Z2ggdGhlIGZpbHRlciB1cG9uIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUKK2RpYWxvZ19vcGVuX2ZpbGVfZmlsdGVyPUJhc2tsYXNzXCBlZ2Vuc2thcHNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoaXMgaXMgYSBzZWN0aW9uIGhlYWRpbmcgZm9yIHNldHRpbmcgdGhlIGxvY2FsZQorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZT1Mb2thbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTG9jYWxlcyBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGUgcHJvcGVydGllcyBmaWxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX2RlZmluZWQ9RGVmaW5pZXJhZFwgZm9yXCBSQk1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX2lzbz1JU09cIFN0YW5kYXJkZXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTG9jYWxlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgSmF2YSBWaXJ0dWFsIE1hY2hpbmUKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfbWFjaGluZT1Lb21wYXRpYmVsXCB1dHJ1c3RuaW5nXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX3dhcm5pbmc9T0JTLlwgQW5kcmluZ2FyXCB0aWxsXCBsb2thbGVuXCBhclwgaW50ZVwgYWt0aXZhXCB0aWxsc1wgYXBwbGlrYXRvaW5lblwgYXRlcnN0YXJ0YXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvb2thbmRmZWVsPSdMb29rXCBhbmRcIEZlZWwnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc191c2VybmFtZT1BbnZhbmRhcm5hbW5cOgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGVzY3JpcHRvciB0aGF0IGdvZXMgaW50byBHVUkgZmlsZSBjaG9vc2VyCitkaWFsb2dfcHJvamVjdF9maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbj1SQk1hbmFnZXJcIFByb2plY3RcIEZpbGVzCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBGaWxlIEZpbHRlciBkZXNjcmlwdGlvbiBmb3IgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QgZmlsZXMKK2RpYWxvZ19wcm9qZWN0X2ZpbHRlcl9kZXNjcmlwdGlvbj1SZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0cworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiB0aGF0IG5vIHByb2plY3QgaXMgb3BlbiwgcGxhY2VkIGluIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIHdoZXJlIHRoZSBwcm9qZWN0IG5hbWUgd291bGQgbm9ybWFsbHkgZ28KK2RpYWxvZ19wcm9qZWN0X25vbmVfc2VsZWN0ZWQ9Tm9cIEFjdGl2ZVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdAorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIHdpbmRvdyBzaG93aW5nIGFsbCB0aGUgcmVzb3VyY2UgYnVuZGxlcyBpbiBhIHByb2plY3QKK2RpYWxvZ19wcm9qZWN0X3RpdGxlPVJlc291cmNlXCBCdW5kbGVcIFByb2plY3RcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBQcm9tcHRzIHRoZSB1c2VyIGlmIHRoZXkgd291bGQgbGlrZSB0byBzYXZlIGNoYW5nZXMgYmVmb3JlIGV4aXRpbmcKK2RpYWxvZ19xdWl0X3NhdmU9VmlsbFwgZHVcIHNwYXJhXCBpbm5hblwgZHVcIGF2c2x1dGFyXCBSQk1hbmFnZXI/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEEgZ2VuZXJpYyBwcm9wbXB0IHRvIGFzayB0aGUgdXNlciBpZiB0aGV5IHdpc2ggdG8gc2F2ZSBjaGFuZ2VzCitkaWFsb2dfc2F2ZT1WaWxsXCBkdVwgc3BhcmFcIGFuZHJpbmdhclwgdGlsbFwgcmVzdXJzZ3J1cGVuPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfc2VhcmNoX29wdGlvbnM9U29rbmluZ3NhbHRlcm5hdGl2CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19zZWFyY2hfcGFyYW09TGV0YVwgZWZ0ZXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIHRpdGxlIG9mIHRoZSBhYm91dCBkaWFsb2cgYm94CitkaWFsb2dfdGl0bGVfYWJvdXRfcmJtYW5hZ2VyPU9tXCBSQk1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGRpYWxvZyBwcm9tcHRpbmcgZm9yIGRlbGV0aW9uIG9mIGFuIGVudGlyZSByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX2RlbGV0ZV9ncm91cD1UYVwgYm9ydFwgcmVzdXJzXCBncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjIgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSB3aGVuIHByb21wdGluZyB0byBkZWxldGUgYSByZXNvdXJjZQorZGlhbG9nX3RpdGxlX2RlbGV0ZV9pdGVtPVRhXCBib3J0XCByZXN1cnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2VkaXRfZ3JvdXA9RWRpdGVyYVwgUmVzdXJzZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2VkaXRfaXRlbT1FZGl0ZXJhXCByZXN1cnNzYWsKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2Vycm9yPUVycm9yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lcnJvcl9jcmVhdGluZ19idW5kbGU9RmVsXCB2aWRcIHNrYXBhbmRlXCBhdlwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSB3aGVuIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUgbm90IGNyZWF0ZWQgYnkgUkJNYW5hZ2VyCitkaWFsb2dfdGl0bGVfZXJyb3Jfbm90X3JibWFuYWdlcl9mb3JtYXQ9RmVsXDpcIE9sXHUwMEU0c2JhclwgcmVzdXJzZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGl0bGUgb24gYSB3YXJuaW5nIGRpYWxvZyB0aGF0IEkvTyBtYWxmdW5jdGlvbmVkIG9wZW5pbmcgYSBmaWxlCitkaWFsb2dfdGl0bGVfZXJyb3Jfb3BlbmluZ19maWxlPUZlbFwgdmlkXCBcdTAwRjZwcG5hbmRlXCBhdlwgZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgYSBkaWFsb2cgYm94IGZvciBlbnRlcmluZyBzcGVjaWFsIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGV4cG9ydCBhIHJlc291cmNlIGJ1bmRsZSB0byBqYXZhIGNsYXNzIGNvZGUKK2RpYWxvZ190aXRsZV9leHBvcnRfamF2YV9vcHRpb25zPUV4cG9ydFwgcGFyYW1ldHJhclw6XCBKYXZhXCBrbGFzcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgYSBkaWFsb2cgd2l0aCBhIHByb2dyZXNzIGJhciBnb3Zlcm5pbmcgaW1wb3J0IHN0YXR1cworZGlhbG9nX3RpdGxlX2ltcG9ydF9wcm9ncmVzcz1JbXBvcnRlcmluZ3NmcmFtZ1x1MDBFNW5nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgbmV3IGJ1bmRsZQorZGlhbG9nX3RpdGxlX25ld19idW5kbGU9U2thcGFcIG55XCByZXN1cnNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBmaWxlCitkaWFsb2dfdGl0bGVfbmV3X2ZpbGU9U2thcGFcIG55XCByZXN1cnNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX25ld19ncm91cD1Ta2FwYVwgbnlcIHJlc3Vyc2dydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2UKK2RpYWxvZ190aXRsZV9uZXdfaXRlbT1Ta2FwYVwgbnlcIHJlc3Vyc3NhaworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGl0bGUgb2YgdGhlIGRpYWxvZyBib3ggc2hvd2luZyB3aGVuIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKK2RpYWxvZ190aXRsZV9uZXdfcHJvamVjdD1OZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX3ByZWZlcmVuY2VzPUluc3RhbGxuaW5nYXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRpdGxlIGZvciBjb25maXJtaW5nIGV4aXQgZnJvbSBhcHBsaWNhdGlvbgorZGlhbG9nX3RpdGxlX3F1aXQ9QXZzbHV0YVwgUkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9zZWFyY2g9U29rCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV91c2VyX25hbWU9TWF0YVwgaW5cIGFudmFuZGFybmFtbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdHJhbnNsYXRpb249T3ZlcnNhdHRuaW5nXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3VzZXJfbmFtZT1NYXRhXCBpblwgbmFtbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3ZhcmlhbnQ9VmFyaWFudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ193YXJuaW5nX2RlbGV0ZV9ncm91cD1PbVwgZHVcIHRhclwgYm9ydFwgZGVuXCBhclwgZ3J1cHBlblwgc2FcIGZvcnN2aW5uZXJcIGFsbGFcIHNha2VyXCBpXCBncnVwcGVuLlwgVmlsbFwgZHVcIGZvcnNhdHRhPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfaXRlbT1SZXN1cnNzYWtlblwga29tbWVyXCBhdHRcIGZvcnN2aW5uYS5cIFZpbGxcIGR1XCBmb3JzYXR0YT8KKworIworIyBAZ3JvdXAgRXJyb3IgTWVzc2FnZXMKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcj1GZWwKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRyeWluZyB0byBhZGQgYSByZXNvdXJjZSBidW5kbGUgdG8gYSBwcm9qZWN0LgorZXJyb3JfYWRkaW5nX3Byb2plY3RfYnVuZGxlPUFuXCBlcnJvclwgb2NjdXJyZWRcIHRyeWluZ1wgdG9cIGFkZFwgdGhlXCBSZXNvdXJjZVwgQnVuZGxlXCB5b3VcIHNlbGVjdGVkLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl9iYXNlY2xhc3Nfd2hpdGVzcGFjZT1SZXN1cnNuYW1uXCBrYW5cIGludGVcIGhhXCBzcGFjZVwgaVwgZGVtLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl9idW5kbGVfbm90X2NyZWF0ZWQ9SW5nZW5cIHJlc3Vyc2ZpbFwgdmFyXCBza2FwYWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfY3JlYXRlX2ZpbGU9RXR0XCBmZWxcIHVwcHN0b2RcIG5hclwgdmlcIGZvcnNva3RlXCBza2FwYVwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX2NyZWF0ZV9ncm91cD1FdHRcIHByb2JsZW1cIHVwcHN0b2RcIG5hclwgZ3J1cHBlblwgZm9yc29rdGVcIHNrYXBhcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfaXRlbT1FdHRcIGZlbFwgdXBwc3RvZFwgdmlkXCBza2FwYW5kZVwgYXZcIG55XCBvdmVyc2F0dG5pbmcKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIGNyZWF0aW5nIGEgcHJvamVjdAorZXJyb3JfY3JlYXRpbmdfcHJvamVjdD1BblwgZXJyb3JcIHdhc1wgZW5jb3VudGVyZWRcIHRyeWluZ1wgdG9cIGNyZWF0ZVwgYVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQHswfSBUaGUgbWVzc2FnZSBmcm9tIGFuIElPRXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gZGVsZXRlIGEgZmlsZQorZXJyb3JfZGVsZXRpbmc9RXR0XCBmZWxcIHVwcHN0b2RcIG5cdTAwRTRyXCBqYWdcIGZcdTAwRjZyc1x1MDBGNmt0ZVwgdGFcIGJvcnRcIGZpbFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQW4gZXJyb3IgdGhhdCBvY2N1cnMgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgZmlsZSwgYnV0IHRoZSB2aXJ0dWFsIG1hY2hpbmUgY2FuIG5vdCBkbyBzbworZXJyb3JfZGVsZXRpb25fbm90X3Bvc3NpYmxlPVJCTWFuYWdlclwga3VuZGVcIGVqXCB0YVwgYm9ydFwgZmlsLlwgVGlsbHN0XHUwMEU1bmRcIGZcdTAwRjZyYmp1ZGVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2UgZm9yIGV4cG9ydGluZyByZXNvdXJjZSBidW5kbGVzCitlcnJvcl9leHBvcnQ9RXR0XCBmZWxcIHVwcHN0b2RcIHZpZFwgZXhwb3J0ZXJpbmdcIGF2XCByZXN1cnNncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl9pbnRlcm5hbD1JbnRlcm50XCBmZWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2ZpbGU9RXR0XCBmZWxcIHVwcHN0b2RcIHZpZFwgbW9kaWZpZXJpbmdcIGF2XCByZXN1cnNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2dyb3VwPUV0dFwgZmVsXCB1cHBzdG9kXCBuYXJcIGdydXBwXCBtb2RpZmllcmFkZXMuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9pdGVtPUV0dFwgZmVsXCB1cHBzdG9kXCBuYXJcIG92ZXJzYXR0bmluZ1wgYW5kcmFkZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9maWxlPUZvclwgYXR0XCBza2FwYVwgZW5cIHJlc3Vyc2ZpbFwgc2FcIG1hc3RlXCBkdVwgZm9yc3RcIHNrYXBhXCBlblwgcmVzdXJzZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9ncm91cD1Gb3JcIGF0dFwgc2thcGFcIGVuXCBncnVwcFwgc2FcIG1hc3RlXCBkdVwgZm9yc3RcIHNrYXBhXCBlblwgcmVzdXJzZ3J1cHAuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIGNyZWF0ZSBhIHJlc291cmNlLCB3aXRob3V0IGFuIG9wZW4gcmVzb3VyY2UgYnVuZGxlCitlcnJvcl9ub19idW5kbGVfZm9yX2l0ZW09T3BwbmFcIGVuXCByZXN1cnNncnVwcFwgaW5uYW5cIGR1XCBmb3Jzb2tlclwgc2thcGFcIGVuXCBueVwgb3ZlcnNhdHRuaW5nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorZXJyb3Jfbm9fa2V5X3JlcGxhY2U9RXJzXHUwMEU0dHRcIGZ1bmdlcmFyXCBlalwgZlx1MDBGNnJcIHJlc3Vyc1wgbnlja2xhci5cIEFsbGFcIGFuZHJhXCBlcnNcdTAwRTR0dG5pbmdhclwga29tbWVyXCBhdHRcIHV0Zlx1MDBGNnJhcy4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiB0aGF0IFJCTWFuYWdlciBjYW4gbm90IHJlYWQgdGhlIGZpbGUgYXMgY3JlYXRlZCBieSBSQk1hbmFnZXIKK2Vycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0PURlblwgdmFsZGFcIHJlc3Vyc1wgZ3J1cHBlblwgdmFyXCBlalwgc2thcGFkXCBhdlwgUkJNYW5hZ2VyLFwgZWxsZXJcIGZpbGVuXCBcdTAwRTRyXCBza2FkYWQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3b3VsZCBub3Qgb3BlbgorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIG9jY3VyaW5nIG9uIGFuIEkvTyBlcnJvciB0cnlpbmcgdG8gb3BlbiBhIGZpbGUKK2Vycm9yX29wZW5pbmdfZmlsZT1LdW5kZVwgZWpcIFx1MDBGNnBwbmFcIGZpbFwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gUkJNYW5hZ2VyIGVuY291bnRlcnMgYW4gZXJyb3Igd3JpdGluZyBwcmVmZXJlbmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0KK2Vycm9yX3ByZWZlcmVuY2VzX3NhdmU9RXR0XCBmZWxcIHVwcHN0b2RcIG5cdTAwRTRyXCBqYWdcIGZcdTAwRjZyc1x1MDBGNmt0ZVwgc3BhcmFcIGRpbmFcIGluc3RcdTAwRTRsbGluZ2FyLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZAorIyBAY29tbWVudCBBIG1lc3NhZ2UgcHJlc2VudGVkIHRvIHRoZSB1c2VyIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIHNhdmluZyB0aGUgcmVzb3VyY2UgYnVuZGxlCitlcnJvcl9zYXZpbmc9UHJvYmxlbVwgdmlkXCBzcGFyYW5kZVwgYXZcIHJlc3Vyc2dydXBwZW5cOlwgXCB7MH0KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIHNhdmluZyBhIHByb2plY3QKK2Vycm9yX3NhdmluZ19wcm9qZWN0PUFuXCBlcnJvclwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgc2F2ZVwgdGhlXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjIgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTdWdnZXN0IHRyeWluZyB0byBpbXBvcnQgdGhlIHJlc291cmNlIGJ1bmRsZSBpbnN0ZWFkIG9mIG9wZW5pbmcgaXQuCitlcnJvcl9zdWdnZXN0X2ltcG9ydF9wcm9wZXJ0aWVzPUZcdTAwRjZyc1x1MDBGNmtcIGltcG9ydGVyYVwgcmVzdXJzZ3J1cHBlblwgaXN0XHUwMEU0bGxldC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2ZpbGU9Rm9yc29rXCBpZ2VuXCBtZWRcIGVuXCBhbm5hblwga29kbmluZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5fZ3JvdXA9Rm9yc29rXCBpZ2VuXCBtZWRcIGVuXCBhbm5hblwgZ3J1cHBuYW1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX3RyeV9hZ2Fpbl9pdGVtPUZvcnNva1wgaWdlblwgbWVkXCBlblwgYW5uYW5cIG55Y2tlbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBWYWx1ZSBpbnNlcnRlZCBpbnRvIHRhYmxlIGNlbGxzIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VyZWQKK3RhYmxlX2NlbGxfZXJyb3I9KkZlbCoKKworIworIyBAZ3JvdXAgRXhwb3J0CisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGRlYWxpbmcgd2l0aCBleHBvcnQgb3B0aW9ucworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE9wdGlvbiBmb3IgdGhlIHBhcmFtZXRlciBmb3IgY3JlYXRlZCBhIHByb3RlY3RlZCBjbGFzcworZXhwb3J0X2phdmFfY2xhc3NfcHJvdGVjdGVkPVNrYXBhXCBlblwgc2t5ZGRhZFwga2xhc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgc2V0dGluZyB0aGUgY3JlYXRlZCBjbGFzcyBhcyBwdWJsaWMKK2V4cG9ydF9qYXZhX2NsYXNzX3B1YmxpYz1Ta2FwYVwgZW5cIHB1Ymxpa1wga2xhc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIHByb3RlY3RlZCBtZXRob2RzIGluIHRoZSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV9tZXRob2RzX3Byb3RlY3RlZD1Ta2FwYVwgZW5cIHNreWRkYWRcIG1ldG9kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcGFyYW1ldGVyIGZvciBjcmVhdGluZyBwdWJsaWMgbWV0aG9kcworZXhwb3J0X2phdmFfbWV0aG9kc19wdWJsaWM9U2thcGFcIHB1Ymxpa1wgbWV0b2QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGl0bGUgb2YgYSBjaGVjayBib3ggZm9sbG93ZWQgYnkgYSB0ZXh0IGZpZWxkIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBhIHBhY2thZ2UgaW4gdGhlIGdlbmVyYXRlZCBqYXZhIGNsYXNzIGFuZCB3aGF0IHRoZSBwYWNrYWdlIHNob3VsZCBiZSBjYWxsZWQKK2V4cG9ydF9qYXZhX3BhY2thZ2U9U3BlY2lmaWVyYVwgSmF2YVwgcGFja2FnZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRleHQgcGxhY2VkIGluIGEgbGFiZWwgYXQgdGhlIHRvcCBvZiB0aGUgZGlhbG9nIGJveCBmb3Igc3BlY2lmeWluZyBwYXJhbWV0ZXJzIGNvbmNlcm5pbmcgdGhlIGV4cG9ydCBvZiByZXNvdXJjZSBidW5kbGVzIGludG8gYSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV90aXRsZT1WYXJcIGdvZFwgc3BlY2lmaWNlcmFcIGZcdTAwRjZsamFuZGVcIHBhcmFtZXRyYXJcIGZcdTAwRjZyXCBkaW5cIEphdmFcIGtsYXNzXDoKKworIworIyBAZ3JvdXAgR2VuZXJhbAorIworIyBAZ3JvdXBDb21tZW50IFNvbWUgaXRlbXMgdGhhdCBhcmUgY29tbW9uIGFjY3Jvc3MgZ3JvdXBzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBmaWxlIG9yIGNsYXNzIGNvbXBvc2VkIG9mIHRoZSBkZWZhdWx0IHRyYW5zbGF0aW9ucyBmb3IgdGhlIGJ1bmRsZQorYmFzZWNsYXNzPUJhc2tsYXNzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwNC0wNi0yOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgR2VvcmdlCisjIEBjb21tZW50IFRoaXMgaXMgdGhlIGxlZ2FsIGNvcHlyaWdodCBub3RpY2UKK2NvcHlyaWdodD0oQylcIEtvcGllcmluZ3Nza3lkZGFkXCBJQk1cIENvcnAuXCAyMDAwLTIwMDRcIC1cIEFsbGFcIHJhdHRpZ2hldGVyXCByZXNlcnZlcmFkZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZXJuZXJhbCB1c2UgZm9yIGZpbGUgZGlyZWN0b3JpZXMKK2RpcmVjdG9yeT1Gb2xkZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZ3JvdXBzPUdydXBwZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRoZSBuYW1lIG9mIHRoZSBpbWFnZSBmaWxlIGluIHRoZSAnSW1hZ2VzJyBkaXJlY3RvcnkgdGhhdCByZXByZXNlbnRzIHRoZSBsb2dvIHNlZW4gYXQgdGhlIHRvcCBvZiB0aGUgYXBwbGljYXRpb24KK2xvZ29fZmlsZW5hbWU9VGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVHJlZSBub2RlIHRpdGxlIHdoZW4gdmlld2luZyBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB2aWV3IHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIHByb2plY3QKK25vX3Byb2plY3Q9RGVmYXVsdFwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVHJlZSBub2RlIHRpdGxlIGRlZmF1bHRlZCB0byB3aGVuIG5vIHJlc291cmNlIGJ1bmRsZSBvciBwcm9qZWN0IGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlcgorbm9fcHJvamVjdF9idW5kbGU9Tm9cIFByb2plY3RcIG9yXCBSZXNvdXJjZVwgQnVuZGxlXCBPcGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgdG9wIHRyZWUgbm9kZSB0aXRsZSwgd2hlbiBubyByZXNvdXJjZSBidW5kbGUgaGFzIGJlZW4gb3BlbmVkIG9yIGNyZWF0ZWQKK25vX3Jlc291cmNlX2J1bmRsZT1JbmdlblwgcmVzdXJzZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorbm9uZT1JbmdlbgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUHJvamVjdCB0YWJsZSBjb2x1bW4gbmFtZSAtIExvY2F0aW9uIG9mIGEgcmVzb3VyY2UgYnVuZGxlCitwcm9qZWN0X3RhYmxlX2ZpbGVfbG9jYXRpb249RmlsZVwgTG9jYXRpb24KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRhYmxlIENvbHVtbiBOYW1lIGZvciByZXNvdXJjZSBidW5kbGUgbmFtZQorcHJvamVjdF90YWJsZV9yZXNvdXJjZV9idW5kbGU9UmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gYWJicmV2aWF0ZWQgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uCityYm1hbmFnZXI9UkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwNC0wNi0yOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgR2VvcmdlCisjIEBjb21tZW50IAorcmJtYW5hZ2VyX2NvbnRhY3Q9U2thcGFyZVw6XCBKYXJlZFwgSmFja3NvblwgJlwgR2VvcmdlXCBSaG90ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBmdWxsIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbgorcmVzb3VyY2VfYnVuZGxlX21hbmFnZXI9UmVzdXJzZ3J1cHBcIEFnYXJlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK3RhYmxlX2NvbHVtbl9lcnJvcj1GZWxcIGlcIGtvbHVtbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQHswfSAKKyMgQGNvbW1lbnQgTm9kZSB0aXRsZSwgdW5kZXIgd2hpY2ggYWxsIGZpbGVzIG9mIHRoZSBzYW1lIGNvdW50cnksIGxhbmd1YWdlIHJlc2lkZQordHJlZV9jb3VudHJ5X25vZGU9TGFuZHNrb2RcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAezB9IExhbmd1YWdlIEVuY29kaW5nCisjIEBjb21tZW50IFRoZSBub2RlIGJlbG93IHdoaWNoIGxhbmd1YWdlcyBvZiBvbmUgZW5jb2RpbmcgYXJlIGdyb3VwZWQKK3RyZWVfbGFuZ3VhZ2Vfbm9kZT1TcHJha2tvZFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAordHJlZV92YXJpYW50X25vZGU9VmFyaWFudGVyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBuYW1lIGFzc2lnbmVkIGFzIGEgdXNlciBuYW1lIHdoZW4gdGhlIHVzZXIgbmFtZSBpcyBub3Qgc3BlY2lmaWVkCit1bmtub3duX3VzZXI9T2thbmQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAordW50aXRsZWQ9SW5nZW5cIHRpdGVsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK3VudHJhbnNsYXRlZF9pdGVtcz1Pb3ZlcnNhdHRhXCBzYWtlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQHswfSBUaGUgdmVyc2lvbiBudW1iZXIKKyMgQGNvbW1lbnQgVGhlIHZlcnNpb24gb2YgdGhpcyBhcHBsaWNhdGlvbgordmVyc2lvbj1WZXJzaW9uXCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZ2VuZXJhbCB1c2UgV2FybmluZword2FybmluZz1WYXJuaW5nCisKKyMKKyMgQGdyb3VwIEltcG9ydAorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBkZWFsaW5nIHdpdGggaW1wb3J0IG9wdGlvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZmlsZSBjaG9vc2VyIGZvciBjaG9vc2luZyBUTVggZmlsZXMKK2ltcG9ydF9UTVhfZmlsZV9kZXNjcmlwdGlvbj1UTVhcIGZpbGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gVE1YIFhNTCBmaWxlcworaW1wb3J0X1RNWF90aXRsZT1UTVhcIGZpbGltcG9ydAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIGZpbGUgY2hvb3NlciBmb3IgY2hvb3NpbmcgWExJRkYgKC54bGYpIGZpbGVzCitpbXBvcnRfWExGX2ZpbGVfZGVzY3JpcHRpb249WExJRkZcIGZpbGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IERpYWxvdCB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gWExJRkYgKC54bGYpIGZpbGVzCitpbXBvcnRfWExGX3RpdGxlPVhMSUZGXCBmaWxpbXBvcnQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgY29uZmxjaXRzIG9uIGEgY2FzZSBieSBjYXNlIGJhc2lzCitpbXBvcnRfY29uZmxpY3RfcHJvbXB0PUZyXHUwMEU1Z2FcIHZpZFwgdmFyamVcIGtvbmZsaWt0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBzcGVjaWZ5aW5nIHdoZXRoZXIgYSBncm91cCBmb3VuZCBpbiB0aGUgdGFyZ2V0IGJ1dCBub3QgZm91bmQgaW4gdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBvciBub3QKK2ltcG9ydF9kZWZhdWx0X2dyb3VwX2NyZWF0aW9uPVNrYXBhXCBncnVwcGVyXCBzb21cIGludGVcIGV4aXN0ZXJhclwgaVwgbnV2YXJhbmRlXCBidW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0b2luIGZvciBtYXJraW5nIHRoZSBpbmNvbWluZyB2YWx1ZXMgYXMgdHJhbnNsYXRlZCBvciBub3QKK2ltcG9ydF9kZWZhdWx0X3RyYW5zbGF0ZWQ9TWFya2VyYVwgc29tXCBcdTAwRjZ2ZXJzYXR0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBvcHRpb25zIHNwZWNpZnlpbmcgdGhlIG1ldGEgZGF0YSB0byBiZSBhcHBsaWVkIHRvIGluZGl2aWR1YWwgcmVzb3VyY2VzIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGltcG9ydCBzb3VyY2UKK2ltcG9ydF9kZWZhdWx0X3ZhbHVlcz1Ta1x1MDBGNm5zdlx1MDBFNHJkZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgbG9jYWxlIGVuY29kaW5nIG9mIHRoZSBmaWxlIGluIHF1ZXN0aW9uCisjIEBjb21tZW50IEluc3RydWN0aW9ucyBmb3IgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIHJlc29sdmUgYSBjb25mbGljdCB3aGVuIGltcG9ydGluZyByZXNvdXJjZXMgZnJvbSBhIGxvY2FsZSB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHJlc291cmNlIGJ1bmRsZQoraW1wb3J0X2ZpbGVfY29uZmxpY3RfY2hvb3NlPUtvZG5pbmdlblwgezB9XCBmaW5uc1wgZWouXCBWXHUwMEU0bGpcIGV0dFwgdmFsXCBmXHUwMEY2clwgYXR0XCBmaXhhXCBrb25mbGlrdGVuLFwgZWxsZXJcIGF2YnJ5dFwgZlx1MDBGNnJcIGF0dFwgaWdub3JlcmEuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQsIGJ1dCBub3QgcG9wdWxhdGVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9lbXB0eT1Ta2FwYVwgZW5cIG55LFwgdG9tXCByZXN1cnNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQgYW5kIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgZXhpc3RpbmcgcmVzb3VyY2VzCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9wb3B1bGF0ZT1Ta2FwYVwgZW5cIG55XCByZXN1cnNmaWxcIG9jaFwgZnlsbFwgaVwgbWVkXCBiYXMta2xhc3NlbnNcIHJlc3VyZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCB0aGUgY29uZmxpY3RzIGFyZSBpZ25vcmVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9pZ25vcmU9U2tpcHBhXCBvY2hcIGlnbm9yZXJhXCBhbGxhXCByZXN1cnNlclwgZnJcdTAwRTVuXCBsb2thbGVyXCBzb21cIGludGVcIGV4aXN0ZXJhclwgaVwgbnV2YXJhbmRlXCBidW50LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3Igc2VjdGlvbiBsaXN0aW5nIG9wdGlvbnMgZm9yIHdoYXQgdG8gZG8gd2hlbiBhbiBpbXBvcnRlZCB2YWx1ZSBleGlzdHMgaW4gYSBsb2NhbGUgbm90IGRlZmluZWQgaW4gdGhlIGV4aXN0aW5nIHJlc291cmNlIGJ1bmRsZQoraW1wb3J0X2ZpbGVfY29uZmxpY3RzPVJlc3Vyc2ZpbFwgc2FrbmFzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFNlbGVjdGlvbiBvZiB0aGUgZGVmYXVsdCBncm91cC4gQSBsaXN0IG9mIGdyb3VwcyB3aWxsIGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhpcyByZXNvdXJjZSBpbiBhIENvbWJvQm94CitpbXBvcnRfaW5zZXJ0X2dyb3VwPUxcdTAwRTRnZ1wgdGlsbFwgZ3J1cHBcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIHR5cGVzIG9mIGZpbGVzIGFjY2VwdGVkIGZvciB0aGlzIGltcG9ydCB0eXBlCitpbXBvcnRfamF2YV9maWxlX2Rlc2NyaXB0aW9uPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgQmFzXCBrbGFzc2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBkaWFsb2cgcHJvbXB0aW5nIGZvciBpbXBvcnQgZnJvbSBqYXZhIGNsYXNzZXMKK2ltcG9ydF9qYXZhX3RpdGxlPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgS2xhc3NcIGltcG9ydGVyaW5nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGluZGljYXRpbmcgc2VjdGlvbiBjb250YWluaW5nIHVzZXIgb3B0aW9ucworaW1wb3J0X29wdGlvbnM9SW1wb3J0ZXJpbmdzaW5zdFx1MDBFNGxsbmluZ2FyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBmaWxlIGNob29zZXIgZm9yIHNlbGVjdGlvbiBvZiByZXNvdXJjZSBidW5kbGVzIHN0b3JlZCBpbiAucHJvcGVydGllcyBmaWxlcworaW1wb3J0X3Byb3BlcnRpZXNfZmlsZV9kZXNjcmlwdGlvbj1SZXN1cnNidW50XCBiYXNrbGFzc2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gcHJvcGVydGllcyBmaWxlcyAoY3JlYXRlZCBvciBub3QgYnkgUkJNYW5hZ2VyKQoraW1wb3J0X3Byb3BlcnRpZXNfdGl0bGU9UmVzdXJzYnVudFwgaW5zdFx1MDBFNGxsbmluZ3NpbXBvcnRlcmluZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezF9IEVuY29kaW5nIG9mIHRoZSByZXNvdXJjZSB2YWx1ZSB3aXRoIGEgY29uZmxpY3QKKyMgQHswfSBUaGUga2V5IHZhbHVlIG9mIHRoZSByZXNvdXJjZSBpbiBjb25mbGljdAorIyBAY29tbWVudCBUaGlzIGlzIGEgd2FybmluZyBhbmQgaW5zdHJ1Y3Rpb24gZm9yIHdoZW4gYSByZXNvdXJjZSBjb25mbGljdCBvY2N1cnMgZHVyaW5nIGFuIGltcG9ydAoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZT1OeWNrZWxuXCB7MH1cIGZpbm5zXCByZWRhblwgaVwgezF9XCByZXN1cnNidW50LlwgVlx1MDBFNGxqXCBldHRcIGFsdGVybmF0aXZcIGZcdTAwRjZyXCBhdHRcIGxcdTAwRjZzYVwgcHJvYmxlbWV0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIGl0ZW0KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlIGFjY29yZGluZyB0byB0aGUgaW1wb3J0IGZpbGUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2Vfc291cmNlPUltcG9ydFx1MDBGNnZlcnNcdTAwRTR0dG5pbmdcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIHRyYW5zbGF0aW9uIHZhbHVlIG9mIHRoZSByZXNvdXJjZSBpdGVtCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIHRyYW5zbGF0aW9uIHZhbHVlIGhlbGQgYnkgdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUgZHVyaW5nIGEgdHJhbnNsYXRpb24gcmVzb3VyY2UgY29uZmxpY3QKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2VfdGFyZ2V0PVJlc3Vyc2J1bnRcIFx1MDBGNnZlcnNcdTAwRTR0dG5pbmdcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIHJlc291cmNlIGNvbmZsaWN0cyBieSBpZ25vcmluZyBpbXBvcnQgdmFsdWUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9pZ25vcmU9SWdub3JlcmFcIGtvbmZsaXRlblwgb2NoXCBsXHUwMEU0bW5hXCBvcmlnaW5hbHJlc3Vyc2VuXCBvXHUwMEU0bmRyYWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgY29uZmxpY3RzIGJ5IHVzaW5nIHRoZSBpbXBvcnQgdmFsdWUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9vdmVyd3JpdGU9U2tyaXZcIFx1MDBGNnZlclwgcmVzdXJzZW5cIG1lZFwgdlx1MDBFNHJkZW5cIGZyXHUwMEU1blwgaW1wb3J0ZXJhZFwgZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGxpc3Rpbmcgb3B0aW9ucyBmb3IgcmVzb2x2aW5nIGNvbmZsaWN0cyBiZXR3ZWVuIHJlc291cmNlcworaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0cz1SZXN1cnNcIGtvbmZsaWt0ZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgc291cmNlIGZpbGUgZm9yIHRoZSBpbXBvcnQKK2ltcG9ydF9zb3VyY2VfZmlsZT1LXHUwMEU0bGxmaWxcOlwgezB9CisKKyMKKyMgQGdyb3VwIE1lbnUgSXRlbXMKKyMKKyMgQGdyb3VwQ29tbWVudCBUaGVzZSByZXNvdXJjZXMgcmVwcmVzZW50IGFsbCBvZiB0aGUgbWVudSBhbmQgbWVudSBpdGVtIHRpdGxlcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBtZW51IHRpdGxlIGNvdmVyaW5nIGNvcHlpbmcsIHBhc3RpbmcsIGRlbGV0aW5nIG9mIGl0ZW1zCittZW51X2VkaXQ9RWRpdGVyYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jb3B5PUtvcGllcmEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY29weV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY3V0PVRhXCBib3J0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2N1dF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfZGVsZXRlPVJhZGVyYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9kZWxldGVfdHJpZ2dlcj1kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X3Bhc3RlPUtsaXN0cmFcIGluCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X3Bhc3RlX3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9lZGl0JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2VkaXRfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIHRoZSBvcGVuaW5nLCBzYXZpbmcsIGV0Yy4gZG9jdW1lbnRzIGFuZCBleGl0aW5nIHRoZSBwcm9ncmFtCittZW51X2ZpbGU9RmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFiaWxpdHkgdG8gZXhwb3J0IHJlc291cmNlIGJ1bmRsZXMgaW4gYSB2YXJpZXR5IG9mIGZvcm1hdHMKK21lbnVfZmlsZV9leHBvcnQ9RXhwb3J0ZXJhXCByZXN1cnNidW50CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMi0wNS0xNyBAbW9kaWZpZWQgMjAwMi0wNS0xNyBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IEFibGl0eSB0byBleHBvcnQgdG8gSUNVIFJlc291cmNlIEJ1bmRsZSBmaWxlcworbWVudV9maWxlX2V4cG9ydF9JQ1U9SUNVXCBGaWxlci4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDItMDUtMTcgQG1vZGlmaWVkIDIwMDItMDUtMTcgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfSUNVX3RyaWdnZXI9aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmxpdHkgdG8gZXhwb3J0IHRvIFRNWCBYTUwgZmlsZXMKK21lbnVfZmlsZV9leHBvcnRfVE1YPVRNWFwgRmlsZXIuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X1RNWF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgeAorbWVudV9maWxlX2V4cG9ydF9YTEY9WExJRkZcIEZpbGVyLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9YTEZfdHJpZ2dlcj14CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFiaWxpdHkgdG8gZXhwb3J0IHRvIGphdmEgZmlsZXMgdGhhdCBjb21waWxlIHRvIGJlIExpc3RSZXNvdXJjZUJ1bmRsZSBjbGFzcyBleHRlbnNpb25zCittZW51X2ZpbGVfZXhwb3J0X2phdmE9S29tcGF0aWJsYVwgSmF2YVwgZmlsZXIuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X2phdmFfdHJpZ2dlcj1qCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEV4cG9ydCBhYmlsaXR5IHRvIHByb3BlcnRpZXMgZmlsZXMgbWludXMgdGhlIG1ldGFkYXRhCittZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXM9TWluaW1hbFwgaW5zdFx1MDBFNGxsbmluZ3NmaWwuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXNfdHJpZ2dlcj1zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF90cmlnZ2VyPXgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBpbXBvcnQgYW5kIG1lcmdpbmcgYW5vdGhlciByZXNvdXJjZSBmaWxlIHdpdGggdGhlIGJ1bmRsZSBiZWluZyB3b3JrZWQgd2l0aAorbWVudV9maWxlX2ltcG9ydD1JbXBvcnRlcmFcIHJlc3Vyc2dydXBwXCBmcmFuXCBmaWwuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFibGlpdHkgZnJvbSBYTUwgVE1YIGRvY3VtZW50cworbWVudV9maWxlX2ltcG9ydF9UTVg9VE1YXCBkb2N1bWVudC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfVE1YX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIFhNTCBYTElGRiAoLnhsZikgZmlsZXMKK21lbnVfZmlsZV9pbXBvcnRfWExGPVhMSUZGXCBkb2N1bWVudC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBYCittZW51X2ZpbGVfaW1wb3J0X1hMRl90cmlnZ2VyPXgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBqYXZhIGNsYXNzZXMgKExpc3RSZXNvdXJjZUJ1bmRsZSkKK21lbnVfZmlsZV9pbXBvcnRfamF2YT1MaXN0UmVzb3VyY2VCdW5kbGVcIEphdmFcIEtsYXNzZXIuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X2phdmFfdHJpZ2dlcj1qCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEltcG9ydCBhYmlsaXR5IGZyb20gcHJvcGVydGllcyBmaWxlcyBub3QgZ2VuZXJhdGVkIGJ5IFJCTWFuYWdlcgorbWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzPUVua2VsXCByZXN1cnNidW50Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9UworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfdHJpZ2dlcj1tCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlCittZW51X2ZpbGVfbmV3PU55XCByZXN1cnNncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9uZXdfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3Igb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZQorbWVudV9maWxlX29wZW49T3BwbmFcIHJlc3Vyc2dydXBwLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX29wZW5fdHJpZ2dlcj1vCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgY2xvc2luZyB0aGUgYXBwbGljYXRpb24KK21lbnVfZmlsZV9xdWl0PUF2c2x1dGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfcXVpdF90cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBzYXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZSBiZWluZyB3b3JrZWQgd2l0aAorbWVudV9maWxlX3NhdmU9U3BhcmFcIHJlc3Vyc2dydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX3NhdmVfdHJpZ2dlcj1zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3Igc2F2aW5nIGEgcmVzb3VyY2UgYnVuZGxlIHRvIGEgcGFydGljdWxhciBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lCittZW51X2ZpbGVfc2F2ZWFzPVNwYXJhXCByZXN1cnNncnVwcFwgc29tLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX3NhdmVhc190cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfZmlsZScgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9maWxlX3RyaWdnZXI9ZgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciBoZWxwIGluZm9ybWF0aW9uIGFuZCBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmFtCittZW51X2hlbHA9SGphbHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgTWVudSBpdGVtIHdoaWNoIGJyaW5ncyB1cCBhIGRpYWxvZyBkZXNjcmliaW5nIHRoZSBhcHBsaWNhdGlvbgorbWVudV9oZWxwX2Fib3V0PU9tXCBSQk1hbmFnZXIuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2hlbHBfYWJvdXRfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X2hlbHAnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfaGVscF90cmlnZ2VyPWgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3Igb3B0aW9ucyBzdWNoIGFzIGNyZWF0aW5nIG5ldyByZXNvdXJjZXMsIGdyb3VwcywgYW5kIHJlc291cmNlIGZpbGVzCittZW51X29wdGlvbnM9SW5zdGFsbG5pbmdhcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGl0ZW0KK21lbnVfb3B0aW9uc19hZGRlbnRyeT1Ta2FwYVwgbnlcIG92ZXJzYXR0bmluZy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRlbnRyeV90cmlnZ2VyPWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBmaWxlIGZvciBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UvY291bnRyeS92YXJpYW50CittZW51X29wdGlvbnNfYWRkZmlsZT1Ta2FwYVwgbnlcIHJlc3Vyc2ZpbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRmaWxlX3RyaWdnZXI9ZgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCittZW51X29wdGlvbnNfYWRkZ3JvdXA9U2thcGFcIG55XCBncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRncm91cF90cmlnZ2VyPWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgZWRpdGluZyB0aGUgdXNlcidzIHByZWZlcmVuY2VzIGZvciB0aGUgYXBwbGljYXRpb24KK21lbnVfb3B0aW9uc19wcmVmZXJlbmNlcz1QZXJzb25saWdhXCBpbnN0YWxsbmluZ2FyLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19wcmVmZXJlbmNlc190cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSB0aGF0IG1ha2VzIHZpc2libGUgdGhlIHByb2plY3Qgdmlld2VyCittZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXI9T3BlblwgUHJvamVjdFwgVmlld2VyCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19wcm9qZWN0X3ZpZXdlcl90cmlnZ2VyPXYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfb3B0aW9ucycgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9vcHRpb25zX3RyaWdnZXI9aQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBhZGRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlIHRvIHRoZSBwcm9qZWN0CittZW51X3RyZWVfYWRkX3Byb2plY3RfYnVuZGxlPUFkZFwgUmVzb3VyY2VcIEJ1bmRsZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGRlbGV0aW5nIHBlcm1hbmVudGx5IGEgcmVzb3VyY2UgZmlsZQorbWVudV90cmVlX2RlbGV0ZT1UYVwgYm9ydFwgcmVzdXJzXCBmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciByZW1vdmluZyBhIHNwZWNpZmljIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgdHJlZSB2aWV3IG9mIHRoZSByZXNvdXJjZSBidW5kbGUKK21lbnVfdHJlZV9oaWRlPUdcdTAwRjZtXCByZXN1cnNcIGZpbAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBjcmVhdGluZyBhIG5ldyBwcm9qZWN0CittZW51X3RyZWVfbmV3X3Byb2plY3Q9TmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0Li4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorbWVudV90cmVlX29wZW5fcHJvamVjdD1PcGVuXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0Li4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB0cmVlCittZW51X3RyZWVfcmVtb3ZlX3Byb2plY3RfYnVuZGxlPVJlbW92ZVwgZnJvbVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIHNhdmluZyBhIHNwZWNpZmljIHJlc291cmNlIGJ1bmRsZSBmaWxlCittZW51X3RyZWVfc2F2ZT1TcGFyYVwgcmVzdXJzXCBmaWwKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igc2F2aW5nIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlIHByb2plY3QgZmlsZSwgbm90IHRoZSByZXNvdXJjZSBidW5kbGVzIHRoZW1zZWx2ZXMgd2l0aGluIHRoZSBwcm9qZWN0CittZW51X3RyZWVfc2F2ZV9wcm9qZWN0PVNhdmVcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3RcIEZpbGUuLi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgZm9yIHNlbGVjdGluZyBhIHJlc291cmNlIGJ1bmRsZSBmcm9tIHRoZSBwcm9qZWN0IHRyZWUgdG8gYmUgZWRpdGVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgdHJlZQorbWVudV90cmVlX3NlbGVjdF9wcm9qZWN0X2J1bmRsZT1Xb3JrXCB3aXRoXCB0aGlzXCBSZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIGNoYW5naW5nIHRoZSBkaXNwbGF5IGJlaW5nIHNlZW4gYnkgdGhlIHVzZXIKK21lbnVfdmlldz1WaXNhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgaXRlbSB0aGF0IHRha2VzIHlvdSBkaXJlY3RseSB0byB0aGUgc3RhdGlzdGljcyBwYW5lbCBmb3IgdGhlIGVudGlyZSBidW5kbGUKK21lbnVfdmlld19zdGF0aXN0aWNzPVN0YXRpc3Rpa1wgZm9yXCByZXN1cnNncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfdmlld19zdGF0aXN0aWNzX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV92aWV3JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X3ZpZXdfdHJpZ2dlcj12CisKKyMKKyMgQGdyb3VwIFByb2plY3QgUGFuZWwKKyMKKyMgQGdyb3VwQ29tbWVudCBQYW5lbCBhc3NvY2lhdGVkIHdpdGggUHJvamVjdCBlZGl0aW5nCisKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorIyBAY29tbWVudCBMYWJlbCBpbmRpY2F0b3IgYXNzb2NpYXRpbmcgYSB0ZXh0IGJveCBjb250YWluaW5nIGEgdHJhbnNsYXRpb24gd2l0aCB0aGUgcmVzb3VyY2UgYnVuZGxlIHRoZSB0cmFuc2xhdGlvbiBjb21lcyBmcm9tCitwcm9qZWN0X3BhbmVsX2J1bmRsZT1SZXNvdXJjZVwgQnVuZGxlXDpcIHswfQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBOYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUKKyMgQGNvbW1lbnQgU3BlY2lhbCBpbmRpY2F0b3Igb2YgdGhlIHJlc291cmNlIGl0ZW0gcmVzb3VyY2UgYnVuZGxlIHdoZW4gdGhlIGl0ZW0gaXMgdW50cmFuc2xhdGVkCitwcm9qZWN0X3BhbmVsX2J1bmRsZV91bnRyYW5zbGF0ZWQ9UmVzb3VyY2VcIEJ1bmRsZVw6XCB7MH1cIChVbnRyYW5zbGF0ZWQpCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBMYWJlbCB0ZXh0IG1hcmtpbmcgdGhlIGxpbmUgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgYSByZXNvdXJjZSBjb21tZW50Citwcm9qZWN0X3BhbmVsX2NvbW1lbnQ9QmFzZVwgQ2xhc3NcIFJlc291cmNlXCBDb21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IExhYmVsIHRleHQgZm9yIGEgY29tbWVudCB3aGVuIG5vbmUgaXMgZm91bmQgZm9yIGEgcmVzb3VyY2UKK3Byb2plY3RfcGFuZWxfY29tbWVudF9ub25lPU5vXCBjb21tZW50XCBzdXBwbGllZAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIHNob3duIG9uIHRoZSBwcm9qZWN0IHBhbmVsIGZvciBjb21taXR0aW5nIGNoYW5nZSB0byBvbmUgcmVzb3VyY2Ugb25seQorcHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uPUNvbW1pdFwgQ2hhbmdlCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgb24gdGhlIHByb2plY3QgcGFuZWwgZm9yIHNhdmluZyBhbGwgb2YgdGhlIHJlc291cmNlcyBkaXNwbGF5ZWQuIFRoaXMgbWVhbnMgbXVsdGlwbGUgcmVzb3VyY2UgZmlsZXMgZ2V0IHNhdmVkLgorcHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uX2FsbD1Db21taXRcIEFsbFwgUmVzb3VyY2VcIENoYW5nZXMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERlZmF1bHQgdGl0bGUgc2hvd24gb24gdGhlIHByb2plY3QgcGFuZWwgd2hlbiBubyBwYXJ0aWN1bGFyIHJlc291cmNlIGhhcyBiZWVuIHNlbGVjdGVkCitwcm9qZWN0X3BhbmVsX2RlZmF1bHRfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmcKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRleHQgZmllbGQgbWFya2VyIGZvciB0aGUgdHJhbnNsYXRpb24gb2YgYSByZXNvdXJjZSB3aGVuIHRoYXQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBlbmNvZGluZyBmaWxlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aAorcHJvamVjdF9wYW5lbF9pdGVtX2luaGVyaXRzPTxOb1wgVHJhbnNsYXRpb25cOlwgUmVzb3VyY2VcIEluaGVyaXRzXCBmcm9tXCBwYXJlbnQ+CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBrZXkgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlCisjIEBjb21tZW50IFRpdGxlIG9uIHRoZSBwcm9qZWN0IHBhbmVsIHdoaWxlIGEgcmVzb3VyY2UgaXMgc2VsZWN0ZWQKK3Byb2plY3RfcGFuZWxfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmdcOlwgezB9CisKKyMKKyMgQGdyb3VwIFJCUmVwb3J0ZXIKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgZm9yIHRoZSBSQlJlcG9ydGVyIGFwcGxpY2F0aW9uCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3Igc2VsZWN0aW5nIGZpbGUgbG9jYXRpb25zIGZvciBpbnB1dC9vdXRwdXQKK3JlcG9ydGVyX2J1dHRvbl9jaG9vc2U9Vlx1MDBFNGxqLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gaW5kaWNhdGluZyB0aGUgcmVwb3J0IGdlbmVyYXRpb24gc2hvdWxkIG9jY3VyIGltbWVkaWF0ZWx5CityZXBvcnRlcl9idXR0b25fbm93PVVwZGF0ZXJhXCBudS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMjkgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIHNhdmluZyB0aGUgY3VycmVudCBzZXR0aW5ncyBhcyBkZWZhdWx0CityZXBvcnRlcl9idXR0b25fc2F2ZV9kZWZhdWx0cz1TcGFyYVwgaW5zdFx1MDBFNGxsbmluZ2FyXCBzb21cIHNrXHUwMEY2bnN2XHUwMEU0cmRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRvIGFjdGl2YXRlIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfYnV0dG9uX3N0YXJ0PVN0YXJ0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRvIGRlYWN0aXZlIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfYnV0dG9uX3N0b3A9U3RvcHBhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBMZXZlbCBvZiBkZXRhaWw6IG1vc3QgaW5mb3JtYXRpb24gYXZhaWxhYmxlCityZXBvcnRlcl9kZXRhaWxfaGlnaD1IXHUwMEY2ZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiBhIHNlbGVjdGlvbiBvcHRpb24gb2YgdGhlIGxldmVsIG9mIGRldGFpbCBpbiByZXBvcnRpbmcKK3JlcG9ydGVyX2RldGFpbF9sZXZlbD1EZXRhbGpuaXZcdTAwRTVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgTGV2ZWwgb2YgZGV0YWlsOiBzdGFuZGFyZAorcmVwb3J0ZXJfZGV0YWlsX25vcm1hbD1Ob3JtYWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFuIG91dHB1dCBmb3JtYXQ6IEhUTUwKK3JlcG9ydGVyX2Zvcm1hdF9odG1sPUhUTUwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0IHR5cGU6IHBsYWluIHRleHQKK3JlcG9ydGVyX2Zvcm1hdF90ZXh0PVRleHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0OiBYTUwKK3JlcG9ydGVyX2Zvcm1hdF94bWw9WE1MCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIGZpbGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0byByZXBvcnQgb24KK3JlcG9ydGVyX2lucHV0X2J1bmRsZT1SZXN1cnNidW50XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gdGhhdCByZXBvcnRpbmcgd2lsbCBoYXBwZW4gYXQgYSBzcGVjaWlmaWVkIHRpbWUgb2YgZGF5LiBGb2xsb3dlZCBieSBhIHRpbWUgYW5kIGRheSBvcHRpb24uCityZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkPVJhcHBvcnRlcmFcIHZpZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGV4dCBpbmRpY2F0aW9uIG9mIHNlcXVlbnRpYWwgcmVwb3J0aW5nIHBhdXNlZCBmb3IgYSBkZWZpbmVkIGludGVydmFsIGJldHdlZW4gcmVwb3J0aW5nLiBJbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG51bWJlciBhbmQgYSB1bml0IG9mIG1lYXN1cmUgb2YgdGltZQorcmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbD1SYXBvcnRlcmFcIHZhcmplCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IERhdGUvVGltZSBvZiBsYXN0IHJlcG9ydCBnZW5lcmF0aW9uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIHRpbWUgb2YgdGhlIGxhc3QgcmVwb3J0CityZXBvcnRlcl9sYXN0X3JlcG9ydD1TZW5hc3RlXCByYXBwb3J0XDpcIHswCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IERhdGUvVGltZSBvZiBuZXh0IHJlcG9ydAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHdoZW4gdGhlIG5leHQgcmVwb3J0IHdpbGwgYmUgZ2VuZXJhdGVkCityZXBvcnRlcl9uZXh0X3JlcG9ydD1OXHUwMEU0c3RhXCByYXBwb3J0XDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgb3V0cHV0IGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSByZXBvcnRzIGFyZSBwbGFjZWQKK3JlcG9ydGVyX291dHB1dF9kaXJlY3Rvcnk9VXRmb2xkZXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQgZm9ybWF0CityZXBvcnRlcl9vdXRwdXRfZmlsZT1GaWxuYW1uXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGZvciBzZXR0aW5nIGludGVydmFsIG9mIHJlcG9ydGluZworcmVwb3J0ZXJfcGFuZWxfaW50ZXJ2YWw9UmFwcG9ydGludGVydmFsbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIGNvbmZpZ3VyYWJsZSBvcHRpb25zIG9mIHRoZSByZXBvcnRpbmcKK3JlcG9ydGVyX3BhbmVsX29wdGlvbnM9UmFwcG9ydFwgaW5zdFx1MDBFNGxsbmluZ2FyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTdWJwYW5lbCB0aXRsZSBmb3IgY2hvb3Npbmcgb3V0cHV0IGZvcm1hdHMgZm9yIHRoZSByZXBvcnRzCityZXBvcnRlcl9wYW5lbF9vdXRwdXRfZm9ybWF0PVV0Zm9ybWF0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3IgaW5kaWNhdGlvbiBvZiBydW5uaW5nIHN0YXR1cyBvZiB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX3BhbmVsX3N0YXR1cz1TdGF0dXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU2hvcnQgdGl0bGUgZm9yIHNlbGVjdGluZyBhIGNvZGUgc2NhbiBjb25maWd1cmF0aW9uIGZpbGUKK3JlcG9ydGVyX3BlcmZvcm1fc2Nhbj1Lb2RhXCBmaWxlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUXVpY2sgaW5kaWNhdGlvbiB0aGF0IHRoZSByZXBvcnRlciBpcyBhY3RpdmUgKHBlcmhhcHMgd2FpdGluZykKK3JlcG9ydGVyX3N0YXR1c19ydW5uaW5nPVN0YXJ0YWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFF1aWNrIHN0YXR1cyBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlcG9ydGVyIGlzIG5vdCBhY3RpdmUKK3JlcG9ydGVyX3N0YXR1c19zdG9wcGVkPVN0b3BwYWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGRheXMgb3B0aW9uCityZXBvcnRlcl90aW1lX2RheXM9RGFnYXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGV2ZXJ5IGRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZXZlcnlkYXk9VmFyamVcIGRhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZnJpZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9mcmlkYXk9RnJlZGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBob3VycyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfaG91cnM9VGltbWFyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBtaW51dGVzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9taW51dGVzPU1pbnV0ZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IG1vbmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfbW9uZGF5PU1cdTAwRTVuZGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBzYXR1cmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfc2F0dXJkYXk9TFx1MDBGNnJkYWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHN1bmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfc3VuZGF5PVNcdTAwRjZuZGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCB0aHVyc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfdGh1cnNkYXk9VG9yc2RhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgdHVlc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfdHVlc2RheT1UaXNkYWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHdlZG5lc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfd2VkbmVzZGF5PU9uc2RhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgb2YgdGhlIGFwcGxpY2F0aW9uCityZXNvdXJjZV9idW5kbGVfcmVwb3J0ZXI9UkJSZXBvcnRlcgorCisjCisjIEBncm91cCBTZWFyY2ggYW5kIFJlcGxhY2UKKyMKKyMgQGdyb3VwQ29tbWVudCBSZXNvdXJjZXMgZm91bmQgb24gdGhlIHNlYXJjaCB0YWIgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyYWwgc2VhcmNoIHRpdGxlCitzZWFyY2g9TGV0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBtYWtpbmcgdGhlIHNlYXJjaCBjYXNlIHNlbnNpdGl2ZSBvciBub3QKK3NlYXJjaF9jYXNlX3NlbnNpdGl2ZT1Cb2tzdGF2c2tcdTAwRTRuc2xpZ1wgc1x1MDBGNmtuaW5nXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3Igc2VhcmNoaW5nIHRocm91Z2ggcmVzb3VyY2UgY29tbWVudHMKK3NlYXJjaF9jb21tZW50cz1Lb21tZW50YXJlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IHRvIHNlYXJjaCBvbgorc2VhcmNoX2ZpbmQ9SGl0dGFcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggc2VsZWN0aW9uIGZvciBzZWFyY2hpbmcgb3B0aW9uIHRocm91Z2ggcmVzb3VyY2Uga2V5cworc2VhcmNoX2tleXM9UmVzdXJzbnlja2xhcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IGZvciByZXBsYWNpbmcgdGhlIGZvdW5kIHZhbHVlCitzZWFyY2hfcmVwbGFjZT1FcnNcdTAwRTR0dFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBvcHRpb24gZm9yIHNlYXJjaGluZyB0aHJvdWdoIHRyYW5zbGF0aW9uIHZhbHVlcworc2VhcmNoX3ZhbHVlcz1cdTAwRDZ2ZXJzXHUwMEU0dHRuaW5nYXIKKworIworIyBAZ3JvdXAgVGFicworIworIyBAZ3JvdXBDb21tZW50IEdVSSBUYWJzIGluIHRoZSBtYWluIHBhbmVsCisKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdVSSBUYWIgZm9yIFRhYmJlZCBQYW5lIG92ZXIgdGhlIHRyZWUgc2hvd2luZyBhIHNpbmdsZSByZXNvdXJjZSBidW5kbGUgYW5kIGl0cyB2YXJpb3VzIGZpbGVzCit0YWJfYnVuZGxlPUJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGFiIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgdmFyaW91cyBncm91cHMgaW4gdGhlIGJ1bmRsZQordGFiX2dyb3Vwcz1HcnVwcGVyCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHVUkgVGFiIGZvciB0YWIgb3ZlciB0cmVlIHNob3dpbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAordGFiX3Byb2plY3Q9UHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGFuZSBhbGxvd2luZyBmb3Igc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9ucwordGFiX3NlYXJjaD1MZXRhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUYWIgZm9yIHN0YXRpc3RpY3MgZGlzcGxheSBmb3IgZWl0aGVyIHRoZSBSZXNvdXJjZSBCdW5kbGUgYXMgYSB3aG9sZSBvciBwYXJ0aWN1bGFyIGxhbmd1YWdlIGZpbGVzCit0YWJfc3RhdGlzdGljcz1TdGF0aXN0aWsKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRhYiBmb3IgZGlzcGxheSBvZiB1bnRyYW5zbGF0ZWQgaXRlbXMgaW4gdGhlIGRpZmZlcmVudCBsYW5ndWFnZSBmaWxlcwordGFiX3VudHJhbnNsYXRlZD1Pb3ZlcnNhdHQKKworIworIyBAZ3JvdXAgVHJhbnNsYXRpb24gRmlsZSBHcm91cHMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IAorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBDb2x1bW4gdGl0bGUgZm9yIGl0ZW0gY29tbWVudHMKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX2NvbW1lbnQ9S29tbWVudGFyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBDb2x1bW4gdGl0bGUgZm9yIGl0ZW0ncyByZXNvdXJjZSBrZXkKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX2tleT1SZXN1cnNueWNrZWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorbGFuZ3VhZ2Vncm91cF9jb2x1bW5fdHJhbnNsYXRpb249T3ZlcnNhdHRuaW5nCisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgU3RhdGlzdGljcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGluIHRoZSBsYW5ndWFnZSBmaWxlIHN0YXRpc3RpY3MgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBBIGNvbW1lbnQgZ2l2ZW4gdG8gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfY29tbWVudD1Lb21tZW50YXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIGNvdW50cnkgYmVpbmcgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2NvdW50cnk9TGFuZFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBpbiB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19pdGVtX2NvdW50PUFudGFsXCByZXN1cnNlclwgaVwgZGVuXCBoYXJcIGZpbGVuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBsYW5ndWFnZSBkZXNjcmliZWQgYnkgdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfbGFuZ3VhZ2U9U3ByYWtcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIG5hbWUgb2YgYSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoZSB0cmFuc2xhdGlvbnMgaW4gdGhpcyBsYW5ndWFnZSBmaWxlCitsYW5ndWFnZXN0YXRzX21hbmFnZXI9UmVzdXJzZmlsXCBhZ2FyZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgbmFtZSBnaXZlbiB0byB0aGUgbGFuZ3VhZ2UgZmlsZQorbGFuZ3VhZ2VzdGF0c190aXRsZT1SZXN1cnNcIHRpdGVsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE51bWJlciBvZiByZXNvdXJjZXMgbmVlZGluZyB0cmFuc2xhdGlvbiBpbiB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c190cmFuc2xhdGlvbl9jb3VudD1BbnRhbFwgb292ZXJzYXR0YVwgcmVzdXJzc2FrZXJcIGlcIGRlblwgaGFyXCBmaWxlblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgbGFuZ3VhZ2UvcmVnaW9uIHZhcmlhbnQgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX3ZhcmlhbnQ9VmFyaWFudFwgXDoKKworIworIyBAZ3JvdXAgVHJhbnNsYXRpb24gRmlsZSBVbnRyYW5zbGF0ZWQgSXRlbXMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IAorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgY29sdW1uIHRpdGxlIGZvciBncm91cCBuYW1lcyBvZiBpdGVtcyBpbiB0aGUgcm93cworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9ncm91cD1HcnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIGtleSBvZiB0aGUgaXRlbSBhIHJvdworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9rZXk9UmVzdXJzbnlja2VsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiBhbiBpdGVtIGluIGEgcm93CitsYW5ndWFnZXVudHJhbnNfY29sdW1uX3RyYW5zbGF0aW9uPU92ZXJzYXR0bmluZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBjb3ZlcmluZyBidXR0b25zIHRoYXQgYXBwbHkgdG8gYSBzZWxlY3RlZCByZXNvdXJjZSBmcm9tIGEgdGFibGUgb2YgcmVzb3VyY2VzCitsYW5ndWFnZXVudHJhbnNfc2VsZWN0ZWRfcmVzb3VyY2VzX29wdGlvbnM9SW5zdFx1MDBFNGxsbmluZ2FyXCBmXHUwMEY2clwgdmFsZFwgcmVzdXJzCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL3ByZWZlcmVuY2VzLnByb3BlcnRpZXMgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL3ByZWZlcmVuY2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkNzQyYQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvcHJlZmVyZW5jZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDMzIEBACisjUkJNYW5hZ2VyIFByZWZlcmVuY2VzCisjV2VkIERlYyAxOSAxNDowODo1NSBQU1QgMjAwMQorcmVwb3J0ZXJfZm9ybWF0X2h0bWxfZmlsZT1yZXBvcnQuaHRtbAordXNlcm5hbWU9VW5rbm93bgorcmVwb3J0ZXJfZm9ybWF0X3RleHRfZGV0YWlsPUhpZ2gKK3JlcG9ydGVyX2Zvcm1hdF94bWxfZGV0YWlsPUhpZ2gKK3JlcG9ydGVyX2Zvcm1hdF9obXRsX2VuYWJsZWQ9WWVzCityZXBvcnRlcl9lbmFibGVkPVllcworcmVwb3J0ZXJfZm9ybWF0X3htbF9maWxlPXJlcG9ydC54bWwKK3JlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfaG91cj0xCityZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsX3ZhbHVlPTEKK3JlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdW5pdHM9SG91cnMKK3JlcG9ydGVyX3BlcmZvcm1fc2Nhbj1ZZXMKK3JlcG9ydGVyX2Zvcm1hdF90ZXh0X2ZpbGU9cmVwb3J0LnR4dAorcmVwb3J0ZXJfZm9ybWF0X3htbF9lbmFibGVkPVllcworcmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9kYXk9U2F0dXJkYXkKK2xvY2FsZT1lbgorcmVwb3J0ZXJfaW50ZXJ2YWw9U2VxdWVudGlhbAorcmVjZW50ZmlsZWxvYzM9CityZWNlbnRmaWxlbG9jMj0KK3JlY2VudGZpbGVsb2MxPQorcmVjZW50ZmlsZWxvYzA9CityZXBvcnRlcl9zY2FuX2ZpbGU9Li9yYm1hbmFnZXJfc2Nhbm5lci54bWwKK3JlcG9ydGVyX2Zvcm1hdF9odG1sX2VuYWJsZWQ9WWVzCityZWNlbnRmaWxlaWQzPQorcmVjZW50ZmlsZWlkMj0KK3JlY2VudGZpbGVpZDE9CityZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX21pbnV0ZT0wMAorcmVjZW50ZmlsZWlkMD0KK3JlcG9ydGVyX2Zvcm1hdF90ZXh0X2VuYWJsZWQ9WWVzCityZXBvcnRlcl9iYXNlX2NsYXNzX2ZpbGU9CityZXBvcnRlcl9vdXRwdXRfZGlyZWN0b3J5PQorcmVwb3J0ZXJfZm9ybWF0X2h0bWxfZGV0YWlsPUhpZ2gKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9saWNlbnNlLmh0bWwgYi91bmljb2RldG9vbHMvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTZlZTAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxodG1sPgorCis8aGVhZD4KKzx0aXRsZT5JQ1U0SiBsaWNlbnNlIC0gSUNVNEogMS4zLjEgYW5kIGxhdGVyPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgQkdDT0xPUj0iI2ZmZmZmZiI+Cis8aDI+SUNVNEogbGljZW5zZSAtIElDVTRKIDEuMy4xIGFuZCBsYXRlcjwvaDI+CisKKzxwPkNPUFlSSUdIVCBBTkQgUEVSTUlTU0lPTiBOT1RJQ0U8L3A+CisKKzxwPgorQ29weXJpZ2h0IChjKSAxOTk1LTIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCis8L3A+Cis8cD4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCis8L3A+Cis8cD4KK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucwordG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSBhbmQgdGhhdCBib3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCis8L3A+Cis8cD4KK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKzwvcD4KKzxwPgorRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKzwvcD4KKworPGhyPgorPHNtYWxsPgorQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCis8L3NtYWxsPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL3JlYWRtZS5odG1sIGIvdW5pY29kZXRvb2xzL3JlYWRtZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NzM0MTMKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvcmVhZG1lLmh0bWwKQEAgLTAsMCArMSw0MDAgQEAKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorPHRpdGxlPklDVSdzIFVuaWNvZGUgVG9vbHMgUmVhZCBNZTwvdGl0bGU+CisgICAgPG1ldGEgbmFtZT0iQ09QWVJJR0hUIiBjb250ZW50PQorICAgICJDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iIC8+Cis8c3R5bGU+Cis8IS0tCitsaSAgICAgICAgICAgeyBtYXJnaW4tdG9wOiAwLjVlbTsgbWFyZ2luLWJvdHRvbTogMC41ZW0gfQorLS0+Cis8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgxPlVuaWNvZGVUb29sczwvaDE+Cis8cD5UaGlzIGZpbGUgcHJvdmlkZXMgaW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyBhbmQgcnVubmluZyB0aGUgVW5pY29kZVRvb2xzLCB3aGljaDxicj4KK2NhbiBiZSB1c2VkIHRvOjwvcD4KKzx1bD4KKyAgPGxpPmJ1aWxkIHRoZSBEZXJpdmVkIFVuaWNvZGUgZmlsZXMgaW4gdGhlIFVDRCAoVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UpLDwvbGk+CisgIDxsaT5idWlsZCB0aGUgdHJhbnNmb3JtZWQgVUNBIChVbmljb2RlIENvbGxhdGlvbiBBbGdvcml0aG0pIGZpbGVzIG5lZWRlZCBieSBJQ1UuPC9saT4KKyAgPGxpPnJ1biBjb25zaXN0ZW5jeSBjaGVja3Mgb24gYmV0YSByZWxlYXNlcyBvZiB0aGUgVUNEIGFuZCB0aGUgVUNBLjwvbGk+CisgIDxsaT5idWlsZCA0IGNoYXJ0IGZvbGRlcnMgb24gdGhlIHVuaWNvZGUgc2l0ZTwvbGk+Cis8L3VsPgorPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxiPldBUk5JTkchITwvYj48L2ZvbnQ+PC9wPgorPHVsPgorICA8bGk+VGhpcyBpcyBOT1QgcHJvZHVjdGlvbiBsZXZlbCBjb2RlLCBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW4gcHJvZ3JhbXMuPC9saT4KKyAgPGxpPlRoZSBBUEkgaXMgc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UsIGFuZCB3aWxsIG5vdCBiZSBtYWludGFpbmVkLjwvbGk+CisgIDxsaT5UaGUgc291cmNlIGlzIHVuY29tbWVudGVkLCBhbmQgaGFzIG1hbnkgd2FydHM7IHNpbmNlIGl0IGlzIG5vdCBwcm9kdWN0aW9uIGNvZGUsIGl0IGhhcyBub3QgCisgIGJlZW4gd29ydGggdGhlIHRpbWUgdG8gY2xlYW4gaXQgdXAuPC9saT4KKyAgPGxpPkl0IHdpbGwgcHJvYmFibHkgbm90IHdvcmsgb24gVW5peCBvciBNYWMgd2l0aG91dCBjaGFuZ2luZyB0aGUgZmlsZSBzZXBhcmF0b3IuPC9saT4KKyAgPGxpPkN1cnJlbnRseSBpdCB1c2VzIGhhcmQtY29kZWQgZGlyZWN0b3J5IG5hbWVzLjwvbGk+CisgIDxsaT5UaGUgY29udGVudHMgb2YgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIFVDRCBtdXN0IGJlIGNvcGllZCB0byBhIGxvY2FsIGRpcmVjdG9yeSwgYXMgZGVzY3JpYmVkIAorICBiZWxvdy48L2xpPgorPC91bD4KKzxoMj5JbnN0cnVjdGlvbnM6PC9oMj4KKzxoMz4wLiBZb3Ugd2lsbCBuZWVkIHRvIGdldCBJQ1U0SiBvbiB5b3VyIHN5c3RlbSwgdXNpbmcgQ1ZTLjwvaDM+Cis8cD5UaGUgcmVzdCBvZiB0aGlzIHdpbGwgYXNzdW1lIHRoYXQgeW91IGhhdmUgc2V0IHVwIENWUyBzbyB0aGF0IHlvdSBsb2FkIHRoZSBJQ1U0SiBwcm9qZWN0IGludG8gCitDOlxJQ1U0Sjxicj4KKzxicj4KK1lvdSBuZWVkIGJvdGggdGhlIG1haW4gaWN1NGogYW5kIGEgc3VicHJvamVjdCBjYWxsZWQgdW5pY29kZXRvb2xzLiBTZWU6Cis8YSBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vc29mdHdhcmUvZ2xvYmFsaXphdGlvbi9pY3UvcmVwb3NpdG9yeS5qc3AiPgoraHR0cDovL3d3dy5pYm0uY29tL3NvZnR3YXJlL2dsb2JhbGl6YXRpb24vaWN1L3JlcG9zaXRvcnkuanNwPC9hPi4gSW5zaWRlIHVuaWNvZGV0b29scywgbG9vayBhdCBjb20vaWJtL3RleHQuIFRoZSAKK21haW4gZGlyZWN0b3JpZXMgb2YgaW50ZXJlc3QgYXJlIFVDRCwgVUNBIGFuZCB1dGlsaXR5LjwvcD4KKzxoND4wYS4gSWYgeW91IGFyZSB1c2luZyBFY2xpcHNlIGZvciB5b3VyIElERSwgbG9vayBhdCB0aGUgaW5zdHJ1Y3Rpb25zIG9uCis8YSBocmVmPSJodHRwOi8vaWN1LnNvdXJjZWZvcmdlLm5ldC9kb2NzL2VjbGlwc2VfaG93dG8vZWNsaXBzZV9ob3d0by5odG1sIj4KK2h0dHA6Ly9pY3Uuc291cmNlZm9yZ2UubmV0L2RvY3MvZWNsaXBzZV9ob3d0by9lY2xpcHNlX2hvd3RvLmh0bWw8L2E+IDwvaDQ+Cis8cD5TZXQgdXAgRWNsaXBzZSB0byBidWlsZCB0d28gcHJvamVjdHM6IElDVTRKIGFuZCBVbmljb2RlVG9vbHM6PGJyPgorPGJyPgorPGI+UHJvamVjdCBOYW1lOiA8L2I+SUNVNEo8YnI+Cis8Yj5EaXJlY3Rvcnk6IDwvYj5DOlxJQ1U0SlxpY3U0ajxicj4KKzxiPkRlZmF1bHQgb3V0cHV0IGZvbGRlciA9IDwvYj5JQ1U0Si9jbGFzc2VzPGJyPgorPGJyPgorPGI+UHJvamVjdCBOYW1lOiA8L2I+dW5pY29kZXRvb2xzPGJyPgorPGI+Q3JlYXRlIHByb2plY3QgZnJvbSBleGlzdGluZyBzb3VyY2U6IDwvYj5DOlxJQ1U0Slx1bmljb2RldG9vbHM8YnI+Cis8Yj5EZWZhdWx0IE91dHB1dCBGb2xkZXI6IDwvYj51bmljb2RldG9vbHMvY2xhc3Nlczxicj4KKzxicj4KK0FmdGVyIEVjbGlwc2UgaXMgc2V0IHVwIHdpdGggdGhlc2UsIGV4Y2x1ZGUgY2VydGFpbiBmaWxlcyBmcm9tIHVuaWNvZGV0b29sczo8YnI+Cis8YnI+CitSaWdodC1DbGljayBVbmljb2RlVG9vbHMgJmd0OyBQcm9wZXJ0aWVzICZndDsgSmF2YSBCdWlsZCBQYXRoICZndDsgRXhjbHVzaW9uczxicj4KK2NvbS9pYm0vcmJtLzxicj4KK2NvbS9pYm0vdGV4dC91dGlsaXR5L1VuaWNvZGVNYXBJbnQuamF2YTxicj4KK2NvbS9pYm0vdGV4dC91dGlsaXR5L1Rlc3RVdGlsaXR5LmphdmE8YnI+Citjb20vaWJtL3RleHQvVUNEL0dlbmVyYXRlVGhhaUJyZWFrcy1vbGQuamF2YS88YnI+Citjb20vaWJtL3RleHQvVUNEL1Byb2Nlc3NVbmloYW4uamF2YS88YnI+Citjb20vaWJtL3RleHQvVUNBL1dyaXRlSFRNTENvbGxhdGlvbi5qYXZhLzxicj4KKzxicj4KK1VuaWNvZGVUb29scyBtdXN0IGFsc28gaW5jbHVkZSB0aGUgSUNVNEogcHJvamVjdCwgd2l0aDxicj4KKzxicj4KK1JpZ2h0LUNsaWNrIFVuaWNvZGVUb29scyAmZ3Q7IFByb3BlcnRpZXMgJmd0OyBKYXZhIEJ1aWxkIFBhdGggJmd0OyBQcm9qZWN0czwvcD4KKzxoMz4xLiBJbiBVQ0QsIHlvdSBtdXN0IGVkaXQgVUNEX1R5cGVzLmphdmEgYXQgdGhlIHRvcCwgdG8gc2V0IHRoZSBkaXJlY3RvcmllcyBmb3IgdGhlIGJ1aWxkOjwvaDM+Cis8cD5wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0RJUiA9ICZxdW90O0M6XFxEQVRBXFwmcXVvdDs7PGJyPgorcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUNEX0RJUiA9IEJBU0VfRElSICsgJnF1b3Q7VUNEXFwmcXVvdDs7PGJyPgorcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklOX0RJUiA9IERBVEFfRElSICsgJnF1b3Q7QklOXFwmcXVvdDs7PGJyPgorcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VOX0RJUiA9IERBVEFfRElSICsgJnF1b3Q7R0VOXFwmcXVvdDs7PGJyPgorPGJyPgorTWFrZSBzdXJlIHRoYXQgZWFjaCBvZiB0aGVzZSBkaXJlY3RvcmllcyBleGlzdC4gQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgZm9sbG93aW5nPGJyPgorZXhpc3Q6PGJyPgorPGJyPgorJmx0O0dFTl9ESVImZ3Q7L0Rlcml2ZWREYXRhPGJyPgorJmx0O0dFTl9ESVImZ3Q7L0Rlcml2ZWREYXRhL0V4dHJhY3RlZFByb3BlcnRpZXM8YnI+CismbHQ7VUNEX0RJUiZndDsvRVhUUkFTLVVwZGF0ZTwvcD4KKzxoMz4yLiBEb3dubG9hZCBhbGwgb2YgdGhlIFVuaWNvZGVEYXRhIGZpbGVzIGZvciBlYWNoIHZlcnNpb24gaW50byBVQ0RfRElSLjwvaDM+Cis8cD5UaGUgZm9sZGVyIG5hbWVzIG11c3QgYmUgb2YgdGhlIGZvcm06ICZxdW90OzMuMi4wLVVwZGF0ZSZxdW90Oywgc28gcmVuYW1lIHRoZSBmb2xkZXJzIG9uIHRoZTxicj4KK1VuaWNvZGUgc2l0ZSB0byB0aGlzIGZvcm1hdC4gSTxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj5mIHRoZSAKK2ZvbGRlciBjb250YWlucyB1Y2QsIHRoZW4gbWFrZSB0aGUgY29udGVudHMgb2YgdGhhdCBkaXJlY3RvcnkgYmUgdGhlIGNvbnRlbnRzIG9mIAordGhlIHgueC54LVVwZGF0ZSBkaXJlY3RvcnkuIFRoYXQgaXMsIGVhY2ggZGlyZWN0b3J5IHdpbGwgZGlyZWN0bHkgY29udGFpbiBmaWxlcyAKK2xpa2UgUHJvcExpc3QuLi4udHh0PC9zcGFuPjwvcD4KKzxoND4yYSBFbnN1cmUgQ29tcGxldGUgUmVsZWFzZTwvaDQ+Cis8cD5JZiB5b3UgYXJlIGRvd25sb2FkaW5nIGFueSAmcXVvdDtpbmNvbXBsZXRlJnF1b3Q7IHJlbGVhc2UgKG9uZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBjb21wbGV0ZSBzZXQgb2YgZGF0YSAKK2ZpbGVzIGZvciB0aGF0IHJlbGVhc2UsIHlvdSBuZWVkIHRvIGFsc28gZG93bmxvYWQgdGhlIHByZXZpb3VzIGNvbXBsZXRlIHJlbGVhc2UpLiBNb3N0IG9mIHRoZSBOLk0tVXBkYXRlIAorZGlyZWN0b3JpZXNzIGFyZSBjb21wbGV0ZSwgKmV4Y2VwdCo6PC9wPgorPHA+NC4wLVVwZGF0ZSwgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhIGNvcHkgb2YgVW5paGFuLnR4dCBhbmQgc29tZSBvdGhlciBmaWxlczxicj4KKzMuMS1VcGRhdGUsIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYSBjb3B5IG9mIEJpZGlNaXJyb3JpbmcudHh0PC9wPgorPHA+QWxzbywgbWFrZSB0aGUgZm9sbG93aW5nIGNoYW5nZXMgdG8gVW5pY29kZURhdGEgZm9yIDEuMS41OjwvcD4KKzxwPjxiPkRlbGV0ZTwvYj48L3A+Cis8cHJlPjM0MDA7SEFOR1VMIFNZTExBQkxFIEtJWUVPSyBBO0xvOzA7TDsxMTAwIDExNjE7Ozs7Tjs7Ozs7CisuLi4KKzRERkY7SEFOR1VMIFNZTExBQkxFIE1JRVVNIFdFTyBSSUVVTC1USElFVVRIO0xvOzA7TDsxMTA2IDExNkYgMTFCNDs7OztOOzs7OzsKKzRFMDA7PGNqayBJREVPR1JBUEggUkVQUkVTRU5UQVRJVkU+O0xvOzA7TDs7Ozs7Tjs7Ozs7PC9wcmU+Cis8cD48Yj5BZGQ6PC9iPjwvcD4KKzxwcmU+NEUwMDs8Y2prIElkZW9ncmFwaCwgRmlyc3Q+O0xvOzA7TDs7Ozs7Tjs7Ozs7Cis5RkE1OzxjamsgSWRlb2dyYXBoLCBMYXN0PjtMbzswO0w7Ozs7O047Ozs7OworRTAwMDs8cHJpdmF0ZSBVc2UsIEZpcnN0PjtDbzswO0w7Ozs7O047Ozs7OworRjhGRjs8cHJpdmF0ZSBVc2UsIExhc3Q+O0NvOzA7TDs7Ozs7Tjs7Ozs7PC9wcmU+Cis8cD48Yj5BbmQgZnJvbSBhIGxhdGUgdmVyc2lvbiBvZiBVbmljb2RlLCBhZGQ6PC9iPjwvcD4KKzxwcmU+RjkwMDtDSksgQ09NUEFUSUJJTElUWSBJREVPR1JBUEgtRjkwMDtMbzswO0w7OEM0ODs7OztOOzs7OzsKKy4uLgorRkEyRDtDSksgQ09NUEFUSUJJTElUWSBJREVPR1JBUEgtRkEyRDtMbzswO0w7OURCNDs7OztOOzs7Ozs8L3ByZT4KKzxoND4yYi4gVUNBIGRhdGE8L2g0PgorPHA+SWYgeW91IGFyZSBidWlsZGluZyBhbnkgb2YgdGhlIFVDQSB0b29scywgeW91IG5lZWQgdG8gZ2V0IGEgY29weSBvZiB0aGUgVUNBIGRhdGEgZmlsZTxicj4KK2Zyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMTAvI0FsbEtleXMuIFRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciB0aGlzIGlzOjxicj4KKzxicj4KK0JBU0VfRElSICsgJnF1b3Q7Q29sbGF0aW9uXGFsbGtleXMmcXVvdDsgKyBWRVJTSU9OICsgJnF1b3Q7LnR4dCZxdW90Oy48YnI+Cis8YnI+CitJZiB5b3UgaGF2ZSBpdCBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbiwgY2hhbmdlIHRoYXQgdmFsdWUgZm9yIEtFWVMgaW4gVUNBLmphdmEsIGFuZCA8YnI+Cit0aGUgdmFsdWUgZm9yIEJBU0VfRElSPC9wPgorPGg0PjJjLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aXRoIGZpbGVzLiBBbGwgb2YgCit0aGUgeWVsbG93IG9uZXMgc2hvdWxkIGV4aXN0PC9oND4KKzxwcmU+QzovL0RBVEEvCisKKyAgICAgICAgQklOLworICAgIAorPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGMDAiPiAgICAgICAgQ29sbGF0aW9uLworICAgICAgICAgICAgYWxsa2V5cy0zLjEuMS50eHQKKzwvc3Bhbj4gICAgICAgIAorICAgICAgICBHRU4vCisgICAgICAgICAgICBEZXJpdmVkRGF0YS8KKzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj4gICAgICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMCI+VUNELworICAgICAgICAgICAgMy4wLjAtVXBkYXRlLworICAgICAgICAgICAgICAgIFVuaWhhbi0zLjIuMC50eHQKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIDMuMC4xLVVwZGF0ZS8KKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIDMuMS4wLVVwZGF0ZS8KKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIDMuMS4xLVVwZGF0ZS8KKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIDMuMi4wLVVwZGF0ZS8KKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIDQuMC4wLVVwZGF0ZS8KKyAgICAgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLTQuMC4wZDE0Yi50eHQKKyAgICAgICAgICAgICAgICBCaWRpTWlycm9yaW5nLTQuMC4wZDFiLnR4dAorICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgRVhUUkFTLVVwZGF0ZS88L3NwYW4+PC9wcmU+Cis8aDM+My4gVmVyc2lvbnM8L2gzPgorPHA+QWxsIG9mIHRoZSBmb2xsb3dpbmcgaGF2ZSAmcXVvdDt2ZXJzaW9uIFgmcXVvdDsgaW4gdGhlIG9wdGlvbnMgeW91IGdpdmUgdG8gSmF2YSAoZWl0aGVyIG9uIHRoZSZuYnNwOyAKK2NvbW1hbmQgbGluZSwgb3IgaW4gdGhlIEVjbGlwc2UgJ3J1bicgb3B0aW9ucy4gSWYgeW91IHdhbnQgYSBzcGVjaWZpYyB2ZXJzaW9uIGxpa2UgMy4xLjAsIHRoZW4geW91IAord291bGQgd3JpdGUgJnF1b3Q7dmVyc2lvbiAzLjEuMSZxdW90Oy4gSWYgeW91IHdhbnQgdGhlIGxhdGVzdCB2ZXJzaW9uICg0LjEuMCksIHlvdSBjYW4gb21pdCB0aGUgJnF1b3Q7dmVyc2lvbiBYJnF1b3Q7LjwvcD4KKzxoMz40LiBCdWlsZGluZyBGaWxlczwvaDM+Cis8b2w+CisJPGxpPjxiPlNldHVwPC9iPjxvbD4KKwkJPGxpPkluIEVjbGlwc2UsIG9wZW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIgKFVzZSBXaW5kb3cmZ3Q7U2hvdyBWaWV3IGlmIHlvdSAKKwkJZG9uJ3Qgc2VlIGl0KTwvbGk+CisJCTxsaT5PcGVuIFVuaWNvZGVUb29sczx1bD4KKwkJCTxsaT5jb20uaWJtLnRleHQuVUNEPHVsPgorCQkJCTxsaT5NYWtlVW5pY29kZUZpbGVzLjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj50eHQ8L3NwYW4+PHA+VGhpcyBmaWxlIGRyaXZlcyB0aGUgcHJvZHVjdGlvbiBvZiAKKwkJCQl0aGUgZGVyaXZlZCBVbmljb2RlIGZpbGVzLiBUaGUgZmlyc3QgdGhyZWUgbGluZXMgY29udGFpbiAKKwkJCQlwYXJhbWV0ZXJzIHRoYXQgeW91IG1heSB3YW50IHRvIG1vZGlmeSBhdCBzb21lIHRpbWVzOjwvcD4KKwkJCQk8cHJlPkdlbmVyYXRlOiA8Yj4uKnNjcmlwdC4qPC9iPiA8aT4vLyB0aGlzIGlzIGEgcmVndWxhciBleHByZXNzaW9uLiBVc2UgLiogZm9yIGFsbCBmaWxlczwvaT4KK0RlbHRhVmVyc2lvbjogPGI+MTA8L2I+IDxpPiAgICAvLyBUaGlzIGdldHMgYXBwZW5kZWQgdG8gdGhlIGZpbGUgbmFtZS4gUGljayAxKyB0aGUgaGlnaGVzdCB2YWx1ZSBpbiBQdWJsaWM8L2k+CitDb3B5cmlnaHRZZWFyOiA8Yj4yMDA2PC9iPiA8aT4gLy8gUGljayB0aGUgY3VycmVudCB5ZWFyPC9pPjwvcHJlPgorCQkJCTwvbGk+CisJCQk8L3VsPgorCQkJPC9saT4KKwkJPC91bD4KKwkJPC9saT4KKwkJPGxpPk9wZW4gaW4gUGFja2FnZSBFeHBsb3JlciAKKwkJPHVsPgorCQkJPGxpPmNvbS5pYm0udGV4dC5VQ0Q8dWw+CisJCQkJPGxpPk1haW48L2xpPgorCQkJPC91bD4KKwkJCTwvbGk+CisJCTwvdWw+CisJCTwvbGk+CisJCTxsaT5SdW4mZ3Q7UnVuIEFzLi4uPG9sPgorCQkJPGxpPkNob29zZSBKYXZhIEFwcGxpY2F0aW9uPHVsPgorCQkJCTxsaT5pdCB3aWxsIGZhaWwsIGRvbid0IHdvcnJ5OyB5b3UgbmVlZCB0byBzZXQgc29tZSBwYXJhbWV0ZXJzLjwvbGk+CisJCQk8L3VsPgorCQkJPC9saT4KKwkJPC9vbD4KKwkJPC9saT4KKwkJPGxpPlJ1biZndDtSdW4uLi48dWw+CisJCQk8bGk+U2VsZWN0IHRoZSBBcmd1bWVudHMgdGFiLCBhbmQgZmlsbCBpbiB0aGUgZm9sbG93aW5nPHVsPgorCQkJCTxsaT5Qcm9ncmFtIGFyZ3VtZW50czo8cHJlPmJ1aWxkIDUuMDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj4uMDwvc3Bhbj4gTWFrZVVuaWNvZGVGaWxlczwvcHJlPgorCQkJCTwvbGk+CisJCQkJPGxpPlZNIGFyZ3VtZW50czogCisJCQkJPHByZT4tWG1zNTEybSAtWG14NTEybTwvcHJlPgorCQkJCTwvbGk+CisJCQk8L3VsPgorCQkJPC9saT4KKwkJCTxsaT5DbG9zZSBhbmQgU2F2ZTwvbGk+CisJCTwvdWw+CisJCTwvbGk+CisJPC9vbD4KKwk8L2xpPgorCTxsaT48Yj5SdW48L2I+PG9sPgorCQk8bGk+WW91J2xsIHNlZSBpdCBidWlsZCB0aGUgNS4wIGZpbGVzLCB3aXRoIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgCisJCXJlc3VsdHM6PHByZT5Xcml0aW5nIFVDRF9EYXRhNS4wLjAKK0RhdGEgU2l6ZTogMTA5LDgwMgorV3JvdGUgRGF0YSAxMDk4MDI8L3ByZT4KKwkJPC9saT4KKwkJPGxpPkZvciBlYWNoIHZlcnNpb24sIHRoZSB0b29scyBidWlsZCBhIHNldCBvZiBiaW5hcnkgZGF0YSBpbiBCSU4gdGhhdCAKKwkJY29udGFpbiB0aGUgaW5mb3JtYXRpb24gZm9yIHRoYXQgcmVsZWFzZS4gVGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHksIG9yIAorCQl5b3UgY2FuIG1hbnVhbGx5IGRvIGl0IHdpdGggdGhlIFByb2dyYW0gQXJndW1lbnRzPHByZT52ZXJzaW9uIFggYnVpbGQ8L3ByZT4KKwkJPHA+VGhpcyBidWlsZHMgYW4gY29tcHJlc3NlZCBmb3JtYXQgb2YgYWxsIHRoZSBVQ0QgZGF0YSAoZXhjZXB0IGJsb2NrcyAKKwkJYW5kIFVuaWhhbikgaW50byB0aGUgQklOIGRpcmVjdG9yeS4gRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHZvbHVtaW5vdXMgCisJCWNvbnNvbGUgbWVzc2FnZXMsIHVubGVzcyBvbmUgc2F5cyAmcXVvdDtGQUlMJnF1b3Q7LjwvcD4KKwkJPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPjxpPllvdSBoYXZlIHRvIG1hbnVhbGx5IGRvIHRoaXMgaWYgeW91IGNoYW5nZSAKKwkJYW55IG9mIHRoZSBkYXRhIGZpbGVzIGluIHRoYXQgdmVyc2lvbiE8L2k+PC9mb250PjwvcD4KKwkJPHA+Tm90ZTogaWYgZm9yIGFueSByZWFzb24geW91IG1vZGlmeSB0aGUgYmluYXJ5IGZvcm1hdCBvZiB0aGUgQklOIGZpbGVzLCB5b3UgYWxzbyBoYXZlIHRvIGJ1bXAgdGhlIAordmFsdWUgaW4gdGhhdCBmaWxlOjwvcD4KKwkJPHByZT5zdGF0aWMgZmluYWwgYnl0ZSBCSU5BUllfRk9STUFUID0gODsgLy8gYnVtcGVkIGlmIGJpbmFyeSBmb3JtYXQgb2YgVUNEIGNoYW5nZXM8L3ByZT4KKwkJPC9saT4KKwk8L29sPgorCTwvbGk+CisJPGxpPlJlc3VsdHMgaW4gPGEgaHJlZj0iZmlsZTovLy9DOi9EQVRBL0dFTi9EZXJpdmVkRGF0YSI+CisJQzpcREFUQVxHRU5cRGVyaXZlZERhdGE8L2E+PG9sPgorCQk8bGk+VGhlIGZpbGVzIHdpbGwgYmUgaW4gdGhpcyBkaXJlY3RvcnkuPC9saT4KKwkJPGxpPlRoZXJlIGFyZSBhbHNvIERJRkYgZm9sZGVycywgdGhhdCBjb250YWluIEJBVCBmaWxlcyB0aGF0IHlvdSBjYW4gcnVuIAorCQlvbiBXaW5kb3dzIHdpdGggQ29tcGFyZUl0LiAoWW91IGNhbiBtb2RpZnkgdGhlIGNvZGUgdG8gYnVpbGQgQkFUcyB3aXRoIAorCQlhbm90aGVyIERpZmYgcHJvZ3JhbSBpZiB5b3Ugd2FudCkuPG9sPgorCQkJPGxpPkZvciBhbnkgZmlsZSB3aXRoIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSwgaXQgd2lsbCBidWlsZCB0d28gCisJCQlCQVQgZmlsZXMsIHN1Y2ggYXMgdGhlIGZpcnN0IHR3byBiZWxvdy48cHJlPkRpZmZfUHJvcExpc3QtNS4wLjBkMTAudHh0LmJhdAorT0xERVItRGlmZl9Qcm9wTGlzdC01LjAuMGQxMC50eHQuYmF0CisKK1VOQ0hBTkdFRC1EaWZmX1Byb3BlcnR5VmFsdWVBbGlhc2VzLTUuMC4wZDEwLnR4dC5iYXQ8L3ByZT4KKwkJCTwvbGk+CisJCTwvb2w+CisJCTwvbGk+CisJCTxsaT5BbnkgZmlsZXMgd2l0aG91dCBzaWduaWZpY2FudCBjaGFuZ2VzIHdpbGwgaGF2ZSAmcXVvdDtVTkNIQU5HRUQmcXVvdDsgYXMgYSAKKwkJcHJlZml4OiBpZ25vcmUgdGhlbS4mbmJzcDsgVGhlIE9MREVSIHByZWZpeCBpcyB0aGUgY29tcGFyaXNvbiB0byB0aGUgCisJCWxhc3QgdmVyc2lvbiBvZiBVbmljb2RlLjwvbGk+CisJCTxsaT5PbiBXaW5kb3dzIHlvdSBjYW4gcnVuIHRoZXNlIEJBVHMgdG8gY29tcGFyZSBmaWxlczo8L2xpPgorCTwvb2w+CisJPC9saT4KKwk8bGk+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGMDAiPk5GU2tpcHBhYmxlPC9zcGFuPjxvbD4KKwk8bGk+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGMDAiPkEgZmlsZSBpcyBuZWVkZWQgYnkgSUNVIHRoYXQgaXMgCisJZ2VuZXJhdGVkIHdpdGggdGhlIHNhbWUgdG9vbC4gSnVzdCB1c2UgdGhlIGlucHV0IHBhcmFtZXRlciAmcXVvdDtORlNraXBwYWJsZSZxdW90OyB0byAKKwlnZW5lcmF0ZSB0aGUgZmlsZSBORlNhZmVTZXRzLnR4dCwgYWxzbyBpbiA8L3NwYW4+CisJPGEgaHJlZj0iZmlsZTovLy9DOi9EQVRBL0dFTiI+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGMDAiPgorCWZpbGU6Ly8vQzovREFUQS9HRU48L3NwYW4+PC9hPjwvbGk+Cis8L29sPgorCTwvbGk+Cis8L29sPgorPGgzPjUuIEludmFyaWFudCBDaGVja2luZzwvaDM+Cis8b2w+CisJPGxpPlNldHVwPG9sPgorCQk8bGk+T3BlbiBpbiBQYWNrYWdlIEV4cGxvcmVyPHVsPgorCQkJPGxpPmNvbS5pYm0udGV4dC5VQ0Q8dWw+CisJCQkJPGxpPlRlc3RVbmljb2RlSW52YXJpYW50cy5qYXZhPC9saT4KKwkJCTwvdWw+CisJCQk8L2xpPgorCQk8L3VsPgorCQk8L2xpPgorCQk8bGk+UnVuJmd0O1J1biBBcy4uLiBKYXZhIEFwcGxpY2F0aW9uPGJyPgorCQlXaWxsIGNyZWF0ZSB0aGUgZm9sbG93aW5nIGZpbGUgb2YgcmVzdWx0czo8cHJlPjxhIGhyZWY9ImZpbGU6Ly8vQzovREFUQS9HRU4vVW5pY29kZUludmFyaWFudFJlc3VsdHMudHh0LyI+QzpcREFUQVxHRU5cVW5pY29kZUludmFyaWFudFJlc3VsdHMudHh0XDwvYT48L3ByZT4KKwkJPHA+QW5kIG9uIHRoZSBjb25zb2xlIHdpbGwgbGlzdCB3aGV0aGVyIGFueSBwcm9ibGVtcyBhcmUgZm91bmQuIFRodXMgaW4gCisJCXRoZSBmb2xsb3dpbmcgY2FzZSB0aGVyZSB3YXMgb25lIGZhaWx1cmU6PC9wPgorCQk8cHJlPlBhcnNlRXJyb3JDb3VudD0wCitUZXN0RmFpbHVyZUNvdW50PTE8L3ByZT4KKwkJPC9saT4KKwkJPGxpPlRoZSBoZWFkZXIgb2YgdGhlIHJlc3VsdCBmaWxlIGV4cGxhaW5zIHRoZSBzeW50YXggb2YgdGhlIHRlc3RzLjwvbGk+CisJCTxsaT5PcGVuIHRoYXQgZmlsZSBhbmQgc2VhcmNoIGZvciAmcXVvdDsqKioqIFNUQVJUIEVycm9yIEluZm8gKioqKiZxdW90Oy4gRWFjaCBzdWNoIAorCQlwb2ludCBwcm92aWRlcyBhIGR1bXAgb2YgY29tcGFyaXNvbiBpbmZvcm1hdGlvbi48b2w+CisJCTxsaT5GYWlsdXJlcyBwcmludCBhIGxpc3Qgb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gc2V0cyBiZWluZyAKKwkJY29tcGFyZWQuIFNvIGlmIEEgYW5kIEIgYXJlIGJlaW5nIGNvbXBhcmVkLCBpdCBwcmludHMgYWxsIHRoZSBpdGVtcyBpbiAKKwkJQS1CLCB0aGVuIGluIEItQSwgdGhlbiBpbiBBJmFtcDtCLjwvbGk+CisJCTxsaT5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBhIGxpc3Rpbmcgb2YgYSBwcm9ibGVtIHRoYXQgbXVzdCBiZSBjb3JyZWN0ZWQuIAorCQlOb3RlIHRoYXQgdXN1YWxseSB0aGVyZSBpcyBhIGNvbW1lbnQgdGhhdCBleHBsYWlucyB3aGF0IHRoZSBmb2xsb3dpbmcgCisJCWxpbmUgb3IgbGluZXMgYXJlIHN1cHBvc2VkIHRvIHRlc3QuIFRoZW4gd2lsbCBjb21lIEZBTFNFIChpbmRpY2F0aW5nIAorCQl0aGF0IHRoZSB0ZXN0IGZhaWxlZCksIHRoZW4gdGhlIGRldGFpbGVkIGVycm9yIHJlcG9ydC48cHJlPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDlwdCI+IyBDYW5vbmljYWwgZGVjb21wb3NpdGlvbnMgKG1pbnVzIGV4Y2x1c2lvbnMpIG11c3QgYmUgaWRlbnRpY2FsIGFjcm9zcyByZWxlYXNlcworWyREZWNvbXBvc2l0aW9uX1R5cGU6Q2Fub25pY2FsIC0gJEZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uXSA9IFsk10RlY29tcG9zaXRpb25fVHlwZTpDYW5vbmljYWwgLSAk10Z1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uXQorCitGQUxTRQorKioqKiBTVEFSVCBFcnJvciBJbmZvICoqKioKKworSW4gWyTXRGVjb21wb3NpdGlvbl9UeXBlOkNhbm9uaWNhbCAtICTXRnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25dLCBidXQgbm90IGluIFskRGVjb21wb3NpdGlvbl9UeXBlOkNhbm9uaWNhbCAtICRGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbl0gOgorCisjIFRvdGFsIGNvZGUgcG9pbnRzOiAwCisKK05vdCBpbiBbJNdEZWNvbXBvc2l0aW9uX1R5cGU6Q2Fub25pY2FsIC0gJNdGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbl0sIGJ1dCBpbiBbJERlY29tcG9zaXRpb25fVHlwZTpDYW5vbmljYWwgLSAkRnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25dIDoKKzFCMDYgICAgICAgICAgICMgTG8gICAgICAgQkFMSU5FU0UgTEVUVEVSIEFLQVJBIFRFRFVORworMUIwOCAgICAgICAgICAgIyBMbyAgICAgICBCQUxJTkVTRSBMRVRURVIgSUtBUkEgVEVEVU5HCisxQjBBICAgICAgICAgICAjIExvICAgICAgIEJBTElORVNFIExFVFRFUiBVS0FSQSBURURVTkcKKzFCMEMgICAgICAgICAgICMgTG8gICAgICAgQkFMSU5FU0UgTEVUVEVSIFJBIFJFUEEgVEVEVU5HCisxQjBFICAgICAgICAgICAjIExvICAgICAgIEJBTElORVNFIExFVFRFUiBMQSBMRU5HQSBURURVTkcKKzFCMTIgICAgICAgICAgICMgTG8gICAgICAgQkFMSU5FU0UgTEVUVEVSIE9LQVJBIFRFRFVORworMUIzQiAgICAgICAgICAgIyBNYyAgICAgICBCQUxJTkVTRSBWT1dFTCBTSUdOIFJBIFJFUEEgVEVEVU5HCisxQjNEICAgICAgICAgICAjIE1jICAgICAgIEJBTElORVNFIFZPV0VMIFNJR04gTEEgTEVOR0EgVEVEVU5HCisxQjQwLi4xQjQxICAgICAjIE1jICAgWzJdIEJBTElORVNFIFZPV0VMIFNJR04gVEFMSU5HIFRFRFVORy4uQkFMSU5FU0UgVk9XRUwgU0lHTiBUQUxJTkcgUkVQQSBURURVTkcKKzFCNDMgICAgICAgICAgICMgTWMgICAgICAgQkFMSU5FU0UgVk9XRUwgU0lHTiBQRVBFVCBURURVTkcKKworIyBUb3RhbCBjb2RlIHBvaW50czogMTEKKworSW4gYm90aCBbJNdEZWNvbXBvc2l0aW9uX1R5cGU6Q2Fub25pY2FsIC0gJNdGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbl0sIGFuZCBpbiBbJERlY29tcG9zaXRpb25fVHlwZTpDYW5vbmljYWwgLSAkRnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25dIDoKKzAwQzAuLjAwQzUgICAgICMgTCZhbXA7ICAgWzZdIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRS4uTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKzAwQzcuLjAwQ0YgICAgICMgTCZhbXA7ICAgWzldIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBLi5MQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCiswMEQxLi4wMEQ2ICAgICAjIEwmYW1wOyAgIFs2XSBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUuLkxBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKy4uLgorMzBGNy4uMzBGQSAgICAgIyBMbyAgIFs0XSBLQVRBS0FOQSBMRVRURVIgVkEuLktBVEFLQU5BIExFVFRFUiBWTworMzBGRSAgICAgICAgICAgIyBMbSAgICAgICBLQVRBS0FOQSBWT0lDRUQgSVRFUkFUSU9OIE1BUksKK0FDMDAuLkQ3QTMgICAgICMgTG8gWzExMTcyXSBIQU5HVUwgU1lMTEFCTEUgR0EuLkhBTkdVTCBTWUxMQUJMRSBISUgKKworIyBUb3RhbCBjb2RlIHBvaW50czogMTIwODkKKyoqKiogRU5EIEVycm9yIEluZm8gKioqKjwvc3Bhbj48L3ByZT4KKwkJPC9saT4KKwk8L29sPgorCQk8L2xpPgorCQk8bGk+T3B0aW9uczo8b2w+CisJCTxsaT4tciZuYnNwOyZuYnNwOyZuYnNwOyBQcmludCB0aGUgZmFpbHVyZXMgYXMgYSByYW5nZSBsaXN0LjwvbGk+CisJCTxsaT4tZnh4eCZuYnNwOyZuYnNwOyZuYnNwOyBVc2UgYSBkaWZmZXJlbnQgaW5wdXQgZmlsZSwgc3VjaCBhcyAtZkludmFyaWFudFRlc3QudHh0PC9saT4KKwk8L29sPgorCQk8L2xpPgorCTwvb2w+CisJPC9saT4KKzwvb2w+Cis8aDM+Ni4gT3B0aW9uczwvaDM+Cis8b2w+CisJPGxpPklmIHlvdSB3YW50IHRvIHNlZSBmaWxlcyB0aGF0IGFyZSBvcGVuZWQgd2hpbGUgcHJvY2Vzc2luZywgZG8gdGhlIAorCWZvbGxvd2luZzo8b2w+CisJCTxsaT5SdW4mZ3Q7UnVuPC9saT4KKwkJPGxpPlNlbGVjdCB0aGUgQXJndW1lbnRzIHRhYiwgYW5kIGFkZCB0aGUgZm9sbG93aW5nPG9sPgorCQkJPGxpPlZNIGFyZ3VtZW50czoKKwkJCTxwcmU+LURTSE9XX0ZJTEVTPC9wcmU+CisJCQk8L2xpPgorCQk8L29sPgorCQk8L2xpPgorCTwvb2w+CisJPC9saT4KKzwvb2w+Cis8aDM+NS4gVUNBPC9oMz4KKzxvbD4KKwk8bGk+WW91IHdpbGwgdXNlIGNvbS5pYm0udGV4dC5VQ0EuTWFpbiBhcyB5b3VyIG1haW4gY2xhc3MsIGNyZWF0aW5nIGFsb25nIAorCXRoZSBzYW1lIGxpbmVzIGFzIGFib3ZlLjwvbGk+CisJPGxpPlRvIHRlc3Qgd2hldGhlciB0aGUgVUNBIGZpbGVzIGFyZSB2YWxpZCwgdXNlIHRoZQorCTxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogNDAwIj5vcHRpb25zICg8aT5ub3RlOiB5b3UgbXVzdCBhbHNvIGJ1aWxkIHRoZSBJQ1UgCisJZmlsZXMgYmVsb3csIHNpbmNlIHRoZXkgdGVzdCBvdGhlciBhc3BlY3RzPC9pPikuPC9zcGFuPjxwcmU+d3JpdGVDb2xsYXRpb25WYWxpZGl0eUxvZzwvcHJlPgorCTxwPkl0IHdpbGwgY3JlYXRlIGEgZmlsZTo8L3A+CisJPHByZT48YSBocmVmPSJmaWxlOi8vL0M6L0RBVEEvR0VOL2NvbGxhdGlvbi81LjAuMC9DaGVja0NvbGxhdGlvblZhbGlkaXR5Lmh0bWwiPkM6XERBVEFcR0VOXGNvbGxhdGlvblw1LjAuMFxDaGVja0NvbGxhdGlvblZhbGlkaXR5Lmh0bWw8L2E+PC9wcmU+CisJPG9sPgorCQk8bGk+UmV2aWV3IHRoaXMgZmlsZS4gSXQgd2lsbCBsaXN0IGVycm9ycy4gU29tZSBvZiB0aG9zZSBhcmUgYWN0dWFsbHkgCisJd2FybmluZ3MsIGFuZCBpbmRpY2F0ZSBwb3NzaWJsZSBwcm9ibGVtcyAodGhpcyBpcyBpbmRpY2F0ZWQgaW4gdGhlIHRleHQsIAorCXN1Y2ggYXMgYnk6ICZxdW90O1RoZXNlIGFyZSBub3QgbmVjZXNzYXJpbHkgZXJyb3JzLCBidXQgc2hvdWxkIGJlIGV4YW1pbmVkIGZvciAKKwkJPGk+cG9zc2libGU8L2k+IGVycm9ycyZxdW90OykuIEluIHRob3NlIGNhc2VzLCB0aGUgaXRlbXMgc2hvdWxkIGJlIHJldmlld2VkIHRvIG1ha2UgCisJc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBpbmFkdmVydGVudCBwcm9ibGVtcy48L2xpPgorCQk8bGk+SWYgaXQgaXMgbm90IHNvIG1hcmtlZCwgaXQgaXMgYSB0cnVlIGVycm9yLCBhbmQgbXVzdCBiZSBmaXhlZC48L2xpPgorCQk8bGk+QXQgdGhlIGVuZCwgdGhlcmUgaXMgc2VjdGlvbiA8Yj4xMS4gQ292ZXJhZ2U8L2I+LiBUaGVyZSBhcmUgdHdvIHNlY3Rpb25zOjxvbD4KKwkJCTxsaT5JbiBVQ0R4eHgsIGJ1dCBub3QgaW4gYWxsa2V5cy4gQ2hlY2sgdGhpcyBvdmVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXNlIAorCWFyZSBhbGwgdGhlIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgZ2V0IDxiPjxpPmltcGxpY2l0PC9pPjwvYj4gd2VpZ2h0cy48L2xpPgorCQkJPGxpPkluIGFsbGtleXMsIGJ1dCBub3QgaW4gVUNELiBUaGVzZSBzaG91bGQgYmUgPGI+PGk+b25seTwvaT48L2I+IAorCWNvbnRyYWN0aW9ucy4gQ2hlY2sgdGhlbSBvdmVyIHRvIG1ha2Ugc3VyZSB0aGV5IGxvb2sgcmlnaHQgYWxzby48L2xpPgorCQk8L29sPjwvbGk+CisJPC9vbD48L2xpPgorCTxsaT4KKwk8aDQ+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiA0MDAiPlRvIGJ1aWxkIGFsbCB0aGUgY2hhcnRzIChpbmNsdWRpbmcgZm9yIAorCXRoZSBVQ0EpLCB1c2UgdGhlIG9wdGlvbnM6IDwvc3Bhbj48L2g0PgorCTxwcmU+bm9ybWFsaXphdGlvbkNoYXJ0IGNhc2VDaGFydCBzY3JpcHRDaGFydCBpbmRleENoYXJ0PC9wcmU+CisJPHA+VGhleSB3aWxsIGJlIGJ1aWx0IGludG88L3A+CisJPHByZT48YSBocmVmPSJmaWxlOi8vL0M6L0RBVEEvR0VOL2NoYXJ0cyI+QzpcREFUQVxHRU5cY2hhcnRzPC9hPjwvcHJlPgorCTxwPjxiPk9uY2UgVUNBIGlzIHJlbGVhc2VkLCB0aGVuIGNvcHkgdGhvc2UgZmlsZXMgdXAgdG8gdGhlIHJpZ2h0IHNwb3RzIGluIAorCXRoZSBVbmljb2RlIHNpdGU6PC9iPjx1bD4KKwkJPGxpPgorCQk8cHJlPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL25vcm1hbGl6YXRpb24vIj5odHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9ub3JtYWxpemF0aW9uLzwvYT48L3ByZT4KKwkJPC9saT4KKwkJPGxpPgorCQk8cHJlPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL2NvbGxhdGlvbi8iPmh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL2NvbGxhdGlvbi88L2E+IDwvcHJlPgorCQk8L2xpPgorCQk8bGk+CisJCTxwcmU+PGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvY2FzZS8iPmh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL2Nhc2UvPC9hPiA8L3ByZT4KKwkJPC9saT4KKwkJPGxpPgorCQk8cHJlPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL2NvbGxhdGlvbi8iPmh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL2NvbGxhdGlvbi88L2E+IDwvcHJlPgorCQk8L2xpPgorCTwvdWw+CisJPC9saT4KKwk8bGk+CisJPGg0PjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogNDAwIj5UbyBidWlsZCBhbGwgdGhlIFVDQSBmaWxlcyB1c2VkIGJ5IElDVSwgdXNlIHRoZSAKKwlvcHRpb246PC9zcGFuPjwvaDQ+CisJPHByZT5JQ1U8L3ByZT4KKwk8cD5UaGV5IHdpbGwgYmUgYnVpbHQgaW50bzo8L3A+CisJPHByZT48YSBocmVmPSJmaWxlOi8vL0M6L0RBVEEvR0VOL2NvbGxhdGlvbi81LjAuMCI+QzpcREFUQVxHRU5cY29sbGF0aW9uXDUuMC4wPC9hPjwvcHJlPgorCTwvbGk+CisJPGxpPllvdSBzaG91bGQgdGhlbiBidWlsZCBhIHNldCBvZiB0aGUgSUNVIGZpbGVzIGZvciB0aGUgcHJldmlvdXMgdmVyc2lvbiwgCisJaWYgeW91IGRvbid0IGhhdmUgdGhlbS4gVXNlIHRoZSBvcHRpb25zOjxwcmU+dmVyc2lvbiA0LjEuMCBJQ1U8L3ByZT4KKwk8cD5PciB3aGF0ZXZlciB0aGUgbGFzdCB2ZXJzaW9uIHdhcy48L2xpPgorCTxsaT5Ob3csIHlvdSB3aWxsIHdhbnQgdG8gY29tcGFyZSB2ZXJzaW9ucy4gVGhlIGtleSBmaWxlIGlzIAorCVVDQV9SdWxlc19Ob0NFLnR4dC4gSXQgY29udGFpbnMgdGhlIHJ1bGVzIGV4cHJlc3NlZCBpbiBJQ1UgZm9ybWF0LCB3aGljaCAKKwlhbGxvd3MgZm9yIGNvbXBhcmlzb24gYWNyb3NzIHZlcnNpb25zIG9mIFVDQSB3aXRob3V0IHNwdXJpb3VzIHZhcmlhdGlvbnMgb2YgCisJdGhlIG51bWJlcnMgZ2V0dGluZyBpbiB0aGUgd2F5LjxvbD4KKwkJPGxpPkRvIGEgRGlmZiBiZXR3ZWVuIHRoZSBsYXN0IGFuZCBjdXJyZW50IHZlcnNpb25zIG9mIHRoZXNlIGZpbGVzLCBhbmQgCisJCXZlcmlmeSB0aGF0IGFsbCB0aGUgZGlmZmVyZW5jZXMgYXJlIGVpdGhlciBuZXcgY2hhcmFjdGVycywgb3Igd2VyZSAKKwkJYXV0aG9yaXplZCB0byBiZSBjaGFuZ2VkIGJ5IHRoZSBVVEMuPC9saT4KKwk8L29sPjwvbGk+Cis8L29sPgorCis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==