ZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwOTc0MgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTMzIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKyMKKyMgIEF1dG9tYWtlIE1ha2VmaWxlIGZvciB0aGUgSlBFRyBsaWJyYXJ5CisjCisjICBUaGlzIGZpbGUgaXMgd3JpdHRlbiBieSBCb2IgRnJpZXNlbmhhaG4sIEd1aWRvIFZvbGxiZWRpbmcKKyMKKworIyBTb3VyY2VzIHRvIGJ1aWxkIGxpYnJhcnkKK0xJQlNPVVJDRVMgPSBqYXJpY29tLmMgamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjYXJpdGguYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBcCisgICAgICAgIGpjZGN0bWdyLmMgamNodWZmLmMgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgXAorICAgICAgICBqY29tYXBpLmMgamNwYXJhbS5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBcCisgICAgICAgIGpkYXBpc3RkLmMgamRhcml0aC5jIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBcCisgICAgICAgIGpkZGN0bWdyLmMgamRodWZmLmMgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIFwKKyAgICAgICAgamRtZXJnZS5jIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBcCisgICAgICAgIGpmZGN0ZnN0LmMgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jIEBNRU1PUllNR1JALmMKKworIyBTeXN0ZW0gZGVwZW5kZW50IHNvdXJjZXMKK1NZU0RFUFNPVVJDRVMgPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisKKyMgSGVhZGVycyB3aGljaCBhcmUgaW5zdGFsbGVkIHRvIHN1cHBvcnQgdGhlIGxpYnJhcnkKK0lOU1RJTkNMVURFUyAgPSBqZXJyb3IuaCBqbW9yZWNmZy5oIGpwZWdsaWIuaAorCisjIEhlYWRlcnMgd2hpY2ggYXJlIG5vdCBpbnN0YWxsZWQKK09USEVSSU5DTFVERVMgPSBjZGVycm9yLmggY2RqcGVnLmggamRjdC5oIGppbmNsdWRlLmggam1lbXN5cy5oIGpwZWdpbnQuaCBcCisgICAgICAgIGp2ZXJzaW9uLmggdHJhbnN1cHAuaAorCisjIE1hbnVhbCBwYWdlcyAoQXV0b21ha2UgdXNlcyAnTUFOUycgZm9yIGl0c2VsZikKK0RJU1RNQU5TPSBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIHdyanBnY29tLjEKKworIyBPdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC50eHQgdXNhZ2UudHh0IHdpemFyZC50eHQgZXhhbXBsZS5jIGxpYmpwZWcudHh0IFwKKyAgICAgICAgc3RydWN0dXJlLnR4dCBjb2RlcnVsZXMudHh0IGZpbGVsaXN0LnR4dCBjaGFuZ2UubG9nCisKKyMgTWFrZWZpbGVzIGZvciB2YXJpb3VzIHN5c3RlbXMKK01LRklMRVM9IGNvbmZpZ3VyZSBNYWtlZmlsZS5pbiBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlamRzdy52YzYgXAorICAgICAgICBtYWtlYWRzdy52YzYgbWFrZWpkZXAudmM2IG1ha2VqZHNwLnZjNiBtYWtlam1hay52YzYgbWFrZWNkZXAudmM2IFwKKyAgICAgICAgbWFrZWNkc3AudmM2IG1ha2VjbWFrLnZjNiBtYWtlZGRlcC52YzYgbWFrZWRkc3AudmM2IG1ha2VkbWFrLnZjNiBcCisgICAgICAgIG1ha2V0ZGVwLnZjNiBtYWtldGRzcC52YzYgbWFrZXRtYWsudmM2IG1ha2VyZGVwLnZjNiBtYWtlcmRzcC52YzYgXAorICAgICAgICBtYWtlcm1hay52YzYgbWFrZXdkZXAudmM2IG1ha2V3ZHNwLnZjNiBtYWtld21hay52YzYgbWFrZWpzbG4udmM5IFwKKyAgICAgICAgbWFrZWFzbG4udmM5IG1ha2VqdmNwLnZjOSBtYWtlY3ZjcC52YzkgbWFrZWR2Y3AudmM5IG1ha2V0dmNwLnZjOSBcCisgICAgICAgIG1ha2VydmNwLnZjOSBtYWtld3ZjcC52YzkgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IFwKKyAgICAgICAgbWFrbGpwZWcuc3QgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIFwKKyAgICAgICAgbWFrZWZpbGUudm1zIG1ha3Ztcy5vcHQKKworIyBDb25maWd1cmF0aW9uIGZpbGVzCitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworCisjIFN1cHBvcnQgc2NyaXB0cyBmb3IgY29uZmlndXJlCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdG1haW4uc2ggZGVwY29tcCBtaXNzaW5nCisKKyMgTWlzY2VsbGFuZW91cyBzdXBwb3J0IGZpbGVzCitPVEhFUkZJTEVTPSBqY29uZmlnLnR4dCBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20gXAorICAgICAgICBsaWJqcGVnLm1hcAorCisjIFRlc3Qgc3VwcG9ydCBmaWxlcworVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCisKKyMgbGlidG9vbCBsaWJyYXJpZXMgdG8gYnVpbGQKK2xpYl9MVExJQlJBUklFUyA9IGxpYmpwZWcubGEKKworIyBMaWJyYXJ5IHNvdXJjZXMgZm9yIGxpYmpwZWcubGEKK2xpYmpwZWdfbGFfU09VUkNFUyA9ICQoTElCU09VUkNFUykKKworIyBMREZMQUdTIGZvciBsaWJqcGVnLmxhCitsaWJqcGVnX2xhX0xERkxBR1MgPSAtbm8tdW5kZWZpbmVkIFwKKyAgICAgICAgLXZlcnNpb24taW5mbyAkKEpQRUdfTElCX1ZFUlNJT04pCisKK2lmIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQKKyAgbGlianBlZ19sYV9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PSQoc3JjZGlyKS9saWJqcGVnLm1hcAorZW5kaWYKKworIyBFeGVjdXRhYmxlcyB0byBidWlsZAorYmluX1BST0dSQU1TID0gY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KKworIyBFeGVjdXRhYmxlIHNvdXJjZXMgJiBsaWJzCitjanBlZ19TT1VSQ0VTICAgID0gY2pwZWcuYyByZHBwbS5jIHJkZ2lmLmMgcmR0YXJnYS5jIHJkcmxlLmMgcmRibXAuYyBcCisgICAgICAgIHJkc3dpdGNoLmMgY2RqcGVnLmMKK2NqcGVnX0xEQUREICAgICAgPSBsaWJqcGVnLmxhCitkanBlZ19TT1VSQ0VTICAgID0gZGpwZWcuYyB3cnBwbS5jIHdyZ2lmLmMgd3J0YXJnYS5jIHdycmxlLmMgd3JibXAuYyBcCisgICAgICAgIHJkY29sbWFwLmMgY2RqcGVnLmMKK2RqcGVnX0xEQUREICAgICAgPSBsaWJqcGVnLmxhCitqcGVndHJhbl9TT1VSQ0VTID0ganBlZ3RyYW4uYyByZHN3aXRjaC5jIGNkanBlZy5jIHRyYW5zdXBwLmMKK2pwZWd0cmFuX0xEQUREICAgPSBsaWJqcGVnLmxhCityZGpwZ2NvbV9TT1VSQ0VTID0gcmRqcGdjb20uYword3JqcGdjb21fU09VUkNFUyA9IHdyanBnY29tLmMKKworIyBNYW51YWwgcGFnZXMgdG8gaW5zdGFsbAorbWFuX01BTlMgPSAkKERJU1RNQU5TKQorCisjIEhlYWRlcnMgdG8gaW5zdGFsbAoraW5jbHVkZV9IRUFERVJTID0gJChJTlNUSU5DTFVERVMpCisKKyMgT3RoZXIgZGlzdHJpYnV0ZWQgaGVhZGVycworbm9pbnN0X0hFQURFUlMgPSAkKE9USEVSSU5DTFVERVMpCisKKyMgT3RoZXIgZGlzdHJpYnV0ZWQgZmlsZXMKK0VYVFJBX0RJU1QgPSAgJChET0NTKSAkKERJU1RNQU5TKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU1lTREVQU09VUkNFUykgXAorICAgICAgICAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorCisjIEZpbGVzIHRvIGJlIGNsZWFuZWQKK0NMRUFORklMRVMgPSB0ZXN0b3V0LnBwbSB0ZXN0b3V0LmJtcCB0ZXN0b3V0LmpwZyB0ZXN0b3V0cC5wcG0gdGVzdG91dHAuanBnIFwKKyAgICAgICAgdGVzdG91dHQuanBnCisKKyMgSW5zdGFsbCBqY29uZmlnLmgKK2luc3RhbGwtZGF0YS1sb2NhbDoKKwkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluY2x1ZGVkaXIpCisJJChJTlNUQUxMX0hFQURFUikgamNvbmZpZy5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2pjb25maWcuaAorCisjIFVuaW5zdGFsbCBqY29uZmlnLmgKK3VuaW5zdGFsbC1sb2NhbDoKKwlybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9qY29uZmlnLmgKKworIyBSdW4gdGVzdHMKK3Rlc3Q6IGNoZWNrLWxvY2FsCitjaGVjay1sb2NhbDoKKwkkKFJNKSB0ZXN0b3V0KgorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZworCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgICQoc3JjZGlyKS90ZXN0aW1nLnBwbQorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gJChzcmNkaXIpL3Rlc3Rwcm9nLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnICQoc3JjZGlyKS90ZXN0aW1nLnBwbQorCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCAkKHNyY2RpcikvdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWNtcCAkKHNyY2RpcikvdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCAkKHNyY2RpcikvdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWNiYTVlCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxMDg5IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworIworIyAgQXV0b21ha2UgTWFrZWZpbGUgZm9yIHRoZSBKUEVHIGxpYnJhcnkKKyMKKyMgIFRoaXMgZmlsZSBpcyB3cml0dGVuIGJ5IEJvYiBGcmllc2VuaGFobiwgR3VpZG8gVm9sbGJlZGluZworIworCisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAordGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAorQU5TSTJLTlIgPSBAQU5TSTJLTlJACitASEFWRV9MRF9WRVJTSU9OX1NDUklQVF9UUlVFQGFtX19hcHBlbmRfMSA9IC1XbCwtLXZlcnNpb24tc2NyaXB0PSQoc3JjZGlyKS9saWJqcGVnLm1hcAorYmluX1BST0dSQU1TID0gY2pwZWckKEVYRUVYVCkgZGpwZWckKEVYRUVYVCkganBlZ3RyYW4kKEVYRUVYVCkgXAorCXJkanBnY29tJChFWEVFWFQpIHdyanBnY29tJChFWEVFWFQpCitzdWJkaXIgPSAuCitESVNUX0NPTU1PTiA9IFJFQURNRSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKGFtX19jb25maWd1cmVfZGVwcykgXAorCSQoc3JjZGlyKS9qY29uZmlnLmNmZyBhbnNpMmtuci5jIGFuc2kya25yLjEgZGVwY29tcCBcCisJJChpbmNsdWRlX0hFQURFUlMpICQobm9pbnN0X0hFQURFUlMpCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMgPSBjb25maWcuc3RhdHVzIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIFwKKyBjb25maWd1cmUubGluZW5vIGNvbmZpZy5zdGF0dXMubGluZW5vCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9IGpjb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiIFwKKwkiJChERVNURElSKSQobWFuMWRpcikiICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKK0xUTElCUkFSSUVTID0gJChsaWJfTFRMSUJSQVJJRVMpCitsaWJqcGVnX2xhX0xJQkFERCA9CithbV9fb2JqZWN0c18xID0gamFyaWNvbSRVLmxvIGpjYXBpbWluJFUubG8gamNhcGlzdGQkVS5sbyBqY2FyaXRoJFUubG8gXAorCWpjY29lZmN0JFUubG8gamNjb2xvciRVLmxvIGpjZGN0bWdyJFUubG8gamNodWZmJFUubG8gXAorCWpjaW5pdCRVLmxvIGpjbWFpbmN0JFUubG8gamNtYXJrZXIkVS5sbyBqY21hc3RlciRVLmxvIFwKKwlqY29tYXBpJFUubG8gamNwYXJhbSRVLmxvIGpjcHJlcGN0JFUubG8gamNzYW1wbGUkVS5sbyBcCisJamN0cmFucyRVLmxvIGpkYXBpbWluJFUubG8gamRhcGlzdGQkVS5sbyBqZGFyaXRoJFUubG8gXAorCWpkYXRhZHN0JFUubG8gamRhdGFzcmMkVS5sbyBqZGNvZWZjdCRVLmxvIGpkY29sb3IkVS5sbyBcCisJamRkY3RtZ3IkVS5sbyBqZGh1ZmYkVS5sbyBqZGlucHV0JFUubG8gamRtYWluY3QkVS5sbyBcCisJamRtYXJrZXIkVS5sbyBqZG1hc3RlciRVLmxvIGpkbWVyZ2UkVS5sbyBqZHBvc3RjdCRVLmxvIFwKKwlqZHNhbXBsZSRVLmxvIGpkdHJhbnMkVS5sbyBqZXJyb3IkVS5sbyBqZmRjdGZsdCRVLmxvIFwKKwlqZmRjdGZzdCRVLmxvIGpmZGN0aW50JFUubG8gamlkY3RmbHQkVS5sbyBqaWRjdGZzdCRVLmxvIFwKKwlqaWRjdGludCRVLmxvIGpxdWFudDEkVS5sbyBqcXVhbnQyJFUubG8ganV0aWxzJFUubG8gXAorCWptZW1tZ3IkVS5sbyBATUVNT1JZTUdSQCRVLmxvCithbV9saWJqcGVnX2xhX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzEpCitsaWJqcGVnX2xhX09CSkVDVFMgPSAkKGFtX2xpYmpwZWdfbGFfT0JKRUNUUykKK0FNX1ZfbHQgPSAkKGFtX192X2x0XyQoVikpCithbV9fdl9sdF8gPSAkKGFtX192X2x0XyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfbHRfMCA9IC0tc2lsZW50CitsaWJqcGVnX2xhX0xJTksgPSAkKExJQlRPT0wpICQoQU1fVl9sdCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpIFwKKwkkKExJQlRPT0xGTEFHUykgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKGxpYmpwZWdfbGFfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKK2FtX2NqcGVnX09CSkVDVFMgPSBjanBlZyRVLiQoT0JKRVhUKSByZHBwbSRVLiQoT0JKRVhUKSBcCisJcmRnaWYkVS4kKE9CSkVYVCkgcmR0YXJnYSRVLiQoT0JKRVhUKSByZHJsZSRVLiQoT0JKRVhUKSBcCisJcmRibXAkVS4kKE9CSkVYVCkgcmRzd2l0Y2gkVS4kKE9CSkVYVCkgY2RqcGVnJFUuJChPQkpFWFQpCitjanBlZ19PQkpFQ1RTID0gJChhbV9janBlZ19PQkpFQ1RTKQorY2pwZWdfREVQRU5ERU5DSUVTID0gbGlianBlZy5sYQorYW1fZGpwZWdfT0JKRUNUUyA9IGRqcGVnJFUuJChPQkpFWFQpIHdycHBtJFUuJChPQkpFWFQpIFwKKwl3cmdpZiRVLiQoT0JKRVhUKSB3cnRhcmdhJFUuJChPQkpFWFQpIHdycmxlJFUuJChPQkpFWFQpIFwKKwl3cmJtcCRVLiQoT0JKRVhUKSByZGNvbG1hcCRVLiQoT0JKRVhUKSBjZGpwZWckVS4kKE9CSkVYVCkKK2RqcGVnX09CSkVDVFMgPSAkKGFtX2RqcGVnX09CSkVDVFMpCitkanBlZ19ERVBFTkRFTkNJRVMgPSBsaWJqcGVnLmxhCithbV9qcGVndHJhbl9PQkpFQ1RTID0ganBlZ3RyYW4kVS4kKE9CSkVYVCkgcmRzd2l0Y2gkVS4kKE9CSkVYVCkgXAorCWNkanBlZyRVLiQoT0JKRVhUKSB0cmFuc3VwcCRVLiQoT0JKRVhUKQoranBlZ3RyYW5fT0JKRUNUUyA9ICQoYW1fanBlZ3RyYW5fT0JKRUNUUykKK2pwZWd0cmFuX0RFUEVOREVOQ0lFUyA9IGxpYmpwZWcubGEKK2FtX3JkanBnY29tX09CSkVDVFMgPSByZGpwZ2NvbSRVLiQoT0JKRVhUKQorcmRqcGdjb21fT0JKRUNUUyA9ICQoYW1fcmRqcGdjb21fT0JKRUNUUykKK3JkanBnY29tX0xEQUREID0gJChMREFERCkKK2FtX3dyanBnY29tX09CSkVDVFMgPSB3cmpwZ2NvbSRVLiQoT0JKRVhUKQord3JqcGdjb21fT0JKRUNUUyA9ICQoYW1fd3JqcGdjb21fT0JKRUNUUykKK3dyanBnY29tX0xEQUREID0gJChMREFERCkKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNACitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgJChBTV9WX2x0KSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgXAorCSQoTElCVE9PTEZMQUdTKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpIFwKKwkkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkkKEFNX0NGTEFHUykgJChDRkxBR1MpCitBTV9WX0NDID0gJChhbV9fdl9DQ18kKFYpKQorYW1fX3ZfQ0NfID0gJChhbV9fdl9DQ18kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X0NDXzAgPSBAZWNobyAiICBDQyAgICAiICRAOworQU1fVl9hdCA9ICQoYW1fX3ZfYXRfJChWKSkKK2FtX192X2F0XyA9ICQoYW1fX3ZfYXRfJChBTV9ERUZBVUxUX1ZFUkJPU0lUWSkpCithbV9fdl9hdF8wID0gQAorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAkKEFNX1ZfbHQpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitBTV9WX0NDTEQgPSAkKGFtX192X0NDTERfJChWKSkKK2FtX192X0NDTERfID0gJChhbV9fdl9DQ0xEXyQoQU1fREVGQVVMVF9WRVJCT1NJVFkpKQorYW1fX3ZfQ0NMRF8wID0gQGVjaG8gIiAgQ0NMRCAgIiAkQDsKK0FNX1ZfR0VOID0gJChhbV9fdl9HRU5fJChWKSkKK2FtX192X0dFTl8gPSAkKGFtX192X0dFTl8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2FtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgIiAkQDsKK1NPVVJDRVMgPSAkKGxpYmpwZWdfbGFfU09VUkNFUykgJChjanBlZ19TT1VSQ0VTKSAkKGRqcGVnX1NPVVJDRVMpIFwKKwkkKGpwZWd0cmFuX1NPVVJDRVMpICQocmRqcGdjb21fU09VUkNFUykgJCh3cmpwZ2NvbV9TT1VSQ0VTKQorbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCitOUk9GRiA9IG5yb2ZmCitNQU5TID0gJChtYW5fTUFOUykKK0hFQURFUlMgPSAkKGluY2x1ZGVfSEVBREVSUykgJChub2luc3RfSEVBREVSUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNVEFSID0gQEFNVEFSQAorQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACitBUiA9IEBBUkAKK0FTID0gQEFTQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitETExUT09MID0gQERMTFRPT0xACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitKUEVHX0xJQl9WRVJTSU9OID0gQEpQRUdfTElCX1ZFUlNJT05ACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUVNT1JZTUdSID0gQE1FTU9SWU1HUkAKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1JBTkxJQiA9IEBSQU5MSUJACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorVSA9IEBVQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXQgPSBAdGFyZ2V0QAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RhcmdldF9jcHUgPSBAdGFyZ2V0X2NwdUAKK3RhcmdldF9vcyA9IEB0YXJnZXRfb3NACit0YXJnZXRfdmVuZG9yID0gQHRhcmdldF92ZW5kb3JACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorCisjIFNvdXJjZXMgdG8gYnVpbGQgbGlicmFyeQorTElCU09VUkNFUyA9IGphcmljb20uYyBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNhcml0aC5jIGpjY29lZmN0LmMgamNjb2xvci5jIFwKKyAgICAgICAgamNkY3RtZ3IuYyBqY2h1ZmYuYyBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBcCisgICAgICAgIGpjb21hcGkuYyBqY3BhcmFtLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIFwKKyAgICAgICAgamRhcGlzdGQuYyBqZGFyaXRoLmMgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIFwKKyAgICAgICAgamRkY3RtZ3IuYyBqZGh1ZmYuYyBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgXAorICAgICAgICBqZG1lcmdlLmMgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIFwKKyAgICAgICAgamZkY3Rmc3QuYyBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMgQE1FTU9SWU1HUkAuYworCisKKyMgU3lzdGVtIGRlcGVuZGVudCBzb3VyY2VzCitTWVNERVBTT1VSQ0VTID0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworCisjIEhlYWRlcnMgd2hpY2ggYXJlIGluc3RhbGxlZCB0byBzdXBwb3J0IHRoZSBsaWJyYXJ5CitJTlNUSU5DTFVERVMgPSBqZXJyb3IuaCBqbW9yZWNmZy5oIGpwZWdsaWIuaAorCisjIEhlYWRlcnMgd2hpY2ggYXJlIG5vdCBpbnN0YWxsZWQKK09USEVSSU5DTFVERVMgPSBjZGVycm9yLmggY2RqcGVnLmggamRjdC5oIGppbmNsdWRlLmggam1lbXN5cy5oIGpwZWdpbnQuaCBcCisgICAgICAgIGp2ZXJzaW9uLmggdHJhbnN1cHAuaAorCisKKyMgTWFudWFsIHBhZ2VzIChBdXRvbWFrZSB1c2VzICdNQU5TJyBmb3IgaXRzZWxmKQorRElTVE1BTlMgPSBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIHdyanBnY29tLjEKKworIyBPdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzCitET0NTID0gUkVBRE1FIGluc3RhbGwudHh0IHVzYWdlLnR4dCB3aXphcmQudHh0IGV4YW1wbGUuYyBsaWJqcGVnLnR4dCBcCisgICAgICAgIHN0cnVjdHVyZS50eHQgY29kZXJ1bGVzLnR4dCBmaWxlbGlzdC50eHQgY2hhbmdlLmxvZworCisKKyMgTWFrZWZpbGVzIGZvciB2YXJpb3VzIHN5c3RlbXMKK01LRklMRVMgPSBjb25maWd1cmUgTWFrZWZpbGUuaW4gbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWpkc3cudmM2IFwKKyAgICAgICAgbWFrZWFkc3cudmM2IG1ha2VqZGVwLnZjNiBtYWtlamRzcC52YzYgbWFrZWptYWsudmM2IG1ha2VjZGVwLnZjNiBcCisgICAgICAgIG1ha2VjZHNwLnZjNiBtYWtlY21hay52YzYgbWFrZWRkZXAudmM2IG1ha2VkZHNwLnZjNiBtYWtlZG1hay52YzYgXAorICAgICAgICBtYWtldGRlcC52YzYgbWFrZXRkc3AudmM2IG1ha2V0bWFrLnZjNiBtYWtlcmRlcC52YzYgbWFrZXJkc3AudmM2IFwKKyAgICAgICAgbWFrZXJtYWsudmM2IG1ha2V3ZGVwLnZjNiBtYWtld2RzcC52YzYgbWFrZXdtYWsudmM2IG1ha2Vqc2xuLnZjOSBcCisgICAgICAgIG1ha2Vhc2xuLnZjOSBtYWtlanZjcC52YzkgbWFrZWN2Y3AudmM5IG1ha2VkdmNwLnZjOSBtYWtldHZjcC52YzkgXAorICAgICAgICBtYWtlcnZjcC52YzkgbWFrZXd2Y3AudmM5IG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBcCisgICAgICAgIG1ha2xqcGVnLnN0IG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBcCisgICAgICAgIG1ha2VmaWxlLnZtcyBtYWt2bXMub3B0CisKKworIyBDb25maWd1cmF0aW9uIGZpbGVzCitDT05GSUdGSUxFUyA9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKKworCisjIFN1cHBvcnQgc2NyaXB0cyBmb3IgY29uZmlndXJlCitDT05GSUdVUkVGSUxFUyA9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRtYWluLnNoIGRlcGNvbXAgbWlzc2luZworCisjIE1pc2NlbGxhbmVvdXMgc3VwcG9ydCBmaWxlcworT1RIRVJGSUxFUyA9IGpjb25maWcudHh0IGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbSBcCisgICAgICAgIGxpYmpwZWcubWFwCisKKworIyBUZXN0IHN1cHBvcnQgZmlsZXMKK1RFU1RGSUxFUyA9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKKworCisjIGxpYnRvb2wgbGlicmFyaWVzIHRvIGJ1aWxkCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJqcGVnLmxhCisKKyMgTGlicmFyeSBzb3VyY2VzIGZvciBsaWJqcGVnLmxhCitsaWJqcGVnX2xhX1NPVVJDRVMgPSAkKExJQlNPVVJDRVMpCisKKyMgTERGTEFHUyBmb3IgbGlianBlZy5sYQorbGlianBlZ19sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZCAtdmVyc2lvbi1pbmZvICQoSlBFR19MSUJfVkVSU0lPTikgXAorCSQoYW1fX2FwcGVuZF8xKQorCisjIEV4ZWN1dGFibGUgc291cmNlcyAmIGxpYnMKK2NqcGVnX1NPVVJDRVMgPSBjanBlZy5jIHJkcHBtLmMgcmRnaWYuYyByZHRhcmdhLmMgcmRybGUuYyByZGJtcC5jIFwKKyAgICAgICAgcmRzd2l0Y2guYyBjZGpwZWcuYworCitjanBlZ19MREFERCA9IGxpYmpwZWcubGEKK2RqcGVnX1NPVVJDRVMgPSBkanBlZy5jIHdycHBtLmMgd3JnaWYuYyB3cnRhcmdhLmMgd3JybGUuYyB3cmJtcC5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyBjZGpwZWcuYworCitkanBlZ19MREFERCA9IGxpYmpwZWcubGEKK2pwZWd0cmFuX1NPVVJDRVMgPSBqcGVndHJhbi5jIHJkc3dpdGNoLmMgY2RqcGVnLmMgdHJhbnN1cHAuYworanBlZ3RyYW5fTERBREQgPSBsaWJqcGVnLmxhCityZGpwZ2NvbV9TT1VSQ0VTID0gcmRqcGdjb20uYword3JqcGdjb21fU09VUkNFUyA9IHdyanBnY29tLmMKKworIyBNYW51YWwgcGFnZXMgdG8gaW5zdGFsbAorbWFuX01BTlMgPSAkKERJU1RNQU5TKQorCisjIEhlYWRlcnMgdG8gaW5zdGFsbAoraW5jbHVkZV9IRUFERVJTID0gJChJTlNUSU5DTFVERVMpCisKKyMgT3RoZXIgZGlzdHJpYnV0ZWQgaGVhZGVycworbm9pbnN0X0hFQURFUlMgPSAkKE9USEVSSU5DTFVERVMpCisKKyMgT3RoZXIgZGlzdHJpYnV0ZWQgZmlsZXMKK0VYVFJBX0RJU1QgPSAkKERPQ1MpICQoRElTVE1BTlMpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTWVNERVBTT1VSQ0VTKSBcCisgICAgICAgICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisKKworIyBGaWxlcyB0byBiZSBjbGVhbmVkCitDTEVBTkZJTEVTID0gdGVzdG91dC5wcG0gdGVzdG91dC5ibXAgdGVzdG91dC5qcGcgdGVzdG91dHAucHBtIHRlc3RvdXRwLmpwZyBcCisgICAgICAgIHRlc3RvdXR0LmpwZworCithbGw6IGpjb25maWcuaAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCithbS0tcmVmcmVzaDoKKwlAOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24nOyBcCisJICAgICAgJChhbV9fY2QpICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiBNYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAorCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwkkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQUNMT0NBTCkgJChBQ0xPQ0FMX0FNRkxBR1MpCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCitqY29uZmlnLmg6IHN0YW1wLWgxCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJICBybSAtZiBzdGFtcC1oMTsgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDE7IFwKKwllbHNlIDo7IGZpCisKK3N0YW1wLWgxOiAkKHNyY2RpcikvamNvbmZpZy5jZmcgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAcm0gLWYgc3RhbXAtaDEKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIGpjb25maWcuaAorJChzcmNkaXIpL2pjb25maWcuY2ZnOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKKwkoJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKSkKKwlybSAtZiBzdGFtcC1oMQorCXRvdWNoICRACisKK2Rpc3RjbGVhbi1oZHI6CisJLXJtIC1mIGpjb25maWcuaCBzdGFtcC1oMQoraW5zdGFsbC1saWJMVExJQlJBUklFUzogJChsaWJfTFRMSUJSQVJJRVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChsaWJkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChsaWJkaXIpIgorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCisJbGlzdDI9OyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKKwkgICAgbGlzdDI9IiQkbGlzdDIgJCRwIjsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWRvbmU7IFwKKwl0ZXN0IC16ICIkJGxpc3QyIiB8fCB7IFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAnJChERVNURElSKSQobGliZGlyKSciOyBcCisJICAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKElOU1RBTExfU1RSSVBfRkxBRykgJCRsaXN0MiAiJChERVNURElSKSQobGliZGlyKSI7IFwKKwl9CisKK3VuaW5zdGFsbC1saWJMVExJQlJBUklFUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyB0ZXN0IC1uICIkKGxpYmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAkKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAnJChERVNURElSKSQobGliZGlyKS8kJGYnIjsgXAorCSAgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgIiQoREVTVERJUikkKGxpYmRpcikvJCRmIjsgXAorCWRvbmUKKworY2xlYW4tbGliTFRMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobGliX0xUTElCUkFSSUVTKSIgfHwgcm0gLWYgJChsaWJfTFRMSUJSQVJJRVMpCisJQGxpc3Q9JyQobGliX0xUTElCUkFSSUVTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZGlyPSJgZWNobyAkJHAgfCBzZWQgLWUgJ3N8L1teL10qJCR8fCdgIjsgXAorCSAgdGVzdCAiJCRkaXIiICE9ICIkJHAiIHx8IGRpcj0uOyBcCisJICBlY2hvICJybSAtZiBcIiQke2Rpcn0vc29fbG9jYXRpb25zXCIiOyBcCisJICBybSAtZiAiJCR7ZGlyfS9zb19sb2NhdGlvbnMiOyBcCisJZG9uZQorbGlianBlZy5sYTogJChsaWJqcGVnX2xhX09CSkVDVFMpICQobGlianBlZ19sYV9ERVBFTkRFTkNJRVMpIAorCSQoQU1fVl9DQ0xEKSQobGlianBlZ19sYV9MSU5LKSAtcnBhdGggJChsaWJkaXIpICQobGlianBlZ19sYV9PQkpFQ1RTKSAkKGxpYmpwZWdfbGFfTElCQUREKSAkKExJQlMpCitpbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGJpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKGJpbmRpcikiCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorCXNlZCAncy8kKEVYRUVYVCkkJC8vJyB8IFwKKwl3aGlsZSByZWFkIHAgcDE7IGRvIGlmIHRlc3QgLWYgJCRwIHx8IHRlc3QgLWYgJCRwMTsgXAorCSAgdGhlbiBlY2hvICIkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuO2gnIC1lICdzfC4qfC58JyBcCisJICAgIC1lICdwO3g7cywuKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLycgfCBcCisJc2VkICdOO047TjtzLFxuLCAsZycgfCBcCisJJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMSB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCAkJDMgIi8iICQkNCwgJCQxOyB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgJyQoREVTVERJUikkKGJpbmRpcikkJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoYmluZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitjbGVhbi1iaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CitjanBlZyQoRVhFRVhUKTogJChjanBlZ19PQkpFQ1RTKSAkKGNqcGVnX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGNqcGVnJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJChMSU5LKSAkKGNqcGVnX09CSkVDVFMpICQoY2pwZWdfTERBREQpICQoTElCUykKK2RqcGVnJChFWEVFWFQpOiAkKGRqcGVnX09CSkVDVFMpICQoZGpwZWdfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZGpwZWckKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKExJTkspICQoZGpwZWdfT0JKRUNUUykgJChkanBlZ19MREFERCkgJChMSUJTKQoranBlZ3RyYW4kKEVYRUVYVCk6ICQoanBlZ3RyYW5fT0JKRUNUUykgJChqcGVndHJhbl9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBqcGVndHJhbiQoRVhFRVhUKQorCSQoQU1fVl9DQ0xEKSQoTElOSykgJChqcGVndHJhbl9PQkpFQ1RTKSAkKGpwZWd0cmFuX0xEQUREKSAkKExJQlMpCityZGpwZ2NvbSQoRVhFRVhUKTogJChyZGpwZ2NvbV9PQkpFQ1RTKSAkKHJkanBnY29tX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHJkanBnY29tJChFWEVFWFQpCisJJChBTV9WX0NDTEQpJChMSU5LKSAkKHJkanBnY29tX09CSkVDVFMpICQocmRqcGdjb21fTERBREQpICQoTElCUykKK3dyanBnY29tJChFWEVFWFQpOiAkKHdyanBnY29tX09CSkVDVFMpICQod3JqcGdjb21fREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgd3JqcGdjb20kKEVYRUVYVCkKKwkkKEFNX1ZfQ0NMRCkkKExJTkspICQod3JqcGdjb21fT0JKRUNUUykgJCh3cmpwZ2NvbV9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworLi9hbnNpMmtucjogYW5zaTJrbnIuJChPQkpFWFQpCisJJChMSU5LKSBhbnNpMmtuci4kKE9CSkVYVCkgJChMSUJTKQorYW5zaTJrbnIuJChPQkpFWFQpOiAkKENPTkZJR19IRUFERVIpCisKK2NsZWFuLWtyZXh0cmE6CisJLXJtIC1mIGFuc2kya25yCisKK21vc3RseWNsZWFuLWtyOgorCS10ZXN0ICIkVSIgPSAiIiB8fCBybSAtZiAqXy5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ATUVNT1JZTUdSQCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY2RqcGVnJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NqcGVnJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2RqcGVnJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2phcmljb20kVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pjYXBpbWluJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qY2FwaXN0ZCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamNhcml0aCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamNjb2VmY3QkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pjY29sb3IkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pjZGN0bWdyJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qY2h1ZmYkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pjaW5pdCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamNtYWluY3QkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pjbWFya2VyJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qY21hc3RlciRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamNvbWFwaSRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamNwYXJhbSRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamNwcmVwY3QkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pjc2FtcGxlJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qY3RyYW5zJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qZGFwaW1pbiRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamRhcGlzdGQkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkYXJpdGgkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkYXRhZHN0JFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qZGF0YXNyYyRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamRjb2VmY3QkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkY29sb3IkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkZGN0bWdyJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qZGh1ZmYkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkaW5wdXQkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkbWFpbmN0JFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qZG1hcmtlciRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamRtYXN0ZXIkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkbWVyZ2UkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pkcG9zdGN0JFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qZHNhbXBsZSRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamR0cmFucyRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamVycm9yJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qZmRjdGZsdCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamZkY3Rmc3QkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pmZGN0aW50JFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qaWRjdGZsdCRVLlBsb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamlkY3Rmc3QkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2ppZGN0aW50JFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qbWVtbWdyJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qcGVndHJhbiRVLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qcXVhbnQxJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qcXVhbnQyJFUuUGxvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9qdXRpbHMkVS5QbG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JkYm1wJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JkY29sbWFwJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JkZ2lmJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JkanBnY29tJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JkcHBtJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JkcmxlJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3Jkc3dpdGNoJFUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JkdGFyZ2EkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdHJhbnN1cHAkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd3JibXAkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd3JnaWYkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd3JqcGdjb20kVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd3JwcG0kVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd3JybGUkVS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvd3J0YXJnYSRVLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQU1fVl9DQykkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChBTV9WX0NDKSBAQU1fQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX0NDKSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChBTV9WX2F0KSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfQ0MpJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKEFNX1ZfYXQpJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQU1fVl9DQykgQEFNX0JBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CitATUVNT1JZTUdSQF8uYzogQE1FTU9SWU1HUkAuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL0BNRU1PUllNR1JALmM7IHRoZW4gZWNobyAkKHNyY2RpcikvQE1FTU9SWU1HUkAuYzsgZWxzZSBlY2hvIEBNRU1PUllNR1JALmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2NkanBlZ18uYzogY2RqcGVnLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9jZGpwZWcuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9jZGpwZWcuYzsgZWxzZSBlY2hvIGNkanBlZy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitjanBlZ18uYzogY2pwZWcuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2NqcGVnLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvY2pwZWcuYzsgZWxzZSBlY2hvIGNqcGVnLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2RqcGVnXy5jOiBkanBlZy5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvZGpwZWcuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9kanBlZy5jOyBlbHNlIGVjaG8gZGpwZWcuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramFyaWNvbV8uYzogamFyaWNvbS5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamFyaWNvbS5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2phcmljb20uYzsgZWxzZSBlY2hvIGphcmljb20uYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramNhcGltaW5fLmM6IGpjYXBpbWluLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qY2FwaW1pbi5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pjYXBpbWluLmM7IGVsc2UgZWNobyBqY2FwaW1pbi5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqY2FwaXN0ZF8uYzogamNhcGlzdGQuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pjYXBpc3RkLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamNhcGlzdGQuYzsgZWxzZSBlY2hvIGpjYXBpc3RkLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pjYXJpdGhfLmM6IGpjYXJpdGguYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pjYXJpdGguYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qY2FyaXRoLmM7IGVsc2UgZWNobyBqY2FyaXRoLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pjY29lZmN0Xy5jOiBqY2NvZWZjdC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamNjb2VmY3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qY2NvZWZjdC5jOyBlbHNlIGVjaG8gamNjb2VmY3QuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramNjb2xvcl8uYzogamNjb2xvci5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamNjb2xvci5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pjY29sb3IuYzsgZWxzZSBlY2hvIGpjY29sb3IuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramNkY3RtZ3JfLmM6IGpjZGN0bWdyLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qY2RjdG1nci5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pjZGN0bWdyLmM7IGVsc2UgZWNobyBqY2RjdG1nci5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqY2h1ZmZfLmM6IGpjaHVmZi5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamNodWZmLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamNodWZmLmM7IGVsc2UgZWNobyBqY2h1ZmYuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramNpbml0Xy5jOiBqY2luaXQuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pjaW5pdC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pjaW5pdC5jOyBlbHNlIGVjaG8gamNpbml0LmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pjbWFpbmN0Xy5jOiBqY21haW5jdC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamNtYWluY3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qY21haW5jdC5jOyBlbHNlIGVjaG8gamNtYWluY3QuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramNtYXJrZXJfLmM6IGpjbWFya2VyLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qY21hcmtlci5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pjbWFya2VyLmM7IGVsc2UgZWNobyBqY21hcmtlci5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqY21hc3Rlcl8uYzogamNtYXN0ZXIuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pjbWFzdGVyLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamNtYXN0ZXIuYzsgZWxzZSBlY2hvIGpjbWFzdGVyLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pjb21hcGlfLmM6IGpjb21hcGkuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pjb21hcGkuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qY29tYXBpLmM7IGVsc2UgZWNobyBqY29tYXBpLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pjcGFyYW1fLmM6IGpjcGFyYW0uYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pjcGFyYW0uYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qY3BhcmFtLmM7IGVsc2UgZWNobyBqY3BhcmFtLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pjcHJlcGN0Xy5jOiBqY3ByZXBjdC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamNwcmVwY3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qY3ByZXBjdC5jOyBlbHNlIGVjaG8gamNwcmVwY3QuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramNzYW1wbGVfLmM6IGpjc2FtcGxlLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qY3NhbXBsZS5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pjc2FtcGxlLmM7IGVsc2UgZWNobyBqY3NhbXBsZS5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqY3RyYW5zXy5jOiBqY3RyYW5zLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qY3RyYW5zLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamN0cmFucy5jOyBlbHNlIGVjaG8gamN0cmFucy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqZGFwaW1pbl8uYzogamRhcGltaW4uYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pkYXBpbWluLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamRhcGltaW4uYzsgZWxzZSBlY2hvIGpkYXBpbWluLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pkYXBpc3RkXy5jOiBqZGFwaXN0ZC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRhcGlzdGQuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qZGFwaXN0ZC5jOyBlbHNlIGVjaG8gamRhcGlzdGQuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRhcml0aF8uYzogamRhcml0aC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRhcml0aC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkYXJpdGguYzsgZWxzZSBlY2hvIGpkYXJpdGguYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRhdGFkc3RfLmM6IGpkYXRhZHN0LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qZGF0YWRzdC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkYXRhZHN0LmM7IGVsc2UgZWNobyBqZGF0YWRzdC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqZGF0YXNyY18uYzogamRhdGFzcmMuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pkYXRhc3JjLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamRhdGFzcmMuYzsgZWxzZSBlY2hvIGpkYXRhc3JjLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pkY29lZmN0Xy5jOiBqZGNvZWZjdC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRjb2VmY3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qZGNvZWZjdC5jOyBlbHNlIGVjaG8gamRjb2VmY3QuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRjb2xvcl8uYzogamRjb2xvci5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRjb2xvci5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkY29sb3IuYzsgZWxzZSBlY2hvIGpkY29sb3IuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRkY3RtZ3JfLmM6IGpkZGN0bWdyLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qZGRjdG1nci5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkZGN0bWdyLmM7IGVsc2UgZWNobyBqZGRjdG1nci5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqZGh1ZmZfLmM6IGpkaHVmZi5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRodWZmLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamRodWZmLmM7IGVsc2UgZWNobyBqZGh1ZmYuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRpbnB1dF8uYzogamRpbnB1dC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRpbnB1dC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkaW5wdXQuYzsgZWxzZSBlY2hvIGpkaW5wdXQuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRtYWluY3RfLmM6IGpkbWFpbmN0LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qZG1haW5jdC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkbWFpbmN0LmM7IGVsc2UgZWNobyBqZG1haW5jdC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqZG1hcmtlcl8uYzogamRtYXJrZXIuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pkbWFya2VyLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamRtYXJrZXIuYzsgZWxzZSBlY2hvIGpkbWFya2VyLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pkbWFzdGVyXy5jOiBqZG1hc3Rlci5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRtYXN0ZXIuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qZG1hc3Rlci5jOyBlbHNlIGVjaG8gamRtYXN0ZXIuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRtZXJnZV8uYzogamRtZXJnZS5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamRtZXJnZS5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkbWVyZ2UuYzsgZWxzZSBlY2hvIGpkbWVyZ2UuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramRwb3N0Y3RfLmM6IGpkcG9zdGN0LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qZHBvc3RjdC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pkcG9zdGN0LmM7IGVsc2UgZWNobyBqZHBvc3RjdC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqZHNhbXBsZV8uYzogamRzYW1wbGUuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pkc2FtcGxlLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamRzYW1wbGUuYzsgZWxzZSBlY2hvIGpkc2FtcGxlLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pkdHJhbnNfLmM6IGpkdHJhbnMuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pkdHJhbnMuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qZHRyYW5zLmM7IGVsc2UgZWNobyBqZHRyYW5zLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2plcnJvcl8uYzogamVycm9yLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qZXJyb3IuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qZXJyb3IuYzsgZWxzZSBlY2hvIGplcnJvci5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqZmRjdGZsdF8uYzogamZkY3RmbHQuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pmZGN0Zmx0LmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamZkY3RmbHQuYzsgZWxzZSBlY2hvIGpmZGN0Zmx0LmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pmZGN0ZnN0Xy5jOiBqZmRjdGZzdC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamZkY3Rmc3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qZmRjdGZzdC5jOyBlbHNlIGVjaG8gamZkY3Rmc3QuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramZkY3RpbnRfLmM6IGpmZGN0aW50LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qZmRjdGludC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2pmZGN0aW50LmM7IGVsc2UgZWNobyBqZmRjdGludC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqaWRjdGZsdF8uYzogamlkY3RmbHQuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2ppZGN0Zmx0LmM7IHRoZW4gZWNobyAkKHNyY2RpcikvamlkY3RmbHQuYzsgZWxzZSBlY2hvIGppZGN0Zmx0LmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2ppZGN0ZnN0Xy5jOiBqaWRjdGZzdC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvamlkY3Rmc3QuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qaWRjdGZzdC5jOyBlbHNlIGVjaG8gamlkY3Rmc3QuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAoramlkY3RpbnRfLmM6IGppZGN0aW50LmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qaWRjdGludC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL2ppZGN0aW50LmM7IGVsc2UgZWNobyBqaWRjdGludC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqbWVtbWdyXy5jOiBqbWVtbWdyLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qbWVtbWdyLmM7IHRoZW4gZWNobyAkKHNyY2Rpcikvam1lbW1nci5jOyBlbHNlIGVjaG8gam1lbW1nci5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACitqcGVndHJhbl8uYzoganBlZ3RyYW4uYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pwZWd0cmFuLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvanBlZ3RyYW4uYzsgZWxzZSBlY2hvIGpwZWd0cmFuLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pxdWFudDFfLmM6IGpxdWFudDEuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pxdWFudDEuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qcXVhbnQxLmM7IGVsc2UgZWNobyBqcXVhbnQxLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2pxdWFudDJfLmM6IGpxdWFudDIuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL2pxdWFudDIuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qcXVhbnQyLmM7IGVsc2UgZWNobyBqcXVhbnQyLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK2p1dGlsc18uYzoganV0aWxzLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9qdXRpbHMuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9qdXRpbHMuYzsgZWxzZSBlY2hvIGp1dGlscy5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACityZGJtcF8uYzogcmRibXAuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3JkYm1wLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvcmRibXAuYzsgZWxzZSBlY2hvIHJkYm1wLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3JkY29sbWFwXy5jOiByZGNvbG1hcC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvcmRjb2xtYXAuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9yZGNvbG1hcC5jOyBlbHNlIGVjaG8gcmRjb2xtYXAuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorcmRnaWZfLmM6IHJkZ2lmLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9yZGdpZi5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3JkZ2lmLmM7IGVsc2UgZWNobyByZGdpZi5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACityZGpwZ2NvbV8uYzogcmRqcGdjb20uYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3JkanBnY29tLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvcmRqcGdjb20uYzsgZWxzZSBlY2hvIHJkanBnY29tLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3JkcHBtXy5jOiByZHBwbS5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvcmRwcG0uYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9yZHBwbS5jOyBlbHNlIGVjaG8gcmRwcG0uYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAorcmRybGVfLmM6IHJkcmxlLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS9yZHJsZS5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3JkcmxlLmM7IGVsc2UgZWNobyByZHJsZS5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACityZHN3aXRjaF8uYzogcmRzd2l0Y2guYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3Jkc3dpdGNoLmM7IHRoZW4gZWNobyAkKHNyY2RpcikvcmRzd2l0Y2guYzsgZWxzZSBlY2hvIHJkc3dpdGNoLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3JkdGFyZ2FfLmM6IHJkdGFyZ2EuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3JkdGFyZ2EuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS9yZHRhcmdhLmM7IGVsc2UgZWNobyByZHRhcmdhLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3RyYW5zdXBwXy5jOiB0cmFuc3VwcC5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2RpcikvdHJhbnN1cHAuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS90cmFuc3VwcC5jOyBlbHNlIGVjaG8gdHJhbnN1cHAuYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAord3JibXBfLmM6IHdyYm1wLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS93cmJtcC5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3dyYm1wLmM7IGVsc2UgZWNobyB3cmJtcC5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACit3cmdpZl8uYzogd3JnaWYuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3dyZ2lmLmM7IHRoZW4gZWNobyAkKHNyY2Rpcikvd3JnaWYuYzsgZWxzZSBlY2hvIHdyZ2lmLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3dyanBnY29tXy5jOiB3cmpwZ2NvbS5jICQoQU5TSTJLTlIpCisJJChDUFApICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBgaWYgdGVzdCAtZiAkKHNyY2Rpcikvd3JqcGdjb20uYzsgdGhlbiBlY2hvICQoc3JjZGlyKS93cmpwZ2NvbS5jOyBlbHNlIGVjaG8gd3JqcGdjb20uYzsgZmlgIHwgc2VkICdzL14jIFwoWzAtOV1cKS8jbGluZSBcMS8nIHwgJChBTlNJMktOUikgPiAkQCB8fCBybSAtZiAkQAord3JwcG1fLmM6IHdycHBtLmMgJChBTlNJMktOUikKKwkkKENQUCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIGBpZiB0ZXN0IC1mICQoc3JjZGlyKS93cnBwbS5jOyB0aGVuIGVjaG8gJChzcmNkaXIpL3dycHBtLmM7IGVsc2UgZWNobyB3cnBwbS5jOyBmaWAgfCBzZWQgJ3MvXiMgXChbMC05XVwpLyNsaW5lIFwxLycgfCAkKEFOU0kyS05SKSA+ICRAIHx8IHJtIC1mICRACit3cnJsZV8uYzogd3JybGUuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3dycmxlLmM7IHRoZW4gZWNobyAkKHNyY2Rpcikvd3JybGUuYzsgZWxzZSBlY2hvIHdycmxlLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK3dydGFyZ2FfLmM6IHdydGFyZ2EuYyAkKEFOU0kyS05SKQorCSQoQ1BQKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgYGlmIHRlc3QgLWYgJChzcmNkaXIpL3dydGFyZ2EuYzsgdGhlbiBlY2hvICQoc3JjZGlyKS93cnRhcmdhLmM7IGVsc2UgZWNobyB3cnRhcmdhLmM7IGZpYCB8IHNlZCAncy9eIyBcKFswLTldXCkvI2xpbmUgXDEvJyB8ICQoQU5TSTJLTlIpID4gJEAgfHwgcm0gLWYgJEAKK0BNRU1PUllNR1JAXy4kKE9CSkVYVCkgQE1FTU9SWU1HUkBfLmxvIGNkanBlZ18uJChPQkpFWFQpIGNkanBlZ18ubG8gXAorY2pwZWdfLiQoT0JKRVhUKSBjanBlZ18ubG8gZGpwZWdfLiQoT0JKRVhUKSBkanBlZ18ubG8gXAoramFyaWNvbV8uJChPQkpFWFQpIGphcmljb21fLmxvIGpjYXBpbWluXy4kKE9CSkVYVCkgamNhcGltaW5fLmxvIFwKK2pjYXBpc3RkXy4kKE9CSkVYVCkgamNhcGlzdGRfLmxvIGpjYXJpdGhfLiQoT0JKRVhUKSBqY2FyaXRoXy5sbyBcCitqY2NvZWZjdF8uJChPQkpFWFQpIGpjY29lZmN0Xy5sbyBqY2NvbG9yXy4kKE9CSkVYVCkgamNjb2xvcl8ubG8gXAoramNkY3RtZ3JfLiQoT0JKRVhUKSBqY2RjdG1ncl8ubG8gamNodWZmXy4kKE9CSkVYVCkgamNodWZmXy5sbyBcCitqY2luaXRfLiQoT0JKRVhUKSBqY2luaXRfLmxvIGpjbWFpbmN0Xy4kKE9CSkVYVCkgamNtYWluY3RfLmxvIFwKK2pjbWFya2VyXy4kKE9CSkVYVCkgamNtYXJrZXJfLmxvIGpjbWFzdGVyXy4kKE9CSkVYVCkgamNtYXN0ZXJfLmxvIFwKK2pjb21hcGlfLiQoT0JKRVhUKSBqY29tYXBpXy5sbyBqY3BhcmFtXy4kKE9CSkVYVCkgamNwYXJhbV8ubG8gXAoramNwcmVwY3RfLiQoT0JKRVhUKSBqY3ByZXBjdF8ubG8gamNzYW1wbGVfLiQoT0JKRVhUKSBqY3NhbXBsZV8ubG8gXAoramN0cmFuc18uJChPQkpFWFQpIGpjdHJhbnNfLmxvIGpkYXBpbWluXy4kKE9CSkVYVCkgamRhcGltaW5fLmxvIFwKK2pkYXBpc3RkXy4kKE9CSkVYVCkgamRhcGlzdGRfLmxvIGpkYXJpdGhfLiQoT0JKRVhUKSBqZGFyaXRoXy5sbyBcCitqZGF0YWRzdF8uJChPQkpFWFQpIGpkYXRhZHN0Xy5sbyBqZGF0YXNyY18uJChPQkpFWFQpIGpkYXRhc3JjXy5sbyBcCitqZGNvZWZjdF8uJChPQkpFWFQpIGpkY29lZmN0Xy5sbyBqZGNvbG9yXy4kKE9CSkVYVCkgamRjb2xvcl8ubG8gXAoramRkY3RtZ3JfLiQoT0JKRVhUKSBqZGRjdG1ncl8ubG8gamRodWZmXy4kKE9CSkVYVCkgamRodWZmXy5sbyBcCitqZGlucHV0Xy4kKE9CSkVYVCkgamRpbnB1dF8ubG8gamRtYWluY3RfLiQoT0JKRVhUKSBqZG1haW5jdF8ubG8gXAoramRtYXJrZXJfLiQoT0JKRVhUKSBqZG1hcmtlcl8ubG8gamRtYXN0ZXJfLiQoT0JKRVhUKSBqZG1hc3Rlcl8ubG8gXAoramRtZXJnZV8uJChPQkpFWFQpIGpkbWVyZ2VfLmxvIGpkcG9zdGN0Xy4kKE9CSkVYVCkgamRwb3N0Y3RfLmxvIFwKK2pkc2FtcGxlXy4kKE9CSkVYVCkgamRzYW1wbGVfLmxvIGpkdHJhbnNfLiQoT0JKRVhUKSBqZHRyYW5zXy5sbyBcCitqZXJyb3JfLiQoT0JKRVhUKSBqZXJyb3JfLmxvIGpmZGN0Zmx0Xy4kKE9CSkVYVCkgamZkY3RmbHRfLmxvIFwKK2pmZGN0ZnN0Xy4kKE9CSkVYVCkgamZkY3Rmc3RfLmxvIGpmZGN0aW50Xy4kKE9CSkVYVCkgamZkY3RpbnRfLmxvIFwKK2ppZGN0Zmx0Xy4kKE9CSkVYVCkgamlkY3RmbHRfLmxvIGppZGN0ZnN0Xy4kKE9CSkVYVCkgamlkY3Rmc3RfLmxvIFwKK2ppZGN0aW50Xy4kKE9CSkVYVCkgamlkY3RpbnRfLmxvIGptZW1tZ3JfLiQoT0JKRVhUKSBqbWVtbWdyXy5sbyBcCitqcGVndHJhbl8uJChPQkpFWFQpIGpwZWd0cmFuXy5sbyBqcXVhbnQxXy4kKE9CSkVYVCkganF1YW50MV8ubG8gXAoranF1YW50Ml8uJChPQkpFWFQpIGpxdWFudDJfLmxvIGp1dGlsc18uJChPQkpFWFQpIGp1dGlsc18ubG8gXAorcmRibXBfLiQoT0JKRVhUKSByZGJtcF8ubG8gcmRjb2xtYXBfLiQoT0JKRVhUKSByZGNvbG1hcF8ubG8gXAorcmRnaWZfLiQoT0JKRVhUKSByZGdpZl8ubG8gcmRqcGdjb21fLiQoT0JKRVhUKSByZGpwZ2NvbV8ubG8gXAorcmRwcG1fLiQoT0JKRVhUKSByZHBwbV8ubG8gcmRybGVfLiQoT0JKRVhUKSByZHJsZV8ubG8gXAorcmRzd2l0Y2hfLiQoT0JKRVhUKSByZHN3aXRjaF8ubG8gcmR0YXJnYV8uJChPQkpFWFQpIHJkdGFyZ2FfLmxvIFwKK3RyYW5zdXBwXy4kKE9CSkVYVCkgdHJhbnN1cHBfLmxvIHdyYm1wXy4kKE9CSkVYVCkgd3JibXBfLmxvIFwKK3dyZ2lmXy4kKE9CSkVYVCkgd3JnaWZfLmxvIHdyanBnY29tXy4kKE9CSkVYVCkgd3JqcGdjb21fLmxvIFwKK3dycHBtXy4kKE9CSkVYVCkgd3JwcG1fLmxvIHdycmxlXy4kKE9CSkVYVCkgd3JybGVfLmxvIFwKK3dydGFyZ2FfLiQoT0JKRVhUKSB3cnRhcmdhXy5sbyA6ICQoQU5TSTJLTlIpCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sIGNvbmZpZy5sdAoraW5zdGFsbC1tYW4xOiAkKG1hbl9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuMWRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjFkaXIpIgorCUBsaXN0PScnOyB0ZXN0IC1uICIkKG1hbjFkaXIpIiB8fCBleGl0IDA7IFwKKwl7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCBcCisJICBzZWQgLW4gJy9cLjFbYS16XSokJC9wJzsgXAorCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAorCWRvbmUgfCBcCisJc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteMV1bMC05YS16XSokJCwxLDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAorCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAorCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuMWRpciknIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuMWRpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZTsgfQorCit1bmluc3RhbGwtbWFuMToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PScnOyB0ZXN0IC1uICIkKG1hbjFkaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBlY2hvICIkJGkiOyBkb25lIHwgXAorCSAgc2VkIC1uICcvXC4xW2Etel0qJCQvcCc7IFwKKwl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW14xXVswLTlhLXpdKiQkLDEsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCisJdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuMWRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCSAgY2QgIiQoREVTVERJUikkKG1hbjFkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9CitpbnN0YWxsLWluY2x1ZGVIRUFERVJTOiAkKGluY2x1ZGVfSEVBREVSUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGluY2x1ZGVkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIKKwlAbGlzdD0nJChpbmNsdWRlX0hFQURFUlMpJzsgdGVzdCAtbiAiJChpbmNsdWRlZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBcCisJZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgZWNobyAiICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJyI7IFwKKwkgICQoSU5TVEFMTF9IRUFERVIpICQkZmlsZXMgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIiB8fCBleGl0ICQkPzsgXAorCWRvbmUKKwordW5pbnN0YWxsLWluY2x1ZGVIRUFERVJTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoaW5jbHVkZV9IRUFERVJTKSc7IHRlc3QgLW4gIiQoaW5jbHVkZWRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAkJHA7IGRvbmUgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7IFwKKwl0ZXN0IC1uICIkJGZpbGVzIiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoaW5jbHVkZWRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpIGpjb25maWcuY2ZnICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGpjb25maWcuY2ZnICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgamNvbmZpZy5jZmcgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgamNvbmZpZy5jZmcgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stbG9jYWwKK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKEFOU0kyS05SKSAkKExUTElCUkFSSUVTKSAkKFBST0dSQU1TKSAkKE1BTlMpIFwKKwkJJChIRUFERVJTKSBqY29uZmlnLmgKK2luc3RhbGwtYmluUFJPR1JBTVM6IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQobGliZGlyKSIgIiQoREVTVERJUikkKGJpbmRpcikiICIkKERFU1RESVIpJChtYW4xZGlyKSIgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1rcmV4dHJhIFwKKwljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWluY2x1ZGVIRUFERVJTIGluc3RhbGwtbWFuCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TIGluc3RhbGwtbGliTFRMSUJSQVJJRVMKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjEKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQorCS1ybSAtcmYgJCh0b3Bfc3JjZGlyKS9hdXRvbTR0ZS5jYWNoZQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4ta3IgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1pbmNsdWRlSEVBREVSUyBcCisJdW5pbnN0YWxsLWxpYkxUTElCUkFSSUVTIHVuaW5zdGFsbC1sb2NhbCB1bmluc3RhbGwtbWFuCisKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW4xCisKKy5NQUtFOiBhbGwgY2hlY2stYW0gaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBjaGVjay1hbSBjaGVjay1sb2NhbCBcCisJY2xlYW4gY2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1rcmV4dHJhIFwKKwljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi1saWJ0b29sIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBcCisJaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1iaW5QUk9HUkFNUyBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEtbG9jYWwgaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBcCisJaW5zdGFsbC1pbmNsdWRlSEVBREVSUyBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLWxpYkxUTElCUkFSSUVTIGluc3RhbGwtbWFuIGluc3RhbGwtbWFuMSBpbnN0YWxsLXBkZiBcCisJaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgXAorCWluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4ta3IgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgXAorCXBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAorCXVuaW5zdGFsbC1iaW5QUk9HUkFNUyB1bmluc3RhbGwtaW5jbHVkZUhFQURFUlMgXAorCXVuaW5zdGFsbC1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbG9jYWwgdW5pbnN0YWxsLW1hbiBcCisJdW5pbnN0YWxsLW1hbjEKKworCisjIEluc3RhbGwgamNvbmZpZy5oCitpbnN0YWxsLWRhdGEtbG9jYWw6CisJJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmNsdWRlZGlyKQorCSQoSU5TVEFMTF9IRUFERVIpIGpjb25maWcuaCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9qY29uZmlnLmgKKworIyBVbmluc3RhbGwgamNvbmZpZy5oCit1bmluc3RhbGwtbG9jYWw6CisJcm0gLWYgJChERVNURElSKSQoaW5jbHVkZWRpcikvamNvbmZpZy5oCisKKyMgUnVuIHRlc3RzCit0ZXN0OiBjaGVjay1sb2NhbAorY2hlY2stbG9jYWw6CisJJChSTSkgdGVzdG91dCoKKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKKwkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgICQoc3JjZGlyKS90ZXN0b3JpZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICAkKHNyY2RpcikvdGVzdGltZy5wcG0KKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyAkKHNyY2RpcikvdGVzdGltZy5wcG0KKwkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyAkKHNyY2RpcikvdGVzdHByb2cuanBnCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCAkKHNyY2RpcikvdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgJChzcmNkaXIpL3Rlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDg2Y2MyMDYuLmI1MDRkNzQgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTEsMjIgKzEsMTcgQEAKIFRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJFQURNRSBmb3IgcmVsZWFzZSA2YiBvZiAyNy1NYXItMTk5OAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSRUFETUUgZm9yIHJlbGVhc2UgNyBvZiAyNy1KdW4tMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhpcyBkaXN0cmlidXRpb24gY29udGFpbnMgdGhlIHNpeHRoIHB1YmxpYyByZWxlYXNlIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHCitUaGlzIGRpc3RyaWJ1dGlvbiBjb250YWlucyB0aGUgc2V2ZW50aCBwdWJsaWMgcmVsZWFzZSBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRwogR3JvdXAncyBmcmVlIEpQRUcgc29mdHdhcmUuICBZb3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCiB0byB1c2UgaXQgZm9yIGFueSBwdXJwb3NlLCBzdWJqZWN0IHRvIHRoZSBjb25kaXRpb25zIHVuZGVyIExFR0FMIElTU1VFUywgYmVsb3cuCiAKLVNlcmlvdXMgdXNlcnMgb2YgdGhpcyBzb2Z0d2FyZSAocGFydGljdWxhcmx5IHRob3NlIGluY29ycG9yYXRpbmcgaXQgaW50bwotbGFyZ2VyIHByb2dyYW1zKSBzaG91bGQgY29udGFjdCBJSkcgYXQganBlZy1pbmZvQHV1bmV0LnV1Lm5ldCB0byBiZSBhZGRlZCB0bwotb3VyIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0LiAgTWFpbGluZyBsaXN0IG1lbWJlcnMgYXJlIG5vdGlmaWVkIG9mIHVwZGF0ZXMKLWFuZCBoYXZlIGEgY2hhbmNlIHRvIHBhcnRpY2lwYXRlIGluIHRlY2huaWNhbCBkaXNjdXNzaW9ucywgZXRjLgotCi1UaGlzIHNvZnR3YXJlIGlzIHRoZSB3b3JrIG9mIFRvbSBMYW5lLCBQaGlsaXAgR2xhZHN0b25lLCBKaW0gQm91Y2hlciwKLUxlZSBDcm9ja2VyLCBKdWxpYW4gTWluZ3VpbGxvbiwgTHVpcyBPcnRpeiwgR2VvcmdlIFBoaWxsaXBzLCBEYXZpZGUgUm9zc2ksCi1HdWlkbyBWb2xsYmVkaW5nLCBHZScgV2VpamVycywgYW5kIG90aGVyIG1lbWJlcnMgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcKLUdyb3VwLgorVGhpcyBzb2Z0d2FyZSBpcyB0aGUgd29yayBvZiBUb20gTGFuZSwgR3VpZG8gVm9sbGJlZGluZywgUGhpbGlwIEdsYWRzdG9uZSwKK0JpbGwgQWxsb21iZXJ0LCBKaW0gQm91Y2hlciwgTGVlIENyb2NrZXIsIEJvYiBGcmllc2VuaGFobiwgQmVuIEphY2tzb24sCitKdWxpYW4gTWluZ3VpbGxvbiwgTHVpcyBPcnRpeiwgR2VvcmdlIFBoaWxsaXBzLCBEYXZpZGUgUm9zc2ksIEdlJyBXZWlqZXJzLAorYW5kIG90aGVyIG1lbWJlcnMgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAuCiAKIElKRyBpcyBub3QgYWZmaWxpYXRlZCB3aXRoIHRoZSBvZmZpY2lhbCBJU08gSlBFRyBzdGFuZGFyZHMgY29tbWl0dGVlLgogCkBAIC0zMCwyNyArMjUsMjcgQEAKIExFR0FMIElTU1VFUyAgICAgICAgQ29weXJpZ2h0LCBsYWNrIG9mIHdhcnJhbnR5LCB0ZXJtcyBvZiBkaXN0cmlidXRpb24uCiBSRUZFUkVOQ0VTICAgICAgICAgIFdoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgSlBFRy4KIEFSQ0hJVkUgTE9DQVRJT05TICAgV2hlcmUgdG8gZmluZCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlLgotUkVMQVRFRCBTT0ZUV0FSRSAgICBPdGhlciBzdHVmZiB5b3Ugc2hvdWxkIGdldC4KK0FDS05PV0xFREdNRU5UUyAgICAgU3BlY2lhbCB0aGFua3MuCiBGSUxFIEZPUk1BVCBXQVJTICAgIFNvZnR3YXJlICpub3QqIHRvIGdldC4KIFRPIERPICAgICAgICAgICAgICAgUGxhbnMgZm9yIGZ1dHVyZSBJSkcgcmVsZWFzZXMuCiAKIE90aGVyIGRvY3VtZW50YXRpb24gZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBhcmU6CiAKIFVzZXIgZG9jdW1lbnRhdGlvbjoKLSAgaW5zdGFsbC5kb2MgICAgICAgSG93IHRvIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbCB0aGUgSUpHIHNvZnR3YXJlLgotICB1c2FnZS5kb2MgICAgICAgICBVc2FnZSBpbnN0cnVjdGlvbnMgZm9yIGNqcGVnLCBkanBlZywganBlZ3RyYW4sCisgIGluc3RhbGwudHh0ICAgICAgIEhvdyB0byBjb25maWd1cmUgYW5kIGluc3RhbGwgdGhlIElKRyBzb2Z0d2FyZS4KKyAgdXNhZ2UudHh0ICAgICAgICAgVXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciBjanBlZywgZGpwZWcsIGpwZWd0cmFuLAogICAgICAgICAgICAgICAgICAgICByZGpwZ2NvbSwgYW5kIHdyanBnY29tLgotICAqLjEgICAgICAgICAgICAgICBVbml4LXN0eWxlIG1hbiBwYWdlcyBmb3IgcHJvZ3JhbXMgKHNhbWUgaW5mbyBhcyB1c2FnZS5kb2MpLgotICB3aXphcmQuZG9jICAgICAgICBBZHZhbmNlZCB1c2FnZSBpbnN0cnVjdGlvbnMgZm9yIEpQRUcgd2l6YXJkcyBvbmx5LgorICAqLjEgICAgICAgICAgICAgICBVbml4LXN0eWxlIG1hbiBwYWdlcyBmb3IgcHJvZ3JhbXMgKHNhbWUgaW5mbyBhcyB1c2FnZS50eHQpLgorICB3aXphcmQudHh0ICAgICAgICBBZHZhbmNlZCB1c2FnZSBpbnN0cnVjdGlvbnMgZm9yIEpQRUcgd2l6YXJkcyBvbmx5LgogICBjaGFuZ2UubG9nICAgICAgICBWZXJzaW9uLXRvLXZlcnNpb24gY2hhbmdlIGhpZ2hsaWdodHMuCiBQcm9ncmFtbWVyIGFuZCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uOgotICBsaWJqcGVnLmRvYyAgICAgICBIb3cgdG8gdXNlIHRoZSBKUEVHIGxpYnJhcnkgaW4geW91ciBvd24gcHJvZ3JhbXMuCisgIGxpYmpwZWcudHh0ICAgICAgIEhvdyB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSBpbiB5b3VyIG93biBwcm9ncmFtcy4KICAgZXhhbXBsZS5jICAgICAgICAgU2FtcGxlIGNvZGUgZm9yIGNhbGxpbmcgdGhlIEpQRUcgbGlicmFyeS4KLSAgc3RydWN0dXJlLmRvYyAgICAgT3ZlcnZpZXcgb2YgdGhlIEpQRUcgbGlicmFyeSdzIGludGVybmFsIHN0cnVjdHVyZS4KLSAgZmlsZWxpc3QuZG9jICAgICAgUm9hZCBtYXAgb2YgSUpHIGZpbGVzLgotICBjb2RlcnVsZXMuZG9jICAgICBDb2Rpbmcgc3R5bGUgcnVsZXMgLS0tIHBsZWFzZSByZWFkIGlmIHlvdSBjb250cmlidXRlIGNvZGUuCisgIHN0cnVjdHVyZS50eHQgICAgIE92ZXJ2aWV3IG9mIHRoZSBKUEVHIGxpYnJhcnkncyBpbnRlcm5hbCBzdHJ1Y3R1cmUuCisgIGZpbGVsaXN0LnR4dCAgICAgIFJvYWQgbWFwIG9mIElKRyBmaWxlcy4KKyAgY29kZXJ1bGVzLnR4dCAgICAgQ29kaW5nIHN0eWxlIHJ1bGVzIC0tLSBwbGVhc2UgcmVhZCBpZiB5b3UgY29udHJpYnV0ZSBjb2RlLgogCi1QbGVhc2UgcmVhZCBhdCBsZWFzdCB0aGUgZmlsZXMgaW5zdGFsbC5kb2MgYW5kIHVzYWdlLmRvYy4gIFVzZWZ1bCBpbmZvcm1hdGlvbgorUGxlYXNlIHJlYWQgYXQgbGVhc3QgdGhlIGZpbGVzIGluc3RhbGwudHh0IGFuZCB1c2FnZS50eHQuICBTb21lIGluZm9ybWF0aW9uCiBjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgSlBFRyBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zKSBhcnRpY2xlLiAgU2VlCiBBUkNISVZFIExPQ0FUSU9OUyBiZWxvdyB0byBmaW5kIG91dCB3aGVyZSB0byBvYnRhaW4gdGhlIEZBUSBhcnRpY2xlLgogCkBAIC02MiwyNCArNTcsMTUgQEAKIE9WRVJWSUVXCiA9PT09PT09PQogCi1UaGlzIHBhY2thZ2UgY29udGFpbnMgQyBzb2Z0d2FyZSB0byBpbXBsZW1lbnQgSlBFRyBpbWFnZSBjb21wcmVzc2lvbiBhbmQKLWRlY29tcHJlc3Npb24uICBKUEVHIChwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24KLW1ldGhvZCBmb3IgZnVsbC1jb2xvciBhbmQgZ3JheS1zY2FsZSBpbWFnZXMuICBKUEVHIGlzIGludGVuZGVkIGZvciBjb21wcmVzc2luZwotInJlYWwtd29ybGQiIHNjZW5lczsgbGluZSBkcmF3aW5ncywgY2FydG9vbnMgYW5kIG90aGVyIG5vbi1yZWFsaXN0aWMgaW1hZ2VzCi1hcmUgbm90IGl0cyBzdHJvbmcgc3VpdC4gIEpQRUcgaXMgbG9zc3ksIG1lYW5pbmcgdGhhdCB0aGUgb3V0cHV0IGltYWdlIGlzIG5vdAotZXhhY3RseSBpZGVudGljYWwgdG8gdGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IG11c3Qgbm90IHVzZSBKUEVHIGlmIHlvdQotaGF2ZSB0byBoYXZlIGlkZW50aWNhbCBvdXRwdXQgYml0cy4gIEhvd2V2ZXIsIG9uIHR5cGljYWwgcGhvdG9ncmFwaGljIGltYWdlcywKLXZlcnkgZ29vZCBjb21wcmVzc2lvbiBsZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZAotcmVtYXJrYWJseSBoaWdoIGNvbXByZXNzaW9uIGxldmVscyBhcmUgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhCi1sb3ctcXVhbGl0eSBpbWFnZS4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVmZXJlbmNlcywgb3IganVzdCBleHBlcmltZW50Ci13aXRoIHZhcmlvdXMgY29tcHJlc3Npb24gc2V0dGluZ3MuCitUaGlzIHBhY2thZ2UgY29udGFpbnMgQyBzb2Z0d2FyZSB0byBpbXBsZW1lbnQgSlBFRyBpbWFnZSBlbmNvZGluZywgZGVjb2RpbmcsCithbmQgdHJhbnNjb2RpbmcuICBKUEVHIChwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24KK21ldGhvZCBmb3IgZnVsbC1jb2xvciBhbmQgZ3JheS1zY2FsZSBpbWFnZXMuCiAKIFRoaXMgc29mdHdhcmUgaW1wbGVtZW50cyBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZC1zZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUKIGNvbXByZXNzaW9uIHByb2Nlc3Nlcy4gIFByb3Zpc2lvbiBpcyBtYWRlIGZvciBzdXBwb3J0aW5nIGFsbCB2YXJpYW50cyBvZiB0aGVzZQogcHJvY2Vzc2VzLCBhbHRob3VnaCBzb21lIHVuY29tbW9uIHBhcmFtZXRlciBzZXR0aW5ncyBhcmVuJ3QgaW1wbGVtZW50ZWQgeWV0LgotRm9yIGxlZ2FsIHJlYXNvbnMsIHdlIGFyZSBub3QgZGlzdHJpYnV0aW5nIGNvZGUgZm9yIHRoZSBhcml0aG1ldGljLWNvZGluZwotdmFyaWFudHMgb2YgSlBFRzsgc2VlIExFR0FMIElTU1VFUy4gIFdlIGhhdmUgbWFkZSBubyBwcm92aXNpb24gZm9yIHN1cHBvcnRpbmcKLXRoZSBoaWVyYXJjaGljYWwgb3IgbG9zc2xlc3MgcHJvY2Vzc2VzIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLgorV2UgaGF2ZSBtYWRlIG5vIHByb3Zpc2lvbiBmb3Igc3VwcG9ydGluZyB0aGUgaGllcmFyY2hpY2FsIG9yIGxvc3NsZXNzCitwcm9jZXNzZXMgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQuCiAKIFdlIHByb3ZpZGUgYSBzZXQgb2YgbGlicmFyeSByb3V0aW5lcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBKUEVHIGltYWdlIGZpbGVzLAogcGx1cyB0d28gc2FtcGxlIGFwcGxpY2F0aW9ucyAiY2pwZWciIGFuZCAiZGpwZWciLCB3aGljaCB1c2UgdGhlIGxpYnJhcnkgdG8KQEAgLTkxLDEwICs3NywxMSBAQAogZm9yIGV4YW1wbGUsIHRoZSBjb2xvciBxdWFudGl6YXRpb24gbW9kdWxlcyBhcmUgbm90IHN0cmljdGx5IHBhcnQgb2YgSlBFRwogZGVjb2RpbmcsIGJ1dCB0aGV5IGFyZSBlc3NlbnRpYWwgZm9yIG91dHB1dCB0byBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdHMgb3IKIGNvbG9ybWFwcGVkIGRpc3BsYXlzLiAgVGhlc2UgZXh0cmEgZnVuY3Rpb25zIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlCi1saWJyYXJ5IGlmIG5vdCByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiAgV2UgaGF2ZSBhbHNvIGluY2x1ZGVkCi0ianBlZ3RyYW4iLCBhIHV0aWxpdHkgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50IEpQRUcKLXByb2Nlc3NlcywgYW5kICJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIsIHR3byBzaW1wbGUgYXBwbGljYXRpb25zIGZvcgotaW5zZXJ0aW5nIGFuZCBleHRyYWN0aW5nIHRleHR1YWwgY29tbWVudHMgaW4gSkZJRiBmaWxlcy4KK2xpYnJhcnkgaWYgbm90IHJlcXVpcmVkIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uCisKK1dlIGhhdmUgYWxzbyBpbmNsdWRlZCAianBlZ3RyYW4iLCBhIHV0aWxpdHkgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4KK2RpZmZlcmVudCBKUEVHIHByb2Nlc3NlcywgYW5kICJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIsIHR3byBzaW1wbGUKK2FwcGxpY2F0aW9ucyBmb3IgaW5zZXJ0aW5nIGFuZCBleHRyYWN0aW5nIHRleHR1YWwgY29tbWVudHMgaW4gSkZJRiBmaWxlcy4KIAogVGhlIGVtcGhhc2lzIGluIGRlc2lnbmluZyB0aGlzIHNvZnR3YXJlIGhhcyBiZWVuIG9uIGFjaGlldmluZyBwb3J0YWJpbGl0eSBhbmQKIGZsZXhpYmlsaXR5LCB3aGlsZSBhbHNvIG1ha2luZyBpdCBmYXN0IGVub3VnaCB0byBiZSB1c2VmdWwuICBJbiBwYXJ0aWN1bGFyLApAQCAtMTI3LDcgKzExNCw3IEBACiBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kIHlvdSwKIGl0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KIAotVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0yMDA5LCBUaG9tYXMgRy4gTGFuZSwgR3VpZG8gVm9sbGJlZGluZy4KIEFsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwpAQCAtMTcwLDE3ICsxNTcsOCBAQAogVGhlIFVuaXggY29uZmlndXJhdGlvbiBzY3JpcHQgImNvbmZpZ3VyZSIgd2FzIHByb2R1Y2VkIHdpdGggR05VIEF1dG9jb25mLgogSXQgaXMgY29weXJpZ2h0IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYnV0IGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLgogVGhlIHNhbWUgaG9sZHMgZm9yIGl0cyBzdXBwb3J0aW5nIHNjcmlwdHMgKGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwKLWx0Y29uZmlnLCBsdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0Ci1ieSBNLkkuVC4gYnV0IGlzIGFsc28gZnJlZWx5IGRpc3RyaWJ1dGFibGUuCi0KLUl0IGFwcGVhcnMgdGhhdCB0aGUgYXJpdGhtZXRpYyBjb2Rpbmcgb3B0aW9uIG9mIHRoZSBKUEVHIHNwZWMgaXMgY292ZXJlZCBieQotcGF0ZW50cyBvd25lZCBieSBJQk0sIEFUJlQsIGFuZCBNaXRzdWJpc2hpLiAgSGVuY2UgYXJpdGhtZXRpYyBjb2RpbmcgY2Fubm90Ci1sZWdhbGx5IGJlIHVzZWQgd2l0aG91dCBvYnRhaW5pbmcgb25lIG9yIG1vcmUgbGljZW5zZXMuICBGb3IgdGhpcyByZWFzb24sCi1zdXBwb3J0IGZvciBhcml0aG1ldGljIGNvZGluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGZyZWUgSlBFRyBzb2Z0d2FyZS4KLShTaW5jZSBhcml0aG1ldGljIGNvZGluZyBwcm92aWRlcyBvbmx5IGEgbWFyZ2luYWwgZ2FpbiBvdmVyIHRoZSB1bnBhdGVudGVkCi1IdWZmbWFuIG1vZGUsIGl0IGlzIHVubGlrZWx5IHRoYXQgdmVyeSBtYW55IGltcGxlbWVudGF0aW9ucyB3aWxsIHN1cHBvcnQgaXQuKQotU28gZmFyIGFzIHdlIGFyZSBhd2FyZSwgdGhlcmUgYXJlIG5vIHBhdGVudCByZXN0cmljdGlvbnMgb24gdGhlIHJlbWFpbmluZwotY29kZS4KK2x0bWFpbi5zaCkuICBBbm90aGVyIHN1cHBvcnQgc2NyaXB0LCBpbnN0YWxsLXNoLCBpcyBjb3B5cmlnaHQgYnkgWCBDb25zb3J0aXVtCitidXQgaXMgYWxzbyBmcmVlbHkgZGlzdHJpYnV0YWJsZS4KIAogVGhlIElKRyBkaXN0cmlidXRpb24gZm9ybWVybHkgaW5jbHVkZWQgY29kZSB0byByZWFkIGFuZCB3cml0ZSBHSUYgZmlsZXMuCiBUbyBhdm9pZCBlbnRhbmdsZW1lbnQgd2l0aCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIEdJRiByZWFkaW5nIHN1cHBvcnQgaGFzCkBAIC0xOTgsNyArMTc2LDcgQEAKIFJFRkVSRU5DRVMKID09PT09PT09PT0KIAotV2UgaGlnaGx5IHJlY29tbWVuZCByZWFkaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlZmVyZW5jZXMgYmVmb3JlIHRyeWluZyB0bworV2UgcmVjb21tZW5kIHJlYWRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVmZXJlbmNlcyBiZWZvcmUgdHJ5aW5nIHRvCiB1bmRlcnN0YW5kIHRoZSBpbm5hcmRzIG9mIHRoZSBKUEVHIHNvZnR3YXJlLgogCiBUaGUgYmVzdCBzaG9ydCB0ZWNobmljYWwgaW50cm9kdWN0aW9uIHRvIHRoZSBKUEVHIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcwpAQCAtMjA3LDcgKzE4NSw3IEBACiAoQWRqYWNlbnQgYXJ0aWNsZXMgaW4gdGhhdCBpc3N1ZSBkaXNjdXNzIE1QRUcgbW90aW9uIHBpY3R1cmUgY29tcHJlc3Npb24sCiBhcHBsaWNhdGlvbnMgb2YgSlBFRywgYW5kIHJlbGF0ZWQgdG9waWNzLikgIElmIHlvdSBkb24ndCBoYXZlIHRoZSBDQUNNIGlzc3VlCiBoYW5keSwgYSBQb3N0U2NyaXB0IGZpbGUgY29udGFpbmluZyBhIHJldmlzZWQgdmVyc2lvbiBvZiBXYWxsYWNlJ3MgYXJ0aWNsZSBpcwotYXZhaWxhYmxlIGF0IGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy93YWxsYWNlLnBzLmd6LiAgVGhlIGZpbGUgKGFjdHVhbGx5CithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5pamcub3JnL2ZpbGVzL3dhbGxhY2UucHMuZ3ouICBUaGUgZmlsZSAoYWN0dWFsbHkKIGEgcHJlcHJpbnQgZm9yIGFuIGFydGljbGUgdGhhdCBhcHBlYXJlZCBpbiBJRUVFIFRyYW5zLiBDb25zdW1lciBFbGVjdHJvbmljcykKIG9taXRzIHRoZSBzYW1wbGUgaW1hZ2VzIHRoYXQgYXBwZWFyZWQgaW4gQ0FDTSwgYnV0IGl0IGluY2x1ZGVzIGNvcnJlY3Rpb25zCiBhbmQgc29tZSBhZGRlZCBtYXRlcmlhbC4gIE5vdGU6IHRoZSBXYWxsYWNlIGFydGljbGUgaXMgY29weXJpZ2h0IEFDTSBhbmQgSUVFRSwKQEAgLTIyMiwzMyArMjAwLDI4IEBACiBzYW1wbGUgY29kZSBpcyBmYXIgZnJvbSBpbmR1c3RyaWFsLXN0cmVuZ3RoLCBidXQgd2hlbiB5b3UgYXJlIHJlYWR5IHRvIGxvb2sKIGF0IGEgZnVsbCBpbXBsZW1lbnRhdGlvbiwgeW91J3ZlIGdvdCBvbmUgaGVyZS4uLgogCi1UaGUgYmVzdCBmdWxsIGRlc2NyaXB0aW9uIG9mIEpQRUcgaXMgdGhlIHRleHRib29rICJKUEVHIFN0aWxsIEltYWdlIERhdGEKLUNvbXByZXNzaW9uIFN0YW5kYXJkIiBieSBXaWxsaWFtIEIuIFBlbm5lYmFrZXIgYW5kIEpvYW4gTC4gTWl0Y2hlbGwsIHB1Ymxpc2hlZAotYnkgVmFuIE5vc3RyYW5kIFJlaW5ob2xkLCAxOTkzLCBJU0JOIDAtNDQyLTAxMjcyLTEuICBQcmljZSBVUyQ1OS45NSwgNjM4IHBwLgotVGhlIGJvb2sgaW5jbHVkZXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlIElTTyBKUEVHIHN0YW5kYXJkcyAoRElTIDEwOTE4LTEKLWFuZCBkcmFmdCBESVMgMTA5MTgtMikuICBUaGlzIGlzIGJ5IGZhciB0aGUgbW9zdCBjb21wbGV0ZSBleHBvc2l0aW9uIG9mIEpQRUcKLWluIGV4aXN0ZW5jZSwgYW5kIHdlIGhpZ2hseSByZWNvbW1lbmQgaXQuCitUaGUgYmVzdCBjdXJyZW50bHkgYXZhaWxhYmxlIGRlc2NyaXB0aW9uIG9mIEpQRUcgaXMgdGhlIHRleHRib29rICJKUEVHIFN0aWxsCitJbWFnZSBEYXRhIENvbXByZXNzaW9uIFN0YW5kYXJkIiBieSBXaWxsaWFtIEIuIFBlbm5lYmFrZXIgYW5kIEpvYW4gTC4KK01pdGNoZWxsLCBwdWJsaXNoZWQgYnkgVmFuIE5vc3RyYW5kIFJlaW5ob2xkLCAxOTkzLCBJU0JOIDAtNDQyLTAxMjcyLTEuCitQcmljZSBVUyQ1OS45NSwgNjM4IHBwLiAgVGhlIGJvb2sgaW5jbHVkZXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlIElTTyBKUEVHCitzdGFuZGFyZHMgKERJUyAxMDkxOC0xIGFuZCBkcmFmdCBESVMgMTA5MTgtMikuCitBbHRob3VnaCB0aGlzIGlzIGJ5IGZhciB0aGUgbW9zdCBkZXRhaWxlZCBhbmQgY29tcHJlaGVuc2l2ZSBleHBvc2l0aW9uIG9mCitKUEVHIHB1YmxpY2x5IGF2YWlsYWJsZSwgd2UgcG9pbnQgb3V0IHRoYXQgaXQgaXMgc3RpbGwgbWlzc2luZyBhbiBleHBsYW5hdGlvbgorb2YgdGhlIG1vc3QgZXNzZW50aWFsIHByb3BlcnRpZXMgYW5kIGFsZ29yaXRobXMgb2YgdGhlIHVuZGVybHlpbmcgRENUCit0ZWNobm9sb2d5LgorSWYgeW91IHRoaW5rIHRoYXQgeW91IGtub3cgYWJvdXQgRENULWJhc2VkIEpQRUcgYWZ0ZXIgcmVhZGluZyB0aGlzIGJvb2ssCit0aGVuIHlvdSBhcmUgaW4gZGVsdXNpb24uICBUaGUgcmVhbCBmdW5kYW1lbnRhbHMgYW5kIGNvcnJlc3BvbmRpbmcgcG90ZW50aWFsCitvZiBEQ1QtYmFzZWQgSlBFRyBhcmUgbm90IHB1YmxpY2x5IGtub3duIHNvIGZhciwgYW5kIHRoYXQgaXMgdGhlIHJlYXNvbiBmb3IKK2FsbCB0aGUgbWlzdGFrZW4gZGV2ZWxvcG1lbnRzIHRha2luZyBwbGFjZSBpbiB0aGUgaW1hZ2UgY29kaW5nIGRvbWFpbi4KIAotVGhlIEpQRUcgc3RhbmRhcmQgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUgZWxlY3Ryb25pY2FsbHk7IHlvdSBtdXN0IG9yZGVyIGEKLXBhcGVyIGNvcHkgdGhyb3VnaCBJU08gb3IgSVRVLiAgKFVubGVzcyB5b3UgZmVlbCBhIG5lZWQgdG8gb3duIGEgY2VydGlmaWVkCi1vZmZpY2lhbCBjb3B5LCB3ZSByZWNvbW1lbmQgYnV5aW5nIHRoZSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbCBib29rIGluc3RlYWQ7Ci1pdCdzIG11Y2ggY2hlYXBlciBhbmQgaW5jbHVkZXMgYSBncmVhdCBkZWFsIG9mIHVzZWZ1bCBleHBsYW5hdG9yeSBtYXRlcmlhbC4pCi1JbiB0aGUgVVNBLCBjb3BpZXMgb2YgdGhlIHN0YW5kYXJkIG1heSBiZSBvcmRlcmVkIGZyb20gQU5TSSBTYWxlcyBhdCAoMjEyKQotNjQyLTQ5MDAsIG9yIGZyb20gR2xvYmFsIEVuZ2luZWVyaW5nIERvY3VtZW50cyBhdCAoODAwKSA4NTQtNzE3OS4gIChBTlNJCi1kb2Vzbid0IHRha2UgY3JlZGl0IGNhcmQgb3JkZXJzLCBidXQgR2xvYmFsIGRvZXMuKSAgSXQncyBub3QgY2hlYXA6IGFzIG9mCi0xOTkyLCBBTlNJIHdhcyBjaGFyZ2luZyAkOTUgZm9yIFBhcnQgMSBhbmQgJDQ3IGZvciBQYXJ0IDIsIHBsdXMgNyUKLXNoaXBwaW5nL2hhbmRsaW5nLiAgVGhlIHN0YW5kYXJkIGlzIGRpdmlkZWQgaW50byB0d28gcGFydHMsIFBhcnQgMSBiZWluZyB0aGUKLWFjdHVhbCBzcGVjaWZpY2F0aW9uLCB3aGlsZSBQYXJ0IDIgY292ZXJzIGNvbXBsaWFuY2UgdGVzdGluZyBtZXRob2RzLiAgUGFydCAxCi1pcyB0aXRsZWQgIkRpZ2l0YWwgQ29tcHJlc3Npb24gYW5kIENvZGluZyBvZiBDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLAorVGhlIG9yaWdpbmFsIEpQRUcgc3RhbmRhcmQgaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0cywgUGFydCAxIGJlaW5nIHRoZSBhY3R1YWwKK3NwZWNpZmljYXRpb24sIHdoaWxlIFBhcnQgMiBjb3ZlcnMgY29tcGxpYW5jZSB0ZXN0aW5nIG1ldGhvZHMuICBQYXJ0IDEgaXMKK3RpdGxlZCAiRGlnaXRhbCBDb21wcmVzc2lvbiBhbmQgQ29kaW5nIG9mIENvbnRpbnVvdXMtdG9uZSBTdGlsbCBJbWFnZXMsCiBQYXJ0IDE6IFJlcXVpcmVtZW50cyBhbmQgZ3VpZGVsaW5lcyIgYW5kIGhhcyBkb2N1bWVudCBudW1iZXJzIElTTy9JRUMgSVMKIDEwOTE4LTEsIElUVS1UIFQuODEuICBQYXJ0IDIgaXMgdGl0bGVkICJEaWdpdGFsIENvbXByZXNzaW9uIGFuZCBDb2Rpbmcgb2YKIENvbnRpbnVvdXMtdG9uZSBTdGlsbCBJbWFnZXMsIFBhcnQgMjogQ29tcGxpYW5jZSB0ZXN0aW5nIiBhbmQgaGFzIGRvY3VtZW50CiBudW1iZXJzIElTTy9JRUMgSVMgMTA5MTgtMiwgSVRVLVQgVC44My4KIAotU29tZSBleHRlbnNpb25zIHRvIHRoZSBvcmlnaW5hbCBKUEVHIHN0YW5kYXJkIGFyZSBkZWZpbmVkIGluIEpQRUcgUGFydCAzLAotYSBuZXdlciBJU08gc3RhbmRhcmQgbnVtYmVyZWQgSVNPL0lFQyBJUyAxMDkxOC0zIGFuZCBJVFUtVCBULjg0LiAgSUpHCi1jdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBhbnkgUGFydCAzIGV4dGVuc2lvbnMuCi0KIFRoZSBKUEVHIHN0YW5kYXJkIGRvZXMgbm90IHNwZWNpZnkgYWxsIGRldGFpbHMgb2YgYW4gaW50ZXJjaGFuZ2VhYmxlIGZpbGUKIGZvcm1hdC4gIEZvciB0aGUgb21pdHRlZCBkZXRhaWxzIHdlIGZvbGxvdyB0aGUgIkpGSUYiIGNvbnZlbnRpb25zLCByZXZpc2lvbgogMS4wMi4gIEEgY29weSBvZiB0aGUgSkZJRiBzcGVjIGlzIGF2YWlsYWJsZSBmcm9tOgpAQCAtMjU3LDQ3ICsyMzAsMzMgQEAKIAkxNzc4IE1jQ2FydGh5IEJsdmQuCiAJTWlscGl0YXMsIENBIDk1MDM1CiAJcGhvbmUgKDQwOCkgOTQ0LTYzMDAsICBmYXggKDQwOCkgOTQ0LTYzMTQKLUEgUG9zdFNjcmlwdCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGJ5IEZUUCBhdAotZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pmaWYucHMuZ3ouICBUaGVyZSBpcyBhbHNvIGEgcGxhaW4gdGV4dAotdmVyc2lvbiBhdCBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL2pwZWcvamZpZi50eHQuZ3osIGJ1dCBpdCBpcyBtaXNzaW5nCi10aGUgZmlndXJlcy4KK0EgUG9zdFNjcmlwdCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmlqZy5vcmcvZmlsZXMvamZpZi5wcy5nei4gIFRoZXJlIGlzIGFsc28gYSBwbGFpbiB0ZXh0IHZlcnNpb24gYXQKK2h0dHA6Ly93d3cuaWpnLm9yZy9maWxlcy9qZmlmLnR4dC5neiwgYnV0IGl0IGlzIG1pc3NpbmcgdGhlIGZpZ3VyZXMuCiAKIFRoZSBUSUZGIDYuMCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBGVFAgZnJvbQogZnRwOi8vZnRwLnNnaS5jb20vZ3JhcGhpY3MvdGlmZi9USUZGNi5wcy5nei4gIFRoZSBKUEVHIGluY29ycG9yYXRpb24gc2NoZW1lCiBmb3VuZCBpbiB0aGUgVElGRiA2LjAgc3BlYyBvZiAzLUp1bmUtOTIgaGFzIGEgbnVtYmVyIG9mIHNlcmlvdXMgcHJvYmxlbXMuCiBJSkcgZG9lcyBub3QgcmVjb21tZW5kIHVzZSBvZiB0aGUgVElGRiA2LjAgZGVzaWduIChUSUZGIENvbXByZXNzaW9uIHRhZyA2KS4KIEluc3RlYWQsIHdlIHJlY29tbWVuZCB0aGUgSlBFRyBkZXNpZ24gcHJvcG9zZWQgYnkgVElGRiBUZWNobmljYWwgTm90ZSAjMgotKENvbXByZXNzaW9uIHRhZyA3KS4gIENvcGllcyBvZiB0aGlzIE5vdGUgY2FuIGJlIG9idGFpbmVkIGZyb20gZnRwLnNnaS5jb20gb3IKLWZyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnLy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIG5leHQgcmV2aXNpb24KKyhDb21wcmVzc2lvbiB0YWcgNykuICBDb3BpZXMgb2YgdGhpcyBOb3RlIGNhbiBiZSBvYnRhaW5lZCBmcm9tCitodHRwOi8vd3d3LmlqZy5vcmcvZmlsZXMvLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgbmV4dCByZXZpc2lvbgogb2YgdGhlIFRJRkYgc3BlYyB3aWxsIHJlcGxhY2UgdGhlIDYuMCBKUEVHIGRlc2lnbiB3aXRoIHRoZSBOb3RlJ3MgZGVzaWduLgogQWx0aG91Z2ggSUpHJ3Mgb3duIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBUSUZGL0pQRUcsIHRoZSBmcmVlIGxpYnRpZmYgbGlicmFyeQotdXNlcyBvdXIgbGlicmFyeSB0byBpbXBsZW1lbnQgVElGRi9KUEVHIHBlciB0aGUgTm90ZS4gIGxpYnRpZmYgaXMgYXZhaWxhYmxlCi1mcm9tIGZ0cDovL2Z0cC5zZ2kuY29tL2dyYXBoaWNzL3RpZmYvLgordXNlcyBvdXIgbGlicmFyeSB0byBpbXBsZW1lbnQgVElGRi9KUEVHIHBlciB0aGUgTm90ZS4KIAogCiBBUkNISVZFIExPQ0FUSU9OUwogPT09PT09PT09PT09PT09PT0KIAotVGhlICJvZmZpY2lhbCIgYXJjaGl2ZSBzaXRlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGZ0cC51dS5uZXQgKEludGVybmV0Ci1hZGRyZXNzIDE5Mi40OC45Ni45KS4gIFRoZSBtb3N0IHJlY2VudCByZWxlYXNlZCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQKLXRoZXJlIGluIGRpcmVjdG9yeSBncmFwaGljcy9qcGVnLiAgVGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24gd2lsbCBiZSBhcmNoaXZlZAotYXMgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pwZWdzcmMudjZiLnRhci5nei4gIElmIHlvdSBkb24ndCBoYXZlCi1kaXJlY3QgSW50ZXJuZXQgYWNjZXNzLCBVVU5FVCdzIGFyY2hpdmVzIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgVVVDUDsgY29udGFjdAotaGVscEB1dW5ldC51dS5uZXQgZm9yIGluZm9ybWF0aW9uIG9uIHJldHJpZXZpbmcgZmlsZXMgdGhhdCB3YXkuCitUaGUgIm9mZmljaWFsIiBhcmNoaXZlIHNpdGUgZm9yIHRoaXMgc29mdHdhcmUgaXMgd3d3LmlqZy5vcmcuCitUaGUgbW9zdCByZWNlbnQgcmVsZWFzZWQgdmVyc2lvbiBjYW4gYWx3YXlzIGJlIGZvdW5kIHRoZXJlIGluCitkaXJlY3RvcnkgImZpbGVzIi4gIFRoaXMgcGFydGljdWxhciB2ZXJzaW9uIHdpbGwgYmUgYXJjaGl2ZWQgYXMKK2h0dHA6Ly93d3cuaWpnLm9yZy9maWxlcy9qcGVnc3JjLnY3LnRhci5neiwgYW5kIGluIFdpbmRvd3MtY29tcGF0aWJsZQorInppcCIgYXJjaGl2ZSBmb3JtYXQgYXMgaHR0cDovL3d3dy5pamcub3JnL2ZpbGVzL2pwZWdzcjcuemlwLgogCi1OdW1lcm91cyBJbnRlcm5ldCBzaXRlcyBtYWludGFpbiBjb3BpZXMgb2YgdGhlIFVVTkVUIGZpbGVzLiAgSG93ZXZlciwgb25seQotZnRwLnV1Lm5ldCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIGxhdGVzdCBvZmZpY2lhbCB2ZXJzaW9uLgotCi1Zb3UgY2FuIGFsc28gb2J0YWluIHRoaXMgc29mdHdhcmUgaW4gRE9TLWNvbXBhdGlibGUgInppcCIgYXJjaGl2ZSBmb3JtYXQgZnJvbQotdGhlIFNpbVRlbCBhcmNoaXZlcyAoZnRwOi8vZnRwLnNpbXRlbC5uZXQvcHViL3NpbXRlbG5ldC9tc2Rvcy9ncmFwaGljcy8pLCBvcgotb24gQ29tcHVTZXJ2ZSBpbiB0aGUgR3JhcGhpY3MgU3VwcG9ydCBmb3J1bSAoR08gQ0lTOkdSQVBIU1VQKSwgbGlicmFyeSAxMgotIkpQRUcgVG9vbHMiLiAgQWdhaW4sIHRoZXNlIHZlcnNpb25zIG1heSBzb21ldGltZXMgbGFnIGJlaGluZCB0aGUgZnRwLnV1Lm5ldAotcmVsZWFzZS4KLQotVGhlIEpQRUcgRkFRIChGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucykgYXJ0aWNsZSBpcyBhIHVzZWZ1bCBzb3VyY2Ugb2YKLWdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgSlBFRy4gIEl0IGlzIHVwZGF0ZWQgY29uc3RhbnRseSBhbmQgdGhlcmVmb3JlIGlzCi1ub3QgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uICBUaGUgRkFRIGlzIHBvc3RlZCBldmVyeSB0d28gd2Vla3MgdG8KLVVzZW5ldCBuZXdzZ3JvdXBzIGNvbXAuZ3JhcGhpY3MubWlzYywgbmV3cy5hbnN3ZXJzLCBhbmQgb3RoZXIgZ3JvdXBzLgorVGhlIEpQRUcgRkFRIChGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucykgYXJ0aWNsZSBpcyBhIHNvdXJjZSBvZiBzb21lCitnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IEpQRUcuCiBJdCBpcyBhdmFpbGFibGUgb24gdGhlIFdvcmxkIFdpZGUgV2ViIGF0IGh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy9qcGVnLWZhcS8KIGFuZCBvdGhlciBuZXdzLmFuc3dlcnMgYXJjaGl2ZSBzaXRlcywgaW5jbHVkaW5nIHRoZSBvZmZpY2lhbCBuZXdzLmFuc3dlcnMKIGFyY2hpdmUgYXQgcnRmbS5taXQuZWR1OiBmdHA6Ly9ydGZtLm1pdC5lZHUvcHViL3VzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvLgpAQCAtMzA3LDc5ICsyNjYsNTcgQEAKIAlzZW5kIHVzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvcGFydDIKIAogCi1SRUxBVEVEIFNPRlRXQVJFCi09PT09PT09PT09PT09PT09CitBQ0tOT1dMRURHTUVOVFMKKz09PT09PT09PT09PT09PQogCi1OdW1lcm91cyB2aWV3aW5nIGFuZCBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMgbm93IHN1cHBvcnQgSlBFRy4gIChRdWl0ZSBhCi1mZXcgb2YgdGhlbSB1c2UgdGhpcyBsaWJyYXJ5IHRvIGRvIHNvLikgIFRoZSBKUEVHIEZBUSBkZXNjcmliZWQgYWJvdmUgbGlzdHMKLXNvbWUgb2YgdGhlIG1vcmUgcG9wdWxhciBmcmVlIGFuZCBzaGFyZXdhcmUgdmlld2VycywgYW5kIHRlbGxzIHdoZXJlIHRvCi1vYnRhaW4gdGhlbSBvbiBJbnRlcm5ldC4KK1RoYW5rIHRvIEp1ZXJnZW4gQnJ1ZGVyIG9mIHRoZSBHZW9yZy1DYW50b3ItT3JnYW5pemF0aW9uIGF0IHRoZQorTWFydGluLUx1dGhlci1Vbml2ZXJzaXR5IEhhbGxlIGZvciBwcm92aWRpbmcgbWUgd2l0aCBhIGNvcHkgb2YgdGhlIGNvbW1vbgorRENUIGFsZ29yaXRobSBhcnRpY2xlLCBvbmx5IHRvIGZpbmQgb3V0IHRoYXQgSSBoYWQgY29tZSB0byB0aGUgc2FtZSByZXN1bHQKK2luIGEgbW9yZSBkaXJlY3QgYW5kIGNvbXByZWhlbnNpYmxlIHdheSB3aXRoIGEgbW9yZSBnZW5lcmF0aXZlIGFwcHJvYWNoLgogCi1JZiB5b3UgYXJlIG9uIGEgVW5peCBtYWNoaW5lLCB3ZSBoaWdobHkgcmVjb21tZW5kIEplZiBQb3NrYW56ZXIncyBmcmVlCi1QQk1QTFVTIHNvZnR3YXJlLCB3aGljaCBwcm92aWRlcyBtYW55IHVzZWZ1bCBvcGVyYXRpb25zIG9uIFBQTS1mb3JtYXQgaW1hZ2UKLWZpbGVzLiAgSW4gcGFydGljdWxhciwgaXQgY2FuIGNvbnZlcnQgUFBNIGltYWdlcyB0byBhbmQgZnJvbSBhIHdpZGUgcmFuZ2Ugb2YKLW90aGVyIGZvcm1hdHMsIHRodXMgbWFraW5nIGNqcGVnL2RqcGVnIGNvbnNpZGVyYWJseSBtb3JlIHVzZWZ1bC4gIFRoZSBsYXRlc3QKLXZlcnNpb24gaXMgZGlzdHJpYnV0ZWQgYnkgdGhlIE5ldFBCTSBncm91cCwgYW5kIGlzIGF2YWlsYWJsZSBmcm9tIG51bWVyb3VzCi1zaXRlcywgbm90YWJseSBmdHA6Ly93dWFyY2hpdmUud3VzdGwuZWR1L2dyYXBoaWNzL2dyYXBoaWNzL3BhY2thZ2VzL05ldFBCTS8uCi1VbmZvcnR1bmF0ZWx5IFBCTVBMVVMvTkVUUEJNIGlzIG5vdCBuZWFybHkgYXMgcG9ydGFibGUgYXMgdGhlIElKRyBzb2Z0d2FyZSBpczsKLXlvdSBhcmUgbGlrZWx5IHRvIGhhdmUgZGlmZmljdWx0eSBtYWtpbmcgaXQgd29yayBvbiBhbnkgbm9uLVVuaXggbWFjaGluZS4KK1RoYW5rIHRvIElzdHZhbiBTZWJlc3R5ZW4gYW5kIEpvYW4gTC4gTWl0Y2hlbGwgZm9yIGludml0aW5nIG1lIHRvIHRoZQorSVRVIEpQRUcgKFN0dWR5IEdyb3VwIDE2KSBtZWV0aW5nIGluIEdlbmV2YSwgU3dpdHplcmxhbmQuCiAKLUEgZGlmZmVyZW50IGZyZWUgSlBFRyBpbXBsZW1lbnRhdGlvbiwgd3JpdHRlbiBieSB0aGUgUFZSRyBncm91cCBhdCBTdGFuZm9yZCwKLWlzIGF2YWlsYWJsZSBmcm9tIGZ0cDovL2hhdmVmdW4uc3RhbmZvcmQuZWR1L3B1Yi9qcGVnLy4gIFRoaXMgcHJvZ3JhbQotaXMgZGVzaWduZWQgZm9yIHJlc2VhcmNoIGFuZCBleHBlcmltZW50YXRpb24gcmF0aGVyIHRoYW4gcHJvZHVjdGlvbiB1c2U7Ci1pdCBpcyBzbG93ZXIsIGhhcmRlciB0byB1c2UsIGFuZCBsZXNzIHBvcnRhYmxlIHRoYW4gdGhlIElKRyBjb2RlLCBidXQgaXQKLWlzIGVhc2llciB0byByZWFkIGFuZCBtb2RpZnkuICBBbHNvLCB0aGUgUFZSRyBjb2RlIHN1cHBvcnRzIGxvc3NsZXNzIEpQRUcsCi13aGljaCB3ZSBkbyBub3QuICAoT24gdGhlIG90aGVyIGhhbmQsIGl0IGRvZXNuJ3QgZG8gcHJvZ3Jlc3NpdmUgSlBFRy4pCitUaGFuayB0byBUaG9tYXMgV2llZ2FuZCBhbmQgR2FyeSBTdWxsaXZhbiBmb3IgaW52aXRpbmcgbWUgdG8gdGhlCitKb2ludCBWaWRlbyBUZWFtIChNUEVHICYgSVRVKSBtZWV0aW5nIGluIEdlbmV2YSwgU3dpdHplcmxhbmQuCisKK1RoYW5rIHRvIEpvaG4gS29yZWp3YSBhbmQgTWFzc2ltbyBCYWxsZXJpbmkgZm9yIGludml0aW5nIG1lIHRvCitmcnVpdGZ1bCBjb25zdWx0YXRpb25zIGluIEJvc3RvbiwgTUEgYW5kIE1pbGFuLCBJdGFseS4KKworVGhhbmsgdG8gSGVuZHJpayBFbHN0bmVyLCBSb2xhbmQgRmFzc2F1ZXIsIGFuZCBTaW1vbmUgWnVjayBmb3IKK2NvcnJlc3BvbmRpbmcgYnVzaW5lc3MgZGV2ZWxvcG1lbnQuCisKK1RoYW5rIHRvIE5pY28gWnNjaGFjaCBhbmQgRGlyayBTdGVsbGluZyBvZiB0aGUgdGVjaG5pY2FsIHN1cHBvcnQgdGVhbQorYXQgdGhlIERpZ2l0YWwgSW1hZ2VzIGNvbXBhbnkgaW4gSGFsbGUgZm9yIHByb3ZpZGluZyBtZSB3aXRoIGV4dHJhCitlcXVpcG1lbnQgZm9yIGNvbmZpZ3VyYXRpb24gdGVzdHMuCisKK1RoYW5rIHRvIFJpY2hhcmQgRi4gTHlvbiAodGhlbiBvZiBGb3Zlb24gSW5jLikgZm9yIGZydWl0ZnVsCitjb21tdW5pY2F0aW9uIGFib3V0IEpQRUcgY29uZmlndXJhdGlvbiBpbiBTaWdtYSBQaG90byBQcm8gc29mdHdhcmUuCisKK0xhc3QgYnV0IG5vdCBsZWFzdCBzcGVjaWFsIHRoYW5rIHRvIFRob21hcyBHLiBMYW5lIGZvciB0aGUgb3JpZ2luYWwKK2Rlc2lnbiBhbmQgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzaW5ndWxhciBzb2Z0d2FyZSBwYWNrYWdlLgogCiAKIEZJTEUgRk9STUFUIFdBUlMKID09PT09PT09PT09PT09PT0KIAotU29tZSBKUEVHIHByb2dyYW1zIHByb2R1Y2UgZmlsZXMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBvdXIgbGlicmFyeS4KLVRoZSByb290IG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIElTTyBKUEVHIGNvbW1pdHRlZSBmYWlsZWQgdG8gc3BlY2lmeSBhCi1jb25jcmV0ZSBmaWxlIGZvcm1hdC4gIFNvbWUgdmVuZG9ycyAiZmlsbGVkIGluIHRoZSBibGFua3MiIG9uIHRoZWlyIG93biwKLWNyZWF0aW5nIHByb3ByaWV0YXJ5IGZvcm1hdHMgdGhhdCBubyBvbmUgZWxzZSBjb3VsZCByZWFkLiAgKEZvciBleGFtcGxlLCBub25lCi1vZiB0aGUgZWFybHkgY29tbWVyY2lhbCBKUEVHIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIE1hY2ludG9zaCB3ZXJlIGFibGUgdG8KLWV4Y2hhbmdlIGNvbXByZXNzZWQgZmlsZXMuKQotCi1UaGUgZmlsZSBmb3JtYXQgd2UgaGF2ZSBhZG9wdGVkIGlzIGNhbGxlZCBKRklGIChzZWUgUkVGRVJFTkNFUykuICBUaGlzIGZvcm1hdAotaGFzIGJlZW4gYWdyZWVkIHRvIGJ5IGEgbnVtYmVyIG9mIG1ham9yIGNvbW1lcmNpYWwgSlBFRyB2ZW5kb3JzLCBhbmQgaXQgaGFzCi1iZWNvbWUgdGhlIGRlIGZhY3RvIHN0YW5kYXJkLiAgSkZJRiBpcyBhIG1pbmltYWwgb3IgImxvdyBlbmQiIHJlcHJlc2VudGF0aW9uLgotV2UgcmVjb21tZW5kIHRoZSB1c2Ugb2YgVElGRi9KUEVHIChUSUZGIHJldmlzaW9uIDYuMCBhcyBtb2RpZmllZCBieSBUSUZGCi1UZWNobmljYWwgTm90ZSAjMikgZm9yICJoaWdoIGVuZCIgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byByZWNvcmQgYSBsb3Qgb2YKLWFkZGl0aW9uYWwgZGF0YSBhYm91dCBhbiBpbWFnZS4gIFRJRkYvSlBFRyBpcyBmYWlybHkgbmV3IGFuZCBub3QgeWV0IHdpZGVseQotc3VwcG9ydGVkLCB1bmZvcnR1bmF0ZWx5LgotCi1UaGUgdXBjb21pbmcgSlBFRyBQYXJ0IDMgc3RhbmRhcmQgZGVmaW5lcyBhIGZpbGUgZm9ybWF0IGNhbGxlZCBTUElGRi4KLVNQSUZGIGlzIGludGVyb3BlcmFibGUgd2l0aCBKRklGLCBpbiB0aGUgc2Vuc2UgdGhhdCBtb3N0IEpGSUYgZGVjb2RlcnMgc2hvdWxkCi1iZSBhYmxlIHRvIHJlYWQgdGhlIG1vc3QgY29tbW9uIHZhcmlhbnQgb2YgU1BJRkYuICBTUElGRiBoYXMgc29tZSB0ZWNobmljYWwKLWFkdmFudGFnZXMgb3ZlciBKRklGLCBidXQgaXRzIG1ham9yIGNsYWltIHRvIGZhbWUgaXMgc2ltcGx5IHRoYXQgaXQgaXMgYW4KLW9mZmljaWFsIHN0YW5kYXJkIHJhdGhlciB0aGFuIGFuIGluZm9ybWFsIG9uZS4gIEF0IHRoaXMgcG9pbnQgaXQgaXMgdW5jbGVhcgotd2hldGhlciBTUElGRiB3aWxsIHN1cGVyc2VkZSBKRklGIG9yIHdoZXRoZXIgSkZJRiB3aWxsIHJlbWFpbiB0aGUgZGUtZmFjdG8KLXN0YW5kYXJkLiAgSUpHIGludGVuZHMgdG8gc3VwcG9ydCBTUElGRiBvbmNlIHRoZSBzdGFuZGFyZCBpcyBmcm96ZW4sIGJ1dCB3ZQotaGF2ZSBub3QgZGVjaWRlZCB3aGV0aGVyIGl0IHNob3VsZCBiZWNvbWUgb3VyIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBvciBub3QuCi0oSW4gYW55IGNhc2UsIG91ciBkZWNvZGVyIHdpbGwgcmVtYWluIGNhcGFibGUgb2YgcmVhZGluZyBKRklGIGluZGVmaW5pdGVseS4pCi0KLVZhcmlvdXMgcHJvcHJpZXRhcnkgZmlsZSBmb3JtYXRzIGluY29ycG9yYXRpbmcgSlBFRyBjb21wcmVzc2lvbiBhbHNvIGV4aXN0LgotV2UgaGF2ZSBsaXR0bGUgb3Igbm8gc3ltcGF0aHkgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlc2UgZm9ybWF0cy4gIEluZGVlZCwKK1RoZSBJU08gSlBFRyBzdGFuZGFyZHMgY29tbWl0dGVlIGFjdHVhbGx5IHByb21vdGVzIGRpZmZlcmVudCBmb3JtYXRzIGxpa2UKK0pQRUctMjAwMCBvciBKUEVHLVhSIHdoaWNoIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBvcmlnaW5hbCBEQ1QtYmFzZWQgSlBFRworYW5kIHdoaWNoIGFyZSBiYXNlZCBvbiBmYXVsdHkgdGVjaG5vbG9naWVzLiAgSUpHIHRoZXJlZm9yZSBkb2VzIG5vdCBhbmQKK3dpbGwgbm90IHN1cHBvcnQgc3VjaCBtb21lbnRhcnkgbWlzdGFrZXMgKHNlZSBSRUZFUkVOQ0VTKS4KK1dlIGhhdmUgbGl0dGxlIG9yIG5vIHN5bXBhdGh5IGZvciB0aGUgcHJvbW90aW9uIG9mIHRoZXNlIGZvcm1hdHMuICBJbmRlZWQsCiBvbmUgb2YgdGhlIG9yaWdpbmFsIHJlYXNvbnMgZm9yIGRldmVsb3BpbmcgdGhpcyBmcmVlIHNvZnR3YXJlIHdhcyB0byBoZWxwCi1mb3JjZSBjb252ZXJnZW5jZSBvbiBjb21tb24sIG9wZW4gZm9ybWF0IHN0YW5kYXJkcyBmb3IgSlBFRyBmaWxlcy4gIERvbid0Ci11c2UgYSBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdCEKK2ZvcmNlIGNvbnZlcmdlbmNlIG9uIGNvbW1vbiwgaW50ZXJvcGVyYWJsZSBmb3JtYXQgc3RhbmRhcmRzIGZvciBKUEVHIGZpbGVzLgorRG9uJ3QgdXNlIGFuIGluY29tcGF0aWJsZSBmaWxlIGZvcm1hdCEKKyhJbiBhbnkgY2FzZSwgb3VyIGRlY29kZXIgd2lsbCByZW1haW4gY2FwYWJsZSBvZiByZWFkaW5nIGV4aXN0aW5nIEpQRUcKK2ltYWdlIGZpbGVzIGluZGVmaW5pdGVseS4pCiAKIAogVE8gRE8KID09PT09CiAKLVRoZSBtYWpvciB0aHJ1c3QgZm9yIHY3IHdpbGwgcHJvYmFibHkgYmUgaW1wcm92ZW1lbnQgb2YgdmlzdWFsIHF1YWxpdHkuCi1UaGUgY3VycmVudCBtZXRob2QgZm9yIHNjYWxpbmcgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgaXMga25vd24gbm90IHRvIGJlCi12ZXJ5IGdvb2QgYXQgbG93IFEgdmFsdWVzLiAgV2UgYWxzbyBpbnRlbmQgdG8gaW52ZXN0aWdhdGUgYmxvY2sgYm91bmRhcnkKLXNtb290aGluZywgInBvb3IgbWFuJ3MgdmFyaWFibGUgcXVhbnRpemF0aW9uIiwgYW5kIG90aGVyIG1lYW5zIG9mIGltcHJvdmluZwotcXVhbGl0eS12cy1maWxlLXNpemUgcGVyZm9ybWFuY2Ugd2l0aG91dCBzYWNyaWZpY2luZyBjb21wYXRpYmlsaXR5LgordjcgaXMgYmFzaWNhbGx5IGp1c3QgYSBuZWNlc3NhcnkgaW50ZXJpbSByZWxlYXNlLCBwYXZpbmcgdGhlIHdheSBmb3IgYQorbWFqb3IgYnJlYWt0aHJvdWdoIGluIGltYWdlIGNvZGluZyB0ZWNobm9sb2d5IHdpdGggdGhlIG5leHQgdjggcGFja2FnZQord2hpY2ggaXMgc2NoZWR1bGVkIGZvciByZWxlYXNlIGluIHRoZSB5ZWFyIDIwMTAuCiAKLUluIGZ1dHVyZSB2ZXJzaW9ucywgd2UgYXJlIGNvbnNpZGVyaW5nIHN1cHBvcnRpbmcgc29tZSBvZiB0aGUgdXBjb21pbmcgSlBFRwotUGFydCAzIGV4dGVuc2lvbnMgLS0tIHByaW5jaXBhbGx5LCB2YXJpYWJsZSBxdWFudGl6YXRpb24gYW5kIHRoZSBTUElGRiBmaWxlCi1mb3JtYXQuCi0KLUFzIGFsd2F5cywgc3BlZWRpbmcgdGhpbmdzIHVwIGlzIG9mIGdyZWF0IGludGVyZXN0LgotCi1QbGVhc2Ugc2VuZCBidWcgcmVwb3J0cywgb2ZmZXJzIG9mIGhlbHAsIGV0Yy4gdG8ganBlZy1pbmZvQHV1bmV0LnV1Lm5ldC4KK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzLCBvZmZlcnMgb2YgaGVscCwgZXRjLiB0byBqcGVnLWluZm9AanBlZ2NsdWIub3JnLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLmFyaXRobWV0aWMgYi9SRUFETUUuYXJpdGhtZXRpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkM2I5YS4uMDAwMDAwMAotLS0gYS9SRUFETUUuYXJpdGhtZXRpYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi1KUEVHIGFyaXRobWV0aWMgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHBvcnRhYmxlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlbGVhc2Ugb2YgMjgtTWFyLTk4IGJ5IEd1aWRvIFZvbGxiZWRpbmcgPGd1aWRvQGpwZWdjbHViLm9yZz4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUHJpbWFyeSBVUkxzOgotCi0JaHR0cDovL3N5bHZhbmEubmV0L2pwZWctYXJpLwotCShkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgYWN0dWFsIGFyY2hpdmUgZmlsZXM6KQotCi0JaHR0cDovL3N5bHZhbmEubmV0L2pwZWctYXJpL2pwZWctYXJpLTI4bWFyOTgudGFyLmd6Ci0KLQlodHRwOi8vc3lsdmFuYS5uZXQvanBlZy1hcmkvanBlZy1hcmkuemlwCi0KLQotRElTQ0xBSU1FUgotPT09PT09PT09PQotCi1UaGlzIHBhY2thZ2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLUl0IGlzIHBvc3NpYmxlIHRoYXQgY2VydGFpbiBwcm9kdWN0cyB3aGljaCBjYW4gYmUgYnVpbHQgdXNpbmcgdGhpcwotc29mdHdhcmUgbW9kdWxlcyBtaWdodCBmb3JtIGludmVudGlvbnMgcHJvdGVjdGVkIGJ5IHBhdGVudCByaWdodHMgaW4KLXNvbWUgY291bnRyaWVzIChlLmcuIGJ5IHBhdGVudHMgYWJvdXQgYXJpdGhtZXRpYyBjb2RpbmcgYWxnb3JpdGhtcwotb3duZWQgYnkgSUJNIGFuZCBBVCZUIGluIHRoZSBVU0EpLiBQcm92aXNpb24gb2YgdGhpcyBzb2Z0d2FyZSBieSB0aGUKLWF1dGhvciBkb2VzIE5PVCBpbmNsdWRlIGFueSBsaWNlbnNlcyBmb3IgYW55IHBhdGVudHMuCi1JbiB0aG9zZSBjb3VudHJpZXMgd2hlcmUgYSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCBmb3IgY2VydGFpbgotYXBwbGljYXRpb25zIG9mIHRoaXMgc29mdHdhcmUgbW9kdWxlcywgeW91IHdpbGwgaGF2ZSB0byBvYnRhaW4gc3VjaAotYSBsaWNlbnNlIHlvdXJzZWxmLgotCi1TZWUgQW5uZXggTCBpbiB0aGUgSlBFRyBzcGVjIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uCi1hbmQgYSBsaXN0IG9mIHJlbGV2YW50IHBhdGVudHMuCi0KLQotV2hhdCBpcyBpdD8KLT09PT09PT09PT09Ci0KLVRoaXMgaXMgbXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFyaXRobWV0aWMgZW5jb2RpbmcgYW5kIGRlY29kaW5nCi1iYWNrLWVuZCBmb3IgSlBFRyBhcyBzcGVjaWZpZWQgaW4gdGhlCi0KLSAgSVNPL0lFQyBJbnRlcm5hdGlvbmFsIFN0YW5kYXJkIDEwOTE4LTEgYW5kIENDSVRUIFJlY29tbWVuZGF0aW9uCi0gIElUVS1UIFQuODEsICJJbmZvcm1hdGlvbiBUZWNobm9sb2d5IC0gRGlnaXRhbCBDb21wcmVzc2lvbiBhbmQKLSAgQ29kaW5nIG9mIENvbnRpbnVvdXMtdG9uZSBTdGlsbCBJbWFnZXMsIFBhcnQgMTogUmVxdWlyZW1lbnRzCi0gIGFuZCBHdWlkZWxpbmVzIi4KLQotQXJpdGhtZXRpYyBjb2RpbmcgaXMgYSBzdGF0ZS1vZi10aGUtYXJ0IGxvc3NsZXNzIGVudHJvcHkgZGF0YQotY29tcHJlc3Npb24gbWV0aG9kIHdoaWNoIG9mZmVycyBiZXR0ZXIgY29tcHJlc3Npb24gcGVyZm9ybWFuY2UKLXRoYW4gdGhlIHdlbGwtZXN0YWJsaXNoZWQgSHVmZm1hbiBlbnRyb3B5IGNvZGluZyBwcm9jZXNzLgotCi1UaGUgSlBFRyBzdGFuZGFyZCBzcGVjaWZpZXMgYSBwYXJ0aWN1bGFyIGFyaXRobWV0aWMgY29kaW5nIHNjaGVtZQotdG8gYmUgdXNlZCBvcHRpb25hbGx5IGFzIGFsdGVybmF0aXZlIHRvIEh1ZmZtYW4gY29kaW5nLgotCi0KLVdobyBuZWVkcyBpdD8KLT09PT09PT09PT09PT0KLQotVGhpcyBwYWNrYWdlIG1pZ2h0IGJlIG9mIGludGVyZXN0IGZvciBwZW9wbGUgd2hvIGFyZSBsb29raW5nIGZvcgotZW5oYW5jZWQgc3RhdGUtb2YtdGhlLWFydCBpbWFnZSBjb21wcmVzc2lvbiB0ZWNobm9sb2dpZXMuCi0KLUl0IGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvb2wgZm9yIGV4cGVyaW1lbnRhbCwKLWNvbXBhcmlzb24gYW5kIGV2YWx1YXRpb24gcHVycG9zZXMuCi0KLVNlZSB0aGUgRGlzY2xhaW1lciBhYm92ZSBmb3IgcmVzdHJpY3RlZCBjb25kaXRpb25zIG9mIHVzYWdlLgotCi0KLUhvdyBkb2VzIGl0IHdvcms/Ci09PT09PT09PT09PT09PT09PQotCi1UaGlzIGRpc3RyaWJ1dGlvbiBpcyBvcmdhbml6ZWQgYXMgYWRkLW9uIHRvIHRoZSB3aWRlc3ByZWFkCi1JbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFRyBzb2Z0d2FyZS4KLQotVGh1cywgb25jZSB5b3UgbWFuYWdlZCB0byBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUgZGlzdHJpYnV0aW9uCi1zdWNjZXNzZnVsbHksIHRoZXJlIHNob3VsZCBiZSBubyBhZGRpdGlvbmFsIHByb2JsZW1zIChwb3J0YWJpbGl0eQotaXNzdWVzIGV0Yy4pIHRvIGluY29ycG9yYXRlIHRoaXMgcGFja2FnZSBpbnRvIHRoZSBsaWJyYXJ5LAotYW5kIHVzYWdlIGlzIHN0cmFpZ2h0Zm9yd2FyZC4KLQotVHJhbnNjb2RlIGdpdmVuIEpQRUcgZmlsZXMgc2ltcGx5IHdpdGggYSBjb21tYW5kIGxpa2UKLQotICBqcGVndHJhbiAtYXJpdGhtZXRpYyBbLXByb2dyZXNzaXZlXSA8IG9yaWcuanBnID4gYXJpdC5qcGcKLQotaW50byBhbiBhcml0aG1ldGljIGNvZGVkIHZlcnNpb24gTE9TU0xFU1NMWSEgU2luY2UgdGhlcmUgYXJlCi1wcmFjdGljYWxseSBubyBhcHBsaWNhdGlvbnMgaW4gZXhpc3RlbmNlIHdoaWNoIGNhbiBoYW5kbGUgc3VjaAotZmlsZXMsIHlvdSBjYW4gb25seSB0cmFuc2Zvcm0gaXQgYmFjayB3aXRoIHRoZSBzYW1lIHRvb2wKLQotICBqcGVndHJhbiBbLW9wdGltaXplXSBbLXByb2dyZXNzaXZlXSA8IGFyaXQuanBnID4gb3JpZzIuanBnCi0KLXRvIHZlcmlmeSBjb3JyZWN0IG9wZXJhdGlvbi4KLQotVGh1cywgeW91IGNhbiBlYXNpbHkgdmVyaWZ5IHRoZSBlbmhhbmNlZCBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZQotb2YgdGhlIGFyaXRobWV0aWMgY29kaW5nIHZlcnNpb24gY29tcGFyZWQgdG8gdGhlIEh1ZmZtYW4gKHdpdGgKLWZpeGVkIG9yIGN1c3RvbSB0YWJsZXMpIHZlcnNpb24uCi0KLVRoZSBjbGFpbSB0byBldmFsdWF0ZSB3YXMgdGhhdCBhcml0aG1ldGljIGNvZGluZyBnaXZlcyBhbiBhdmVyYWdlCi01LTEwJSBjb21wcmVzc2lvbiBpbXByb3ZlbWVudCBhZ2FpbnN0IEh1ZmZtYW4uCi1FYXJseSB0ZXN0cyB3aXRoIHRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCB0aGlzIGNsYWltLCBhbmQgeW91Ci1jYW4gcGVyZm9ybSB0ZXN0cyB3aXRoIG93biBtYXRlcmlhbC4KLQotSGVyZSBhcmUgc29tZSBhY3R1YWwgcmVzdWx0czoKLQotJSAuL2pwZWd0cmFuIC1vcHRpbWl6ZSA8IHRlc3RvcmlnLmpwZyA+IHRlc3RvcHQuanBnCi0lIC4vanBlZ3RyYW4gLWFyaXRobWV0aWMgPCB0ZXN0b3JpZy5qcGcgPiB0ZXN0YXJpdC5qcGcKLSUgLi9qcGVndHJhbiA8IHRlc3Rhcml0LmpwZyA+IHRlc3RvcmlnMi5qcGcKLSUgLi9qcGVndHJhbiAtYXJpdGhtZXRpYyAtcHJvZ3Jlc3NpdmUgPCB0ZXN0b3JpZy5qcGcgPiB0ZXN0YXJpdHAuanBnCi0lIC4vanBlZ3RyYW4gPCB0ZXN0YXJpdHAuanBnID4gdGVzdG9yaWczLmpwZwotJSAuL2pwZWd0cmFuIC1vcHRpbWl6ZSA8IC4uL2J1dHRlcmZseS5qcGcgPiAuLi9idXR0b3B0LmpwZwotJSAuL2pwZWd0cmFuIC1wcm9ncmVzc2l2ZSA8IC4uL2J1dHRlcmZseS5qcGcgPiAuLi9idXR0cHJvZy5qcGcKLSUgLi9qcGVndHJhbiAtYXJpdGhtZXRpYyA8IC4uL2J1dHRlcmZseS5qcGcgPiAuLi9idXR0YXJpdC5qcGcKLSUgLi9qcGVndHJhbiA8IC4uL2J1dHRhcml0LmpwZyA+IC4uL2J1dHRlcmZseTIuanBnCi0lIC4vanBlZ3RyYW4gLWFyaXRobWV0aWMgLXByb2dyZXNzaXZlIDwgLi4vYnV0dGVyZmx5LmpwZyA+IC4uL2J1dHRhcml0cC5qcGcKLSUgLi9qcGVndHJhbiA8IC4uL2J1dHRhcml0cC5qcGcgPiAuLi9idXR0ZXJmbHkzLmpwZwotJSBscyAtbCB0ZXN0Ki5qcGcKLS1ydy1yLS1yLS0gIDEgZ3Vpdm9sICAgICAgIDUxNTMgQXByIDEzIDE4OjUxIHRlc3Rhcml0LmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgICAgNTE4NiBBcHIgMTMgMTg6NTEgdGVzdGFyaXRwLmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgICAgNTc1NiBBcHIgIDIgMTU6MTAgdGVzdGltZy5qcGcKLS1ydy1yLS1yLS0gIDEgZ3Vpdm9sICAgICAgIDU2NDUgQXByICAyIDE1OjEwIHRlc3RpbWdwLmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgICAgNTQ2MyBBcHIgMTMgMTg6NTEgdGVzdG9wdC5qcGcKLS1ydy1yLS1yLS0gIDEgZ3Vpdm9sICAgICAgIDU3NzAgQXByICAyIDE1OjEwIHRlc3RvcmlnLmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgICAgNTc3MCBBcHIgMTMgMTg6NTEgdGVzdG9yaWcyLmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgICAgNTc3MCBBcHIgMTMgMTg6NTEgdGVzdG9yaWczLmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgICAgNTY1NSBBcHIgIDIgMTU6MTAgdGVzdHByb2cuanBnCi0lIGxzIC1sIC4uL2J1dHQqLmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgIDQ2MDA5MSBBcHIgMTMgMTg6NTIgLi4vYnV0dGFyaXQuanBnCi0tcnctci0tci0tICAxIGd1aXZvbCAgICAgNDUzNzAzIEFwciAxMyAxODo1MiAuLi9idXR0YXJpdHAuanBnCi0tcnctci0tci0tICAxIGd1aXZvbCAgICAgNTI3ODIzIE5vdiAxOSAxODo0MSAuLi9idXR0ZXJmbHkuanBnCi0tcnctci0tci0tICAxIGd1aXZvbCAgICAgNTI3ODIzIEFwciAxMyAxODo1MiAuLi9idXR0ZXJmbHkyLmpwZwotLXJ3LXItLXItLSAgMSBndWl2b2wgICAgIDUyNzgyMyBBcHIgMTMgMTg6NTIgLi4vYnV0dGVyZmx5My5qcGcKLS1ydy1yLS1yLS0gIDEgZ3Vpdm9sICAgICA1MTE4MzQgQXByIDEzIDE4OjUyIC4uL2J1dHRvcHQuanBnCi0tcnctci0tci0tICAxIGd1aXZvbCAgICAgNDkyMjM3IEFwciAxMyAxODo1MiAuLi9idXR0cHJvZy5qcGcKLSUgCi0KLU5vdGUgdGhhdCBhcml0aG1ldGljIGNvZGluZyByZXF1aXJlcyBvbmx5IGEgc2luZ2xlIHByb2Nlc3NpbmcKLXBhc3MgZHVlIHRvIGl0cyBmdWxseS1hZGFwdGl2ZSBuYXR1cmUsIGFuZCBjb21wYXJlZCB0byBvbmUtcGFzcwotKGZpeGVkIHRhYmxlcykgSHVmZm1hbiB0aGUgYXJpdGhtZXRpYyBjb2RlZCB2ZXJzaW9uIGNvbnNpc3RlbnRseQotYWNoaWV2ZXMgMTAlIGNvbXByZXNzaW9uIGltcHJvdmVtZW50LgotQ29tcGFyZWQgd2l0aCB0d28tcGFzcyAoY3VzdG9tIHRhYmxlcykgSHVmZm1hbiB0aGUgaW1wcm92ZW1lbnQKLWlzIDUtMTAlLgotCi1Ob3RlIHRoYXQgSSB3YXNuJ3QgYWJsZSB5ZXQgdG8gY3Jvc3MtY2hlY2sgaW50ZXJvcGVyYWJpbGl0eSBvZgotdGhlIHByb2R1Y2VkIGZpbGVzIHdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zLgotVGh1cywgSSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhlIGZpbGVzIGFyZSBjb21wbGlhbnQgdG8gdGhlIHNwZWMsCi1idXQgSSBob3BlIHNvIGFuZCB0aGUgdGVzdHMgc3VwcG9ydCBpdC4KLVRoZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgcHJvY2Vzc2VzIHNob3VsZCBiZSBjb3JyZWN0IGFueXdheSwKLWhvd2V2ZXIsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIGNvbXBsZW1lbnRhcnkgdG8gZWFjaCBvdGhlcgotYW5kIHRodXMgcmV0YWluIGRhdGEgaW50ZWdyaXR5LgotCi1JIHdvdWxkIGFwcHJlY2lhdGUgYW55IGluZGljYXRpb25zIGZvciBjb21wbGlhbmNlIG9yIGludGVyb3BlcmFiaWxpdHkKLXdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zIGZyb20gc29tZWJvZHkuCi1QbGVhc2UgbGV0IG1lIGtub3cgaWYgeW91IGFyZSBhYmxlIHRvIGNyb3NzLWNoZWNrIHNvbWV0aGluZy4KLQotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1UaGUgaW5zdGFsbGF0aW9uIGlzIGEgMi1zdGFnZSBwcm9jZWR1cmU6Ci0KLTEuIFByZXBhcmluZyB0aGUgSUpHIHBhY2thZ2UgZm9yIHBvdGVudGlhbCBpbmNvcnBvcmF0aW9uCi0gICBvZiB0aGUgYXJpdGhtZXRpYyBjb2RpbmcgZmVhdHVyZS4KLQotMi4gSW5jb3Jwb3JhdGlvbiBvZiB0aGUgYWN0dWFsIGFyaXRobWV0aWMgY29kaW5nIG1vZHVsZXMKLSAgIGFuZCBlbmFibGluZyB0aGUgZmVhdHVyZSBmb3IgdXNhZ2UuCi0KLVRoZSByZWFzb24gZm9yIHRoaXMgMi1zdGFnZSBwcm9jZXNzIGlzIHRoZSBob3BlIHRvIG1ha2UKLXN0ZXAgMSBvYnNvbGV0ZSBpbiBmdXR1cmUgSUpHIHJlbGVhc2VzLgotVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmVtYWluIHNlcGFyYXRlIElNSE8gZHVlCi10byB0aGUgZGlmZmVyZW50IHVzYWdlIGNvbmRpdGlvbnMuCi0KLVN0ZXAgMToKLQotMS4xLiBDb3B5IGFsbCBmaWxlcyBmcm9tIHRoZSBzdWJkaXJlY3RvcnkgJ3BhdGNodjZiJyBpbnRvCi0gICAgIHRoZSBJSkcgc29mdHdhcmUncyB2NmIgc291cmNlIGRpcmVjdG9yeS4KLSAgICAgVGhpcyBpbmNsdWRlcyBtaW5vciBwYXRjaGVzIHRvIHNvbWUgZmlsZXMgYW5kIDMgZXh0cmEKLSAgICAgZmlsZXMgd2hpY2ggaG9sZCBwbGFjZSBmb3IgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KLQotMS4yLiBVcGRhdGUgeW91ciBNYWtlZmlsZS9Qcm9qZWN0ZmlsZSBmb3IgdGhlIGluY2x1c2lvbiBvZgotICAgICB0aGUgMyBleHRyYSBmaWxlcy4gVGhpcyB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseQotICAgICBpZiB5b3UgdXNlIGEgY29uZmlndXJlLWdlbmVyYXRlZCBtYWtlZmlsZSBhbmQgdHlwZQotICAgICAnLi9jb25maWd1cmUnIChyZWNvbmZpZ3VyZSkuCi0KLTEuMy4gUmVjb21waWxlICgnbWFrZScpLgotCi1TZWUgdGhlIGZpbGUgJ1BBVENIRVMnIGluICdwYXRjaHY2YicgZm9yIGRldGFpbHMuCi0KLVN0ZXAgMjoKLQotMi4xLiBSZXBsYWNlIHRoZSAzIHBsYWNlaG9sZGVyIGZpbGVzIGJ5IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KLSAgICAgbW9kdWxlcy4KLQotMi4yLiBFbmFibGUgYXBwbGljYXRpb24gc3VwcG9ydCBvZiB0aGUgbmV3IGZlYXR1cmVzIGJ5ICNkZWZpbmluZwotICAgICBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgYW5kIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICAgICBpbiAnam1vcmVjZmcuaCcuCi0KLTIuMy4gUmVjb21waWxlICgnbWFrZScpLgotCi1Ob3RlIHRoYXQgSSBzdWdnZXN0IHRvIGFkZCAzIHBsYWNlaG9sZGVyIGZpbGVzIHRvIHRoZSBJSkcKLWRpc3RyaWJ1dGlvbi4gVGhpcyB3b3VsZCByZW1vdmUgdGhlIG5lZWQgZm9yIHN5c3RlbS1kZXBlbmRlbnQKLWNoYW5nZXMgKE1ha2VmaWxlcykgYW5kIHRodXMgY29uc2lkZXJhYmx5IHNpbXBsaWZ5IHRoZSBhY3R1YWwKLWluc3RhbGxhdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGEgY29uZmlndXJlLWdlbmVyYXRlZCBtYWtlZmlsZS4KLQotCi1SZWZlcmVuY2VzCi09PT09PT09PT09Ci0KLS0gVGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotCi0tIEpCSUctS0lUIGxvc3NsZXNzIGltYWdlIGNvbXByZXNzaW9uIGxpYnJhcnkgYnkgTWFya3VzIEt1aG4KLQotLSBXaWxsaWFtIEIuIFBlbm5lYmFrZXIsIEpvYW4gTC4gTWl0Y2hlbGw6Ci0gICJKUEVHIFN0aWxsIEltYWdlIERhdGEgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAotICBWYW4gTm9zdHJhbmQgUmVpbmhvbGQsIDE5OTMsIElTQk4gMC00NDItMDEyNzItMS4KLQotLSBqcGVnLWZhcSAoaHR0cDovL3d3dy5mYXFzLm9yZy9mYXFzL2pwZWctZmFxLykKLQotLSBjb21wcmVzc2lvbi1mYXEgKGh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy9jb21wcmVzc2lvbi1mYXEvKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC5tNCBiL2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3YzNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwubTQKQEAgLTAsMCArMSw4OTkwIEBACisjIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS4xMSAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorIyAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorbTRfaWYobTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pLCBbMi42M10sLAorW200X3dhcm5pbmcoW3RoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZvciBhdXRvY29uZiAyLjYzLgorWW91IGhhdmUgYW5vdGhlciB2ZXJzaW9uIG9mIGF1dG9jb25mLiAgSXQgbWF5IHdvcmssIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0by4KK0lmIHlvdSBoYXZlIHByb2JsZW1zLCB5b3UgbWF5IG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgYnVpbGQgc3lzdGVtIGVudGlyZWx5LgorVG8gZG8gc28sIHVzZSB0aGUgcHJvY2VkdXJlIGRvY3VtZW50ZWQgYnkgdGhlIHBhY2thZ2UsIHR5cGljYWxseSBgYXV0b3JlY29uZicuXSldKQorCisjIGxpYnRvb2wubTQgLSBDb25maWd1cmUgbGlidG9vbCBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQorIworIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKK200X2RlZmluZShbX0xUX0NPUFlJTkddLCBbZG5sCisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LAorIyAgICAgICAgICAgICAgICAgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBXcml0dGVuIGJ5IEdvcmRvbiBNYXR6aWdrZWl0LCAxOTk2CisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2wuCisjCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIGlmIHlvdSBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSBvciBsaWJyYXJ5IHRoYXQKKyMgaXMgYnVpbHQgdXNpbmcgR05VIExpYnRvb2wsIHlvdSBtYXkgaW5jbHVkZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisjIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBHTlUgTGlidG9vbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR05VIExpYnRvb2w7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBhIGNvcHkKKyMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwsIG9yCisjIG9idGFpbmVkIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCitdKQorCisjIHNlcmlhbCA1NiBMVF9JTklUCisKKworIyBMVF9QUkVSRVEoVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGFuZCBleGl0IGlmIHRoaXMgbGlidG9vbCB2ZXJzaW9uIGlzIGxlc3MgdGhhdCBWRVJTSU9OLgorbTRfZGVmdW4oW0xUX1BSRVJFUV0sCitbbTRfaWYobTRfdmVyc2lvbl9jb21wYXJlKG00X2RlZm4oW0xUX1BBQ0tBR0VfVkVSU0lPTl0pLCBbJDFdKSwgLTEsCisgICAgICAgW200X2RlZmF1bHQoWyQzXSwKKwkJICAgW200X2ZhdGFsKFtMaWJ0b29sIHZlcnNpb24gJDEgb3IgaGlnaGVyIGlzIHJlcXVpcmVkXSwKKwkJICAgICAgICAgICAgIDYzKV0pXSwKKyAgICAgICBbJDJdKV0pCisKKworIyBfTFRfQ0hFQ0tfQlVJTERESVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBsYWluIGlmIHRoZSBhYnNvbHV0ZSBidWlsZCBkaXJlY3RvcnkgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMKK200X2RlZnVuKFtfTFRfQ0hFQ0tfQlVJTERESVJdLAorW2Nhc2UgYHB3ZGAgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgQUNfTVNHX1dBUk4oW0xpYnRvb2wgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggd2hpdGVzcGFjZSBpbiBgcHdkYF0pIDs7Citlc2FjCitdKQorCisKKyMgTFRfSU5JVChbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0lOSVRdLAorW0FDX1BSRVJFUShbMi41OF0pZG5sIFdlIHVzZSBBQ19JTkNMVURFU19ERUZBVUxUCitBQ19CRUZPUkUoWyQwXSwgW0xUX0xBTkddKWRubAorQUNfQkVGT1JFKFskMF0sIFtMVF9PVVRQVVRdKWRubAorQUNfQkVGT1JFKFskMF0sIFtMVERMX0lOSVRdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX0JVSUxERElSXSlkbmwKKworZG5sIEF1dG9jb25mIGRvZXNuJ3QgY2F0Y2ggdW5leHBhbmRlZCBMVF8gbWFjcm9zIGJ5IGRlZmF1bHQ6CittNF9wYXR0ZXJuX2ZvcmJpZChbXl8/TFRfW0EtWl9dKyRdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXihfTFRfRU9GfExUX0RMR0xPQkFMfExUX0RMTEFaWV9PUl9OT1d8TFRfTVVMVElfTU9EVUxFKSRdKWRubAorZG5sIGFjbG9jYWwgZG9lc24ndCBwdWxsIGx0b3B0aW9ucy5tNCwgbHRzdWdhci5tNCwgb3IgbHR2ZXJzaW9uLm00CitkbmwgdW5sZXNzIHdlIHJlcXVpcmUgYW4gQUNfREVGVU5lZCBtYWNybzoKK0FDX1JFUVVJUkUoW0xUT1BUSU9OU19WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0xUU1VHQVJfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVFZFUlNJT05fVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVE9CU09MRVRFX1ZFUlNJT05dKWRubAorbTRfcmVxdWlyZShbX0xUX1BST0dfTFRNQUlOXSlkbmwKKworZG5sIFBhcnNlIE9QVElPTlMKK19MVF9TRVRfT1BUSU9OUyhbJDBdLCBbJDFdKQorCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRsdG1haW4iCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKK0FDX1NVQlNUKExJQlRPT0wpZG5sCisKK19MVF9TRVRVUAorCisjIE9ubHkgZXhwYW5kIG9uY2U6CittNF9kZWZpbmUoW0xUX0lOSVRdKQorXSkjIExUX0lOSVQKKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQUNfUFJPR19MSUJUT09MXSwgW0xUX0lOSVRdKQorQVVfQUxJQVMoW0FNX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfUFJPR19MSUJUT09MXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0sIFtdKQorCisKKyMgX0xUX0NDX0JBU0VOQU1FKENDKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGN1bGF0ZSBjY19iYXNlbmFtZS4gIFNraXAga25vd24gY29tcGlsZXIgd3JhcHBlcnMgYW5kIGNyb3NzLXByZWZpeC4KK200X2RlZnVuKFtfTFRfQ0NfQkFTRU5BTUVdLAorW2ZvciBjY190ZW1wIGluICQxIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltbXFwvXV1jb21waWxlIHwgY2NhY2hlIHwgKltbXFwvXV1jY2FjaGUgKSA7OworICAgIGRpc3RjYyB8ICpbW1xcL11dZGlzdGNjIHwgcHVyaWZ5IHwgKltbXFwvXV1wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkRUNITyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorXSkKKworCisjIF9MVF9GSUxFVVRJTFNfREVGQVVMVFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJdCBpcyBva2F5IHRvIHVzZSB0aGVzZSBmaWxlIGNvbW1hbmRzIGFuZCBhc3N1bWUgdGhleSBoYXZlIGJlZW4gc2V0CisjIHNlbnNpYmx5IGFmdGVyIGBtNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSknLgorbTRfZGVmdW4oW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdLAorWzogJHtDUD0iY3AgLWYifQorOiAke01WPSJtdiAtZiJ9Cis6ICR7Uk09InJtIC1mIn0KK10pIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCisKKworIyBfTFRfU0VUVVAKKyMgLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1NFVFVQXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorX0xUX0RFQ0woW10sIFtob3N0X2FsaWFzXSwgWzBdLCBbVGhlIGhvc3Qgc3lzdGVtXSlkbmwKK19MVF9ERUNMKFtdLCBbaG9zdF0sIFswXSlkbmwKK19MVF9ERUNMKFtdLCBbaG9zdF9vc10sIFswXSlkbmwKK2RubAorX0xUX0RFQ0woW10sIFtidWlsZF9hbGlhc10sIFswXSwgW1RoZSBidWlsZCBzeXN0ZW1dKWRubAorX0xUX0RFQ0woW10sIFtidWlsZF0sIFswXSlkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRfb3NdLCBbMF0pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK2RubAorQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKK19MVF9ERUNMKFtdLCBbTE5fU10sIFsxXSwgW1doZXRoZXIgd2UgbmVlZCBzb2Z0IG9yIGhhcmQgbGlua3NdKWRubAorZG5sCitBQ19SRVFVSVJFKFtMVF9DTURfTUFYX0xFTl0pZG5sCitfTFRfREVDTChbb2JqZXh0XSwgW2FjX29iamV4dF0sIFswXSwgW09iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKV0pZG5sCitfTFRfREVDTChbXSwgW2V4ZWV4dF0sIFswXSwgW0V4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKV0pZG5sCitkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfUkVMT0FEXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19NQUdJQ19NRVRIT0RdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9PTERfQVJDSElWRV0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSlkbmwKKworX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoWworIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgorIyBjb21tYW5kcyB0aHJvdWdoIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMgSU5JVC4KK2lmIHRlc3QgLW4gIlwke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCitdKQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorCitfTFRfQ0hFQ0tfT0JKRElSCisKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorX0xUX1BST0dfRUNIT19CQUNLU0xBU0gKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbWyJgJFxcXV1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1siYFxcXV1cKS9cXFwxL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCisjIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCitkZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2luZ2xlIHF1b3RlLgorZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0PSdzLydcJycvJ1wnXFxcXFxcXCdcJycvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGF2b2lkIGFjY2lkZW50YWwgZ2xvYmJpbmcgaW4gZXZhbGVkIGV4cHJlc3Npb25zCitub19nbG9iX3N1YnN0PSdzL1wqL1xcXCovZycKKworIyBHbG9iYWwgdmFyaWFibGVzOgorb2ZpbGU9bGlidG9vbAorY2FuX2J1aWxkX3NoYXJlZD15ZXMKKworIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZyAoZXhjZXB0IE1TVkMsCisjIHdoaWNoIG5lZWRzICcubGliJykuCitsaWJleHQ9YQorCit3aXRoX2dudV9sZD0iJGx0X2N2X3Byb2dfZ251X2xkIgorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQ0MiICYmIENDPWNjCit0ZXN0IC16ICIkTFRDQyIgJiYgTFRDQz0kQ0MKK3Rlc3QgLXogIiRMVENGTEFHUyIgJiYgTFRDRkxBR1M9JENGTEFHUwordGVzdCAteiAiJExEIiAmJiBMRD1sZAordGVzdCAteiAiJGFjX29iamV4dCIgJiYgYWNfb2JqZXh0PW8KKworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCitjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorZmlsZV9tYWdpYyopCisgIGlmIHRlc3QgIiRmaWxlX21hZ2ljX2NtZCIgPSAnJE1BR0lDX0NNRCc7IHRoZW4KKyAgICBfTFRfUEFUSF9NQUdJQworICBmaQorICA7OworZXNhYworCisjIFVzZSBDIGZvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJ0b29sIHNjcmlwdAorTFRfU1VQUE9SVEVEX1RBRyhbQ0NdKQorX0xUX0xBTkdfQ19DT05GSUcKK19MVF9MQU5HX0RFRkFVTFRfQ09ORklHCitfTFRfQ09ORklHX0NPTU1BTkRTCitdKSMgX0xUX1NFVFVQCisKKworIyBfTFRfUFJPR19MVE1BSU4KKyMgLS0tLS0tLS0tLS0tLS0tCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgY2FsbGVkIGJvdGggZnJvbSBgY29uZmlndXJlJywgYW5kIGBjb25maWcuc3RhdHVzJworIyBub3cgdGhhdCB3ZSB1c2UgQUNfQ09ORklHX0NPTU1BTkRTIHRvIGdlbmVyYXRlIGxpYnRvb2wuICBOb3RhYmx5LAorIyBgY29uZmlnLnN0YXR1cycgaGFzIG5vIHZhbHVlIGZvciBhY19hdXhfZGlyIHVubGVzcyB3ZSBhcmUgdXNpbmcgQXV0b21ha2UsCisjIHNvIHdlIHBhc3MgYSBjb3B5IGFsb25nIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBzZW5zaWJsZSB2YWx1ZSBhbnl3YXkuCittNF9kZWZ1bihbX0xUX1BST0dfTFRNQUlOXSwKK1ttNF9pZmRlZihbQUNfUkVRVUlSRV9BVVhfRklMRV0sIFtBQ19SRVFVSVJFX0FVWF9GSUxFKFtsdG1haW4uc2hdKV0pZG5sCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbYWNfYXV4X2Rpcj0nJGFjX2F1eF9kaXInXSkKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorXSkjIF9MVF9QUk9HX0xUTUFJTgorCisKKworIyBTbyB0aGF0IHdlIGNhbiByZWNyZWF0ZSBhIGZ1bGwgbGlidG9vbCBzY3JpcHQgaW5jbHVkaW5nIGFkZGl0aW9uYWwKKyMgdGFncywgd2UgYWNjdW11bGF0ZSB0aGUgY2h1bmtzIG9mIGNvZGUgdG8gc2VuZCB0byBBQ19DT05GSUdfQ09NTUFORFMKKyMgaW4gbWFjcm9zIGFuZCB0aGVuIG1ha2UgYSBzaW5nbGUgY2FsbCBhdCB0aGUgZW5kIHVzaW5nIHRoZSBgbGlidG9vbCcKKyMgbGFiZWwuCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbSU5JVC1DT01NQU5EU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgSU5JVC1DT01NQU5EUyB0byBiZSBwYXNzZWQgdG8gQUNfQ09ORklHX0NPTU1BTkRTIGxhdGVyLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX0xJQlRPT0xfSU5JVF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9JTklUXSkKKworCisjIF9MVF9DT05GSUdfTElCVE9PTChbQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVnaXN0ZXIgQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MXSwKK1ttNF9pZnZhbChbJDFdLAorICAgICAgICAgIFttNF9hcHBlbmQoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sCisgICAgICAgICAgICAgICAgICAgICBbJDEKK10pXSldKQorCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10pCisKKworIyBfTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoW0NPTU1BTkRTXSwgW0lOSVRfQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT05GSUdfU0FWRV9DT01NQU5EU10sCitbX0xUX0NPTkZJR19MSUJUT09MKFskMV0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbJDJdKQorXSkKKworCisjIF9MVF9GT1JNQVRfQ09NTUVOVChbQ09NTUVOVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBsZWFkaW5nIGNvbW1lbnQgbWFya3MgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggbGluZSwgYW5kIGEgdHJhaWxpbmcKKyMgZnVsbC1zdG9wIHRvIHRoZSB3aG9sZSBjb21tZW50IGlmIG9uZSBpcyBub3QgcHJlc2VudCBhbHJlYWR5LgorbTRfZGVmaW5lKFtfTFRfRk9STUFUX0NPTU1FTlRdLAorW200X2lmdmFsKFskMV0sIFsKK200X2JwYXRzdWJzdChbbTRfYnBhdHN1YnN0KFskMV0sIFteICpdLCBbIyBdKV0sCisgICAgICAgICAgICAgIFtbJ2AkXF1dLCBbXFxcJl0pXW00X2JtYXRjaChbJDFdLCBbWyE/Ll0kXSwgW10sIFsuXSkKKyldKQorCisKKworCisKKyMgX0xUX0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSwgW0lTLVRBR0dFRD9dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENPTkZJR05BTUUgaXMgdGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIHZhbHVlIGluIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyMgVkFSTkFNRSBpcyB0aGUgKGJhc2UpIG5hbWUgdXNlZCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KKyMgVkFMVUUgbWF5IGJlIDAsIDEgb3IgMiBmb3IgYSBjb21wdXRlZCBxdW90ZSBlc2NhcGVkIHZhbHVlIGJhc2VkIG9uCisjIFZBUk5BTUUuICBBbnkgb3RoZXIgdmFsdWUgd2lsbCBiZSB1c2VkIGRpcmVjdGx5LgorbTRfZGVmaW5lKFtfTFRfREVDTF0sCitbbHRfaWZfYXBwZW5kX3VuaXEoW2x0X2RlY2xfdmFybmFtZXNdLCBbJDJdLCBbLCBdLAorICAgIFtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtsaWJ0b29sX25hbWVdLAorCVttNF9pZnZhbChbJDFdLCBbJDFdLCBbJDJdKV0pCisgICAgbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbdmFsdWVdLCBbJDNdKQorICAgIG00X2lmdmFsKFskNF0sCisJW2x0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW2Rlc2NyaXB0aW9uXSwgWyQ0XSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwKKwlbdGFnZ2VkP10sIFttNF9pZnZhbChbJDVdLCBbeWVzXSwgW25vXSldKV0pCitdKQorCisKKyMgX0xUX1RBR0RFQ0woW0NPTkZJR05BTUVdLCBWQVJOQU1FLCBWQUxVRSwgW0RFU0NSSVBUSU9OXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR0RFQ0xdLCBbX0xUX0RFQ0woWyQxXSwgWyQyXSwgWyQzXSwgWyQ0XSwgW3llc10pXSkKKworCisjIGx0X2RlY2xfdGFnX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF90YWdfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFt5ZXNdLCAkQCldKQorCisKKyMgX2x0X2RlY2xfZmlsdGVyKFNVQktFWSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfbHRfZGVjbF9maWx0ZXJdLAorW200X2Nhc2UoWyQjXSwKKyAgWzBdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCisgIFsxXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKKyAgWzJdLCBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sIFskMV0sIFskMl0sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFszXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbJDNdLCBsdF9kZWNsX3Zhcm5hbWVzKV0sCisgIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgJEApXSlbXWRubAorXSkKKworCisjIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfcXVvdGVfdmFybmFtZXNdLAorW19sdF9kZWNsX2ZpbHRlcihbdmFsdWVdLCBbMV0sICRAKV0pCisKKworIyBsdF9kZWNsX2RxdW90ZV92YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzJdLCAkQCldKQorCisKKyMgbHRfZGVjbF92YXJuYW1lc190YWdnZWQoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZF0sCitbbTRfYXNzZXJ0KFskIyA8PSAyXSlkbmwKK18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgIG00X2lmdmFsKFskMl0sIFtbJDJdXSwgW200X2RxdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyldKSwKKyAgICBtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfcXVvdGUoX0xUX1RBR1MpKSwgWyBdKSldKQorbTRfZGVmaW5lKFtfbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2lmdmFsKFskM10sIFtsdF9jb21iaW5lKFskMV0sIFskMl0sIFtfXSwgJDMpXSldKQorCisKKyMgbHRfZGVjbF9hbGxfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2FsbF92YXJuYW1lc10sCitbXyQwKG00X3F1b3RlKG00X2RlZmF1bHQoWyQxXSwgW1ssIF1dKSksCisgICAgIG00X2lmKFskMl0sIFtdLAorCSAgIG00X3F1b3RlKGx0X2RlY2xfdmFybmFtZXMpLAorCW00X3F1b3RlKG00X3NoaWZ0KCRAKSkpKVtdZG5sCitdKQorbTRfZGVmaW5lKFtfbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW2x0X2pvaW4oJEAsIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFskMV0sCisJCQlsdF9kZWNsX3RhZ192YXJuYW1lcyhbWywgXV0sIG00X3NoaWZ0KCRAKSkpKWRubAorXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoW1ZBUk5BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUXVvdGUgYSB2YXJpYWJsZSB2YWx1ZSwgYW5kIGZvcndhcmQgaXQgdG8gYGNvbmZpZy5zdGF0dXMnIHNvIHRoYXQgaXRzCisjIGRlY2xhcmF0aW9uIHRoZXJlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBpbiBgY29uZmlndXJlJy4gIFZBUk5BTUUKKyMgbXVzdCBoYXZlIGEgc2luZ2xlIHF1b3RlIGRlbGltaXRlZCB2YWx1ZSBmb3IgdGhpcyB0byB3b3JrLgorbTRfZGVmaW5lKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFXSwKK1skMT0nYCRFQ0hPICJYJF1bJDEiIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCddKQorCisKKyMgX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSQVRJT05TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXZSBkZWxpbWl0IGxpYnRvb2wgY29uZmlnIHZhcmlhYmxlcyB3aXRoIHNpbmdsZSBxdW90ZXMsIHNvIHdoZW4KKyMgd2Ugd3JpdGUgdGhlbSB0byBjb25maWcuc3RhdHVzLCB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gcXVvdGUgYWxsCisjIGVtYmVkZGVkIHNpbmdsZSBxdW90ZXMgcHJvcGVybHkuICBJbiBjb25maWd1cmUsIHRoaXMgbWFjcm8gZXhwYW5kcworIyBlYWNoIHZhcmlhYmxlIGRlY2xhcmVkIHdpdGggX0xUX0RFQ0wgKGFuZCBfTFRfVEFHREVDTCkgaW50bzoKKyMKKyMgICAgPHZhcj49J2AkRUNITyAiWCQ8dmFyPiIgfCAkWHNlZCAtZSAiJGRlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdCJgJworbTRfZGVmdW4oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfYWxsX3Zhcm5hbWVzKSwKKyAgICBbbTRfbihbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRShfbHRfdmFyKV0pXSldKQorCisKKyMgX0xUX0xJQlRPT0xfVEFHUworIyAtLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCBjb21tZW50IGFuZCBsaXN0IG9mIHRhZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBzY3JpcHQKK200X2RlZnVuKFtfTFRfTElCVE9PTF9UQUdTXSwKK1tfTFRfRk9STUFUX0NPTU1FTlQoW1RoZSBuYW1lcyBvZiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdF0pZG5sCithdmFpbGFibGVfdGFncz0iX0xUX1RBR1MiZG5sCitdKQorCisKKyMgX0xUX0xJQlRPT0xfREVDTEFSRShWQVJOQU1FLCBbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXh0cmFjdCB0aGUgZGljdGlvbmFyeSB2YWx1ZXMgZm9yIFZBUk5BTUUgKG9wdGlvbmFsbHkgd2l0aCBUQUcpIGFuZAorIyBleHBhbmQgdG8gYSBjb21tZW50ZWQgc2hlbGwgdmFyaWFibGUgc2V0dGluZzoKKyMKKyMgICAgIyBTb21lIGNvbW1lbnQgYWJvdXQgd2hhdCBWQVIgaXMgZm9yLgorIyAgICB2aXNpYmxlX25hbWU9JGx0X2ludGVybmFsX25hbWUKK200X2RlZmluZShbX0xUX0xJQlRPT0xfREVDTEFSRV0sCitbX0xUX0ZPUk1BVF9DT01NRU5UKG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sCisJCQkJCSAgIFtkZXNjcmlwdGlvbl0pKSlbXWRubAorbTRfcHVzaGRlZihbX2xpYnRvb2xfbmFtZV0sCisgICAgbTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW2xpYnRvb2xfbmFtZV0pKSlbXWRubAorbTRfY2FzZShtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbdmFsdWVdKSksCisgICAgWzBdLCBbX2xpYnRvb2xfbmFtZT1bJF0kMV0sCisgICAgWzFdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCisgICAgWzJdLCBbX2xpYnRvb2xfbmFtZT0kbHRfW10kMV0sCisgICAgW19saWJ0b29sX25hbWU9bHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW3ZhbHVlXSldKVtdZG5sCittNF9pZnZhbChbJDJdLCBbXyQyXSlbXW00X3BvcGRlZihbX2xpYnRvb2xfbmFtZV0pW11kbmwKK10pCisKKworIyBfTFRfTElCVE9PTF9DT05GSUdfVkFSUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIGNvbW1lbnRlZCBkZWNsYXJhdGlvbnMgb2Ygbm9uLXRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMKKyMgc3VpdGFibGUgZm9yIGluc2VydGlvbiBpbiB0aGUgTElCVE9PTCBDT05GSUcgc2VjdGlvbiBvZiB0aGUgYGxpYnRvb2wnCisjIHNjcmlwdC4gIFRhZ2dlZCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgKGV2ZW4gZm9yIHRoZSBMSUJUT09MIENPTkZJRworIyBzZWN0aW9uKSBhcmUgcHJvZHVjZWQgYnkgX0xUX0xJQlRPT0xfVEFHX1ZBUlMuCittNF9kZWZ1bihbX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLAorICAgIG00X3F1b3RlKF9sdF9kZWNsX2ZpbHRlcihbdGFnZ2VkP10sIFtub10sIFtdLCBsdF9kZWNsX3Zhcm5hbWVzKSksCisgICAgW200X24oW19MVF9MSUJUT09MX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKKworCisjIF9MVF9MSUJUT09MX1RBR19WQVJTKFRBRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfTElCVE9PTF9UQUdfVkFSU10sCitbbTRfZm9yZWFjaChbX2x0X3Zhcl0sIG00X3F1b3RlKGx0X2RlY2xfdGFnX3Zhcm5hbWVzKSwKKyAgICBbbTRfbihbX0xUX0xJQlRPT0xfREVDTEFSRShfbHRfdmFyLCBbJDFdKV0pXSldKQorCisKKyMgX0xUX1RBR1ZBUihWQVJOQU1FLCBbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfVEFHVkFSXSwgW200X2lmdmFsKFskMl0sIFskMV8kMl0sIFskMV0pXSkKKworCisjIF9MVF9DT05GSUdfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZW5kIGFjY3VtdWxhdGVkIG91dHB1dCB0byAkQ09ORklHX1NUQVRVUy4gIFRoYW5rcyB0byB0aGUgbGlzdHMgb2YKKyMgdmFyaWFibGVzIGZvciBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZSBlc2NhcGluZyB3ZSBzYXZlZCBmcm9tIGNhbGxzCisjIHRvIF9MVF9ERUNMLCB3ZSBjYW4gcHV0IHF1b3RlIGVzY2FwZWQgdmFyaWFibGVzIGRlY2xhcmF0aW9ucworIyBpbnRvIGBjb25maWcuc3RhdHVzJywgYW5kIHRoZW4gdGhlIHNoZWxsIGNvZGUgdG8gcXVvdGUgZXNjYXBlIHRoZW0gaW4KKyMgZm9yIGxvb3BzIGluIGBjb25maWcuc3RhdHVzJy4gIEZpbmFsbHksIGFueSBhZGRpdGlvbmFsIGNvZGUgYWNjdW11bGF0ZWQKKyMgZnJvbSBjYWxscyB0byBfTFRfQ09ORklHX0xJQlRPT0xfSU5JVCBpcyBleHBhbmRlZC4KK200X2RlZnVuKFtfTFRfQ09ORklHX0NPTU1BTkRTXSwKK1tBQ19QUk9WSURFX0lGRUxTRShbTFRfT1VUUFVUXSwKKwlkbmwgSWYgdGhlIGxpYnRvb2wgZ2VuZXJhdGlvbiBjb2RlIGhhcyBiZWVuIHBsYWNlZCBpbiAkQ09ORklHX0xULAorCWRubCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0IGFsbCBvdmVyIGFnYWluIGludG8gY29uZmlnLnN0YXR1cywKKwlkbmwgdGhlbiB3ZSB3aWxsIGhhdmUgY29uZmlnLnN0YXR1cyBydW4gJENPTkZJR19MVCBsYXRlciwgc28gaXQKKwlkbmwgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgaXMgc3RvcmVkIHRoZXJlOgorICAgICAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKKyAgICAgICAgICAgIFskU0hFTEwgJENPTkZJR19MVCB8fCBBU19FWElUKDEpXSwgW0NPTkZJR19MVD0nJENPTkZJR19MVCddKV0sCisgICAgZG5sIElmIHRoZSBsaWJ0b29sIGdlbmVyYXRpb24gY29kZSBpcyBkZXN0aW5lZCBmb3IgY29uZmlnLnN0YXR1cywKKyAgICBkbmwgZXhwYW5kIHRoZSBhY2N1bXVsYXRlZCBjb21tYW5kcyBhbmQgaW5pdCBjb2RlIG5vdzoKKyAgICBbQUNfQ09ORklHX0NPTU1BTkRTKFtsaWJ0b29sXSwKKyAgICAgICAgW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU10sIFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVF0pXSkKK10pI19MVF9DT05GSUdfQ09NTUFORFMKKworCisjIEluaXRpYWxpemUuCittNF9kZWZpbmUoW19MVF9PVVRQVVRfTElCVE9PTF9DT01NQU5EU19JTklUXSwKK1sKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworZG91YmxlX3F1b3RlX3N1YnN0PSckZG91YmxlX3F1b3RlX3N1YnN0JworZGVsYXlfdmFyaWFibGVfc3Vic3Q9JyRkZWxheV92YXJpYWJsZV9zdWJzdCcKK19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworTFRDQz0nJExUQ0MnCitMVENGTEFHUz0nJExUQ0ZMQUdTJworY29tcGlsZXI9JyRjb21waWxlcl9ERUZBVUxUJworCisjIFF1b3RlIGV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCitdXSwgbHRfZGVjbF9xdW90ZV92YXJuYW1lcyk7IGRvCisgICAgY2FzZSBcYGV2YWwgXFxcXFwkRUNITyAiWFxcXFxcJFwkdmFyIlxgIGluCisgICAgKltbXFxcXFxcXGBcXCJcXFwkXV0qKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXGBcXFwkRUNITyBcXCJYXFxcJFwkdmFyXFwiIHwgXFxcJFhzZWQgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIlxcXGBcXFxcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfXCR2YXI9XFxcXFxcIlxcXCRcJHZhclxcXFxcXCIiCisgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorZm9yIHZhciBpbiBsdF9kZWNsX2FsbF92YXJuYW1lcyhbWyBcCitdXSwgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMpOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gIlhcXFxcXCRcJHZhciJcYCBpbgorICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiWFxcXCRcJHZhclxcIiB8IFxcXCRYc2VkIC1lIFxcIlxcXCRkb3VibGVfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJHNlZF9xdW90ZV9zdWJzdFxcIiAtZSBcXCJcXFwkZGVsYXlfdmFyaWFibGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRml4LXVwIGZhbGxiYWNrIGVjaG8gaWYgaXQgd2FzIG1hbmdsZWQgYnkgdGhlIGFib3ZlIHF1b3RpbmcgcnVsZXMuCitjYXNlIFwkbHRfRUNITyBpbgorKidcXFxbJF0wIC0tZmFsbGJhY2stZWNobyInKWRubCAiCisgIGx0X0VDSE89XGBcJEVDSE8gIlhcJGx0X0VDSE8iIHwgXCRYc2VkIC1lICdzL1xcXFxcXFxcXFxcXFxcXFskXTAgLS1mYWxsYmFjay1lY2hvIlxbJF0vXFskXTAgLS1mYWxsYmFjay1lY2hvIi8nXGAKKyAgOzsKK2VzYWMKKworX0xUX09VVFBVVF9MSUJUT09MX0lOSVQKK10pCisKKworIyBMVF9PVVRQVVQKKyMgLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gYWxsb3dzIGVhcmx5IGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0IChiZWZvcmUKKyMgQUNfT1VUUFVUIGlzIGNhbGxlZCksIGluY2FzZSBpdCBpcyB1c2VkIGluIGNvbmZpZ3VyZSBmb3IgY29tcGlsYXRpb24KKyMgdGVzdHMuCitBQ19ERUZVTihbTFRfT1VUUFVUXSwKK1s6ICR7Q09ORklHX0xUPS4vY29uZmlnLmx0fQorQUNfTVNHX05PVElDRShbY3JlYXRpbmcgJENPTkZJR19MVF0pCitjYXQgPiIkQ09ORklHX0xUIiA8PF9MVEVPRgorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgYSBsaWJ0b29sIHN0dWIgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorCitsdF9jbF9zaWxlbnQ9ZmFsc2UKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitfTFRFT0YKKworY2F0ID4+IiRDT05GSUdfTFQiIDw8XF9MVEVPRgorQVNfU0hFTExfU0FOSVRJWkUKK19BU19QUkVQQVJFCisKK2V4ZWMgQVNfTUVTU0FHRV9GRD4mMQorZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZworeworICBlY2hvCisgIEFTX0JPWChbUnVubmluZyAkYXNfbWUuXSkKK30gPiZBU19NRVNTQUdFX0xPR19GRAorCitsdF9jbF9oZWxwPSJcCitcYCRhc19tZScgY3JlYXRlcyBhIGxvY2FsIGxpYnRvb2wgc3R1YiBmcm9tIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sCitmb3IgdXNlIGluIGZ1cnRoZXIgY29uZmlndXJlIHRpbWUgdGVzdHMgYmVmb3JlIHRoZSByZWFsIGxpYnRvb2wgaXMKK2dlbmVyYXRlZC4KKworVXNhZ2U6ICRbMF0gW1tPUFRJT05TXV0KKworICAtaCwgLS1oZWxwICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcworCitSZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uIgorCitsdF9jbF92ZXJzaW9uPSJcCittNF9pZnNldChbQUNfUEFDS0FHRV9OQU1FXSwgW0FDX1BBQ0tBR0VfTkFNRSBdKWNvbmZpZy5sdFtdZG5sCittNF9pZnNldChbQUNfUEFDS0FHRV9WRVJTSU9OXSwgWyBBQ19QQUNLQUdFX1ZFUlNJT05dKQorY29uZmlndXJlZCBieSAkWzBdLCBnZW5lcmF0ZWQgYnkgbTRfUEFDS0FHRV9TVFJJTkcuCisKK0NvcHlyaWdodCAoQykgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLmx0IHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCisKK3doaWxlIHRlc3QgJFsjXSAhPSAwCitkbworICBjYXNlICRbMV0gaW4KKyAgICAtLXZlcnNpb24gfCAtLXYqIHwgLVYgKQorICAgICAgZWNobyAiJGx0X2NsX3ZlcnNpb24iOyBleGl0IDAgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgZWNobyAiJGx0X2NsX2hlbHAiOyBleGl0IDAgOzsKKyAgICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgICAgIGRlYnVnPTogOzsKKyAgICAtLXF1aWV0IHwgLS1xKiB8IC0tc2lsZW50IHwgLS1zKiB8IC1xICkKKyAgICAgIGx0X2NsX3NpbGVudD06IDs7CisKKyAgICAtKikgQUNfTVNHX0VSUk9SKFt1bnJlY29nbml6ZWQgb3B0aW9uOiAkWzFdCitUcnkgXGAkWzBdIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXSkgOzsKKworICAgICopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIGFyZ3VtZW50OiAkWzFdCitUcnkgXGAkWzBdIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXSkgOzsKKyAgZXNhYworICBzaGlmdAorZG9uZQorCitpZiAkbHRfY2xfc2lsZW50OyB0aGVuCisgIGV4ZWMgQVNfTUVTU0FHRV9GRD4vZGV2L251bGwKK2ZpCitfTFRFT0YKKworY2F0ID4+IiRDT05GSUdfTFQiIDw8X0xURU9GCitfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVAorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PFxfTFRFT0YKK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRvZmlsZV0pCitfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFMKK0FTX0VYSVQoMCkKK19MVEVPRgorY2htb2QgK3ggIiRDT05GSUdfTFQiCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYnV0IGNvbmZpZy5sdCBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sCisjIGFwcGVuZGluZyB0byBjb25maWcubG9nLCB3aGljaCBmYWlscyBvbiBET1MsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdAorIyBvcGVuIGJ5IGNvbmZpZ3VyZS4gIEhlcmUgd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLCBlZmZlY3RpdmVseSBjbG9zaW5nCisjIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZCBhcHBlbmRlZCB0byBieSBjb25maWcubHQuCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgbHRfY2xfc3VjY2Vzcz06CisgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisgICAgbHRfY29uZmlnX2x0X2FyZ3M9IiRsdF9jb25maWdfbHRfYXJncyAtLXF1aWV0IgorICBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPi9kZXYvbnVsbAorICAkU0hFTEwgIiRDT05GSUdfTFQiICRsdF9jb25maWdfbHRfYXJncyB8fCBsdF9jbF9zdWNjZXNzPWZhbHNlCisgIGV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKKyAgJGx0X2NsX3N1Y2Nlc3MgfHwgQVNfRVhJVCgxKQorZmkKK10pIyBMVF9PVVRQVVQKKworCisjIF9MVF9DT05GSUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgSWYgVEFHIGlzIHRoZSBidWlsdC1pbiB0YWcsIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0IHdpdGggYQorIyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UgYWRkIGNvZGUKKyMgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5IFRBRyBmcm9tIHRoZQorIyBtYXRjaGluZyB0YWdnZWQgY29uZmlnIHZhcnMuCittNF9kZWZ1bihbX0xUX0NPTkZJR10sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCitfTFRfQ09ORklHX1NBVkVfQ09NTUFORFMoWworICBtNF9kZWZpbmUoW19MVF9UQUddLCBtNF9pZihbJDFdLCBbXSwgW0NdLCBbJDFdKSlkbmwKKyAgbTRfaWYoX0xUX1RBRywgW0NdLCBbCisgICAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91cgorICAgICMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICAgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICAgIGZpCisKKyAgICBjZmdmaWxlPSIke29maWxlfVQiCisgICAgdHJhcCAiJFJNIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKKyAgICAkUk0gIiRjZmdmaWxlIgorCisgICAgY2F0IDw8X0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisjISAkU0hFTEwKKworIyBgJEVDSE8gIiRvZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJGFzX21lICgkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KKyMKK19MVF9DT1BZSU5HCitfTFRfTElCVE9PTF9UQUdTCisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHCitfTFRfTElCVE9PTF9DT05GSUdfVkFSUworX0xUX0xJQlRPT0xfVEFHX1ZBUlMKKyMgIyMjIEVORCBMSUJUT09MIENPTkZJRworCitfTFRfRU9GCisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICBjYXQgPDxcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorX0xUX0VPRgorICAgIDs7CisgIGVzYWMKKworICBfTFRfUFJPR19MVE1BSU4KKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJy9eIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUvcScgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgX0xUX1BST0dfWFNJX1NIRUxMRk5TCisKKyAgc2VkIC1uICcvXiMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlLywkcCcgIiRsdG1haW4iID4+ICIkY2ZnZmlsZSIgXAorICAgIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCisgIGNobW9kICt4ICIkb2ZpbGUiCitdLAorW2NhdCA8PF9MVF9FT0YgPj4gIiRvZmlsZSIKKworZG5sIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byB1c2UgJDEgaGVyZSwgc2luY2UgX0xUX1RBRyBpcyBub3QgZXhwYW5kZWQKK2RubCBpbiBhIGNvbW1lbnQgKGllIGFmdGVyIGEgIykuCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfTElCVE9PTF9UQUdfVkFSUyhfTFRfVEFHKQorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJDEKK19MVF9FT0YKK10pZG5sIC9tNF9pZgorXSwKK1ttNF9pZihbJDFdLCBbXSwgWworICAgIFBBQ0tBR0U9JyRQQUNLQUdFJworICAgIFZFUlNJT049JyRWRVJTSU9OJworICAgIFRJTUVTVEFNUD0nJFRJTUVTVEFNUCcKKyAgICBSTT0nJFJNJworICAgIG9maWxlPSckb2ZpbGUnXSwgW10pCitdKWRubCAvX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTCitdKSMgX0xUX0NPTkZJRworCisKKyMgTFRfU1VQUE9SVEVEX1RBRyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcmFjZSB0aGlzIG1hY3JvIHRvIGRpc2NvdmVyIHdoYXQgdGFncyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBsaWJ0b29sCisjIC0tdGFnIG9wdGlvbiwgdXNpbmc6CisjICAgIGF1dG9jb25mIC0tdHJhY2UgJ0xUX1NVUFBPUlRFRF9UQUc6JDEnCitBQ19ERUZVTihbTFRfU1VQUE9SVEVEX1RBR10sIFtdKQorCisKKyMgQyBzdXBwb3J0IGlzIGJ1aWx0LWluIGZvciBub3cKK200X2RlZmluZShbX0xUX0xBTkdfQ19lbmFibGVkXSwgW10pCittNF9kZWZpbmUoW19MVF9UQUdTXSwgW10pCisKKworIyBMVF9MQU5HKExBTkcpCisjIC0tLS0tLS0tLS0tLS0KKyMgRW5hYmxlIGxpYnRvb2wgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuCitBQ19ERUZVTihbTFRfTEFOR10sCitbQUNfQkVGT1JFKFskMF0sIFtMVF9PVVRQVVRdKWRubAorbTRfY2FzZShbJDFdLAorICBbQ10sCQkJW19MVF9MQU5HKEMpXSwKKyAgW0MrK10sCQlbX0xUX0xBTkcoQ1hYKV0sCisgIFtKYXZhXSwJCVtfTFRfTEFORyhHQ0opXSwKKyAgW0ZvcnRyYW4gNzddLAkJW19MVF9MQU5HKEY3NyldLAorICBbRm9ydHJhbl0sCQlbX0xUX0xBTkcoRkMpXSwKKyAgW1dpbmRvd3MgUmVzb3VyY2VdLAlbX0xUX0xBTkcoUkMpXSwKKyAgW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX0NPTkZJR10sCisgICAgW19MVF9MQU5HKCQxKV0sCisgICAgW200X2ZhdGFsKFskMDogdW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICIkMSJdKV0pXSlkbmwKK10pIyBMVF9MQU5HCisKKworIyBfTFRfTEFORyhMQU5HTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkddLAorW200X2lmZGVmKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSwKKyAgW0xUX1NVUFBPUlRFRF9UQUcoWyQxXSlkbmwKKyAgbTRfYXBwZW5kKFtfTFRfVEFHU10sIFskMSBdKWRubAorICBtNF9kZWZpbmUoW19MVF9MQU5HX10kMVtfZW5hYmxlZF0sIFtdKWRubAorICBfTFRfTEFOR18kMV9DT05GSUcoJDEpXSlkbmwKK10pIyBfTFRfTEFORworCisKKyMgX0xUX0xBTkdfREVGQVVMVF9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfTEFOR19ERUZBVUxUX0NPTkZJR10sCitbQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKyAgW0xUX0xBTkcoQ1hYKV0sCisgIFttNF9kZWZpbmUoW0FDX1BST0dfQ1hYXSwgZGVmbihbQUNfUFJPR19DWFhdKVtMVF9MQU5HKENYWCldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0Y3N10sCisgIFtMVF9MQU5HKEY3NyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0Y3N10sIGRlZm4oW0FDX1BST0dfRjc3XSlbTFRfTEFORyhGNzcpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GQ10sCisgIFtMVF9MQU5HKEZDKV0sCisgIFttNF9kZWZpbmUoW0FDX1BST0dfRkNdLCBkZWZuKFtBQ19QUk9HX0ZDXSlbTFRfTEFORyhGQyldKV0pCisKK2RubCBUaGUgY2FsbCB0byBbQV1bTV9QUk9HX0dDSl0gaXMgcXVvdGVkIGxpa2UgdGhhdCB0byBzdG9wIGFjbG9jYWwKK2RubCBwdWxsaW5nIHRoaW5ncyBpbiBuZWVkbGVzc2x5LgorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSwKKyAgW0xUX0xBTkcoR0NKKV0sCisgIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sCisgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX0dDSl0sCisgICAgICBbTFRfTEFORyhHQ0opXSwKKyAgICAgIFttNF9pZmRlZihbQUNfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0FDX1BST0dfR0NKXSwgZGVmbihbQUNfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pCisgICAgICAgbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0FdW01fUFJPR19HQ0pdLCBkZWZuKFtBXVtNX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtMVF9QUk9HX0dDSl0sCisJW200X2RlZmluZShbTFRfUFJPR19HQ0pdLCBkZWZuKFtMVF9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSldKV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0xUX1BST0dfUkNdLAorICBbTFRfTEFORyhSQyldLAorICBbbTRfZGVmaW5lKFtMVF9QUk9HX1JDXSwgZGVmbihbTFRfUFJPR19SQ10pW0xUX0xBTkcoUkMpXSldKQorXSkjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisKKyMgT2Jzb2xldGUgbWFjcm9zOgorQVVfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW0xUX0xBTkcoQysrKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbTFRfTEFORyhGb3J0cmFuIDc3KV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtMVF9MQU5HKEZvcnRyYW4pXSkKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtMVF9MQU5HKEphdmEpXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9DWFhdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9GNzddLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9GQ10sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0dDSl0sIFtdKQorCisKKyMgX0xUX1RBR19DT01QSUxFUgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1RBR19DT01QSUxFUl0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisKK19MVF9ERUNMKFtMVENDXSwgW0NDXSwgWzFdLCBbQSBDIGNvbXBpbGVyXSlkbmwKK19MVF9ERUNMKFtMVENGTEFHU10sIFtDRkxBR1NdLCBbMV0sIFtMVENDIGNvbXBpbGVyIGZsYWdzXSlkbmwKK19MVF9UQUdERUNMKFtDQ10sIFtjb21waWxlcl0sIFsxXSwgW0EgbGFuZ3VhZ2Ugc3BlY2lmaWMgY29tcGlsZXJdKWRubAorX0xUX1RBR0RFQ0woW3dpdGhfZ2NjXSwgW0dDQ10sIFswXSwgW0lzIHRoZSBjb21waWxlciB0aGUgR05VIGNvbXBpbGVyP10pZG5sCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKK10pIyBfTFRfVEFHX0NPTVBJTEVSCisKKworIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBjb21waWxlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGNvbXBpbGVyIHRlc3QgY29kZS4KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfY29tcGlsZSIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9jb21waWxlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSBjb25mdGVzdCoKK10pIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKworCisjIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgbGlua2VyIGJvaWxlcnBsYXRlIG91dHB1dCBvciB3YXJuaW5ncyB3aXRoCisjIHRoZSBzaW1wbGUgbGluayB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorZWNobyAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRSTSAtciBjb25mdGVzdCoKK10pIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1MKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW5fb25jZShbX0xUX1JFUVVJUkVEX0RBUldJTl9DSEVDS1NdLFsKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbiopCisgICAgQUNfQ0hFQ0tfVE9PTChbRFNZTVVUSUxdLCBbZHN5bXV0aWxdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTk1FRElUXSwgW25tZWRpdF0sIFs6XSkKKyAgICBBQ19DSEVDS19UT09MKFtMSVBPXSwgW2xpcG9dLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbT1RPT0xdLCBbb3Rvb2xdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbT1RPT0w2NF0sIFtvdG9vbDY0XSwgWzpdKQorICAgIF9MVF9ERUNMKFtdLCBbRFNZTVVUSUxdLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGFyY2hpdmVkIERXQVJGIGRlYnVnIHN5bWJvbCBmaWxlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtOTUVESVRdLCBbMV0sCisgICAgICBbVG9vbCB0byBjaGFuZ2UgZ2xvYmFsIHRvIGxvY2FsIHN5bWJvbHMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTElQT10sIFsxXSwKKyAgICAgIFtUb29sIHRvIG1hbmlwdWxhdGUgZmF0IG9iamVjdHMgYW5kIGFyY2hpdmVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW09UT09MXSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW09UT09MNjRdLCBbMV0sCisgICAgICBbbGRkL3JlYWRlbGYgbGlrZSB0b29sIGZvciA2NCBiaXQgTWFjaC1PIGJpbmFyaWVzIG9uIE1hYyBPUyBYIDEwLjRdKQorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtc2luZ2xlX21vZHVsZSBsaW5rZXIgZmxhZ10sW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2RdLAorICAgICAgW2x0X2N2X2FwcGxlX2NjX3NpbmdsZV9tb2Q9bm8KKyAgICAgIGlmIHRlc3QgLXogIiR7TFRfTVVMVElfTU9EVUxFfSI7IHRoZW4KKwkjIEJ5IGRlZmF1bHQgd2Ugd2lsbCBhZGQgdGhlIC1zaW5nbGVfbW9kdWxlIGZsYWcuIFlvdSBjYW4gb3ZlcnJpZGUKKwkjIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMVF9NVUxUSV9NT0RVTEUKKwkjIG5vbi1lbXB0eSBhdCBjb25maWd1cmUgdGltZSwgb3IgYnkgYWRkaW5nIC1tdWx0aV9tb2R1bGUgdG8gdGhlCisJIyBsaW5rIGZsYWdzLgorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwllY2hvICJpbnQgZm9vKHZvaWQpe3JldHVybiAxO30iID4gY29uZnRlc3QuYworCWVjaG8gIiRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCistZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyIgPiZBU19NRVNTQUdFX0xPR19GRAorCSRMVENDICRMVENGTEFHUyAkTERGTEFHUyAtbyBsaWJjb25mdGVzdC5keWxpYiBcCisJICAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgY29uZnRlc3QuYyAyPmNvbmZ0ZXN0LmVycgorICAgICAgICBfbHRfcmVzdWx0PSQ/CisJaWYgdGVzdCAtZiBsaWJjb25mdGVzdC5keWxpYiAmJiB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyICYmIHRlc3QgJF9sdF9yZXN1bHQgPSAwOyB0aGVuCisJICBsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPXllcworCWVsc2UKKwkgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorCWZpCisJcm0gLXJmIGxpYmNvbmZ0ZXN0LmR5bGliKgorCXJtIC1mIGNvbmZ0ZXN0LioKKyAgICAgIGZpXSkKKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgbGlua2VyIGZsYWddLAorICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdF0sCisgICAgICBbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vCisgICAgICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgIGVjaG8gIl9tYWluIiA+IGNvbmZ0ZXN0LnN5bQorICAgICAgTERGTEFHUz0iJExERkxBR1MgLVdsLC1leHBvcnRlZF9zeW1ib2xzX2xpc3QsY29uZnRlc3Quc3ltIgorICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSxbXSldLAorCVtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3Q9eWVzXSwKKwlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PW5vXSkKKwlMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIF0pCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKyAgICBkYXJ3aW4xLiopCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luKikgIyBkYXJ3aW4gNS54IG9uCisgICAgICAjIGlmIHJ1bm5pbmcgb24gMTAuNSBvciBsYXRlciwgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGRlZmF1bHRzCisgICAgICAjIHRvIHRoZSBPUyB2ZXJzaW9uLCBpZiBvbiB4ODYsIGFuZCAxMC40LCB0aGUgZGVwbG95bWVudAorICAgICAgIyB0YXJnZXQgZGVmYXVsdHMgdG8gMTAuNC4gRG9uJ3QgeW91IGxvdmUgaXQ/CisgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULTEwLjB9LCRob3N0IGluCisJMTAuMCwqODYqLWRhcndpbjgqfDEwLjAsKi1kYXJ3aW5bWzkxXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworCTEwLltbMDEyXV0qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworCTEwLiopCisJICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnIDs7CisgICAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBfbHRfZGFyX3NpbmdsZV9tb2Q9JyRzaW5nbGVfbW9kdWxlJworICAgIGZpCisgICAgaWYgdGVzdCAiJGx0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9leHBvcnRfc3ltcz0nICR7d2x9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltJworICAgIGVsc2UKKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9J34kTk1FRElUIC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGZpCisgICAgaWYgdGVzdCAiJERTWU1VVElMIiAhPSAiOiI7IHRoZW4KKyAgICAgIF9sdF9kc3ltdXRpbD0nfiREU1lNVVRJTCAkbGliIHx8IDonCisgICAgZWxzZQorICAgICAgX2x0X2RzeW11dGlsPQorICAgIGZpCisgICAgOzsKKyAgZXNhYworXSkKKworCisjIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrcyBmb3IgbGlua2VyIGFuZCBjb21waWxlciBmZWF0dXJlcyBvbiBkYXJ3aW4KK200X2RlZnVuKFtfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFU10sCitbCisgIG00X3JlcXVpcmUoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSkKKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScnCisgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9IiRfbHRfZGFyX2FsbG93X3VuZGVmaW5lZCIKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgaWZvcnQqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9eWVzIDs7CisgICAgICopIF9sdF9kYXJfY2FuX3NoYXJlZD0kR0NDIDs7CisgIGVzYWMKKyAgaWYgdGVzdCAiJF9sdF9kYXJfY2FuX3NoYXJlZCIgPSAieWVzIjsgdGhlbgorICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWVjaG8KKyAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSJcJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAkX2x0X2Rhcl9zaW5nbGVfbW9kJHtfbHRfZHN5bXV0aWx9IgorICAgIF9MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0iXCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZHN5bXV0aWx9IgorICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nICR7X2x0X2Rhcl9zaW5nbGVfbW9kfSR7X2x0X2Rhcl9leHBvcnRfc3ltc30ke19sdF9kc3ltdXRpbH0iCisgICAgX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0ic2VkIC1lICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgLWJ1bmRsZSBcJGxpYm9ianMgXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3Mke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIG00X2lmKFskMV0sIFtDWFhdLAorWyAgIGlmIHRlc3QgIiRsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kIiAhPSAieWVzIjsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0iXCRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vIFwke2xpYn0tbWFzdGVyLm8gXCRsaWJvYmpzflwkQ0MgLWR5bmFtaWNsaWIgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiBcJHtsaWJ9LW1hc3Rlci5vIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyR7X2x0X2RzeW11dGlsfSIKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJzZWQgJ3MsXixfLCcgPCBcJGV4cG9ydF9zeW1ib2xzID4gXCRvdXRwdXRfb2JqZGlyL1wke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltflwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIGZpCitdLFtdKQorICBlbHNlCisgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgZmkKK10pCisKKyMgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KK200X2RlZnVuKFtfTFRfU1lTX01PRFVMRV9QQVRIX0FJWF0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0xJTktfSUZFTFNFKEFDX0xBTkdfUFJPR1JBTSxbCitsdF9haXhfbGlicGF0aF9zZWQ9JworICAgIC9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsKKwkvXjAvIHsKKwkgICAgcy9eMCAgKlwoLipcKSQvXDEvCisJICAgIHAKKwl9CisgICAgfScKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgIiRsdF9haXhfbGlicGF0aF9zZWQiYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgorICBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKK2ZpXSxbXSkKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorXSkjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisKKworIyBfTFRfU0hFTExfSU5JVChBUkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1NIRUxMX0lOSVRdLAorW2lmZGVmKFtBQ19ESVZFUlNJT05fTk9USUNFXSwKKwkgICAgIFtBQ19ESVZFUlRfUFVTSChBQ19ESVZFUlNJT05fTk9USUNFKV0sCisJIFtBQ19ESVZFUlRfUFVTSChOT1RJQ0UpXSkKKyQxCitBQ19ESVZFUlRfUE9QCitdKSMgX0xUX1NIRUxMX0lOSVQKKworCisjIF9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBzb21lIGNvZGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdCB3aGljaAorIyB3aWxsIGZpbmQgYW4gZWNobyBjb21tYW5kIHdoaWNoIGRvZXNuJ3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorbTRfZGVmdW4oW19MVF9QUk9HX0VDSE9fQkFDS1NMQVNIXSwKK1tfTFRfU0hFTExfSU5JVChbCisjIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCitjYXNlIFgkbHRfRUNITyBpbgorWCotLWZhbGxiYWNrLWVjaG8pCisgICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCisgIEVDSE89YGVjaG8gIiRsdF9FQ0hPIiB8IHNlZCAncyxcXFxcXFskXVxcWyRdMCwnWyRdMCcsJ2AKKyAgOzsKK2VzYWMKKworRUNITz0ke2x0X0VDSE8tZWNob30KK2lmIHRlc3QgIlhbJF0xIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWFskXTEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIEF2b2lkIGlubGluZSBkb2N1bWVudCBoZXJlLCBpdCBtYXkgYmUgbGVmdCBvdmVyCisgIDoKK2VsaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnIDsgdGhlbgorICAjIFlpcHBlZSwgJEVDSE8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorICBleGVjICRTSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KK2ZpCisKK2lmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8X0xUX0VPRgorWyRdKgorX0xUX0VPRgorICBleGl0IDAKK2ZpCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgLXogIiRsdF9FQ0hPIjsgdGhlbgorICBpZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICAjIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKKyAgICBmb3IgY21kIGluICdzZWQgNTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMnEgIlskXTAiJyAnZWNobyB0ZXN0JzsgZG8KKyAgICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCisgICAgICBpZiB7IGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGA7IH0gMj4vZGV2L251bGwgJiYKKwkgeyB0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGwKKyAgICAgIHRoZW4KKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorCisgIGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWB7ICRFQ0hPICIkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGxgICYmCisgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgIDoKKyAgZWxzZQorICAgICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQorICAgICMgYmFja3NsYXNoZXMuICBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKKyAgICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJworICAgICMKKyAgICAjIFNvLCBmaXJzdCB3ZSBsb29rIGZvciBhIHdvcmtpbmcgZWNobyBpbiB0aGUgdXNlcidzIFBBVEguCisKKyAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbworICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgorICAgICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgICBFQ0hPPSIkZGlyL2VjaG8iCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKworICAgIGlmIHRlc3QgIlgkRUNITyIgPSBYZWNobzsgdGhlbgorICAgICAgIyBXZSBkaWRuJ3QgZmluZCBhIGJldHRlciBlY2hvLCBzbyBsb29rIGZvciBhbHRlcm5hdGl2ZXMuCisgICAgICBpZiB0ZXN0ICJYYHsgcHJpbnQgLXIgJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YHsgcHJpbnQgLXIgIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgfSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgICAjIFRoaXMgc2hlbGwgaGFzIGEgYnVpbHRpbiBwcmludCAtciB0aGF0IGRvZXMgdGhlIHRyaWNrLgorICAgICAgICBFQ0hPPSdwcmludCAtcicKKyAgICAgIGVsaWYgeyB0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0OyB9ICYmCisJICAgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgorICAgICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KKyAgICAgICAgT1JJR0lOQUxfQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisgICAgICAgIGV4cG9ydCBPUklHSU5BTF9DT05GSUdfU0hFTEwKKyAgICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCisgICAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgICAgZXhlYyAkQ09ORklHX1NIRUxMICJbJF0wIiAtLW5vLXJlZXhlYyAkezErIlskXUAifQorICAgICAgZWxzZQorICAgICAgICAjIFRyeSB1c2luZyBwcmludGYuCisgICAgICAgIEVDSE89J3ByaW50ZiAlc1xuJworICAgICAgICBpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWB7ICRFQ0hPICIkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJICAjIENvb2wsIHByaW50ZiB3b3JrcworCSAgOgorICAgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkT1JJR0lOQUxfQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwkgIENPTkZJR19TSEVMTD0kT1JJR0lOQUxfQ09ORklHX1NIRUxMCisJICBleHBvcnQgQ09ORklHX1NIRUxMCisJICBTSEVMTD0iJENPTkZJR19TSEVMTCIKKwkgIGV4cG9ydCBTSEVMTAorCSAgRUNITz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKKyAgICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJENPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJICBFQ0hPPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgICBlbHNlCisJICAjIG1heWJlIHdpdGggYSBzbWFsbGVyIHN0cmluZy4uLgorCSAgcHJldj06CisKKwkgIGZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiWyRdMCInICdzZWQgMTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDUwcSAiWyRdMCInOyBkbworCSAgICBpZiB7IHRlc3QgIlgkZWNob190ZXN0X3N0cmluZyIgPSAiWGBldmFsICRjbWRgIjsgfSAyPi9kZXYvbnVsbAorCSAgICB0aGVuCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgICAgcHJldj0iJGNtZCIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICJbJF0wIic7IHRoZW4KKwkgICAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKKwkgICAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKKwkgICAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIlskXTAiICR7MSsiWyRdQCJ9CisJICBlbHNlCisJICAgICMgT29wcy4gIFdlIGxvc3QgY29tcGxldGVseSwgc28ganVzdCBzdGljayB3aXRoIGVjaG8uCisJICAgIEVDSE89ZWNobworCSAgZmkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2ZpCisKKyMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSBzdWl0YWJseSBmb3IgcGFzc2luZyB0byBsaWJ0b29sIGZyb20KKyMgdGhlIE1ha2VmaWxlLCBpbnN0ZWFkIG9mIHF1b3RpbmcgdGhlIG9yaWdpbmFsLCB3aGljaCBpcyB1c2VkIGxhdGVyLgorbHRfRUNITz0kRUNITworaWYgdGVzdCAiWCRsdF9FQ0hPIiA9ICJYJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKyAgIGx0X0VDSE89IiRDT05GSUdfU0hFTEwgXFxcJFxbJF0wIC0tZmFsbGJhY2stZWNobyIKK2ZpCisKK0FDX1NVQlNUKGx0X0VDSE8pCitdKQorX0xUX0RFQ0woW10sIFtTSEVMTF0sIFsxXSwgW1NoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHNdKQorX0xUX0RFQ0woW10sIFtFQ0hPXSwgWzFdLAorICAgIFtBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXNdKQorXSkjIF9MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisKKworIyBfTFRfRU5BQkxFX0xPQ0sKKyMgLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0VOQUJMRV9MT0NLXSwKK1tBQ19BUkdfRU5BQkxFKFtsaWJ0b29sLWxvY2tdLAorICBbQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1saWJ0b29sLWxvY2tdLAorICAgIFthdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpXSldKQordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAgICpFTEYtMzIqKQorCUhQVVhfSUE2NF9NT0RFPSIzMiIKKwk7OworICAgICAgKkVMRi02NCopCisJSFBVWF9JQTY0X01PREU9IjY0IgorCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisqLSotaXJpeDYqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJzbWlwIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbWVsZjMyYm1pcG4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLW1lbGY2NGJtaXAiCisJOzsKKyAgICAgIGVzYWMKKyAgICBlbHNlCisgICAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisJKjMyLWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTMyIgorCSAgOzsKKwkqTjMyKikKKwkgIExEPSIke0xELWxkfSAtbjMyIgorCSAgOzsKKwkqNjQtYml0KikKKwkgIExEPSIke0xELWxkfSAtNjQiCisJICA7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworeDg2XzY0LSprZnJlZWJzZCotZ251fHg4Nl82NC0qbGludXgqfHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqfCBcCitzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqfHNwYXJjKi0qbGludXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICAgKjMyLWJpdCopCisJY2FzZSAkaG9zdCBpbgorCSAgeDg2XzY0LSprZnJlZWJzZCotZ251KQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODZfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCisJICAgIDs7CisJICBwcGM2NC0qbGludXgqfHBvd2VycGM2NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKKwkgICAgOzsKKwkgIHMzOTB4LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgKjY0LWJpdCopCisJY2FzZSAkaG9zdCBpbgorCSAgeDg2XzY0LSprZnJlZWJzZCotZ251KQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NF9mYnNkIgorCSAgICA7OworCSAgeDg2XzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGZfeDg2XzY0IgorCSAgICA7OworCSAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGY2NHBwYyIKKwkgICAgOzsKKwkgIHMzOTAqLSpsaW51eCp8czM5MCotKnRwZiopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zMzkwIgorCSAgICA7OworCSAgc3BhcmMqLSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKworKi0qLXNjbzMuMnY1KikKKyAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgorICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgorICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZl0sIGx0X2N2X2NjX25lZWRzX2JlbGYsCisgICAgW0FDX0xBTkdfUFVTSChDKQorICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbXV0sW1tdXSldLFtsdF9jdl9jY19uZWVkc19iZWxmPXllc10sW2x0X2N2X2NjX25lZWRzX2JlbGY9bm9dKQorICAgICBBQ19MQU5HX1BPUF0pCisgIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCisgICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCisgICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCisgIGZpCisgIDs7CitzcGFyYyotKnNvbGFyaXMqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIgOzsKKyAgICAgICopCisJaWYgJHtMRC1sZH0gLTY0IC1yIC1vIGNvbmZ0ZXN0Mi5vIGNvbmZ0ZXN0Lm8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7Citlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorXSkjIF9MVF9FTkFCTEVfTE9DSworCisKKyMgX0xUX0NNRF9PTERfQVJDSElWRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9PTERfQVJDSElWRV0sCitbQUNfQ0hFQ0tfVE9PTChBUiwgYXIsIGZhbHNlKQordGVzdCAteiAiJEFSIiAmJiBBUj1hcgordGVzdCAteiAiJEFSX0ZMQUdTIiAmJiBBUl9GTEFHUz1jcnUKK19MVF9ERUNMKFtdLCBbQVJdLCBbMV0sIFtUaGUgYXJjaGl2ZXJdKQorX0xUX0RFQ0woW10sIFtBUl9GTEFHU10sIFsxXSkKKworQUNfQ0hFQ0tfVE9PTChTVFJJUCwgc3RyaXAsIDopCit0ZXN0IC16ICIkU1RSSVAiICYmIFNUUklQPToKK19MVF9ERUNMKFtdLCBbU1RSSVBdLCBbMV0sIFtBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbV0pCisKK0FDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgorX0xUX0RFQ0woW10sIFtSQU5MSUJdLCBbMV0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZV0pCisKKyMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgorb2xkX2FyY2hpdmVfY21kcz0nJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMnCitvbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQorCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgIG9wZW5ic2QqKQorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHN+XCRSQU5MSUIgLXQgXCRvbGRsaWIiCisgICAgOzsKKyAgKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorICAgIDs7CisgIGVzYWMKKyAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCitmaQorX0xUX0RFQ0woW10sIFtvbGRfcG9zdGluc3RhbGxfY21kc10sIFsyXSkKK19MVF9ERUNMKFtdLCBbb2xkX3Bvc3R1bmluc3RhbGxfY21kc10sIFsyXSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbiBvbGQtc3R5bGUgYXJjaGl2ZV0pCitdKSMgX0xUX0NNRF9PTERfQVJDSElWRQorCisKKyMgX0xUX0NPTVBJTEVSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMJCVtPVVRQVVQtRklMRV0sIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCitBQ19ERUZVTihbX0xUX0NPTVBJTEVSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBtNF9pZihbJDRdLCAsIFthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHRdLCBbYWNfb3V0ZmlsZT0kNF0pCisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9IiQzIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFtbXiBdXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGx0X2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRFQ0hPICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAkMj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gY29uZnRlc3QqCitdKQorCitpZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgorICAgIG00X2lmKFskNV0sICwgOiwgWyQ1XSkKK2Vsc2UKKyAgICBtNF9pZihbJDZdLCAsIDosIFskNl0pCitmaQorXSkjIF9MVF9DT01QSUxFUl9PUFRJT04KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sIFtfTFRfQ09NUElMRVJfT1BUSU9OXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbXSkKKworCisjIF9MVF9MSU5LRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAorIyAgICAgICAgICAgICAgICAgIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbGlua2VyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9MSU5LRVJfT1BUSU9OXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbJDFdLCBbJDJdLAorICBbJDI9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkMyIKKyAgIGVjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAkRUNITyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgJDI9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgICQyPXllcworICAgICBmaQorICAgZmkKKyAgICRSTSAtciBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCitdKQorCitpZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgorICAgIG00X2lmKFskNF0sICwgOiwgWyQ0XSkKK2Vsc2UKKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitmaQorXSkjIF9MVF9MSU5LRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwgW19MVF9MSU5LRVJfT1BUSU9OXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSwgW10pCisKKworIyBMVF9DTURfTUFYX0xFTgorIy0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX0NNRF9NQVhfTEVOXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCisjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK0FDX01TR19DSEVDS0lORyhbdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHNdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfbWF4X2NtZF9sZW5dLCBbZG5sCisgIGk9MAorICB0ZXN0c3RyaW5nPSJBQkNEIgorCisgIGNhc2UgJGJ1aWxkX29zIGluCisgIG1zZG9zZGpncHAqKQorICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKKyAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCisgICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKKyAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0CisgICAgOzsKKworICBnbnUqKQorICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcworICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKKyAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcworICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCisgICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKKyAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCisgICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgorICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQorICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCisgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCisgICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCisgICAgZmkKKyAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICA7OworCisgIGludGVyaXgqKQorICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbCSBdXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAoZ2V0Y29uZiBBUkdfTUFYKSAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGx0X2N2X3N5c19tYXhfY21kX2xlbiI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIGVsc2UKKyAgICAgICMgTWFrZSB0ZXN0c3RyaW5nIGEgbGl0dGxlIGJpZ2dlciBiZWZvcmUgd2UgZG8gYW55dGhpbmcgd2l0aCBpdC4KKyAgICAgICMgYSAxSyBzdHJpbmcgc2hvdWxkIGJlIGEgcmVhc29uYWJsZSBzdGFydC4KKyAgICAgIGZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA7IGRvCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgU0hFTEw9JHtTSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0KKyAgICAgICMgSWYgdGVzdCBpcyBub3QgYSBzaGVsbCBidWlsdC1pbiwgd2UnbGwgcHJvYmFibHkgZW5kIHVwIGNvbXB1dGluZyBhCisgICAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICAgIyB3ZSBjYW4ndCB0ZWxsLgorICAgICAgd2hpbGUgeyB0ZXN0ICJYImAkU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyR0ZXN0c3RyaW5nIiAyPi9kZXYvbnVsbGAgXAorCSAgICAgICAgID0gIlhYJHRlc3RzdHJpbmckdGVzdHN0cmluZyI7IH0gPi9kZXYvbnVsbCAyPiYxICYmCisJICAgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgICBkbworICAgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgICBkb25lCisgICAgICAjIE9ubHkgY2hlY2sgdGhlIHN0cmluZyBsZW5ndGggb3V0c2lkZSB0aGUgbG9vcC4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAKKyAgICAgIHRlc3RzdHJpbmc9CisgICAgICAjIEFkZCBhIHNpZ25pZmljYW50IHNhZmV0eSBmYWN0b3IgYmVjYXVzZSBDKysgY29tcGlsZXJzIGNhbiB0YWNrIG9uCisgICAgICAjIG1hc3NpdmUgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZQorICAgICAgIyBsaW5rZXIuICBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIGZpCisgICAgOzsKKyAgZXNhYworXSkKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkbHRfY3Zfc3lzX21heF9jbWRfbGVuKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vbmUpCitmaQorbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorX0xUX0RFQ0woW10sIFttYXhfY21kX2xlbl0sIFswXSwKKyAgICBbV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kP10pCitdKSMgTFRfQ01EX01BWF9MRU4KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFtMVF9DTURfTUFYX0xFTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwgW10pCisKKworIyBfTFRfSEVBREVSX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfSEVBREVSX0RMRkNOXSwKK1tBQ19DSEVDS19IRUFERVJTKFtkbGZjbi5oXSwgW10sIFtdLCBbQUNfSU5DTFVERVNfREVGQVVMVF0pZG5sCitdKSMgX0xUX0hFQURFUl9ETEZDTgorCisKKyMgX0xUX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAorIyAgICAgICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRkFMU0UsIEFDVElPTi1JRi1DUk9TUy1DT01QSUxJTkcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfVFJZX0RMT1BFTl9TRUxGXSwKK1ttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgWyQ0XQorZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitbI2xpbmUgX19vbGluZV9fICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmIEhBVkVfRExGQ05fSAorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBSVExEX0dMT0JBTAorIyAgZGVmaW5lIExUX0RMR0xPQkFMCQlSVExEX0dMT0JBTAorI2Vsc2UKKyMgIGlmZGVmIERMX0dMT0JBTAorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCURMX0dMT0JBTAorIyAgZWxzZQorIyAgICBkZWZpbmUgTFRfRExHTE9CQUwJCTAKKyMgIGVuZGlmCisjZW5kaWYKKworLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQorICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLworI2lmbmRlZiBMVF9ETExBWllfT1JfTk9XCisjICBpZmRlZiBSVExEX0xBWlkKKyMgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCVJUTERfTEFaWQorIyAgZWxzZQorIyAgICBpZmRlZiBETF9MQVpZCisjICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJCURMX0xBWlkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFJUTERfTk9XCisjICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlSVExEX05PVworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIERMX05PVworIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwlETF9OT1cKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJMAorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgcmV0dXJuIHN0YXR1czsKK31dCitfTFRfRU9GCisgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gMj4vZGV2L251bGw7IHRoZW4KKyAgICAoLi9jb25mdGVzdDsgZXhpdDsgKSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgJDEgOzsKKyAgICAgIHgkbHRfZGxuZWVkX3VzY29yZSkgJDIgOzsKKyAgICAgIHgkbHRfZGx1bmtub3dufHgqKSAkMyA7OworICAgIGVzYWMKKyAgZWxzZSA6CisgICAgIyBjb21waWxhdGlvbiBmYWlsZWQKKyAgICAkMworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKK10pIyBfTFRfVFJZX0RMT1BFTl9TRUxGCisKKworIyBMVF9TWVNfRExPUEVOX1NFTEYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfU1lTX0RMT1BFTl9TRUxGXSwKK1ttNF9yZXF1aXJlKFtfTFRfSEVBREVSX0RMRkNOXSlkbmwKK2lmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgorICBlbmFibGVfZGxvcGVuPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KKyAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCitlbHNlCisgIGx0X2N2X2Rsb3Blbj1ubworICBsdF9jdl9kbG9wZW5fbGlicz0KKworICBjYXNlICRob3N0X29zIGluCisgIGJlb3MqKQorICAgIGx0X2N2X2Rsb3Blbj0ibG9hZF9hZGRfb24iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgOzsKKworICBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICBsdF9jdl9kbG9wZW49IkxvYWRMaWJyYXJ5IgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgQUNfQ0hFQ0tfTElCKFtkbF0sIFtkbG9wZW5dLAorCQlbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIl0sWworICAgIGx0X2N2X2Rsb3Blbj0iZHlsZCIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICBdKQorICAgIDs7CisKKyAgKikKKyAgICBBQ19DSEVDS19GVU5DKFtzaGxfbG9hZF0sCisJICBbbHRfY3ZfZGxvcGVuPSJzaGxfbG9hZCJdLAorICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW3NobF9sb2FkXSwKKwkgICAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCJdLAorCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAorCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAorCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAorCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCisJCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCisJICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKKwkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSkKKwkgICAgICBdKQorCSAgICBdKQorCSAgXSkKKwldKQorICAgICAgXSkKKyAgICA7OworICBlc2FjCisKKyAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW4iICE9IHhubzsgdGhlbgorICAgIGVuYWJsZV9kbG9wZW49eWVzCisgIGVsc2UKKyAgICBlbmFibGVfZGxvcGVuPW5vCisgIGZpCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuIGluCisgIGRsb3BlbikKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfZGxmY25faCIgPSB4eWVzICYmIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCisKKyAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgorCisgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKwkgIGx0X2N2X2Rsb3Blbl9zZWxmLCBbZG5sCisJICBfTFRfVFJZX0RMT1BFTl9TRUxGKAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9bm8sIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzKQorICAgIF0pCisKKyAgICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3Blbl9zZWxmIiA9IHh5ZXM7IHRoZW4KKyAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsIGV2YWwgTERGTEFHUz1cIlwkTERGTEFHUyAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNcIgorICAgICAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmXSwKKwkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQorICAgICAgXSkKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCitfTFRfREVDTChbZGxvcGVuX3N1cHBvcnRdLCBbZW5hYmxlX2Rsb3Blbl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmXSwgWzBdLAorCSBbV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkXSkKK19MVF9ERUNMKFtkbG9wZW5fc2VsZl9zdGF0aWNdLCBbZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpY10sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitdKSMgTFRfU1lTX0RMT1BFTl9TRUxGCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtMVF9TWVNfRExPUEVOX1NFTEZdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl9TRUxGXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfQ19PKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1jIGFuZCAtbyBhcmUgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyLgorIyBUaGlzIG1hY3JvIGRvZXMgbm90IGhhcmQgY29kZSB0aGUgY29tcGlsZXIgbGlrZSBBQ19QUk9HX0NDX0NfTy4KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfQ19PXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0XSwKKyAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKV0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9bm8KKyAgICRSTSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+b3V0L2NvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IG91dC9jb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgZWNobyAiJGFzX21lOl9fb2xpbmVfXzogXCQ/ID0gJGFjX3N0YXR1cyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRFQ0hPICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPXllcworICAgICBmaQorICAgZmkKKyAgIGNobW9kIHUrdyAuIDI+JkFTX01FU1NBR0VfTE9HX0ZECisgICAkUk0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRSTSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRSTSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICAkUk0gLXIgY29uZnRlc3QKKyAgICRSTSBjb25mdGVzdCoKK10pCitfTFRfVEFHREVDTChbY29tcGlsZXJfY19vXSwgW2x0X2N2X3Byb2dfY29tcGlsZXJfY19vXSwgWzFdLAorCVtEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/XSkKK10pIyBfTFRfQ09NUElMRVJfQ19PCisKKworIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKK200X2RlZnVuKFtfTFRfQ09NUElMRVJfRklMRV9MT0NLU10sCitbbTRfcmVxdWlyZShbX0xUX0VOQUJMRV9MT0NLXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorX0xUX0NPTVBJTEVSX0NfTyhbJDFdKQorCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3NdKQorICBoYXJkX2xpbmtzPXllcworICAkUk0gY29uZnRlc3QqCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIHRvdWNoIGNvbmZ0ZXN0LmEKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+JjUgfHwgaGFyZF9saW5rcz1ubworICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICBBQ19NU0dfUkVTVUxUKFskaGFyZF9saW5rc10pCisgIGlmIHRlc3QgIiRoYXJkX2xpbmtzIiA9IG5vOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW2AkQ0MnIGRvZXMgbm90IHN1cHBvcnQgYC1jIC1vJywgc28gYG1ha2UgLWonIG1heSBiZSB1bnNhZmVdKQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorX0xUX0RFQ0woW10sIFtuZWVkX2xvY2tzXSwgWzFdLCBbTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/XSkKK10pIyBfTFRfQ09NUElMRVJfRklMRV9MT0NLUworCisKKyMgX0xUX0NIRUNLX09CSkRJUgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NIRUNLX09CSkRJUl0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBvYmpkaXJdLCBbbHRfY3Zfb2JqZGlyXSwKK1tybSAtZiAubGlicyAyPi9kZXYvbnVsbAorbWtkaXIgLmxpYnMgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLmxpYnM7IHRoZW4KKyAgbHRfY3Zfb2JqZGlyPS5saWJzCitlbHNlCisgICMgTVMtRE9TIGRvZXMgbm90IGFsbG93IGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggYSBkb3QuCisgIGx0X2N2X29iamRpcj1fbGlicworZmkKK3JtZGlyIC5saWJzIDI+L2Rldi9udWxsXSkKK29iamRpcj0kbHRfY3Zfb2JqZGlyCitfTFRfREVDTChbXSwgW29iamRpcl0sIFswXSwKKyAgICAgICAgIFtUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXNdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbTFRfT0JKRElSXSlkbmwKK0FDX0RFRklORV9VTlFVT1RFRChMVF9PQkpESVIsICIkbHRfY3Zfb2JqZGlyLyIsCisgIFtEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3RvcnkgaW4gd2hpY2ggbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLl0pCitdKSMgX0xUX0NIRUNLX09CSkRJUgorCisKKyMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSF0sCitbQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zXSkKK19MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9CitpZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkiIHx8CisgICB0ZXN0IC1uICIkX0xUX1RBR1ZBUihydW5wYXRoX3ZhciwgJDEpIiB8fAorICAgdGVzdCAiWCRfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RlbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpIiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkiICE9IG5vICYmCisgICAgIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKSIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9dW5zdXBwb3J0ZWQKK2ZpCitBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKV0pCisKK2lmIHRlc3QgIiRfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpIiA9IHJlbGluayB8fAorICAgdGVzdCAiJF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpIiA9IHllczsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAorICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcworZmkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfYWN0aW9uXSwgWzBdLAorICAgIFtIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZV0pCitdKSMgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRICisKKworIyBfTFRfQ01EX1NUUklQTElCCisjIC0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX1NUUklQTElCXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCitzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciBzdHJpcHBpbmcgbGlicmFyaWVzIGlzIHBvc3NpYmxlXSkKK2lmIHRlc3QgLW4gIiRTVFJJUCIgJiYgJFNUUklQIC1WIDI+JjEgfCAkR1JFUCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0IC1uICIkU1RSSVAiIDsgdGhlbgorICAgICAgc3RyaXBsaWI9IiRTVFJJUCAteCIKKyAgICAgIG9sZF9zdHJpcGxpYj0iJFNUUklQIC1TIgorICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgZmkKKyAgICA7OworICAqKQorICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW10sIFtvbGRfc3RyaXBsaWJdLCBbMV0sIFtDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzdHJpcGxpYl0sIFsxXSkKK10pIyBfTFRfQ01EX1NUUklQTElCCisKKworIyBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9TWVNfRFlOQU1JQ19MSU5LRVJdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfT0JKRFVNUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfTVNHX0NIRUNLSU5HKFtkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3NdKQorbTRfaWYoWyQxXSwKKwlbXSwgWworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGRhcndpbiopIGx0X2F3a19hcmc9Ii9ebGlicmFyaWVzOi8sL0xSLyIgOzsKKyAgICAqKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovIiA7OworICBlc2FjCisgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBhd2sgJGx0X2F3a19hcmcgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgIGlmICRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkR1JFUCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICBlbHNlCisgICAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRsdF9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICBmaQorICAjIE9rLCBub3cgd2UgaGF2ZSB0aGUgcGF0aCwgc2VwYXJhdGVkIGJ5IHNwYWNlcywgd2UgY2FuIHN0ZXAgdGhyb3VnaCBpdAorICAjIGFuZCBhZGQgbXVsdGlsaWIgZGlyIGlmIG5lY2Vzc2FyeS4KKyAgbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9CisgIGx0X211bHRpX29zX2Rpcj1gJENDICRDUFBGTEFHUyAkQ0ZMQUdTICRMREZMQUdTIC1wcmludC1tdWx0aS1vcy1kaXJlY3RvcnkgMj4vZGV2L251bGxgCisgIGZvciBsdF9zeXNfcGF0aCBpbiAkbHRfc2VhcmNoX3BhdGhfc3BlYzsgZG8KKyAgICBpZiB0ZXN0IC1kICIkbHRfc3lzX3BhdGgvJGx0X211bHRpX29zX2RpciI7IHRoZW4KKyAgICAgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiCisgICAgZWxzZQorICAgICAgdGVzdCAtZCAiJGx0X3N5c19wYXRoIiAmJiBcCisJbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWM9IiRsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYyAkbHRfc3lzX3BhdGgiCisgICAgZmkKKyAgZG9uZQorICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgfCBhd2sgJworQkVHSU4ge1JTPSIgIjsgRlM9Ii98XG4iO30geworICBsdF9mb289IiI7CisgIGx0X2NvdW50PTA7CisgIGZvciAobHRfaSA9IE5GOyBsdF9pID4gMDsgbHRfaS0tKSB7CisgICAgaWYgKCRsdF9pICE9ICIiICYmICRsdF9pICE9ICIuIikgeworICAgICAgaWYgKCRsdF9pID09ICIuLiIpIHsKKyAgICAgICAgbHRfY291bnQrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsdF9jb3VudCA9PSAwKSB7CisgICAgICAgICAgbHRfZm9vPSIvIiAkbHRfaSBsdF9mb287CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbHRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobHRfZm9vICE9ICIiKSB7IGx0X2ZyZXFbW2x0X2Zvb11dKys7IH0KKyAgaWYgKGx0X2ZyZXFbW2x0X2Zvb11dID09IDEpIHsgcHJpbnQgbHRfZm9vOyB9Cit9J2AKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkRUNITyAkbHRfc2VhcmNoX3BhdGhfc3BlY2AKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmldKQorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeFtbNC05XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bWzAxXV0gfCBhaXg0LltbMDFdXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8ICRHUkVQIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBjYXNlICRob3N0X2NwdSBpbgorICBwb3dlcnBjKQorICAgICMgU2luY2UgSnVseSAyMDA3IEFtaWdhT1M0IG9mZmljaWFsbHkgc3VwcG9ydHMgLnNvIGxpYnJhcmllcy4KKyAgICAjIFdoZW4gY29tcGlsaW5nIHRoZSBleGVjdXRhYmxlLCBhZGQgLXVzZS1keW5sZCAtTHNvYmpzOiB0byB0aGUgY29tcGlsZWxpbmUuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgOzsKKyAgbTY4aykKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgICAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkRUNITyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW1teL11dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRSTSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgICA7OworICBlc2FjCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqIHwgeWVzLGNlZ2NjKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBpZiB0ZXN0IC1uICdcJyckc3RyaXBtZSdcJycgJiYgdGVzdCAtbiAnXCcnJHN0cmlwbGliJ1wnJzsgdGhlbgorICAgICAgICBldmFsICdcJyckc3RyaXBsaWIgXCRkbGRpci8kZGxuYW1lJ1wnJyB8fCBleGl0IFwkPzsKKyAgICAgIGZpJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRSTSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgICA7OworICAgIG1pbmd3KiB8IGNlZ2NjKikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8ICRHUkVQICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgICAgICBpZiAkRUNITyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBbJEdSRVAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsXTsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKK200X2lmKFskMV0sIFtdLFsKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC91c3IvbG9jYWwvbGliIl0pCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkW1sxMjNdXSopIG9iamZvcm1hdD1hb3V0IDs7CisgICAgKikgb2JqZm9ybWF0PWVsZiA7OworICAgIGVzYWMKKyAgZmkKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzItOV1dKiB8IGZyZWVic2RlbGYzLltbMi05XV0qIHwgXAorICBmcmVlYnNkNC5bWzAtNV1dIHwgZnJlZWJzZGVsZjQuW1swLTVdXSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgKikgIyBmcm9tIDQuNiBvbiwgYW5kIERyYWdvbkZseQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICBocHBhKjY0KikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpbnRlcml4W1szLTldXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICMgU29tZSBiaW51dGlscyBsZCBhcmUgcGF0Y2hlZCB0byBzZXQgRFRfUlVOUEFUSAorICBzYXZlX0xERkxBR1M9JExERkxBR1MKKyAgc2F2ZV9saWJkaXI9JGxpYmRpcgorICBldmFsICJsaWJkaXI9L2Zvbzsgd2w9XCIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSlcIjsgXAorICAgICAgIExERkxBR1M9XCJcJExERkxBR1MgJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpXCIiCisgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKKyAgICBbQVNfSUYoWyAoJE9CSkRVTVAgLXAgY29uZnRlc3QkYWNfZXhlZXh0KSAyPi9kZXYvbnVsbCB8IGdyZXAgIlJVTlBBVEguKiRsaWJkaXIiID4vZGV2L251bGxdLAorICAgICAgIFtzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzXSldKQorICBMREZMQUdTPSRzYXZlX0xERkxBR1MKKyAgbGliZGlyPSRzYXZlX2xpYmRpcgorCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIHZlcnNpb25fdHlwZT1xbngKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J2xkcW54LnNvJworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopCW5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKQkJCQluZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIG9wZW5ic2QyLltbODldXSB8IG9wZW5ic2QyLltbODldXS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworcmRvcyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordHBmKikKKyAgIyBUUEYgaXMgYSBjcm9zcy10YXJnZXQgb25seS4gIFByZWZlcnJlZCBjcm9zcy1ob3N0ID0gR05VL0xpbnV4LgorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRkeW5hbWljX2xpbmtlcl0pCit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X2N2X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjK3NldH0iID0gc2V0OyB0aGVuCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMiCitmaQorCitfTFRfREVDTChbXSwgW3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rXSwgWzFdLAorICAgIFtWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyAgICByZXN0b3JlZCBhdCBsaW5rIHRpbWVdKQorX0xUX0RFQ0woW10sIFtuZWVkX2xpYl9wcmVmaXhdLCBbMF0sCisgICAgW0RvIHdlIG5lZWQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcz9dKQorX0xUX0RFQ0woW10sIFtuZWVkX3ZlcnNpb25dLCBbMF0sIFtEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzP10pCitfTFRfREVDTChbXSwgW3ZlcnNpb25fdHlwZV0sIFswXSwgW0xpYnJhcnkgdmVyc2lvbmluZyB0eXBlXSkKK19MVF9ERUNMKFtdLCBbcnVucGF0aF92YXJdLCBbMF0sICBbU2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX3Zhcl0sIFswXSxbU2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZV0pCitfTFRfREVDTChbXSwgW3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aF0sIFswXSwKKyAgICBbSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoP10pCitfTFRfREVDTChbXSwgW2xpYm5hbWVfc3BlY10sIFsxXSwgW0Zvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4XSkKK19MVF9ERUNMKFtdLCBbbGlicmFyeV9uYW1lc19zcGVjXSwgWzFdLAorICAgIFtbTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyAgICBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FXV0pCitfTFRfREVDTChbXSwgW3NvbmFtZV9zcGVjXSwgWzFdLAorICAgIFtbVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWVdXSkKK19MVF9ERUNMKFtdLCBbcG9zdGluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtwb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmQgdG8gdXNlIGFmdGVyIHVuaW5zdGFsbGF0aW9uIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5XSkKK19MVF9ERUNMKFtdLCBbZmluaXNoX2V2YWxdLCBbMV0sCisgICAgW1tBcyAiZmluaXNoX2NtZHMiLCBleGNlcHQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQKKyAgICBub3Qgc2hvd25dXSkKK19MVF9ERUNMKFtdLCBbaGFyZGNvZGVfaW50b19saWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY10sIFsyXSwKKyAgICBbUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXNdKQorXSkjIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIKKworCisjIF9MVF9QQVRIX1RPT0xfUFJFRklYKFRPT0wpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyeQorQUNfREVGVU4oW19MVF9QQVRIX1RPT0xfUFJFRklYXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9NQUdJQ19DTUQsCitbY2FzZSAkTUFHSUNfQ01EIGluCitbW1xcLypdIHwgID86W1xcL10qXSkKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZG5sICRhY19kdW1teSBmb3JjZXMgc3BsaXR0aW5nIG9uIGNvbnN0YW50IHVzZXItc3VwcGxpZWQgcGF0aHMuCitkbmwgUE9TSVguMiB3b3JkIHNwbGl0dGluZyBpcyBkb25lIG9ubHkgb24gdGhlIG91dHB1dCBvZiB3b3JkIGV4cGFuc2lvbnMsCitkbmwgbm90IGV2ZXJ5IHdvcmQuICBUaGlzIGNsb3NlcyBhIGxvbmdzdGFuZGluZyBzaCBzZWN1cml0eSBob2xlLgorICBhY19kdW1teT0ibTRfaWYoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBjb21tYW5kIGxpYnRvb2wgdXNlcyB0byBkZXRlY3Qgc2hhcmVkIGxpYnJhcmllcywKKyoqKiAkZmlsZV9tYWdpY19jbWQsIHByb2R1Y2VzIG91dHB1dCB0aGF0IGxpYnRvb2wgY2Fubm90IHJlY29nbml6ZS4KKyoqKiBUaGUgcmVzdWx0IGlzIHRoYXQgbGlidG9vbCBtYXkgZmFpbCB0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcworKioqIGFzIHN1Y2guICBUaGlzIHdpbGwgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcyB0aGF0CisqKiogZGVwZW5kIG9uIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCBwcm9ncmFtcyBsaW5rZWQgd2l0aCBzdWNoIGxpYnRvb2wKKyoqKiBsaWJyYXJpZXMgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhpcyBwcm9ibGVtLiAgTmV2ZXJ0aGVsZXNzLCB5b3UKKyoqKiBtYXkgd2FudCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8geW91ciBzeXN0ZW0gbWFuYWdlciBhbmQvb3IgdG8KKyoqKiBidWctbGlidG9vbEBnbnUub3JnCisKK19MVF9FT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjXSkKK01BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgoraWYgdGVzdCAtbiAiJE1BR0lDX0NNRCI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCgkTUFHSUNfQ01EKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK19MVF9ERUNMKFtdLCBbTUFHSUNfQ01EXSwgWzBdLAorCSBbVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyB3aXRoICJmaWxlIl0pZG5sCitdKSMgX0xUX1BBVEhfVE9PTF9QUkVGSVgKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW19MVF9QQVRIX1RPT0xfUFJFRklYXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfUEFUSF9UT09MX1BSRUZJWF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTUFHSUMKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIGEgc2hhcmVkIGxpYnJhcnkKK200X2RlZnVuKFtfTFRfUEFUSF9NQUdJQ10sCitbX0xUX1BBVEhfVE9PTF9QUkVGSVgoJHthY190b29sX3ByZWZpeH1maWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQoraWYgdGVzdCAteiAiJGx0X2N2X3BhdGhfTUFHSUNfQ01EIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgX0xUX1BBVEhfVE9PTF9QUkVGSVgoZmlsZSwgL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCkKKyAgZWxzZQorICAgIE1BR0lDX0NNRD06CisgIGZpCitmaQorXSkjIF9MVF9QQVRIX01BR0lDCisKKworIyBMVF9QQVRIX0xECisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oW0xUX1BBVEhfTERdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCisKK0FDX0FSR19XSVRIKFtnbnUtbGRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCisJW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCisgICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCisgICAgW3dpdGhfZ251X2xkPW5vXSlkbmwKKworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgJENDXSkKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbW1xcL11dKiB8ID86W1tcXC9dXSopCisgICAgICByZV9kaXJlbHQ9Jy9bW14vXV1bW14vXV0qL1wuXC4vJworICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGhuYW1lIG9mIGxkCisgICAgICBhY19wcm9nPWAkRUNITyAiJGFjX3Byb2cifCAkU0VEICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlICRFQ0hPICIkYWNfcHJvZyIgfCAkR1JFUCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWAkRUNITyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfTEQsCitbaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmldKQorTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorX0xUX1BBVEhfTERfR05VCitBQ19TVUJTVChbTERdKQorCitfTFRfVEFHREVDTChbXSwgW0xEXSwgWzFdLCBbVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllc10pCitdKSMgTFRfUEFUSF9MRAorCisjIE9sZCBuYW1lczoKK0FVX0FMSUFTKFtBTV9QUk9HX0xEXSwgW0xUX1BBVEhfTERdKQorQVVfQUxJQVMoW0FDX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX1BST0dfTERdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfUFJPR19MRF0sIFtdKQorCisKKyMgX0xUX1BBVEhfTERfR05VCisjLSAtLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9QQVRIX0xEX0dOVV0sCitbQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCitbIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjXSkKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorXSkjIF9MVF9QQVRIX0xEX0dOVQorCisKKyMgX0xUX0NNRF9SRUxPQUQKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK200X2RlZnVuKFtfTFRfQ01EX1JFTE9BRF0sCitbQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXNdLAorICBsdF9jdl9sZF9yZWxvYWRfZmxhZywKKyAgW2x0X2N2X2xkX3JlbG9hZF9mbGFnPSctciddKQorcmVsb2FkX2ZsYWc9JGx0X2N2X2xkX3JlbG9hZF9mbGFnCitjYXNlICRyZWxvYWRfZmxhZyBpbgorIiIgfCAiICIqKSA7OworKikgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciIDs7Citlc2FjCityZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCitjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbG9hZF9jbWRzPSckTFRDQyAkTFRDRkxBR1MgLW5vc3RkbGliICR7d2x9LXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBlbHNlCisgICAgICByZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZmkKKyAgICA7OworZXNhYworX0xUX0RFQ0woW10sIFtyZWxvYWRfZmxhZ10sIFsxXSwgW0hvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXNdKWRubAorX0xUX0RFQ0woW10sIFtyZWxvYWRfY21kc10sIFsyXSlkbmwKK10pIyBfTFRfQ01EX1JFTE9BRAorCisKKyMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pCittNF9yZXF1aXJlKFtfTFRfREVDTF9PQkpEVU1QXSkKK0FDX0NBQ0hFX0NIRUNLKFtob3cgdG8gcmVjb2duaXplIGRlcGVuZGVudCBsaWJyYXJpZXNdLAorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QsCitbbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRNQUdJQ19DTUQnCitsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0KK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSd1bmtub3duJworIyBOZWVkIHRvIHNldCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0CisjIGludGVybGlicmFyeSBkZXBlbmRlbmNpZXMuCisjICdub25lJyAtLSBkZXBlbmRlbmNpZXMgbm90IHN1cHBvcnRlZC4KKyMgYHVua25vd24nIC0tIHNhbWUgYXMgbm9uZSwgYnV0IGRvY3VtZW50cyB0aGF0IHdlIHJlYWxseSBkb24ndCBrbm93LgorIyAncGFzc19hbGwnIC0tIGFsbCBkZXBlbmRlbmNpZXMgcGFzc2VkIHdpdGggbm8gY2hlY2tzLgorIyAndGVzdF9jb21waWxlJyAtLSBjaGVjayBieSBtYWtpbmcgdGVzdCBwcm9ncmFtLgorIyAnZmlsZV9tYWdpYyBbW3JlZ2V4XV0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAorIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBleHRlbmRlZCByZWdleC4KKyMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQorIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4W1s0LTldXSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpW1s0NV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLAorICAjIHVubGVzcyB3ZSBmaW5kICdmaWxlJywgZm9yIGV4YW1wbGUgYmVjYXVzZSB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLgorICBpZiAoIGZpbGUgLyApID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIGZpCisgIDs7CisKK2NlZ2NjKQorICAjIHVzZSB0aGUgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLiBTZWUgbWluZ3cqLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZS1hcm0tLipsaXR0bGUoLiphcmNoaXRlY3R1cmU6IGFybSk/JworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE9CSkRVTVAgLWYnCisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBpKjg2ICkKKyAgICAgICMgTm90IHN1cmUgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgT3BlbkJTRCBoZXJlIHdhcyBhIG1pc3Rha2UuCisgICAgICAjIExldCdzIGFjY2VwdCBib3RoIG9mIHRoZW0gdW50aWwgdGhpcyBpcyBjbGVhcmVkIHVwLgorICAgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKEZyZWVCU0R8T3BlbkJTRHxEcmFnb25GbHkpL2lbWzMtOV1dODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfEVMRi1bWzAtOV1dW1swLTldXSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gSUE2NCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9ocHV4MzIvbGliYy5zbworICAgIDs7CisgIGhwcGEqNjQqKQorICAgIFtsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxFTEYtWzAtOV1bMC05XSkgc2hhcmVkIG9iamVjdCBmaWxlIC0gUEEtUklTQyBbMC05XS5bMC05XSddCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxQQS1SSVNDW1swLTldXS5bWzAtOV1dKSBzaGFyZWQgbGlicmFyeScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJjLnNsCisgICAgOzsKKyAgZXNhYworICA7OworCitpbnRlcml4W1szLTldXSopCisgICMgUElDIGNvZGUgaXMgYnJva2VuIG9uIEludGVyaXggMy54LCB0aGF0J3Mgd2h5IHxcLmEgbm90IHxfcGljXC5hIGhlcmUKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqIHwgaypic2QqLWdudSkKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298X3BpY1wuYSkkJworICBmaQorICA7OworCituZXdvczYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoZXhlY3V0YWJsZXxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGlibmxzLnNvCisgIDs7CisKKypudG8qIHwgKnFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK29wZW5ic2QqKQorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfFwuc298X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb1wuW1swLTldXStcLltbMC05XV0rfF9waWNcLmEpJCcKKyAgZmkKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCityZG9zKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICBtb3Rvcm9sYSkKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYikgTVtbMC05XV1bWzAtOV1dKiBWZXJzaW9uIFtbMC05XV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zbypgCisgICAgOzsKKyAgbmNyKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgc2VxdWVudCkKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL2Jpbi9maWxlJworICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTE1dXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliICknCisgICAgOzsKKyAgc25pKQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9ImZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgZHluYW1pYyBsaWIiCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L2xpYi9saWJjLnNvCisgICAgOzsKKyAgc2llbWVucykKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICAgIDs7CisgIHBjKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgZXNhYworICA7OworCit0cGYqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworXSkKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKworX0xUX0RFQ0woW10sIFtkZXBsaWJzX2NoZWNrX21ldGhvZF0sIFsxXSwKKyAgICBbTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHNdKQorX0xUX0RFQ0woW10sIFtmaWxlX21hZ2ljX2NtZF0sIFsxXSwKKyAgICBbQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSAiZmlsZV9tYWdpYyJdKQorXSkjIF9MVF9DSEVDS19NQUdJQ19NRVRIT0QKKworCisjIExUX1BBVEhfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgorQUNfREVGVU4oW0xUX1BBVEhfTk1dLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCU0QtIG9yIE1TLWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIgKG5tKV0sIGx0X2N2X3BhdGhfTk0sCitbaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgorICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKyAgbHRfY3ZfcGF0aF9OTT0iJE5NIgorZWxzZQorICBsdF9ubV90b19jaGVjaz0iJHthY190b29sX3ByZWZpeH1ubSIKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IiAmJiB0ZXN0ICIkYnVpbGQiID0gIiRob3N0IjsgdGhlbgorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIDogJHtsdF9jdl9wYXRoX05NPW5vfQorZmldKQoraWYgdGVzdCAiJGx0X2N2X3BhdGhfTk0iICE9ICJubyI7IHRoZW4KKyAgTk09IiRsdF9jdl9wYXRoX05NIgorZWxzZQorICAjIERpZG4ndCBmaW5kIGFueSBCU0QgY29tcGF0aWJsZSBuYW1lIGxpc3RlciwgbG9vayBmb3IgZHVtcGJpbi4KKyAgQUNfQ0hFQ0tfVE9PTFMoRFVNUEJJTiwgWyJkdW1wYmluIC1zeW1ib2xzIiAibGluayAtZHVtcCAtc3ltYm9scyJdLCA6KQorICBBQ19TVUJTVChbRFVNUEJJTl0pCisgIGlmIHRlc3QgIiREVU1QQklOIiAhPSAiOiI7IHRoZW4KKyAgICBOTT0iJERVTVBCSU4iCisgIGZpCitmaQordGVzdCAteiAiJE5NIiAmJiBOTT1ubQorQUNfU1VCU1QoW05NXSkKK19MVF9ERUNMKFtdLCBbTk1dLCBbMV0sIFtBIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3Rlcl0pZG5sCisKK0FDX0NBQ0hFX0NIRUNLKFt0aGUgbmFtZSBsaXN0ZXIgKCROTSkgaW50ZXJmYWNlXSwgW2x0X2N2X25tX2ludGVyZmFjZV0sCisgIFtsdF9jdl9ubV9pbnRlcmZhY2U9IkJTRCBubSIKKyAgZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC4kYWNfZXh0CisgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRhY19jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkYWNfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkTk0gXFxcImNvbmZ0ZXN0LiRhY19vYmpleHRcXFwiXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIChldmFsICIkTk0gXCJjb25mdGVzdC4kYWNfb2JqZXh0XCIiIDI+Y29uZnRlc3QuZXJyID4gY29uZnRlc3Qub3V0KQorICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogb3V0cHV0XCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgIGNhdCBjb25mdGVzdC5vdXQgPiZBU19NRVNTQUdFX0xPR19GRAorICBpZiAkR1JFUCAnRXh0ZXJuYWwuKnNvbWVfdmFyaWFibGUnIGNvbmZ0ZXN0Lm91dCA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X25tX2ludGVyZmFjZT0iTVMgZHVtcGJpbiIKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqXSkKK10pIyBMVF9QQVRIX05NCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTk1dLCBbTFRfUEFUSF9OTV0pCitBVV9BTElBUyhbQUNfUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19OTV0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX05NXSwgW10pCisKKworIyBMVF9MSUJfTQorIyAtLS0tLS0tLQorIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CitBQ19ERUZVTihbTFRfTElCX01dLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0xJQk09CitjYXNlICRob3N0IGluCisqLSotYmVvcyogfCAqLSotY3lnd2luKiB8ICotKi1wdzMyKiB8ICotKi1kYXJ3aW4qKQorICAjIFRoZXNlIHN5c3RlbSBkb24ndCBoYXZlIGxpYm0sIG9yIGRvbid0IG5lZWQgaXQKKyAgOzsKKyotbmNyLXN5c3Y0LjMqKQorICBBQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsLCBMSUJNPSItbG13IikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iJExJQk0gLWxtIikKKyAgOzsKKyopCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09Ii1sbSIpCisgIDs7Citlc2FjCitBQ19TVUJTVChbTElCTV0pCitdKSMgTFRfTElCX00KKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtBQ19DSEVDS19MSUJNXSwgW0xUX0xJQl9NXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfQ0hFQ0tfTElCTV0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX05PX1JUVEkoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX05PX1JUVEldLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKworICBfTFRfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMsCisgICAgWy1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnNdLCBbXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPSIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiXSkKK2ZpCitfTFRfVEFHREVDTChbbm9fYnVpbHRpbl9mbGFnXSwgW2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnXSwgWzFdLAorCVtDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zXSkKK10pIyBfTFRfQ09NUElMRVJfTk9fUlRUSQorCisKKyMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtMVF9QQVRIX05NXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorCisjIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgorQUNfTVNHX0NIRUNLSU5HKFtjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQgZnJvbSAkY29tcGlsZXIgb2JqZWN0XSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sCitbCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tbQkNERUdSU1RdXScKKworIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCitzeW1wYXQ9J1woW1tfQS1aYS16XV1bW19BLVphLXowLTldXSpcKScKKworIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeCopCisgIHN5bWNvZGU9J1tbQkNEVF1dJworICA7OworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVNUV11dJworICA7OworaHB1eCopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgc3ltY29kZT0nW1tBQkNERUdSU1RdXScKKyAgZmkKKyAgOzsKK2lyaXgqIHwgbm9uc3RvcHV4KikKKyAgc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW1tCQ0RFR1FSU1RdXScKKyAgOzsKK3NvbGFyaXMqKQorICBzeW1jb2RlPSdbW0JEUlRdXScKKyAgOzsKK3NjbzMuMnY1KikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgIHN5bWNvZGU9J1tbQUJEVF1dJworICA7Oworc3lzdjQpCisgIHN5bWNvZGU9J1tbREZOU1RVXV0nCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW1tBQkNER0lSU1RXXV0nIDs7Citlc2FjCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24uCisjIFNvbWUgc3lzdGVtcyAoZXNwLiBvbiBpYTY0KSBsaW5rIGRhdGEgYW5kIGNvZGUgc3ltYm9scyBkaWZmZXJlbnRseSwKKyMgc28gdXNlIHRoaXMgZ2VuZXJhbCBhcHByb2FjaC4KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gaW50IFwxKCk7L3AnIC1lICdzL14kc3ltY29kZSogLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIHN5bWJvbCBuYW1lIGFuZCBzeW1ib2wgYWRkcmVzcworbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXg9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsICh2b2lkICopIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwobGliW1teIF1dKlwpJC8gIHtcIlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcImxpYlwyXCIsICh2b2lkICopIFwmXDJ9LC9wJyIKKworIyBIYW5kbGUgQ1JMRiBpbiBtaW5ndyB0b29sIGNoYWluCitvcHRfY3I9CitjYXNlICRidWlsZF9vcyBpbgorbWluZ3cqKQorICBvcHRfY3I9YCRFQ0hPICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJzY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBpZiB0ZXN0ICIkbHRfY3Zfbm1faW50ZXJmYWNlIiA9ICJNUyBkdW1wYmluIjsgdGhlbgorICAgICMgRmFrZSBpdCBmb3IgZHVtcGJpbiBhbmQgc2F5IFQgZm9yIGFueSBub24tc3RhdGljIGZ1bmN0aW9uCisgICAgIyBhbmQgRCBmb3IgYW55IGdsb2JhbCB2YXJpYWJsZS4KKyAgICAjIEFsc28gZmluZCBDKysgYW5kIF9fZmFzdGNhbGwgc3ltYm9scyBmcm9tIE1TVkMrKywKKyAgICAjIHdoaWNoIHN0YXJ0IHdpdGggQCBvciA/LgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9IiRBV0sgWyciXAorIiAgICAge2xhc3Rfc2VjdGlvbj1zZWN0aW9uOyBzZWN0aW9uPVwkIDN9OyJcCisiICAgICAvU2VjdGlvbiBsZW5ndGggLiojcmVsb2NzLioocGljayBhbnkpL3toaWRlW2xhc3Rfc2VjdGlvbl09MX07IlwKKyIgICAgIFwkIDAhfi9FeHRlcm5hbCAqXHwve25leHR9OyJcCisiICAgICAvIDArIFVOREVGIC97bmV4dH07IC8gVU5ERUYgXChbXnxdXCkqKCkve25leHR9OyJcCisiICAgICB7aWYoaGlkZVtzZWN0aW9uXSkgbmV4dH07IlwKKyIgICAgIHtmPTB9OyBcJCAwfi9cKFwpLipcfC97Zj0xfTsge3ByaW50ZiBmID8gXCJUIFwiIDogXCJEIFwifTsiXAorIiAgICAge3NwbGl0KFwkIDAsIGEsIC9cfHxcci8pOyBzcGxpdChhWzJdLCBzKX07IlwKKyIgICAgIHNbMV1+L15bQD9dL3twcmludCBzWzFdLCBzWzFdOyBuZXh0fTsiXAorIiAgICAgc1sxXX5wcmZ4IHtzcGxpdChzWzFdLHQsXCJAXCIpOyBwcmludCB0WzFdLCBzdWJzdHIodFsxXSxsZW5ndGgocHJmeCkpfSJcCisiICAgICAnIHByZng9XiRhY19zeW1wcmZ4XSIKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbWwkgXV1cKCRzeW1jb2RlJHN5bWNvZGUqXClbWwkgXV1bWwkgXV0qJGFjX3N5bXByZngkc3ltcGF0JG9wdF9jciQvJHN5bXhmcm0vcCciCisgIGZpCisKKyAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCisgIHBpcGVfd29ya3M9bm8KKworICBybSAtZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYyh2b2lkKTsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorX0xUX0VPRgorCisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCisJbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICBlbHNlCisJcm0gLWYgIiRubGlzdCJUCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCisgICAgICBpZiAkR1JFUCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCWlmICRHUkVQICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8X0xUX0VPRiA+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworX0xUX0VPRgorCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorCSAgZXZhbCAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8X0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHZvaWQgICAgICAgKmFkZHJlc3M7Cit9CitsdF9fUFJPR1JBTV9fTFRYX3ByZWxvYWRlZF9zeW1ib2xzW1tdXSA9Cit7CisgIHsgIkBQUk9HUkFNQCIsICh2b2lkICopIDAgfSwKK19MVF9FT0YKKwkgICRTRUQgInMvXiRzeW1jb2RlJHN5bWNvZGUqIFwoLipcKSBcKC4qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sLyIgPCAiJG5saXN0IiB8ICRHUkVQIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XF9MVF9FT0YgPj4gY29uZnRlc3QuJGFjX2V4dAorICB7MCwgKHZvaWQgKikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHM7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK19MVF9FT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X3NhdmVfTElCUz0iJExJQlMiCisJICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgorCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCisJICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KiBjb25mdHN0KgorCisgICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KKyAgaWYgdGVzdCAiJHBpcGVfd29ya3MiID0geWVzOyB0aGVuCisgICAgYnJlYWsKKyAgZWxzZQorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9CisgIGZpCitkb25lCitdKQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKGZhaWxlZCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChvaykKK2ZpCisKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3BpcGVdLCBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZV0sIFsxXSwKKyAgICBbVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lc10pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc10sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXJdKQorX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sCisgICAgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXhdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpciB3aGVuIGxpYiBwcmVmaXggaXMgbmVlZGVkXSkKK10pICMgX0xUX0NNRF9HTE9CQUxfU1lNQk9MUworCisKKyMgX0xUX0NPTVBJTEVSX1BJQyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DT01QSUxFUl9QSUNdLAorW200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisKK0FDX01TR19DSEVDS0lORyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQorbTRfaWYoWyQxXSwgW0NYWF0sIFsKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjeWd3aW4qIHwgb3MyKiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgICMgQWx0aG91Z2ggdGhlIGN5Z3dpbiBnY2MgaWdub3JlcyAtZlBJQywgc3RpbGwgbmVlZCB0aGlzIGZvciBvbGQtc3R5bGUKKyAgICAgICMgKC0tZGlzYWJsZS1hdXRvLWltcG9ydCkgbGlicmFyaWVzCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKyAgICAqZGpncHAqKQorICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgICA7OworICAgIGludGVyaXhbWzMtOV1dKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciA2NC1iaXQgUEEgSFAtVVgsIGJ1dCBub3QgZm9yIDMyLWJpdAorICAgICAgIyBQQSBIUC1VWC4gIE9uIElBNjQgSFAtVVgsIFBJQyBpcyB0aGUgZGVmYXVsdCBidXQgdGhlIHBpYyBmbGFnCisgICAgICAjIHNldHMgdGhlIGRlZmF1bHQgVExTIG1vZGVsIGFuZCBhZmZlY3RzIGlubGluaW5nLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqKQorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKnFueCogfCAqbnRvKikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworICAgICopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXhbWzQtOV1dKikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCWVsc2UKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCisJICA7OworCWVzYWMKKwk7OworICAgICAgZGd1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGVjKysqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICA7OworCSAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBocHBhKjY0KnxpYTY0KikKKwkgICAgICAjICtaIHRoZSBkZWZhdWx0CisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBpbnRlcml4KikKKwkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKKwkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/CisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbGludXgqIHwgaypic2QqLWdudSkKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgIyBLQUkgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgOzsKKwkgIGVjcGMqICkKKwkgICAgIyBvbGQgSW50ZWwgQysrIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgaWNwYyogKQorCSAgICAjIEludGVsIEMrKywgdXNlZCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBHQ0MuCisJICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyogfCBwZ2NwcCopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICB4bGMqIHwgeGxDKikKKwkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcXBpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctcXN0YXRpY2xpbmsnCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1XIGMsZXhwb3J0YWxsJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIG5ldGJzZCopCisJOzsKKyAgICAgICpxbngqIHwgKm50byopCisgICAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgICA7OworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLS1iYWNrZW5kIC1XbCwnCisJICAgIDs7CisJICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIERpZ2l0YWwvQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBwc29zKikKKwk7OworICAgICAgc29sYXJpcyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworCSAgICA7OworCSAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN1bm9zNCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1waWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdnh3b3JrcyopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworCTs7CisgICAgZXNhYworICBmaQorXSwKK1sKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciA2NC1iaXQgUEEgSFAtVVgsIGJ1dCBub3QgZm9yIDMyLWJpdAorICAgICAgIyBQQSBIUC1VWC4gIE9uIElBNjQgSFAtVVgsIFBJQyBpcyB0aGUgZGVmYXVsdCBidXQgdGhlIHBpYyBmbGFnCisgICAgICAjIHNldHMgdGhlIGRlZmF1bHQgVExTIG1vZGVsIGFuZCBhZmZlY3RzIGlubGluaW5nLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBwdzMyKiB8IG9zMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbGludXgqIHwgaypic2QqLWdudSkKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAjIG9sZCBJbnRlbCBmb3IgeDg2XzY0IHdoaWNoIHN0aWxsIHN1cHBvcnRlZCAtS1BJQy4KKyAgICAgIGVjYyopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisgICAgICAgIDs7CisgICAgICAjIGljYyB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKyAgICAgICMgSUNDIDEwIGRvZXNuJ3QgYWNjZXB0IC1LUElDIGFueSBtb3JlLgorICAgICAgaWNjKiB8IGlmb3J0KikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgTGFoZXkgRm9ydHJhbiA4LjEuCisgICAgICBsZjk1KikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy0tc2hhcmVkJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLS1zdGF0aWMnCisJOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZnBpYycKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgeGwqKQorCSMgSUJNIFhMIEMgOC4wL0ZvcnRyYW4gMTAuMSBvbiBQUEMKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXFzdGF0aWNsaW5rJworCTs7CisgICAgICAqKQorCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQorCSAgIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICA7OworCSpTdW5cIEYqKQorCSAgIyBTdW4gRm9ydHJhbiA4LjMgcGFzc2VzIGFsbCB1bnJlY29nbml6ZWQgZmxhZ3MgdG8gdGhlIGxpbmtlcgorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nJworCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgICMgUU5YIHVzZXMgR05VIEMrKywgYnV0IG5lZWQgdG8gZGVmaW5lIC1zaGFyZWQgb3B0aW9uIHRvbywgb3RoZXJ3aXNlCisgICAgICAjIGl0IHdpbGwgY29yZWR1bXAuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgcmRvcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVBJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS2NvbmZvcm1fcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorXSkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpQCZ0QG00X2lmKFskMV0sW10sWyAtRFBJQ10sW200X2lmKFskMV0sW0NYWF0sWyAtRFBJQ10sW10pXSkiCisgICAgOzsKK2VzYWMKK0FDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSldKQorX0xUX1RBR0RFQ0woW3dsXSwgW2x0X3Byb2dfY29tcGlsZXJfd2xdLCBbMV0sCisJW0hvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXJdKQorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIjsgdGhlbgorICBfTFRfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSB3b3Jrc10sCisgICAgW19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9waWNfd29ya3MsICQxKV0sCisgICAgWyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlAJnRAbTRfaWYoWyQxXSxbXSxbIC1EUElDXSxbbTRfaWYoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKV0sIFtdLAorICAgIFtjYXNlICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIiA7OworICAgICBlc2FjXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vXSkKK2ZpCitfTFRfVEFHREVDTChbcGljX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9waWNdLCBbMV0sCisJW0FkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0c10pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKSBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSlcIgorX0xUX0xJTktFUl9PUFRJT04oW2lmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzXSwKKyAgX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcywgJDEpLAorICAkbHRfdG1wX3N0YXRpY19mbGFnLAorICBbXSwKKyAgW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT1dKQorX0xUX1RBR0RFQ0woW2xpbmtfc3RhdGljX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9zdGF0aWNdLCBbMV0sCisJW0NvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmddKQorXSkjIF9MVF9DT01QSUxFUl9QSUMKKworCisjIF9MVF9MSU5LRVJfU0hMSUJTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfU0hMSUJTXSwKK1tBQ19SRVFVSVJFKFtMVF9QQVRIX0xEXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKK200X2lmKFskMV0sIFtDWFhdLCBbCisgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4W1s0LTldXSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgIGlmICROTSAtViAyPiYxIHwgJEdSRVAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZWxzZQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQgMiA9PSAiVCIpIHx8IChcJCAyID09ICJEIikgfHwgKFwkIDIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFwkIDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkIDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZmkKKyAgICA7OworICBwdzMyKikKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0iJGx0ZGxsX2NtZHMiCisgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dW1sgXV0vcy8uKltbIF1dXChbW14gXV0qXCkvXDEgREFUQS87L14uKltbIF1dX19ubV9fL3MvXi4qW1sgXV1fX25tX19cKFtbXiBdXSpcKVtbIF1dW1teIF1dKi9cMSBEQVRBLzsvXklbWyBdXS9kOy9eW1tBSVRXXV1bWyBdXS9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICAqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgIGVzYWMKKyAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKiddCitdLCBbCisgIHJ1bnBhdGhfdmFyPQorICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBfTFRfVEFHVkFSKGluY2x1ZGVfZXhwc3ltcywgJDEpPQorICAjIGV4Y2x1ZGVfZXhwc3ltcyBjYW4gYmUgYW4gZXh0ZW5kZWQgcmVnZXhwIG9mIHN5bWJvbHMgdG8gZXhjbHVkZQorICAjIGl0IHdpbGwgYmUgd3JhcHBlZCBieSBgICgnIGFuZCBgKSQnLCBzbyBvbmUgbXVzdCBub3QgbWF0Y2ggYmVnaW5uaW5nIG9yCisgICMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKKyAgIyBhcyB3ZWxsIGFzIGFueSBzeW1ib2wgdGhhdCBjb250YWlucyBgZCcuCisgIF9MVF9UQUdWQVIoZXhjbHVkZV9leHBzeW1zLCAkMSk9WydfR0xPQkFMX09GRlNFVF9UQUJMRV98X0dMT0JBTF9fRltJRF1fLionXQorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgIyBFeGNsdWRlIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBzeW1ib2xzLgorZG5sIE5vdGUgYWxzbyBhZGp1c3QgZXhjbHVkZV9leHBzeW1zIGZvciBDKysgYWJvdmUuCisgIGV4dHJhY3RfZXhwc3ltc19jbWRzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGVzYWMKKworICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGZvciBHTlUgbGQgd2l0aCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiBUaGVzZQorICAgICMgYXJlIHJlc2V0IGxhdGVyIGlmIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFB1dHRpbmcgdGhlbQorICAgICMgaGVyZSBhbGxvd3MgdGhlbSB0byBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKyAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgICBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9bm8KKyAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjEwLiopIDs7ICMgY2F0Y2ggdmVyc2lvbnMgPCAyLjExCisgICAgICAqXCAyLjExLjkzLjAuMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIFJINy4zIC4uLgorICAgICAgKlwgMi4xMS45Mi4wLjEyXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgTWFuZHJha2UgOC4yIC4uLgorICAgICAgKlwgMi4xMS4qKSA7OyAjIG90aGVyIDIuMTEgdmVyc2lvbnMKKyAgICAgICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsKKyAgICBlc2FjCisKKyAgICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4W1szLTldXSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIHBvd2VycGMpCisgICAgICAgICAgICAjIHNlZSBjb21tZW50IGFib3V0IEFtaWdhT1M0IC5zbyBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPScnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltbQUlUV11dW1sgXV0vcy8uKltbIF1dLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisJIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorCSMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZWxzZQorCSAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWZpfgorCSRDQyAtc2hhcmVkICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKyAgICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAgICMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKyAgICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGdudSogfCBsaW51eCogfCB0cGYqIHwgaypic2QqLWdudSkKKyAgICAgIHRtcF9kaWV0PW5vCisgICAgICBpZiB0ZXN0ICIkaG9zdF9vcyIgPSBsaW51eC1kaWV0bGliYzsgdGhlbgorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBkaWV0XCAqKSB0bXBfZGlldD15ZXM7OwkjIGxpbnV4LWRpZXRsaWJjIHdpdGggc3RhdGljIGxpbmtpbmcgKCFkaWV0LWR5bikKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEVHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGwgXAorCSAmJiB0ZXN0ICIkdG1wX2RpZXQiID0gbm8KKyAgICAgIHRoZW4KKwl0bXBfYWRkZmxhZz0KKwl0bXBfc2hhcmVkZmxhZz0nLXNoYXJlZCcKKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKyAgICAgICAgcGdjYyopCQkJCSMgUG9ydGxhbmQgR3JvdXAgQyBjb21waWxlcgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycworCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZyAtTW5vbWFpbicgOzsKKwllY2MqLGlhNjQqIHwgaWNjKixpYTY0KikJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWxmOTUqKQkJCQkjIExhaGV5IEZvcnRyYW4gOC4xCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisJICB0bXBfc2hhcmVkZmxhZz0nLS1zaGFyZWQnIDs7CisJeGxbW2NDXV0qKQkJCSMgSUJNIFhMIEMgOC4wIG9uIFBQQyAoZGVhbCB3aXRoIHhsZiBiZWxvdykKKwkgIHRtcF9zaGFyZWRmbGFnPSctcW1rc2hyb2JqJworCSAgdG1wX2FkZGZsYWc9IDs7CisJZXNhYworCWNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSpTdW5cIEMqKQkJCSMgU3VuIEMgNS45CisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKwkgIHRtcF9zaGFyZWRmbGFnPSctRycgOzsKKwkqU3VuXCBGKikJCQkjIFN1biBGb3J0cmFuIDguMworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCWVzYWMKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCisgICAgICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgJENDICciJHRtcF9zaGFyZWRmbGFnIiIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKyAgICAgICAgZmkKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJeGxmKikKKwkgICMgSUJNIFhMIEZvcnRyYW4gMTAuMSBvbiBQUEMgY2Fubm90IGNyZWF0ZSBzaGFyZWQgbGlicyBpdHNlbGYKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlIC0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtbyAkbGliJworCSAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgICAgJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSAtdmVyc2lvbi1zY3JpcHQgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICBmaQorCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCAkR1JFUCAnQkZEIDJcLjgnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgICAqXCBbWzAxXV0uKiB8ICpcIDIuW1swLTldXS4qIHwgKlwgMi4xW1swLTVdXS4qKQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKwkgICMgdXNlIGFic29sdXRlIHBhdGhzIGZvciBuYW1pbmcgc2hhcmVkIGxpYnJhcmllcywgYW5kIGV4Y2x1ZGUgdGhlCisJICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworCSAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIGVsc2UKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgZmkKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CisgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXhbWzQtOV1dKikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeFtbNS05XV0qKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICBicmVhaworCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nJHt3bH0tZiwnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgIDoKKwkgIGVsc2UKKwkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKwkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKwllbHNlCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICBlbHNlCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICBmaQorCWZpCisgICAgICBmaQorCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisgICAgICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiAkRUNITyAiWCR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iIHwgJFhzZWQ7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAjIGVtcHR5IGV4ZWN1dGFibGUuCisJIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisJIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisJZmkKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJzZGlbWzQ1XV0qKQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nICcKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKyAgICAgIGxpYmV4dD1saWIKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYCRFQ0hPICJYJGRlcGxpYnMiIHwgJFhzZWQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKyAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0ndHJ1ZScKKyAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nbGliIC1PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworICAgICAgX0xUX1RBR1ZBUihmaXhfc3JjZmlsZV9wYXRoLCAkMSk9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJworICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTKCQxKQorICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgZnJlZWJzZDEqKQorICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGhwdXg5KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICA7OworCisgICAgaHB1eDEwKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYiAraCAkc29uYW1lICtiICRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJIyBUcnkgdG8gdXNlIHRoZSAtZXhwb3J0ZWRfc3ltYm9sIGxkIG9wdGlvbiwgaWYgaXQgZG9lcyBub3QKKwkjIHdvcmssIGFzc3VtZSB0aGF0IC1leHBvcnRzX2ZpbGUgZG9lcyBub3Qgd29yayBlaXRoZXIgYW5kCisJIyBpbXBsaWNpdGx5IGV4cG9ydCBhbGwgc3ltYm9scy4KKyAgICAgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLXNoYXJlZCAke3dsfS1leHBvcnRlZF9zeW1ib2wgJHt3bH1mb28gJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9L2Rldi9udWxsIgorICAgICAgICBBQ19MSU5LX0lGRUxTRShpbnQgZm9vKHZvaWQpIHt9LAorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zICR7d2x9LWV4cG9ydHNfZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgICApCisgICAgICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1leHBvcnRzX2ZpbGUgJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPSdubycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKm50byogfCAqcW54KikKKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwllbHNlCisJICBjYXNlICRob3N0X29zIGluCisJICAgb3BlbmJzZFtbMDFdXS4qIHwgb3BlbmJzZDIuW1swLTddXSB8IG9wZW5ic2QyLltbMC03XV0uKikKKwkgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICAgOzsKKwkgICAqKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgICA7OworCSAgZXNhYworCWZpCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvczIqKQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckRUNITyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyBEQVRBID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kRUNITyBFWFBPUlRTID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn5lbXhleHAgJGxpYm9ianMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKT0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IHByaW50ZiAiJXNcXG4iICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAkY29tcGlsZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JFJNICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXogZGVmcycKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAke3dsfS16ICR7d2x9dGV4dCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworICAgICAgZWxzZQorCWNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSoiQ29tcGlsZXJzIDUuMCIqKQorCSAgd2xhcmM9JycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJKikKKwkgIHdsYXJjPScke3dsfScKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisgICAgICAqKQorCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4gIEdDQyBkaXNjYXJkcyBpdCB3aXRob3V0IGAkd2wnLAorCSMgYnV0IGlzIGNhcmVmdWwgZW5vdWdoIG5vdCB0byByZW9yZGVyLgorCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCWVsc2UKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIocmVsb2FkX2NtZHMsICQxKT0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCB4JGhvc3RfdmVuZG9yID0geHNuaTsgdGhlbgorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJsYXJnZWR5bnN5bScKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGZpCitdKQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQordGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCitfTFRfVEFHVkFSKHdpdGhfZ251X2xkLCAkMSk9JHdpdGhfZ251X2xkCisKK19MVF9ERUNMKFtdLCBbbGliZXh0XSwgWzBdLCBbT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpXSlkbmwKK19MVF9ERUNMKFtdLCBbc2hyZXh0X2NtZHNdLCBbMV0sIFtTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKV0pZG5sCitfTFRfREVDTChbXSwgW2V4dHJhY3RfZXhwc3ltc19jbWRzXSwgWzJdLAorICAgIFtUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0pCisgICAgICAkUk0gY29uZnRlc3QqCisgICAgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpCisJcGljX2ZsYWc9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKQorICAgICAgICBjb21waWxlcl9mbGFncz0tdgorICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKKyAgICAgICAgdmVyc3RyaW5nPQorICAgICAgICBvdXRwdXRfb2JqZGlyPS4KKyAgICAgICAgbGlibmFtZT1jb25mdGVzdAorICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSkKKyAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorICAgICAgICBpZiBBQ19UUllfRVZBTChfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIDJcPlwmMSBcfCAkR1JFUCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKQorICAgICAgICB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgICAgZWxzZQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworICAgICAgICBmaQorICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJFJNIGNvbmZ0ZXN0KgorICAgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKV0pCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworX0xUX1RBR0RFQ0woW2J1aWxkX2xpYnRvb2xfbmVlZF9sY10sIFthcmNoaXZlX2NtZHNfbmVlZF9sY10sIFswXSwKKyAgICBbV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllc10pCitfTFRfVEFHREVDTChbYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwKKyAgICBbZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc10sIFswXSwKKyAgICBbV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpY10pCitfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVuc10pCitfTFRfVEFHREVDTChbXSwgW3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXNdKQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9uZWVkc19vYmplY3RdLCBbMV0sCisgICAgW1doZXRoZXIgdGhlIGNvbXBpbGVyIGNvcGVzIHdpdGggcGFzc2luZyBubyBvYmplY3RzIGRpcmVjdGx5XSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc10sIFsyXSwKKyAgICBbQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2NtZHNdLCBbMl0sIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgc2hhcmVkIGFyY2hpdmVdKQorX0xUX1RBR0RFQ0woW10sIFthcmNoaXZlX2V4cHN5bV9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSBpZiBkaWZmZXJlbnQgZnJvbSBidWlsZGluZworICAgIGEgc2hhcmVkIGFyY2hpdmUuXSkKK19MVF9UQUdERUNMKFtdLCBbbW9kdWxlX2V4cHN5bV9jbWRzXSwgWzJdKQorX0xUX1RBR0RFQ0woW10sIFt3aXRoX2dudV9sZF0sIFsxXSwKKyAgICBbV2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgd2l0aCBHTlUgbGQgb3Igbm90XSkKK19MVF9UQUdERUNMKFtdLCBbYWxsb3dfdW5kZWZpbmVkX2ZsYWddLCBbMV0sCisgICAgW0ZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0XSkKK19MVF9UQUdERUNMKFtdLCBbbm9fdW5kZWZpbmVkX2ZsYWddLCBbMV0sCisgICAgW0ZsYWcgdGhhdCBlbmZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9sc10pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0ZsYWcgdG8gaGFyZGNvZGUgJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorICAgIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRdLCBbMV0sCisgICAgW1tJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkKKyAgICBkdXJpbmcgbGlua2luZy4gIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgJGxpYmRpciBkb2VzIG5vdCBleGlzdF1dKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgIi1ycGF0aCIgZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0XSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcworICAgIERJUiBpbnRvIHRoZSByZXN1bHRpbmcgYmluYXJ5IGFuZCB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZGVwZW5kZW5jeSBpcworICAgICJhYnNvbHV0ZSIsIGkuZSBpbXBvc3NpYmxlIHRvIGNoYW5nZSBieSBzZXR0aW5nICR7c2hsaWJwYXRoX3Zhcn0gaWYgdGhlCisgICAgbGlicmFyeSBpcyByZWxvY2F0ZWRdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9taW51c19MXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9zaGxpYnBhdGhfdmFyXSwgWzBdLAorICAgIFtTZXQgdG8gInllcyIgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9hdXRvbWF0aWNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUgorICAgIGludG8gdGhlIGxpYnJhcnkgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkCisgICAgYWdhaW5zdCBpdF0pCitfTFRfVEFHREVDTChbXSwgW2luaGVyaXRfcnBhdGhdLCBbMF0sCisgICAgW1NldCB0byB5ZXMgaWYgbGlua2VyIGFkZHMgcnVudGltZSBwYXRocyBvZiBkZXBlbmRlbnQgbGlicmFyaWVzCisgICAgdG8gcnVudGltZSBwYXRoIGxpc3RdKQorX0xUX1RBR0RFQ0woW10sIFtsaW5rX2FsbF9kZXBsaWJzXSwgWzBdLAorICAgIFtXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXNdKQorX0xUX1RBR0RFQ0woW10sIFtmaXhfc3JjZmlsZV9wYXRoXSwgWzFdLAorICAgIFtGaXggdGhlIHNoZWxsIHZhcmlhYmxlICRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXJdKQorX0xUX1RBR0RFQ0woW10sIFthbHdheXNfZXhwb3J0X3N5bWJvbHNdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZF0pCitfTFRfVEFHREVDTChbXSwgW2V4cG9ydF9zeW1ib2xzX2NtZHNdLCBbMl0sCisgICAgW1RoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtleGNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHNdKQorX0xUX1RBR0RFQ0woW10sIFtpbmNsdWRlX2V4cHN5bXNdLCBbMV0sCisgICAgW1N5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZF0pCitfTFRfVEFHREVDTChbXSwgW3ByZWxpbmtfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZHMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHByb2dyYW1zIChhZ2FpbnN0IGxpYnJhcmllcykgd2l0aCB0ZW1wbGF0ZXNdKQorX0xUX1RBR0RFQ0woW10sIFtmaWxlX2xpc3Rfc3BlY10sIFsxXSwKKyAgICBbU3BlY2lmeSBmaWxlbmFtZSBjb250YWluaW5nIGlucHV0IGZpbGVzXSkKK2RubCBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorZG5sIF9MVF9UQUdERUNMKFtdLCBbdGhyZWFkX3NhZmVfZmxhZ19zcGVjXSwgWzFdLAorZG5sICAgIFtDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZCBzYWZlIG9iamVjdHNdKQorXSkjIF9MVF9MSU5LRVJfU0hMSUJTCisKKworIyBfTFRfTEFOR19DX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDIGNvbXBpbGVyIGFyZSBzdWl0YWJseQorIyBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHIHRvIHdyaXRlCisjIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19DX0NPTkZJR10sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbHRfc2F2ZV9DQz0iJENDIgorQUNfTEFOR19QVVNIKEMpCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fScKKworX0xUX1RBR19DT01QSUxFUgorIyBTYXZlIHRoZSBkZWZhdWx0IGNvbXBpbGVyLCBzaW5jZSBpdCBnZXRzIG92ZXJ3cml0dGVuIHdoZW4gdGhlIG90aGVyCisjIHRhZ3MgYXJlIGJlaW5nIHRlc3RlZCwgYW5kIF9MVF9UQUdWQVIoY29tcGlsZXIsIFtdKSBpcyBhIE5PUC4KK2NvbXBpbGVyX0RFRkFVTFQ9JENDCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisgIExUX1NZU19ETE9QRU5fU0VMRgorICBfTFRfQ01EX1NUUklQTElCCisKKyAgIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CisgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgZmkKKyAgICA7OworCisgIGFpeFtbNC05XV0qKQorICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgIF9MVF9DT05GSUcoJDEpCitmaQorQUNfTEFOR19QT1AKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBfTFRfTEFOR19DX0NPTkZJRworCisKKyMgX0xUX1BST0dfQ1hYCisjIC0tLS0tLS0tLS0tLQorIyBTaW5jZSBBQ19QUk9HX0NYWCBpcyBicm9rZW4sIGluIHRoYXQgaXQgcmV0dXJucyBnKysgaWYgdGhlcmUgaXMgbm8gYysrCisjIGNvbXBpbGVyLCB3ZSBoYXZlIG91ciBvd24gdmVyc2lvbiBoZXJlLgorbTRfZGVmdW4oW19MVF9QUk9HX0NYWF0sCitbCitwdXNoZGVmKFtBQ19NU0dfRVJST1JdLCBbX2x0X2NhdWdodF9DWFhfZXJyb3I9eWVzXSkKK0FDX1BST0dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorICBBQ19QUk9HX0NYWENQUAorZWxzZQorICBfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXMKK2ZpCitwb3BkZWYoW0FDX01TR19FUlJPUl0pCitdKSMgX0xUX1BST0dfQ1hYCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbX0xUX1BST0dfQ1hYXSwgW10pCisKKworIyBfTFRfTEFOR19DWFhfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgQysrIGNvbXBpbGVyIGFyZSBzdWl0YWJseQorIyBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHIHRvIHdyaXRlCisjIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19DWFhfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtfTFRfUFJPR19DWFhdKWRubAorbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCisKK0FDX0xBTkdfUFVTSChDKyspCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBDWFggY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iaW50IHNvbWVfdmFyaWFibGUgPSAwOyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW1tdXSkgeyByZXR1cm4oMCk7IH0nCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSRDQworICBsdF9zYXZlX0xEPSRMRAorICBsdF9zYXZlX0dDQz0kR0NDCisgIEdDQz0kR1hYCisgIGx0X3NhdmVfd2l0aF9nbnVfbGQ9JHdpdGhfZ251X2xkCisgIGx0X3NhdmVfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRAorICBpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkY3h4CisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wYXRoX0xEQ1hYK3NldH0iOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3BhdGhfTEQKKyAgZmkKKyAgdGVzdCAteiAiJHtMRENYWCtzZXR9IiB8fCBMRD0kTERDWFgKKyAgQ0M9JHtDWFgtImMrKyJ9CisgIGNvbXBpbGVyPSRDQworICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgIyBXZSBkb24ndCB3YW50IC1mbm8tZXhjZXB0aW9uIHdoZW4gY29tcGlsaW5nIEMrKyBjb2RlLCBzbyBzZXQgdGhlCisgICAgIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQorICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCisgICAgZWxzZQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgIyBTZXQgdXAgZGVmYXVsdCBHTlUgQysrIGNvbmZpZ3VyYXRpb24KKworICAgICAgTFRfUEFUSF9MRAorCisgICAgICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKKyAgICAgICMgYXJjaGl2aW5nIGNvbW1hbmRzIGJlbG93IGFzc3VtZSB0aGF0IEdOVSBsZCBpcyBiZWluZyB1c2VkLgorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisgICAgICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgICMgWFhYIEkgdGhpbmsgd2xhcmMgY2FuIGJlIGVsaW1pbmF0ZWQgaW4gbHRjZi1jeHgsIGJ1dCBJIG5lZWQgdG8KKyAgICAgICAgIyAgICAgaW52ZXN0aWdhdGUgaXQgYSBsaXR0bGUgYml0IG1vcmUuIChNTSkKKyAgICAgICAgd2xhcmM9JyR7d2x9JworCisgICAgICAgICMgYW5jaWVudCBHTlUgbGQgZGlkbid0IHN1cHBvcnQgLS13aG9sZS1hcmNoaXZlIGV0LiBhbC4KKyAgICAgICAgaWYgZXZhbCAiYCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkYCAtLWhlbHAgMj4mMSIgfAorCSAgJEdSRVAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICBlbHNlCisgICAgICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgICB3bGFyYz0KKworICAgICAgICAjIEEgZ2VuZXJpYyBhbmQgdmVyeSBzaW1wbGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBjcmVhdGlvbgorICAgICAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQorICAgICAgICAjIGxpbmtlciwgaW5zdGVhZCBvZiBHTlUgbGQuICBJZiBwb3NzaWJsZSwgdGhpcyBzZXR0aW5nIHNob3VsZAorICAgICAgICAjIG92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5hdGl2ZSBsaW5rZXIgZmVhdHVyZXMgb24KKyAgICAgICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworICAgICAgZmkKKworICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJcLUwiJworCisgICAgZWxzZQorICAgICAgR1hYPW5vCisgICAgICB3aXRoX2dudV9sZD1ubworICAgICAgd2xhcmM9CisgICAgZmkKKworICAgICMgUE9SVE1FOiBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBDKysgbGluayBjaGFyYWN0ZXJpc3RpY3MKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzIzXV18YWl4NC5bWzIzXV0uKnxhaXhbWzUtOV1dKikKKwkgICAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisJICAgICAgY2FzZSAkbGRfZmxhZyBpbgorCSAgICAgICotYnJ0bCopCisJICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworCSAgICAgICAgYnJlYWsKKwkgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIDs7CisgICAgICAgICAgZXNhYworCisgICAgICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgICAgICBub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICAgIGZpCisKKyAgICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoZmlsZV9saXN0X3NwZWMsICQxKT0nJHt3bH0tZiwnCisKKyAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKyAgICAgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKyAgICAgICAgICAjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8ICRHUkVQIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCSAgdGhlbgorCSAgICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgICAgOgorCSAgZWxzZQorCSAgICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKwkgICAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorCSAgZmkKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgIyBub3QgdXNpbmcgZ2NjCisgICAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJICAjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworICAgICAgICAgIGVsc2UKKwkgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LUcnCisJICAgIGVsc2UKKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgICBmaQorICAgICAgICAgIGZpCisgICAgICAgIGZpCisKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmV4cGFsbCcKKyAgICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0bworCSMgZXhwb3J0LgorICAgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKyAgICAgICAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisgICAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSctYmVyb2snCisgICAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5CisgICAgICAgICAgIyBleGVjdXRhYmxlLgorICAgICAgICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisKKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gJEVDSE8gIlgke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiB8ICRYc2VkOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKyAgICAgICAgICBlbHNlCisJICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbgorCSAgICAjIGVtcHR5IGV4ZWN1dGFibGUuCisJICAgIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm5vdG9rJworCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkgICAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJGNvbnZlbmllbmNlJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZAorCSAgICAjIGxpYnJhcmllcy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgICBiZW9zKikKKwlpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwllbHNlCisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworCisgICAgICBjaG9ydXMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgICopCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgICAjIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKworICAgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgICAgICMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKyAgICAgICAgICAjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgICBjcCAkZXhwb3J0X3N5bWJvbHMgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisgICAgICAgICAgZWxzZQorCSAgICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgICAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgICAgICBmaX4KKyAgICAgICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgICBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUygkMSkKKwk7OworCisgICAgICBkZ3V4KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBlYysrKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2RbWzEyXV0qKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlCisJIyBzd2l0Y2ggdG8gRUxGCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZC1lbGYqKQorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgICAjIEZyZWVCU0QgMyBhbmQgbGF0ZXIgdXNlIEdOVSBDKysgYW5kIEdOVSBsZCB3aXRoIHN0YW5kYXJkIEVMRgorICAgICAgICAjIGNvbnZlbnRpb25zCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGdudSopCisgICAgICAgIDs7CisKKyAgICAgIGhwdXg5KikKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJICAgICAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJICAgICAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgYUNDKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtYiAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAgICAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisgICAgICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKyAgICAgICAgICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisgICAgICAgICAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAjIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkRUdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaHB1eDEwKnxocHV4MTEqKQorICAgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKyAgICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBmaQorICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBhQ0MqKQorCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICBpYTY0KikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCAkR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworCSAgICA7OworICAgICAgICAgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorCSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgICAgICAgaHBwYSo2NCopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgIGlhNjQqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICAqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICBlc2FjCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBpbnRlcml4W1szLTldXSopCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisJIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorCSMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKwkjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisJIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworCSMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU0dJIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtYWxsIC1tdWx0aWdvdCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgZWxzZQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgLW8gJGxpYicKKwkgICAgICBmaQorCSAgICBmaQorCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgICA7OworCisgICAgICBsaW51eCogfCBrKmJzZCotZ251KQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIEtDQyopCisJICAgICMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSAgICAjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJICAgICMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkgICAgIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHM7IG12IFwkdGVtcGxpYiAkbGliJworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqICkKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgd2l0aF9nbnVfbGQ9eWVzCisJICAgICMgdmVyc2lvbiA4LjAgYW5kIGFib3ZlIG9mIGljcGMgY2hva2Ugb24gbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2xzCisJICAgICMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJICAgICMgZWFybGllciBkbyBub3QgYWRkIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCisJICAgIGNhc2UgYCRDQyAtViAyPiYxYCBpbgorCSAgICAgICoiVmVyc2lvbiA3LiIqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgICAqKSAgIyBWZXJzaW9uIDguMCBvciBuZXdlcgorCSAgICAgICAgdG1wX2lkeW49CisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCQkgIGlhNjQqKSB0bXBfaWR5bj0nIC1pX2R5bmFtaWMnOzsKKwkJZXNhYworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICBlc2FjCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICA7OworICAgICAgICAgIHBnQ0MqIHwgcGdjcHAqKQorICAgICAgICAgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgY2FzZSBgJENDIC1WYCBpbgorCSAgICAqcGdDQ1wgW1sxLTVdXSogfCAqcGdjcHBcIFtbMS01XV0qKQorCSAgICAgIF9MVF9UQUdWQVIocHJlbGlua19jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvYmpzICRsaWJvYmpzICRjb21waWxlX2RlcGxpYnN+CisJCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgIicKKwkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9sZG9ianMkb2xkX2RlcGxpYnN+CisJCSRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8ICROTDJTUGB+CisJCSRSQU5MSUIgJG9sZGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgICopICMgVmVyc2lvbiA2IHdpbGwgdXNlIHdlYWsgc3ltYm9scworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICAgIDs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCisKKwkgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkImA7IHRlbXBsaXN0PWAkRUNITyAiWCR0ZW1wbGlzdCIgfCAkWHNlZCAtZSAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworCSAgICA7OworCSAgeGwqKQorCSAgICAjIElCTSBYTCA4LjAgb24gUFBDLCB3aXRoIEdOVSBsZAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCSRDQyAtcW1rc2hyb2JqICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCSAgICBmaQorCSAgICA7OworCSAgKikKKwkgICAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJICAgICpTdW5cIEMqKQorCSAgICAgICMgU3VuIEMrKyA1LjkKKwkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAke3dsfSRleHBvcnRfc3ltYm9scycKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT15ZXMKKworCSAgICAgICMgTm90IHN1cmUgd2hldGhlciBzb21ldGhpbmcgYmFzZWQgb24KKwkgICAgICAjICRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxCisJICAgICAgIyB3b3VsZCBiZSBiZXR0ZXIuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisKKwkgICAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbHlueG9zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG04OGsqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG12cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgY3h4KikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKwkgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIG5ldGJzZCopCisgICAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKwkgIHdsYXJjPQorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCWZpCisJIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQIGNvbmZ0ZXN0LiRvYmpleHQgfCAkU0VEIC1lICJzOi1sZ2NjIC1sYyAtbGdjYzo6IicKKwk7OworCisgICAgICAqbnRvKiB8ICpxbngqKQorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworCTs7CisKKyAgICAgIG9wZW5ic2QyKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyBhcmUgZmFpcmx5IGJyb2tlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBvcGVuYnNkKikKKwlpZiB0ZXN0IC1mIC91c3IvbGliZXhlYy9sZC5zbzsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkbGliJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSwkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworCSAgZmkKKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWVjaG8KKwllbHNlCisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworCisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gIiRsaWIiIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgICAqKSBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKyAgICAgICAgICBSQ0MqKQorCSAgICAjIFJhdGlvbmFsIEMrKyAyLjQuMQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGN4eCopCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCQk7OworCSAgICAgICopCisJICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CisJICAgICAgICAgIGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJICAgICAgICAgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgJHt3bH0taW5wdXQgJHt3bH0kbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICAgICAgICAgJFJNICRsaWIuZXhwJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworCQk7OworCSAgICBlc2FjCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCIgfCAkR1JFUCAtdiAibGQ6ImA7IHRlbXBsaXN0PWAkRUNITyAiWCR0ZW1wbGlzdCIgfCAkWHNlZCAtZSAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAgIG9zZjMqKQorCSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgICAqKQorCSAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIiR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkJICA7OworCSAgICAgIGVzYWMKKworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJcLUwiJworCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgcHNvcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIHN1bm9zNCopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgc29sYXJpcyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgICAgICRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICAgICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCSAgICAgICopCisJCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgYW5kIHJlb3JkZXIgbGlua2VyIG9wdGlvbnMsCisJCSMgYnV0IHVuZGVyc3RhbmRzIGAteiBsaW5rZXJfZmxhZycuCisJICAgICAgICAjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorCQlfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKworCSAgICAjIFRoZSBDKysgY29tcGlsZXIgbXVzdCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LXogJHt3bH1kZWZzJworCSAgICAgIGlmICRDQyAtLXZlcnNpb24gfCAkR1JFUCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKwkgICAgICBlbHNlCisJICAgICAgICAjIGcrKyAyLjcgYXBwZWFycyB0byByZXF1aXJlIGAtRycgTk9UIGAtc2hhcmVkJyBvbiB0aGlzCisJICAgICAgICAjIHBsYXRmb3JtLgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtRyAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCisJICAgICAgZmkKKworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICR3bCRsaWJkaXInCisJICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCQlzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCQkqKQorCQkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3QkY29udmVuaWVuY2UgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCQkgIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIENDKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKwkjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorCSMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKwkjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKwkjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisJIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisJIyBhcyAteiBkZWZzLgorCV9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworCV9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisJcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICA7OworCSAgKikKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICA7OworCWVzYWMKKyAgICAgIDs7CisKKyAgICAgIHRhbmRlbSopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICB2eHdvcmtzKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCisgICAgdGVzdCAiJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEdYWCIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgQ0M9JGx0X3NhdmVfQ0MKKyAgTERDWFg9JExECisgIExEPSRsdF9zYXZlX0xECisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgd2l0aF9nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKyAgbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorICBsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKKyAgbHRfY3ZfcHJvZ19nbnVfbGRjeHg9JGx0X2N2X3Byb2dfZ251X2xkCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitmaSAjIHRlc3QgIiRfbHRfY2F1Z2h0X0NYWF9lcnJvciIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfQ1hYX0NPTkZJRworCisKKyMgX0xUX1NZU19ISURERU5fTElCREVQUyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaWd1cmUgb3V0ICJoaWRkZW4iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZyb20gdmVyYm9zZQorIyBjb21waWxlciBvdXRwdXQgd2hlbiBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCittNF9kZWZ1bihbX0xUX1NZU19ISURERU5fTElCREVQU10sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KK19MVF9UQUdWQVIocHJlZGVwcywgJDEpPQorX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQorX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KKworZG5sIHdlIGNhbid0IHVzZSB0aGUgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIGhlcmUsCitkbmwgYmVjYXVzZSBpdCBjb250YWlucyBjb2RlIGludGVuZGVkIGZvciBhbiBleGVjdXRhYmxlLAorZG5sIG5vdCBhIGxpYnJhcnkuICBJdCdzIHBvc3NpYmxlIHdlIHNob3VsZCBsZXQgZWFjaAorZG5sIHRhZyBkZWZpbmUgYSBuZXcgbHRfPz8/P19saW5rX3Rlc3RfY29kZSB2YXJpYWJsZSwKK2RubCBidXQgaXQncyBvbmx5IHVzZWQgaGVyZS4uLgorbTRfaWYoWyQxXSwgW10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgoraW50IGE7Cit2b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQorX0xUX0VPRgorXSwgWyQxXSwgW0NYWF0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorY2xhc3MgRm9vCit7CitwdWJsaWM6CisgIEZvbyAodm9pZCkgeyBhID0gMDsgfQorcHJpdmF0ZToKKyAgaW50IGE7Cit9OworX0xUX0VPRgorXSwgWyQxXSwgW0Y3N10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIqNCBhCisgICAgICBhPTAKKyAgICAgIHJldHVybgorICAgICAgZW5kCitfTFRfRU9GCitdLCBbJDFdLCBbRkNdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtHQ0pdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK3B1YmxpYyBjbGFzcyBmb28geworICBwcml2YXRlIGludCBhOworICBwdWJsaWMgdm9pZCBiYXIgKHZvaWQpIHsKKyAgICBhID0gMDsKKyAgfQorfTsKK19MVF9FT0YKK10pCitkbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Citkbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgoraWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCisKKyAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQorICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KKyAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubworCisgIGZvciBwIGluIGBldmFsICIkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiYDsgZG8KKyAgICBjYXNlICRwIGluCisKKyAgICAtTCogfCAtUiogfCAtbCopCisgICAgICAgIyBTb21lIGNvbXBpbGVycyBwbGFjZSBzcGFjZSBiZXR3ZWVuICIte0wsUn0iIGFuZCB0aGUgcGF0aC4KKyAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2UuCisgICAgICAgaWYgdGVzdCAkcCA9ICItTCIgfHwKKyAgICAgICAgICB0ZXN0ICRwID0gIi1SIjsgdGhlbgorCSBwcmV2PSRwCisJIGNvbnRpbnVlCisgICAgICAgZWxzZQorCSBwcmV2PQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICRwIGluCisJIC1MKiB8IC1SKikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKi4kb2JqZXh0KQorICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAorICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgorICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgorCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcworCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgorCisgICAgZXNhYworICBkb25lCisKKyAgIyBDbGVhbiB1cC4KKyAgcm0gLWYgYS5vdXQgYS5leGUKK2Vsc2UKKyAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nICQxIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRSTSAtZiBjb25mZXN0LiRvYmpleHQKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK200X2lmKFskMV0sIFtDWFhdLAorW2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXhbWzMtOV1dKikKKyAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgorICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgorICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCQxKT0KKyAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0KKyAgOzsKKworbGludXgqKQorICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKyAgKlN1blwgQyopCisgICAgIyBTdW4gQysrIDUuOQorCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworCitzb2xhcmlzKikKKyAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgQ0MqKQorICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgorICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKKyAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgorICAgIGlmIHRlc3QgIiRzb2xhcmlzX3VzZV9zdGxwb3J0NCIgIT0geWVzOyB0aGVuCisgICAgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCQxKT0nLWxpYnJhcnk9Q3N0ZCAtbGlicmFyeT1DcnVuJworICAgIGZpCisgICAgOzsKKyAgZXNhYworICA7OworZXNhYworXSkKKworY2FzZSAiICRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkgIiBpbgorKiIgLWxjICIqKSBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8gOzsKK2VzYWMKKyBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPQoraWYgdGVzdCAtbiAiJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSI7IHRoZW4KKyBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfZGlycywgJDEpPWBlY2hvICIgJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSIgfCAke1NFRH0gLWUgJ3MhIC1MISAhZycgLWUgJ3MhXiAhISdgCitmaQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9saWJfc2VhcmNoX2RpcnNdLCBbMV0sCisgICAgW1RoZSBkaXJlY3RvcmllcyBzZWFyY2hlZCBieSB0aGlzIGNvbXBpbGVyIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeV0pCitfTFRfVEFHREVDTChbXSwgW3ByZWRlcF9vYmplY3RzXSwgWzFdLAorICAgIFtEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8KKyAgICBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeV0pCitfTFRfVEFHREVDTChbXSwgW3Bvc3RkZXBfb2JqZWN0c10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcHNdLCBbMV0pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF0sIFsxXSwKKyAgICBbVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyAgICBhIHNoYXJlZCBsaWJyYXJ5XSkKK10pIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTCisKKworIyBfTFRfUFJPR19GNzcKKyMgLS0tLS0tLS0tLS0tCisjIFNpbmNlIEFDX1BST0dfRjc3IGlzIGJyb2tlbiwgaW4gdGhhdCBpdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcKKyMgaWYgdGhlcmUgaXMgbm8gZm9ydHJhbiBjb21waWxlciwgd2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gaGVyZS4KK200X2RlZnVuKFtfTFRfUFJPR19GNzddLAorWworcHVzaGRlZihbQUNfTVNHX0VSUk9SXSwgW19sdF9kaXNhYmxlX0Y3Nz15ZXNdKQorQUNfUFJPR19GNzcKK2lmIHRlc3QgLXogIiRGNzciIHx8IHRlc3QgIlgkRjc3IiA9ICJYbm8iOyB0aGVuCisgIF9sdF9kaXNhYmxlX0Y3Nz15ZXMKK2ZpCitwb3BkZWYoW0FDX01TR19FUlJPUl0pCitdKSMgX0xUX1BST0dfRjc3CisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbX0xUX1BST0dfRjc3XSwgW10pCisKKworIyBfTFRfTEFOR19GNzdfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgRm9ydHJhbiA3NyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfRjc3X0NPTkZJR10sCitbQUNfUkVRVUlSRShbX0xUX1BST0dfRjc3XSlkbmwKK0FDX0xBTkdfUFVTSChGb3J0cmFuIDc3KQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KK2FjX2V4dD1mCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBGNzcgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgQ0M9JHtGNzctImY3NyJ9CisgIGNvbXBpbGVyPSRDQworICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKyAgR0NDPSRHNzcKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKwkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisJZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHNzciCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBHQ0M9JGx0X3NhdmVfR0NDCisgIENDPSIkbHRfc2F2ZV9DQyIKK2ZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfRjc3X0NPTkZJRworCisKKyMgX0xUX1BST0dfRkMKKyMgLS0tLS0tLS0tLS0KKyMgU2luY2UgQUNfUFJPR19GQyBpcyBicm9rZW4sIGluIHRoYXQgaXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nCisjIGlmIHRoZXJlIGlzIG5vIGZvcnRyYW4gY29tcGlsZXIsIHdlIGhhdmUgb3VyIG93biB2ZXJzaW9uIGhlcmUuCittNF9kZWZ1bihbX0xUX1BST0dfRkNdLAorWworcHVzaGRlZihbQUNfTVNHX0VSUk9SXSwgW19sdF9kaXNhYmxlX0ZDPXllc10pCitBQ19QUk9HX0ZDCitpZiB0ZXN0IC16ICIkRkMiIHx8IHRlc3QgIlgkRkMiID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRkM9eWVzCitmaQorcG9wZGVmKFtBQ19NU0dfRVJST1JdKQorXSkjIF9MVF9QUk9HX0ZDCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbX0xUX1BST0dfRkNdLCBbXSkKKworCisjIF9MVF9MQU5HX0ZDX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIGEgRm9ydHJhbiBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfRkNfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtfTFRfUFJPR19GQ10pZG5sCitBQ19MQU5HX1BVU0goRm9ydHJhbikKKworX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCitfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCitfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGZjIHRlc3Qgc291cmNlcy4KK2FjX2V4dD0ke2FjX2ZjX3NyY2V4dC1mfQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZmMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIE5vIHNlbnNlIGluIHJ1bm5pbmcgYWxsIHRoZXNlIHRlc3RzIGlmIHdlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0CisjIHRoZSBGQyBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9kaXNhYmxlX0ZDIiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJcCisgICAgICBzdWJyb3V0aW5lIHQKKyAgICAgIHJldHVybgorICAgICAgZW5kCisiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSJcCisgICAgICBwcm9ncmFtIHQKKyAgICAgIGVuZAorIgorCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0iJENDIgorICBsdF9zYXZlX0dDQz0kR0NDCisgIENDPSR7RkMtImY5NSJ9CisgIGNvbXBpbGVyPSRDQworICBHQ0M9JGFjX2N2X2ZjX2NvbXBpbGVyX2dudQorCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgICAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisJICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworCWZpCisgICAgICAgIDs7CisgICAgZXNhYworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkYWNfY3ZfZmNfY29tcGlsZXJfZ251IgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX1NZU19ISURERU5fTElCREVQUygkMSkKKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBHQ0M9JGx0X3NhdmVfR0NDCisgIENDPSIkbHRfc2F2ZV9DQyIKK2ZpICMgdGVzdCAiJF9sdF9kaXNhYmxlX0ZDIiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19GQ19DT05GSUcKKworCisjIF9MVF9MQU5HX0dDSl9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIEdOVSBKYXZhIENvbXBpbGVyIGNvbXBpbGVyCisjIGFyZSBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19HQ0pfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtMVF9QUk9HX0dDSl0pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWphdmEKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge30iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J3B1YmxpYyBjbGFzcyBjb25mdGVzdCB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tbXV0gYXJndikge307IH0nCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorbHRfc2F2ZV9HQ0M9JEdDQworR0NDPXllcworQ0M9JHtHQ0otImdjaiJ9Citjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKworX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKKworaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0FDX0xBTkdfUkVTVE9SRQorCitHQ0M9JGx0X3NhdmVfR0NDCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfR0NKX0NPTkZJRworCisKKyMgX0xUX0xBTkdfUkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX1JDX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19SQ10pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9JworCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0KK0NDPSR7UkMtIndpbmRyZXMifQorY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCitfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisKK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgOgorICBfTFRfQ09ORklHKCQxKQorZmkKKworR0NDPSRsdF9zYXZlX0dDQworQUNfTEFOR19SRVNUT1JFCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfUkNfQ09ORklHCisKKworIyBMVF9QUk9HX0dDSgorIyAtLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfR0NKXSwKK1ttNF9pZmRlZihbQUNfUFJPR19HQ0pdLCBbQUNfUFJPR19HQ0pdLAorICBbbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLCBbQV1bTV9QUk9HX0dDSl0sCisgICAgW0FDX0NIRUNLX1RPT0woR0NKLCBnY2osKQorICAgICAgdGVzdCAieCR7R0NKRkxBR1Mrc2V0fSIgPSB4c2V0IHx8IEdDSkZMQUdTPSItZyAtTzIiCisgICAgICBBQ19TVUJTVChHQ0pGTEFHUyldKV0pW11kbmwKK10pCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19HQ0pdLCBbTFRfUFJPR19HQ0pdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sIFtdKQorCisKKyMgTFRfUFJPR19SQworIyAtLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19SQ10sCitbQUNfQ0hFQ0tfVE9PTChSQywgd2luZHJlcywpCitdKQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfUkNdLCBbTFRfUFJPR19SQ10pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfUkNdLCBbXSkKKworCisjIF9MVF9ERUNMX0VHUkVQCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBncmVwCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX0VHUkVQXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfRkdSRVBdKWRubAordGVzdCAteiAiJEdSRVAiICYmIEdSRVA9Z3JlcAorX0xUX0RFQ0woW10sIFtHUkVQXSwgWzFdLCBbQSBncmVwIHByb2dyYW0gdGhhdCBoYW5kbGVzIGxvbmcgbGluZXNdKQorX0xUX0RFQ0woW10sIFtFR1JFUF0sIFsxXSwgW0FuIEVSRSBtYXRjaGVyXSkKK19MVF9ERUNMKFtdLCBbRkdSRVBdLCBbMV0sIFtBIGxpdGVyYWwgc3RyaW5nIG1hdGNoZXJdKQorZG5sIE5vbi1ibGVlZGluZy1lZGdlIGF1dG9jb25mIGRvZXNuJ3Qgc3Vic3QgR1JFUCwgc28gZG8gaXQgaGVyZSB0b28KK0FDX1NVQlNUKFtHUkVQXSkKK10pCisKKworIyBfTFRfREVDTF9PQkpEVU1QCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBvYmpkdW1wCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX09CSkRVTVBdLAorW0FDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtBbiBvYmplY3Qgc3ltYm9sIGR1bXBlcl0pCitBQ19TVUJTVChbT0JKRFVNUF0pCitdKQorCisKKyMgX0xUX0RFQ0xfU0VECisjIC0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgYSBmdWxseS1mdW5jdGlvbmFsIHNlZCBwcm9ncmFtLCB0aGF0IHRydW5jYXRlcworIyBhcyBmZXcgY2hhcmFjdGVycyBhcyBwb3NzaWJsZS4gIFByZWZlciBHTlUgc2VkIGlmIGZvdW5kLgorbTRfZGVmdW4oW19MVF9ERUNMX1NFRF0sCitbQUNfUFJPR19TRUQKK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKK19MVF9ERUNMKFtdLCBbU0VEXSwgWzFdLCBbQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitfTFRfREVDTChbXSwgW1hzZWRdLCBbIlwkU0VEIC1lIDFzL15YLy8iXSwKKyAgICBbU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW5dKQorXSkjIF9MVF9ERUNMX1NFRAorCittNF9pZm5kZWYoW0FDX1BST0dfU0VEXSwgWworIyBOT1RFOiBUaGlzIG1hY3JvIGhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGludG8gICAjCisjICBHTlUgQXV0b2NvbmYgYXMgQUNfUFJPR19TRUQuICBXaGVuIGl0IGlzIGF2YWlsYWJsZSBpbiAgICMKKyMgIGEgcmVsZWFzZWQgdmVyc2lvbiBvZiBBdXRvY29uZiB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgICAgIworIyAgbWFjcm8gYW5kIHVzZSBpdCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisKK200X2RlZnVuKFtBQ19QUk9HX1NFRF0sCitbQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXRdKQorQUNfQ0FDSEVfVkFMKGx0X2N2X3BhdGhfU0VELAorWyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgorIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisgICAgICAgIGx0X2FjX3NlZF9saXN0PSIkbHRfYWNfc2VkX2xpc3QgJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCitsdF9hY19tYXg9MAorbHRfYWNfY291bnQ9MAorIyBBZGQgL3Vzci94cGc0L2Jpbi9zZWQgYXMgaXQgaXMgdHlwaWNhbGx5IGZvdW5kIG9uIFNvbGFyaXMKKyMgYWxvbmcgd2l0aCAvYmluL3NlZCB0aGF0IHRydW5jYXRlcyBvdXRwdXQuCitmb3IgbHRfYWNfc2VkIGluICRsdF9hY19zZWRfbGlzdCAvdXNyL3hwZzQvYmluL3NlZDsgZG8KKyAgdGVzdCAhIC1mICRsdF9hY19zZWQgJiYgY29udGludWUKKyAgY2F0IC9kZXYvbnVsbCA+IGNvbmZ0ZXN0LmluCisgIGx0X2FjX2NvdW50PTAKKyAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPmNvbmZ0ZXN0LmluCisgICMgQ2hlY2sgZm9yIEdOVSBzZWQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgaWYgIiRsdF9hY19zZWQiIC0tdmVyc2lvbiAyPiYxIDwgL2Rldi9udWxsIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBicmVhaworICBmaQorICB3aGlsZSB0cnVlOyBkbworICAgIGNhdCBjb25mdGVzdC5pbiBjb25mdGVzdC5pbiA+Y29uZnRlc3QudG1wCisgICAgbXYgY29uZnRlc3QudG1wIGNvbmZ0ZXN0LmluCisgICAgY3AgY29uZnRlc3QuaW4gY29uZnRlc3QubmwKKyAgICBlY2hvID4+Y29uZnRlc3QubmwKKyAgICAkbHRfYWNfc2VkIC1lICdzL2EkLy8nIDwgY29uZnRlc3QubmwgPmNvbmZ0ZXN0Lm91dCB8fCBicmVhaworICAgIGNtcCAtcyBjb25mdGVzdC5vdXQgY29uZnRlc3QubmwgfHwgYnJlYWsKKyAgICAjIDEwMDAwIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgICBsdF9hY19jb3VudD1gZXhwciAkbHRfYWNfY291bnQgKyAxYAorICAgIGlmIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAkbHRfYWNfbWF4OyB0aGVuCisgICAgICBsdF9hY19tYXg9JGx0X2FjX2NvdW50CisgICAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgZmkKKyAgZG9uZQorZG9uZQorXSkKK1NFRD0kbHRfY3ZfcGF0aF9TRUQKK0FDX1NVQlNUKFtTRURdKQorQUNfTVNHX1JFU1VMVChbJFNFRF0pCitdKSNBQ19QUk9HX1NFRAorXSkjbTRfaWZuZGVmCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19TRURdLCBbQUNfUFJPR19TRURdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0sIFtdKQorCisKKyMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGaW5kIG91dCB3aGV0aGVyIHRoZSBzaGVsbCBpcyBCb3VybmUgb3IgWFNJIGNvbXBhdGlibGUsCisjIG9yIGhhcyBzb21lIG90aGVyIHVzZWZ1bCBmZWF0dXJlcy4KK200X2RlZnVuKFtfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVNdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgc29tZSBYU0kgY29uc3RydWN0c10pCisjIFRyeSBzb21lIFhTSSBmZWF0dXJlcworeHNpX3NoZWxsPW5vCisoIF9sdF9kdW1teT0iYS9iL2MiCisgIHRlc3QgIiR7X2x0X2R1bW15IyMqL30sJHtfbHRfZHVtbXklLyp9LCIke19sdF9kdW1teSUiJF9sdF9kdW1teSJ9LCBcCisgICAgICA9IGMsYS9iLCwgXAorICAgICYmIGV2YWwgJ3Rlc3QgJCgoIDEgKyAxICkpIC1lcSAyIFwKKyAgICAmJiB0ZXN0ICIkeyNfbHRfZHVtbXl9IiAtZXEgNScgKSA+L2Rldi9udWxsIDI+JjEgXAorICAmJiB4c2lfc2hlbGw9eWVzCitBQ19NU0dfUkVTVUxUKFskeHNpX3NoZWxsXSkKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFt4c2lfc2hlbGw9JyR4c2lfc2hlbGwnXSkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAiKz0iXSkKK2x0X3NoZWxsX2FwcGVuZD1ubworKCBmb289YmFyOyBzZXQgZm9vIGJhejsgZXZhbCAiJFsxXSs9XCRbMl0iICYmIHRlc3QgIiRmb28iID0gYmFyYmF6ICkgXAorICAgID4vZGV2L251bGwgMj4mMSBcCisgICYmIGx0X3NoZWxsX2FwcGVuZD15ZXMKK0FDX01TR19SRVNVTFQoWyRsdF9zaGVsbF9hcHBlbmRdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2x0X3NoZWxsX2FwcGVuZD0nJGx0X3NoZWxsX2FwcGVuZCddKQorCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgbHRfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgbHRfdW5zZXQ9ZmFsc2UKK2ZpCitfTFRfREVDTChbXSwgW2x0X3Vuc2V0XSwgWzBdLCBbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgInVuc2V0Il0pZG5sCisKKyMgdGVzdCBFQkNESUMgb3IgQVNDSUkKK2Nhc2UgYGVjaG8gWHx0ciBYICdcMTAxJ2AgaW4KKyBBKSAjIEFTQ0lJIGJhc2VkIHN5c3RlbQorICAgICMgXG4gaXMgbm90IGludGVycHJldGVkIGNvcnJlY3RseSBieSBTb2xhcmlzIDggL3Vzci91Y2IvdHIKKyAgbHRfU1AyTkw9J3RyIFwwNDAgXDAxMicKKyAgbHRfTkwyU1A9J3RyIFwwMTVcMDEyIFwwNDBcMDQwJworICA7OworICopICMgRUJDRElDIGJhc2VkIHN5c3RlbQorICBsdF9TUDJOTD0ndHIgXDEwMCBcbicKKyAgbHRfTkwyU1A9J3RyIFxyXG4gXDEwMFwxMDAnCisgIDs7Citlc2FjCitfTFRfREVDTChbU1AyTkxdLCBbbHRfU1AyTkxdLCBbMV0sIFt0dXJuIHNwYWNlcyBpbnRvIG5ld2xpbmVzXSlkbmwKK19MVF9ERUNMKFtOTDJTUF0sIFtsdF9OTDJTUF0sIFsxXSwgW3R1cm4gbmV3bGluZXMgaW50byBzcGFjZXNdKWRubAorXSkjIF9MVF9DSEVDS19TSEVMTF9GRUFUVVJFUworCisKKyMgX0xUX1BST0dfWFNJX1NIRUxMRk5TCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCb3VybmUgYW5kIFhTSSBjb21wYXRpYmxlIHZhcmlhbnRzIG9mIHNvbWUgdXNlZnVsIHNoZWxsIGZ1bmN0aW9ucy4KK200X2RlZnVuKFtfTFRfUFJPR19YU0lfU0hFTExGTlNdLAorW2Nhc2UgJHhzaV9zaGVsbCBpbgorICB5ZXMpCisgICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKworIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCisjIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KK2Z1bmNfZGlybmFtZSAoKQoreworICBjYXNlICR7MX0gaW4KKyAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OworICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgZXNhYworfQorCisjIGZ1bmNfYmFzZW5hbWUgZmlsZQorZnVuY19iYXNlbmFtZSAoKQoreworICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCit9CisKKyMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KKyMgY2FsbDoKKyMgICBkaXJuYW1lOiAgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksCisjICAgICAgICAgICAgIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIHNldCByZXN1bHQKKyMgICAgICAgICAgICAgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisjICAgYmFzZW5hbWU6IENvbXB1dGUgZmlsZW5hbWUgb2YgRklMRS4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dW5lZCBpbiAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorIyBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggZnVuY19kaXJuYW1lCisjIGFuZCBmdW5jX2Jhc2VuYW1lLiBGb3IgZWZmaWNpZW5jeSwgd2UgZG8gbm90IGRlbGVnYXRlIHRvCisjIHRob3NlIGZ1bmN0aW9ucyBidXQgaW5zdGVhZCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgaGVyZS4KK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkKK3sKKyAgY2FzZSAkezF9IGluCisgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7CisgIGVzYWMKKyAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IgorfQorCisjIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQorIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KKyMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCisjIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKKyMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KK2Z1bmNfc3RyaXBuYW1lICgpCit7CisgICMgcGRrc2ggNS4yLjE0IGRvZXMgbm90IGRvICR7WCUkWX0gY29ycmVjdGx5IGlmIGJvdGggWCBhbmQgWSBhcmUKKyAgIyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHNvIGFzc2lnbiBvbmUgdG8gb3JkaW5hcnkgcGFyYW1ldGVyIGZpcnN0LgorICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHszfQorICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQjIiR7MX0ifQorICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9JHtmdW5jX3N0cmlwbmFtZV9yZXN1bHQlIiR7Mn0ifQorfQorCisjIGZ1bmNfb3B0X3NwbGl0CitmdW5jX29wdF9zcGxpdCAoKQoreworICBmdW5jX29wdF9zcGxpdF9vcHQ9JHsxJSU9Kn0KKyAgZnVuY19vcHRfc3BsaXRfYXJnPSR7MSMqPX0KK30KKworIyBmdW5jX2xvMm8gb2JqZWN0CitmdW5jX2xvMm8gKCkKK3sKKyAgY2FzZSAkezF9IGluCisgICAgKi5sbykgZnVuY19sbzJvX3Jlc3VsdD0kezElLmxvfS4ke29iamV4dH0gOzsKKyAgICAqKSAgICBmdW5jX2xvMm9fcmVzdWx0PSR7MX0gOzsKKyAgZXNhYworfQorCisjIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQorZnVuY194Zm9ybSAoKQoreworICBmdW5jX3hmb3JtX3Jlc3VsdD0kezElLip9LmxvCit9CisKKyMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KK2Z1bmNfYXJpdGggKCkKK3sKKyAgZnVuY19hcml0aF9yZXN1bHQ9JCgoICRbKl0gKSkKK30KKworIyBmdW5jX2xlbiBzdHJpbmcKKyMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KK2Z1bmNfbGVuICgpCit7CisgIGZ1bmNfbGVuX3Jlc3VsdD0keyMxfQorfQorCitfTFRfRU9GCisgICAgOzsKKyAgKikgIyBCb3VybmUgY29tcGF0aWJsZSBmdW5jdGlvbnMuCisgICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKworIyBmdW5jX2Rpcm5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LCBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsCisjIG90aGVyd2lzZSBzZXQgcmVzdWx0IHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KK2Z1bmNfZGlybmFtZSAoKQoreworICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorICBmdW5jX2Rpcm5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRkaXJuYW1lImAKKyAgaWYgdGVzdCAiWCRmdW5jX2Rpcm5hbWVfcmVzdWx0IiA9ICJYJHsxfSI7IHRoZW4KKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IgorICBlbHNlCisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJGZ1bmNfZGlybmFtZV9yZXN1bHQkezJ9IgorICBmaQorfQorCisjIGZ1bmNfYmFzZW5hbWUgZmlsZQorZnVuY19iYXNlbmFtZSAoKQoreworICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkYmFzZW5hbWUiYAorfQorCitkbmwgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZQorZG5sIEEgcG9ydGFibGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBnZW5lcmFsLm00c2gKK2RubCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBpdCBoZXJlLgorCisjIGZ1bmNfc3RyaXBuYW1lIHByZWZpeCBzdWZmaXggbmFtZQorIyBzdHJpcCBQUkVGSVggYW5kIFNVRkZJWCBvZmYgb2YgTkFNRS4KKyMgUFJFRklYIGFuZCBTVUZGSVggbXVzdCBub3QgY29udGFpbiBnbG9iYmluZyBvciByZWdleCBzcGVjaWFsCisjIGNoYXJhY3RlcnMsIGhhc2hlcywgcGVyY2VudCBzaWducywgYnV0IFNVRkZJWCBtYXkgY29udGFpbiBhIGxlYWRpbmcKKyMgZG90IChpbiB3aGljaCBjYXNlIHRoYXQgbWF0Y2hlcyBvbmx5IGEgZG90KS4KKyMgZnVuY19zdHJpcF9zdWZmaXggcHJlZml4IG5hbWUKK2Z1bmNfc3RyaXBuYW1lICgpCit7CisgIGNhc2UgJHsyfSBpbgorICAgIC4qKSBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHszfSIgXAorICAgICAgICAgICB8ICRYc2VkIC1lICJzJV4kezF9JSUiIC1lICJzJVxcXFwkezJ9XCQlJSJgOzsKKyAgICAqKSAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiWCR7M30iIFwKKyAgICAgICAgICAgfCAkWHNlZCAtZSAicyVeJHsxfSUlIiAtZSAicyUkezJ9XCQlJSJgOzsKKyAgZXNhYworfQorCisjIHNlZCBzY3JpcHRzOgorbXlfc2VkX2xvbmdfb3B0PScxcy9eXCgtW1tePV1dKlwpPS4qL1wxLztxJworbXlfc2VkX2xvbmdfYXJnPScxcy9eLVtbXj1dXSo9Ly8nCisKKyMgZnVuY19vcHRfc3BsaXQKK2Z1bmNfb3B0X3NwbGl0ICgpCit7CisgIGZ1bmNfb3B0X3NwbGl0X29wdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkbXlfc2VkX2xvbmdfb3B0ImAKKyAgZnVuY19vcHRfc3BsaXRfYXJnPWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRteV9zZWRfbG9uZ19hcmciYAorfQorCisjIGZ1bmNfbG8ybyBvYmplY3QKK2Z1bmNfbG8ybyAoKQoreworICBmdW5jX2xvMm9fcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRsbzJvImAKK30KKworIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKK2Z1bmNfeGZvcm0gKCkKK3sKKyAgZnVuY194Zm9ybV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAncy9cLltbXi5dXSokLy5sby8nYAorfQorCisjIGZ1bmNfYXJpdGggYXJpdGhtZXRpYy10ZXJtLi4uCitmdW5jX2FyaXRoICgpCit7CisgIGZ1bmNfYXJpdGhfcmVzdWx0PWBleHByICIkW0BdImAKK30KKworIyBmdW5jX2xlbiBzdHJpbmcKKyMgU1RSSU5HIG1heSBub3Qgc3RhcnQgd2l0aCBhIGh5cGhlbi4KK2Z1bmNfbGVuICgpCit7CisgIGZ1bmNfbGVuX3Jlc3VsdD1gZXhwciAiJFsxXSIgOiAiLioiIDI+L2Rldi9udWxsIHx8IGVjaG8gJG1heF9jbWRfbGVuYAorfQorCitfTFRfRU9GCitlc2FjCisKK2Nhc2UgJGx0X3NoZWxsX2FwcGVuZCBpbgorICB5ZXMpCisgICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKworIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKKyMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgorZnVuY19hcHBlbmQgKCkKK3sKKyAgZXZhbCAiJFsxXSs9XCRbMl0iCit9CitfTFRfRU9GCisgICAgOzsKKyAgKikKKyAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorCisjIGZ1bmNfYXBwZW5kIHZhciB2YWx1ZQorIyBBcHBlbmQgVkFMVUUgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIuCitmdW5jX2FwcGVuZCAoKQoreworICBldmFsICIkWzFdPVwkJFsxXVwkWzJdIgorfQorCitfTFRfRU9GCisgICAgOzsKKyAgZXNhYworXSkKKworIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNiBsdG9wdGlvbnMubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworCisjIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAorW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisKKyMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQorIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQorIyBzYXZlZCBhcyBhIGZsYWcuCittNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCittNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCitdKQorCisKKyMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK200X2RlZmluZShbX0xUX0lGX09QVElPTl0sCitbbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKKworCisjIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCisjIGFyZSBzZXQuCittNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCitbbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisJICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKKwkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAorbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCitdKVtdZG5sCitdKQorCisKKyMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKKyMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKKyMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0CisjIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KK200X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAorWyMgU2V0IG9wdGlvbnMKK200X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAorICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCisKK200X2lmKFskMV0sW0xUX0lOSVRdLFsKKyAgZG5sCisgIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAorICBkbmwgc3BlY2lmaWVkOgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KKyAgXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCisgIF0pCisgIGRubAorICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgorICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgorICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAorICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAorICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCisgIF0pCitdKSMgX0xUX1NFVF9PUFRJT05TCisKKworCisjIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAorW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCisKKworIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAorXSkjIExUX09QVElPTl9ERUZJTkUKKworCisjIGRsb3BlbgorIyAtLS0tLS0KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCitdKQorCitBVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCisKKworIyB3aW4zMi1kbGwKKyMgLS0tLS0tLS0tCisjIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKK1tlbmFibGVfd2luMzJfZGxsPXllcworCitjYXNlICRob3N0IGluCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLWNlZ2NjKikKKyAgQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQorICA7OworZXNhYworCit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCitfTFRfREVDTChbXSwgW0FTXSwgICAgICBbMF0sIFtBc3NlbWJsZXIgcHJvZ3JhbV0pZG5sCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK19MVF9ERUNMKFtdLCBbRExMVE9PTF0sIFswXSwgW0RMTCBjcmVhdGlvbiBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzBdLCBbT2JqZWN0IGR1bXBlciBwcm9ncmFtXSlkbmwKK10pIyB3aW4zMi1kbGwKKworQVVfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFt3aW4zMi1kbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKK3B1dCB0aGUgYHdpbjMyLWRsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sIFtdKQorCisKKyMgX0xUX0VOQUJMRV9TSEFSRUQoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcsIGFuZCBzdXBwb3J0cyB0aGUgYHNoYXJlZCcgYW5kCisjIGBkaXNhYmxlLXNoYXJlZCcgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtzaGFyZWRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc2hhcmVkQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zaGFyZWQ9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3NoYXJlZD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9saWJ0b29sX2xpYnNdLCBbZW5hYmxlX3NoYXJlZF0sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TSEFSRUQKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU0hBUkVEXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3NoYXJlZF0pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc2hhcmVkXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgW0FDX0VOQUJMRV9TSEFSRUQoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9TVEFUSUMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgc3RhdGljJyBhbmQKKyMgYGRpc2FibGUtc3RhdGljJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3N0YXRpY10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zdGF0aWNAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zdGF0aWM9XV9MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFQpCisKKyAgICBfTFRfREVDTChbYnVpbGRfb2xkX2xpYnNdLCBbZW5hYmxlX3N0YXRpY10sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TVEFUSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU1RBVElDXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3N0YXRpY10pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc3RhdGljXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtBQ19ESVNBQkxFX1NUQVRJQygkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgZmFzdC1pbnN0YWxsJworIyBhbmQgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW2Zhc3QtaW5zdGFsbF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1mYXN0LWluc3RhbGxAPDpAPVBLR1NAOj5AXSwKKyAgICBbb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9mYXN0X2luc3RhbGw9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpCisKK19MVF9ERUNMKFtmYXN0X2luc3RhbGxdLCBbZW5hYmxlX2Zhc3RfaW5zdGFsbF0sIFswXSwKKwkgW1doZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbl0pZG5sCitdKSMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FVX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW2Zhc3QtaW5zdGFsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdSBwdXQKK3RoZSBgZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitBVV9ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBkaXNhYmxlLWZhc3QtaW5zdGFsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwgW10pCisKKworIyBfTFRfV0lUSF9QSUMoW01PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBwaWMtb25seScgYW5kIGBuby1waWMnCisjIExUX0lOSVQgb3B0aW9ucy4KKyMgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBib3RoJy4KK200X2RlZmluZShbX0xUX1dJVEhfUElDXSwKK1tBQ19BUkdfV0lUSChbcGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1waWNdLAorCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCisgICAgW3BpY19tb2RlPSIkd2l0aHZhbCJdLAorICAgIFtwaWNfbW9kZT1kZWZhdWx0XSkKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1tNF9kZWZhdWx0KFskMV0sIFtkZWZhdWx0XSkKKworX0xUX0RFQ0woW10sIFtwaWNfbW9kZV0sIFswXSwgW1doYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkXSlkbmwKK10pIyBfTFRfV0lUSF9QSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtwaWMtb25seV0sIFtfTFRfV0lUSF9QSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbbm8tcGljXSwgW19MVF9XSVRIX1BJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWU6CitBVV9ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtwaWMtb25seV0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgcGljLW9ubHknIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwgW10pCisKKworbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbbm9ucmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbbm9ucmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3JlY3Vyc2l2ZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3JlY3Vyc2l2ZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtzdWJwcm9qZWN0XSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbc3VicHJvamVjdF0pXSkKKworbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbaW5zdGFsbGFibGVdLAorCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtpbnN0YWxsYWJsZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtjb252ZW5pZW5jZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2NvbnZlbmllbmNlXSldKQorCisjIGx0c3VnYXIubTQgLS0gbGlidG9vbCBtNCBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAtKi1BdXRvY29uZi0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNiBsdHN1Z2FyLm00CisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRTVUdBUl9WRVJTSU9OXSwgW200X2lmKFswLjFdKV0pCisKKworIyBsdF9qb2luKFNFUCwgQVJHMSwgW0FSRzIuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIEFSRzFTRVBBUkcyLi4uU0VQQVJHbiwgb21pdHRpbmcgW10gYXJndW1lbnRzIGFuZCB0aGVpcgorIyBhc3NvY2lhdGVkIHNlcGFyYXRvci4KKyMgTmVlZGVkIHVudGlsIHdlIGNhbiByZWx5IG9uIG00X2pvaW4gZnJvbSBBdXRvY29uZiAyLjYyLCBzaW5jZSBhbGwgZWFybGllcgorIyB2ZXJzaW9ucyBpbiBtNHN1Z2FyIGhhZCBidWdzLgorbTRfZGVmaW5lKFtsdF9qb2luXSwKK1ttNF9pZihbJCNdLCBbMV0sIFtdLAorICAgICAgIFskI10sIFsyXSwgW1skMl1dLAorICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDJdX10pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCittNF9kZWZpbmUoW19sdF9qb2luXSwKK1ttNF9pZihbJCMkMl0sIFsyXSwgW10sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMSQyXV0pJDAoWyQxXSwgbTRfc2hpZnQobTRfc2hpZnQoJEApKSldKV0pCisKKworIyBsdF9jYXIoTElTVCkKKyMgbHRfY2RyKExJU1QpCisjIC0tLS0tLS0tLS0tLQorIyBNYW5pcHVsYXRlIG00IGxpc3RzLgorIyBUaGVzZSBtYWNyb3MgYXJlIG5lY2Vzc2FyeSBhcyBsb25nIGFzIHdpbGwgc3RpbGwgbmVlZCB0byBzdXBwb3J0CisjIEF1dG9jb25mLTIuNTkgd2hpY2ggcXVvdGVzIGRpZmZlcmVudGx5LgorbTRfZGVmaW5lKFtsdF9jYXJdLCBbWyQxXV0pCittNF9kZWZpbmUoW2x0X2Nkcl0sCitbbTRfaWYoWyQjXSwgMCwgW200X2ZhdGFsKFskMDogY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c10pXSwKKyAgICAgICBbJCNdLCAxLCBbXSwKKyAgICAgICBbbTRfZHF1b3RlKG00X3NoaWZ0KCRAKSldKV0pCittNF9kZWZpbmUoW2x0X3VucXVvdGVdLCAkMSkKKworCisjIGx0X2FwcGVuZChNQUNSTy1OQU1FLCBTVFJJTkcsIFtTRVBBUkFUT1JdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVkZWZpbmUgTUFDUk8tTkFNRSB0byBob2xkIGl0cyBmb3JtZXIgY29udGVudCBwbHVzIGBTRVBBUkFUT1InYFNUUklORycuCisjIE5vdGUgdGhhdCBuZWl0aGVyIFNFUEFSQVRPUiBub3IgU1RSSU5HIGFyZSBleHBhbmRlZDsgdGhleSBhcmUgYXBwZW5kZWQKKyMgdG8gTUFDUk8tTkFNRSBhcyBpcyAobGVhdmluZyB0aGUgZXhwYW5zaW9uIGZvciB3aGVuIE1BQ1JPLU5BTUUgaXMgaW52b2tlZCkuCisjIE5vIFNFUEFSQVRPUiBpcyBvdXRwdXQgaWYgTUFDUk8tTkFNRSB3YXMgcHJldmlvdXNseSB1bmRlZmluZWQgKGRpZmZlcmVudAorIyB0aGFuIGRlZmluZWQgYW5kIGVtcHR5KS4KKyMKKyMgVGhpcyBtYWNybyBpcyBuZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gQXV0b2NvbmYgMi42Miwgc2luY2UgZWFybGllcgorIyB2ZXJzaW9ucyBvZiBtNHN1Z2FyIG1pc3Rha2VubHkgZXhwYW5kZWQgU0VQQVJBVE9SIGJ1dCBub3QgU1RSSU5HLgorbTRfZGVmaW5lKFtsdF9hcHBlbmRdLAorW200X2RlZmluZShbJDFdLAorCSAgIG00X2lmZGVmKFskMV0sIFttNF9kZWZuKFskMV0pWyQzXV0pWyQyXSldKQorCisKKworIyBsdF9jb21iaW5lKFNFUCwgUFJFRklYLUxJU1QsIElORklYLCBTVUZGSVgxLCBbU1VGRklYMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBhIFNFUCBkZWxpbWl0ZWQgbGlzdCBvZiBhbGwgcGFpcmVkIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBvZgorIyBQUkVGSVgtTElTVCB3aXRoIFNVRkZJWDEgdGhyb3VnaCBTVUZGSVhuLiAgRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0CisjIGhhcyB0aGUgZm9ybSBQUkVGSVhtSU5GSVhTVUZGSVhuLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfY29tYmluZSBhZGRlZCBpbiBBdXRvY29uZiAyLjYyLgorbTRfZGVmaW5lKFtsdF9jb21iaW5lXSwKK1ttNF9pZihtNF9ldmFsKFskIyA+IDNdKSwgWzFdLAorICAgICAgIFttNF9wdXNoZGVmKFtfTHRfc2VwXSwgW200X2RlZmluZShbX0x0X3NlcF0sIG00X2RlZm4oW2x0X2Nhcl0pKV0pXV1kbmwKK1tbbTRfZm9yZWFjaChbX0x0X3ByZWZpeF0sIFskMl0sCisJICAgICBbbTRfZm9yZWFjaChbX0x0X3N1ZmZpeF0sCisJCV1tNF9kcXVvdGUobTRfZHF1b3RlKG00X3NoaWZ0KG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpKSlbLAorCVtfTHRfc2VwKFskMV0pW11tNF9kZWZuKFtfTHRfcHJlZml4XSlbJDNdbTRfZGVmbihbX0x0X3N1ZmZpeF0pXSldKV0pXSkKKworCisjIGx0X2lmX2FwcGVuZF91bmlxKE1BQ1JPLU5BTUUsIFZBUk5BTUUsIFtTRVBBUkFUT1JdLCBbVU5JUV0sIFtOT1QtVU5JUV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElmZiBNQUNSTy1OQU1FIGRvZXMgbm90IHlldCBjb250YWluIFZBUk5BTUUsIHRoZW4gYXBwZW5kIGl0IChkZWxpbWl0ZWQKKyMgYnkgU0VQQVJBVE9SIGlmIHN1cHBsaWVkKSBhbmQgZXhwYW5kIFVOSVEsIGVsc2UgTk9ULVVOSVEuCittNF9kZWZpbmUoW2x0X2lmX2FwcGVuZF91bmlxXSwKK1ttNF9pZmRlZihbJDFdLAorCSAgW200X2lmKG00X2luZGV4KFskM11tNF9kZWZuKFskMV0pWyQzXSwgWyQzJDIkM10pLCBbLTFdLAorCQkgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSwKKwkJIFskNV0pXSwKKwkgIFtsdF9hcHBlbmQoWyQxXSwgWyQyXSwgWyQzXSkkNF0pXSkKKworCisjIGx0X2RpY3RfYWRkKERJQ1QsIEtFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkXSwKK1ttNF9kZWZpbmUoWyQxKCQyKV0sIFskM10pXSkKKworCisjIGx0X2RpY3RfYWRkX3N1YmtleShESUNULCBLRVksIFNVQktFWSwgVkFMVUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RpY3RfYWRkX3N1YmtleV0sCitbbTRfZGVmaW5lKFskMSgkMjokMyldLCBbJDRdKV0pCisKKworIyBsdF9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9mZXRjaF0sCitbbTRfaWZ2YWwoWyQzXSwKKwltNF9pZmRlZihbJDEoJDI6JDMpXSwgW200X2RlZm4oWyQxKCQyOiQzKV0pXSksCisgICAgbTRfaWZkZWYoWyQxKCQyKV0sIFttNF9kZWZuKFskMSgkMildKV0pKV0pCisKKworIyBsdF9pZl9kaWN0X2ZldGNoKERJQ1QsIEtFWSwgW1NVQktFWV0sIFZBTFVFLCBJRi1UUlVFLCBbSUYtRkFMU0VdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9pZl9kaWN0X2ZldGNoXSwKK1ttNF9pZihsdF9kaWN0X2ZldGNoKFskMV0sIFskMl0sIFskM10pLCBbJDRdLAorCVskNV0sCisgICAgWyQ2XSldKQorCisKKyMgbHRfZGljdF9maWx0ZXIoRElDVCwgW1NVQktFWV0sIFZBTFVFLCBbU0VQQVJBVE9SXSwgS0VZLCBbLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9maWx0ZXJdLAorW200X2lmKFskNV0sIFtdLCBbXSwKKyAgW2x0X2pvaW4obTRfcXVvdGUobTRfZGVmYXVsdChbJDRdLCBbWywgXV0pKSwKKyAgICAgICAgICAgbHRfdW5xdW90ZShtNF9zcGxpdChtNF9ub3JtYWxpemUobTRfZm9yZWFjaChfTHRfa2V5LCBsdF9jYXIoW200X3NoaWZ0big0LCAkQCldKSwKKwkJICAgICAgW2x0X2lmX2RpY3RfZmV0Y2goWyQxXSwgX0x0X2tleSwgWyQyXSwgWyQzXSwgW19MdF9rZXkgXSldKSkpKSldKVtdZG5sCitdKQorCisjIGx0dmVyc2lvbi5tNCAtLSB2ZXJzaW9uIG51bWJlcnMJCQktKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNAorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgR2VuZXJhdGVkIGZyb20gbHR2ZXJzaW9uLmluLgorCisjIHNlcmlhbCAzMDEyIGx0dmVyc2lvbi5tNAorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbAorCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfVkVSU0lPTl0sIFsyLjIuNl0pCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfUkVWSVNJT05dLCBbMS4zMDEyXSkKKworQUNfREVGVU4oW0xUVkVSU0lPTl9WRVJTSU9OXSwKK1ttYWNyb192ZXJzaW9uPScyLjIuNicKK21hY3JvX3JldmlzaW9uPScxLjMwMTInCitfTFRfREVDTCgsIG1hY3JvX3ZlcnNpb24sIDAsIFtXaGljaCByZWxlYXNlIG9mIGxpYnRvb2wubTQgd2FzIHVzZWQ/XSkKK19MVF9ERUNMKCwgbWFjcm9fcmV2aXNpb24sIDApCitdKQorCisjIGx0fm9ic29sZXRlLm00IC0tIGFjbG9jYWwgc2F0aXNmeWluZyBvYnNvbGV0ZSBkZWZpbml0aW9ucy4gICAgLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0LgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQgbHR+b2Jzb2xldGUubTQKKworIyBUaGVzZSBleGlzdCBlbnRpcmVseSB0byBmb29sIGFjbG9jYWwgd2hlbiBib290c3RyYXBwaW5nIGxpYnRvb2wuCisjCisjIEluIHRoZSBwYXN0IGxpYnRvb2wubTQgaGFzIHByb3ZpZGVkIG1hY3JvcyB2aWEgQUNfREVGVU4gKG9yIEFVX0RFRlVOKQorIyB3aGljaCBoYXZlIGxhdGVyIGJlZW4gY2hhbmdlZCB0byBtNF9kZWZpbmUgYXMgdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUKKyMgZXhwb3J0ZWQgQVBJLCBvciBtb3ZlZCB0byBBdXRvY29uZiBvciBBdXRvbWFrZSB3aGVyZSB0aGV5IGJlbG9uZy4KKyMKKyMgVGhlIHRyb3VibGUgaXMsIGFjbG9jYWwgaXMgYSBiaXQgdGhpY2suICBJdCdsbCBzZWUgdGhlIG9sZCBBQ19ERUZVTgorIyBpbiAvdXNyL3NoYXJlL2FjbG9jYWwvbGlidG9vbC5tNCBhbmQgcmVtZW1iZXIgaXQsIHRoZW4gd2hlbiBpdCBzZWVzIHVzCisjIHVzaW5nIGEgbWFjcm8gd2l0aCB0aGUgc2FtZSBuYW1lIGluIG91ciBsb2NhbCBtNC9saWJ0b29sLm00IGl0J2xsCisjIHB1bGwgdGhlIG9sZCBsaWJ0b29sLm00IGluIChpdCBkb2Vzbid0IHNlZSBvdXIgc2hpbnkgbmV3IG00X2RlZmluZQorIyBhbmQgZG9lc24ndCBrbm93IGFib3V0IEF1dG9jb25mIG1hY3JvcyBhdCBhbGwuKQorIworIyBTbyB3ZSBwcm92aWRlIHRoaXMgZmlsZSwgd2hpY2ggaGFzIGEgc2lsbHkgZmlsZW5hbWUgc28gaXQncyBhbHdheXMKKyMgaW5jbHVkZWQgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBwcm92aWRlcyBhY2xvY2FsIHdpdGggdGhlCisjIEFDX0RFRlVOcyBpdCB3YW50cywgYnV0IHdoZW4gbTQgcHJvY2Vzc2VzIGl0LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nCisjIGJlY2F1c2UgdGhvc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QsIG9yIHdpbGwgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIuCisjIFdlIHVzZSBBQ19ERUZVTiBvdmVyIEFVX0RFRlVOIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWNsb2NhbC0xLjYuIAorIworIyBBbnl0aW1lIHdlIHdpdGhkcmF3IGFuIEFDX0RFRlVOIG9yIEFVX0RFRlVOLCByZW1lbWJlciB0byBhZGQgaXQgaGVyZS4KKyMgWWVzLCB0aGF0IG1lYW5zIGV2ZXJ5IG5hbWUgb25jZSB0YWtlbiB3aWxsIG5lZWQgdG8gcmVtYWluIGhlcmUgdW50aWwKKyMgd2UgZ2l2ZSB1cCBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgYmVmb3JlIDEuNywgYXQgd2hpY2ggcG9pbnQKKyMgd2UgbmVlZCB0byBrZWVwIG9ubHkgdGhvc2UgbmFtZXMgd2hpY2ggd2Ugc3RpbGwgcmVmZXIgdG8uCisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRPQlNPTEVURV9WRVJTSU9OXSwgW200X2lmKFsxXSldKQorCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbQUNfUFJPR19FR1JFUF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdLAlbQUNfREVGVU4oW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU0hFTExfSU5JVF0sCQlbQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19MVE1BSU5dLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19MVE1BSU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19UQUdWQVJdLAkJW0FDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX1BSRU9QRU5dLAkJW0FDX0RFRlVOKFtBQ19MVERMX1BSRU9QRU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19TWVNfQ09NUElMRVJdLAlbQUNfREVGVU4oW19MVF9BQ19TWVNfQ09NUElMRVJdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MT0NLXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xPQ0tdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX09MRF9BUkNISVZFXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCVtBQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xURExfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTFRETF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdKV0pCittNF9pZm5kZWYoW0FDX1BBVEhfTUFHSUNdLAkJW0FDX0RFRlVOKFtBQ19QQVRIX01BR0lDXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX0dOVV0sCQlbQUNfREVGVU4oW0FDX1BST0dfTERfR05VXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSldKQorbTRfaWZuZGVmKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0sCVtBQ19ERUZVTihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdKV0pCittNF9pZm5kZWYoW0xUX0FDX1BST0dfRUdSRVBdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX0VHUkVQXSldKQorbTRfaWZuZGVmKFtMVF9BQ19QUk9HX1NFRF0sCQlbQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSldKQorbTRfaWZuZGVmKFtfTFRfQ0NfQkFTRU5BTUVdLAkJW0FDX0RFRlVOKFtfTFRfQ0NfQkFTRU5BTUVdKV0pCittNF9pZm5kZWYoW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwJW0FDX0RFRlVOKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfQUNfUFJPR19MSUJUT09MXSwJCVtBQ19ERUZVTihbX0FDX1BST0dfTElCVE9PTF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TRVRVUF0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU0VUVVBdKV0pCittNF9pZm5kZWYoW19MVF9BQ19DSEVDS19ETEZDTl0sCQlbQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVEFHQ09ORklHXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAlbQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1JDXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9SQ10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfQ09ORklHXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19GSUxFX0xURExMX0NdLAlbQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KKyMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCisjIChUaGlzIHByaXZhdGUgbWFjcm8gc2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGlzIGZpbGUuKQorQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLAorW2FtX19hcGlfdmVyc2lvbj0nMS4xMScKK2RubCBTb21lIHVzZXJzIGZpbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgbWlzdGFrZSBpdCBmb3IgYSB3YXkgdG8KK2RubCByZXF1aXJlIHNvbWUgbWluaW11bSB2ZXJzaW9uLiAgUG9pbnQgdGhlbSB0byB0aGUgcmlnaHQgbWFjcm8uCittNF9pZihbJDFdLCBbMS4xMV0sIFtdLAorICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAorXSkKKworIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCisjIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCisjIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCittNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCisKKyMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCisjIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQU1fSU5JVF9BVVRPTUFLRS4KK0FDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKK1tBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjExXSlkbmwKK200X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCisgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKK19BTV9BVVRPQ09ORl9WRVJTSU9OKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSldKQorCisjIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEZvciBwcm9qZWN0cyB1c2luZyBBQ19DT05GSUdfQVVYX0RJUihbZm9vXSksIEF1dG9jb25mIHNldHMKKyMgJGFjX2F1eF9kaXIgdG8gYCRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KKyMgYCRzcmNkaXInLCBgJHNyY2Rpci8uLicsIG9yIGAkc3JjZGlyLy4uLy4uJy4KKyMKKyMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQorIyB0b29sIGZyb20gdGhlIGF1eGlsaWFyeSBkaXJlY3RvcnkuICBUaGUgcHJvYmxlbSBpcyB0aGF0ICRzcmNkaXIgKGFuZAorIyB0aGVyZWZvcmUgJGFjX2F1eF9kaXIgYXMgd2VsbCkgY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKKyMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCisjIGl0IG1ha2VzICRhY19hdXhfZGlyIHF1aXRlIHVudXNhYmxlIGluIHN1YmRpcmVjdG9yaWVzOiBpbiB0aGUgdG9wCisjIHNvdXJjZSBkaXJlY3RvcnksIGFueSBmb3JtIHdpbGwgd29yayBmaW5lLCBidXQgaW4gc3ViZGlyZWN0b3JpZXMgYQorIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgorIworIyAkYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKKyMgJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZworIyAgICBmYWlscyBpZiAkYWNfYXV4X2RpciBpcyBhYnNvbHV0ZSwKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKKyMgICAgICAgICAgYSByZWxhdGl2ZSAkYWNfYXV4X2RpcgorIworIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgorIyBhcmUgYm90aCBwcmVmaXhlZCBieSAkc3JjZGlyLiAgSW4gYW4gaW4tc291cmNlIGJ1aWxkIHRoaXMgaXMgdXN1YWxseQorIyBoYXJtbGVzcyBiZWNhdXNlICRzcmNkaXIgaXMgYC4nLCBidXQgdGhpbmdzIHdpbGwgYnJva2Ugd2hlbiB5b3UKKyMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KKyMKKyMgU28gd2UgY291bGQgdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcsCisjIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgorIyAgIGFtX2F1eF9kaXI9J1wkKHRvcF9zcmNkaXIpLydgZXhwciAiJGFjX2F1eF9kaXIiIDogIiRzcmNkaXIvLypcKC4qXCkiYAorIyBhbmQgdGhlbiB3ZSB3b3VsZCBkZWZpbmUgJE1JU1NJTkcgYXMKKyMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBNSVNTSU5HIGlzIG5vdCBjYWxsZWQgZnJvbSBjb25maWd1cmUsIGJlY2F1c2UKKyMgdW5mb3J0dW5hdGVseSAkKHRvcF9zcmNkaXIpIGhhcyBubyBtZWFuaW5nIGluIGNvbmZpZ3VyZS4KKyMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgorIyBjb25maWd1cmUsIGFuZCBjb3VsZCB0aGVyZWZvcmUgbm90IHVzZSB0aGlzICJmaXhlZCIgJGFjX2F1eF9kaXIuCisjCisjIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgorIyBhYnNvbHV0ZSBQQVRILiAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcHJldmVudCBhCisjIGNvbmZpZ3VyZWQgdHJlZSB0byBiZSBtb3ZlZCB3aXRob3V0IHJlY29uZmlndXJhdGlvbi4KKworQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwKK1tkbmwgUmVseSBvbiBhdXRvY29uZiB0byBzZXQgdXAgQ0RQQVRIIHByb3Blcmx5LgorQUNfUFJFUkVRKFsyLjUwXSlkbmwKKyMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKK2FtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKK10pCisKKyMgQU1fQ09ORElUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgOQorCisjIEFNX0NPTkRJVElPTkFMKE5BTUUsIFNIRUxMLUNPTkRJVElPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KK0FDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sCitbQUNfUFJFUkVRKDIuNTIpZG5sCisgaWZlbHNlKFskMV0sIFtUUlVFXSwgIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSwKKwlbJDFdLCBbRkFMU0VdLCBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0pZG5sCitBQ19TVUJTVChbJDFfVFJVRV0pZG5sCitBQ19TVUJTVChbJDFfRkFMU0VdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoWyQxX1RSVUVdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoWyQxX0ZBTFNFXSlkbmwKK200X2RlZmluZShbX0FNX0NPTkRfVkFMVUVfJDFdLCBbJDJdKWRubAoraWYgJDI7IHRoZW4KKyAgJDFfVFJVRT0KKyAgJDFfRkFMU0U9JyMnCitlbHNlCisgICQxX1RSVUU9JyMnCisgICQxX0ZBTFNFPQorZmkKK0FDX0NPTkZJR19DT01NQU5EU19QUkUoCitbaWYgdGVzdCAteiAiJHskMV9UUlVFfSIgJiYgdGVzdCAteiAiJHskMV9GQUxTRX0iOyB0aGVuCisgIEFDX01TR19FUlJPUihbW2NvbmRpdGlvbmFsICIkMSIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS5dXSkKK2ZpXSldKQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxMAorCisjIFRoZXJlIGFyZSBhIGZldyBkaXJ0eSBoYWNrcyBiZWxvdyB0byBhdm9pZCBsZXR0aW5nIGBBQ19QUk9HX0NDJyBiZQorIyB3cml0dGVuIGluIGNsZWFyLCBpbiB3aGljaCBjYXNlIGF1dG9tYWtlLCB3aGVuIHJlYWRpbmcgYWNsb2NhbC5tNCwKKyMgd2lsbCB0aGluayBpdCBzZWVzIGEgKnVzZSosIGFuZCB0aGVyZWZvcmUgd2lsbCB0cmlnZ2VyIGFsbCBpdCdzCisjIEMgc3VwcG9ydCBtYWNoaW5lcnkuICBBbHNvIG5vdGUgdGhhdCBpdCBtZWFucyB0aGF0IGF1dG9zY2FuLCBzZWVpbmcKKyMgQ0MgZXRjLiBpbiB0aGUgTWFrZWZpbGUsIHdpbGwgYXNrIGZvciBhbiBBQ19QUk9HX0NDIHVzZS4uLgorCisKKyMgX0FNX0RFUEVOREVOQ0lFUyhOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBob3cgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgZGVwZW5kZW5jeSBjaGVja2luZy4KKyMgTkFNRSBpcyAiQ0MiLCAiQ1hYIiwgIkdDSiIsIG9yICJPQkpDIi4KKyMgV2UgdHJ5IGEgZmV3IHRlY2huaXF1ZXMgYW5kIHVzZSB0aGF0IHRvIHNldCBhIHNpbmdsZSBjYWNoZSB2YXJpYWJsZS4KKyMKKyMgV2UgZG9uJ3QgQUNfUkVRVUlSRSB0aGUgY29ycmVzcG9uZGluZyBBQ19QUk9HX0NDIHNpbmNlIHRoZSBsYXR0ZXIgd2FzCisjIG1vZGlmaWVkIHRvIGludm9rZSBfQU1fREVQRU5ERU5DSUVTKENDKTsgd2Ugd291bGQgaGF2ZSBhIGNpcmN1bGFyCisjIGRlcGVuZGVuY3ksIGFuZCBnaXZlbiB0aGF0IHRoZSB1c2VyIGlzIG5vdCBleHBlY3RlZCB0byBydW4gdGhpcyBtYWNybywKKyMganVzdCByZWx5IG9uIEFDX1BST0dfQ0MuCitBQ19ERUZVTihbX0FNX0RFUEVOREVOQ0lFU10sCitbQUNfUkVRVUlSRShbQU1fU0VUX0RFUERJUl0pZG5sCitBQ19SRVFVSVJFKFtBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10pZG5sCitBQ19SRVFVSVJFKFtBTV9NQUtFX0lOQ0xVREVdKWRubAorQUNfUkVRVUlSRShbQU1fREVQX1RSQUNLXSlkbmwKKworaWZlbHNlKFskMV0sIENDLCAgIFtkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBDWFgsICBbZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgT0JKQywgW2RlcGNjPSIkT0JKQyIgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKKyAgICAgICBbJDFdLCBVUEMsICBbZGVwY2M9IiRVUEMiICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKKyAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCisgICAgICAgICAgICAgICBbYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdLAorW2lmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCcuCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAorICBmaQorICBhbV9fdW5pdmVyc2FsPWZhbHNlCisgIG00X2Nhc2UoWyQxXSwgW0NDXSwKKyAgICBbY2FzZSAiICRkZXBjYyAiIGluICMoCisgICAgICpcIC1hcmNoXCAqXCAtYXJjaFwgKikgYW1fX3VuaXZlcnNhbD10cnVlIDs7CisgICAgIGVzYWNdLAorICAgIFtDWFhdLAorICAgIFtjYXNlICIgJGRlcGNjICIgaW4gIygKKyAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKKyAgICAgZXNhY10pCisKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4gIEFsc28sIHNvbWUgSW50ZWwKKyAgICAjIHZlcnNpb25zIGhhZCB0cm91YmxlIHdpdGggb3V0cHV0IGluIHN1YmRpcnMKKyAgICBhbV9fb2JqPXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfQorICAgIGFtX19taW51c19vYmo9Ii1vICRhbV9fb2JqIgorICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBnY2MpCisgICAgICAjIFRoaXMgZGVwbW9kZSBjYXVzZXMgYSBjb21waWxlciByYWNlIGluIHVuaXZlcnNhbCBtb2RlLgorICAgICAgdGVzdCAiJGFtX191bml2ZXJzYWwiID0gZmFsc2UgfHwgY29udGludWUKKyAgICAgIDs7CisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBtc3Zpc3VhbGNwcCB8IG1zdmNtc3lzKQorICAgICAgIyBUaGlzIGNvbXBpbGVyIHdvbid0IGdyb2sgYC1jIC1vJywgYnV0IGFsc28sIHRoZSBtaW51c28gdGVzdCBoYXMKKyAgICAgICMgbm90IHJ1biB5ZXQuICBUaGVzZSBkZXBtb2RlcyBhcmUgbGF0ZSBlbm91Z2ggaW4gdGhlIGdhbWUsIGFuZAorICAgICAgIyBzbyB3ZWFrIHRoYXQgdGhlaXIgZnVuY3Rpb25pbmcgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KKyAgICAgIGFtX19vYmo9Y29uZnRlc3QuJHtPQkpFWFQtb30KKyAgICAgIGFtX19taW51c19vYmo9CisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9JGFtX19vYmogXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgJGFtX19taW51c19vYmogc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3QxLmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCAkYW1fX29iaiBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorXSkKK0FDX1NVQlNUKFskMURFUE1PREVdLCBbZGVwbW9kZT0kYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQorQU1fQ09ORElUSU9OQUwoW2FtX19mYXN0ZGVwJDFdLCBbCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKK10pCisKKworIyBBTV9TRVRfREVQRElSCisjIC0tLS0tLS0tLS0tLS0KKyMgQ2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgZm9yIGRlcGVuZGVuY3kgZmlsZXMuCisjIFRoaXMgbWFjcm8gaXMgQUNfUkVRVUlSRWQgaW4gX0FNX0RFUEVOREVOQ0lFUworQUNfREVGVU4oW0FNX1NFVF9ERVBESVJdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCitBQ19TVUJTVChbREVQRElSXSwgWyIke2FtX19sZWFkaW5nX2RvdH1kZXBzIl0pZG5sCitdKQorCisKKyMgQU1fREVQX1RSQUNLCisjIC0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX0RFUF9UUkFDS10sCitbQUNfQVJHX0VOQUJMRShkZXBlbmRlbmN5LXRyYWNraW5nLAorWyAgLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgIHNwZWVkcyB1cCBvbmUtdGltZSBidWlsZAorICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICAgZG8gbm90IHJlamVjdCBzbG93IGRlcGVuZGVuY3kgZXh0cmFjdG9yc10pCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgYW1fZGVwY29tcD0iJGFjX2F1eF9kaXIvZGVwY29tcCIKKyAgQU1ERVBCQUNLU0xBU0g9J1wnCitmaQorQU1fQ09ORElUSU9OQUwoW0FNREVQXSwgW3Rlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhub10pCitBQ19TVUJTVChbQU1ERVBCQUNLU0xBU0hdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW0FNREVQQkFDS1NMQVNIXSlkbmwKK10pCisKKyMgR2VuZXJhdGUgY29kZSB0byBzZXQgdXAgZGVwZW5kZW5jeSB0cmFja2luZy4gICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworI3NlcmlhbCA1CisKKyMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCitbeworICAjIEF1dG9jb25mIDIuNjIgcXVvdGVzIC0tZmlsZSBhcmd1bWVudHMgZm9yIGV2YWwsIGJ1dCBub3Qgd2hlbiBmaWxlcworICAjIGFyZSBsaXN0ZWQgd2l0aG91dCAtLWZpbGUuICBMZXQncyBwbGF5IHNhZmUgYW5kIG9ubHkgZW5hYmxlIHRoZSBldmFsCisgICMgaWYgd2UgZGV0ZWN0IHRoZSBxdW90aW5nLgorICBjYXNlICRDT05GSUdfRklMRVMgaW4KKyAgKlwnKikgZXZhbCBzZXQgeCAiJENPTkZJR19GSUxFUyIgOzsKKyAgKikgICBzZXQgeCAkQ09ORklHX0ZJTEVTIDs7CisgIGVzYWMKKyAgc2hpZnQKKyAgZm9yIG1mCisgIGRvCisgICAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAorICAgICMgQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIEF1dG9tYWtlIGdlbmVyYXRlZCBNYWtlZmlsZSBvciBub3QuCisgICAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAgICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgorICAgICMgR3JlcCdpbmcgdGhlIGZpcnN0IGxpbmUgaXMgbm90IGVub3VnaDogc29tZSBwZW9wbGUgcG9zdC1wcm9jZXNzCisgICAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgICAjIEdyZXAnaW5nIHRoZSB3aG9sZSBmaWxlIGlzIG5vdCBnb29kIGVpdGhlcjogQUlYIGdyZXAgaGFzIGEgbGluZQorICAgICMgbGltaXQgb2YgMjA0OCwgYnV0IGFsbCBzZWQncyB3ZSBrbm93IGhhdmUgdW5kZXJzdGFuZCBhdCBsZWFzdCA0MDAwLgorICAgIGlmIHNlZCAtbiAncyxeIy4qZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlLiosWCxwJyAiJG1mIiB8IGdyZXAgWCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIGRpcnBhcnQ9YEFTX0RJUk5BTUUoIiRtZiIpYAorICAgIGVsc2UKKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAorICAgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgICAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgICAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICAgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKKyAgICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgICAjIGV4cGFuc2lvbi4KKyAgICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorCSBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICAgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCisgICAgICBBU19NS0RJUl9QKFskZGlycGFydC8kZmRpcl0pCisgICAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgICAgZG9uZQorICBkb25lCit9CitdKSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisKKworIyBBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZSAtLSB1c2UgdmlhIEFDX1JFUVVJUkUuCisjCisjIFRoaXMgY29kZSBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gYXV0b21hdGljIGRlcGVuZGVuY3kgdHJhY2tpbmcKKyMgaXMgZW5hYmxlZC4gIEZJWE1FLiAgVGhpcyBjcmVhdGVzIGVhY2ggYC5QJyBmaWxlIHRoYXQgd2Ugd2lsbAorIyBuZWVkIGluIG9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgZGVwZW5kZW5jeSBoYW5kbGluZyBjb2RlLgorQUNfREVGVU4oW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1tBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKKyAgICAgW3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCisgICAgIFtBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiXSkKK10pCisKKyMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCisjIDIwMDUsIDIwMDYsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMTYKKworIyBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2guICBTb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYKKyMgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuICBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KKworIyBBTV9JTklUX0FVVE9NQUtFKFBBQ0tBR0UsIFZFUlNJT04sIFtOTy1ERUZJTkVdKQorIyBBTV9JTklUX0FVVE9NQUtFKFtPUFRJT05TXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGNhbGwgd2l0aCBQQUNLQUdFIGFuZCBWRVJTSU9OIGFyZ3VtZW50cyBpcyB0aGUgb2xkIHN0eWxlCisjIGNhbGwgKHByZSBhdXRvY29uZi0yLjUwKSwgd2hpY2ggaXMgYmVpbmcgcGhhc2VkIG91dC4gIFBBQ0tBR0UKKyMgYW5kIFZFUlNJT04gc2hvdWxkIG5vdyBiZSBwYXNzZWQgdG8gQUNfSU5JVCBhbmQgcmVtb3ZlZCBmcm9tCisjIHRoZSBjYWxsIHRvIEFNX0lOSVRfQVVUT01BS0UuCisjIFdlIHN1cHBvcnQgYm90aCBjYWxsIHN0eWxlcyBmb3IgdGhlIHRyYW5zaXRpb24uICBBZnRlcgorIyB0aGUgbmV4dCBBdXRvbWFrZSByZWxlYXNlLCBBdXRvY29uZiBjYW4gbWFrZSB0aGUgQUNfSU5JVAorIyBhcmd1bWVudHMgbWFuZGF0b3J5LCBhbmQgdGhlbiB3ZSBjYW4gZGVwZW5kIG9uIGEgbmV3IEF1dG9jb25mCisjIHJlbGVhc2UgYW5kIGRyb3AgdGhlIG9sZCBjYWxsIHN1cHBvcnQuCitBQ19ERUZVTihbQU1fSU5JVF9BVVRPTUFLRV0sCitbQUNfUFJFUkVRKFsyLjYyXSlkbmwKK2RubCBBdXRvY29uZiB3YW50cyB0byBkaXNhbGxvdyBBTV8gbmFtZXMuICBXZSBleHBsaWNpdGx5IGFsbG93CitkbmwgdGhlIG9uZXMgd2UgY2FyZSBhYm91dC4KK200X3BhdHRlcm5fYWxsb3coW15BTV9bQS1aXStGTEFHUyRdKWRubAorQUNfUkVRVUlSRShbQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAoraWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIjsgdGhlbgorICAjIFVzZSAtSSQoc3JjZGlyKSBvbmx5IHdoZW4gJChzcmNkaXIpICE9IC4sIHNvIHRoYXQgbWFrZSdzIG91dHB1dAorICAjIGlzIG5vdCBwb2xsdXRlZCB3aXRoIHJlcGVhdGVkICItSS4iCisgIEFDX1NVQlNUKFthbV9faXNyY10sIFsnIC1JJChzcmNkaXIpJ10pX0FNX1NVQlNUX05PVE1BS0UoW2FtX19pc3JjXSlkbmwKKyAgIyB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCisgIGlmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQorICBmaQorZmkKKworIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCitpZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgorICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCisgIGVsc2UKKyAgICBDWUdQQVRIX1c9ZWNobworICBmaQorZmkKK0FDX1NVQlNUKFtDWUdQQVRIX1ddKQorCisjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCitkbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KK200X2lmdmFsKFskMl0sCitbbTRfaWZ2YWwoWyQzXSwgW19BTV9TRVRfT1BUSU9OKFtuby1kZWZpbmVdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWyQyXSldLAorW19BTV9TRVRfT1BUSU9OUyhbJDFdKWRubAorZG5sIERpYWdub3NlIG9sZC1zdHlsZSBBQ19JTklUIHdpdGggbmV3LXN0eWxlIEFNX0FVVE9NQUtFX0lOSVQuCittNF9pZihtNF9pZmRlZihbQUNfUEFDS0FHRV9OQU1FXSwgMSltNF9pZmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwgMSksIDExLCwKKyAgW200X2ZhdGFsKFtBQ19JTklUIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBwYWNrYWdlIGFuZCB2ZXJzaW9uIGFyZ3VtZW50c10pXSlkbmwKKyBBQ19TVUJTVChbUEFDS0FHRV0sIFsnQUNfUEFDS0FHRV9UQVJOQU1FJ10pZG5sCisgQUNfU1VCU1QoW1ZFUlNJT05dLCBbJ0FDX1BBQ0tBR0VfVkVSU0lPTiddKV0pZG5sCisKK19BTV9JRl9PUFRJT04oW25vLWRlZmluZV0sLAorW0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKKyBBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCisKKyMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KK0FDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCitBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCitBTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0pCitBTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mKQorQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0pCitBTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlcikKK0FNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8pCitBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU0hdKWRubAorQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NUUklQXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1BST0dfTUtESVJfUF0pZG5sCisjIFdlIG5lZWQgYXdrIGZvciB0aGUgImNoZWNrIiB0YXJnZXQuICBUaGUgc3lzdGVtICJhd2siIGlzIGJhZCBvbgorIyBzb21lIHBsYXRmb3Jtcy4KK0FDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAorQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK19BTV9JRl9PUFRJT04oW3Rhci11c3Rhcl0sIFtfQU1fUFJPR19UQVIoW3VzdGFyXSldLAorCSAgICAgIFtfQU1fSUZfT1BUSU9OKFt0YXItcGF4XSwgW19BTV9QUk9HX1RBUihbcGF4XSldLAorCQkJICAgICBbX0FNX1BST0dfVEFSKFt2N10pXSldKQorX0FNX0lGX09QVElPTihbbm8tZGVwZW5kZW5jaWVzXSwsCitbQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ0NdLAorCQkgIFtfQU1fREVQRU5ERU5DSUVTKENDKV0sCisJCSAgW2RlZmluZShbQUNfUFJPR19DQ10sCisJCQkgIGRlZm4oW0FDX1BST0dfQ0NdKVtfQU1fREVQRU5ERU5DSUVTKENDKV0pXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0sCisJCSAgW2RlZmluZShbQUNfUFJPR19DWFhdLAorCQkJICBkZWZuKFtBQ19QUk9HX0NYWF0pW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0pXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX09CSkNdLAorCQkgIFtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX09CSkNdLAorCQkJICBkZWZuKFtBQ19QUk9HX09CSkNdKVtfQU1fREVQRU5ERU5DSUVTKE9CSkMpXSldKWRubAorXSkKK19BTV9JRl9PUFRJT04oW3NpbGVudC1ydWxlc10sIFtBQ19SRVFVSVJFKFtBTV9TSUxFTlRfUlVMRVNdKV0pZG5sCitkbmwgVGhlIGBwYXJhbGxlbC10ZXN0cycgZHJpdmVyIG1heSBuZWVkIHRvIGtub3cgYWJvdXQgRVhFRVhULCBzbyBhZGQgdGhlCitkbmwgYGFtX19FWEVFWFQnIGNvbmRpdGlvbmFsIGlmIF9BTV9DT01QSUxFUl9FWEVFWFQgd2FzIHNlZW4uICBUaGlzIG1hY3JvCitkbmwgaXMgaG9va2VkIG9udG8gX0FDX0NPTVBJTEVSX0VYRUVYVCBlYXJseSwgc2VlIGJlbG93LgorQUNfQ09ORklHX0NPTU1BTkRTX1BSRShkbmwKK1ttNF9wcm92aWRlX2lmKFtfQU1fQ09NUElMRVJfRVhFRVhUXSwKKyAgW0FNX0NPTkRJVElPTkFMKFthbV9fRVhFRVhUXSwgW3Rlc3QgLW4gIiRFWEVFWFQiXSldKV0pZG5sCitdKQorCitkbmwgSG9vayBpbnRvIGBfQUNfQ09NUElMRVJfRVhFRVhUJyBlYXJseSB0byBsZWFybiBpdHMgZXhwYW5zaW9uLiAgRG8gbm90CitkbmwgYWRkIHRoZSBjb25kaXRpb25hbCByaWdodCBoZXJlLCBhcyBfQUNfQ09NUElMRVJfRVhFRVhUIG1heSBiZSBmdXJ0aGVyCitkbmwgbWFuZ2xlZCBieSBBdXRvY29uZiBhbmQgcnVuIGluIGEgc2hlbGwgY29uZGl0aW9uYWwgc3RhdGVtZW50LgorbTRfZGVmaW5lKFtfQUNfQ09NUElMRVJfRVhFRVhUXSwKK200X2RlZm4oW19BQ19DT01QSUxFUl9FWEVFWFRdKVttNF9wcm92aWRlKFtfQU1fQ09NUElMRVJfRVhFRVhUXSldKQorCisKKyMgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KKyMgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCisjIHRoYXQgaXMgZ2VuZXJhdGVkLiAgVGhlIHN0YW1wIGZpbGVzIGFyZSBudW1iZXJlZCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcy4KKworIyBBdXRvY29uZiBjYWxscyBfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LICh3aGVuIGRlZmluZWQpIGluIHRoZQorIyBsb29wIHdoZXJlIGNvbmZpZy5zdGF0dXMgY3JlYXRlcyB0aGUgaGVhZGVycywgc28gd2UgY2FuIGdlbmVyYXRlCisjIG91ciBzdGFtcCBmaWxlcyB0aGVyZS4KK0FDX0RFRlVOKFtfQUNfQU1fQ09ORklHX0hFQURFUl9IT09LXSwKK1sjIENvbXB1dGUgJDEncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCitfYW1fYXJnPSQxCitfYW1fc3RhbXBfY291bnQ9MQorZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCisgIGNhc2UgJF9hbV9oZWFkZXIgaW4KKyAgICAkX2FtX2FyZyB8ICRfYW1fYXJnOiogKQorICAgICAgYnJlYWsgOzsKKyAgICAqICkKKyAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKKyAgZXNhYworZG9uZQorZWNobyAidGltZXN0YW1wIGZvciAkX2FtX2FyZyIgPmBBU19ESVJOQU1FKFsiJF9hbV9hcmciXSlgL3N0YW1wLWhbXSRfYW1fc3RhbXBfY291bnRdKQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX0lOU1RBTExfU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSAkaW5zdGFsbF9zaC4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK2lmIHRlc3QgeCIke2luc3RhbGxfc2h9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgaW5zdGFsbF9zaD0iXCR7U0hFTEx9ICckYW1fYXV4X2Rpci9pbnN0YWxsLXNoJyIgOzsKKyAgKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCIKKyAgZXNhYworZmkKK0FDX1NVQlNUKGluc3RhbGxfc2gpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcworIyB3aXRoIGEgbGVhZGluZyBkb3QuICBGb3IgaW5zdGFuY2UgTVMtRE9TIGRvZXNuJ3QuCitBQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwKK1tybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKKworIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIyBGcm9tIEppbSBNZXllcmluZworCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA1CisKKyMgQU1fTUFJTlRBSU5FUl9NT0RFKFtERUZBVUxULU1PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbnRyb2wgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMuCisjIERlZmF1bHQgaXMgdG8gZGlzYWJsZSB0aGVtLCB1bmxlc3MgYGVuYWJsZScgaXMgcGFzc2VkIGxpdGVyYWxseS4KKyMgRm9yIHN5bW1ldHJ5LCBgZGlzYWJsZScgbWF5IGJlIHBhc3NlZCBhcyB3ZWxsLiAgQW55d2F5LCB0aGUgdXNlcgorIyBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgd2l0aCB0aGUgLS1lbmFibGUvLS1kaXNhYmxlIHN3aXRjaC4KK0FDX0RFRlVOKFtBTV9NQUlOVEFJTkVSX01PREVdLAorW200X2Nhc2UobTRfZGVmYXVsdChbJDFdLCBbZGlzYWJsZV0pLAorICAgICAgIFtlbmFibGVdLCBbbTRfZGVmaW5lKFthbV9tYWludGFpbmVyX290aGVyXSwgW2Rpc2FibGVdKV0sCisgICAgICAgW2Rpc2FibGVdLCBbbTRfZGVmaW5lKFthbV9tYWludGFpbmVyX290aGVyXSwgW2VuYWJsZV0pXSwKKyAgICAgICBbbTRfZGVmaW5lKFthbV9tYWludGFpbmVyX290aGVyXSwgW2VuYWJsZV0pCisgICAgICAgIG00X3dhcm4oW3N5bnRheF0sIFt1bmV4cGVjdGVkIGFyZ3VtZW50IHRvIEFNQCZ0QF9NQUlOVEFJTkVSX01PREU6ICQxXSldKQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGFtX21haW50YWluZXJfb3RoZXIgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQorICBkbmwgbWFpbnRhaW5lci1tb2RlJ3MgZGVmYXVsdCBpcyAnZGlzYWJsZScgdW5sZXNzICdlbmFibGUnIGlzIHBhc3NlZAorICBBQ19BUkdfRU5BQkxFKFttYWludGFpbmVyLW1vZGVdLAorWyAgLS1dW2FtX21haW50YWluZXJfb3RoZXJdWy1tYWludGFpbmVyLW1vZGUgIGFtX21haW50YWluZXJfb3RoZXIgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKwkJCSAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCisgICAgICBbVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsXSwKKyAgICAgIFtVU0VfTUFJTlRBSU5FUl9NT0RFPV1tNF9pZihhbV9tYWludGFpbmVyX290aGVyLCBbZW5hYmxlXSwgW25vXSwgW3llc10pKQorICBBQ19NU0dfUkVTVUxUKFskVVNFX01BSU5UQUlORVJfTU9ERV0pCisgIEFNX0NPTkRJVElPTkFMKFtNQUlOVEFJTkVSX01PREVdLCBbdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllc10pCisgIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQorICBBQ19TVUJTVChbTUFJTlRdKWRubAorXQorKQorCitBVV9ERUZVTihbam1fTUFJTlRBSU5FUl9NT0RFXSwgW0FNX01BSU5UQUlORVJfTU9ERV0pCisKKyMgQ2hlY2sgdG8gc2VlIGhvdyAnbWFrZScgdHJlYXRzIGluY2x1ZGVzLgkgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA1LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0CisKKyMgQU1fTUFLRV9JTkNMVURFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGhvdyBtYWtlIHRyZWF0cyBpbmNsdWRlcy4KK0FDX0RFRlVOKFtBTV9NQUtFX0lOQ0xVREVdLAorW2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCithbV9fZG9pdDoKKwlAZWNobyB0aGlzIGlzIHRoZSBhbV9fZG9pdCB0YXJnZXQKKy5QSE9OWTogYW1fX2RvaXQKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgorQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKK2FtX19pbmNsdWRlPSIjIgorYW1fX3F1b3RlPQorX2FtX3Jlc3VsdD1ub25lCisjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgorZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgorIyBJZ25vcmUgYWxsIGtpbmRzIG9mIGFkZGl0aW9uYWwgb3V0cHV0IGZyb20gYG1ha2UnLgorY2FzZSBgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAgaW4gIygKKyp0aGVcIGFtX19kb2l0XCB0YXJnZXQqKQorICBhbV9faW5jbHVkZT1pbmNsdWRlCisgIGFtX19xdW90ZT0KKyAgX2FtX3Jlc3VsdD1HTlUKKyAgOzsKK2VzYWMKKyMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgoraWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgorICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgorICAgY2FzZSBgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAgaW4gIygKKyAgICp0aGVcIGFtX19kb2l0XCB0YXJnZXQqKQorICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQorICAgICBhbV9fcXVvdGU9IlwiIgorICAgICBfYW1fcmVzdWx0PUJTRAorICAgICA7OworICAgZXNhYworZmkKK0FDX1NVQlNUKFthbV9faW5jbHVkZV0pCitBQ19TVUJTVChbYW1fX3F1b3RlXSkKK0FDX01TR19SRVNVTFQoWyRfYW1fcmVzdWx0XSkKK3JtIC1mIGNvbmZpbmMgY29uZm1mCitdKQorCisjIEZha2UgdGhlIGV4aXN0ZW5jZSBvZiBwcm9ncmFtcyB0aGF0IEdOVSBtYWludGFpbmVycyB1c2UuICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDYKKworIyBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fTUlTU0lOR19QUk9HXSwKK1tBQ19SRVFVSVJFKFtBTV9NSVNTSU5HX0hBU19SVU5dKQorJDE9JHskMS0iJHthbV9taXNzaW5nX3J1bn0kMiJ9CitBQ19TVUJTVCgkMSldKQorCisKKyMgQU1fTUlTU0lOR19IQVNfUlVOCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgTUlTU0lORyBpZiBub3QgZGVmaW5lZCBzbyBmYXIgYW5kIHRlc3QgaWYgaXQgc3VwcG9ydHMgLS1ydW4uCisjIElmIGl0IGRvZXMsIHNldCBhbV9taXNzaW5nX3J1biB0byB1c2UgaXQsIG90aGVyd2lzZSwgdG8gbm90aGluZy4KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX0hBU19SVU5dLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK0FDX1JFUVVJUkVfQVVYX0ZJTEUoW21pc3NpbmddKWRubAoraWYgdGVzdCB4IiR7TUlTU0lORytzZXR9IiAhPSB4c2V0OyB0aGVuCisgIGNhc2UgJGFtX2F1eF9kaXIgaW4KKyAgKlwgKiB8ICpcCSopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9IFwiJGFtX2F1eF9kaXIvbWlzc2luZ1wiIiA7OworICAqKQorICAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIiA7OworICBlc2FjCitmaQorIyBVc2UgZXZhbCB0byBleHBhbmQgJFNIRUxMCitpZiBldmFsICIkTUlTU0lORyAtLXJ1biB0cnVlIjsgdGhlbgorICBhbV9taXNzaW5nX3J1bj0iJE1JU1NJTkcgLS1ydW4gIgorZWxzZQorICBhbV9taXNzaW5nX3J1bj0KKyAgQUNfTVNHX1dBUk4oW2BtaXNzaW5nJyBzY3JpcHQgaXMgdG9vIG9sZCBvciBtaXNzaW5nXSkKK2ZpCitdKQorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX01LRElSX1AKKyMgLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBgbWtkaXIgLXAnLgorQUNfREVGVU4oW0FNX1BST0dfTUtESVJfUF0sCitbQUNfUFJFUkVRKFsyLjYwXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTUtESVJfUF0pZG5sCitkbmwgQXV0b21ha2UgMS44IHRvIDEuOS42IHVzZWQgdG8gZGVmaW5lIG1rZGlyX3AuICBXZSBub3cgdXNlIE1LRElSX1AsCitkbmwgd2hpbGUga2VlcGluZyBhIGRlZmluaXRpb24gb2YgbWtkaXJfcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK2RubCBATUtESVJfUEAgaXMgbWFnaWM6IEFDX09VVFBVVCBhZGp1c3RzIGl0cyB2YWx1ZSBmb3IgZWFjaCBNYWtlZmlsZS4KK2RubCBIb3dldmVyIHdlIGNhbm5vdCBkZWZpbmUgbWtkaXJfcCBhcyAkKE1LRElSX1ApIGZvciB0aGUgc2FrZSBvZgorZG5sIE1ha2VmaWxlLmlucyB0aGF0IGRvIG5vdCBkZWZpbmUgTUtESVJfUCwgc28gd2UgZG8gb3VyIG93bgorZG5sIGFkanVzdG1lbnQgdXNpbmcgdG9wX2J1aWxkZGlyICh3aGljaCBpcyBkZWZpbmVkIG1vcmUgb2Z0ZW4gdGhhbgorZG5sIE1LRElSX1ApLgorQUNfU1VCU1QoW21rZGlyX3BdLCBbIiRNS0RJUl9QIl0pZG5sCitjYXNlICRta2Rpcl9wIGluCisgIFtbXFwvJF1dKiB8ID86W1tcXC9dXSopIDs7CisgICovKikgbWtkaXJfcD0iXCQodG9wX2J1aWxkZGlyKS8kbWtkaXJfcCIgOzsKK2VzYWMKK10pCisKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDggIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwKK1tbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisjIF9BTV9TRVRfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAorW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQorCisjIF9BTV9TRVRfT1BUSU9OUyhPUFRJT05TKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCitbbTRfZm9yZWFjaF93KFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQorCisjIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK0FDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKK1ttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwNgorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA1CisKK0FDX0RFRlVOKFtBTV9DX1BST1RPVFlQRVNdLAorW0FDX1JFUVVJUkUoW0FDX0NfUFJPVE9UWVBFU10pCitpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19jY19zdGRjIiAhPSBubzsgdGhlbgorICBVPSBBTlNJMktOUj0KK2Vsc2UKKyAgVT1fIEFOU0kyS05SPS4vYW5zaTJrbnIKK2ZpCisjIEVuc3VyZSBzb21lIGNoZWNrcyBuZWVkZWQgYnkgYW5zaTJrbnIgaXRzZWxmLgorQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3RyaW5nLmhdKQorQUNfU1VCU1QoW1VdKWRubAorQUNfU1VCU1QoW0FOU0kyS05SXSlkbmwKK19BTV9TVUJTVF9OT1RNQUtFKFtBTlNJMktOUl0pZG5sCitdKQorCitBVV9ERUZVTihbZnBfQ19QUk9UT1RZUEVTXSwgW0FNX0NfUFJPVE9UWVBFU10pCisKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIEFNX1NBTklUWV9DSEVDSworIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKKyMgUmVqZWN0IHVuc2FmZSBjaGFyYWN0ZXJzIGluICRzcmNkaXIgb3IgdGhlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5CisjIG5hbWUuICBBY2NlcHQgc3BhY2UgYW5kIHRhYiBvbmx5IGluIHRoZSBsYXR0ZXIuCithbV9sZj0nCisnCitjYXNlIGBwd2RgIGluCisgICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWVdKTs7Citlc2FjCitjYXNlICRzcmNkaXIgaW4KKyAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIHNyY2RpciB2YWx1ZTogYCRzcmNkaXInXSk7OworZXNhYworCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGVgCisgICBmaQorICAgcm0gLWYgY29uZnRlc3QuZmlsZQorICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCitmaQorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEKKworIyBBTV9TSUxFTlRfUlVMRVMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbmFibGUgbGVzcyB2ZXJib3NlIGJ1aWxkIHJ1bGVzOyB3aXRoIHRoZSBkZWZhdWx0IHNldCB0byBERUZBVUxUCisjIChgeWVzJyBiZWluZyBsZXNzIHZlcmJvc2UsIGBubycgb3IgZW1wdHkgYmVpbmcgdmVyYm9zZSkuCitBQ19ERUZVTihbQU1fU0lMRU5UX1JVTEVTXSwKK1tBQ19BUkdfRU5BQkxFKFtzaWxlbnQtcnVsZXNdLAorWyAgLS1lbmFibGUtc2lsZW50LXJ1bGVzICAgICAgICAgIGxlc3MgdmVyYm9zZSBidWlsZCBvdXRwdXQgKHVuZG86IGBtYWtlIFY9MScpCisgIC0tZGlzYWJsZS1zaWxlbnQtcnVsZXMgICAgICAgICB2ZXJib3NlIGJ1aWxkIG91dHB1dCAodW5kbzogYG1ha2UgVj0wJyldKQorY2FzZSAkZW5hYmxlX3NpbGVudF9ydWxlcyBpbgoreWVzKSBBTV9ERUZBVUxUX1ZFUkJPU0lUWT0wOzsKK25vKSAgQU1fREVGQVVMVF9WRVJCT1NJVFk9MTs7CisqKSAgIEFNX0RFRkFVTFRfVkVSQk9TSVRZPW00X2lmKFskMV0sIFt5ZXNdLCBbMF0sIFsxXSk7OworZXNhYworQUNfU1VCU1QoW0FNX0RFRkFVTFRfVkVSQk9TSVRZXSlkbmwKK0FNX0JBQ0tTTEFTSD0nXCcKK0FDX1NVQlNUKFtBTV9CQUNLU0xBU0hdKWRubAorX0FNX1NVQlNUX05PVE1BS0UoW0FNX0JBQ0tTTEFTSF0pZG5sCitdKQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX0lOU1RBTExfU1RSSVAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAorIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKKyMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCisjIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKKyMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQorIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCitbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2RubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJChpbnN0YWxsX3NoKSAtYyAtcyIKK0FDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKV0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgX0FNX1NVQlNUX05PVE1BS0UoVkFSSUFCTEUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcmV2ZW50IEF1dG9tYWtlIGZyb20gb3V0cHV0dGluZyBWQVJJQUJMRSA9IEBWQVJJQUJMRUAgaW4gTWFrZWZpbGUuaW4uCisjIFRoaXMgbWFjcm8gaXMgdHJhY2VkIGJ5IEF1dG9tYWtlLgorQUNfREVGVU4oW19BTV9TVUJTVF9OT1RNQUtFXSkKKworIyBBTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHVibGljIHNpc3RlciBvZiBfQU1fU1VCU1RfTk9UTUFLRS4KK0FDX0RFRlVOKFtBTV9TVUJTVF9OT1RNQUtFXSwgW19BTV9TVUJTVF9OT1RNQUtFKCRAKV0pCisKKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBfQU1fUFJPR19UQVIoRk9STUFUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbCBpbiBmb3JtYXQgRk9STUFULgorIyBGT1JNQVQgc2hvdWxkIGJlIG9uZSBvZiBgdjcnLCBgdXN0YXInLCBvciBgcGF4Jy4KKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3RhcikgdGhhdCBpcyBhIGNvbW1hbmQKKyMgd3JpdGluZyB0byBzdGRvdXQgYSBGT1JNQVQtdGFyYmFsbCBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkKKyMgJHRhcmRpci4KKyMgICAgIHRhcmRpcj1kaXJlY3RvcnkgJiYgJChhbV9fdGFyKSA+IHJlc3VsdC50YXIKKyMKKyMgU3Vic3RpdHV0ZSBhIHZhcmlhYmxlICQoYW1fX3VudGFyKSB0aGF0IGV4dHJhY3Qgc3VjaAorIyBhIHRhcmJhbGwgcmVhZCBmcm9tIHN0ZGluLgorIyAgICAgJChhbV9fdW50YXIpIDwgcmVzdWx0LnRhcgorQUNfREVGVU4oW19BTV9QUk9HX1RBUl0sCitbIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorQU1fTUlTU0lOR19QUk9HKFtBTVRBUl0sIFt0YXJdKQorbTRfaWYoWyQxXSwgW3Y3XSwKKyAgICAgW2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJ10sCisgICAgIFttNF9jYXNlKFskMV0sIFt1c3Rhcl0sLCBbcGF4XSwsCisgICAgICAgICAgICAgIFttNF9mYXRhbChbVW5rbm93biB0YXIgZm9ybWF0XSldKQorQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gY3JlYXRlIGEgJDEgdGFyIGFyY2hpdmVdKQorIyBMb29wIG92ZXIgYWxsIGtub3duIG1ldGhvZHMgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgdW50aWwgb25lIHdvcmtzLgorX2FtX3Rvb2xzPSdnbnV0YXIgbTRfaWYoWyQxXSwgW3VzdGFyXSwgW3BsYWludGFyXSkgcGF4IGNwaW8gbm9uZScKK19hbV90b29scz0ke2FtX2N2X3Byb2dfdGFyXyQxLSRfYW1fdG9vbHN9CisjIERvIG5vdCBmb2xkIHRoZSBhYm92ZSB0d28gbGluZSBpbnRvIG9uZSwgYmVjYXVzZSBUcnU2NCBzaCBhbmQKKyMgU29sYXJpcyBzaCB3aWxsIG5vdCBncm9rIHNwYWNlcyBpbiB0aGUgcmhzIG9mIGAtJy4KK2ZvciBfYW1fdG9vbCBpbiAkX2FtX3Rvb2xzCitkbworICBjYXNlICRfYW1fdG9vbCBpbgorICBnbnV0YXIpCisgICAgZm9yIF9hbV90YXIgaW4gdGFyIGdudXRhciBndGFyOworICAgIGRvCisgICAgICBBTV9SVU5fTE9HKFskX2FtX3RhciAtLXZlcnNpb25dKSAmJiBicmVhaworICAgIGRvbmUKKyAgICBhbV9fdGFyPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9IiRfYW1fdGFyIC14ZiAtIgorICAgIDs7CisgIHBsYWludGFyKQorICAgICMgTXVzdCBza2lwIEdOVSB0YXI6IGlmIGl0IGRvZXMgbm90IHN1cHBvcnQgLS1mb3JtYXQ9IGl0IGRvZXNuJ3QgY3JlYXRlCisgICAgIyB1c3RhciB0YXJiYWxsIGVpdGhlci4KKyAgICAodGFyIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxICYmIGNvbnRpbnVlCisgICAgYW1fX3Rhcj0ndGFyIGNoZiAtICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3RhciBjaGYgLSAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSd0YXIgeGYgLScKKyAgICA7OworICBwYXgpCisgICAgYW1fX3Rhcj0ncGF4IC1MIC14ICQxIC13ICIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89J3BheCAtTCAteCAkMSAtdyAiJHRhcmRpciInCisgICAgYW1fX3VudGFyPSdwYXggLXInCisgICAgOzsKKyAgY3BpbykKKyAgICBhbV9fdGFyPSdmaW5kICIkJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdGFyXz0nZmluZCAiJHRhcmRpciIgLXByaW50IHwgY3BpbyAtbyAtSCAkMSAtTCcKKyAgICBhbV9fdW50YXI9J2NwaW8gLWkgLUggJDEgLWQnCisgICAgOzsKKyAgbm9uZSkKKyAgICBhbV9fdGFyPWZhbHNlCisgICAgYW1fX3Rhcl89ZmFsc2UKKyAgICBhbV9fdW50YXI9ZmFsc2UKKyAgICA7OworICBlc2FjCisKKyAgIyBJZiB0aGUgdmFsdWUgd2FzIGNhY2hlZCwgc3RvcCBub3cuICBXZSBqdXN0IHdhbnRlZCB0byBoYXZlIGFtX190YXIKKyAgIyBhbmQgYW1fX3VudGFyIHNldC4KKyAgdGVzdCAtbiAiJHthbV9jdl9wcm9nX3Rhcl8kMX0iICYmIGJyZWFrCisKKyAgIyB0YXIvdW50YXIgYSBkdW1teSBkaXJlY3RvcnksIGFuZCBzdG9wIGlmIHRoZSBjb21tYW5kIHdvcmtzCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgIGVjaG8gR3JlcE1lID4gY29uZnRlc3QuZGlyL2ZpbGUKKyAgQU1fUlVOX0xPRyhbdGFyZGlyPWNvbmZ0ZXN0LmRpciAmJiBldmFsICRhbV9fdGFyXyA+Y29uZnRlc3QudGFyXSkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LnRhcjsgdGhlbgorICAgIEFNX1JVTl9MT0coWyRhbV9fdW50YXIgPGNvbmZ0ZXN0LnRhcl0pCisgICAgZ3JlcCBHcmVwTWUgY29uZnRlc3QuZGlyL2ZpbGUgPi9kZXYvbnVsbCAyPiYxICYmIGJyZWFrCisgIGZpCitkb25lCitybSAtcmYgY29uZnRlc3QuZGlyCisKK0FDX0NBQ0hFX1ZBTChbYW1fY3ZfcHJvZ190YXJfJDFdLCBbYW1fY3ZfcHJvZ190YXJfJDE9JF9hbV90b29sXSkKK0FDX01TR19SRVNVTFQoWyRhbV9jdl9wcm9nX3Rhcl8kMV0pXSkKK0FDX1NVQlNUKFthbV9fdGFyXSkKK0FDX1NVQlNUKFthbV9fdW50YXJdKQorXSkgIyBfQU1fUFJPR19UQVIKKwpkaWZmIC0tZ2l0IGEvYW5zaTJrbnIuYyBiL2Fuc2kya25yLmMKaW5kZXggNGUwNWZjMi4uZTg0YzIxMCAxMDA2NDQKLS0tIGEvYW5zaTJrbnIuYworKysgYi9hbnNpMmtuci5jCkBAIC0xLDQgKzEsNiBAQAotLyogYW5zaTJrbnIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTg5LCAyMDAwIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAqLworCisvKiRJZDogYW5zaTJrbnIuYyx2IDEuMTQgMjAwMy8wOS8wNiAwNTozNjo1NiBlZ2dlcnQgRXhwICQqLwogLyogQ29udmVydCBBTlNJIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gSyZSICgidHJhZGl0aW9uYWwgQyIpIHN5bnRheCAqLwogCiAvKgpAQCAtMTEsMTAgKzEzLDEwIEBACiBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgYW5zaTJrbnIsCiBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlIEdQTC4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UKIGlzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCBhbnNpMmtuciBzbyB5b3UgY2FuIGtub3cKLXlvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlIGluIGEgZmlsZSBuYW1lZCBDT1BZTEVGVC4KLVtJbiB0aGUgSUpHIGRpc3RyaWJ1dGlvbiwgdGhlIEdQTCBhcHBlYXJzIGJlbG93LCBub3QgaW4gYSBzZXBhcmF0ZSBmaWxlLl0KLUFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkCi1vbiBhbGwgY29waWVzLgoreW91ciByaWdodHMgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBJdCBzaG91bGQgYmUgaW4gYSBmaWxlIG5hbWVkIENPUFlMRUZULAorb3IsIGlmIHRoZXJlIGlzIG5vIGZpbGUgbmFtZWQgQ09QWUxFRlQsIGEgZmlsZSBuYW1lZCBDT1BZSU5HLiAgQW1vbmcgb3RoZXIKK3RoaW5ncywgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIG11c3QgYmUgcHJlc2VydmVkIG9uIGFsbAorY29waWVzLgogCiBXZSBleHBsaWNpdGx5IHN0YXRlIGhlcmUgd2hhdCB3ZSBiZWxpZXZlIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgR1BMOiBpZgogdGhlIGFuc2kya25yIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgYXMgYSBzZXBhcmF0ZSBzZXQgb2Ygc291cmNlcyBhbmQgYQpAQCAtMjYsMjA0ICsyOCwxMDQgQEAKICovCiAKIC8qCi0tLS0tLS0tLS0tIEhlcmUgaXMgdGhlIEdOVSBHUEwgZmlsZSBDT1BZTEVGVCwgcmVmZXJyZWQgdG8gYWJvdmUgLS0tLS0tLS0tLQotLS0tLS0gVGhlc2UgdGVybXMgZG8gTk9UIGFwcGx5IHRvIHRoZSBKUEVHIHNvZnR3YXJlIGl0c2VsZjsgc2VlIFJFQURNRSAtLS0tLS0KLQotCQkgICAgR0hPU1RTQ1JJUFQgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgKENsYXJpZmllZCAxMSBGZWIgMTk4OCkKLQotIENvcHlyaWdodCAoQykgMTk4OCBSaWNoYXJkIE0uIFN0YWxsbWFuCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMKLSBsaWNlbnNlLCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgd29yZGluZwotIHRvIG1ha2UgdGhlIHRlcm1zIGZvciBvdGhlciBwcm9ncmFtcy4KLQotICBUaGUgbGljZW5zZSBhZ3JlZW1lbnRzIG9mIG1vc3Qgc29mdHdhcmUgY29tcGFuaWVzIGtlZXAgeW91IGF0IHRoZQotbWVyY3kgb2YgdGhvc2UgY29tcGFuaWVzLiAgQnkgY29udHJhc3QsIG91ciBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGlzCi1pbnRlbmRlZCB0byBnaXZlIGV2ZXJ5b25lIHRoZSByaWdodCB0byBzaGFyZSBHaG9zdHNjcmlwdC4gIFRvIG1ha2Ugc3VyZQotdGhhdCB5b3UgZ2V0IHRoZSByaWdodHMgd2Ugd2FudCB5b3UgdG8gaGF2ZSwgd2UgbmVlZCB0byBtYWtlCi1yZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91Ci10byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIEhlbmNlIHRoaXMgbGljZW5zZSBhZ3JlZW1lbnQuCi0KLSAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCi1hd2F5IGNvcGllcyBvZiBHaG9zdHNjcmlwdCwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBlbHNlIGNhbiBnZXQKLWl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIEdob3N0c2NyaXB0IG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBtYWtlIHN1cmUgdGhhdCBldmVyeW9uZSBoYXMgc3VjaCByaWdodHMsIHdlIGhhdmUgdG8gZm9yYmlkIHlvdSB0bwotZGVwcml2ZSBhbnlvbmUgZWxzZSBvZiB0aGVzZSByaWdodHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUKLWNvcGllcyBvZiBHaG9zdHNjcmlwdCwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Ci15b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQotc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy4KLQotICBBbHNvLCBmb3Igb3VyIG93biBwcm90ZWN0aW9uLCB3ZSBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGV2ZXJ5b25lIGZpbmRzCi1vdXQgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgR2hvc3RzY3JpcHQuICBJZiBHaG9zdHNjcmlwdCBpcwotbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdwotdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3Qgd2hhdCB3ZSBkaXN0cmlidXRlZCwgc28gdGhhdCBhbnkgcHJvYmxlbXMKLWludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gb3VyIHJlcHV0YXRpb24uCi0KLSAgVGhlcmVmb3JlIHdlIChSaWNoYXJkIE0uIFN0YWxsbWFuIGFuZCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotSW5jLikgbWFrZSB0aGUgZm9sbG93aW5nIHRlcm1zIHdoaWNoIHNheSB3aGF0IHlvdSBtdXN0IGRvIHRvIGJlIGFsbG93ZWQKLXRvIGRpc3RyaWJ1dGUgb3IgY2hhbmdlIEdob3N0c2NyaXB0LgotCi0KLQkJCUNPUFlJTkcgUE9MSUNJRVMKLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIEdob3N0c2NyaXB0IHNvdXJjZQotY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseQotYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYSB2YWxpZCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UKLW5vdGljZSAiQ29weXJpZ2h0IChDKSAxOTg5IEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotRGlzdHJpYnV0ZWQgYnkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIiAob3Igd2l0aCB3aGF0ZXZlciB5ZWFyIGlzCi1hcHByb3ByaWF0ZSk7IGtlZXAgaW50YWN0IHRoZSBub3RpY2VzIG9uIGFsbCBmaWxlcyB0aGF0IHJlZmVyIHRvIHRoaXMKLUxpY2Vuc2UgQWdyZWVtZW50IGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlcgotcmVjaXBpZW50cyBvZiB0aGUgR2hvc3RzY3JpcHQgcHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudAotYWxvbmcgd2l0aCB0aGUgcHJvZ3JhbS4gIFlvdSBtYXkgY2hhcmdlIGEgZGlzdHJpYnV0aW9uIGZlZSBmb3IgdGhlCi1waHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIEdob3N0c2NyaXB0IG9yIGFueSBwb3J0aW9uIG9mCi1pdCwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBvZgotUGFyYWdyYXBoIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCi0gICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2U7IGFuZAotCi0gICAgYikgY2F1c2UgdGhlIHdob2xlIG9mIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwKLSAgICB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgYSBkZXJpdmF0aXZlIG9mIEdob3N0c2NyaXB0Ci0gICAgb3IgYW55IHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgb24gdGVybXMgaWRlbnRpY2FsIHRvIHRob3NlIGNvbnRhaW5lZCBpbiB0aGlzIExpY2Vuc2UKLSAgICBBZ3JlZW1lbnQgKGV4Y2VwdCB0aGF0IHlvdSBtYXkgY2hvb3NlIHRvIGdyYW50IG1vcmUgZXh0ZW5zaXZlCi0gICAgd2FycmFudHkgcHJvdGVjdGlvbiB0byBzb21lIG9yIGFsbCB0aGlyZCBwYXJ0aWVzLCBhdCB5b3VyIG9wdGlvbikuCi0KLSAgICBjKSBZb3UgbWF5IGNoYXJnZSBhIGRpc3RyaWJ1dGlvbiBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YKLSAgICB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eQotICAgIHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi1NZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgdW5yZWxhdGVkIHByb2dyYW0gd2l0aCB0aGlzIHByb2dyYW0gKG9yIGl0cwotZGVyaXZhdGl2ZSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcKLXRoZSBvdGhlciBwcm9ncmFtIHVuZGVyIHRoZSBzY29wZSBvZiB0aGVzZSB0ZXJtcy4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgR2hvc3RzY3JpcHQgKG9yIGEgcG9ydGlvbiBvciBkZXJpdmF0aXZlCi1vZiBpdCwgdW5kZXIgUGFyYWdyYXBoIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUKLXRlcm1zIG9mIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUKLWZvbGxvd2luZzoKLQotICAgIGEpIGFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKLSAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLAotCi0gICAgYikgYWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHkgZnJlZSAoZXhjZXB0IGZvciBhIG5vbWluYWwKLSAgICBzaGlwcGluZyBjaGFyZ2UpIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotICAgIFBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZTsgb3IsCi0KLSAgICBjKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHdoZXJlIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQotICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSBhbG9uZS4pCi0KLUZvciBhbiBleGVjdXRhYmxlIGZpbGUsIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yCi1hbGwgbW9kdWxlcyBpdCBjb250YWluczsgYnV0LCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpdCBuZWVkIG5vdCBpbmNsdWRlCi1zb3VyY2UgY29kZSBmb3IgbW9kdWxlcyB3aGljaCBhcmUgc3RhbmRhcmQgbGlicmFyaWVzIHRoYXQgYWNjb21wYW55IHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBmaWxlIHJ1bnMuCi0KLSAgNC4gWW91IG1heSBub3QgY29weSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2ZlciBHaG9zdHNjcmlwdAotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIEdob3N0c2NyaXB0IGlzCi12b2lkIGFuZCB5b3VyIHJpZ2h0cyB0byB1c2UgdGhlIHByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIGFncmVlbWVudAotc2hhbGwgYmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZAotY29tcHV0ZXIgc29mdHdhcmUgcHJvZ3JhbXMgZnJvbSB5b3Ugd2l0aCB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgbm90Ci1oYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwKLWNvbXBsaWFuY2UuCi0KLSAgNS4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgR2hvc3RzY3JpcHQgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiBhdCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzkuICBXZSBoYXZlIG5vdAoteWV0IHdvcmtlZCBvdXQgYSBzaW1wbGUgcnVsZSB0aGF0IGNhbiBiZSBzdGF0ZWQgaGVyZSwgYnV0IHdlIHdpbGwgb2Z0ZW4KLXBlcm1pdCB0aGlzLiAgV2Ugd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlCi1zdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlCi1zaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZS4KLQotWW91ciBjb21tZW50cyBhbmQgc3VnZ2VzdGlvbnMgYWJvdXQgb3VyIGxpY2Vuc2luZyBwb2xpY2llcyBhbmQgb3VyCi1zb2Z0d2FyZSBhcmUgd2VsY29tZSEgIFBsZWFzZSBjb250YWN0IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi1JbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIG9yIGNhbGwgKDYxNykgODc2LTMyOTYuCi0KLQkJICAgICAgIE5PIFdBUlJBTlRZCi0KLSAgQkVDQVVTRSBHSE9TVFNDUklQVCBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgV0UgUFJPVklERSBBQlNPTFVURUxZCi1OTyBXQVJSQU5UWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBTVEFURSBMQVcuICBFWENFUFQKLVdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HLCBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQywgUklDSEFSRAotTS4gU1RBTExNQU4sIEFMQURESU4gRU5URVJQUklTRVMsIEwuIFBFVEVSIERFVVRTQ0gsIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIEdIT1NUU0NSSVBUICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSCi1FWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUKLUVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBHSE9TVFNDUklQVCBJUyBXSVRICi1ZT1UuICBTSE9VTEQgR0hPU1RTQ1JJUFQgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAotTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIFdJTEwgUklDSEFSRCBNLgotU1RBTExNQU4sIFRIRSBGUkVFIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4sIEwuIFBFVEVSIERFVVRTQ0gsIEFMQURESU4KLUVOVEVSUFJJU0VTLCBBTkQvT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORCBSRURJU1RSSUJVVEUKLUdIT1NUU0NSSVBUIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HCi1BTlkgTE9TVCBQUk9GSVRTLCBMT1NUIE1PTklFUywgT1IgT1RIRVIgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRQotKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQKLUlOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUKLVBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUykgR0hPU1RTQ1JJUFQsIEVWRU4gSUYgWU9VCi1IQVZFIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLCBPUiBGT1IgQU5ZIENMQUlNCi1CWSBBTlkgT1RIRVIgUEFSVFkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvZiBmaWxlIENPUFlMRUZUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyoKICAqIFVzYWdlOgotCWFuc2kya25yIGlucHV0X2ZpbGUgW291dHB1dF9maWxlXQorCWFuc2kya25yIFstLWZpbGVuYW1lIEZJTEVOQU1FXSBbSU5QVVRfRklMRSBbT1VUUFVUX0ZJTEVdXQorICogLS1maWxlbmFtZSBwcm92aWRlcyB0aGUgZmlsZSBuYW1lIGZvciB0aGUgI2xpbmUgZGlyZWN0aXZlIGluIHRoZSBvdXRwdXQsCisgKiBvdmVycmlkaW5nIGlucHV0X2ZpbGUgKGlmIHByZXNlbnQpLgorICogSWYgbm8gaW5wdXRfZmlsZSBpcyBzdXBwbGllZCwgaW5wdXQgaXMgcmVhZCBmcm9tIHN0ZGluLgogICogSWYgbm8gb3V0cHV0X2ZpbGUgaXMgc3VwcGxpZWQsIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KICAqIFRoZXJlIGFyZSBubyBlcnJvciBtZXNzYWdlcy4KICAqCiAgKiBhbnNpMmtuciByZWNvZ25pemVzIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJ5IHNlZWluZyBhIG5vbi1rZXl3b3JkCi0gKiBpZGVudGlmaWVyIGF0IHRoZSBsZWZ0IG1hcmdpbiwgZm9sbG93ZWQgYnkgYSBsZWZ0IHBhcmVudGhlc2lzLAotICogd2l0aCBhIHJpZ2h0IHBhcmVudGhlc2lzIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgbGluZSwKLSAqIGFuZCB3aXRoIGEgbGVmdCBicmFjZSBhcyB0aGUgZmlyc3QgdG9rZW4gb24gdGhlIGZvbGxvd2luZyBsaW5lCi0gKiAoaWdub3JpbmcgcG9zc2libGUgaW50ZXJ2ZW5pbmcgY29tbWVudHMpLgotICogSXQgd2lsbCByZWNvZ25pemUgYSBtdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nCi0gKiBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQgYnJhY2Ugb3IgYSBzZW1pY29sb24uCi0gKiBUaGVzZSBhbGdvcml0aG1zIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgZXhjZXB0IHRoYXQKLSAqIHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLgotICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHdpbGwgY29uZnVzZSBpdDoKKyAqIGlkZW50aWZpZXIgYXQgdGhlIGxlZnQgbWFyZ2luLCBmb2xsb3dlZCBieSBhIGxlZnQgcGFyZW50aGVzaXMsIHdpdGggYQorICogcmlnaHQgcGFyZW50aGVzaXMgYXMgdGhlIGxhc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLCBhbmQgd2l0aCBhIGxlZnQKKyAqIGJyYWNlIGFzIHRoZSBmaXJzdCB0b2tlbiBvbiB0aGUgZm9sbG93aW5nIGxpbmUgKGlnbm9yaW5nIHBvc3NpYmxlCisgKiBpbnRlcnZlbmluZyBjb21tZW50cyBhbmQvb3IgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMpLCBleGNlcHQgdGhhdCBhIGxpbmUKKyAqIGNvbnNpc3Rpbmcgb2Ygb25seQorICoJaWRlbnRpZmllcjEoaWRlbnRpZmllcjIpCisgKiB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiB1bmxlc3MgaWRlbnRpZmllcjIgaXMKKyAqIHRoZSB3b3JkICJ2b2lkIiwgYW5kIGEgbGluZSBjb25zaXN0aW5nIG9mCisgKglpZGVudGlmaWVyMShpZGVudGlmaWVyMiwgPDxhcmJpdHJhcnk+PikKKyAqIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgorICogYW5zaTJrbnIgd2lsbCByZWNvZ25pemUgYSBtdWx0aS1saW5lIGhlYWRlciBwcm92aWRlZCB0aGF0IG5vIGludGVydmVuaW5nCisgKiBsaW5lIGVuZHMgd2l0aCBhIGxlZnQgb3IgcmlnaHQgYnJhY2Ugb3IgYSBzZW1pY29sb24uICBUaGVzZSBhbGdvcml0aG1zCisgKiBpZ25vcmUgd2hpdGVzcGFjZSwgY29tbWVudHMsIGFuZCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcywgZXhjZXB0IHRoYXQKKyAqIHRoZSBmdW5jdGlvbiBuYW1lIG11c3QgYmUgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLiAgVGhlIGZvbGxvd2luZworICogY29uc3RydWN0cyB3aWxsIGNvbmZ1c2UgaXQ6CiAgKgktIEFueSBvdGhlciBjb25zdHJ1Y3QgdGhhdCBzdGFydHMgYXQgdGhlIGxlZnQgbWFyZ2luIGFuZAogICoJICAgIGZvbGxvd3MgdGhlIGFib3ZlIHN5bnRheCAoc3VjaCBhcyBhIG1hY3JvIG9yIGZ1bmN0aW9uIGNhbGwpLgotICoJLSBTb21lIG1hY3JvcyB0aGF0IHRpbmtlciB3aXRoIHRoZSBzeW50YXggb2YgdGhlIGZ1bmN0aW9uIGhlYWRlci4KKyAqCS0gU29tZSBtYWNyb3MgdGhhdCB0aW5rZXIgd2l0aCB0aGUgc3ludGF4IG9mIGZ1bmN0aW9uIGhlYWRlcnMuCiAgKi8KIAogLyoKICAqIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBhbnNpMmtuciBpcyBMLiBQZXRlciBEZXV0c2NoCiAgKiA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5CiAgKiB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6Ci0JbHBkIDk2LTAxLTIxIGFkZGVkIGNvZGUgdG8gY29wZSB3aXRoIG5vdCBIQVZFX0NPTkZJR19IIGFuZCB3aXRoCisKKwlscGQgMjAwMC0wNC0xMiBiYWNrcyBvdXQgRWdnZXJ0J3MgY2hhbmdlcyBiZWNhdXNlIG9mIGJ1Z3M6CisJLSBjb25jYXRsaXRzIGRpZG4ndCBkZWNsYXJlIHRoZSB0eXBlIG9mIGl0cyBidWZlbmQgYXJndW1lbnQ7CisJLSBjb25jYXRsaXRzIGRpZG4ndCByZWNvZ25pemUgd2hlbiBpdCB3YXMgaW5zaWRlIGEgY29tbWVudDsKKwktIHNjYW5zdHJpbmcgY291bGQgc2NhbiBiYWNrd2FyZCBwYXN0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZzsgd2hlbgorCS0gdGhlIGNoZWNrIGZvciBcICsgbmV3bGluZSBpbiBzY2Fuc3RyaW5nIHdhcyB1bm5lY2Vzc2FyeS4KKworCTIwMDAtMDMtMDUgIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgorCisJQWRkIHN1cHBvcnQgZm9yIGNvbmNhdGVuYXRlZCBzdHJpbmcgbGl0ZXJhbHMuCisJKiBhbnNpMmtuci5jIChjb25jYXRsaXRzKTogTmV3IGRlY2wuCisJKG1haW4pOiBJbnZva2UgY29uY2F0bGl0cyB0byBjb25jYXRlbmF0ZSBzdHJpbmcgbGl0ZXJhbHMuCisJKHNjYW5zdHJpbmcpOiBIYW5kbGUgYmFja3NsYXNoLW5ld2xpbmUgY29ycmVjdGx5LiAgV29yayB3aXRoCisJY2hhcmFjdGVyIGNvbnN0YW50cy4gIEZpeCBidWcgd2hlbiBzY2FubmluZyBiYWNrd2FyZHMgdGhyb3VnaAorCWJhY2tzbGFzaC1xdW90ZS4gIENoZWNrIGZvciB1bnRlcm1pbmF0ZWQgc3RyaW5ncy4KKwkoY29udmVydDEpOiBQYXJzZSBjaGFyYWN0ZXIgY29uc3RhbnRzLCB0b28uCisJKGFwcGVuZGxpbmUsIGNvbmNhdGxpdHMpOiBOZXcgZnVuY3Rpb25zLgorCSogYW5zaTJrbnIuMTogRG9jdW1lbnQgdGhpcy4KKworCWxwZCAxOTk5LTA4LTE3IGFkZGVkIGNvZGUgdG8gYWxsb3cgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMKKwkJd2hlcmV2ZXIgY29tbWVudHMgYXJlIGFsbG93ZWQKKwlscGQgMTk5OS0wNC0xMiBhZGRlZCBtaW5vciBmaXhlcyBmcm9tIFBhdmVsIFJvc2tpbgorCQk8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+IGZvciBjbGVhbiBjb21waWxhdGlvbiB3aXRoCisJCWdjYyAtVyAtV2FsbAorCWxwZCAxOTk5LTAzLTIyIGFkZGVkIGhhY2sgdG8gcmVjb2duaXplIGxpbmVzIGNvbnNpc3Rpbmcgb2YKKwkJaWRlbnRpZmllcjEoaWRlbnRpZmllcjIsIHh4eCkgYXMgKm5vdCogYmVpbmcgcHJvY2VkdXJlcworCWxwZCAxOTk5LTAyLTAzIG1hZGUgaW5kZW50YXRpb24gb2YgcHJlcHJvY2Vzc29yIGNvbW1hbmRzIGNvbnNpc3RlbnQKKwlscGQgMTk5OS0wMS0yOCBmaXhlZCB0d28gYnVnczogYSAnLycgaW4gYW4gYXJndW1lbnQgbGlzdCBjYXVzZWQgYW4KKwkJZW5kbGVzcyBsb29wOyBxdW90ZWQgc3RyaW5ncyB3aXRoaW4gYW4gYXJndW1lbnQgbGlzdAorCQljb25mdXNlZCB0aGUgcGFyc2VyCisJbHBkIDE5OTktMDEtMjQgYWRkZWQgYSBjaGVjayBmb3Igd3JpdGUgZXJyb3JzIG9uIHRoZSBvdXRwdXQsCisJCXN1Z2dlc3RlZCBieSBKaW0gTWV5ZXJpbmcgPG1leWVyaW5nQGFzY2VuZC5jb20+CisJbHBkIDE5OTgtMTEtMDkgYWRkZWQgZnVydGhlciBoYWNrIHRvIHJlY29nbml6ZSBpZGVudGlmaWVyKHZvaWQpCisJCWFzIGJlaW5nIGEgcHJvY2VkdXJlCisJbHBkIDE5OTgtMTAtMjMgYWRkZWQgaGFjayB0byByZWNvZ25pemUgbGluZXMgY29uc2lzdGluZyBvZgorCQlpZGVudGlmaWVyMShpZGVudGlmaWVyMikgYXMgKm5vdCogYmVpbmcgcHJvY2VkdXJlcworCWxwZCAxOTk3LTEyLTA4IG1hZGUgaW5wdXRfZmlsZSBvcHRpb25hbDsgb25seSBjbG9zZXMgaW5wdXQgYW5kL29yCisJCW91dHB1dCBmaWxlIGlmIG5vdCBzdGRpbiBvciBzdGRvdXQgcmVzcGVjdGl2ZWx5OyBwcmludHMKKwkJdXNhZ2UgbWVzc2FnZSBvbiBzdGRlcnIgcmF0aGVyIHRoYW4gc3Rkb3V0OyBhZGRzCisJCS0tZmlsZW5hbWUgc3dpdGNoIChjaGFuZ2VzIHN1Z2dlc3RlZCBieQorCQk8Y2VkZXJAbHlzYXRvci5saXUuc2U+KQorCWxwZCAxOTk2LTAxLTIxIGFkZGVkIGNvZGUgdG8gY29wZSB3aXRoIG5vdCBIQVZFX0NPTkZJR19IIGFuZCB3aXRoCiAJCWNvbXBpbGVycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgdm9pZCwgYXMgc3VnZ2VzdGVkIGJ5CiAJCVRvbSBMYW5lCi0JbHBkIDk2LTAxLTE1IGNoYW5nZWQgdG8gcmVxdWlyZSB0aGF0IHRoZSBmaXJzdCBub24tY29tbWVudCB0b2tlbgorCWxwZCAxOTk2LTAxLTE1IGNoYW5nZWQgdG8gcmVxdWlyZSB0aGF0IHRoZSBmaXJzdCBub24tY29tbWVudCB0b2tlbgogCQlvbiB0aGUgbGluZSBmb2xsb3dpbmcgYSBmdW5jdGlvbiBoZWFkZXIgYmUgYSBsZWZ0IGJyYWNlLAogCQl0byByZWR1Y2Ugc2Vuc2l0aXZpdHkgdG8gbWFjcm9zLCBhcyBzdWdnZXN0ZWQgYnkgVG9tIExhbmUKIAkJPHRnbEBzc3MucGdoLnBhLnVzPgotCWxwZCA5NS0wNi0yMiByZW1vdmVkICNpZm5kZWZzIHdob3NlIHNvbGUgcHVycG9zZSB3YXMgdG8gZGVmaW5lCisJbHBkIDE5OTUtMDYtMjIgcmVtb3ZlZCAjaWZuZGVmcyB3aG9zZSBzb2xlIHB1cnBvc2Ugd2FzIHRvIGRlZmluZQogCQl1bmRlZmluZWQgcHJlcHJvY2Vzc29yIHN5bWJvbHMgYXMgMDsgY2hhbmdlZCBhbGwgI2lmZGVmcwogCQlmb3IgY29uZmlndXJhdGlvbiBzeW1ib2xzIHRvICNpZnMKLQlscGQgOTUtMDQtMDUgY2hhbmdlZCBjb3B5cmlnaHQgbm90aWNlIHRvIG1ha2UgaXQgY2xlYXIgdGhhdAorCWxwZCAxOTk1LTA0LTA1IGNoYW5nZWQgY29weXJpZ2h0IG5vdGljZSB0byBtYWtlIGl0IGNsZWFyIHRoYXQKIAkJaW5jbHVkaW5nIGFuc2kya25yIGluIGEgcHJvZ3JhbSBkb2VzIG5vdCBicmluZyB0aGUgZW50aXJlCiAJCXByb2dyYW0gdW5kZXIgdGhlIEdQTAotCWxwZCA5NC0xMi0xOCBhZGRlZCBjb25kaXRpb25hbHMgZm9yIHN5c3RlbXMgd2hlcmUgY3R5cGUgbWFjcm9zCisJbHBkIDE5OTQtMTItMTggYWRkZWQgY29uZGl0aW9uYWxzIGZvciBzeXN0ZW1zIHdoZXJlIGN0eXBlIG1hY3JvcwogCQlkb24ndCBoYW5kbGUgOC1iaXQgY2hhcmFjdGVycyBwcm9wZXJseSwgc3VnZ2VzdGVkIGJ5CiAJCUZyYW5jb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+OwogCQlyZW1vdmVkIC0tdmFyYXJncyBzd2l0Y2ggKHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0KQotCWxwZCA5NC0xMC0xMCByZW1vdmVkIENPTkZJR19CUk9LRVRTIGNvbmRpdGlvbmFsCi0JbHBkIDk0LTA3LTE2IGFkZGVkIHNvbWUgY29uZGl0aW9uYWxzIHRvIGhlbHAgR05VIGBjb25maWd1cmUnLAorCWxwZCAxOTk0LTEwLTEwIHJlbW92ZWQgQ09ORklHX0JST0tFVFMgY29uZGl0aW9uYWwKKwlscGQgMTk5NC0wNy0xNiBhZGRlZCBzb21lIGNvbmRpdGlvbmFscyB0byBoZWxwIEdOVSBgY29uZmlndXJlJywKIAkJc3VnZ2VzdGVkIGJ5IEZyYW5jb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+OwogCQlwcm9wZXJseSBlcmFzZSBwcm90b3R5cGUgYXJncyBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzLAogCQljb250cmlidXRlZCBieSBKaW0gQXZlcmEgPGppbWFAbmV0Y29tLmNvbT47CiAJCWNvcnJlY3QgZXJyb3IgaW4gd3JpdGVibGFua3MgKGl0IHNob3VsZG4ndCBlcmFzZSBFT0xzKQotCWxwZCA4OS14eC14eCBvcmlnaW5hbCB2ZXJzaW9uCisJbHBkIDE5ODkteHgteHggb3JpZ2luYWwgdmVyc2lvbgogICovCiAKIC8qIE1vc3Qgb2YgdGhlIGNvbmRpdGlvbmFscyBoZXJlIGFyZSB0byBtYWtlIGFuc2kya25yIHdvcmsgd2l0aCAqLwpAQCAtMjg2LDE5ICsxODgsMjQgQEAKIAogI2VuZGlmCiAKKy8qIERlZmluZSBOVUxMIChmb3IgKnZlcnkqIG9sZCBjb21waWxlcnMpLiAqLworI2lmbmRlZiBOVUxMCisjIGRlZmluZSBOVUxMICgwKQorI2VuZGlmCisKIC8qCiAgKiBUaGUgY3R5cGUgbWFjcm9zIGRvbid0IGFsd2F5cyBoYW5kbGUgOC1iaXQgY2hhcmFjdGVycyBjb3JyZWN0bHkuCiAgKiBDb21wZW5zYXRlIGZvciB0aGlzIGhlcmUuCiAgKi8KICNpZmRlZiBpc2FzY2lpCi0jICB1bmRlZiBIQVZFX0lTQVNDSUkJCS8qIGp1c3QgaW4gY2FzZSAqLwotIyAgZGVmaW5lIEhBVkVfSVNBU0NJSSAxCisjIHVuZGVmIEhBVkVfSVNBU0NJSQkJLyoganVzdCBpbiBjYXNlICovCisjIGRlZmluZSBIQVZFX0lTQVNDSUkgMQogI2Vsc2UKICNlbmRpZgogI2lmIFNURENfSEVBREVSUyB8fCAhSEFWRV9JU0FTQ0lJCi0jICBkZWZpbmUgaXNfYXNjaWkoYykgMQorIyBkZWZpbmUgaXNfYXNjaWkoYykgMQogI2Vsc2UKLSMgIGRlZmluZSBpc19hc2NpaShjKSBpc2FzY2lpKGMpCisjIGRlZmluZSBpc19hc2NpaShjKSBpc2FzY2lpKGMpCiAjZW5kaWYKIAogI2RlZmluZSBpc19zcGFjZShjKSAoaXNfYXNjaWkoYykgJiYgaXNzcGFjZShjKSkKQEAgLTMxMCw3ICsyMTcsMTAgQEAKICNkZWZpbmUgaXNpZGZpcnN0Y2hhcihjaCkgKGlzX2FscGhhKGNoKSB8fCAoY2gpID09ICdfJykKIAogLyogRm9yd2FyZCByZWZlcmVuY2VzICovCitjaGFyICpwcGRpcmZvcndhcmQoKTsKK2NoYXIgKnBwZGlyYmFja3dhcmQoKTsKIGNoYXIgKnNraXBzcGFjZSgpOworY2hhciAqc2NhbnN0cmluZygpOwogaW50IHdyaXRlYmxhbmtzKCk7CiBpbnQgdGVzdDEoKTsKIGludCBjb252ZXJ0MSgpOwpAQCAtMzIwLDExICsyMzAsMTcgQEAKIG1haW4oYXJnYywgYXJndikKICAgICBpbnQgYXJnYzsKICAgICBjaGFyICphcmd2W107Ci17CUZJTEUgKmluLCAqb3V0OworewlGSUxFICppbiA9IHN0ZGluOworCUZJTEUgKm91dCA9IHN0ZG91dDsKKwljaGFyICpmaWxlbmFtZSA9IDA7CisJY2hhciAqcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKwljaGFyICpvdXRwdXRfbmFtZSA9IDA7CiAjZGVmaW5lIGJ1ZnNpemUgNTAwMAkJCS8qIGFyYml0cmFyeSBzaXplICovCiAJY2hhciAqYnVmOwogCWNoYXIgKmxpbmU7CiAJY2hhciAqbW9yZTsKKwljaGFyICp1c2FnZSA9CisJICAiVXNhZ2U6IGFuc2kya25yIFstLWZpbGVuYW1lIEZJTEVOQU1FXSBbSU5QVVRfRklMRSBbT1VUUFVUX0ZJTEVdXVxuIjsKIAkvKgogCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCBhbnNpMmtuciByZWNvZ25pemVkIGEgLS12YXJhcmdzIHN3aXRjaC4KIAkgKiBJZiB0aGlzIHN3aXRjaCB3YXMgc3VwcGxpZWQsIGFuc2kya25yIHdvdWxkIGF0dGVtcHQgdG8gY29udmVydApAQCAtMzM0LDQwICsyNTAsNjEgQEAKIAkgKiBjaGVjayBmb3IgdGhpcyBzd2l0Y2ggZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAJICovCiAJaW50IGNvbnZlcnRfdmFyYXJncyA9IDE7CisJaW50IG91dHB1dF9lcnJvcjsKIAotCWlmICggYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScgKQotCSAgewlpZiAoICFzdHJjbXAoYXJndlsxXSwgIi0tdmFyYXJncyIpICkKLQkJICB7CWNvbnZlcnRfdmFyYXJncyA9IDE7Ci0JCQlhcmdjLS07Ci0JCQlhcmd2Kys7Ci0JCSAgfQotCQllbHNlCi0JCSAgewlmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBzd2l0Y2g6ICVzXG4iLCBhcmd2WzFdKTsKLQkJCWV4aXQoMSk7Ci0JCSAgfQorCXdoaWxlICggYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScgKSB7CisJICBpZiAoICFzdHJjbXAoYXJndlsxXSwgIi0tdmFyYXJncyIpICkgeworCSAgICBjb252ZXJ0X3ZhcmFyZ3MgPSAxOworCSAgICBhcmdjLS07CisJICAgIGFyZ3YrKzsKKwkgICAgY29udGludWU7CiAJICB9CisJICBpZiAoICFzdHJjbXAoYXJndlsxXSwgIi0tZmlsZW5hbWUiKSAmJiBhcmdjID4gMiApIHsKKwkgICAgZmlsZW5hbWUgPSBhcmd2WzJdOworCSAgICBhcmdjIC09IDI7CisJICAgIGFyZ3YgKz0gMjsKKwkgICAgY29udGludWU7CisJICB9CisJICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBVbnJlY29nbml6ZWQgc3dpdGNoOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLAorCQkgIGFyZ3ZbMV0pOworCSAgZnByaW50ZihzdGRlcnIsIHVzYWdlKTsKKwkgIGV4aXQoMSk7CisJfQogCXN3aXRjaCAoIGFyZ2MgKQogCSAgIHsKIAlkZWZhdWx0OgotCQlwcmludGYoIlVzYWdlOiBhbnNpMmtuciBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV1cbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgdXNhZ2UpOwogCQlleGl0KDApOwotCWNhc2UgMjoKLQkJb3V0ID0gc3Rkb3V0OwotCQlicmVhazsKIAljYXNlIDM6Ci0JCW91dCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7Ci0JCWlmICggb3V0ID09IE5VTEwgKQotCQkgICB7CWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOwotCQkJZXhpdCgxKTsKLQkJICAgfQorCQlvdXRwdXRfbmFtZSA9IGFyZ3ZbMl07CisJCW91dCA9IGZvcGVuKG91dHB1dF9uYW1lLCAidyIpOworCQlpZiAoIG91dCA9PSBOVUxMICkgeworCQkgIGZwcmludGYoc3RkZXJyLCAiJXM6IENhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLAorCQkJICBwcm9ncmFtX25hbWUsIG91dHB1dF9uYW1lKTsKKwkJICBleGl0KDEpOworCQl9CisJCS8qIGZhbGxzIHRocm91Z2ggKi8KKwljYXNlIDI6CisJCWluID0gZm9wZW4oYXJndlsxXSwgInIiKTsKKwkJaWYgKCBpbiA9PSBOVUxMICkgeworCQkgIGZwcmludGYoc3RkZXJyLCAiJXM6IENhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsCisJCQkgIHByb2dyYW1fbmFtZSwgYXJndlsxXSk7CisJCSAgZXhpdCgxKTsKKwkJfQorCQlpZiAoIGZpbGVuYW1lID09IDAgKQorCQkgIGZpbGVuYW1lID0gYXJndlsxXTsKKwkJLyogZmFsbHMgdGhyb3VnaCAqLworCWNhc2UgMToKKwkJYnJlYWs7CiAJICAgfQotCWluID0gZm9wZW4oYXJndlsxXSwgInIiKTsKLQlpZiAoIGluID09IE5VTEwgKQotCSAgIHsJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBhcmd2WzFdKTsKKwlpZiAoIGZpbGVuYW1lICkKKwkgIGZwcmludGYob3V0LCAiI2xpbmUgMSBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKKwlidWYgPSBtYWxsb2MoYnVmc2l6ZSk7CisJaWYgKCBidWYgPT0gTlVMTCApCisJICAgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSByZWFkIGJ1ZmZlciFcbiIpOwogCQlleGl0KDEpOwogCSAgIH0KLQlmcHJpbnRmKG91dCwgIiNsaW5lIDEgXCIlc1wiXG4iLCBhcmd2WzFdKTsKLQlidWYgPSBtYWxsb2MoYnVmc2l6ZSk7CiAJbGluZSA9IGJ1ZjsKIAl3aGlsZSAoIGZnZXRzKGxpbmUsICh1bnNpZ25lZCkoYnVmICsgYnVmc2l6ZSAtIGxpbmUpLCBpbikgIT0gTlVMTCApCiAJICAgewpAQCAtMzg0LDcgKzMyMSw3IEBACiAJCQkgIGdvdG8gd2w7CiAJCQlpZiAoIGZnZXRzKGxpbmUsICh1bnNpZ25lZCkoYnVmICsgYnVmc2l6ZSAtIGxpbmUpLCBpbikgPT0gTlVMTCApCiAJCQkgIGdvdG8gd2w7Ci0JCQlzd2l0Y2ggKCAqc2tpcHNwYWNlKG1vcmUsIDEpICkKKwkJCXN3aXRjaCAoICpza2lwc3BhY2UocHBkaXJmb3J3YXJkKG1vcmUpLCAxKSApCiAJCQkgIHsKIAkJCSAgY2FzZSAneyc6CiAJCQkgICAgLyogRGVmaW5pdGVseSBhIGZ1bmN0aW9uIGhlYWRlci4gKi8KQEAgLTQxOCwzMCArMzU1LDkxIEBACiAJaWYgKCBsaW5lICE9IGJ1ZiApCiAJICBmcHV0cyhidWYsIG91dCk7CiAJZnJlZShidWYpOwotCWZjbG9zZShvdXQpOwotCWZjbG9zZShpbik7CisJaWYgKCBvdXRwdXRfbmFtZSApIHsKKwkgIG91dHB1dF9lcnJvciA9IGZlcnJvcihvdXQpOworCSAgb3V0cHV0X2Vycm9yIHw9IGZjbG9zZShvdXQpOworCX0gZWxzZSB7CQkvKiBvdXQgPT0gc3Rkb3V0ICovCisJICBmZmx1c2gob3V0KTsKKwkgIG91dHB1dF9lcnJvciA9IGZlcnJvcihvdXQpOworCX0KKwlpZiAoIG91dHB1dF9lcnJvciApIHsKKwkgIGZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIHdyaXRpbmcgdG8gJXNcbiIsIHByb2dyYW1fbmFtZSwKKwkJICAob3V0cHV0X25hbWUgPyBvdXRwdXRfbmFtZSA6ICJzdGRvdXQiKSk7CisJICBleGl0KDEpOworCX0KKwlpZiAoIGluICE9IHN0ZGluICkKKwkgIGZjbG9zZShpbik7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNraXAgb3ZlciBzcGFjZSBhbmQgY29tbWVudHMsIGluIGVpdGhlciBkaXJlY3Rpb24uICovCisvKgorICogU2tpcCBmb3J3YXJkIG9yIGJhY2t3YXJkIG92ZXIgb25lIG9yIG1vcmUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCisgKi8KK2NoYXIgKgorcHBkaXJmb3J3YXJkKHApCisgICAgY2hhciAqcDsKK3sKKyAgICBmb3IgKDsgKnAgPT0gJyMnOyArK3ApIHsKKwlmb3IgKDsgKnAgIT0gJ1xyJyAmJiAqcCAhPSAnXG4nOyArK3ApCisJICAgIGlmICgqcCA9PSAwKQorCQlyZXR1cm4gcDsKKwlpZiAoKnAgPT0gJ1xyJyAmJiBwWzFdID09ICdcbicpCisJICAgICsrcDsKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9CitjaGFyICoKK3BwZGlyYmFja3dhcmQocCwgbGltaXQpCisgICAgY2hhciAqcDsKKyAgICBjaGFyICpsaW1pdDsKK3sKKyAgICBjaGFyICpucCA9IHA7CisKKyAgICBmb3IgKDs7IHAgPSAtLW5wKSB7CisJaWYgKCpucCA9PSAnXG4nICYmIG5wWy0xXSA9PSAnXHInKQorCSAgICAtLW5wOworCWZvciAoOyBucCA+IGxpbWl0ICYmIG5wWy0xXSAhPSAnXHInICYmIG5wWy0xXSAhPSAnXG4nOyAtLW5wKQorCSAgICBpZiAobnBbLTFdID09IDApCisJCXJldHVybiBucDsKKwlpZiAoKm5wICE9ICcjJykKKwkgICAgcmV0dXJuIHA7CisgICAgfQorfQorCisvKgorICogU2tpcCBvdmVyIHdoaXRlc3BhY2UsIGNvbW1lbnRzLCBhbmQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMsCisgKiBpbiBlaXRoZXIgZGlyZWN0aW9uLgorICovCiBjaGFyICoKIHNraXBzcGFjZShwLCBkaXIpCi0gICAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgICByZWdpc3RlciBpbnQgZGlyOwkJCS8qIDEgZm9yIGZvcndhcmQsIC0xIGZvciBiYWNrd2FyZCAqLwotewlmb3IgKCA7IDsgKQotCSAgIHsJd2hpbGUgKCBpc19zcGFjZSgqcCkgKQotCQkgIHAgKz0gZGlyOwotCQlpZiAoICEoKnAgPT0gJy8nICYmIHBbZGlyXSA9PSAnKicpICkKLQkJICBicmVhazsKLQkJcCArPSBkaXI7ICBwICs9IGRpcjsKLQkJd2hpbGUgKCAhKCpwID09ICcqJyAmJiBwW2Rpcl0gPT0gJy8nKSApCi0JCSAgIHsJaWYgKCAqcCA9PSAwICkKLQkJCSAgcmV0dXJuIHA7CS8qIG11bHRpLWxpbmUgY29tbWVudD8/ICovCi0JCQlwICs9IGRpcjsKLQkJICAgfQotCQlwICs9IGRpcjsgIHAgKz0gZGlyOwotCSAgIH0KLQlyZXR1cm4gcDsKKyAgICBjaGFyICpwOworICAgIGludCBkaXI7CQkJLyogMSBmb3IgZm9yd2FyZCwgLTEgZm9yIGJhY2t3YXJkICovCit7CisgICAgZm9yICggOyA7ICkgeworCXdoaWxlICggaXNfc3BhY2UoKnApICkKKwkgICAgcCArPSBkaXI7CisJaWYgKCAhKCpwID09ICcvJyAmJiBwW2Rpcl0gPT0gJyonKSApCisJICAgIGJyZWFrOworCXAgKz0gZGlyOyAgcCArPSBkaXI7CisJd2hpbGUgKCAhKCpwID09ICcqJyAmJiBwW2Rpcl0gPT0gJy8nKSApIHsKKwkgICAgaWYgKCAqcCA9PSAwICkKKwkJcmV0dXJuIHA7CS8qIG11bHRpLWxpbmUgY29tbWVudD8/ICovCisJICAgIHAgKz0gZGlyOworCX0KKwlwICs9IGRpcjsgIHAgKz0gZGlyOworICAgIH0KKyAgICByZXR1cm4gcDsKK30KKworLyogU2NhbiBvdmVyIGEgcXVvdGVkIHN0cmluZywgaW4gZWl0aGVyIGRpcmVjdGlvbi4gKi8KK2NoYXIgKgorc2NhbnN0cmluZyhwLCBkaXIpCisgICAgY2hhciAqcDsKKyAgICBpbnQgZGlyOworeworICAgIGZvciAocCArPSBkaXI7IDsgcCArPSBkaXIpCisJaWYgKCpwID09ICciJyAmJiBwWy1kaXJdICE9ICdcXCcpCisJICAgIHJldHVybiBwICsgZGlyOwogfQogCiAvKgpAQCAtNDc1LDE0ICs0NzMsMTQgQEAKIGludAogdGVzdDEoYnVmKQogICAgIGNoYXIgKmJ1ZjsKLXsJcmVnaXN0ZXIgY2hhciAqcCA9IGJ1ZjsKK3sJY2hhciAqcCA9IGJ1ZjsKIAljaGFyICpiZW5kOwogCWNoYXIgKmVuZGZuOwogCWludCBjb250aW47CiAKIAlpZiAoICFpc2lkZmlyc3RjaGFyKCpwKSApCiAJICByZXR1cm4gMDsJCS8qIG5vIG5hbWUgYXQgbGVmdCBtYXJnaW4gKi8KLQliZW5kID0gc2tpcHNwYWNlKGJ1ZiArIHN0cmxlbihidWYpIC0gMSwgLTEpOworCWJlbmQgPSBza2lwc3BhY2UocHBkaXJiYWNrd2FyZChidWYgKyBzdHJsZW4oYnVmKSAtIDEsIGJ1ZiksIC0xKTsKIAlzd2l0Y2ggKCAqYmVuZCApCiAJICAgewogCSAgIGNhc2UgJzsnOiBjb250aW4gPSAwIC8qMiovOyBicmVhazsKQEAgLTUxMiw3ICs1MTAsNyBAQAogCQkgICB9OwogCQljaGFyICoqa2V5ID0gd29yZHM7CiAJCWNoYXIgKmtwOwotCQlpbnQgbGVuID0gZW5kZm4gLSBidWY7CisJCXVuc2lnbmVkIGxlbiA9IGVuZGZuIC0gYnVmOwogCiAJCXdoaWxlICggKGtwID0gKmtleSkgIT0gMCApCiAJCSAgIHsJaWYgKCBzdHJsZW4oa3ApID09IGxlbiAmJiAhc3RybmNtcChrcCwgYnVmLCBsZW4pICkKQEAgLTUyMCw2ICs1MTgsMzYgQEAKIAkJCWtleSsrOwogCQkgICB9CiAJICAgfQorCSAgIHsKKwkgICAgICAgY2hhciAqaWQgPSBwOworCSAgICAgICBpbnQgbGVuOworCSAgICAgICAvKgorCQkqIENoZWNrIGZvciBpZGVudGlmaWVyMShpZGVudGlmaWVyMikgYW5kIG5vdAorCQkqIGlkZW50aWZpZXIxKHZvaWQpLCBvciBpZGVudGlmaWVyMShpZGVudGlmaWVyMiwgeHh4eCkuCisJCSovCisKKwkgICAgICAgd2hpbGUgKCBpc2lkY2hhcigqcCkgKQorCQkgICBwKys7CisJICAgICAgIGxlbiA9IHAgLSBpZDsKKwkgICAgICAgcCA9IHNraXBzcGFjZShwLCAxKTsKKwkgICAgICAgaWYgKCpwID09ICcsJyB8fAorCQkgICAoKnAgPT0gJyknICYmIChsZW4gIT0gNCB8fCBzdHJuY21wKGlkLCAidm9pZCIsIDQpKSkKKwkJICAgKQorCQkgICByZXR1cm4gMDsJLyogbm90IGEgZnVuY3Rpb24gKi8KKwkgICB9CisJLyoKKwkgKiBJZiB0aGUgbGFzdCBzaWduaWZpY2FudCBjaGFyYWN0ZXIgd2FzIGEgKSwgd2UgbmVlZCB0byBjb3VudAorCSAqIHBhcmVudGhlc2VzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIHBhcnQgb2YgYSBmb3JtYWwgcGFyYW1ldGVyCisJICogdGhhdCBpcyBhIHByb2NlZHVyZS4KKwkgKi8KKwlpZiAoY29udGluID4gMCkgeworCSAgICBpbnQgbGV2ZWwgPSAwOworCisJICAgIGZvciAocCA9IHNraXBzcGFjZShidWYsIDEpOyAqcDsgcCA9IHNraXBzcGFjZShwICsgMSwgMSkpCisJCWxldmVsICs9ICgqcCA9PSAnKCcgPyAxIDogKnAgPT0gJyknID8gLTEgOiAwKTsKKwkgICAgaWYgKGxldmVsID4gMCkKKwkJY29udGluID0gLTE7CisJfQogCXJldHVybiBjb250aW47CiB9CiAKQEAgLTUzMSw3ICs1NTksMTEgQEAKICAgICBpbnQgaGVhZGVyOwkJCS8qIEJvb2xlYW4gKi8KICAgICBpbnQgY29udmVydF92YXJhcmdzOwkvKiBCb29sZWFuICovCiB7CWNoYXIgKmVuZGZuOwotCXJlZ2lzdGVyIGNoYXIgKnA7CisJY2hhciAqcDsKKwkvKgorCSAqIFRoZSBicmVha3MgdGFibGUgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kCisJICogb2YgZWFjaCBhcmd1bWVudC4KKwkgKi8KIAljaGFyICoqYnJlYWtzOwogCXVuc2lnbmVkIG51bV9icmVha3MgPSAyOwkvKiBmb3IgdGVzdGluZyAqLwogCWNoYXIgKipidG9wOwpAQCAtNTQ1LDcgKzU3Nyw3IEBACiAJICA7CiB0b3A6CXAgPSBlbmRmbjsKIAlicmVha3MgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBudW1fYnJlYWtzICogMik7Ci0JaWYgKCBicmVha3MgPT0gMCApCisJaWYgKCBicmVha3MgPT0gTlVMTCApCiAJICAgewkvKiBDb3VsZG4ndCBhbGxvY2F0ZSBicmVhayB0YWJsZSwgZ2l2ZSB1cCAqLwogCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBicmVhayB0YWJsZSFcbiIpOwogCQlmcHV0cyhidWYsIG91dCk7CkBAIC01NTcsNyArNTg5LDcgQEAKIAlkbwogCSAgIHsJaW50IGxldmVsID0gMDsKIAkJY2hhciAqbHAgPSBOVUxMOwotCQljaGFyICpycDsKKwkJY2hhciAqcnAgPSBOVUxMOwogCQljaGFyICplbmQgPSBOVUxMOwogCiAJCWlmICggYnAgPj0gYnRvcCApCkBAIC01ODQsMTQgKzYxNiwxOCBAQAogCQkJCWVsc2UgcnAgPSBwOwogCQkJCWJyZWFrOwogCQkJICAgY2FzZSAnLyc6Ci0JCQkJcCA9IHNraXBzcGFjZShwLCAxKSAtIDE7CisJCQkJaWYgKHBbMV0gPT0gJyonKQorCQkJCSAgICBwID0gc2tpcHNwYWNlKHAsIDEpIC0gMTsKIAkJCQlicmVhazsKKwkJCSAgIGNhc2UgJyInOgorCQkJICAgICAgIHAgPSBzY2Fuc3RyaW5nKHAsIDEpIC0gMTsKKwkJCSAgICAgICBicmVhazsKIAkJCSAgIGRlZmF1bHQ6CiAJCQkJOwogCQkJICAgfQogCQkgICB9CiAJCS8qIEVyYXNlIGFueSBlbWJlZGRlZCBwcm90b3R5cGUgcGFyYW1ldGVycy4gKi8KLQkJaWYgKCBscCApCisJCWlmICggbHAgJiYgcnAgKQogCQkgIHdyaXRlYmxhbmtzKGxwICsgMSwgcnApOwogCQlwLS07CQkJLyogYmFjayB1cCBvdmVyIHRlcm1pbmF0b3IgKi8KIAkJLyogRmluZCB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZC4gKi8KQEAgLTYwNyw5ICs2NDMsMTkgQEAKIAkJCQl3aGlsZSAoIGxldmVsICkKIAkJCQkgc3dpdGNoICggKi0tcCApCiAJCQkJICAgewotCQkJCSAgIGNhc2UgJ10nOiBjYXNlICcpJzogbGV2ZWwrKzsgYnJlYWs7Ci0JCQkJICAgY2FzZSAnWyc6IGNhc2UgJygnOiBsZXZlbC0tOyBicmVhazsKLQkJCQkgICBjYXNlICcvJzogcCA9IHNraXBzcGFjZShwLCAtMSkgKyAxOyBicmVhazsKKwkJCQkgICBjYXNlICddJzogY2FzZSAnKSc6CisJCQkJICAgICAgIGxldmVsKys7CisJCQkJICAgICAgIGJyZWFrOworCQkJCSAgIGNhc2UgJ1snOiBjYXNlICcoJzoKKwkJCQkgICAgICAgbGV2ZWwtLTsKKwkJCQkgICAgICAgYnJlYWs7CisJCQkJICAgY2FzZSAnLyc6CisJCQkJICAgICAgIGlmIChwID4gYnVmICYmIHBbLTFdID09ICcqJykKKwkJCQkJICAgcCA9IHNraXBzcGFjZShwLCAtMSkgKyAxOworCQkJCSAgICAgICBicmVhazsKKwkJCQkgICBjYXNlICciJzoKKwkJCQkgICAgICAgcCA9IHNjYW5zdHJpbmcocCwgLTEpICsgMTsKKwkJCQkgICAgICAgYnJlYWs7CiAJCQkJICAgZGVmYXVsdDogOwogCQkJCSAgIH0KIAkJCSAgIH0KZGlmZiAtLWdpdCBhL2NkanBlZy5oIGIvY2RqcGVnLmgKaW5kZXggMmIzODdiNi4uZWQwMjRhYyAxMDA2NDQKLS0tIGEvY2RqcGVnLmgKKysrIGIvY2RqcGVnLmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogI2RlZmluZSBqaW5pdF93cml0ZV90YXJnYQlqSVdyVGFyZ2EKICNkZWZpbmUgcmVhZF9xdWFudF90YWJsZXMJUmRRVGFibGVzCiAjZGVmaW5lIHJlYWRfc2Nhbl9zY3JpcHQJUmRTY25TY3JpcHQKKyNkZWZpbmUgc2V0X3F1YWxpdHlfcmF0aW5ncyAgICAgU2V0UVJhdGVzCiAjZGVmaW5lIHNldF9xdWFudF9zbG90cwkJU2V0UVNsb3RzCiAjZGVmaW5lIHNldF9zYW1wbGVfZmFjdG9ycwlTZXRTRmFjdHMKICNkZWZpbmUgcmVhZF9jb2xvcl9tYXAJCVJkQ01hcApAQCAtMTMxLDggKzEzMiwxMCBAQAogLyogY2pwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRzd2l0Y2guYykgKi8KIAogRVhURVJOKGJvb2xlYW4pIHJlYWRfcXVhbnRfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKLQkJCQkgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOworCQkJCSAgICAgICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7CiBFWFRFUk4oYm9vbGVhbikgcmVhZF9zY2FuX3NjcmlwdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICogZmlsZW5hbWUpKTsKK0VYVEVSTihib29sZWFuKSBzZXRfcXVhbGl0eV9yYXRpbmdzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZywKKwkJCQkJIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKIEVYVEVSTihib29sZWFuKSBzZXRfcXVhbnRfc2xvdHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqYXJnKSk7CiBFWFRFUk4oYm9vbGVhbikgc2V0X3NhbXBsZV9mYWN0b3JzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykpOwogCmRpZmYgLS1naXQgYS9jaGFuZ2UubG9nIGIvY2hhbmdlLmxvZwppbmRleCA3NDEwMmMwLi4wNGYxNjg4IDEwMDY0NAotLS0gYS9jaGFuZ2UubG9nCisrKyBiL2NoYW5nZS5sb2cKQEAgLTEsNiArMSw1OSBAQAogQ0hBTkdFIExPRyBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKIAogCitWZXJzaW9uIDcgIDI3LUp1bi0yMDA5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05ldyBzY2FsZWQgRENUcyBpbXBsZW1lbnRlZC4KK2RqcGVnIG5vdyBzdXBwb3J0cyBzY2FsaW5ncyBOLzggd2l0aCBhbGwgTiBmcm9tIDEgdG8gMTYuCitjanBlZyBub3cgc3VwcG9ydHMgc2NhbGluZ3MgOC9OIHdpdGggYWxsIE4gZnJvbSAxIHRvIDE2LgorU2NhbGVkIERDVHMgd2l0aCBzaXplIGxhcmdlciB0aGFuIDggYXJlIG5vdyBhbHNvIHVzZWQgZm9yIHJlc29sdmluZyB0aGUKK2NvbW1vbiAyeDIgY2hyb21hIHN1YnNhbXBsaW5nIGNhc2Ugd2l0aG91dCBhZGRpdGlvbmFsIHNwYXRpYWwgcmVzYW1wbGluZy4KK1NlcGFyYXRlIHNwYXRpYWwgcmVzYW1wbGluZyBmb3IgdGhvc2Uga2luZCBvZiBmaWxlcyBpcyBub3cgb25seSBuZWNlc3NhcnkKK2ZvciBOPjggc2NhbGluZyBjYXNlcy4KK0Z1cnRoZXJtb3JlLCBzZXBhcmF0ZSBzY2FsZWQgRENUIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGRpcmVjdCByZXNvbHZpbmcKK29mIHRoZSBjb21tb24gYXN5bW1ldHJpYyBzdWJzYW1wbGluZyBjYXNlcyAoMngxIGFuZCAxeDIpIHdpdGhvdXQgYWRkaXRpb25hbAorc3BhdGlhbCByZXNhbXBsaW5nLgorCitjanBlZyAtcXVhbGl0eSBvcHRpb24gaGFzIGJlZW4gZXh0ZW5kZWQgZm9yIHN1cHBvcnQgb2Ygc2VwYXJhdGUgcXVhbGl0eQorc2V0dGluZ3MgZm9yIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgKG9yIGluIGdlbmVyYWwsIGZvciBldmVyeSBwcm92aWRlZAorcXVhbnRpemF0aW9uIHRhYmxlIHNsb3QpLgorTmV3IEFQSSBmdW5jdGlvbiBqcGVnX2RlZmF1bHRfcXRhYmxlcygpIGFuZCBxX3NjYWxlX2ZhY3RvciBhcnJheSBpbiBsaWJyYXJ5LgorCitBZGRlZCAtbm9zbW9vdGggb3B0aW9uIHRvIGNqcGVnLCBjb21wbGVtZW50YXJ5IHRvIGRqcGVnLgorTmV3IHZhcmlhYmxlICJkb19mYW5jeV9kb3duc2FtcGxpbmciIGluIGxpYnJhcnksIGNvbXBsZW1lbnQgdG8gZmFuY3kKK3Vwc2FtcGxpbmcuICBGYW5jeSB1cHNhbXBsaW5nIG5vdyB1c2VzIGRpcmVjdCBEQ1Qgc2NhbGluZyB3aXRoIHNpemVzCitsYXJnZXIgdGhhbiA4LiAgVGhlIG9sZCBtZXRob2QgaXMgbm90IHJldmVyc2libGUgYW5kIGhhcyBiZWVuIHJlbW92ZWQuCisKK1N1cHBvcnQgYXJpdGhtZXRpYyBlbnRyb3B5IGVuY29kaW5nIGFuZCBkZWNvZGluZy4KK0FkZGVkIGZpbGVzIGphcmljb20uYywgamNhcml0aC5jLCBqZGFyaXRoLmMuCisKK1N0cmFpZ2h0ZW4gdGhlIGZpbGUgc3RydWN0dXJlOgorUmVtb3ZlZCBmaWxlcyBqaWRjdHJlZC5jLCBqY3BodWZmLmMsIGpjaHVmZi5oLCBqZHBodWZmLmMsIGpkaHVmZi5oLgorCitqcGVndHJhbiBoYXMgYSBuZXcgImxvc3NsZXNzIiBjcm9wcGluZyBmZWF0dXJlLgorCitJbXBsZW1lbnQgLXBlcmZlY3Qgb3B0aW9uIGluIGpwZWd0cmFuLCBuZXcgQVBJIGZ1bmN0aW9uCitqdHJhbnNmb3JtX3BlcmZlY3RfdHJhbnNmb3JtKCkgaW4gdHJhbnN1cHAuIChEUCAyMDRfcGVyZmVjdC5kcGF0Y2gpCisKK0JldHRlciBlcnJvciBtZXNzYWdlcyBmb3IganBlZ3RyYW4gZm9wZW4gZmFpbHVyZS4KKyhEUCAyMDNfanBlZ3RyYW5fZXJybXNnLmRwYXRjaCkKKworRml4IGJ5dGUgb3JkZXIgaXNzdWUgd2l0aCAxNmJpdCBQUE0vUEdNIGZpbGVzIGluIHJkcHBtLmMvd3JwcG0uYzoKK2FjY29yZGluZyB0byBOZXRwYm0sIHRoZSBkZSBmYWN0byBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUE5NIGZvcm1hdHMsCit0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIGZpcnN0LiAoRFAgMjAzX3JkcHBtLmRwYXRjaCkKKworQWRkIC1yYXcgb3B0aW9uIHRvIHJkanBnY29tIG5vdCB0byBtYW5nbGUgdGhlIG91dHB1dC4KKyhEUCAyMDVfcmRqcGdjb21fcmF3LmRwYXRjaCkKKworTWFrZSByZGpwZ2NvbSBsb2NhbGUgYXdhcmUuIChEUCAyMDFfcmRqcGdjb21fbG9jYWxlLmRwYXRjaCkKKworQWRkIGV4dGVybiAiQyIgdG8ganBlZ2xpYi5oLgorVGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gcHV0IGV4dGVybiAiQyIgeyAuLi4gfSBhcm91bmQgI2luY2x1ZGUgImpwZWdsaWIuaCIKK2luIHlvdXIgQysrIGFwcGxpY2F0aW9uLiAgRGVmaW5pbmcgdGhlIHN5bWJvbCBET05UX1VTRV9FWFRFUk5fQyBpbiB0aGUKK2NvbmZpZ3VyYXRpb24gcHJldmVudHMgdGhpcy4gKERQIDIwMl9qcGVnbGliLmhfYysrLmRwYXRjaCkKKworCiBWZXJzaW9uIDZiICAyNy1NYXItMTk5OAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvY2pwZWcuMSBiL2NqcGVnLjEKaW5kZXggZDE3NWE5Ni4uYjg3NzNkYyAxMDA2NDQKLS0tIGEvY2pwZWcuMQorKysgYi9janBlZy4xCkBAIC0xLDQgKzEsNCBAQAotLlRIIENKUEVHIDEgIjIwIE1hcmNoIDE5OTgiCisuVEggQ0pQRUcgMSAiMTAgSnVuZSAyMDA5IgogLlNIIE5BTUUKIGNqcGVnIFwtIGNvbXByZXNzIGFuIGltYWdlIGZpbGUgdG8gYSBKUEVHIGZpbGUKIC5TSCBTWU5PUFNJUwpAQCAtMzYsNyArMzYsNyBAQAogLlBQCiBUaGUgYmFzaWMgc3dpdGNoZXMgYXJlOgogLlRQCi0uQkkgXC1xdWFsaXR5ICIgTiIKKy5CSSBcLXF1YWxpdHkgIiBOWywuLi5dIgogU2NhbGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBhZGp1c3QgaW1hZ2UgcXVhbGl0eS4gIFF1YWxpdHkgaXMgMCAod29yc3QpIHRvCiAxMDAgKGJlc3QpOyBkZWZhdWx0IGlzIDc1LiAgKFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKIC5UUApAQCAtNjIsNiArNjIsMTAgQEAKIC5CIFwtcHJvZ3Jlc3NpdmUKIENyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgKHNlZSBiZWxvdykuCiAuVFAKKy5CSSBcLXNjYWxlICIgTS9OIgorU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZhY3RvciBNL04uICBDdXJyZW50bHkgc3VwcG9ydGVkIHNjYWxlIGZhY3RvcnMgYXJlCis4L04gd2l0aCBhbGwgTiBmcm9tIDEgdG8gMTYuCisuVFAKIC5CIFwtdGFyZ2EKIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAgVGFyZ2EgZmlsZXMgdGhhdCBjb250YWluIGFuICJpZGVudGlmaWNhdGlvbiIKIGZpZWxkIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplZCBieQpAQCAtMTA5LDYgKzExMywzNCBAQAogaWYgeW91IG5lZWQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYXQgbG93IHF1YWxpdHkgdmFsdWVzLikKIC5QUAogVGhlCisuQiBcLXF1YWxpdHkKK29wdGlvbiBoYXMgYmVlbiBleHRlbmRlZCBpbiBJSkcgdmVyc2lvbiA3IGZvciBzdXBwb3J0IG9mIHNlcGFyYXRlIHF1YWxpdHkKK3NldHRpbmdzIGZvciBsdW1pbmFuY2UgYW5kIGNocm9taW5hbmNlIChvciBpbiBnZW5lcmFsLCBmb3IgZXZlcnkgcHJvdmlkZWQKK3F1YW50aXphdGlvbiB0YWJsZSBzbG90KS4gIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgZm9yIGhpZ2gtcXVhbGl0eQorYXBwbGljYXRpb25zIHdoaWNoIGNhbm5vdCBhY2NlcHQgdGhlIGRhbWFnZSBvZiBjb2xvciBkYXRhIGJ5IGNvYXJzZQorc3Vic2FtcGxpbmcgc2V0dGluZ3MuICBZb3UgY2FuIG5vdyBlYXNpbHkgcmVkdWNlIHRoZSBjb2xvciBkYXRhIGFtb3VudCBtb3JlCitzbW9vdGhseSB3aXRoIGZpbmVyIGNvbnRyb2wgd2l0aG91dCBzZXBhcmF0ZSBzdWJzYW1wbGluZy4gIFRoZSByZXN1bHRpbmcgZmlsZQoraXMgZnVsbHkgY29tcGxpYW50IHdpdGggc3RhbmRhcmQgSlBFRyBkZWNvZGVycy4KK05vdGUgdGhhdCB0aGUKKy5CIFwtcXVhbGl0eQorcmF0aW5ncyByZWZlciB0byB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIHNsb3RzLCBhbmQgdGhhdCB0aGUgbGFzdCB2YWx1ZSBpcworcmVwbGljYXRlZCBpZiB0aGVyZSBhcmUgbW9yZSBxLXRhYmxlIHNsb3RzIHRoYW4gcGFyYW1ldGVycy4gIFRoZSBkZWZhdWx0CitxLXRhYmxlIHNsb3RzIGFyZSAwIGZvciBsdW1pbmFuY2UgYW5kIDEgZm9yIGNocm9taW5hbmNlIHdpdGggZGVmYXVsdCB0YWJsZXMgYXMKK2dpdmVuIGluIHRoZSBKUEVHIHN0YW5kYXJkLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBiZWhhdmlvdXIgaW4gY2FzZQordGhhdCBvbmx5IG9uZSBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIHdoaWNoIGlzIHRoZW4gdXNlZCBmb3IgYm90aCBsdW1pbmFuY2UgYW5kCitjaHJvbWluYW5jZSAoc2xvdHMgMCBhbmQgMSkuICBNb3JlIG9yIGN1c3RvbSBxdWFudGl6YXRpb24gdGFibGVzIGNhbiBiZSBzZXQKK3dpdGgKKy5CIFwtcXRhYmxlcworYW5kIGFzc2lnbmVkIHRvIGNvbXBvbmVudHMgd2l0aAorLkIgXC1xc2xvdHMKK3BhcmFtZXRlciAoc2VlIHRoZSAid2l6YXJkIiBzd2l0Y2hlcyBiZWxvdykuCisuQiBDYXV0aW9uOgorWW91IG11c3QgZXhwbGljaXRlbHkgYWRkCisuQkkgXC1zYW1wbGUgIiAxeDEiCitmb3IgZWZmaWNpZW50IHNlcGFyYXRlIGNvbG9yCitxdWFsaXR5IHNlbGVjdGlvbiwgc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgdXNlZCBieSBsaWJyYXJ5IGlzIDJ4MiEKKy5QUAorVGhlCiAuQiBcLXByb2dyZXNzaXZlCiBzd2l0Y2ggY3JlYXRlcyBhICJwcm9ncmVzc2l2ZSBKUEVHIiBmaWxlLiAgSW4gdGhpcyB0eXBlIG9mIEpQRUcgZmlsZSwgdGhlIGRhdGEKIGlzIHN0b3JlZCBpbiBtdWx0aXBsZSBzY2FucyBvZiBpbmNyZWFzaW5nIHF1YWxpdHkuICBJZiB0aGUgZmlsZSBpcyBiZWluZwpAQCAtMTE3LDkgKzE0OSw2IEBACiBkaXNwbGF5IHdpdGggZWFjaCBzdWJzZXF1ZW50IHNjYW4uICBUaGUgZmluYWwgaW1hZ2UgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGEKIHN0YW5kYXJkIEpQRUcgZmlsZSBvZiB0aGUgc2FtZSBxdWFsaXR5IHNldHRpbmcsIGFuZCB0aGUgdG90YWwgZmlsZSBzaXplIGlzCiBhYm91dCB0aGUgc2FtZSAtLS0gb2Z0ZW4gYSBsaXR0bGUgc21hbGxlci4KLS5CIENhdXRpb246Ci1wcm9ncmVzc2l2ZSBKUEVHIGlzIG5vdCB5ZXQgd2lkZWx5IGltcGxlbWVudGVkLCBzbyBtYW55IGRlY29kZXJzIHdpbGwgYmUKLXVuYWJsZSB0byB2aWV3IGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIGF0IGFsbC4KIC5QUAogU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgogLlRQCkBAIC0xMzcsNiArMTY2LDkgQEAKIG1hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4KIFRoZSBmYXN0IGludGVnZXIgbWV0aG9kIGlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCiAuVFAKKy5CIFwtbm9zbW9vdGgKK0Rvbid0IHVzZSBoaWdoLXF1YWxpdHkgZG93bnNhbXBsaW5nLgorLlRQCiAuQkkgXC1yZXN0YXJ0ICIgTiIKIEVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5IE4gTUNVIGJsb2NrcyBpZiAiQiIgaXMKIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCkBAIC0xODcsNiArMjE5LDEyIEBACiAuUFAKIFN3aXRjaGVzIGZvciB3aXphcmRzOgogLlRQCisuQiBcLWFyaXRobWV0aWMKK1VzZSBhcml0aG1ldGljIGNvZGluZy4KKy5CIENhdXRpb246Cithcml0aG1ldGljIGNvZGVkIEpQRUcgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHNvIG1hbnkgZGVjb2RlcnMgd2lsbCBiZQordW5hYmxlIHRvIHZpZXcgYW4gYXJpdGhtZXRpYyBjb2RlZCBKUEVHIGZpbGUgYXQgYWxsLgorLlRQCiAuQiBcLWJhc2VsaW5lCiBGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkLiAgVGhpcyBjbGFtcHMKIHF1YW50aXphdGlvbiB2YWx1ZXMgdG8gOCBiaXRzIGV2ZW4gYXQgbG93IHF1YWxpdHkgc2V0dGluZ3MuICAoVGhpcyBzd2l0Y2ggaXMKQEAgLTIxMSw3ICsyNDksNyBAQAogLlBQCiBUaGUgIndpemFyZCIgc3dpdGNoZXMgYXJlIGludGVuZGVkIGZvciBleHBlcmltZW50YXRpb24gd2l0aCBKUEVHLiAgSWYgeW91CiBkb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgXGZCZG9uJ3QgdXNlIHRoZW1cZlIuICBUaGVzZSBzd2l0Y2hlcyBhcmUKLWRvY3VtZW50ZWQgZnVydGhlciBpbiB0aGUgZmlsZSB3aXphcmQuZG9jLgorZG9jdW1lbnRlZCBmdXJ0aGVyIGluIHRoZSBmaWxlIHdpemFyZC50eHQuCiAuU0ggRVhBTVBMRVMKIC5MUAogVGhpcyBleGFtcGxlIGNvbXByZXNzZXMgdGhlIFBQTSBmaWxlIGZvby5wcG0gd2l0aCBhIHF1YWxpdHkgZmFjdG9yIG9mCkBAIC0yNzYsMTcgKzMxNCwxMiBAQAogLlNIIEFVVEhPUgogSW5kZXBlbmRlbnQgSlBFRyBHcm91cAogLlNIIEJVR1MKLUFyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuCi0uUFAKIEdJRiBpbnB1dCBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LgotVXNlIGEgVW5pc3lzLWxpY2Vuc2VkIHByb2dyYW0gaWYgeW91IG5lZWQgdG8gcmVhZCBhIEdJRiBmaWxlLiAgKENvbnZlcnNpb24KLW9mIEdJRiBmaWxlcyB0byBKUEVHIGlzIHVzdWFsbHkgYSBiYWQgaWRlYSBhbnl3YXkuKQorKENvbnZlcnNpb24gb2YgR0lGIGZpbGVzIHRvIEpQRUcgaXMgdXN1YWxseSBhIGJhZCBpZGVhIGFueXdheS4pCiAuUFAKIE5vdCBhbGwgdmFyaWFudHMgb2YgQk1QIGFuZCBUYXJnYSBmaWxlIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KIC5QUAogVGhlCiAuQiBcLXRhcmdhCiBzd2l0Y2ggaXMgbm90IGEgYnVnLCBpdCdzIGEgZmVhdHVyZS4gIChJdCB3b3VsZCBiZSBhIGJ1ZyBpZiB0aGUgVGFyZ2EgZm9ybWF0Ci1kZXNpZ25lcnMgaGFkIG5vdCBiZWVuIGNsdWVsZXNzLikKLS5QUAotU3RpbGwgbm90IGFzIGZhc3QgYXMgd2UnZCBsaWtlLgorZGVzaWduZXJzIGhhZCBub3QgYmVlbiBjbHVlbGVzcy4pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY2pwZWcuYyBiL2NqcGVnLmMKaW5kZXggZjJhOTI5Zi4uYjlkNTdlYiAxMDA2NDQKLS0tIGEvY2pwZWcuYworKysgYi9janBlZy5jCkBAIC0yLDYgKzIsNyBAQAogICogY2pwZWcuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIE1vZGlmaWVkIDIwMDMtMjAwOCBieSBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC0xNDksNyArMTUwLDcgQEAKICNlbmRpZgogCiAgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1xdWFsaXR5IE4gICAgIENvbXByZXNzaW9uIHF1YWxpdHkgKDAuLjEwMDsgNS05NSBpcyB1c2VmdWwgcmFuZ2UpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1xdWFsaXR5IE5bLC4uLl0gICBDb21wcmVzc2lvbiBxdWFsaXR5ICgwLi4xMDA7IDUtOTUgaXMgdXNlZnVsIHJhbmdlKVxuIik7CiAgIGZwcmludGYoc3RkZXJyLCAiICAtZ3JheXNjYWxlICAgICBDcmVhdGUgbW9ub2Nocm9tZSBKUEVHIGZpbGVcbiIpOwogI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAogICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9wdGltaXplICAgICAgT3B0aW1pemUgSHVmZm1hbiB0YWJsZSAoc21hbGxlciBmaWxlLCBidXQgc2xvdyBjb21wcmVzc2lvbilcbiIpOwpAQCAtMTU3LDYgKzE1OCw5IEBACiAjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKICAgZnByaW50ZihzdGRlcnIsICIgIC1wcm9ncmVzc2l2ZSAgIENyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVcbiIpOwogI2VuZGlmCisjaWZkZWYgRENUX1NDQUxJTkdfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtc2NhbGUgTS9OICAgICBTY2FsZSBpbWFnZSBieSBmcmFjdGlvbiBNL04sIGVnLCAxLzJcbiIpOworI2VuZGlmCiAjaWZkZWYgVEFSR0FfU1VQUE9SVEVECiAgIGZwcmludGYoc3RkZXJyLCAiICAtdGFyZ2EgICAgICAgICBJbnB1dCBmaWxlIGlzIFRhcmdhIGZvcm1hdCAodXN1YWxseSBub3QgbmVlZGVkKVxuIik7CiAjZW5kaWYKQEAgLTE3Myw2ICsxNzcsNyBAQAogICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmbG9hdCAgICAgVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2Qlc1xuIiwKIAkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9GTE9BVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CiAjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ub3Ntb290aCAgICAgIERvbid0IHVzZSBoaWdoLXF1YWxpdHkgZG93bnNhbXBsaW5nXG4iKTsKICAgZnByaW50ZihzdGRlcnIsICIgIC1yZXN0YXJ0IE4gICAgIFNldCByZXN0YXJ0IGludGVydmFsIGluIHJvd3MsIG9yIGluIGJsb2NrcyB3aXRoIEJcbiIpOwogI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKICAgZnByaW50ZihzdGRlcnIsICIgIC1zbW9vdGggTiAgICAgIFNtb290aCBkaXRoZXJlZCBpbnB1dCAoTj0xLi4xMDAgaXMgc3RyZW5ndGgpXG4iKTsKQEAgLTIwOSwyMSArMjE0LDE2IEBACiB7CiAgIGludCBhcmduOwogICBjaGFyICogYXJnOwotICBpbnQgcXVhbGl0eTsJCQkvKiAtcXVhbGl0eSBwYXJhbWV0ZXIgKi8KLSAgaW50IHFfc2NhbGVfZmFjdG9yOwkJLyogc2NhbGluZyBwZXJjZW50YWdlIGZvciAtcXRhYmxlcyAqLwogICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lOwogICBib29sZWFuIHNpbXBsZV9wcm9ncmVzc2l2ZTsKKyAgY2hhciAqIHF1YWxpdHlhcmcgPSBOVUxMOwkvKiBzYXZlcyAtcXVhbGl0eSBwYXJtIGlmIGFueSAqLwogICBjaGFyICogcXRhYmxlZmlsZSA9IE5VTEw7CS8qIHNhdmVzIC1xdGFibGVzIGZpbGVuYW1lIGlmIGFueSAqLwogICBjaGFyICogcXNsb3RzYXJnID0gTlVMTDsJLyogc2F2ZXMgLXFzbG90cyBwYXJtIGlmIGFueSAqLwogICBjaGFyICogc2FtcGxlYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNhbXBsZSBwYXJtIGlmIGFueSAqLwogICBjaGFyICogc2NhbnNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2NhbnMgcGFybSBpZiBhbnkgKi8KIAogICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCi0gIC8qIE5vdGUgdGhhdCBkZWZhdWx0IC1xdWFsaXR5IGxldmVsIG5lZWQgbm90LCBhbmQgZG9lcyBub3QsCi0gICAqIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxpbmcgZm9yIGFuIGV4cGxpY2l0IC1xdGFibGVzIGFyZ3VtZW50LgotICAgKi8KLSAgcXVhbGl0eSA9IDc1OwkJCS8qIGRlZmF1bHQgLXF1YWxpdHkgdmFsdWUgKi8KLSAgcV9zY2FsZV9mYWN0b3IgPSAxMDA7CQkvKiBkZWZhdWx0IHRvIG5vIHNjYWxpbmcgZm9yIC1xdGFibGVzICovCisKICAgZm9yY2VfYmFzZWxpbmUgPSBGQUxTRTsJLyogYnkgZGVmYXVsdCwgYWxsb3cgMTYtYml0IHF1YW50aXplcnMgKi8KICAgc2ltcGxlX3Byb2dyZXNzaXZlID0gRkFMU0U7CiAgIGlzX3RhcmdhID0gRkFMU0U7CkBAIC0zMDAsNiArMzAwLDEwIEBACiAJbHZhbCAqPSAxMDAwTDsKICAgICAgIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gbHZhbCAqIDEwMDBMOwogCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJub3Ntb290aCIsIDMpKSB7CisgICAgICAvKiBTdXBwcmVzcyBmYW5jeSBkb3duc2FtcGxpbmcgKi8KKyAgICAgIGNpbmZvLT5kb19mYW5jeV9kb3duc2FtcGxpbmcgPSBGQUxTRTsKKwogICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3B0aW1pemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJvcHRpbWlzZSIsIDEpKSB7CiAgICAgICAvKiBFbmFibGUgZW50cm9weSBwYXJtIG9wdGltaXphdGlvbi4gKi8KICNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKQEAgLTMyOCwxMyArMzMyLDEwIEBACiAjZW5kaWYKIAogICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXVhbGl0eSIsIDEpKSB7Ci0gICAgICAvKiBRdWFsaXR5IGZhY3RvciAocXVhbnRpemF0aW9uIHRhYmxlIHNjYWxpbmcgZmFjdG9yKS4gKi8KKyAgICAgIC8qIFF1YWxpdHkgcmF0aW5ncyAocXVhbnRpemF0aW9uIHRhYmxlIHNjYWxpbmcgZmFjdG9ycykuICovCiAgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwogCXVzYWdlKCk7Ci0gICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZxdWFsaXR5KSAhPSAxKQotCXVzYWdlKCk7Ci0gICAgICAvKiBDaGFuZ2Ugc2NhbGUgZmFjdG9yIGluIGNhc2UgLXF0YWJsZXMgaXMgcHJlc2VudC4gKi8KLSAgICAgIHFfc2NhbGVfZmFjdG9yID0ganBlZ19xdWFsaXR5X3NjYWxpbmcocXVhbGl0eSk7CisgICAgICBxdWFsaXR5YXJnID0gYXJndlthcmduXTsKIAogICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicXNsb3RzIiwgMikpIHsKICAgICAgIC8qIFF1YW50aXphdGlvbiB0YWJsZSBzbG90IG51bWJlcnMuICovCkBAIC0zODIsNyArMzgzLDE1IEBACiAgICAgICAgKiBkZWZhdWx0IHNhbXBsaW5nIGZhY3RvcnMuCiAgICAgICAgKi8KIAotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbnMiLCAyKSkgeworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbGUiLCA0KSkgeworICAgICAgLyogU2NhbGUgdGhlIGltYWdlIGJ5IGEgZnJhY3Rpb24gTS9OLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWQvJWQiLAorCQkgJmNpbmZvLT5zY2FsZV9udW0sICZjaW5mby0+c2NhbGVfZGVub20pICE9IDIpCisJdXNhZ2UoKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbnMiLCA0KSkgewogICAgICAgLyogU2V0IHNjYW4gc2NyaXB0LiAqLwogI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAogICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KQEAgLTQyMiwxMSArNDMxLDEyIEBACiAKICAgICAvKiBTZXQgcXVhbnRpemF0aW9uIHRhYmxlcyBmb3Igc2VsZWN0ZWQgcXVhbGl0eS4gKi8KICAgICAvKiBTb21lIG9yIGFsbCBtYXkgYmUgb3ZlcnJpZGRlbiBpZiAtcXRhYmxlcyBpcyBwcmVzZW50LiAqLwotICAgIGpwZWdfc2V0X3F1YWxpdHkoY2luZm8sIHF1YWxpdHksIGZvcmNlX2Jhc2VsaW5lKTsKKyAgICBpZiAocXVhbGl0eWFyZyAhPSBOVUxMKQkvKiBwcm9jZXNzIC1xdWFsaXR5IGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISBzZXRfcXVhbGl0eV9yYXRpbmdzKGNpbmZvLCBxdWFsaXR5YXJnLCBmb3JjZV9iYXNlbGluZSkpCisJdXNhZ2UoKTsKIAogICAgIGlmIChxdGFibGVmaWxlICE9IE5VTEwpCS8qIHByb2Nlc3MgLXF0YWJsZXMgaWYgaXQgd2FzIHByZXNlbnQgKi8KLSAgICAgIGlmICghIHJlYWRfcXVhbnRfdGFibGVzKGNpbmZvLCBxdGFibGVmaWxlLAotCQkJICAgICAgcV9zY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKSkKKyAgICAgIGlmICghIHJlYWRfcXVhbnRfdGFibGVzKGNpbmZvLCBxdGFibGVmaWxlLCBmb3JjZV9iYXNlbGluZSkpCiAJdXNhZ2UoKTsKIAogICAgIGlmIChxc2xvdHNhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtcXNsb3RzIGlmIGl0IHdhcyBwcmVzZW50ICovCmRpZmYgLS1naXQgYS9ja2NvbmZpZy5jIGIvY2tjb25maWcuYwppbmRleCAzNGJhZjc5Li5lNjU4NjIzIDEwMDY0NAotLS0gYS9ja2NvbmZpZy5jCisrKyBiL2NrY29uZmlnLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogCiAgIC8qIFdyaXRlIG91dCBhbGwgdGhlIGluZm8gKi8KICAgZnByaW50ZihvdXRmaWxlLCAiLyogamNvbmZpZy5oIC0tLSBnZW5lcmF0ZWQgYnkgY2tjb25maWcuYyAqL1xuIik7Ci0gIGZwcmludGYob3V0ZmlsZSwgIi8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovXG5cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIvKiBzZWUgamNvbmZpZy50eHQgZm9yIGV4cGxhbmF0aW9ucyAqL1xuXG4iKTsKICNpZmRlZiBIQVZFX1BST1RPVFlQRVMKICAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBIQVZFX1BST1RPVFlQRVNcbiIpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2NvZGVydWxlcy5kb2MgYi9jb2RlcnVsZXMudHh0CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGNvZGVydWxlcy5kb2MKcmVuYW1lIHRvIGNvZGVydWxlcy50eHQKaW5kZXggMGFiNWQ5Yi4uMzU3OTI5ZiAxMDA2NDQKLS0tIGEvY29kZXJ1bGVzLmRvYworKysgYi9jb2RlcnVsZXMudHh0CkBAIC0xMDMsNyArMTAzLDcgQEAKIAogNC4gRG9uJ3QgdXNlIHN0YXRpYyB2YXJpYWJsZXMgZXhjZXB0IGZvciByZWFkLW9ubHkgY29uc3RhbnQgdGFibGVzLiAgVmFyaWFibGVzCiB0aGF0IHNob3VsZCBiZSBwcml2YXRlIHRvIGEgbW9kdWxlIGNhbiBiZSBwbGFjZWQgaW50byBwcml2YXRlIHN0cnVjdHVyZXMgKHNlZQotdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgZG9jdW1lbnQsIHN0cnVjdHVyZS5kb2MpLgordGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgZG9jdW1lbnQsIHN0cnVjdHVyZS50eHQpLgogCiA1LiBTb3VyY2UgZmlsZSBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCAiaiIgZm9yIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlCiBsaWJyYXJ5IHByb3Blcjsgc291cmNlIGZpbGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LCBzdWNoIGFzIGNqcGVnLmMKZGlmZiAtLWdpdCBhL2NvbmZpZy5ndWVzcyBiL2NvbmZpZy5ndWVzcwppbmRleCA0MTNlZDQxLi5kYTgzMzE0IDEwMDc1NQotLS0gYS9jb25maWcuZ3Vlc3MKKysrIGIvY29uZmlnLmd1ZXNzCkBAIC0xLDcgKzEsMTEgQEAKICMhIC9iaW4vc2gKICMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIworIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwOS0wNC0yNycKKwogIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMTQsMTU0ICsxOCwzNDMgQEAKICMKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgogIwogIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CiAjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQogIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgogIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCiAKLSMgV3JpdHRlbiBieSBQZXIgQm90aG5lciA8Ym90aG5lckBjeWdudXMuY29tPi4KLSMgVGhlIG1hc3RlciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyBhdCB0aGUgRlNGIGluIC9ob21lL2dkL2dudS9saWIuCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgorIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgogIwogIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCiAjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAogIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KICMKICMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91Ci0jIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgc3lzdGVtIHR5cGUgKGhvc3QvdGFyZ2V0IG5hbWUpLgotIwotIyBPbmx5IGEgZmV3IHN5c3RlbXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgbGlzdDsgcGxlYXNlIGFkZCBvdGhlcnMKLSMgKGJ1dCB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIGNsZWFuKS4KLSMKKyMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKzIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOyBzZXRfY2NfZm9yX2J1aWxkPSA7JwogCiAjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDgvMjQvOTQuKQorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCiBpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgogCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAogZmkKIAogVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCiBVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCiBVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KIAotdHJhcCAncm0gLWYgZHVtbXkuYyBkdW1teS5vIGR1bW15OyBleGl0IDEnIDEgMiAxNQotCiAjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCiAKIGNhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKICAgICBhbHBoYTpPU0YxOio6KikKLQlpZiB0ZXN0ICRVTkFNRV9SRUxFQVNFID0gIlY0LjAiOyB0aGVuCisJY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgorCSo0LjApCiAJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCi0JZmkKKwkJOzsKKwkqNS4qKQorCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KIAkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KIAkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgogCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgogCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgotCWNhdCA8PEVPRiA+ZHVtbXkucwotCS5nbG9ibCBtYWluCi0JLmVudCBtYWluCi1tYWluOgotCS5mcmFtZSBcJDMwLDAsXCQyNiwwCi0JLnByb2xvZ3VlIDAKLQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAotCWxkYSBcJDIsMjU5Ci0JLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0Jc3JsIFwkMSw4LFwkMgotCXNsbCBcJDIsMixcJDIKLQlzbGwgXCQwLDMsXCQwCi0JYWRkbCBcJDEsXCQwLFwkMAotCWFkZGwgXCQyLFwkMCxcJDAKLQlyZXQgXCQzMSwoXCQyNiksMQotCS5lbmQgbWFpbgotRU9GCi0JJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCS4vZHVtbXkKLQkJY2FzZSAiJD8iIGluCi0JCQk3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxNSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMTQpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkxNikKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQllc2FjCi0JZmkKLQlybSAtZiBkdW1teS5zIGR1bW15Ci0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyIFtbQS1aXV0gW1thLXpdXWAKLQlleGl0IDAgOzsKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlleGl0IDs7CisgICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCisJIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/CisJZWNobyBhbHBoYS1wYy1pbnRlcml4CisJZXhpdCA7OwogICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKIAllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKLQllY2hvIG02OGstY2JtLXN5c3Y0Ci0JZXhpdCAwOzsKLSAgICBhbWlnYTpOZXRCU0Q6KjoqKQotICAgICAgZWNobyBtNjhrLWNibS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0gICAgICBleGl0IDAgOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzY0Ok9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwczY0ZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaGttaXBzOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG1heDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwcy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgOzsKKyAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKKwlleGl0IDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCA7OworICAgICo6T1MvMzkwOio6KikKKwllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCisJZXhpdCA7OworICAgICo6ei9WTToqOiopCisJZWNobyBzMzkwLWlibS16dm1vZQorCWV4aXQgOzsKKyAgICAqOk9TNDAwOio6KikKKyAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgOzsKICAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCiAJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMDs7Ci0gICAgYXJtMzI6TmV0QlNEOio6KikKLQllY2hvIGFybS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAotCWV4aXQgMCA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqKQorCWV4aXQgOzsKKyAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKKwllY2hvIGFybS11bmtub3duLXJpc2NvcworCWV4aXQgOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQogCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKLQlleGl0IDA7OwotICAgIFB5cmFtaWQqOk9TeCo6KjoqfE1JUyo6T1N4KjoqOiopCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQogCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCiAJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgogCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MwogCWVsc2UKIAkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCiAJZmkKLQlleGl0IDAgOzsKLSAgICBOSUxFOio6KjpkY29zeCkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQogCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKICAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQogCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgaTg2cGM6U3VuT1M6NS4qOiopCi0JZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlTVU5fQVJDSD0iaTM4NiIKKwkjIElmIHRoZXJlIGlzIGEgY29tcGlsZXIsIHNlZSBpZiBpdCBpcyBjb25maWd1cmVkIGZvciA2NC1iaXQgb2JqZWN0cy4KKwkjIE5vdGUgdGhhdCB0aGUgU3VuIGNjIGRvZXMgbm90IHR1cm4gX19MUDY0X18gaW50byAxIGxpa2UgZ2NjIGRvZXMuCisJIyBUaGlzIHRlc3Qgd29ya3MgZm9yIGJvdGggY29tcGlsZXJzLgorCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fYW1kNjQnOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAorCQkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQlncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCVNVTl9BUkNIPSJ4ODZfNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7U1VOX0FSQ0h9LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OwogICAgIHN1bjQqOlN1bk9TOjYqOiopCiAJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKIAkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAogCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCiAJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgc3VuNCo6U3VuT1M6KjoqKQogCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KIAkgICAgU2VyaWVzKnxTNCopCkBAIC0xNzAsMTIgKzM2MywxMiBAQAogCWVzYWMKIAkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCiAJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgc3VuMyo6U3VuT1M6KjoqKQogCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoaGVhZCAtMSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAogCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKIAljYXNlICJgL2Jpbi9hcmNoYCIgaW4KIAkgICAgc3VuMykKQEAgLTE4NSw1MiArMzc4LDYzIEBACiAJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQogCQk7OwogCWVzYWMKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgYXVzaHA6U3VuT1M6KjoqKQogCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1hdGFyaS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXRhcmkqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc3VuMyo6TmV0QlNEOio6KikKLQllY2hvIG02OGstc3VuLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zKjpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1hYzY4azpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTY4azpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKICAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQogCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBSSVNDKjpNYWNoOio6KikKIAllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIFJJU0MqOlVMVFJJWDoqOiopCiAJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIFZBWCo6VUxUUklYKjoqOiopCiAJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqKQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKIAllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCi0JaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgeworCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCiAJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQogCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCiAJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CkBAIC0yNDUsNjIgKzQ0OSw4MyBAQAogCSAgZXhpdCAoLTEpOwogCX0KIEVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgXAotCSAgJiYgLi9kdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KIAllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CiAgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKIAllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBtODhrOkNYL1VYOjcqOiopCiAJZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBtODhrOio6NCo6UjQqKQogCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBtODhrOio6Myo6UjMqKQogCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBBVmlpT046ZGd1eDoqOiopCiAgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCiAgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0gICAgICAgIGlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgLW8gJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXSA7IHRoZW4KLQlpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBcCi0JICAgICAtbyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0gOyB0aGVuCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KIAkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQorCSAgICBlbHNlCiAJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CiAJZmkKLSAgICAgICAgZWxzZSBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZmkKLSAJZXhpdCAwIDs7CisgCWV4aXQgOzsKICAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQogCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIE04OCo6KjpSMyo6KikKIAkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCiAJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQogCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKIAllY2hvIG02OGstdGVrdHJvbml4LWJzZAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOklSSVgqOio6KikKIAllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KLQllY2hvIHJvbXAtaWJtLWFpeCAgICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKLQlleGl0IDAgOzsgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJwotICAgIGk/ODY6QUlYOio6KikKKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKyAgICBpKjg2OkFJWDoqOiopCiAJZWNobyBpMzg2LWlibS1haXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgOzsKICAgICAqOkFJWDoyOjMpCiAJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCXNlZCAncy9eCQkvLycgPDwgRU9GID5kdW1teS5jCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCiAJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CiAKIAkJbWFpbigpCkBAIC0zMTEsMTcgKzUzNiwyMSBAQAogCQkJZXhpdCgwKTsKIAkJCX0KIEVPRgotCQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQkJcm0gLWYgZHVtbXkuYyBkdW1teQotCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKKwkJdGhlbgorCQkJZWNobyAiJFNZU1RFTV9OQU1FIgorCQllbHNlCisJCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwkJZmkKIAllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgogCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKIAllbHNlCiAJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKIAlmaQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6NCkKLQlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FSGwgcHJvYzAgfCBncmVwIFBPV0VSID4vZGV2L251bGwgMj4mMTsgdGhlbgorCWV4aXQgOzsKKyAgICAqOkFJWDoqOls0NTZdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgogCQlJQk1fQVJDSD1yczYwMDAKIAllbHNlCiAJCUlCTV9BUkNIPXBvd2VycGMKQEAgLTMyOSw0MyArNTU4LDEyMCBAQAogCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgogCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAogCWVsc2UKLQkJSUJNX1JFVj00LiR7VU5BTUVfUkVMRUFTRX0KKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KIAlmaQogCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpBSVg6KjoqKQogCWVjaG8gcnM2MDAwLWlibS1haXgKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCiAJZWNobyByb21wLWlibS1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgTmV0QlNEIGFuZAorCWV4aXQgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgQlNEIGFuZAogCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCiAgICAgKjpCT1NYOio6KikKIAllY2hvIHJzNjAwMC1idWxsLWJvc3gKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKIAllY2hvIG02OGstYnVsbC1zeXN2MwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCiAJZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQogCWVjaG8gbTY4ay1ocC1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNDc4XT8/OkhQLVVYOio6KikKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAogCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCiAJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OwogCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7Ci0JICAgIDkwMDAvNz8/IHwgOTAwMC84P1sxNjc5XSApIEhQX0FSQ0g9aHBwYTEuMSA7OwotCSAgICA5MDAwLzg/PyApICAgICAgICAgICAgSFBfQVJDSD1ocHBhMS4wIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKIAllc2FjCi0JSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgX19MUDY0X18gPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQogCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKICAgICAzMDUwKjpISS1VWDoqOiopCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+ZHVtbXkuYworCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwogCSNpbmNsdWRlIDx1bmlzdGQuaD4KIAlpbnQKIAltYWluICgpCkBAIC0zOTAsMzI0ICs2OTYsNTA0IEBACiAJICBleGl0ICgwKTsKIAl9CiBFT0YKLQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQlybSAtZiBkdW1teS5jIGR1bW15CisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CiAJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCiAJZWNobyBocHBhMS4xLWhwLWJzZAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQogCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgOzsKICAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKIAllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGhwOD8/Ok9TRjE6KjoqKQogCWVjaG8gaHBwYTEuMC1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBpPzg2Ok9TRjE6KjoqKQorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQogCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KIAkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCiAJZWxzZQogCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCiAJZmkKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQogCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQogCWVjaG8gYzEtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgZXhpdCA7OwogICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCiAJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCiAJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCiAJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKIAlmaQotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgZXhpdCA7OwogICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKIAllY2hvIGMzNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CiAgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQogCWVjaG8gYzM4LWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7CisgICAgICAgIGV4aXQgOzsKICAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQogCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlgtTVA6KjoqOiopCi0JZWNobyB4bXAtY3JheS11bmljb3MKLSAgICAgICAgZXhpdCAwIDs7CisgICAgICAgIGV4aXQgOzsKICAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CiAgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQogCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAogCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAotCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovCi0JZXhpdCAwIDs7CisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CiAgICAgQ1JBWSpUUzoqOio6KikKLQllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZLTI6KjoqOiopCi0JZWNobyBjcmF5Mi1jcmF5LXVuaWNvcwotICAgICAgICBleGl0IDAgOzsKLSAgICBGMzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciBbQS1aXSBbYS16XSB8IHNlZCAtZSAncy9cLy8vJ2AKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlQzRToqOio6KikKKwllY2hvIGFscGhhZXY1LWNyYXktdW5pY29zbWske1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgRjMwWzAxXTpVTklYX1N5c3RlbV9WOio6KiB8IEY3MDA6VU5JWF9TeXN0ZW1fVjoqOiopCisJRlVKSVRTVV9QUk9DPWB1bmFtZSAtbSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAogICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAotICAgICAgICBlY2hvICJmMzAwLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgRjMwMTpVTklYX1N5c3RlbV9WOio6KikKLSAgICAgICBlY2hvIGYzMDEtZnVqaXRzdS11eHB2YGVjaG8gJFVOQU1FX1JFTEVBU0UgfCBzZWQgJ3MvIC4qLy8nYAotICAgICAgIGV4aXQgMCA7OwotICAgIGhwM1swLTldWzA1XTpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1ocC1uZXRic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBpPzg2OkJTRC8zODY6KjoqIHwgKjpCU0QvT1M6KjoqKQorICAgICAgICBlY2hvICIke0ZVSklUU1VfUFJPQ30tZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorICAgICAgICBleGl0IDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCiAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OworICAgIHNwYXJjKjpCU0QvT1M6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CiAgICAgKjpGcmVlQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAotCWV4aXQgMCA7OwotICAgICo6TmV0QlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9wZW5ic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKLQlleGl0IDAgOzsKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgcGM5OCkKKwkJZWNobyBpMzg2LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgYW1kNjQpCisJCWVjaG8geDg2XzY0LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwkgICAgKikKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AgOzsKKwllc2FjCisJZXhpdCA7OwogICAgIGkqOkNZR1dJTio6KikKLQllY2hvIGkzODYtcGMtY3lnd2luMzIKLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvIGkzODYtcGMtbWluZ3czMgotCWV4aXQgMCA7OworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDs7CisgICAgKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisgICAgCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCA7OworICAgICo6SW50ZXJpeCo6WzM0NTZdKikKKyAgICAJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHg4NikKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgRU02NFQgfCBhdXRoZW50aWNhbWQgfCBnZW51aW5laW50ZWwpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBJQTY0KQorCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJZXNhYyA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgOzsKKyAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKKwkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/CisJZWNobyBpNTg2LXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgaSo6VVdJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgorCWV4aXQgOzsKKyAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKICAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4zMgotCWV4aXQgMCA7OworCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OwogICAgIHByZXAqOlN1bk9TOjUuKjoqKQogCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KIAllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDAgOzsKLSAgICAqOkxpbnV4Oio6KikKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlpZiBlY2hvIF9fQVJNX0VBQklfXyB8ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCBcCisJICAgIHwgZ3JlcCAtcSBfX0FSTV9FQUJJX18KKwl0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251ZWFiaQorCWZpCisJZXhpdCA7OworICAgIGF2cjMyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzdjMyOkxpbnV4Oio6KikKKwllY2hvIGNyaXN2MzItYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgZnJ2OkxpbnV4Oio6KikKKyAgICAJZWNobyBmcnYtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG0zMnIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTY4KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG1pcHM6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwcworCSN1bmRlZiBtaXBzZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHMKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKKwkgICAgL15DUFUveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzNjQKKwkjdW5kZWYgbWlwczY0ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzNjRlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwczY0CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsICJgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IHNlZCAtbiAnCisJICAgIC9eQ1BVL3sKKwkJczogOjpnCisJCXAKKwkgICAgfSdgIgorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgeyBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiOyBleGl0OyB9CisJOzsKKyAgICBvcjMyOkxpbnV4Oio6KikKKwllY2hvIG9yMzItdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcHBjNjQ6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgOzsKKyAgICBwYWRyZTpMaW51eDoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OworCWVzYWMKKwlleGl0IDs7CisgICAgcGFyaXNjNjQ6TGludXg6KjoqIHwgaHBwYTY0OkxpbnV4Oio6KikKKwllY2hvIGhwcGE2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNoKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB2YXg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251CisJZXhpdCA7OworICAgIHg4Nl82NDpMaW51eDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeHRlbnNhKjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKIAkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4KLQlsZF9oZWxwX3N0cmluZz1gbGQgLS1oZWxwIDI+JjFgCi0JbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnM9YGVjaG8gJGxkX2hlbHBfc3RyaW5nIFwKLQkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgZW11bGF0aW9uczovIWQKKwkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuIGNkIHRvIHRoZSByb290IGRpcmVjdG9yeSB0byBwcmV2ZW50CisJIyBwcm9ibGVtcyB3aXRoIG90aGVyIHByb2dyYW1zIG9yIGRpcmVjdG9yaWVzIGNhbGxlZCBgbGQnIGluIHRoZSBwYXRoLgorCSMgU2V0IExDX0FMTD1DIHRvIGVuc3VyZSBsZCBvdXRwdXRzIG1lc3NhZ2VzIGluIEVuZ2xpc2guCisJbGRfc3VwcG9ydGVkX3RhcmdldHM9YGNkIC87IExDX0FMTD1DIGxkIC0taGVscCAyPiYxIFwKKwkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgdGFyZ2V0czovIWQKIAkJCQkgICAgcy9bIAldWyAJXSovIC9nCi0JCQkJICAgIHMvLipzdXBwb3J0ZWQgZW11bGF0aW9uczogKi8vCisJCQkJICAgIHMvLipzdXBwb3J0ZWQgdGFyZ2V0czogKi8vCiAJCQkJICAgIHMvIC4qLy8KIAkJCQkgICAgcCdgCi0gICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucyIgaW4KLQkgIGk/ODZsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIgICAgICA7IGV4aXQgMCA7OwotCSAgaT84NmNvZmYpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIiAgICAgIDsgZXhpdCAwIDs7Ci0JICBzcGFyY2xpbnV4KSBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIG02OGtsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgZWxmMzJwcGMpICAgZWNobyAicG93ZXJwYy11bmtub3duLWxpbnV4LWdudSIgICAgICAgICAgICAgIDsgZXhpdCAwIDs7CisgICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfdGFyZ2V0cyIgaW4KKwkgIGVsZjMyLWkzODYpCisJCVRFTlRBVElWRT0iJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnUiCisJCTs7CisJICBhLm91dC1pMzg2LWxpbnV4KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiCisJCWV4aXQgOzsKKwkgICIiKQorCQkjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkgb3IKKwkJIyBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiCisJCWV4aXQgOzsKIAllc2FjCi0KLQlpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJhbHBoYSIgOyB0aGVuCi0JCXNlZCAncy9eCS8vJyAgPDxFT0YgPmR1bW15LnMKLQkJLmdsb2JsIG1haW4KLQkJLmVudCBtYWluCi0JbWFpbjoKLQkJLmZyYW1lIFwkMzAsMCxcJDI2LDAKLQkJLnByb2xvZ3VlIDAKLQkJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKLQkJbGRhIFwkMiwyNTkKLQkJLmxvbmcgMHg0N2UyMGMyMSAjIGFtYXNrICQyLCQxCi0JCXNybCBcJDEsOCxcJDIKLQkJc2xsIFwkMiwyLFwkMgotCQlzbGwgXCQwLDMsXCQwCi0JCWFkZGwgXCQxLFwkMCxcJDAKLQkJYWRkbCBcJDIsXCQwLFwkMAotCQlyZXQgXCQzMSwoXCQyNiksMQotCQkuZW5kIG1haW4KKwkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGlzIGEub3V0IG9yIGVsZgorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCSNpZmRlZiBfX0VMRl9fCisJIyBpZmRlZiBfX0dMSUJDX18KKwkjICBpZiBfX0dMSUJDX18gPj0gMgorCUxJQkM9Z251CisJIyAgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjICBlbmRpZgorCSMgZWxzZQorCUxJQkM9Z251bGliYzEKKwkjIGVuZGlmCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fUEdJKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0MpIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCiBFT0YKLQkJTElCQz0iIgotCQkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCi0JCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkuL2R1bW15Ci0JCQljYXNlICIkPyIgaW4KLQkJCTcpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCi0JCQkJOzsKLQkJCTE1KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgotCQkJCTs7Ci0JCQkxNCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEwKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTE2KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCQllc2FjCQotCi0JCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIGR1bW15IHwgXAotCQkJICBncmVwIGxkLnNvLjEgPiAvZGV2L251bGwKLQkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCi0JCQkJTElCQz0ibGliYzEiCi0JCQlmaQotCQlmaQkKLQkJcm0gLWYgZHVtbXkucyBkdW1teQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwCi0JZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJtaXBzIiA7IHRoZW4KLQkgIGNhdCA+ZHVtbXkuYyA8PEVPRgotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotI2lmZGVmIF9fTUlQU0VCX18KLSAgcHJpbnRmICgiJXMtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0jaWZkZWYgX19NSVBTRUxfXwotICBwcmludGYgKCIlc2VsLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCSAgcm0gLWYgZHVtbXkuYyBkdW1teQotCWVsc2UKLQkgICMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKQotCSAgIyBvciBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCi0JICAjIEdDQyB3YW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGxpbnV4LWdudW9sZGxkIGFuZCBsaW51eC1nbnVhb3V0LgotCSAgIyBJZiBsZCBkb2VzIG5vdCBwcm92aWRlICphbnkqICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCi0JICAjIHRoYXQgbWVhbnMgaXQgaXMgZ251b2xkbGQuCi0JICBlY2hvICIkbGRfaGVscF9zdHJpbmciIHwgZ3JlcCA+L2Rldi9udWxsIDI+JjEgInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKLQkgIHRlc3QgJD8gIT0gMCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIiAmJiBleGl0IDAKLQotCSAgY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgIGk/ODYpCi0JICAgIFZFTkRPUj1wYzsKLQkgICAgOzsKLQkgICopCi0JICAgIFZFTkRPUj11bmtub3duOwotCSAgICA7OwotCSAgZXNhYwotCSAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKLQkgIGNhdCA+ZHVtbXkuYyA8PEVPRgotI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWZkZWYgX19FTEZfXwotIyBpZmRlZiBfX0dMSUJDX18KLSMgIGlmIF9fR0xJQkNfXyA+PSAyCi0gICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jICBlbHNlCi0gICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7Ci0jIGVuZGlmCi0jZWxzZQotICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251YW91dFxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQkgIHJtIC1mIGR1bW15LmMgZHVtbXkKLQlmaSA7OwotIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4gIGVhcmxpZXIgdmVyc2lvbnMKLSMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoIHN5c25hbWUgYW5kIG5vZGVuYW1lLgotICAgIGk/ODY6RFlOSVgvcHR4OjQqOiopCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkxJQkMveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7TElCQ30iICE9IHggJiYgeworCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iCisJCWV4aXQKKwl9CisJdGVzdCB4IiR7VEVOVEFUSVZFfSIgIT0geCAmJiB7IGVjaG8gIiR7VEVOVEFUSVZFfSI7IGV4aXQ7IH0KKwk7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KIAllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6VU5JWF9TVjo0LjJNUDoyLiopCisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCiAgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KICAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgogICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCiAJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgogICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KIAllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGk/ODY6Kjo0Lio6KiB8IGk/ODY6U1lTVEVNX1Y6NC4qOiopCisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LjAqOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCiAJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9CiAJZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KIAlmaQotCWV4aXQgMCA7OwotICAgIGk/ODY6KjozLjI6KikKKwlleGl0IDs7CisgICAgaSo4NjoqOjU6WzY3OF0qKQorICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCiAJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgogCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCiAJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCiAJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8ZWdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0JCSgvYmluL3VuYW1lIC1YfGVncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCiAJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKIAkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKIAllbHNlCiAJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKIAlmaQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKICAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLSAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KLQllY2hvIGkzODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTU4Ni4KKwkjIE5vdGU6IHdoYXRldmVyIHRoaXMgaXMsIGl0IE1VU1QgYmUgdGhlIHNhbWUgYXMgd2hhdCBjb25maWcuc3ViCisJIyBwcmludHMgZm9yIHRoZSAiZGpncHAiIGhvc3QsIG9yIGVsc2UgR0RCIGNvbmZpZ3VyeSB3aWxsIGRlY2lkZSB0aGF0CisJIyB0aGlzIGlzIGEgY3Jvc3MtYnVpbGQuCisJZWNobyBpNTg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCA7OwogICAgIEludGVsOk1hY2g6Myo6KikKIAllY2hvIGkzODYtcGMtbWFjaDMKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgcGFyYWdvbjoqOio6KikKIAllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CiAJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KIAkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKIAllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCiAJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAogCWZpCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKIAkjICJtaW5pZnJhbWUiCiAJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgTTY4KjoqOlIzVls1NjddKjoqKQotCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wKQorCWV4aXQgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgOzsKKyAgICBNNjgwPzA6RC1OSVg6NS4zOiopCisJZWNobyBtNjhrLWRpYWItZG5peAorCWV4aXQgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiB7IGVjaG8gJ202OGstbW90b3JvbGEtc3lzdic7IGV4aXQ7IH0gOzsKKyAgICAzWzM0NV0/PzoqOjQuMDozLjAgfCAzWzM0XT8/QToqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgM1szNF0/Py8qOio6NC4wOjMuMCB8IDQ0MDA6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjAgfCBTS0E0MDoqOjQuMDozLjAgfCBTRFMyOio6NC4wOjMuMCB8IFNIRzI6Kjo0LjA6My4wIHwgUzc1MDEqOio6NC4wOjMuMCkKIAlPU19SRUw9JycKIAl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKIAkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAogCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAorCSAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KIAkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKKwkgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CiAgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCiAgICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7Ci0gICAgbTY4KjpMeW54T1M6Mi4qOiopCisgICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7CisgICAgTkNSKjoqOjQuMjoqIHwgTVBSQVMqOio6NC4yOiopCisJT1NfUkVMPScuMycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkgICAgJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIHB0ZXJvbiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKIAllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKIAllY2hvIG02OGstYXRhcmktc3lzdjQKLQlleGl0IDAgOzsKLSAgICBpPzg2Okx5bnhPUzoyLio6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQogCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcnM2MDAwOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjIuKjoqKQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQogCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuMCo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OwogICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCiAJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OworCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKICAgICBSTSo6U0lOSVgtKjoqOiopCiAJZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICAqOlNJTklYLSo6KjoqKQogCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCiAJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCkBAIC03MTUsMzkgKzEyMDEsMTcxIEBACiAJZWxzZQogCQllY2hvIG5zMzJrLXNuaS1zeXN2CiAJZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOkNQdW5peDo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisJZXhpdCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgogICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0gICAgICAgIGV4aXQgMCA7OworICAgICAgICBleGl0IDs7CiAgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCiAJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgogCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQogCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgICo6KjoqOkZUWCopCiAJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCiAJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OwogICAgIG1jNjgqOkEvVVg6KjoqKQogCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzoqOjYqKQorCWV4aXQgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCiAJZWNobyBtaXBzLXNvbnktbmV3c29zNgotCWV4aXQgMCA7OwotICAgIFIzMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KikKKwlleGl0IDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCiAJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCiAJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CiAJZWxzZQogCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KIAlmaQotICAgICAgICBleGl0IDAgOzsKKyAgICAgICAgZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIHVua25vd24pIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LWFwcGxlLWRhcndpbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpRTlg6Kjo0KikKKwllY2hvIGkzODYtcGMtcW54CisJZXhpdCA7OworICAgIE5TRS0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgOzsKKyAgICBCUzIwMDA6UE9TSVgqOio6KikKKwllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKKwlleGl0IDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgOzsKKyAgICAqOlRPUFMtMTA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKKwlleGl0IDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCA7OworICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC14a2wtdG9wczIwCisJZXhpdCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgOzsKKyAgICBTRUk6KjoqOlNFSVVYKQorICAgICAgICBlY2hvIG1pcHMtc2VpLXNlaXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkRyYWdvbkZseToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgOzsKKyAgICAqOipWTVM6KjoqKQorICAgIAlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIEEqKSBlY2hvIGFscGhhLWRlYy12bXMgOyBleGl0IDs7CisJICAgIEkqKSBlY2hvIGlhNjQtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgViopIGVjaG8gdmF4LWRlYy12bXMgOyBleGl0IDs7CisJZXNhYyA7OworICAgICo6WEVOSVg6KjpTeXNWKQorCWVjaG8gaTM4Ni1wYy14ZW5peAorCWV4aXQgOzsKKyAgICBpKjg2OnNreW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2t5b3NgZWNobyAke1VOQU1FX1JFTEVBU0V9YCB8IHNlZCAtZSAncy8gLiokLy8nCisJZXhpdCA7OworICAgIGkqODY6cmRvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXJkb3MKKwlleGl0IDs7CisgICAgaSo4NjpBUk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYXJvcworCWV4aXQgOzsKIGVzYWMKIAogI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCiAjZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCiAKLWNhdCA+ZHVtbXkuYyA8PEVPRgorZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorY2F0ID4kZHVtbXkuYyA8PEVPRgogI2lmZGVmIF9TRVFVRU5UXwogIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KQEAgLTc3Miw3ICsxMzkwLDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKLSAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCkBAIC03ODUsNyArMTQwMywxMCBAQAogI2VuZGlmCiAgIGludCB2ZXJzaW9uOwogICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7Ci0gIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKICAgZXhpdCAoMCk7CiAjZW5kaWYKIApAQCAtODMwLDExICsxNDUxLDI0IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQgKHZheCkKLSNpZiAhZGVmaW5lZCAodWx0cml4KQotICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgorIyBpZiAhZGVmaW5lZCAodWx0cml4KQorIyAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICBpZiBkZWZpbmVkIChCU0QpCisjICAgaWYgQlNEID09IDQzCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM1xuIik7IGV4aXQgKDApOworIyAgIGVsc2UKKyMgICAgaWYgQlNEID09IDE5OTAwNgorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNyZW5vXG4iKTsgZXhpdCAoMCk7CisjICAgIGVsc2UKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgZW5kaWYKKyMgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7CisjIGVuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQgKGFsbGlhbnQpICYmIGRlZmluZWQgKGk4NjApCkBAIC04NDUsMTIgKzE0NzksMTIgQEAKIH0KIEVPRgogCi0ke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLXJtIC1mIGR1bW15LmMgZHVtbXkKKyRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgICYmCisJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CiAKICMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KIAotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQogCiAjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCiAKQEAgLTg1OSwyNSArMTQ5Myw2OSBAQAogICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCiAgICAgYzEqKQogCWVjaG8gYzEtY29udmV4LWJzZAotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBjMiopCiAJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCiAJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCiAJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKIAlmaQotCWV4aXQgMCA7OworCWV4aXQgOzsKICAgICBjMzQqKQogCWVjaG8gYzM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgYzM4KikKIAllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7CisJZXhpdCA7OwogICAgIGM0KikKIAllY2hvIGM0LWNvbnZleC1ic2QKLQlleGl0IDAgOzsKKwlleGl0IDs7CiAgICAgZXNhYwogZmkKIAotI2VjaG8gJyhVbmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUpJyAxPiYyCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKK2FuZAorICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgogCiBleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKaW5kZXggMjEzYTZkNC4uYTM5NDM3ZCAxMDA3NTUKLS0tIGEvY29uZmlnLnN1YgorKysgYi9jb25maWcuc3ViCkBAIC0xLDYgKzEsMTEgQEAKICMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LCB2ZXJzaW9uIDEuMS4KLSMgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwOS0wNC0xNycKKwogIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCiAjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKICMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KQEAgLTE3LDE0ICsyMiwxOCBAQAogIwogIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKICMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQogIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKICMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKICMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgogCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KKyMKICMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCiAjIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KICMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCkBAIC00NSwzMCArNTQsNzYgQEAKICMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCiAjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KIAotaWYgWyB4JDEgPSB4IF0KLXRoZW4KLQllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCi0JZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKLQllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKLQllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKLQlleGl0IDEKLWZpCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKIAotIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCi1jYXNlICQxIGluCi0JKmxvY2FsKikKLQkJZWNobyAkMQotCQlleGl0IDAKLQkJOzsKLQkqKQotCTs7Cit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKzIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKIGVzYWMKIAogIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgogIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KIG1heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAogY2FzZSAkbWF5YmVfb3MgaW4KLSAgbGludXgtZ251KikKKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKKyAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKICAgICBvcz0tJG1heWJlX29zCiAgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKICAgICA7OwpAQCAtOTQsMTUgKzE0OSwzNyBAQAogCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCiAJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKIAktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUpCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSkKIAkJb3M9CiAJCWJhc2ljX21hY2hpbmU9JDEKIAkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CiAJLWhpdXgqKQogCQlvcz0taGl1eHdlMgogCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKIAktc2NvNSkKLQkJb3M9c2NvMy4ydjUKKwkJb3M9LXNjbzMuMnY1CiAJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKIAkJOzsKIAktc2NvNCkKQEAgLTExNywxMCArMTk0LDE3IEBACiAJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCiAJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKIAkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OwogCS1zY28qKQogCQlvcz0tc2NvMy4ydjIKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAogCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CiAJLWlzYykKIAkJb3M9LWlzYzIuMgogCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCkBAIC0xNDMsMjYgKzIyNyw4OCBAQAogCS1wc29zKikKIAkJb3M9LXBzb3MKIAkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKIGVzYWMKIAogIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCiBjYXNlICRiYXNpY19tYWNoaW5lIGluCiAJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KIAkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCXRhaG9lIHwgaTg2MCB8IG0zMnIgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJjIHwgYXJtIFwKLQkJfCBhcm1lW2xiXSB8IHB5cmFtaWQgfCBtbjEwMjAwIHwgbW4xMDMwMCBcCi0JCXwgdHJvbiB8IGEyOWsgfCA1ODAgfCBpOTYwIHwgaDgzMDAgfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgXAotCQl8IGFscGhhIHwgYWxwaGFldjUgfCBhbHBoYWV2NTYgfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciBcCi0JCXwgaTM3MCB8IHNoIHwgcG93ZXJwYyB8IHBvd2VycGNsZSB8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIFwKLQkJfCBtaXBzNjQgfCBtaXBzZWwgfCBtaXBzNjRlbCB8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCi0JCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKLQkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHY4NTApCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisJfCBiZmluIFwKKwl8IGM0eCB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbG0zMiBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCB8IG1ldGFnIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NG9jdGVvbiB8IG1pcHM2NG9jdGVvbmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjRyNTkwMCB8IG1pcHM2NHI1OTAwZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmlvcyB8IG5pb3MyIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IHwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGsgfCB6ODApCiAJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgogCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKKwkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKIAkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJwogCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAogCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KLQlpWzM0NTZdODYpCisJaSo4NiB8IHg4Nl82NCkKIAkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKIAkgIDs7CiAJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KQEAgLTE3MSwyNyArMzE3LDk3IEBACiAJCWV4aXQgMQogCQk7OwogCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JdmF4LSogfCB0YWhvZS0qIHwgaVszNDU2XTg2LSogfCBpODYwLSogfCBtMzJyLSogfCBtNjhrLSogfCBtNjgwMDAtKiBcCi0JICAgICAgfCBtODhrLSogfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFyYy0qIHwgYXJtLSogfCBjWzEyM10qIFwKLQkgICAgICB8IG1pcHMtKiB8IHB5cmFtaWQtKiB8IHRyb24tKiB8IGEyOWstKiB8IHJvbXAtKiB8IHJzNjAwMC0qIFwKLQkgICAgICB8IHBvd2VyLSogfCBub25lLSogfCA1ODAtKiB8IGNyYXkyLSogfCBoODMwMC0qIHwgaTk2MC0qIFwKLQkgICAgICB8IHhtcC0qIHwgeW1wLSogfCBocHBhLSogfCBocHBhMS4wLSogfCBocHBhMS4xLSogXAotCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXY1LSogfCBhbHBoYWV2NTYtKiB8IHdlMzJrLSogfCBjeWRyYS0qIFwKLQkgICAgICB8IG5zMTZrLSogfCBwbi0qIHwgbnAxLSogfCB4cHMxMDAtKiB8IGNsaXBwZXItKiB8IG9yaW9uLSogXAotCSAgICAgIHwgc3BhcmNsaXRlLSogfCBwZHAxMS0qIHwgc2gtKiB8IHBvd2VycGMtKiB8IHBvd2VycGNsZS0qIFwKLQkgICAgICB8IHNwYXJjNjQtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAotCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogIFwKLQkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAotCSAgICAgIHwgZjMwMS0qKQorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogfCBhdnIzMi0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIHwgYzU0eC0qIHwgYzU1eC0qIHwgYzZ4LSogXAorCXwgY2xpcHBlci0qIHwgY3JheW52LSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZmlkby0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogfCBpcTIwMDAtKiBcCisJfCBsbTMyLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiB8IG1ldGFnLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NG9jdGVvbi0qIHwgbWlwczY0b2N0ZW9uZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHI1OTAwLSogfCBtaXBzNjRyNTkwMGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyNF1hZWItKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAorCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCisJfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCisJfCBzcGFyY2xpdGUtKiBcCisJfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCisJfCB0YWhvZS0qIHwgdGh1bWItKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiB8IHRpbGUtKiBcCisJfCB0cm9uLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKiB8IHo4MC0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUsIHdpdGggZ2xvYiBtYXRjaC4KKwl4dGVuc2EqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KIAkJOzsKIAkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCiAJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKIAkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKIAkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CiAJCTs7CiAJM2IqKQogCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAogCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworICAgIAlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CiAJYWxsaWFudCB8IGZ4ODApCiAJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CiAJCTs7CkBAIC0yMDIsMjUgKzQxOCwzOSBAQAogCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQogCQlvcz0tYnNkCiAJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKIAlhbWRhaGwpCiAJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAogCQlvcz0tc3lzdgogCQk7OwogCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgogCQk7OwogCWFtaWdhb3MgfCBhbWlnYWRvcykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgogCQlvcz0tYW1pZ2FvcwogCQk7OwogCWFtaWdhdW5peCB8IGFtaXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KIAkJb3M9LXN5c3Y0CiAJCTs7CiAJYXBvbGxvNjgpCiAJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KIAkJb3M9LXN5c3YKIAkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXJvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1hcm9zCisJCTs7CiAJYXV4KQogCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKIAkJb3M9LWF1eApAQCAtMjI5LDYgKzQ1OSwyMiBAQAogCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKIAkJb3M9LWR5bml4CiAJCTs7CisJYmxhY2tmaW4pCisJCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCWJsYWNrZmluLSopCisJCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwljOTApCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworICAgICAgICBjZWdjYykKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tY2VnY2MKKwkJOzsKIAljb252ZXgtYzEpCiAJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CiAJCW9zPS1ic2QKQEAgLTI0OSwyNyArNDk1LDQ1IEBACiAJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAogCQlvcz0tYnNkCiAJCTs7Ci0JY3JheSB8IHltcCkKLQkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKIAkJb3M9LXVuaWNvcwogCQk7OwotCWNyYXkyKQotCQliYXNpY19tYWNoaW5lPWNyYXkyLWNyYXkKLQkJb3M9LXVuaWNvcworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKIAkJOzsKLQlbY3RqXTkwLWNyYXkpCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcworCWNyMTYpCisJCWJhc2ljX21hY2hpbmU9Y3IxNi11bmtub3duCisJCW9zPS1lbGYKIAkJOzsKIAljcmRzIHwgdW5vcykKIAkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKIAkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OwogCWRhMzAgfCBkYTMwLSopCiAJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCiAJCTs7CiAJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQogCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCiAJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CiAJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKIAkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKIAkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCkBAIC0yNzgsNiArNTQyLDE0IEBACiAJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQogCQlvcz0tc3lzdjMKIAkJOzsKKwlkaWNvcykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1kaWNvcworCQk7OworCWRqZ3BwKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJb3M9LW1zZG9zZGpncHAKKwkJOzsKIAlkcHgyMCB8IGRweDIwLSopCiAJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKIAkJb3M9LWJvc3gKQEAgLTI5Nyw2ICs1NjksMTAgQEAKIAllbmNvcmUgfCB1bWF4IHwgbW1heCkKIAkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKIAkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CiAJZngyODAwKQogCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAogCQk7OwpAQCAtMzA3LDYgKzU4MywxMCBAQAogCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCiAJCW9zPS1zeXN2CiAJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CiAJaDMwNTByKiB8IGhpdXgqKQogCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQogCQlvcz0taGl1eHdlMgpAQCAtMzE1LDYgKzU5NSwxNCBAQAogCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKIAkJb3M9LWhtcwogCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CiAJaGFycmlzKQogCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCiAJCW9zPS1zeXN2MwpAQCAtMzMwLDEzICs2MTgsMzAgQEAKIAkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCiAJCW9zPS1ocHV4CiAJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CiAJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCiAJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCiAJCTs7CiAJaHA5azNbMi05XVswLTldKQogCQliYXNpY19tYWNoaW5lPW02OGstaHAKIAkJOzsKLQlocDlrN1swLTldWzAtOV0gfCBocDdbMC05XVswLTldIHwgaHA5azhbMC05XTcgfCBocDhbMC05XTcpCisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKIAkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCiAJCTs7CiAJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKQEAgLTM0NSwyNyArNjUwLDQyIEBACiAJaHBwYS1uZXh0KQogCQlvcz0tbmV4dHN0ZXAzCiAJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKIAlpMzcwLWlibSogfCBpYm0qKQogCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKIAkJOzsKICMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWlbMzQ1Nl04NnYzMikKKwlpKjg2djMyKQogCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKIAkJb3M9LXN5c3YzMgogCQk7OwotCWlbMzQ1Nl04NnY0KikKKwlpKjg2djQqKQogCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKIAkJb3M9LXN5c3Y0CiAJCTs7Ci0JaVszNDU2XTg2dikKKwlpKjg2dikKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCiAJCW9zPS1zeXN2CiAJCTs7Ci0JaVszNDU2XTg2c29sMikKKwlpKjg2c29sMikKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCiAJCW9zPS1zb2xhcmlzMgogCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CiAJaXJpcyB8IGlyaXM0ZCkKIAkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQogCQljYXNlICRvcyBpbgpAQCAtMzgwLDYgKzcwMCwxNCBAQAogCQliYXNpY19tYWNoaW5lPW02OGstaXNpCiAJCW9zPS1zeXN2CiAJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OwogCW04OGstb21yb24qKQogCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KIAkJOzsKQEAgLTM5MSwxNiArNzE5LDIwIEBACiAJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlawogCQlvcz0tc3lzdgogCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmd3MzJjZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tbWluZ3czMmNlCisJCTs7CiAJbWluaWZyYW1lKQogCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CiAJCTs7Ci0JbWlwc2VsKi1saW51eCopCi0JCWJhc2ljX21hY2hpbmU9bWlwc2VsLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQotCQk7OwotCW1pcHMqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJb3M9LWxpbnV4LWdudQorCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKIAkJOzsKIAltaXBzMyotKikKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKQEAgLTQwOCwxMCArNzQwLDM3IEBACiAJbWlwczMqKQogCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCiAJCTs7CisJbW9uaXRvcikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCW1vcnBob3MpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCW9zPS1tb3JwaG9zCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltczEtKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAorCQk7OworCW12cykKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CiAJbmNyMzAwMCkKIAkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgogCQlvcz0tc3lzdjQKIAkJOzsKKwluZXRic2QzODYpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1uZXRic2QKKwkJOzsKKwluZXR3aW5kZXIpCisJCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCisJCW9zPS1saW51eAorCQk7OwogCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCiAJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CiAJCW9zPS1uZXdzb3MKQEAgLTQyNCw2ICs3ODMsMTAgQEAKIAkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKIAkJb3M9LW5ld3NvcwogCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CiAJbmV4dCB8IG0qLW5leHQgKQogCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAogCQljYXNlICRvcyBpbgpAQCAtNDQ5LDkgKzgxMiwzOSBAQAogCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKIAkJb3M9LW5pbmR5CiAJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CiAJbnAxKQogCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAogCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcGVucmlzYyB8IG9wZW5yaXNjLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCTs7CisJb3M0MDApCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LW9zNDAwCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKIAlwYS1oaXRhY2hpKQogCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQogCQlvcz0taGl1eHdlMgpAQCAtNDYwLDU5ICs4NTMsMTIzIEBACiAJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAogCQlvcz0tb3NmCiAJCTs7CisJcGFyaXNjKQorCQliYXNpY19tYWNoaW5lPWhwcGEtdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlwYXJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OwogCXBiZCkKIAkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKIAkJOzsKIAlwYmIpCiAJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKIAkJOzsKLSAgICAgICAgcGM1MzIgfCBwYzUzMi0qKQorCXBjNTMyIHwgcGM1MzItKikKIAkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgogCQk7OwotCXBlbnRpdW0gfCBwNSkKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWludGVsCisJcGM5OCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCiAJCTs7Ci0JcGVudGl1bXBybyB8IHA2KQotCQliYXNpY19tYWNoaW5lPWk2ODYtaW50ZWwKKwlwYzk4LSopCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAogCQk7OwotCXBlbnRpdW0tKiB8IHA1LSopCisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQogCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKIAkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qKQorCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKIAkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCiAJCTs7Ci0JazUpCi0JCSMgV2UgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBBTUQncyBLNSB5ZXQsIHNvIGp1c3QgY2FsbCBpdCBhIFBlbnRpdW0KLQkJYmFzaWNfbWFjaGluZT1pNTg2LWFtZAorCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAogCQk7OwotCW5leGVuKQotCQkjIFdlIGRvbid0IGhhdmUgc3BlY2lmaWMgc3VwcG9ydCBmb3IgTmV4Z2VuIHlldCwgc28ganVzdCBjYWxsIGl0IGEgUGVudGl1bQotCQliYXNpY19tYWNoaW5lPWk1ODYtbmV4Z2VuCisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCiAJCTs7CiAJcG4pCiAJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKIAkJOzsKLQlwb3dlcikJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCiAJCTs7CiAJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgotCSAgICAgICAgOzsKKwkJOzsKIAlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCiAJCTs7CiAJcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCiAJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KLQkgICAgICAgIDs7CisJCTs7CiAJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKIAkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKIAkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKIAlwczIpCiAJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KIAkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tcmRvcworCQk7OworCXJvbTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OwogCXJtWzQ2XTAwKQogCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucwogCQk7OwogCXJ0cGMgfCBydHBjLSopCiAJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KIAkJOzsKKwlzMzkwIHwgczM5MC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCisJCTs7CisJczM5MHggfCBzMzkweC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNiMSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgorCQk7OworCXNiMWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KKwkJOzsKKwlzZGUpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQorCQlvcz0tZWxmCisJCTs7CisJc2VpKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCisJCW9zPS1zZWl1eAorCQk7OwogCXNlcXVlbnQpCiAJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CiAJCTs7CkBAIC01MjAsNiArOTc3LDE2IEBACiAJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQogCQlvcz0taG1zCiAJCTs7CisJc2g1ZWwpCisJCWJhc2ljX21hY2hpbmU9c2g1bGUtdW5rbm93bgorCQk7OworCXNoNjQpCisJCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCisJCTs7CisJc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CiAJc3BzNykKIAkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKIAkJb3M9LXN5c3YyCkBAIC01MjcsNiArOTk0LDEzIEBACiAJc3B1cikKIAkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KIAkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKIAlzdW4yKQogCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KIAkJOzsKQEAgLTU2NywxOSArMTA0MSw1NSBAQAogCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQogCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCiAJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKIAlzeW1tZXRyeSkKIAkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKIAkJb3M9LWR5bml4CiAJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGlsZSopCisJCWJhc2ljX21hY2hpbmU9dGlsZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKIAl0eDM5KQogCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KIAkJOzsKIAl0eDM5ZWwpCiAJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCiAJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKIAl0b3dlciB8IHRvd2VyLTMyKQogCQliYXNpY19tYWNoaW5lPW02OGstbmNyCiAJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CiAJdWRpMjlrKQogCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCiAJCW9zPS11ZGkKQEAgLTU4OCw2ICsxMDk4LDEwIEBACiAJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKIAkJb3M9LXN5bTEKIAkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OwogCXZheHYpCiAJCWJhc2ljX21hY2hpbmU9dmF4LWRlYwogCQlvcz0tc3lzdgpAQCAtNTk3LDggKzExMTEsOCBAQAogCQlvcz0tdm1zCiAJCTs7CiAJdnBwKnx2eHx2eC0qKQotICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKLSAgICAgICAgICAgICAgIDs7CisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CiAJdnh3b3Jrczk2MCkKIAkJYmFzaWNfbWFjaGluZT1pOTYwLXdycwogCQlvcz0tdnh3b3JrcwpAQCAtNjExLDEyICsxMTI1LDMyIEBACiAJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKIAkJb3M9LXZ4d29ya3MKIAkJOzsKLQl4bXApCi0JCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQogCQlvcz0tdW5pY29zCiAJCTs7Ci0gICAgICAgIHhwcyB8IHhwczEwMCkKLQkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCiAJCTs7CiAJbm9uZSkKIAkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKQEAgLTYyNSwzMiArMTE1OSw0NCBAQAogCiAjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCiAjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCi0JbWlwcykKLQkJaWYgWyB4JG9zID0geC1saW51eC1nbnUgXTsgdGhlbgotCQkJYmFzaWNfbWFjaGluZT1taXBzLXVua25vd24KLQkJZWxzZQotCQkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKLQkJZmkKKwl3ODlrKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQk7OworCW9wNTBuKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJb3A2MGMpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKIAkJOzsKIAlyb21wKQogCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCiAJCTs7CisJbW1peCkKKwkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCisJCTs7CiAJcnM2MDAwKQogCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KIAkJOzsKIAl2YXgpCiAJCWJhc2ljX21hY2hpbmU9dmF4LWRlYwogCQk7OworCXBkcDEwKQorCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0CisJCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgorCQk7OwogCXBkcDExKQogCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYwogCQk7OwogCXdlMzJrKQogCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAogCQk7OwotCXNwYXJjKQorCXNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKKwkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCisJCTs7CisJc3BhcmMgfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYpCiAJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCiAJCTs7Ci0gICAgICAgIGN5ZHJhKQorCWN5ZHJhKQogCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKIAkJOzsKIAlvcmlvbikKQEAgLTY1OSw2ICsxMjA1LDE1IEBACiAJb3Jpb24xMDUpCiAJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKIAkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKIAkqKQogCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKIAkJZXhpdCAxCkBAIC03MDcsMTggKzEyNjIsNTQgQEAKIAktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCiAJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKIAkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAorCSAgICAgIHwgLWtvcGVuc29sYXJpcyogXAogCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAotCSAgICAgIHwgLWFvcyogXAorCSAgICAgIHwgLWFvcyogfCAtYXJvcyogXAogCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCiAJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCi0JICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1uZXRic2QqIHwgLW9wZW5ic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogXAotCSAgICAgIHwgLWx5bnhvcyogfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbWlyYnNkKiB8IC1uZXRic2QqIFwKKwkgICAgICB8IC1vcGVuYnNkKiB8IC1zb2xpZGJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKIAkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCiAJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCi0JICAgICAgfCAtY3lnd2luMzIqIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KikKKwkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiB8IC1jZWdjYyogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyopCiAJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgogCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKIAktbGludXgqKQogCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCiAJCTs7CkBAIC03MjgsNiArMTMxOSwxNSBAQAogCS1zdW5vczYqKQogCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCiAJCTs7CisJLW9wZW5lZCopCisJCW9zPS1vcGVuZWRpdGlvbgorCQk7OworICAgICAgICAtb3M0MDAqKQorCQlvcz0tb3M0MDAKKwkJOzsKKwktd2luY2UqKQorCQlvcz0td2luY2UKKwkJOzsKIAktb3Nmcm9zZSopCiAJCW9zPS1vc2Zyb3NlCiAJCTs7CkBAIC03NDMsMTEgKzEzNDMsMjYgQEAKIAktYWNpcyopCiAJCW9zPS1hb3MKIAkJOzsKKwktYXRoZW9zKikKKwkJb3M9LWF0aGVvcworCQk7OworCS1zeWxsYWJsZSopCisJCW9zPS1zeWxsYWJsZQorCQk7OworCS0zODZic2QpCisJCW9zPS1ic2QKKwkJOzsKIAktY3RpeCogfCAtdXRzKikKIAkJb3M9LXN5c3YKIAkJOzsKKwktbm92YSopCisJCW9zPS1ydG1rLW5vdmEKKwkJOzsKIAktbnMyICkKLQkgICAgICAgIG9zPS1uZXh0c3RlcDIKKwkJb3M9LW5leHRzdGVwMgorCQk7OworCS1uc2sqKQorCQlvcz0tbnNrCiAJCTs7CiAJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgogCS1zaW5peDUuKikKQEAgLTc1Niw2ICsxMzcxLDkgQEAKIAktc2luaXgqKQogCQlvcz0tc3lzdjQKIAkJOzsKKyAgICAgICAgLXRwZiopCisJCW9zPS10cGYKKwkJOzsKIAktdHJpdG9uKikKIAkJb3M9LXN5c3YzCiAJCTs7CkBAIC03NzQsOSArMTM5MiwzMCBAQAogCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KIAktc3lzdiopCiAJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OwogCS14ZW5peCkKIAkJb3M9LXhlbml4CiAJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLWthb3MqKQorCQlvcz0ta2FvcworCQk7OworCS16dm1vZSkKKwkJb3M9LXp2bW9lCisJCTs7CisJLWRpY29zKikKKwkJb3M9LWRpY29zCisJCTs7CiAJLW5vbmUpCiAJCTs7CiAJKikKQEAgLTc5OSwxMyArMTQzOCwyOSBAQAogIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KIAogY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorICAgICAgICBzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisgICAgICAgIHNwdS0qKQorCQlvcz0tZWxmCisJCTs7CiAJKi1hY29ybikKIAkJb3M9LXJpc2NpeDEuMgogCQk7OworCWFybSotcmViZWwpCisJCW9zPS1saW51eAorCQk7OwogCWFybSotc2VtaSkKIAkJb3M9LWFvdXQKIAkJOzsKLSAgICAgICAgcGRwMTEtKikKKyAgICAgICAgYzR4LSogfCB0aWM0eC0qKQorICAgICAgICAJb3M9LWNvZmYKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCiAJCW9zPS1ub25lCiAJCTs7CiAJKi1kZWMgfCB2YXgtKikKQEAgLTgyMywxNSArMTQ3OCw0OCBAQAogCQkjIGRlZmF1bHQuCiAJCSMgb3M9LXN1bm9zNAogCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIG1lcC0qKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OwogCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCiAJCW9zPS1zeXN2MwogCQk7OwogCXNwYXJjLSogfCAqLXN1bikKIAkJb3M9LXN1bm9zNC4xLjEKIAkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaGFpa3UpCisJCW9zPS1oYWlrdQorCQk7OwogCSotaWJtKQogCQlvcz0tYWl4CiAJCTs7CisgICAgCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKIAkqLWhwKQogCQlvcz0taHB1eAogCQk7OwpAQCAtODc0LDI3ICsxNTYyLDM5IEBACiAJKi1uZXh0KQogCQlvcz0tbmV4dHN0ZXAzCiAJCTs7Ci0gICAgICAgICotZ291bGQpCisJKi1nb3VsZCkKIAkJb3M9LXN5c3YKIAkJOzsKLSAgICAgICAgKi1oaWdobGV2ZWwpCisJKi1oaWdobGV2ZWwpCiAJCW9zPS1ic2QKIAkJOzsKIAkqLWVuY29yZSkKIAkJb3M9LWJzZAogCQk7OwotICAgICAgICAqLXNnaSkKKwkqLXNnaSkKIAkJb3M9LWlyaXgKIAkJOzsKLSAgICAgICAgKi1zaWVtZW5zKQorCSotc2llbWVucykKIAkJb3M9LXN5c3Y0CiAJCTs7CiAJKi1tYXNzY29tcCkKIAkJb3M9LXJ0dQogCQk7OwotCWYzMDEtZnVqaXRzdSkKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCiAJCW9zPS11eHB2CiAJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OwogCSopCiAJCW9zPS1ub25lCiAJCTs7CkBAIC05MTYsOSArMTYxNiwxNSBAQAogCQkJLWFpeCopCiAJCQkJdmVuZG9yPWlibQogCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKIAkJCS1ocHV4KikKIAkJCQl2ZW5kb3I9aHAKIAkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OwogCQkJLWhpdXgqKQogCQkJCXZlbmRvcj1oaXRhY2hpCiAJCQkJOzsKQEAgLTkzNCwyMSArMTY0MCw0NyBAQAogCQkJLWdlbml4KikKIAkJCQl2ZW5kb3I9bnMKIAkJCQk7OwotCQkJLW12cyopCisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKIAkJCQl2ZW5kb3I9aWJtCiAJCQkJOzsKIAkJCS1wdHgqKQogCQkJCXZlbmRvcj1zZXF1ZW50CiAJCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyopCisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCiAJCQkJdmVuZG9yPXdycwogCQkJCTs7CiAJCQktYXV4KikKIAkJCQl2ZW5kb3I9YXBwbGUKIAkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CiAJCWVzYWMKIAkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKIAkJOzsKIGVzYWMKIAogZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggMzVjOWRiNS4uNzE1NGZlNSAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1NjhlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDMxNyBAQAorIyBJSkcgYXV0by1jb25maWd1cmF0aW9uIHNvdXJjZSBmaWxlLgorIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorCisjCisjIENvbmZpZ3VyZSBzY3JpcHQgZm9yIElKRyBsaWJqcGVnCisjCisKK0FDX0lOSVQoW2xpYmpwZWddLCBbNy4wXSkKKworIyBEaXJlY3Rvcnkgd2hlcmUgYXV0b3Rvb2xzIGhlbHBlciBzY3JpcHRzIGxpdmVzLgorQUNfQ09ORklHX0FVWF9ESVIoWy5dKQorCisjIEdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gaGVhZGVycy4KK0FDX0NPTkZJR19IRUFERVJTKFtqY29uZmlnLmg6amNvbmZpZy5jZmddKQorCisjIEhhY2s6IGRpc2FibGUgYXV0b2hlYWRlciBzbyB0aGF0IGl0IGRvZXNuJ3Qgb3ZlcndyaXRlIG91ciBjZmcgdGVtcGxhdGUuCitBVVRPSEVBREVSPSJlY2hvIGF1dG9oZWFkZXIgaWdub3JlZCIKKworIyBDaGVjayBzeXN0ZW0gdHlwZQorQUNfQ0FOT05JQ0FMX1RBUkdFVAorCisjIEluaXRpYWxpemUgQXV0b21ha2UKKyMgRG9uJ3QgcmVxdWlyZSBhbGwgdGhlIEdOVSBtYW5kYXRlZCBmaWxlcworQU1fSU5JVF9BVVRPTUFLRShbLVdhbGwgLVdlcnJvciBhbnNpMmtuciBuby1kaXN0IGZvcmVpZ25dKQorCisjIE1ha2UgLS1lbmFibGUtc2lsZW50LXJ1bGVzIHRoZSBkZWZhdWx0LgorIyBUbyBnZXQgdmVyYm9zZSBidWlsZCBvdXRwdXQgeW91IG1heSBjb25maWd1cmUKKyMgd2l0aCAtLWRpc2FibGUtc2lsZW50LXJ1bGVzIG9yIHVzZSAibWFrZSBWPTEiLgorQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKQorCisjIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgZGUtQU5TSS1maWNhdGlvbiBmZWF0dXJlLgorQU1fQ19QUk9UT1RZUEVTCisKKyMgQWRkIGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIHdoaWNoIGVuYWJsZXMKKyMgZGVwZW5kZW5jeSBjaGVja2luZyBhbmQgZ2VuZXJhdGlvbiB1c2VmdWwgdG8gcGFja2FnZSBtYWludGFpbmVycy4KKyMgVGhpcyBpcyBtYWRlIGFuIG9wdGlvbiB0byBhdm9pZCBjb25mdXNpbmcgZW5kIHVzZXJzLgorQU1fTUFJTlRBSU5FUl9NT0RFCisKKyMgQ2hlY2sgZm9yIHByb2dyYW1zCitBQ19QUk9HX0NDCitBQ19QUk9HX0NDX1NUREMKK0FDX1BST0dfQ1BQCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfTUFLRV9TRVQKK0FDX1BST0dfTE5fUworCisjIENoZWNrIGlmIExEIHN1cHBvcnRzIGxpbmtlciBzY3JpcHRzLAorIyBhbmQgZGVmaW5lIGF1dG9tYWtlIGNvbmRpdGlvbmFsIEhBVkVfTERfVkVSU0lPTl9TQ1JJUFQgaWYgc28uCitBQ19BUkdfRU5BQkxFKFtsZC12ZXJzaW9uLXNjcmlwdF0sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sZC12ZXJzaW9uLXNjcmlwdF0sCisgICAgW2VuYWJsZSBsaW5rZXIgdmVyc2lvbiBzY3JpcHQgKGRlZmF1bHQgaXMgZW5hYmxlZCB3aGVuIHBvc3NpYmxlKV0pLAorICAgIFtoYXZlX2xkX3ZlcnNpb25fc2NyaXB0PSRlbmFibGV2YWxdLCBbXSkKK2lmIHRlc3QgLXogIiRoYXZlX2xkX3ZlcnNpb25fc2NyaXB0IjsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIExEIC1XbCwtLXZlcnNpb24tc2NyaXB0IHdvcmtzXSkKKyAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgTERGTEFHUz0iJExERkxBR1MgLVdsLC0tdmVyc2lvbi1zY3JpcHQ9Y29uZnRlc3QubWFwIgorICBjYXQgPiBjb25mdGVzdC5tYXAgPDxFT0YKK1ZFUlNfMSB7CisgICAgICAgIGdsb2JhbDogc3ltOworfTsKKworVkVSU18yIHsKKyAgICAgICAgZ2xvYmFsOiBzeW07Cit9IFZFUlNfMTsKK0VPRgorICBBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0oW10sIFtdKSwKKyAgICAgICAgICAgICAgICAgW2hhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9eWVzXSwgW2hhdmVfbGRfdmVyc2lvbl9zY3JpcHQ9bm9dKQorICBybSAtZiBjb25mdGVzdC5tYXAKKyAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgQUNfTVNHX1JFU1VMVCgkaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCkKK2ZpCitBTV9DT05ESVRJT05BTChIQVZFX0xEX1ZFUlNJT05fU0NSSVBULCB0ZXN0ICIkaGF2ZV9sZF92ZXJzaW9uX3NjcmlwdCIgPSAieWVzIikKKworIyBTZWUgaWYgY29tcGlsZXIgc3VwcG9ydHMgcHJvdG90eXBlcy4KK0FDX01TR19DSEVDS0lORyhmb3IgZnVuY3Rpb24gcHJvdG90eXBlcykKK0FDX0NBQ0hFX1ZBTChpamdfY3ZfaGF2ZV9wcm90b3R5cGVzLAorW0FDX1RSWV9DT01QSUxFKFsKK2ludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKTsgLyogY2hlY2sgcHJvdG90eXBlcyAqLworc3RydWN0IG1ldGhvZHNfc3RydWN0IHsJCS8qIGNoZWNrIG1ldGhvZC1wb2ludGVyIGRlY2xhcmF0aW9ucyAqLworICBpbnQgKCplcnJvcl9leGl0KSAoY2hhciAqbXNndGV4dCk7CisgIGludCAoKnRyYWNlX21lc3NhZ2UpIChjaGFyICptc2d0ZXh0KTsKKyAgaW50ICgqYW5vdGhlcl9tZXRob2QpICh2b2lkKTsKK307CitpbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMikgLyogY2hlY2sgZGVmaW5pdGlvbnMgKi8KK3sgcmV0dXJuIGFyZzJbYXJnMV07IH0KK2ludCB0ZXN0MmZ1bmN0aW9uICh2b2lkKQkvKiBjaGVjayB2b2lkIGFyZyBsaXN0ICovCit7IHJldHVybiAwOyB9CitdLCBbIF0sIGlqZ19jdl9oYXZlX3Byb3RvdHlwZXM9eWVzLCBpamdfY3ZfaGF2ZV9wcm90b3R5cGVzPW5vKV0pCitBQ19NU0dfUkVTVUxUKCRpamdfY3ZfaGF2ZV9wcm90b3R5cGVzKQoraWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoW0hBVkVfUFJPVE9UWVBFU10sWzFdLFtDb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzLl0pCitlbHNlCisgIGVjaG8gWW91ciBjb21waWxlciBkb2VzIG5vdCBzZWVtIHRvIGtub3cgYWJvdXQgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAgZWNobyBQZXJoYXBzIGl0IG5lZWRzIGEgc3BlY2lhbCBzd2l0Y2ggdG8gZW5hYmxlIEFOU0kgQyBtb2RlLgorICBlY2hvIElmIHNvLCB3ZSByZWNvbW1lbmQgcnVubmluZyBjb25maWd1cmUgbGlrZSB0aGlzOgorICBlY2hvICIgICAuL2NvbmZpZ3VyZSAgQ0M9J2NjIC1zd2l0Y2gnIgorICBlY2hvIHdoZXJlIC1zd2l0Y2ggaXMgdGhlIHByb3BlciBzd2l0Y2guCitmaQorCisjIENoZWNrIGhlYWRlciBmaWxlcworQUNfQ0hFQ0tfSEVBREVSUyhzdGRkZWYuaCBzdGRsaWIuaCBsb2NhbGUuaCkKK0FDX0NIRUNLX0hFQURFUihzdHJpbmcuaCwgLCBBQ19ERUZJTkUoW05FRURfQlNEX1NUUklOR1NdLFsxXSxbQ29tcGlsZXIgaGFzIDxzdHJpbmdzLmg+IHJhdGhlciB0aGFuIHN0YW5kYXJkIDxzdHJpbmcuaD4uXSkpCisKKyMgU2VlIHdoZXRoZXIgdHlwZSBzaXplX3QgaXMgZGVmaW5lZCBpbiBhbnkgQU5TSS1zdGFuZGFyZCBwbGFjZXM7CisjIGlmIG5vdCwgcGVyaGFwcyBpdCBpcyBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4uCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIHNpemVfdCkKK0FDX1RSWV9DT01QSUxFKFsKKyNpZmRlZiBIQVZFX1NURERFRl9ICisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCit0eXBlZGVmIHNpemVfdCBteV9zaXplX3Q7CitdLCBbIG15X3NpemVfdCBmb292YXI7IF0sIGlqZ19zaXplX3Rfb2s9eWVzLAorW2lqZ19zaXplX3Rfb2s9Im5vdCBBTlNJLCBwZXJoYXBzIGl0IGlzIGluIHN5cy90eXBlcy5oIl0pCitBQ19NU0dfUkVTVUxUKCRpamdfc2l6ZV90X29rKQoraWYgdGVzdCAiJGlqZ19zaXplX3Rfb2siICE9IHllczsgdGhlbgorQUNfQ0hFQ0tfSEVBREVSKHN5cy90eXBlcy5oLCBbQUNfREVGSU5FKFtORUVEX1NZU19UWVBFU19IXSxbMV0sW05lZWQgdG8gaW5jbHVkZSA8c3lzL3R5cGVzLmg+IGluIG9yZGVyIHRvIG9idGFpbiBzaXplX3QuXSkKK0FDX0VHUkVQX0NQUChzaXplX3QsIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwKK1tpamdfc2l6ZV90X29rPSJzaXplX3QgaXMgaW4gc3lzL3R5cGVzLmgiXSwgaWpnX3NpemVfdF9vaz1ubyldLAoraWpnX3NpemVfdF9vaz1ubykKK0FDX01TR19SRVNVTFQoJGlqZ19zaXplX3Rfb2spCitpZiB0ZXN0ICIkaWpnX3NpemVfdF9vayIgPSBubzsgdGhlbgorICBlY2hvIFR5cGUgc2l6ZV90IGlzIG5vdCBkZWZpbmVkIGluIGFueSBvZiB0aGUgdXN1YWwgcGxhY2VzLgorICBlY2hvIFRyeSBwdXR0aW5nICcidHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OyInIGluIGpjb25maWcuaC4KK2ZpCitmaQorCisjIENoZWNrIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcworQUNfTVNHX0NIRUNLSU5HKGZvciB0eXBlIHVuc2lnbmVkIGNoYXIpCitBQ19UUllfQ09NUElMRSgsIFsgdW5zaWduZWQgY2hhciB1bl9jaGFyOyBdLAorW0FDX01TR19SRVNVTFQoeWVzKQorQUNfREVGSU5FKFtIQVZFX1VOU0lHTkVEX0NIQVJdLFsxXSxbQ29tcGlsZXIgc3VwcG9ydHMgJ3Vuc2lnbmVkIGNoYXInLl0pXSwgQUNfTVNHX1JFU1VMVChubykpCitkbmwKK0FDX01TR19DSEVDS0lORyhmb3IgdHlwZSB1bnNpZ25lZCBzaG9ydCkKK0FDX1RSWV9DT01QSUxFKCwgWyB1bnNpZ25lZCBzaG9ydCB1bl9zaG9ydDsgXSwKK1tBQ19NU0dfUkVTVUxUKHllcykKK0FDX0RFRklORShbSEFWRV9VTlNJR05FRF9TSE9SVF0sWzFdLFtDb21waWxlciBzdXBwb3J0cyAndW5zaWduZWQgc2hvcnQnLl0pXSwgQUNfTVNHX1JFU1VMVChubykpCitkbmwKK0FDX01TR19DSEVDS0lORyhmb3IgdHlwZSB2b2lkKQorQUNfVFJZX0NPTVBJTEUoWworLyogQ2F1dGlvbjogYSBDKysgY29tcGlsZXIgd2lsbCBpbnNpc3Qgb24gdmFsaWQgcHJvdG90eXBlcyAqLwordHlwZWRlZiB2b2lkICogdm9pZF9wdHI7CS8qIGNoZWNrIHZvaWQgKiAqLworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyB2b2lkICovCit0eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpIChpbnQgYSwgaW50IGIpOworI2Vsc2UKK3R5cGVkZWYgdm9pZCAoKnZvaWRfZnVuYykgKCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwkJLyogY2hlY2sgdm9pZCBmdW5jdGlvbiByZXN1bHQgKi8KK3ZvaWQgdGVzdDNmdW5jdGlvbiAodm9pZF9wdHIgYXJnMSwgdm9pZF9mdW5jIGFyZzIpCisjZWxzZQordm9pZCB0ZXN0M2Z1bmN0aW9uIChhcmcxLCBhcmcyKQorICAgICB2b2lkX3B0ciBhcmcxOworICAgICB2b2lkX2Z1bmMgYXJnMjsKKyNlbmRpZgoreworICBjaGFyICogbG9jcHRyID0gKGNoYXIgKikgYXJnMTsgLyogY2hlY2sgY2FzdGluZyB0byBhbmQgZnJvbSB2b2lkICogKi8KKyAgYXJnMSA9ICh2b2lkICopIGxvY3B0cjsKKyAgKCphcmcyKSAoMSwgMik7CQkvKiBjaGVjayBjYWxsIG9mIGZjbiByZXR1cm5pbmcgdm9pZCAqLworfQorXSwgWyBdLCBBQ19NU0dfUkVTVUxUKHllcyksIFtBQ19NU0dfUkVTVUxUKG5vKQorQUNfREVGSU5FKFt2b2lkXSxbY2hhcl0sW0RlZmluZSAndm9pZCcgYXMgJ2NoYXInIGZvciBhcmNoYWljIGNvbXBpbGVycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgaXQuXSldKQorQUNfQ19DT05TVAorCisjIENoZWNrIGZvciBub24tYnJva2VuIGlubGluZSB1bmRlciB2YXJpb3VzIHNwZWxsaW5ncworQUNfTVNHX0NIRUNLSU5HKGZvciBpbmxpbmUpCitpamdfY3ZfaW5saW5lPSIiCitBQ19UUllfQ09NUElMRSgsIFt9IF9faW5saW5lX18gaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK2ludCBiYXIoKSB7IHJldHVybiBmb28oKTtdLCBpamdfY3ZfaW5saW5lPSJfX2lubGluZV9fIiwKK0FDX1RSWV9DT01QSUxFKCwgW30gX19pbmxpbmUgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK2ludCBiYXIoKSB7IHJldHVybiBmb28oKTtdLCBpamdfY3ZfaW5saW5lPSJfX2lubGluZSIsCitBQ19UUllfQ09NUElMRSgsIFt9IGlubGluZSBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQoraW50IGJhcigpIHsgcmV0dXJuIGZvbygpO10sIGlqZ19jdl9pbmxpbmU9ImlubGluZSIpKSkKK0FDX01TR19SRVNVTFQoJGlqZ19jdl9pbmxpbmUpCitBQ19ERUZJTkVfVU5RVU9URUQoW0lOTElORV0sWyRpamdfY3ZfaW5saW5lXSxbSG93IHRvIG9idGFpbiBmdW5jdGlvbiBpbmxpbmluZy5dKQorCisjIFdlIGNhbm5vdCBjaGVjayBmb3IgYm9ndXMgd2FybmluZ3MsIGJ1dCBhdCBsZWFzdCB3ZSBjYW4gY2hlY2sgZm9yIGVycm9ycworQUNfTVNHX0NIRUNLSU5HKGZvciBicm9rZW4gaW5jb21wbGV0ZSB0eXBlcykKK0FDX1RSWV9DT01QSUxFKFsgdHlwZWRlZiBzdHJ1Y3QgdW5kZWZpbmVkX3N0cnVjdHVyZSAqIHVuZGVmX3N0cnVjdF9wdHI7IF0sICwKK0FDX01TR19SRVNVTFQob2spLAorW0FDX01TR19SRVNVTFQoYnJva2VuKQorQUNfREVGSU5FKFtJTkNPTVBMRVRFX1RZUEVTX0JST0tFTl0sWzFdLFtDb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHBvaW50ZXJzIHRvIHVuc3BlY2lmaWVkIHN0cnVjdHVyZXMuXSldKQorCisjIFRlc3Qgd2hldGhlciBnbG9iYWwgbmFtZXMgYXJlIHVuaXF1ZSB0byBhdCBsZWFzdCAxNSBjaGFycworQUNfTVNHX0NIRUNLSU5HKGZvciBzaG9ydCBleHRlcm5hbCBuYW1lcykKK0FDX1RSWV9MSU5LKFsKK2ludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfQoraW50IHBvc3NpYmx5X2R1cGxpX2Z1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0KK10sIFsgXSwgQUNfTVNHX1JFU1VMVChvayksIFtBQ19NU0dfUkVTVUxUKHNob3J0KQorQUNfREVGSU5FKFtORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTXSxbMV0sW0xpbmtlciByZXF1aXJlcyB0aGF0IGdsb2JhbCBuYW1lcyBiZSB1bmlxdWUgaW4gZmlyc3QgMTUgY2hhcmFjdGVycy5dKV0pCisKKyMgUnVuLXRpbWUgY2hlY2tzCitBQ19NU0dfQ0hFQ0tJTkcodG8gc2VlIGlmIGNoYXIgaXMgc2lnbmVkKQorQUNfVFJZX1JVTihbCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfY2hhcl9zaWduZWQgKGludCBhcmcpCisjZWxzZQoraW50IGlzX2NoYXJfc2lnbmVkIChhcmcpCisgICAgIGludCBhcmc7CisjZW5kaWYKK3sKKyAgaWYgKGFyZyA9PSAxODkpIHsJCS8qIGV4cGVjdGVkIHJlc3VsdCBmb3IgdW5zaWduZWQgY2hhciAqLworICAgIHJldHVybiAwOwkJCS8qIHR5cGUgY2hhciBpcyB1bnNpZ25lZCAqLworICB9CisgIGVsc2UgaWYgKGFyZyAhPSAtNjcpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgY2hhciAqLworICAgIHByaW50ZigiSG1tLCBpdCBzZWVtcyAnY2hhcicgaXMgbm90IGVpZ2h0IGJpdHMgd2lkZSBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKKyAgICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIH0KKyAgcmV0dXJuIDE7CQkJLyogYXNzdW1lIGNoYXIgaXMgc2lnbmVkIG90aGVyd2lzZSAqLworfQorY2hhciBzaWduZWRfY2hhcl9jaGVjayA9IChjaGFyKSAoLTY3KTsKK2ludCBtYWluKCkgeworICBleGl0KGlzX2NoYXJfc2lnbmVkKChpbnQpIHNpZ25lZF9jaGFyX2NoZWNrKSk7Cit9XSwgW0FDX01TR19SRVNVTFQobm8pCitBQ19ERUZJTkUoW0NIQVJfSVNfVU5TSUdORURdLFsxXSxbQ2hhcmFjdGVycyBhcmUgdW5zaWduZWRdKV0sIEFDX01TR19SRVNVTFQoeWVzKSwKK1tlY2hvIEFzc3VtaW5nIHRoYXQgY2hhciBpcyBzaWduZWQgb24gdGFyZ2V0IG1hY2hpbmUuCitlY2hvIElmIGl0IGlzIHVuc2lnbmVkLCB0aGlzIHdpbGwgYmUgYSBsaXR0bGUgYml0IGluZWZmaWNpZW50LgorXSkKK2RubAorQUNfTVNHX0NIRUNLSU5HKHRvIHNlZSBpZiByaWdodCBzaGlmdCBpcyBzaWduZWQpCitBQ19UUllfUlVOKFsKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGxvbmcgYXJnKQorI2Vsc2UKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGFyZykKKyAgICAgbG9uZyBhcmc7CisjZW5kaWYKKy8qIFNlZSB3aGV0aGVyIHJpZ2h0LXNoaWZ0IG9uIGEgbG9uZyBpcyBzaWduZWQgb3Igbm90LiAqLworeworICBsb25nIHJlcyA9IGFyZyA+PiA0OworCisgIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgc2hpZnQgKi8KKyAgICByZXR1cm4gMTsJCQkvKiByaWdodCBzaGlmdCBpcyBzaWduZWQgKi8KKyAgfQorICAvKiBzZWUgaWYgdW5zaWduZWQtc2hpZnQgaGFjayB3aWxsIGZpeCBpdC4gKi8KKyAgLyogd2UgY2FuJ3QganVzdCB0ZXN0IGV4YWN0IHZhbHVlIHNpbmNlIGl0IGRlcGVuZHMgb24gd2lkdGggb2YgbG9uZy4uLiAqLworICByZXMgfD0gKH4wTCkgPDwgKDMyLTQpOworICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBub3c/ICovCisgICAgcmV0dXJuIDA7CQkJLyogcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgKi8KKyAgfQorICBwcmludGYoIlJpZ2h0IHNoaWZ0IGlzbid0IGFjdGluZyBhcyBJIGV4cGVjdCBpdCB0by5cbiIpOworICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIHJldHVybiAwOwkJCS8qIHRyeSBpdCB3aXRoIHVuc2lnbmVkIGFueXdheSAqLworfQoraW50IG1haW4oKSB7CisgIGV4aXQoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpOworfV0sIFtBQ19NU0dfUkVTVUxUKG5vKQorQUNfREVGSU5FKFtSSUdIVF9TSElGVF9JU19VTlNJR05FRF0sWzFdLFtCcm9rZW4gY29tcGlsZXIgc2hpZnRzIHNpZ25lZCB2YWx1ZXMgYXMgYW4gdW5zaWduZWQgc2hpZnQuXSldLCBBQ19NU0dfUkVTVUxUKHllcyksCitBQ19NU0dfUkVTVUxUKEFzc3VtaW5nIHRoYXQgcmlnaHQgc2hpZnQgaXMgc2lnbmVkIG9uIHRhcmdldCBtYWNoaW5lLikpCitkbmwKK0FDX01TR19DSEVDS0lORyh0byBzZWUgaWYgZm9wZW4gYWNjZXB0cyBiIHNwZWMpCitBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4oKSB7CisgIGlmIChmb3BlbigiY29uZnRlc3RkYXRhIiwgIndiIikgIT0gTlVMTCkKKyAgICBleGl0KDApOworICBleGl0KDEpOworfV0sIEFDX01TR19SRVNVTFQoeWVzKSwgW0FDX01TR19SRVNVTFQobm8pCitBQ19ERUZJTkUoW0RPTlRfVVNFX0JfTU9ERV0sWzFdLFtEb24ndCBvcGVuIGZpbGVzIGluIGJpbmFyeSBtb2RlLl0pXSwKK0FDX01TR19SRVNVTFQoQXNzdW1pbmcgdGhhdCBpdCBkb2VzLikpCisKKyMgQ29uZmlndXJlIGxpYnRvb2wKK0FDX0xJQlRPT0xfV0lOMzJfRExMCitBQ19QUk9HX0xJQlRPT0wKKworIyBTZWxlY3QgbWVtb3J5IG1hbmFnZXIgZGVwZW5kaW5nIG9uIHVzZXIgaW5wdXQuCisjIElmIG5vICItZW5hYmxlLW1heG1lbSIsIHVzZSBqbWVtbm9icworTUVNT1JZTUdSPSdqbWVtbm9icycKK01BWE1FTT0ibm8iCitBQ19BUkdfRU5BQkxFKG1heG1lbSwKK1sgIC0tZW5hYmxlLW1heG1lbVs9Tl0gICAgIGVuYWJsZSB1c2Ugb2YgdGVtcCBmaWxlcywgc2V0IG1heCBtZW0gdXNhZ2UgdG8gTiBNQl0sCitNQVhNRU09IiRlbmFibGV2YWwiKQorZG5sIFsjIHN1cHBvcnQgLS13aXRoLW1heG1lbSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBJSkcgVjUuXQorZG5sIEFDX0FSR19XSVRIKG1heG1lbSwgLCBNQVhNRU09IiR3aXRodmFsIikKK2lmIHRlc3QgIngkTUFYTUVNIiA9IHh5ZXM7IHRoZW4KKyAgTUFYTUVNPTEKK2ZpCitpZiB0ZXN0ICJ4JE1BWE1FTSIgIT0geG5vOyB0aGVuCisgIGlmIHRlc3QgLW4gImBlY2hvICRNQVhNRU0gfCBzZWQgJ3MvW1swLTldXS8vZydgIjsgdGhlbgorICAgIEFDX01TR19FUlJPUihub24tbnVtZXJpYyBhcmd1bWVudCB0byAtLWVuYWJsZS1tYXhtZW0pCisgIGZpCisgIERFRkFVTFRNQVhNRU09YGV4cHIgJE1BWE1FTSBcKiAxMDQ4NTc2YAorQUNfREVGSU5FX1VOUVVPVEVEKFtERUZBVUxUX01BWF9NRU1dLCBbJHtERUZBVUxUTUFYTUVNfV0sIFtNYXhpbXVtIGRhdGEgc3BhY2UgbGlicmFyeSB3aWxsIGFsbG9jYXRlLl0pCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAndG1wZmlsZSgpJ10pCitBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGlvLmg+XSwgWyBGSUxFICogdGZpbGUgPSB0bXBmaWxlKCk7IF0sCitbQUNfTVNHX1JFU1VMVCh5ZXMpCitNRU1PUllNR1I9J2ptZW1hbnNpJ10sCitbQUNfTVNHX1JFU1VMVChubykKK2RubCBpZiB0bXBmaWxlIGlzIG5vdCBwcmVzZW50LCBtdXN0IHVzZSBqbWVtbmFtZS4KK01FTU9SWU1HUj0nam1lbW5hbWUnCisKKyMgVGVzdCBmb3IgdGhlIG5lZWQgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcyB1c2luZyBhIHNpZ25hbCBoYW5kbGVyIChmb3IgY2pwZWcvZGpwZWcpCitBQ19ERUZJTkUoW05FRURfU0lHTkFMX0NBVENIRVJdLFsxXSxbTmVlZCBzaWduYWwgaGFuZGxlciB0byBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMuXSkKK0FDX01TR19DSEVDS0lORyhbZm9yICdta3RlbXAoKSddKQorQUNfVFJZX0xJTksoLCBbIGNoYXIgZm5hbWVbODBdOyBta3RlbXAoZm5hbWUpOyBdLCBBQ19NU0dfUkVTVUxUKHllcyksCitbQUNfTVNHX1JFU1VMVChubykKK0FDX0RFRklORShbTk9fTUtURU1QXSxbMV0sW1RoZSBta3RlbXAoKSBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLl0pXSldKQorZmkKK0FDX1NVQlNUKE1FTU9SWU1HUikKKworIyBFeHRyYWN0IHRoZSBsaWJyYXJ5IHZlcnNpb24gSUQgZnJvbSBqcGVnbGliLmguCitBQ19NU0dfQ0hFQ0tJTkcoW2xpYmpwZWcgdmVyc2lvbiBudW1iZXJdKQorW0pQRUdfTElCX1ZFUlNJT049YHNlZCAtZSAnL14jZGVmaW5lIEpQRUdfTElCX1ZFUlNJT04vIWQnIC1lICdzL15bXjAtOV0qXChbMC05XVswLTldKlwpLiokL1wxLycgJHNyY2Rpci9qcGVnbGliLmhgXQorW0pQRUdfTElCX1ZFUlNJT049ImBleHByICRKUEVHX0xJQl9WRVJTSU9OIC8gMTBgOmBleHByICRKUEVHX0xJQl9WRVJTSU9OICUgMTBgIl0KK0FDX01TR19SRVNVTFQoWyRKUEVHX0xJQl9WRVJTSU9OXSkKK0FDX1NVQlNUKFtKUEVHX0xJQl9WRVJTSU9OXSkKKworQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2RlcGNvbXAgYi9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmOGVlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kZXBjb21wCkBAIC0wLDAgKzEsNjMwIEBACisjISAvYmluL3NoCisjIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKKworc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQworCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSBGcmVlCisjIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPi4KKworY2FzZSAkMSBpbgorICAnJykKKyAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICBleGl0IDE7CisgICAgIDs7CisgIC1oIHwgLS1oKikKKyAgICBjYXQgPDxcRU9GCitVc2FnZTogZGVwY29tcCBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQorCitSdW4gUFJPR1JBTVMgQVJHUyB0byBjb21waWxlIGEgZmlsZSwgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMKK2FzIHNpZGUtZWZmZWN0cy4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBkZXBtb2RlICAgICBEZXBlbmRlbmN5IHRyYWNraW5nIG1vZGUuCisgIHNvdXJjZSAgICAgIFNvdXJjZSBmaWxlIHJlYWQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBvYmplY3QgICAgICBPYmplY3QgZmlsZSBvdXRwdXQgYnkgYFBST0dSQU1TIEFSR1MnLgorICBERVBESVIgICAgICBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgZGVwZW5kZW5jaWVzLgorICBkZXBmaWxlICAgICBEZXBlbmRlbmN5IGZpbGUgdG8gb3V0cHV0LgorICB0bXBkZXBmaWxlICBUZW1wb3JhcnkgZmlsZSB0byB1c2Ugd2hlbiBvdXRwdXRpbmcgZGVwZW5kZW5jaWVzLgorICBsaWJ0b29sICAgICBXaGV0aGVyIGxpYnRvb2wgaXMgdXNlZCAoeWVzL25vKS4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgIGV4aXQgJD8KKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworaWYgdGVzdCAteiAiJGRlcG1vZGUiIHx8IHRlc3QgLXogIiRzb3VyY2UiIHx8IHRlc3QgLXogIiRvYmplY3QiOyB0aGVuCisgIGVjaG8gImRlcGNvbXA6IFZhcmlhYmxlcyBzb3VyY2UsIG9iamVjdCBhbmQgZGVwbW9kZSBtdXN0IGJlIHNldCIgMT4mMgorICBleGl0IDEKK2ZpCisKKyMgRGVwZW5kZW5jaWVzIGZvciBzdWIvYmFyLm8gb3Igc3ViL2Jhci5vYmogZ28gaW50byBzdWIvLmRlcHMvYmFyLlBvLgorZGVwZmlsZT0ke2RlcGZpbGUtYGVjaG8gIiRvYmplY3QiIHwKKyAgc2VkICdzfFteXFwvXSokfCcke0RFUERJUi0uZGVwc30nLyZ8O3N8XC5cKFteLl0qXCkkfC5QXDF8O3N8UG9iaiR8UG98J2B9Cit0bXBkZXBmaWxlPSR7dG1wZGVwZmlsZS1gZWNobyAiJGRlcGZpbGUiIHwgc2VkICdzL1wuXChbXi5dKlwpJC8uVFwxLydgfQorCitybSAtZiAiJHRtcGRlcGZpbGUiCisKKyMgU29tZSBtb2RlcyB3b3JrIGp1c3QgbGlrZSBvdGhlciBtb2RlcywgYnV0IHVzZSBkaWZmZXJlbnQgZmxhZ3MuICBXZQorIyBwYXJhbWV0ZXJpemUgaGVyZSwgYnV0IHN0aWxsIGxpc3QgdGhlIG1vZGVzIGluIHRoZSBiaWcgY2FzZSBiZWxvdywKKyMgdG8gbWFrZSBkZXBlbmQubTQgZWFzaWVyIHRvIHdyaXRlLiAgTm90ZSB0aGF0IHdlICpjYW5ub3QqIHVzZSBhIGNhc2UKKyMgaGVyZSwgYmVjYXVzZSB0aGlzIGZpbGUgY2FuIG9ubHkgY29udGFpbiBvbmUgY2FzZSBzdGF0ZW1lbnQuCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBocDsgdGhlbgorICAjIEhQIGNvbXBpbGVyIHVzZXMgLU0gYW5kIG5vIGV4dHJhIGFyZy4KKyAgZ2NjZmxhZz0tTQorICBkZXBtb2RlPWdjYworZmkKKworaWYgdGVzdCAiJGRlcG1vZGUiID0gZGFzaFhtc3Rkb3V0OyB0aGVuCisgICAjIFRoaXMgaXMganVzdCBsaWtlIGRhc2htc3Rkb3V0IHdpdGggYSBkaWZmZXJlbnQgYXJndW1lbnQuCisgICBkYXNobWZsYWc9LXhNCisgICBkZXBtb2RlPWRhc2htc3Rkb3V0CitmaQorCitjeWdwYXRoX3U9ImN5Z3BhdGggLXUgLWYgLSIKK2lmIHRlc3QgIiRkZXBtb2RlIiA9IG1zdmNtc3lzOyB0aGVuCisgICAjIFRoaXMgaXMganVzdCBsaWtlIG1zdmlzdWFsY3BwIGJ1dCB3L28gY3lncGF0aCB0cmFuc2xhdGlvbi4KKyAgICMgSnVzdCBjb252ZXJ0IHRoZSBiYWNrc2xhc2gtZXNjYXBlZCBiYWNrc2xhc2hlcyB0byBzaW5nbGUgZm9yd2FyZAorICAgIyBzbGFzaGVzIHRvIHNhdGlzZnkgZGVwZW5kLm00CisgICBjeWdwYXRoX3U9InNlZCBzLFxcXFxcXFxcLC8sZyIKKyAgIGRlcG1vZGU9bXN2aXN1YWxjcHAKK2ZpCisKK2Nhc2UgIiRkZXBtb2RlIiBpbgorZ2NjMykKKyMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0CisjIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQorIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgorIyMgVW5mb3J0dW5hdGVseSwgRnJlZUJTRCBjODkgYWNjZXB0YW5jZSBvZiBmbGFncyBkZXBlbmRzIHVwb24KKyMjIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgb3JkZXI7IHNvIGFkZCB0aGUgZmxhZ3Mgd2hlcmUgdGhleQorIyMgYXBwZWFyIGluIGRlcGVuZDIuYW0uICBOb3RlIHRoYXQgdGhlIHNsb3dkb3duIGluY3VycmVkIGhlcmUKKyMjIGFmZmVjdHMgb25seSBjb25maWd1cmU6IGluIG1ha2VmaWxlcywgJUZBU1RERVAlIHNob3J0Y3V0cyB0aGlzLgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLWMpIHNldCBmbm9yZCAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIiAiJGFyZyIgOzsKKyAgICAqKSAgc2V0IGZub3JkICIkQCIgIiRhcmciIDs7CisgICAgZXNhYworICAgIHNoaWZ0ICMgZm5vcmQKKyAgICBzaGlmdCAjICRhcmcKKyAgZG9uZQorICAiJEAiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBtdiAiJHRtcGRlcGZpbGUiICIkZGVwZmlsZSIKKyAgOzsKKworZ2NjKQorIyMgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBnZXQgZGVwZW5kZW5jeSBvdXRwdXQgZnJvbSBnY2MuICBIZXJlJ3MKKyMjIHdoeSB3ZSBwaWNrIHRoaXMgcmF0aGVyIG9ic2N1cmUgbWV0aG9kOgorIyMgLSBEb24ndCB3YW50IHRvIHVzZSAtTUQgYmVjYXVzZSB3ZSdkIGxpa2UgdGhlIGRlcGVuZGVuY2llcyB0byBlbmQKKyMjICAgdXAgaW4gYSBzdWJkaXIuICBIYXZpbmcgdG8gcmVuYW1lIGJ5IGhhbmQgaXMgdWdseS4KKyMjICAgKFdlIG1pZ2h0IGVuZCB1cCBkb2luZyB0aGlzIGFueXdheSB0byBzdXBwb3J0IG90aGVyIGNvbXBpbGVycy4pCisjIyAtIFRoZSBERVBFTkRFTkNJRVNfT1VUUFVUIGVudmlyb25tZW50IHZhcmlhYmxlIG1ha2VzIGdjYyBhY3QgbGlrZQorIyMgICAtTU0sIG5vdCAtTSAoZGVzcGl0ZSB3aGF0IHRoZSBkb2NzIHNheSkuCisjIyAtIFVzaW5nIC1NIGRpcmVjdGx5IG1lYW5zIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIHR3aWNlIChldmVuIHdvcnNlCisjIyAgIHRoYW4gcmVuYW1pbmcpLgorICBpZiB0ZXN0IC16ICIkZ2NjZmxhZyI7IHRoZW4KKyAgICBnY2NmbGFnPS1NRCwKKyAgZmkKKyAgIiRAIiAtV3AsIiRnY2NmbGFnJHRtcGRlcGZpbGUiCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIGFscGhhPUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKKyMjIFRoZSBzZWNvbmQgLWUgZXhwcmVzc2lvbiBoYW5kbGVzIERPUy1zdHlsZSBmaWxlIG5hbWVzIHdpdGggZHJpdmUgbGV0dGVycy4KKyAgc2VkIC1lICdzL15bXjpdKjogLyAvJyBcCisgICAgICAtZSAncy9eWyckYWxwaGEnXTpcL1teOl0qOiAvIC8nIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisjIyBUaGlzIG5leHQgcGllY2Ugb2YgbWFnaWMgYXZvaWRzIHRoZSBgZGVsZXRlZCBoZWFkZXIgZmlsZScgcHJvYmxlbS4KKyMjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiBhIGhlYWRlciBmaWxlIHdoaWNoIGFwcGVhcnMgaW4gYSAuUCBmaWxlCisjIyBpcyBkZWxldGVkLCB0aGUgZGVwZW5kZW5jeSBjYXVzZXMgbWFrZSB0byBkaWUgKGJlY2F1c2UgdGhlcmUgaXMKKyMjIHR5cGljYWxseSBubyB3YXkgdG8gcmVidWlsZCB0aGUgaGVhZGVyKS4gIFdlIGF2b2lkIHRoaXMgYnkgYWRkaW5nCisjIyBkdW1teSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggaGVhZGVyIGZpbGUuICBUb28gYmFkIGdjYyBkb2Vzbid0IGRvCisjIyB0aGlzIGZvciB1cyBkaXJlY3RseS4KKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIHB1dCBhIHNwYWNlIGJlZm9yZSB0aGUgYDonLiAgT24gdGhlIHRoZW9yeQorIyMgdGhhdCB0aGUgc3BhY2UgbWVhbnMgc29tZXRoaW5nLCB3ZSBhZGQgYSBzcGFjZSB0byB0aGUgb3V0cHV0IGFzCisjIyB3ZWxsLgorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaHApCisgICMgVGhpcyBjYXNlIGV4aXN0cyBvbmx5IHRvIGxldCBkZXBlbmQubTQgZG8gaXRzIHdvcmsuICBJdCB3b3JrcyBieQorICAjIGxvb2tpbmcgYXQgdGhlIHRleHQgb2YgdGhpcyBzY3JpcHQuICBUaGlzIGNhc2Ugd2lsbCBuZXZlciBiZSBydW4sCisgICMgc2luY2UgaXQgaXMgY2hlY2tlZCBmb3IgYWJvdmUuCisgIGV4aXQgMQorICA7OworCitzZ2kpCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICIkQCIgIi1XcCwtTUR1cGRhdGUsJHRtcGRlcGZpbGUiCisgIGVsc2UKKyAgICAiJEAiIC1NRHVwZGF0ZSAiJHRtcGRlcGZpbGUiCisgIGZpCisgIHN0YXQ9JD8KKyAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgIGVsc2UKKyAgICBybSAtZiAiJHRtcGRlcGZpbGUiCisgICAgZXhpdCAkc3RhdAorICBmaQorICBybSAtZiAiJGRlcGZpbGUiCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuICAjIHllcywgdGhlIHNvdXJjZWZpbGUgZGVwZW5kIG9uIG90aGVyIGZpbGVzCisgICAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKworICAgICMgQ2xpcCBvZmYgdGhlIGluaXRpYWwgZWxlbWVudCAodGhlIGRlcGVuZGVudCkuICBEb24ndCB0cnkgdG8gYmUKKyAgICAjIGNsZXZlciBhbmQgcmVwbGFjZSB0aGlzIHdpdGggc2VkIGNvZGUsIGFzIElSSVggc2VkIHdvbid0IGhhbmRsZQorICAgICMgbGluZXMgd2l0aCBtb3JlIHRoYW4gYSBmaXhlZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoNDA5NiBpbgorICAgICMgSVJJWCA2LjIgc2VkLCA4MTkyIGluIElSSVggNi41KS4gIFdlIGFsc28gcmVtb3ZlIGNvbW1lbnQgbGluZXM7CisgICAgIyB0aGUgSVJJWCBjYyBhZGRzIGNvbW1lbnRzIGxpa2UgYCM6ZmVjJyB0byB0aGUgZW5kIG9mIHRoZQorICAgICMgZGVwZW5kZW5jeSBsaW5lLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICAgfCBzZWQgLWUgJ3MvXi4qXC5vOi8vJyAtZSAncy8jLiokLy8nIC1lICcvXiQvIGQnIHwgXAorICAgIHRyICcKKycgJyAnID4+ICIkZGVwZmlsZSIKKyAgICBlY2hvID4+ICIkZGVwZmlsZSIKKworICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAorICAgPj4gIiRkZXBmaWxlIgorICBlbHNlCisgICAgIyBUaGUgc291cmNlZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMsIHNvIGp1c3QKKyAgICAjIHN0b3JlIGEgZHVtbXkgY29tbWVudCBsaW5lLCB0byBhdm9pZCBlcnJvcnMgd2l0aCB0aGUgTWFrZWZpbGUKKyAgICAjICJpbmNsdWRlIGJhc2VuYW1lLlBsbyIgc2NoZW1lLgorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworYWl4KQorICAjIFRoZSBDIGZvciBBSVggQ29tcGlsZXIgdXNlcyAtTSBhbmQgb3V0cHV0cyB0aGUgZGVwZW5kZW5jaWVzCisgICMgaW4gYSAudSBmaWxlLiAgSW4gb2xkZXIgdmVyc2lvbnMsIHRoaXMgZmlsZSBhbHdheXMgbGl2ZXMgaW4gdGhlCisgICMgY3VycmVudCBkaXJlY3RvcnkuICBBbHNvLCB0aGUgQUlYIGNvbXBpbGVyIHB1dHMgYCRvYmplY3Q6JyBhdCB0aGUKKyAgIyBzdGFydCBvZiBlYWNoIGxpbmU7ICRvYmplY3QgZG9lc24ndCBoYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKyAgIyBWZXJzaW9uIDYgdXNlcyB0aGUgZGlyZWN0b3J5IGluIGJvdGggY2FzZXMuCisgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCisgIHRlc3QgIngkZGlyIiA9ICJ4JG9iamVjdCIgJiYgZGlyPQorICBiYXNlPWBlY2hvICIkb2JqZWN0IiB8IHNlZCAtZSAnc3xeLiovfHwnIC1lICdzL1wubyQvLycgLWUgJ3MvXC5sbyQvLydgCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTI9JGJhc2UudQorICAgIHRtcGRlcGZpbGUzPSRkaXIubGlicy8kYmFzZS51CisgICAgIiRAIiAtV2MsLU0KKyAgZWxzZQorICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS51CisgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLnUKKyAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UudQorICAgICIkQCIgLU0KKyAgZmkKKyAgc3RhdD0kPworCisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKKyAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIKKyAgZG8KKyAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgZG9uZQorICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICAjIEVhY2ggbGluZSBpcyBvZiB0aGUgZm9ybSBgZm9vLm86IGRlcGVuZGVudC5oJy4KKyAgICAjIERvIHR3byBwYXNzZXMsIG9uZSB0byBqdXN0IGNoYW5nZSB0aGVzZSB0bworICAgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICMgVGhhdCdzIGEgdGFiIGFuZCBhIHNwYWNlIGluIHRoZSBbXS4KKyAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WwkgXSosLCcgLWUgJ3MsJCw6LCcgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2ljYykKKyAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCisgICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYworICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jCisgICMgICAgZm9vLm86IHN1Yi9mb28uaAorICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYworICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCisgICMgICAgc3ViL2Zvby5jOgorICAjICAgIHN1Yi9mb28uaDoKKyAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKKyAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAorICAjICAgICBzdWIvZm9vLmggLi4uIFwKKyAgIyAgICAgLi4uCisKKyAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCisgICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCisgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisgICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8CisgICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworaHAyKQorICAjIFRoZSAiaHAiIHN0YW56YSBhYm92ZSBkb2VzIG5vdCB3b3JrIHdpdGggYUNDIChDKyspIGFuZCBIUCdzIGlhNjQKKyAgIyBjb21waWxlcnMsIHdoaWNoIGhhdmUgaW50ZWdyYXRlZCBwcmVwcm9jZXNzb3JzLiAgVGhlIGNvcnJlY3Qgb3B0aW9uCisgICMgdG8gdXNlIHdpdGggdGhlc2UgaXMgK01ha2VkOyBpdCB3cml0ZXMgZGVwZW5kZW5jaWVzIHRvIGEgZmlsZSBuYW1lZAorICAjICdmb28uZCcsIHdoaWNoIGxhbmRzIG5leHQgdG8gdGhlIG9iamVjdCBmaWxlLCB3aGVyZXZlciB0aGF0CisgICMgaGFwcGVucyB0byBiZS4KKyAgIyBNdWNoIG9mIHRoaXMgaXMgc2ltaWxhciB0byB0aGUgdHJ1NjQgY2FzZTsgc2VlIGNvbW1lbnRzIHRoZXJlLgorICBkaXI9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfC9bXi9dKiR8L3wnYAorICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgYmFzZT1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8Xi4qL3x8JyAtZSAncy9cLm8kLy8nIC1lICdzL1wubG8kLy8nYAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAorICAgIHRtcGRlcGZpbGUyPSRkaXIubGlicy8kYmFzZS5kCisgICAgIiRAIiAtV2MsK01ha2VkCisgIGVsc2UKKyAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2UuZAorICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCisgICAgIiRAIiArTWFrZWQKKyAgZmkKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIgorICAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIKKyAgZG8KKyAgICB0ZXN0IC1mICIkdG1wZGVwZmlsZSIgJiYgYnJlYWsKKyAgZG9uZQorICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgICAjIEFkZCBgZGVwZW5kZW50Lmg6JyBsaW5lcy4KKyAgICBzZWQgLW5lICcyLCR7CisJICAgICAgIHMvXiAqLy8KKwkgICAgICAgcy8gXFwqJC8vCisJICAgICAgIHMvJC86LworCSAgICAgICBwCisJICAgICB9JyAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgIGZpCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlMiIKKyAgOzsKKwordHJ1NjQpCisgICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCisgICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCisgICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0CisgICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KKyAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KKyAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCisgICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKworICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGggVHJ1NjQgY2MsIHNoYXJlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFrZSBhCisgICAgICAjIHN0YXRpYyBsaWJyYXJ5LiAgVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBpbiBsaWJ0b29sIDEuNCBzZXJpZXMgdG8KKyAgICAgICMgaGFuZGxlIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uLgorICAgICAgIyBXaXRoIGxpYnRvb2wgMS40LCBkZXBlbmRlbmNpZXMgd2VyZSBvdXRwdXQgaW4gJGRpci5saWJzLyRiYXNlLmxvLmQuCisgICAgICAjCisgICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhpcyBleGNlcHRpb24gd2FzIHJlbW92ZWQsIGFuZCBsaWJ0b29sIG5vdworICAgICAgIyBnZW5lcmF0ZXMgMiBzZXBhcmF0ZSBvYmplY3RzIGZvciB0aGUgMiBsaWJyYXJpZXMuICBUaGVzZSB0d28KKyAgICAgICMgY29tcGlsYXRpb25zIG91dHB1dCBkZXBlbmRlbmNpZXMgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQKKyAgICAgICMgaW4gJGRpciRiYXNlLm8uZC4gIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGJvdGggZmlsZXMsIGJlY2F1c2UKKyAgICAgICMgb25lIG9mIHRoZSB0d28gY29tcGlsYXRpb25zIGNhbiBiZSBkaXNhYmxlZC4gIFdlIHNob3VsZCBwcmVmZXIKKyAgICAgICMgJGRpciRiYXNlLm8uZCBvdmVyICRkaXIubGlicy8kYmFzZS5vLmQgYmVjYXVzZSB0aGUgbGF0dGVyIGlzCisgICAgICAjIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB3aGVuIC5saWJzLyBpcyBkZWxldGVkLCB3aGlsZSBpZ25vcmluZworICAgICAgIyB0aGUgZm9ybWVyIHdvdWxkIGNhdXNlIGEgZGlzdGNsZWFuY2hlY2sgcGFuaWMuCisgICAgICB0bXBkZXBmaWxlMT0kZGlyLmxpYnMvJGJhc2UubG8uZCAgICMgbGlidG9vbCAxLjQKKyAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5vLmQgICAgICAgICAgIyBsaWJ0b29sIDEuNQorICAgICAgdG1wZGVwZmlsZTM9JGRpci5saWJzLyRiYXNlLm8uZCAgICAjIGxpYnRvb2wgMS41CisgICAgICB0bXBkZXBmaWxlND0kZGlyLmxpYnMvJGJhc2UuZCAgICAgICMgQ29tcGFxIENDQyBWNi4yLTUwNAorICAgICAgIiRAIiAtV2MsLU1ECisgICBlbHNlCisgICAgICB0bXBkZXBmaWxlMT0kZGlyJGJhc2Uuby5kCisgICAgICB0bXBkZXBmaWxlMj0kZGlyJGJhc2UuZAorICAgICAgdG1wZGVwZmlsZTM9JGRpciRiYXNlLmQKKyAgICAgIHRtcGRlcGZpbGU0PSRkaXIkYmFzZS5kCisgICAgICAiJEAiIC1NRAorICAgZmkKKworICAgc3RhdD0kPworICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgICBlbHNlCisgICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgorICAgICAgZXhpdCAkc3RhdAorICAgZmkKKworICAgZm9yIHRtcGRlcGZpbGUgaW4gIiR0bXBkZXBmaWxlMSIgIiR0bXBkZXBmaWxlMiIgIiR0bXBkZXBmaWxlMyIgIiR0bXBkZXBmaWxlNCIKKyAgIGRvCisgICAgIHRlc3QgLWYgIiR0bXBkZXBmaWxlIiAmJiBicmVhaworICAgZG9uZQorICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgorICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICBlbHNlCisgICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICAgZmkKKyAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgIDs7CisKKyNub3NpZGVlZmZlY3QpCisgICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAorICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgorCitkYXNobXN0ZG91dCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgIlgkMSIgIT0gJ1gtLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIHRlc3QgLXogIiRkYXNobWZsYWciICYmIGRhc2htZmxhZz0tTQorICAjIFJlcXVpcmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgYDonCisgICMgaW4gdGhlIHRhcmdldCBuYW1lLiAgVGhpcyBpcyB0byBjb3BlIHdpdGggRE9TLXN0eWxlIGZpbGVuYW1lczoKKyAgIyBhIGRlcGVuZGVuY3kgc3VjaCBhcyBgYzovZm9vL2JhcicgY291bGQgYmUgc2VlbiBhcyB0YXJnZXQgYGMnIG90aGVyd2lzZS4KKyAgIiRAIiAkZGFzaG1mbGFnIHwKKyAgICBzZWQgJ3M6XlsgIF0qW146IF1bXjpdW146XSpcOlsgICAgXSo6JyIkb2JqZWN0IidcOiA6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitkYXNoWG1zdGRvdXQpCisgICMgVGhpcyBjYXNlIG9ubHkgZXhpc3RzIHRvIHNhdGlzZnkgZGVwZW5kLm00LiAgSXQgaXMgbmV2ZXIgYWN0dWFsbHkKKyAgIyBydW4sIGFzIHRoaXMgbW9kZSBpcyBzcGVjaWFsbHkgcmVjb2duaXplZCBpbiB0aGUgcHJlYW1ibGUuCisgIGV4aXQgMQorICA7OworCittYWtlZGVwZW5kKQorICAiJEAiIHx8IGV4aXQgJD8KKyAgIyBSZW1vdmUgYW55IExpYnRvb2wgY2FsbAorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKyAgIyBYIG1ha2VkZXBlbmQKKyAgc2hpZnQKKyAgY2xlYXJlZD1ubyBlYXQ9bm8KKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGNsZWFyZWQgaW4KKyAgICBubykKKyAgICAgIHNldCAiIjsgc2hpZnQKKyAgICAgIGNsZWFyZWQ9eWVzIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgJGVhdCA9IHllczsgdGhlbgorICAgICAgZWF0PW5vCisgICAgICBjb250aW51ZQorICAgIGZpCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAtRCp8LUkqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgICMgU3RyaXAgYW55IG9wdGlvbiB0aGF0IG1ha2VkZXBlbmQgbWF5IG5vdCB1bmRlcnN0YW5kLiAgUmVtb3ZlCisgICAgIyB0aGUgb2JqZWN0IHRvbywgb3RoZXJ3aXNlIG1ha2VkZXBlbmQgd2lsbCBwYXJzZSBpdCBhcyBhIHNvdXJjZSBmaWxlLgorICAgIC1hcmNoKQorICAgICAgZWF0PXllcyA7OworICAgIC0qfCRvYmplY3QpCisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgZXNhYworICBkb25lCisgIG9ial9zdWZmaXg9YGVjaG8gIiRvYmplY3QiIHwgc2VkICdzL14uKlwuLy4vJ2AKKyAgdG91Y2ggIiR0bXBkZXBmaWxlIgorICAke01BS0VERVBFTkQtbWFrZWRlcGVuZH0gLW8iJG9ial9zdWZmaXgiIC1mIiR0bXBkZXBmaWxlIiAiJEAiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgc2VkICcxLDJkJyAiJHRtcGRlcGZpbGUiIHwgdHIgJyAnICcKKycgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIiAiJHRtcGRlcGZpbGUiLmJhaworICA7OworCitjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICJYJDEiICE9ICdYLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAiJEAiIC1FIHwKKyAgICBzZWQgLW4gLWUgJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgXAorICAgICAgIC1lICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyB8CisgICAgc2VkICckIHM6IFxcJDo6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3Zpc3VhbGNwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQuCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgIlgkMSIgIT0gJ1gtLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgIiRhcmciIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgIi1HbSJ8Ii9HbSJ8Ii1HaSJ8Ii9HaSJ8Ii1aSSJ8Ii9aSSIpCisJc2V0IGZub3JkICIkQCIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICAqKQorCXNldCBmbm9yZCAiJEAiICIkYXJnIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgIGVzYWMKKyAgZG9uZQorICAiJEAiIC1FIDI+L2Rldi9udWxsIHwKKyAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjpcMTpwJyB8ICRjeWdwYXRoX3UgfCBzb3J0IC11ID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgLW4gLWUgJ3MlICVcXCAlZycgLWUgJy9eXCguKlwpJC8gczo6CVwxIFxcOnAnID4+ICIkZGVwZmlsZSIKKyAgZWNobyAiCSIgPj4gIiRkZXBmaWxlIgorICBzZWQgPCAiJHRtcGRlcGZpbGUiIC1uIC1lICdzJSAlXFwgJWcnIC1lICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK21zdmNtc3lzKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworbm9uZSkKKyAgZXhlYyAiJEAiCisgIDs7CisKKyopCisgIGVjaG8gIlVua25vd24gZGVwbW9kZSAkZGVwbW9kZSIgMT4mMgorICBleGl0IDEKKyAgOzsKK2VzYWMKKworZXhpdCAwCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLXRpbWUtem9uZTogIlVUQyIKKyMgdGltZS1zdGFtcC1lbmQ6ICI7ICMgVVRDIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9kanBlZy4xIGIvZGpwZWcuMQppbmRleCAxMWJlYjZhLi5hOTVkNDFjIDEwMDY0NAotLS0gYS9kanBlZy4xCisrKyBiL2RqcGVnLjEKQEAgLTEsNCArMSw0IEBACi0uVEggREpQRUcgMSAiMjIgQXVndXN0IDE5OTciCisuVEggREpQRUcgMSAiMjggTWFyY2ggMjAwOSIKIC5TSCBOQU1FCiBkanBlZyBcLSBkZWNvbXByZXNzIGEgSlBFRyBmaWxlIHRvIGFuIGltYWdlIGZpbGUKIC5TSCBTWU5PUFNJUwpAQCAtNjEsOSArNjEsMTEgQEAKIHJ1bnMgbm90aWNlYWJseSBmYXN0ZXIgaW4gdGhpcyBtb2RlLgogLlRQCiAuQkkgXC1zY2FsZSAiIE0vTiIKLVNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5IHRoZSBzY2FsZSBmYWN0b3IgbXVzdCBiZQotMS8xLCAxLzIsIDEvNCwgb3IgMS84LiAgU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91cgotc2NyZWVuOyBhbHNvLAorU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZhY3RvciBNL04uICBDdXJyZW50bHkgc3VwcG9ydGVkIHNjYWxlIGZhY3RvcnMgYXJlCitNLzggd2l0aCBhbGwgTSBmcm9tIDEgdG8gMTYuICBJZiB0aGUgL04gcGFydCBpcyBvbWl0dGVkLCB0aGVuIE0gc3BlY2lmaWVzIHRoZQorRENUIHNjYWxlZCBzaXplIHRvIGJlIGFwcGxpZWQgb24gdGhlIGdpdmVuIGlucHV0LCB3aGljaCBpcyBjdXJyZW50bHkKK2VxdWl2YWxlbnQgdG8gTS84IHNjYWxpbmcsIHNpbmNlIHRoZSBzb3VyY2UgRENUIHNpemUgaXMgY3VycmVudGx5IGFsd2F5cyA4LgorU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91ciBzY3JlZW47IGFsc28sCiAuQiBkanBlZwogcnVucyBtdWNoIGZhc3RlciB3aGVuIHNjYWxpbmcgZG93biB0aGUgb3V0cHV0LgogLlRQCkBAIC0xNTAsNyArMTUyLDcgQEAKIC5CUiBcLW9uZXBhc3MgLgogLlRQCiAuQiBcLW5vc21vb3RoCi1Vc2UgYSBmYXN0ZXIsIGxvd2VyLXF1YWxpdHkgdXBzYW1wbGluZyByb3V0aW5lLgorRG9uJ3QgdXNlIGhpZ2gtcXVhbGl0eSB1cHNhbXBsaW5nLgogLlRQCiAuQiBcLW9uZXBhc3MKIFVzZSBvbmUtcGFzcyBpbnN0ZWFkIG9mIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbi4gIFRoZSBvbmUtcGFzcyBtZXRob2QgaXMKQEAgLTI0MywxMSArMjQ1LDcgQEAKIC5TSCBBVVRIT1IKIEluZGVwZW5kZW50IEpQRUcgR3JvdXAKIC5TSCBCVUdTCi1Bcml0aG1ldGljIGNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLgotLlBQCiBUbyBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsCiAuQiBkanBlZwogcHJvZHVjZXMgdW5jb21wcmVzc2VkIEdJRiBmaWxlcy4gIFRoZXNlIGFyZSBsYXJnZXIgdGhhbiB0aGV5IHNob3VsZCBiZSwgYnV0CiBhcmUgcmVhZGFibGUgYnkgc3RhbmRhcmQgR0lGIGRlY29kZXJzLgotLlBQCi1TdGlsbCBub3QgYXMgZmFzdCBhcyB3ZSdkIGxpa2UuCmRpZmYgLS1naXQgYS9kanBlZy5jIGIvZGpwZWcuYwppbmRleCBlMDk5ZTkwLi5iYzU0NGRjIDEwMDY0NAotLS0gYS9kanBlZy5jCisrKyBiL2RqcGVnLmMKQEAgLTIsNiArMiw3IEBACiAgKiBkanBlZy5jCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogTW9kaWZpZWQgMjAwOSBieSBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC0zMjcsNyArMzI4LDcgQEAKICAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCiAJdXNhZ2UoKTsKICAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkLyVkIiwKLQkJICZjaW5mby0+c2NhbGVfbnVtLCAmY2luZm8tPnNjYWxlX2Rlbm9tKSAhPSAyKQorCQkgJmNpbmZvLT5zY2FsZV9udW0sICZjaW5mby0+c2NhbGVfZGVub20pIDwgMSkKIAl1c2FnZSgpOwogCiAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0YXJnYSIsIDEpKSB7CmRpZmYgLS1naXQgYS9leGFtcGxlLmMgYi9leGFtcGxlLmMKaW5kZXggN2ZjMzU0Zi4uMWQ2ZjZjYyAxMDA2NDQKLS0tIGEvZXhhbXBsZS5jCisrKyBiL2V4YW1wbGUuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBUaGlzIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgSUpHIGNvZGUgYXMgYSBzdWJyb3V0aW5lIGxpYnJhcnkKICAqIHRvIHJlYWQgb3Igd3JpdGUgSlBFRyBpbWFnZSBmaWxlcy4gIFlvdSBzaG91bGQgbG9vayBhdCB0aGlzIGNvZGUgaW4KLSAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRvY3VtZW50YXRpb24gZmlsZSBsaWJqcGVnLmRvYy4KKyAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRvY3VtZW50YXRpb24gZmlsZSBsaWJqcGVnLnR4dC4KICAqCiAgKiBUaGlzIGNvZGUgd2lsbCBub3QgZG8gYW55dGhpbmcgdXNlZnVsIGFzLWlzLCBidXQgaXQgbWF5IGJlIGhlbHBmdWwgYXMgYQogICogc2tlbGV0b24gZm9yIGNvbnN0cnVjdGluZyByb3V0aW5lcyB0aGF0IGNhbGwgdGhlIEpQRUcgbGlicmFyeS4gIApAQCAtMTk2LDcgKzE5Niw3IEBACiAgKiBmaWxlcyBmb3IgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGZpdCB3aXRoaW4gdGhlIG1heGltdW0tbWVtb3J5IHNldHRpbmcuCiAgKiAoTm90ZSB0aGF0IHRlbXAgZmlsZXMgYXJlIE5PVCBuZWVkZWQgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLikKICAqIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQKLSAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLmRvYy4KKyAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLnR4dC4KICAqCiAgKiBTY2FubGluZXMgTVVTVCBiZSBzdXBwbGllZCBpbiB0b3AtdG8tYm90dG9tIG9yZGVyIGlmIHlvdSB3YW50IHlvdXIgSlBFRwogICogZmlsZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV2ZXJ5b25lIGVsc2Uncy4gIElmIHlvdSBjYW5ub3QgcmVhZGlseSByZWFkCkBAIC0zMzUsNyArMzM1LDcgQEAKICAgLyogV2UgY2FuIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20ganBlZ19yZWFkX2hlYWRlciBzaW5jZQogICAgKiAgIChhKSBzdXNwZW5zaW9uIGlzIG5vdCBwb3NzaWJsZSB3aXRoIHRoZSBzdGRpbyBkYXRhIHNvdXJjZSwgYW5kCiAgICAqICAgKGIpIHdlIHBhc3NlZCBUUlVFIHRvIHJlamVjdCBhIHRhYmxlcy1vbmx5IEpQRUcgZmlsZSBhcyBhbiBlcnJvci4KLSAgICogU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGluZm8uCisgICAqIFNlZSBsaWJqcGVnLnR4dCBmb3IgbW9yZSBpbmZvLgogICAgKi8KIAogICAvKiBTdGVwIDQ6IHNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uICovCkBAIC00MTMsMTQgKzQxMywxNCBAQAogICogSW4gdGhlIGFib3ZlIGNvZGUsIHdlIGlnbm9yZWQgdGhlIHJldHVybiB2YWx1ZSBvZiBqcGVnX3JlYWRfc2NhbmxpbmVzLAogICogd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzY2FubGluZXMgYWN0dWFsbHkgcmVhZC4gIFdlIGNvdWxkIGdldCBhd2F5IHdpdGgKICAqIHRoaXMgYmVjYXVzZSB3ZSBhc2tlZCBmb3Igb25seSBvbmUgbGluZSBhdCBhIHRpbWUgYW5kIHdlIHdlcmVuJ3QgdXNpbmcKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZS4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBpbmZvLgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlLiAgU2VlIGxpYmpwZWcudHh0IGZvciBtb3JlIGluZm8uCiAgKgogICogV2UgY2hlYXRlZCBhIGJpdCBieSBjYWxsaW5nIGFsbG9jX3NhcnJheSgpIGFmdGVyIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpOwogICogd2Ugc2hvdWxkIGhhdmUgZG9uZSBpdCBiZWZvcmVoYW5kIHRvIGVuc3VyZSB0aGF0IHRoZSBzcGFjZSB3b3VsZCBiZQogICogY291bnRlZCBhZ2FpbnN0IHRoZSBKUEVHIG1heF9tZW1vcnkgc2V0dGluZy4gIEluIHNvbWUgc3lzdGVtcyB0aGUgYWJvdmUKICAqIGNvZGUgd291bGQgcmlzayBhbiBvdXQtb2YtbWVtb3J5IGVycm9yLiAgSG93ZXZlciwgaW4gZ2VuZXJhbCB3ZSBkb24ndAogICoga25vdyB0aGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYmVmb3JlIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLCB1bmxlc3Mgd2UKLSAqIGNhbGwganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkuICBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgYWJvdXQgdGhpcy4KKyAqIGNhbGwganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkuICBTZWUgbGlianBlZy50eHQgZm9yIG1vcmUgYWJvdXQgdGhpcy4KICAqCiAgKiBTY2FubGluZXMgYXJlIHJldHVybmVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBKUEVHIGZpbGUsCiAgKiB3aGljaCBpcyBzdGFuZGFyZGx5IHRvcC10by1ib3R0b20uICBJZiB5b3UgbXVzdCBlbWl0IGRhdGEgYm90dG9tLXRvLXRvcCwKQEAgLTQyOSw1ICs0MjksNSBAQAogICoKICAqIEFzIHdpdGggY29tcHJlc3Npb24sIHNvbWUgb3BlcmF0aW5nIG1vZGVzIG1heSByZXF1aXJlIHRlbXBvcmFyeSBmaWxlcy4KICAqIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQKLSAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLmRvYy4KKyAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLnR4dC4KICAqLwpkaWZmIC0tZ2l0IGEvZmlsZWxpc3QuZG9jIGIvZmlsZWxpc3QudHh0CnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIGZpbGVsaXN0LmRvYwpyZW5hbWUgdG8gZmlsZWxpc3QudHh0CmluZGV4IGUxNDk4MmMuLjY0ZjJkOTIgMTAwNjQ0Ci0tLSBhL2ZpbGVsaXN0LmRvYworKysgYi9maWxlbGlzdC50eHQKQEAgLTEsNiArMSw2IEBACiBJSkcgSlBFRyBMSUJSQVJZOiAgRklMRSBMSVNUCiAKLUNvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK0NvcHlyaWdodCAoQykgMTk5NC0yMDA5LCBUaG9tYXMgRy4gTGFuZSwgR3VpZG8gVm9sbGJlZGluZy4KIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAKQEAgLTI4LDggKzI4LDYgQEAKIGppbmNsdWRlLmgJQ2VudHJhbCBpbmNsdWRlIGZpbGUgdXNlZCBieSBhbGwgSUpHIC5jIGZpbGVzIHRvIHJlZmVyZW5jZQogCQlzeXN0ZW0gaW5jbHVkZSBmaWxlcy4KIGpwZWdpbnQuaAlKUEVHIGxpYnJhcnkncyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCi1qY2h1ZmYuaAlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbmNvZGVyIG1vZHVsZXMuCi1qZGh1ZmYuaAlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBkZWNvZGVyIG1vZHVsZXMuCiBqZGN0LmgJCVByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBmb3J3YXJkICYgcmV2ZXJzZSBEQ1Qgc3Vic3lzdGVtcy4KIGptZW1zeXMuaAlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLgoganZlcnNpb24uaAlWZXJzaW9uIGluZm9ybWF0aW9uLgpAQCAtNzIsOCArNzAsOCBAQAogamZkY3RpbnQuYwlGb3J3YXJkIERDVCB1c2luZyBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KIGpmZGN0ZnN0LmMJRm9yd2FyZCBEQ1QgdXNpbmcgZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgogamZkY3RmbHQuYwlGb3J3YXJkIERDVCB1c2luZyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgotamNodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGNvZGluZyBmb3Igc2VxdWVudGlhbCBKUEVHLgotamNwaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBjb2RpbmcgZm9yIHByb2dyZXNzaXZlIEpQRUcuCitqY2h1ZmYuYwlIdWZmbWFuIGVudHJvcHkgY29kaW5nLgoramNhcml0aC5jCUFyaXRobWV0aWMgZW50cm9weSBjb2RpbmcuCiBqY21hcmtlci5jCUpQRUcgbWFya2VyIHdyaXRpbmcuCiBqZGF0YWRzdC5jCURhdGEgZGVzdGluYXRpb24gbWFuYWdlciBmb3Igc3RkaW8gb3V0cHV0LgogCkBAIC04NSwxMyArODMsMTIgQEAKIGpkY29lZmN0LmMJQnVmZmVyIGNvbnRyb2xsZXIgZm9yIERDVCBjb2VmZmljaWVudCBidWZmZXIuCiBqZHBvc3RjdC5jCVBvc3Rwcm9jZXNzb3IgYnVmZmVyIGNvbnRyb2xsZXIuCiBqZG1hcmtlci5jCUpQRUcgbWFya2VyIHJlYWRpbmcuCi1qZGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcgZm9yIHNlcXVlbnRpYWwgSlBFRy4KLWpkcGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcgZm9yIHByb2dyZXNzaXZlIEpQRUcuCitqZGh1ZmYuYwlIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcuCitqZGFyaXRoLmMJQXJpdGhtZXRpYyBlbnRyb3B5IGRlY29kaW5nLgogamRkY3RtZ3IuYwlJRENUIG1hbmFnZXIgKElEQ1QgaW1wbGVtZW50YXRpb24gc2VsZWN0aW9uICYgY29udHJvbCkuCiBqaWRjdGludC5jCUludmVyc2UgRENUIHVzaW5nIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgogamlkY3Rmc3QuYwlJbnZlcnNlIERDVCB1c2luZyBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCiBqaWRjdGZsdC5jCUludmVyc2UgRENUIHVzaW5nIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCi1qaWRjdHJlZC5jCUludmVyc2UgRENUcyB3aXRoIHJlZHVjZWQtc2l6ZSBvdXRwdXRzLgogamRzYW1wbGUuYwlVcHNhbXBsaW5nLgogamRjb2xvci5jCUNvbG9yIHNwYWNlIGNvbnZlcnNpb24uCiBqZG1lcmdlLmMJTWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbiAoZmFzdGVyLCBsb3dlciBxdWFsaXR5KS4KQEAgLTEwMiw2ICs5OSw4IEBACiAKIFN1cHBvcnQgZmlsZXMgZm9yIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb246CiAKK2phcmljb20uYwlUYWJsZXMgZm9yIGNvbW1vbiB1c2UgaW4gYXJpdGhtZXRpYyBlbnRyb3B5IGVuY29kaW5nIGFuZAorCQlkZWNvZGluZyByb3V0aW5lcy4KIGplcnJvci5jCVN0YW5kYXJkIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIChhcHBsaWNhdGlvbiByZXBsYWNlYWJsZSkuCiBqbWVtbWdyLmMJU3lzdGVtLWluZGVwZW5kZW50IChtb3JlIG9yIGxlc3MpIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuCiBqdXRpbHMuYwlNaXNjZWxsYW5lb3VzIHV0aWxpdHkgcm91dGluZXMuCkBAIC0xMTgsNyArMTE3LDcgQEAKIGptZW1tYWMuYwlDdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIEFwcGxlIE1hY2ludG9zaC4KIAogRXhhY3RseSBvbmUgb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQgbW9kdWxlcyBzaG91bGQgYmUgY29uZmlndXJlZCBpbnRvIGFuCi1pbnN0YWxsZWQgSlBFRyBsaWJyYXJ5IChzZWUgaW5zdGFsbC5kb2MgZm9yIGhpbnRzIGFib3V0IHdoaWNoIG9uZSB0byB1c2UpLgoraW5zdGFsbGVkIEpQRUcgbGlicmFyeSAoc2VlIGluc3RhbGwudHh0IGZvciBoaW50cyBhYm91dCB3aGljaCBvbmUgdG8gdXNlKS4KIE9uIHVudXN1YWwgc3lzdGVtcyB5b3UgbWF5IGZpbmQgaXQgd29ydGh3aGlsZSB0byBtYWtlIGEgc3BlY2lhbAogc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlci4KIApAQCAtMTg0LDI3ICsxODMsMzMgQEAKIERvY3VtZW50YXRpb24gKHNlZSBSRUFETUUgZm9yIGEgZ3VpZGUgdG8gdGhlIGRvY3VtZW50YXRpb24gZmlsZXMpOgogCiBSRUFETUUJCU1hc3RlciBkb2N1bWVudGF0aW9uIGZpbGUuCi0qLmRvYwkJT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcy4KKyoudHh0CQlPdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzLgogKi4xCQlEb2N1bWVudGF0aW9uIGluIFVuaXggbWFuIHBhZ2UgZm9ybWF0LgogY2hhbmdlLmxvZwlWZXJzaW9uLXRvLXZlcnNpb24gY2hhbmdlIGhpZ2hsaWdodHMuCiBleGFtcGxlLmMJU2FtcGxlIGNvZGUgZm9yIGNhbGxpbmcgSlBFRyBsaWJyYXJ5LgogCi1Db25maWd1cmF0aW9uL2luc3RhbGxhdGlvbiBmaWxlcyBhbmQgcHJvZ3JhbXMgKHNlZSBpbnN0YWxsLmRvYyBmb3IgbW9yZSBpbmZvKToKK0NvbmZpZ3VyYXRpb24vaW5zdGFsbGF0aW9uIGZpbGVzIGFuZCBwcm9ncmFtcyAoc2VlIGluc3RhbGwudHh0IGZvciBtb3JlIGluZm8pOgogCiBjb25maWd1cmUJVW5peCBzaGVsbCBzY3JpcHQgdG8gcGVyZm9ybSBhdXRvbWF0aWMgY29uZmlndXJhdGlvbi4KLWx0Y29uZmlnCVN1cHBvcnQgc2NyaXB0cyBmb3IgY29uZmlndXJlIChmcm9tIEdOVSBsaWJ0b29sKS4KLWx0bWFpbi5zaAorY29uZmlndXJlLmFjCVNvdXJjZSBmaWxlIGZvciB1c2Ugd2l0aCBBdXRvY29uZiB0byBnZW5lcmF0ZSBjb25maWd1cmUuCitsdG1haW4uc2gJU3VwcG9ydCBzY3JpcHRzIGZvciBjb25maWd1cmUgKGZyb20gR05VIGxpYnRvb2wpLgogY29uZmlnLmd1ZXNzCiBjb25maWcuc3ViCitkZXBjb21wCittaXNzaW5nCiBpbnN0YWxsLXNoCUluc3RhbGwgc2hlbGwgc2NyaXB0IGZvciB0aG9zZSBVbml4IHN5c3RlbXMgbGFja2luZyBvbmUuCitNYWtlZmlsZS5pbglNYWtlZmlsZSBpbnB1dCBmb3IgY29uZmlndXJlLgorTWFrZWZpbGUuYW0JU291cmNlIGZpbGUgZm9yIHVzZSB3aXRoIEF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluLgogY2tjb25maWcuYwlQcm9ncmFtIHRvIGdlbmVyYXRlIGpjb25maWcuaCBvbiBub24tVW5peCBzeXN0ZW1zLgotamNvbmZpZy5kb2MJVGVtcGxhdGUgZm9yIG1ha2luZyBqY29uZmlnLmggYnkgaGFuZC4KLW1ha2VmaWxlLioJU2FtcGxlIG1ha2VmaWxlcyBmb3IgcGFydGljdWxhciBzeXN0ZW1zLgoramNvbmZpZy50eHQJVGVtcGxhdGUgZm9yIG1ha2luZyBqY29uZmlnLmggYnkgaGFuZC4KK21hayouKgkJU2FtcGxlIG1ha2VmaWxlcyBmb3IgcGFydGljdWxhciBzeXN0ZW1zLgogamNvbmZpZy4qCVNhbXBsZSBqY29uZmlnLmggZm9yIHBhcnRpY3VsYXIgc3lzdGVtcy4KK2xpYmpwZWcubWFwCVNjcmlwdCB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyeSB3aXRoIHZlcnNpb25lZCBzeW1ib2xzLgorYWNsb2NhbC5tNAlNNCBtYWNybyBkZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggQXV0b2NvbmYuCiBhbnNpMmtuci5jCURlLUFOU0lmaWVyIGZvciBwcmUtQU5TSSBDIGNvbXBpbGVycyAoY291cnRlc3kgb2YKIAkJTC4gUGV0ZXIgRGV1dHNjaCBhbmQgQWxhZGRpbiBFbnRlcnByaXNlcykuCiAKLVRlc3QgZmlsZXMgKHNlZSBpbnN0YWxsLmRvYyBmb3IgdGVzdCBwcm9jZWR1cmUpOgorVGVzdCBmaWxlcyAoc2VlIGluc3RhbGwudHh0IGZvciB0ZXN0IHByb2NlZHVyZSk6CiAKIHRlc3QqLioJCVNvdXJjZSBhbmQgY29tcGFyaXNvbiBmaWxlcyBmb3IgY29uZmlkZW5jZSB0ZXN0LgogCQlUaGVzZSBhcmUgYmluYXJ5IGltYWdlIGZpbGVzLCBOT1QgdGV4dCBmaWxlcy4KZGlmZiAtLWdpdCBhL2luc3RhbGwtc2ggYi9pbnN0YWxsLXNoCmluZGV4IGU4NDM2NjkuLjY3ODFiOTggMTAwNzU1Ci0tLSBhL2luc3RhbGwtc2gKKysrIGIvaW5zdGFsbC1zaApAQCAtMSwyNTAgKzEsNTIwIEBACiAjIS9iaW4vc2gKLSMKICMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCi0jIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKworc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQworCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCiAjCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KICMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0jIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0jIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0jIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgotIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCi0jIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCi0jIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KICMKICMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKICMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKICMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KICMKICMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgotIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgotIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKyMgZnJvbSBzY3JhdGNoLgogCitubD0nCisnCitJRlM9IiAiIgkkbmwiCiAKICMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAogCiAjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCi1kb2l0PSIke0RPSVRQUk9HLX0iCi0KLQotIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCi0KLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCi0KLXRyYW5zZm9ybWJhc2VuYW1lPSIiCi10cmFuc2Zvcm1fYXJnPSIiCi1pbnN0Y21kPSIkbXZwcm9nIgotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPSIiCi1jaGdycGNtZD0iIgotc3RyaXBjbWQ9IiIKLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9IiIKLWRzdD0iIgotZGlyX2FyZz0iIgotCi13aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KLSAgICBjYXNlICQxIGluCi0JLWMpIGluc3RjbWQ9IiRjcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1kKSBkaXJfYXJnPXRydWUKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KLQkgICAgdGhlbgotCQlzcmM9JDEKLQkgICAgZWxzZQotCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKLQkJOgotCQlkc3Q9JDEKLQkgICAgZmkKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotICAgIGVzYWMKLWRvbmUKLQotaWYgWyB4IiRzcmMiID0geCBdCi10aGVuCi0JZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCi0JZXhpdCAxCitkb2l0PSR7RE9JVFBST0ctfQoraWYgdGVzdCAteiAiJGRvaXQiOyB0aGVuCisgIGRvaXRfZXhlYz1leGVjCiBlbHNlCi0JdHJ1ZQorICBkb2l0X2V4ZWM9JGRvaXQKIGZpCiAKLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCi0JZHN0PSRzcmMKLQlzcmM9IiIKLQkKLQlpZiBbIC1kICRkc3QgXTsgdGhlbgotCQlpbnN0Y21kPToKLQllbHNlCi0JCWluc3RjbWQ9bWtkaXIKLQlmaQotZWxzZQorIyBQdXQgaW4gYWJzb2x1dGUgZmlsZSBuYW1lcyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsKKyMgb3IgdXNlIGVudmlyb25tZW50IHZhcnMuCiAKLSMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAotIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKLSMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQorY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQorY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQorY21wcHJvZz0ke0NNUFBST0ctY21wfQorY3Bwcm9nPSR7Q1BQUk9HLWNwfQorbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQorbXZwcm9nPSR7TVZQUk9HLW12fQorcm1wcm9nPSR7Uk1QUk9HLXJtfQorc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQogCi0JaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQotCXRoZW4KLQkJdHJ1ZQotCWVsc2UKLQkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCi0JCWV4aXQgMQotCWZpCi0JCi0JaWYgWyB4IiRkc3QiID0geCBdCi0JdGhlbgotCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0JCWV4aXQgMQotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCi0jIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKLQotCWlmIFsgLWQgJGRzdCBdCi0JdGhlbgotCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAotCWVsc2UKLQkJdHJ1ZQotCWZpCi1maQotCi0jIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKLWRzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KLSMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAotCi0jIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgotaWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCi1kZWZhdWx0SUZTPScJCitwb3NpeF9nbG9iPSc/JworaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKKyAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7CisgICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHBvc2l4X2dsb2I9CisgICAgZWxzZQorICAgICAgcG9zaXhfZ2xvYj06CisgICAgZmkKKyAgfQogJwotSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKIAotb0lGUz0iJHtJRlN9IgotIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KLUlGUz0nJScKLXNldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAotSUZTPSIke29JRlN9IgorcG9zaXhfbWtkaXI9CiAKLXBhdGhjb21wPScnCisjIERlc2lyZWQgbW9kZSBvZiBpbnN0YWxsZWQgZmlsZS4KK21vZGU9MDc1NQogCi13aGlsZSBbICQjIC1uZSAwIF0gOyBkbwotCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCi0Jc2hpZnQKK2NoZ3JwY21kPQorY2htb2RjbWQ9JGNobW9kcHJvZworY2hvd25jbWQ9CittdmNtZD0kbXZwcm9nCitybWNtZD0iJHJtcHJvZyAtZiIKK3N0cmlwY21kPQogCi0JaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7Ci0gICAgICAgIHRoZW4KLQkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCi0JZWxzZQotCQl0cnVlCi0JZmkKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3RfYXJnPQogCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKK2NvcHlfb25fY2hhbmdlPWZhbHNlCitub190YXJnZXRfZGlyZWN0b3J5PQorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFstVF0gU1JDRklMRSBEU1RGSUxFCisgICBvcjogJDAgW09QVElPTl0uLi4gU1JDRklMRVMuLi4gRElSRUNUT1JZCisgICBvcjogJDAgW09QVElPTl0uLi4gLXQgRElSRUNUT1JZIFNSQ0ZJTEVTLi4uCisgICBvcjogJDAgW09QVElPTl0uLi4gLWQgRElSRUNUT1JJRVMuLi4KKworSW4gdGhlIDFzdCBmb3JtLCBjb3B5IFNSQ0ZJTEUgdG8gRFNURklMRS4KK0luIHRoZSAybmQgYW5kIDNyZCwgY29weSBhbGwgU1JDRklMRVMgdG8gRElSRUNUT1JZLgorSW4gdGhlIDR0aCwgY3JlYXRlIERJUkVDVE9SSUVTLgorCitPcHRpb25zOgorICAgICAtLWhlbHAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0LgorICAgICAtLXZlcnNpb24gIGRpc3BsYXkgdmVyc2lvbiBpbmZvIGFuZCBleGl0LgorCisgIC1jICAgICAgICAgICAgKGlnbm9yZWQpCisgIC1DICAgICAgICAgICAgaW5zdGFsbCBvbmx5IGlmIGRpZmZlcmVudCAocHJlc2VydmUgdGhlIGxhc3QgZGF0YSBtb2RpZmljYXRpb24gdGltZSkKKyAgLWQgICAgICAgICAgICBjcmVhdGUgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiBpbnN0YWxsaW5nIGZpbGVzLgorICAtZyBHUk9VUCAgICAgICRjaGdycHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIEdST1VQLgorICAtbSBNT0RFICAgICAgICRjaG1vZHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIE1PREUuCisgIC1vIFVTRVIgICAgICAgJGNob3ducHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gVVNFUi4KKyAgLXMgICAgICAgICAgICAkc3RyaXBwcm9nIGluc3RhbGxlZCBmaWxlcy4KKyAgLXQgRElSRUNUT1JZICBpbnN0YWxsIGludG8gRElSRUNUT1JZLgorICAtVCAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvciBpZiBEU1RGSUxFIGlzIGEgZGlyZWN0b3J5LgorCitFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29tbWFuZHM6CisgIENIR1JQUFJPRyBDSE1PRFBST0cgQ0hPV05QUk9HIENNUFBST0cgQ1BQUk9HIE1LRElSUFJPRyBNVlBST0cKKyAgUk1QUk9HIFNUUklQUFJPRworIgorCit3aGlsZSB0ZXN0ICQjIC1uZSAwOyBkbworICBjYXNlICQxIGluCisgICAgLWMpIDs7CisKKyAgICAtQykgY29weV9vbl9jaGFuZ2U9dHJ1ZTs7CisKKyAgICAtZCkgZGlyX2FyZz10cnVlOzsKKworICAgIC1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKwlzaGlmdDs7CisKKyAgICAtLWhlbHApIGVjaG8gIiR1c2FnZSI7IGV4aXQgJD87OworCisgICAgLW0pIG1vZGU9JDIKKwljYXNlICRtb2RlIGluCisJICAqJyAnKiB8IConCScqIHwgKicKKycqCSAgfCAqJyonKiB8IConPycqIHwgKidbJyopCisJICAgIGVjaG8gIiQwOiBpbnZhbGlkIG1vZGU6ICRtb2RlIiA+JjIKKwkgICAgZXhpdCAxOzsKKwllc2FjCisJc2hpZnQ7OworCisgICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCXNoaWZ0OzsKKworICAgIC1zKSBzdHJpcGNtZD0kc3RyaXBwcm9nOzsKKworICAgIC10KSBkc3RfYXJnPSQyCisJc2hpZnQ7OworCisgICAgLVQpIG5vX3RhcmdldF9kaXJlY3Rvcnk9dHJ1ZTs7CisKKyAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAkPzs7CisKKyAgICAtLSkJc2hpZnQKKwlicmVhazs7CisKKyAgICAtKikJZWNobyAiJDA6IGludmFsaWQgb3B0aW9uOiAkMSIgPiYyCisJZXhpdCAxOzsKKworICAgICopICBicmVhazs7CisgIGVzYWMKKyAgc2hpZnQKIGRvbmUKKworaWYgdGVzdCAkIyAtbmUgMCAmJiB0ZXN0IC16ICIkZGlyX2FyZyRkc3RfYXJnIjsgdGhlbgorICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKyAgIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KKyAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorICBmb3IgYXJnCisgIGRvCisgICAgaWYgdGVzdCAtbiAiJGRzdF9hcmciOyB0aGVuCisgICAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KKyAgICAgIHNldCBmbm9yZCAiJEAiICIkZHN0X2FyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICBmaQorICAgIHNoaWZ0ICMgYXJnCisgICAgZHN0X2FyZz0kYXJnCisgIGRvbmUKIGZpCiAKLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgoraWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgICBlY2hvICIkMDogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuIiA+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgIyBJdCdzIE9LIHRvIGNhbGwgYGluc3RhbGwtc2ggLWQnIHdpdGhvdXQgYXJndW1lbnQuCisgICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gY3JlYXRpbmcgY29uZGl0aW9uYWwgZGlyZWN0b3JpZXMuCisgIGV4aXQgMAorZmkKIAotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKLWVsc2UKK2lmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQogCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KKyAgIyBTZXQgdW1hc2sgc28gYXMgbm90IHRvIGNyZWF0ZSB0ZW1wcyB3aXRoIHRvby1nZW5lcm91cyBtb2Rlcy4KKyAgIyBIb3dldmVyLCAnc3RyaXAnIHJlcXVpcmVzIGJvdGggcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHRvIHRlbXBzLgorICBjYXNlICRtb2RlIGluCisgICAgIyBPcHRpbWl6ZSBjb21tb24gY2FzZXMuCisgICAgKjY0NCkgY3BfdW1hc2s9MTMzOzsKKyAgICAqNzU1KSBjcF91bWFzaz0yMjs7CiAKLQlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorICAgICpbMC03XSkKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSclIDIwMCcKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSx1K3J3CisgICAgICBmaQorICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKKyAgZXNhYworZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICBjYXNlICRzcmMgaW4KKyAgICAtKikgc3JjPS4vJHNyYzs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIGRzdGRpcj0kZHN0CisgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICBkc3RkaXJfc3RhdHVzPSQ/CisgIGVsc2UKKworICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBkc3Q9JGRzdF9hcmcKKyAgICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgICAgY2FzZSAkZHN0IGluCisgICAgICAtKikgZHN0PS4vJGRzdDs7CisgICAgZXNhYworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGRzdGRpcj0kZHN0CisgICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAorICAgICAgZHN0ZGlyX3N0YXR1cz0wCisgICAgZWxzZQorICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KKyAgICAgIGRzdGRpcj1gCisJKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAorCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKwllY2hvIFgiJGRzdCIgfAorCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXClbXi9dLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXCkkL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cKS4qL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIHMvLiovLi87IHEnCisgICAgICBgCisKKyAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgICBkc3RkaXJfc3RhdHVzPSQ/CisgICAgZmkKKyAgZmkKKworICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCisKKyAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCisgICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KKyAgICAgICcnKQorCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KKwkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgorCXVtYXNrPWB1bWFza2AKKwljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KKwkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKKwkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKKworCSAgKlswLTddKQorCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCisJICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKKwkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKKwkgICAgYDs7CisJICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7CisJZXNhYworCisJIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KKwkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCisJaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisJICBta2Rpcl9tb2RlPS1tJG1vZGUKIAllbHNlCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCi0JCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwkgIG1rZGlyX21vZGU9CiAJZmkKIAotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCisJcG9zaXhfbWtkaXI9ZmFsc2UKKwljYXNlICR1bWFzayBpbgorCSAgKlsxMjM1NjddWzAtN11bMC03XSkKKwkgICAgIyBQT1NJWCBta2RpciAtcCBzZXRzIHUrd3ggYml0cyByZWdhcmRsZXNzIG9mIHVtYXNrLCB3aGljaAorCSAgICAjIGlzIGluY29tcGF0aWJsZSB3aXRoIEZyZWVCU0QgJ2luc3RhbGwnIHdoZW4gKHVtYXNrICYgMzAwKSAhPSAwLgorCSAgICA7OworCSAgKikKKwkgICAgdG1wZGlyPSR7VE1QRElSLS90bXB9L2lucyRSQU5ET00tJCQKKwkgICAgdHJhcCAncmV0PSQ/OyBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIgMj4vZGV2L251bGw7IGV4aXQgJHJldCcgMAogCi0JaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJICAgIGlmICh1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkJZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkdG1wZGlyL2QiKSA+L2Rldi9udWxsIDI+JjEKKwkgICAgdGhlbgorCSAgICAgIGlmIHRlc3QgLXogIiRkaXJfYXJnIiB8fCB7CisJCSAgICMgQ2hlY2sgZm9yIFBPU0lYIGluY29tcGF0aWJpbGl0aWVzIHdpdGggLW0uCisJCSAgICMgSFAtVVggMTEuMjMgYW5kIElSSVggNi41IG1rZGlyIC1tIC1wIHNldHMgZ3JvdXAtIG9yCisJCSAgICMgb3RoZXItd3JpdGVhYmxlIGJpdCBvZiBwYXJlbnQgZGlyZWN0b3J5IHdoZW4gaXQgc2hvdWxkbid0LgorCQkgICAjIEZyZWVCU0QgNi4xIG1rZGlyIC1tIC1wIHNldHMgbW9kZSBvZiBleGlzdGluZyBkaXJlY3RvcnkuCisJCSAgIGxzX2xkX3RtcGRpcj1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgY2FzZSAkbHNfbGRfdG1wZGlyIGluCisJCSAgICAgZD8/Pz8tP3ItKikgZGlmZmVyZW50X21vZGU9NzAwOzsKKwkJICAgICBkPz8/Py0/LS0qKSBkaWZmZXJlbnRfbW9kZT03NTU7OworCQkgICAgICopIGZhbHNlOzsKKwkJICAgZXNhYyAmJgorCQkgICAkbWtkaXJwcm9nIC1tJGRpZmZlcmVudF9tb2RlIC1wIC0tICIkdG1wZGlyIiAmJiB7CisJCSAgICAgbHNfbGRfdG1wZGlyXzE9YGxzIC1sZCAiJHRtcGRpciJgCisJCSAgICAgdGVzdCAiJGxzX2xkX3RtcGRpciIgPSAiJGxzX2xkX3RtcGRpcl8xIgorCQkgICB9CisJCSB9CisJICAgICAgdGhlbiBwb3NpeF9ta2Rpcj06CisJICAgICAgZmkKKwkgICAgICBybWRpciAiJHRtcGRpci9kIiAiJHRtcGRpciIKKwkgICAgZWxzZQorCSAgICAgICMgUmVtb3ZlIGFueSBkaXJzIGxlZnQgYmVoaW5kIGJ5IGFuY2llbnQgbWtkaXIgaW1wbGVtZW50YXRpb25zLgorCSAgICAgIHJtZGlyIC4vJG1rZGlyX21vZGUgLi8tcCAuLy0tIDI+L2Rldi9udWxsCisJICAgIGZpCisJICAgIHRyYXAgJycgMDs7CisJZXNhYzs7CisgICAgZXNhYworCisgICAgaWYKKyAgICAgICRwb3NpeF9ta2RpciAmJiAoCisJdW1hc2sgJG1rZGlyX3VtYXNrICYmCisJJGRvaXRfZXhlYyAkbWtkaXJwcm9nICRta2Rpcl9tb2RlIC1wIC0tICIkZHN0ZGlyIgorICAgICAgKQorICAgIHRoZW4gOgorICAgIGVsc2UKKworICAgICAgIyBUaGUgdW1hc2sgaXMgcmlkaWN1bG91cywgb3IgbWtkaXIgZG9lcyBub3QgY29uZm9ybSB0byBQT1NJWCwKKyAgICAgICMgb3IgaXQgZmFpbGVkIHBvc3NpYmx5IGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uLiAgQ3JlYXRlIHRoZQorICAgICAgIyBkaXJlY3RvcnkgdGhlIHNsb3cgd2F5LCBzdGVwIGJ5IHN0ZXAsIGNoZWNraW5nIGZvciByYWNlcyBhcyB3ZSBnby4KKworICAgICAgY2FzZSAkZHN0ZGlyIGluCisJLyopIHByZWZpeD0nLyc7OworCS0qKSBwcmVmaXg9Jy4vJzs7CisJKikgIHByZWZpeD0nJzs7CisgICAgICBlc2FjCisKKyAgICAgIGV2YWwgIiRpbml0aWFsaXplX3Bvc2l4X2dsb2IiCisKKyAgICAgIG9JRlM9JElGUworICAgICAgSUZTPS8KKyAgICAgICRwb3NpeF9nbG9iIHNldCAtZgorICAgICAgc2V0IGZub3JkICRkc3RkaXIKKyAgICAgIHNoaWZ0CisgICAgICAkcG9zaXhfZ2xvYiBzZXQgK2YKKyAgICAgIElGUz0kb0lGUworCisgICAgICBwcmVmaXhlcz0KKworICAgICAgZm9yIGQKKyAgICAgIGRvCisJdGVzdCAteiAiJGQiICYmIGNvbnRpbnVlCisKKwlwcmVmaXg9JHByZWZpeCRkCisJaWYgdGVzdCAtZCAiJHByZWZpeCI7IHRoZW4KKwkgIHByZWZpeGVzPQogCWVsc2UKLQkJdHJ1ZQorCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCisJICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKKwkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCisJICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCisJICBlbHNlCisJICAgIGNhc2UgJHByZWZpeCBpbgorCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKwkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OworCSAgICBlc2FjCisJICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKKwkgIGZpCiAJZmkKKwlwcmVmaXg9JHByZWZpeC8KKyAgICAgIGRvbmUKIAotIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCisgICAgICBpZiB0ZXN0IC1uICIkcHJlZml4ZXMiOyB0aGVuCisJIyBEb24ndCBmYWlsIGlmIHR3byBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSh1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkgZXZhbCAiXCRkb2l0X2V4ZWMgXCRta2RpcnByb2cgJHByZWZpeGVzIikgfHwKKwkgIHRlc3QgLWQgIiRkc3RkaXIiIHx8IGV4aXQgMQorCW9ic29sZXRlX21rZGlyX3VzZWQ9dHJ1ZQorICAgICAgZmkKKyAgICBmaQorICBmaQogCi0JZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisgIGlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgorICAgIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdCI7IH0gJiYKKyAgICB7IHRlc3QgIiRvYnNvbGV0ZV9ta2Rpcl91c2VkJGNob3duY21kJGNoZ3JwY21kIiA9IGZhbHNlIHx8CisgICAgICB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdCI7IH0gfHwgZXhpdCAxCisgIGVsc2UKIAotIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCisgICAgIyBNYWtlIGEgY291cGxlIG9mIHRlbXAgZmlsZSBuYW1lcyBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKyAgICBkc3R0bXA9JGRzdGRpci9faW5zdC4kJF8KKyAgICBybXRtcD0kZHN0ZGlyL19ybS4kJF8KIAotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgorICAgICMgVHJhcCB0byBjbGVhbiB1cCB0aG9zZSB0ZW1wIGZpbGVzIGF0IGV4aXQuCisgICAgdHJhcCAncmV0PSQ/OyBybSAtZiAiJGRzdHRtcCIgIiRybXRtcCIgJiYgZXhpdCAkcmV0JyAwCiAKLQl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKyAgICAjIENvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lLgorICAgICh1bWFzayAkY3BfdW1hc2sgJiYgJGRvaXRfZXhlYyAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIpICYmCiAKLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKIAotIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0jIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgorICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KKyAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKKyAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgorICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCiAKLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorICAgICAgIGV2YWwgIiRpbml0aWFsaXplX3Bvc2l4X2dsb2IiICYmCisgICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mICYmCisgICAgICAgc2V0IFggJG9sZCAmJiBvbGQ9OiQyOiQ0OiQ1OiQ2ICYmCisgICAgICAgc2V0IFggJG5ldyAmJiBuZXc9OiQyOiQ0OiQ1OiQ2ICYmCisgICAgICAgJHBvc2l4X2dsb2Igc2V0ICtmICYmCiAKLSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICAgICB0ZXN0ICIkb2xkIiA9ICIkbmV3IiAmJgorICAgICAgICRjbXBwcm9nICIkZHN0IiAiJGRzdHRtcCIgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbgorICAgICAgcm0gLWYgIiRkc3R0bXAiCisgICAgZWxzZQorICAgICAgIyBSZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisgICAgICAkZG9pdCAkbXZjbWQgLWYgIiRkc3R0bXAiICIkZHN0IiAyPi9kZXYvbnVsbCB8fAogCi0JJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKLQkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAorICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQorICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICMgc3VwcG9ydCAtZi4KKyAgICAgIHsKKwkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwl7CisJICB0ZXN0ICEgLWYgIiRkc3QiIHx8CisJICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8CisJICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKKwkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KKwkgIH0gfHwKKwkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgorCSAgICAoZXhpdCAxKTsgZXhpdCAxCisJICB9CisJfSAmJgogCi1maSAmJgorCSMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKwkkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0IgorICAgICAgfQorICAgIGZpIHx8IGV4aXQgMQogCisgICAgdHJhcCAnJyAwCisgIGZpCitkb25lCiAKLWV4aXQgMAorIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvaW5zdGFsbC5kb2MgYi9pbnN0YWxsLnR4dApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBpbnN0YWxsLmRvYwpyZW5hbWUgdG8gaW5zdGFsbC50eHQKaW5kZXggMzcwMmI5OC4uYjkxZGY0MCAxMDA2NDQKLS0tIGEvaW5zdGFsbC5kb2MKKysrIGIvaW5zdGFsbC50eHQKQEAgLTEsNiArMSw2IEBACiBJTlNUQUxMQVRJT04gSU5TVFJVQ1RJT05TIGZvciB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKIAotQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorQ29weXJpZ2h0IChDKSAxOTkxLTIwMDksIFRob21hcyBHLiBMYW5lLCBHdWlkbyBWb2xsYmVkaW5nLgogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KIApAQCAtOTQsMTggKzk0LDEzIEBACiBmb3IgR05VIGNvbmZpZ3VyZSBzY3JpcHRzLiAgSXQgbWFrZXMgYSBmZXcgYXNzdW1wdGlvbnMgdGhhdCB5b3UgbWF5IHdhbnQgdG8KIG92ZXJyaWRlLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHByb3ZpZGluZyBvcHRpb25hbCBzd2l0Y2hlcyB0byBjb25maWd1cmU6CiAKLSogSWYgeW91IHdhbnQgdG8gYnVpbGQgbGlianBlZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBzYXkKLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQKLVRvIGdldCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnJhcmllcywgc2F5Ci0JLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYwotTm90ZSB0aGF0IHRoZXNlIHN3aXRjaGVzIGludm9rZSBHTlUgbGlidG9vbCB0byB0YWtlIGNhcmUgb2Ygc3lzdGVtLWRlcGVuZGVudAotc2hhcmVkIGxpYnJhcnkgYnVpbGRpbmcgbWV0aG9kcy4gIElmIHRoaW5ncyBkb24ndCB3b3JrIHRoaXMgd2F5LCBwbGVhc2UgdHJ5Ci1ydW5uaW5nIGNvbmZpZ3VyZSB3aXRob3V0IGVpdGhlciBzd2l0Y2g7IHRoYXQgc2hvdWxkIGJ1aWxkIGEgc3RhdGljIGxpYnJhcnkKLXdpdGhvdXQgdXNpbmcgbGlidG9vbC4gIElmIHRoYXQgd29ya3MsIHlvdXIgcHJvYmxlbSBpcyBwcm9iYWJseSB3aXRoIGxpYnRvb2wKLW5vdCB3aXRoIHRoZSBJSkcgY29kZS4gIGxpYnRvb2wgaXMgZmFpcmx5IG5ldyBhbmQgZG9lc24ndCBzdXBwb3J0IGFsbCBmbGF2b3JzCi1vZiBVbml4IHlldC4gIChZb3UgbWlnaHQgYmUgYWJsZSB0byBmaW5kIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJ0b29sIHRoYW4gdGhlCi1vbmUgaW5jbHVkZWQgd2l0aCBsaWJqcGVnOyBzZWUgZnRwLmdudS5vcmcuICBSZXBvcnQgbGlidG9vbCBwcm9ibGVtcyB0bwotYnVnLWxpYnRvb2xAZ251Lm9yZy4pCisqIENvbmZpZ3VyZSB3aWxsIGJ1aWxkIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzLCBpZiBwb3NzaWJsZS4KK0lmIHlvdSB3YW50IHRvIGJ1aWxkIGxpYmpwZWcgb25seSBhcyBhIHN0YXRpYyBsaWJyYXJ5LCBzYXkKKwkuL2NvbmZpZ3VyZSAtLWRpc2FibGUtc2hhcmVkCitJZiB5b3Ugd2FudCB0byBidWlsZCBsaWJqcGVnIG9ubHkgYXMgYSBzaGFyZWQgbGlicmFyeSwgc2F5CisJLi9jb25maWd1cmUgLS1kaXNhYmxlLXN0YXRpYworQ29uZmlndXJlIHVzZXMgR05VIGxpYnRvb2wgdG8gdGFrZSBjYXJlIG9mIHN5c3RlbS1kZXBlbmRlbnQgc2hhcmVkIGxpYnJhcnkKK2J1aWxkaW5nIG1ldGhvZHMuCiAKICogQ29uZmlndXJlIHdpbGwgdXNlIGdjYyAoR05VIEMgY29tcGlsZXIpIGlmIGl0J3MgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2MuCiBUbyBmb3JjZSBhIHBhcnRpY3VsYXIgY29tcGlsZXIgdG8gYmUgc2VsZWN0ZWQsIHVzZSB0aGUgQ0Mgb3B0aW9uLCBmb3IgZXhhbXBsZQpAQCAtMTE1LDEwICsxMTAsMTAgQEAKIAkuL2NvbmZpZ3VyZSBDQz0nY2MgLUFhJwogdG8gZ2V0IEhQJ3MgY29tcGlsZXIgdG8gcnVuIGluIEFOU0kgbW9kZS4KIAotKiBUaGUgZGVmYXVsdCBDRkxBR1Mgc2V0dGluZyBpcyAiLU8iIGZvciBub24tZ2NjIGNvbXBpbGVycywgIi1PMiIgZm9yIGdjYy4KKyogVGhlIGRlZmF1bHQgQ0ZMQUdTIHNldHRpbmcgaXMgIi1nIiBmb3Igbm9uLWdjYyBjb21waWxlcnMsICItZyAtTzIiIGZvciBnY2MuCiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgc2F5aW5nLCBmb3IgZXhhbXBsZSwKLQkuL2NvbmZpZ3VyZSBDRkxBR1M9Jy1nJwotaWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRoIGRlYnVnZ2luZyBzdXBwb3J0LgorCS4vY29uZmlndXJlIENGTEFHUz0nLU8yJworaWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRob3V0IGRlYnVnZ2luZyBzdXBwb3J0LgogCiAqIENvbmZpZ3VyZSB3aWxsIHNldCB1cCB0aGUgbWFrZWZpbGUgc28gdGhhdCAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgZmlsZXMKIGludG8gL3Vzci9sb2NhbC9iaW4sIC91c3IvbG9jYWwvbWFuLCBldGMuICBZb3UgY2FuIHNwZWNpZnkgYW4gaW5zdGFsbGF0aW9uCkBAIC0xNTMsNyArMTQ4LDggQEAKIG1ha2VmaWxlLm1jNglqY29uZmlnLm1jNglNUy1ET1MsIE1pY3Jvc29mdCBDICgxNi1iaXQgb25seSkKIG1ha2VmaWxlLndhdAlqY29uZmlnLndhdAlNUy1ET1MsIE9TLzIsIG9yIFdpbmRvd3MgTlQsIFdhdGNvbSBDCiBtYWtlZmlsZS52YwlqY29uZmlnLnZjCVdpbmRvd3MgTlQvOTUsIE1TIFZpc3VhbCBDKysKLW1ha2UqLmRzCWpjb25maWcudmMJV2luZG93cyBOVC85NSwgTVMgRGV2ZWxvcGVyIFN0dWRpbworbWFrZSoudmM2CWpjb25maWcudmMJV2luZG93cyBOVC85NSwgTVMgVmlzdWFsIEMrKyA2CittYWtlKi52YzkJamNvbmZpZy52YwlXaW5kb3dzIE5ULzk1LCBNUyBWaXN1YWwgQysrIDIwMDggKHY5KQogbWFrZWZpbGUubW1zCWpjb25maWcudm1zCURpZ2l0YWwgVk1TLCB3aXRoIE1NUyBzb2Z0d2FyZQogbWFrZWZpbGUudm1zCWpjb25maWcudm1zCURpZ2l0YWwgVk1TLCB3aXRob3V0IE1NUyBzb2Z0d2FyZQogCkBAIC0xNjYsOCArMTYyLDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEZpcnN0LCBnZW5lcmF0ZSBhIGpjb25maWcuaCBmaWxlLiAgSWYgeW91IGFyZSBtb2RlcmF0ZWx5IGZhbWlsaWFyIHdpdGggQywKLXRoZSBjb21tZW50cyBpbiBqY29uZmlnLmRvYyBzaG91bGQgYmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRvIHRoaXM7IGp1c3QKLWNvcHkgamNvbmZpZy5kb2MgdG8gamNvbmZpZy5oIGFuZCBlZGl0IGl0IGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIHlvdSBtYXkKK3RoZSBjb21tZW50cyBpbiBqY29uZmlnLnR4dCBzaG91bGQgYmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRvIHRoaXM7IGp1c3QKK2NvcHkgamNvbmZpZy50eHQgdG8gamNvbmZpZy5oIGFuZCBlZGl0IGl0IGFwcHJvcHJpYXRlbHkuICBPdGhlcndpc2UsIHlvdSBtYXkKIHByZWZlciB0byB1c2UgdGhlIGNrY29uZmlnLmMgcHJvZ3JhbS4gIFlvdSB3aWxsIG5lZWQgdG8gY29tcGlsZSBhbmQgZXhlY3V0ZQogY2tjb25maWcuYyBieSBoYW5kIC0tLSB3ZSBob3BlIHlvdSBrbm93IGF0IGxlYXN0IGVub3VnaCB0byBkbyB0aGF0LgogY2tjb25maWcuYyBtYXkgbm90IGNvbXBpbGUgdGhlIGZpcnN0IHRyeSAoaW4gZmFjdCwgdGhlIHdob2xlIGlkZWEgaXMgZm9yIGl0CkBAIC00NDcsOCArNDQzLDggQEAKIAogVGhlIFBQTSByZWFkZXIgKHJkcHBtLmMpIGNhbiByZWFkIDEyLWJpdCBkYXRhIGZyb20gZWl0aGVyIHRleHQtZm9ybWF0IG9yCiBiaW5hcnktZm9ybWF0IFBQTSBhbmQgUEdNIGZpbGVzLiAgQmluYXJ5LWZvcm1hdCBQUE0vUEdNIGZpbGVzIHdoaWNoIGhhdmUgYQotbWF4dmFsIGdyZWF0ZXIgdGhhbiAyNTUgYXJlIGFzc3VtZWQgdG8gdXNlIDIgYnl0ZXMgcGVyIHNhbXBsZSwgTFNCIGZpcnN0Ci0obGl0dGxlLWVuZGlhbiBvcmRlcikuICBBcyBvZiBlYXJseSAxOTk1LCAyLWJ5dGUgYmluYXJ5IGZvcm1hdCBpcyBub3QKK21heHZhbCBncmVhdGVyIHRoYW4gMjU1IGFyZSBhc3N1bWVkIHRvIHVzZSAyIGJ5dGVzIHBlciBzYW1wbGUsIE1TQiBmaXJzdAorKGJpZy1lbmRpYW4gb3JkZXIpLiAgQXMgb2YgZWFybHkgMTk5NSwgMi1ieXRlIGJpbmFyeSBmb3JtYXQgaXMgbm90CiBvZmZpY2lhbGx5IHN1cHBvcnRlZCBieSB0aGUgUEJNUExVUyBsaWJyYXJ5LCBidXQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBhCiBmdXR1cmUgcmVsZWFzZSBvZiBQQk1QTFVTIHdpbGwgc3VwcG9ydCBpdC4gIE5vdGUgdGhhdCB0aGUgUFBNIHJlYWRlciB3aWxsCiByZWFkIGZpbGVzIG9mIGFueSBtYXh2YWwgcmVnYXJkbGVzcyBvZiB0aGUgQklUU19JTl9KU0FNUExFIHNldHRpbmc7IGluY29taW5nCkBAIC01MjEsNyArNTE3LDcgQEAKICIjZGVmaW5lIEpEQ1RfREVGQVVMVCBKRENUX0ZMT0FUIiB0byBqY29uZmlnLmguICBFdmVuIGlmIHlvdSBkb24ndCBjaGFuZ2UKIHRoZSBkZWZhdWx0LCB5b3Ugc2hvdWxkIHJlZGVmaW5lIEpEQ1RfRkFTVEVTVCwgd2hpY2ggaXMgdGhlIG1ldGhvZCBzZWxlY3RlZAogYnkgZGpwZWcncyAtZmFzdCBzd2l0Y2guICBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHRoZSBkb2N1bWVudGF0aW9uIGZpbGVzCi0odXNhZ2UuZG9jIGFuZC9vciBjanBlZy4xLCBkanBlZy4xKSB0byBhZ3JlZSB3aXRoIHdoYXQgeW91J3ZlIGRvbmUuCisodXNhZ2UudHh0IGFuZC9vciBjanBlZy4xLCBkanBlZy4xKSB0byBhZ3JlZSB3aXRoIHdoYXQgeW91J3ZlIGRvbmUuCiAKIElmIGFjY2VzcyB0byAic2hvcnQiIGFycmF5cyBpcyBzbG93IG9uIHlvdXIgbWFjaGluZSwgaXQgbWF5IGJlIGEgd2luIHRvCiBkZWZpbmUgdHlwZSBKQ09FRiBhcyBpbnQgcmF0aGVyIHRoYW4gc2hvcnQuICBUaGlzIHdpbGwgY29zdCBhIGdvb2QgZGVhbCBvZgpAQCAtNTM4LDcgKzUzNCw3IEBACiBhbmQgZXhwZXJpbWVudGluZyB3aXRoIGFueSBvcHRpb25hbCBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgbG9vcCB1bnJvbGxpbmcuCiAoVW5mb3J0dW5hdGVseSwgZmFyIHRvbyBtYW55IGNvbXBpbGVycyBoYXZlIG9wdGltaXplciBidWdzIC4uLiBiZSBwcmVwYXJlZCB0bwogYmFjayBvZmYgaWYgdGhlIGNvZGUgZmFpbHMgc2VsZi10ZXN0LikgIElmIHlvdSBkbyBhbnkgZXhwZXJpbWVudGF0aW9uIGFsb25nCi10aGVzZSBsaW5lcywgcGxlYXNlIHJlcG9ydCB0aGUgb3B0aW1hbCBzZXR0aW5ncyB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0IHNvCit0aGVzZSBsaW5lcywgcGxlYXNlIHJlcG9ydCB0aGUgb3B0aW1hbCBzZXR0aW5ncyB0byBqcGVnLWluZm9AanBlZ2NsdWIub3JnIHNvCiB3ZSBjYW4gbWVudGlvbiB0aGVtIGluIGZ1dHVyZSByZWxlYXNlcy4gIEJlIHN1cmUgdG8gc3BlY2lmeSB5b3VyIG1hY2hpbmUgYW5kCiBjb21waWxlciB2ZXJzaW9uLgogCkBAIC01NDcsNyArNTQzLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFdlIHdlbGNvbWUgcmVwb3J0cyBvbiBjaGFuZ2VzIG5lZWRlZCBmb3Igc3lzdGVtcyBub3QgbWVudGlvbmVkIGhlcmUuICBTdWJtaXQKLSdlbSB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0LiAgQWxzbywgaWYgY29uZmlndXJlIG9yIGNrY29uZmlnLmMgaXMgd3JvbmcKKydlbSB0byBqcGVnLWluZm9AanBlZ2NsdWIub3JnLiAgQWxzbywgaWYgY29uZmlndXJlIG9yIGNrY29uZmlnLmMgaXMgd3JvbmcKIGFib3V0IGhvdyB0byBjb25maWd1cmUgdGhlIEpQRUcgc29mdHdhcmUgZm9yIHlvdXIgc3lzdGVtLCBwbGVhc2UgbGV0IHVzIGtub3cuCiAKIApAQCAtNTY4LDcgKzU2NCw3IEBACiBsaW5lcyAnJChSTSkgbGlianBlZy5vJyBhbmQgJyQoQVIyKSBsaWJqcGVnLm8nIGFuZCB0aGUgJ2pjb25maWcuaCcKIGRlcGVuZGVuY3kgc2VjdGlvbi4KIAotQ29weSBqY29uZmlnLmRvYyB0byBqY29uZmlnLmguICBFZGl0IGpjb25maWcuaCB0byBkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKK0NvcHkgamNvbmZpZy50eHQgdG8gamNvbmZpZy5oLiAgRWRpdCBqY29uZmlnLmggdG8gZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCiBhbmQgQ0hBUl9JU19VTlNJR05FRC4KIAogUnVuIHRoZSBtYWtlZmlsZSB1c2luZyAhQU1VIG5vdCAhTWFrZS4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgJ2NsZWFuJyBhbmQKQEAgLTU4Nyw3ICs1ODMsNyBAQAogCiAKIEF0YXJpIFNUL1NURS9UVDoKLSAKKwogQ29weSB0aGUgcHJvamVjdCBmaWxlcyBtYWtjanBlZy5zdCwgbWFrZGpwZWcuc3QsIG1ha3RqcGVnLnN0LCBhbmQgbWFrbGpwZWcuc3QKIHRvIGNqcGVnLnByaiwgZGpwZWcucHJqLCBqcGVndHJhbi5wcmosIGFuZCBsaWJqcGVnLnByaiByZXNwZWN0aXZlbHkuICBUaGUKIHByb2plY3QgZmlsZXMgc2hvdWxkIHdvcmsgYXMtaXMgd2l0aCBQdXJlIEMuICBGb3IgVHVyYm8gQywgY2hhbmdlIGxpYnJhcnkKQEAgLTYxMCw3ICs2MDYsOCBAQAogCiBXZSBoYXZlbid0IGJvdGhlcmVkIHRvIGluY2x1ZGUgcHJvamVjdCBmaWxlcyBmb3IgcmRqcGdjb20gYW5kIHdyanBnY29tLgogVGhvc2Ugc291cmNlIGZpbGVzIHNob3VsZCBqdXN0IGJlIGNvbXBpbGVkIGJ5IHRoZW1zZWx2ZXM7IHRoZXkgZG9uJ3QKLWRlcGVuZCBvbiB0aGUgSlBFRyBsaWJyYXJ5LgorZGVwZW5kIG9uIHRoZSBKUEVHIGxpYnJhcnkuICBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdC5wcmogcHJvamVjdCBmaWxlCitvZiB0aGUgUHVyZSBDIGRpc3RyaWJ1dGlvbiB0byBtYWtlIHRoZSBwcm9ncmFtcy4KIAogVGhlcmUgaXMgYSBidWcgaW4gc29tZSBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgVHVyYm8gQyBsaWJyYXJ5IHdoaWNoIGNhdXNlcyB0aGUKIHNwYWNlIHVzZWQgYnkgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgd2l0aCAidG1wZmlsZSgpIiBub3QgdG8gYmUgZnJlZWQgYWZ0ZXIKQEAgLTg3Miw2ICs4NjksNyBAQAogd2FybmluZyBpZiB5b3UgaW5jbHVkZSBib3RoIGpwZWdsaWIuaCBhbmQgd2luZGVmLmggKHdoaWNoIHdpbmRvd3MuaAogaW5jbHVkZXMpLiAgVG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcsIHlvdSBjYW4gcHV0ICIjaWZuZGVmIEZBUiIvIiNlbmRpZiIKIGFyb3VuZCB0aGUgbGluZSAiI2RlZmluZSBGQVIiIGluIGptb3JlY2ZnLmguCisoU29tZXRoaW5nIGxpa2UgdGhpcyBpcyBhbHJlYWR5IGluIGptb3JlY2ZnLmgsIGJ5IHRoZSB3YXkuKQogCiBXaGVuIHVzaW5nIHRoZSBsaWJyYXJ5IGluIGEgV2luZG93cyBhcHBsaWNhdGlvbiwgeW91IHdpbGwgYWxtb3N0IGNlcnRhaW5seQogd2FudCB0byBtb2RpZnkgb3IgcmVwbGFjZSB0aGUgZXJyb3IgaGFuZGxlciBtb2R1bGUgamVycm9yLmMsIHNpbmNlIG91cgpAQCAtODkwLDcgKzg4OCw3IEBACiAKIFRoZSBwcm9wZXIgc29sdXRpb24gZm9yIHByb2JsZW0gMiBpcyB0byByZXR1cm4gY29udHJvbCB0byB5b3VyIGNhbGxpbmcKIGFwcGxpY2F0aW9uIGFmdGVyIGEgbGlicmFyeSBlcnJvci4gIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgc2V0am1wL2xvbmdqbXAKLXRlY2huaXF1ZSBkaXNjdXNzZWQgaW4gbGlianBlZy5kb2MgYW5kIGlsbHVzdHJhdGVkIGluIGV4YW1wbGUuYy4gIChOT1RFOgordGVjaG5pcXVlIGRpc2N1c3NlZCBpbiBsaWJqcGVnLnR4dCBhbmQgaWxsdXN0cmF0ZWQgaW4gZXhhbXBsZS5jLiAgKE5PVEU6CiBzb21lIG9sZGVyIFdpbmRvd3MgQyBjb21waWxlcnMgcHJvdmlkZSB2ZXJzaW9ucyBvZiBzZXRqbXAvbG9uZ2ptcCB0aGF0CiBkb24ndCBhY3R1YWxseSB3b3JrIHVuZGVyIFdpbmRvd3MuICBZb3UgbWF5IG5lZWQgdG8gdXNlIHRoZSBXaW5kb3dzIHN5c3RlbQogZnVuY3Rpb25zIENhdGNoIGFuZCBUaHJvdyBpbnN0ZWFkLikKQEAgLTEwMDAsMjcgKzk5OCw2MyBAQAogdGhlIERldmVsb3BlciBTdHVkaW8gZW52aXJvbm1lbnQsIHlvdSBtYXkgcHJlZmVyIHRoZSBEZXZTdHVkaW8gcHJvamVjdAogZmlsZXM7IHNlZSBiZWxvdy4pCiAKLVNvbWUgdXNlcnMgZmVlbCB0aGF0IGl0J3MgZWFzaWVyIHRvIGNhbGwgdGhlIGxpYnJhcnkgZnJvbSBDKysgY29kZSBpZiB5b3UKLWZvcmNlIFZDKysgdG8gdHJlYXQgdGhlIGxpYnJhcnkgYXMgQysrIGNvZGUsIHdoaWNoIHlvdSBjYW4gZG8gYnkgcmVuYW1pbmcKLWFsbCB0aGUgKi5jIGZpbGVzIHRvICouY3BwIChhbmQgYWRqdXN0aW5nIHRoZSBtYWtlZmlsZSB0byBtYXRjaCkuICBUaGlzCi1hdm9pZHMgdGhlIG5lZWQgdG8gcHV0IGV4dGVybiAiQyIgeyAuLi4gfSBhcm91bmQgI2luY2x1ZGUgImpwZWdsaWIuaCIgaW4KLXlvdXIgQysrIGFwcGxpY2F0aW9uLgordjcgYWRkcyBleHRlcm4gIkMiIHRvIGpwZWdsaWIuaC4gIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIHB1dCBleHRlcm4gIkMiCit7IC4uLiB9IGFyb3VuZCAjaW5jbHVkZSAianBlZ2xpYi5oIiBpbiB5b3VyIEMrKyBhcHBsaWNhdGlvbi4KK1lvdSBjYW4gYWxzbyBmb3JjZSBWQysrIHRvIHRyZWF0IHRoZSBsaWJyYXJ5IGFzIEMrKyBjb2RlIGJ5IHJlbmFtaW5nCithbGwgdGhlICouYyBmaWxlcyB0byAqLmNwcCAoYW5kIGFkanVzdGluZyB0aGUgbWFrZWZpbGUgdG8gbWF0Y2gpLgorSW4gdGhpcyBjYXNlIHlvdSBhbHNvIG5lZWQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgRE9OVF9VU0VfRVhURVJOX0MgaW4KK3RoZSBjb25maWd1cmF0aW9uIHRvIHByZXZlbnQganBlZ2xpYi5oIGZyb20gdXNpbmcgZXh0ZXJuICJDIi4KIAogCi1NaWNyb3NvZnQgV2luZG93cywgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW86CitNaWNyb3NvZnQgV2luZG93cywgTWljcm9zb2Z0IFZpc3VhbCBDKysgNiBEZXZlbG9wZXIgU3R1ZGlvOgogCi1XZSBpbmNsdWRlIG1ha2VmaWxlcyB0aGF0IHNob3VsZCB3b3JrIGFzIHByb2plY3QgZmlsZXMgaW4gRGV2U3R1ZGlvIDQuMiBvcgorV2UgaW5jbHVkZSBtYWtlZmlsZXMgdGhhdCBzaG91bGQgd29yayBhcyBwcm9qZWN0IGZpbGVzIGluIERldlN0dWRpbyA2LjAgb3IKIGxhdGVyLiAgVGhlcmUgaXMgYSBsaWJyYXJ5IG1ha2VmaWxlIHRoYXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIHN0YXRpYwotV2luMzIgbGlicmFyeSwgYW5kIGFuIGFwcGxpY2F0aW9uIG1ha2VmaWxlIHRoYXQgYnVpbGRzIHRoZSBzYW1wbGUgYXBwbGljYXRpb25zCitXaW4zMiBsaWJyYXJ5LCBhbmQgYXBwbGljYXRpb24gbWFrZWZpbGVzIHRoYXQgYnVpbGQgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMKIGFzIFdpbjMyIGNvbnNvbGUgYXBwbGljYXRpb25zLiAgKEV2ZW4gaWYgeW91IG9ubHkgd2FudCB0aGUgbGlicmFyeSwgd2UKIHJlY29tbWVuZCBidWlsZGluZyB0aGUgYXBwbGljYXRpb25zIHNvIHRoYXQgeW91IGNhbiBydW4gdGhlIHNlbGYtdGVzdC4pCiAKIFRvIHVzZToKLTEuIENvcHkgamNvbmZpZy52YyB0byBqY29uZmlnLmgsIG1ha2VsaWIuZHMgdG8ganBlZy5tYWssIGFuZAotICAgbWFrZWFwcHMuZHMgdG8gYXBwcy5tYWsuICAoTm90ZSB0aGF0IHRoZSByZW5hbWluZyBpcyBjcml0aWNhbCEpCi0yLiBDbGljayBvbiB0aGUgLm1hayBmaWxlcyB0byBjb25zdHJ1Y3QgcHJvamVjdCB3b3Jrc3BhY2VzLgotICAgKElmIHlvdSBhcmUgdXNpbmcgRGV2U3R1ZGlvIG1vcmUgcmVjZW50IHRoYW4gNC4yLCB5b3UnbGwgcHJvYmFibHkKLSAgIGdldCBhIG1lc3NhZ2Ugc2F5aW5nIHRoYXQgdGhlIG1ha2VmaWxlcyBhcmUgYmVpbmcgdXBkYXRlZC4pCisxLiBDb3B5IGpjb25maWcudmMgdG8gamNvbmZpZy5oLCBtYWtlamRzdy52YzYgdG8ganBlZy5kc3csCisgICBtYWtlYWRzdy52YzYgdG8gYXBwcy5kc3csIG1ha2VqbWFrLnZjNiB0byBqcGVnLm1haywKKyAgIG1ha2VqZGVwLnZjNiB0byBqcGVnLmRlcCwgbWFrZWpkc3AudmM2IHRvIGpwZWcuZHNwLAorICAgbWFrZWNtYWsudmM2IHRvIGNqcGVnLm1haywgbWFrZWNkZXAudmM2IHRvIGNqcGVnLmRlcCwKKyAgIG1ha2VjZHNwLnZjNiB0byBjanBlZy5kc3AsIG1ha2VkbWFrLnZjNiB0byBkanBlZy5tYWssCisgICBtYWtlZGRlcC52YzYgdG8gZGpwZWcuZGVwLCBtYWtlZGRzcC52YzYgdG8gZGpwZWcuZHNwLAorICAgbWFrZXRtYWsudmM2IHRvIGpwZWd0cmFuLm1haywgbWFrZXRkZXAudmM2IHRvIGpwZWd0cmFuLmRlcCwKKyAgIG1ha2V0ZHNwLnZjNiB0byBqcGVndHJhbi5kc3AsIG1ha2VybWFrLnZjNiB0byByZGpwZ2NvbS5tYWssCisgICBtYWtlcmRlcC52YzYgdG8gcmRqcGdjb20uZGVwLCBtYWtlcmRzcC52YzYgdG8gcmRqcGdjb20uZHNwLAorICAgbWFrZXdtYWsudmM2IHRvIHdyanBnY29tLm1haywgbWFrZXdkZXAudmM2IHRvIHdyanBnY29tLmRlcCwgYW5kCisgICBtYWtld2RzcC52YzYgdG8gd3JqcGdjb20uZHNwLiAgKE5vdGUgdGhhdCB0aGUgcmVuYW1pbmcgaXMgY3JpdGljYWwhKQorMi4gQ2xpY2sgb24ganBlZy5kc3cgYW5kIGFwcHMuZHN3IHRvIGxvYWQgdGhlIHByb2plY3Qgd29ya3NwYWNlcy4KKyAgIChJZiB5b3UgYXJlIHVzaW5nIERldlN0dWRpbyBtb3JlIHJlY2VudCB0aGFuIDYuMCwgeW91J2xsIHByb2JhYmx5CisgICBnZXQgYSBtZXNzYWdlIHNheWluZyB0aGF0IHRoZSBwcm9qZWN0IGZpbGVzIGFyZSBiZWluZyB1cGRhdGVkLikKKzMuIEJ1aWxkIHRoZSBsaWJyYXJ5IHByb2plY3QsIHRoZW4gdGhlIGFwcGxpY2F0aW9ucyBwcm9qZWN0LgorNC4gTW92ZSB0aGUgYXBwbGljYXRpb24gLmV4ZSBmaWxlcyBmcm9tIGBhcHBgXFJlbGVhc2UgdG8gYW4KKyAgIGFwcHJvcHJpYXRlIGxvY2F0aW9uIG9uIHlvdXIgcGF0aC4KKzUuIFRvIHBlcmZvcm0gdGhlIHNlbGYtdGVzdCwgZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lCisJTk1BS0UgL2YgbWFrZWZpbGUudmMgIHRlc3QKKworCitNaWNyb3NvZnQgV2luZG93cywgTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwOCBEZXZlbG9wZXIgU3R1ZGlvICh2OSk6CisKK1dlIGluY2x1ZGUgbWFrZWZpbGVzIHRoYXQgc2hvdWxkIHdvcmsgYXMgcHJvamVjdCBmaWxlcyBpbiBWaXN1YWwgU3R1ZGlvCisyMDA4IG9yIGxhdGVyLiAgVGhlcmUgaXMgYSBsaWJyYXJ5IG1ha2VmaWxlIHRoYXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeQorYXMgYSBzdGF0aWMgV2luMzIgbGlicmFyeSwgYW5kIGFwcGxpY2F0aW9uIG1ha2VmaWxlcyB0aGF0IGJ1aWxkIHRoZSBzYW1wbGUKK2FwcGxpY2F0aW9ucyBhcyBXaW4zMiBjb25zb2xlIGFwcGxpY2F0aW9ucy4gIChFdmVuIGlmIHlvdSBvbmx5IHdhbnQgdGhlCitsaWJyYXJ5LCB3ZSByZWNvbW1lbmQgYnVpbGRpbmcgdGhlIGFwcGxpY2F0aW9ucyBzbyB0aGF0IHlvdSBjYW4gcnVuIHRoZQorc2VsZi10ZXN0LikKKworVG8gdXNlOgorMS4gQ29weSBqY29uZmlnLnZjIHRvIGpjb25maWcuaCwgbWFrZWpzbG4udmM5IHRvIGpwZWcuc2xuLAorICAgbWFrZWFzbG4udmM5IHRvIGFwcHMuc2xuLCBtYWtlanZjcC52YzkgdG8ganBlZy52Y3Byb2osCisgICBtYWtlY3ZjcC52YzkgdG8gY2pwZWcudmNwcm9qLCBtYWtlZHZjcC52YzkgdG8gZGpwZWcudmNwcm9qLAorICAgbWFrZXR2Y3AudmM5IHRvIGpwZWd0cmFuLnZjcHJvaiwgbWFrZXJ2Y3AudmM5IHRvIHJkanBnY29tLnZjcHJvaiwgYW5kCisgICBtYWtld3ZjcC52YzkgdG8gd3JqcGdjb20udmNwcm9qLiAgKE5vdGUgdGhhdCB0aGUgcmVuYW1pbmcgaXMgY3JpdGljYWwhKQorMi4gQ2xpY2sgb24ganBlZy5zbG4gYW5kIGFwcHMuc2xuIHRvIGxvYWQgdGhlIHByb2plY3Qgc29sdXRpb25zLgorICAgKElmIHlvdSBhcmUgdXNpbmcgVmlzdWFsIFN0dWRpbyBtb3JlIHJlY2VudCB0aGFuIDIwMDggKHY5KSwgeW91J2xsCisgICBwcm9iYWJseSBnZXQgYSBtZXNzYWdlIHNheWluZyB0aGF0IHRoZSBwcm9qZWN0IGZpbGVzIGFyZSBiZWluZworICAgdXBkYXRlZC4pCiAzLiBCdWlsZCB0aGUgbGlicmFyeSBwcm9qZWN0LCB0aGVuIHRoZSBhcHBsaWNhdGlvbnMgcHJvamVjdC4KIDQuIE1vdmUgdGhlIGFwcGxpY2F0aW9uIC5leGUgZmlsZXMgZnJvbSBgYXBwYFxSZWxlYXNlIHRvIGFuCiAgICBhcHByb3ByaWF0ZSBsb2NhdGlvbiBvbiB5b3VyIHBhdGguCmRpZmYgLS1naXQgYS9qYXJpY29tLmMgYi9qYXJpY29tLmMKaW5kZXggZTQyOTJiMC4uOWU1MWVkNSAxMDA2NDQKLS0tIGEvamFyaWNvbS5jCisrKyBiL2phcmljb20uYwpAQCAtMSwxMCArMSw5IEBACiAvKgogICogamFyaWNvbS5jCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCBHdWlkbyBWb2xsYmVkaW5nIDxndWl2b2xAZXNjLmRlPi4KLSAqIFRoaXMgZmlsZSBpcyBOT1QgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCi0gKiBmb3IgbGVnYWwgcmVhc29ucy4KLSAqIFNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlIGZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLgorICogRGV2ZWxvcGVkIDE5OTcgYnkgR3VpZG8gVm9sbGJlZGluZy4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHByb2JhYmlsaXR5IGVzdGltYXRpb24gdGFibGVzIGZvciBjb21tb24gdXNlIGluCiAgKiBhcml0aG1ldGljIGVudHJvcHkgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHJvdXRpbmVzLgpAQCAtMjEsOSArMjAsOSBAQAogLyogVGhlIGZvbGxvd2luZyAjZGVmaW5lIHNwZWNpZmllcyB0aGUgcGFja2luZyBvZiB0aGUgZm91ciBjb21wb25lbnRzCiAgKiBpbnRvIHRoZSBjb21wYWN0IElOVDMyIHJlcHJlc2VudGF0aW9uLgogICogTm90ZSB0aGF0IHRoaXMgZm9ybXVsYSBtdXN0IG1hdGNoIHRoZSBhY3R1YWwgYXJpdGhtZXRpYyBlbmNvZGVyCi0gKiBhbmQgZGVjb2RlciBpbXBsZW1lbnRhdGlvbi4gVGhlIGltcGxlbWVudGF0aW9uIGhhcyB0byBiZSBjaGFuZ2VkCisgKiBhbmQgZGVjb2RlciBpbXBsZW1lbnRhdGlvbi4gIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gYmUgY2hhbmdlZAogICogaWYgdGhpcyBmb3JtdWxhIGlzIGNoYW5nZWQuCi0gKiBUaGUgY3VycmVudCBvcmdhbmlzYXRpb24gaXMgbGVhbmVkIG9uIE1hcmt1cyBLdWhuJ3MgSkJJRworICogVGhlIGN1cnJlbnQgb3JnYW5pemF0aW9uIGlzIGxlYW5lZCBvbiBNYXJrdXMgS3VobidzIEpCSUcKICAqIGltcGxlbWVudGF0aW9uIChqYmlnX3RhYi5jKS4KICAqLwogCmRpZmYgLS1naXQgYS9qY2FwaW1pbi5jIGIvamNhcGltaW4uYwppbmRleCA1NGZiOGM1Li41NjNhYjQyIDEwMDY0NAotLS0gYS9qY2FwaW1pbi5jCisrKyBiL2pjYXBpbWluLmMKQEAgLTYzLDggKzYzLDEwIEBACiAKICAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7CiAKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7CiAgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKKyAgICBjaW5mby0+cV9zY2FsZV9mYWN0b3JbaV0gPSAxMDA7CisgIH0KIAogICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CiAgICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvamNhcml0aC5jIGIvamNhcml0aC5jCmluZGV4IGFlMWIyM2MuLjk0NWE4MTcgMTAwNjQ0Ci0tLSBhL2pjYXJpdGguYworKysgYi9qY2FyaXRoLmMKQEAgLTEsMTAgKzEsOSBAQAogLyoKICAqIGpjYXJpdGguYwogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NywgR3VpZG8gVm9sbGJlZGluZyA8Z3Vpdm9sQGVzYy5kZT4uCi0gKiBUaGlzIGZpbGUgaXMgTk9UIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQotICogZm9yIGxlZ2FsIHJlYXNvbnMuCi0gKiBTZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZSBmb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZS4KKyAqIERldmVsb3BlZCAxOTk3IGJ5IEd1aWRvIFZvbGxiZWRpbmcuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKICAqIFRoaXMgZmlsZSBjb250YWlucyBwb3J0YWJsZSBhcml0aG1ldGljIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMgZm9yIEpQRUcKICAqIChpbXBsZW1lbnRpbmcgdGhlIElTTy9JRUMgSVMgMTA5MTgtMSBhbmQgQ0NJVFQgUmVjb21tZW5kYXRpb24gSVRVLVQgVC44MSkuCmRpZmYgLS1naXQgYS9qY2NvZWZjdC5jIGIvamNjb2VmY3QuYwppbmRleCAxOTYzZGRiLi5kNzc1MzEzIDEwMDY0NAotLS0gYS9qY2NvZWZjdC5jCisrKyBiL2pjY29lZmN0LmMKQEAgLTE0OSw2ICsxNDksNyBAQAogICBpbnQgYmxrbiwgYmksIGNpLCB5aW5kZXgsIHlvZmZzZXQsIGJsb2NrY250OwogICBKRElNRU5TSU9OIHlwb3MsIHhwb3M7CiAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGZvcndhcmRfRENUX3B0ciBmb3J3YXJkX0RDVDsKIAogICAvKiBMb29wIHRvIHdyaXRlIGFzIG11Y2ggYXMgb25lIHdob2xlIGlNQ1Ugcm93ICovCiAgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKQEAgLTE2NywxNyArMTY4LDE5IEBACiAgICAgICBibGtuID0gMDsKICAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CiAJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwlmb3J3YXJkX0RDVCA9IGNpbmZvLT5mZGN0LT5mb3J3YXJkX0RDVFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwogCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAogCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKIAl4cG9zID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOwotCXlwb3MgPSB5b2Zmc2V0ICogRENUU0laRTsgLyogeXBvcyA9PSAoeW9mZnNldCt5aW5kZXgpICogRENUU0laRSAqLworCXlwb3MgPSB5b2Zmc2V0ICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemU7CisJLyogeXBvcyA9PSAoeW9mZnNldCt5aW5kZXgpICogRENUU0laRSAqLwogCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKIAkgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCBsYXN0X2lNQ1Vfcm93IHx8CiAJICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKLQkgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKLQkJCQkJIGlucHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAotCQkJCQkgY29lZi0+TUNVX2J1ZmZlcltibGtuXSwKLQkJCQkJIHlwb3MsIHhwb3MsIChKRElNRU5TSU9OKSBibG9ja2NudCk7CisJICAgICgqZm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKKwkJCSAgICBpbnB1dF9idWZbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKwkJCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa25dLAorCQkJICAgIHlwb3MsIHhwb3MsIChKRElNRU5TSU9OKSBibG9ja2NudCk7CiAJICAgIGlmIChibG9ja2NudCA8IGNvbXBwdHItPk1DVV93aWR0aCkgewogCSAgICAgIC8qIENyZWF0ZSBzb21lIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW1hZ2UuICovCiAJICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24gKyBibG9ja2NudF0sCkBAIC0xOTUsNyArMTk4LDcgQEAKIAkgICAgfQogCSAgfQogCSAgYmxrbiArPSBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0JICB5cG9zICs9IERDVFNJWkU7CisJICB5cG9zICs9IGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplOwogCX0KICAgICAgIH0KICAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAgSW4gZXZlbnQgb2YgYSBzdXNwZW5zaW9uIGZhaWx1cmUsIHdlIHdpbGwKQEAgLTI1Miw2ICsyNTUsNyBAQAogICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwogICBKQkxPQ0tBUlJBWSBidWZmZXI7CiAgIEpCTE9DS1JPVyB0aGlzYmxvY2tyb3csIGxhc3RibG9ja3JvdzsKKyAgZm9yd2FyZF9EQ1RfcHRyIGZvcndhcmRfRENUOwogCiAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CiAgICAgICAgY2krKywgY29tcHB0cisrKSB7CkBAIC0yNzQsMTUgKzI3OCwxNSBAQAogICAgIG5kdW1teSA9IChpbnQpIChibG9ja3NfYWNyb3NzICUgaF9zYW1wX2ZhY3Rvcik7CiAgICAgaWYgKG5kdW1teSA+IDApCiAgICAgICBuZHVtbXkgPSBoX3NhbXBfZmFjdG9yIC0gbmR1bW15OworICAgIGZvcndhcmRfRENUID0gY2luZm8tPmZkY3QtPmZvcndhcmRfRENUW2NpXTsKICAgICAvKiBQZXJmb3JtIERDVCBmb3IgYWxsIG5vbi1kdW1teSBibG9ja3MgaW4gdGhpcyBpTUNVIHJvdy4gIEVhY2ggY2FsbAogICAgICAqIG9uIGZvcndhcmRfRENUIHByb2Nlc3NlcyBhIGNvbXBsZXRlIGhvcml6b250YWwgcm93IG9mIERDVCBibG9ja3MuCiAgICAgICovCiAgICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgewogICAgICAgdGhpc2Jsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvd107Ci0gICAgICAoKmNpbmZvLT5mZGN0LT5mb3J3YXJkX0RDVCkgKGNpbmZvLCBjb21wcHRyLAotCQkJCSAgIGlucHV0X2J1ZltjaV0sIHRoaXNibG9ja3JvdywKLQkJCQkgICAoSkRJTUVOU0lPTikgKGJsb2NrX3JvdyAqIERDVFNJWkUpLAotCQkJCSAgIChKRElNRU5TSU9OKSAwLCBibG9ja3NfYWNyb3NzKTsKKyAgICAgICgqZm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwgaW5wdXRfYnVmW2NpXSwgdGhpc2Jsb2Nrcm93LAorCQkgICAgICAoSkRJTUVOU0lPTikgKGJsb2NrX3JvdyAqIGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplKSwKKwkJICAgICAgKEpESU1FTlNJT04pIDAsIGJsb2Nrc19hY3Jvc3MpOwogICAgICAgaWYgKG5kdW1teSA+IDApIHsKIAkvKiBDcmVhdGUgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBpbWFnZS4gKi8KIAl0aGlzYmxvY2tyb3cgKz0gYmxvY2tzX2Fjcm9zczsgLyogPT4gZmlyc3QgZHVtbXkgYmxvY2sgKi8KZGlmZiAtLWdpdCBhL2pjZGN0bWdyLmMgYi9qY2RjdG1nci5jCmluZGV4IDYxZmE3OWIuLjBiYmRiYjYgMTAwNjQ0Ci0tLSBhL2pjZGN0bWdyLmMKKysrIGIvamNkY3RtZ3IuYwpAQCAtMjMsNyArMjMsNyBAQAogICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KIAogICAvKiBQb2ludGVyIHRvIHRoZSBEQ1Qgcm91dGluZSBhY3R1YWxseSBpbiB1c2UgKi8KLSAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3Q7CisgIGZvcndhcmRfRENUX21ldGhvZF9wdHIgZG9fZGN0W01BWF9DT01QT05FTlRTXTsKIAogICAvKiBUaGUgYWN0dWFsIHBvc3QtRENUIGRpdmlzb3JzIC0tLSBub3QgaWRlbnRpY2FsIHRvIHRoZSBxdWFudCB0YWJsZQogICAgKiBlbnRyaWVzLCBiZWNhdXNlIG9mIHNjYWxpbmcgKGVzcGVjaWFsbHkgZm9yIGFuIHVubm9ybWFsaXplZCBEQ1QpLgpAQCAtMzMsNyArMzMsNyBAQAogCiAjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAogICAvKiBTYW1lIGFzIGFib3ZlIGZvciB0aGUgZmxvYXRpbmctcG9pbnQgY2FzZS4gKi8KLSAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZmxvYXRfZGN0OworICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19mbG9hdF9kY3RbTUFYX0NPTVBPTkVOVFNdOwogICBGQVNUX0ZMT0FUICogZmxvYXRfZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwogI2VuZGlmCiB9IG15X2ZkY3RfY29udHJvbGxlcjsKQEAgLTQxLDEzMSArNDEsMTYgQEAKIHR5cGVkZWYgbXlfZmRjdF9jb250cm9sbGVyICogbXlfZmRjdF9wdHI7CiAKIAotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICogVmVyaWZ5IHRoYXQgYWxsIHJlZmVyZW5jZWQgUS10YWJsZXMgYXJlIHByZXNlbnQsIGFuZCBzZXQgdXAKLSAqIHRoZSBkaXZpc29yIHRhYmxlIGZvciBlYWNoIG9uZS4KLSAqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBEQ1Qgb2YgYWxsIGNvbXBvbmVudHMgaXMgZG9uZSBkdXJpbmcKLSAqIHRoZSBmaXJzdCBwYXNzLCBldmVuIGlmIG9ubHkgc29tZSBjb21wb25lbnRzIHdpbGwgYmUgb3V0cHV0IGluIHRoZQotICogZmlyc3Qgc2Nhbi4gIEhlbmNlIGFsbCBjb21wb25lbnRzIHNob3VsZCBiZSBleGFtaW5lZCBoZXJlLgorLyogVGhlIGN1cnJlbnQgc2NhbGVkLURDVCByb3V0aW5lcyByZXF1aXJlIElTTE9XLXN0eWxlIGRpdmlzb3IgdGFibGVzLAorICogc28gYmUgc3VyZSB0byBjb21waWxlIHRoYXQgY29kZSBpZiBlaXRoZXIgSVNMT1cgb3IgU0NBTElORyBpcyByZXF1ZXN0ZWQuCiAgKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2ZkY3RtZ3IgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKLSAgaW50IGNpLCBxdGJsbm8sIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotICBEQ1RFTEVNICogZHRibDsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHF0YmxubyA9IGNvbXBwdHItPnF1YW50X3RibF9ubzsKLSAgICAvKiBNYWtlIHN1cmUgc3BlY2lmaWVkIHF1YW50aXphdGlvbiB0YWJsZSBpcyBwcmVzZW50ICovCi0gICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8Ci0JY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOwotICAgIHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXTsKLSAgICAvKiBDb21wdXRlIGRpdmlzb3JzIGZvciB0aGlzIHF1YW50IHRhYmxlICovCi0gICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIHNhbWUgdGFibGUsIGJ1dCBpdCdzIG5vdCBhIGJpZyBkZWFsICovCi0gICAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgewogI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0gICAgICAvKiBGb3IgTEwmTSBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHJhdyBxdWFudGl6YXRpb24KLSAgICAgICAqIGNvZWZmaWNpZW50cyBtdWx0aXBsaWVkIGJ5IDggKHRvIGNvdW50ZXJhY3Qgc2NhbGluZykuCi0gICAgICAgKi8KLSAgICAgIGlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQlmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgRENUU0laRTIgKiBTSVpFT0YoRENURUxFTSkpOwotICAgICAgfQotICAgICAgZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCWR0YmxbaV0gPSAoKERDVEVMRU0pIHF0YmwtPnF1YW50dmFsW2ldKSA8PCAzOwotICAgICAgfQotICAgICAgYnJlYWs7CisjZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCisjZWxzZQorI2lmZGVmIERDVF9TQ0FMSU5HX1NVUFBPUlRFRAorI2RlZmluZSBQUk9WSURFX0lTTE9XX1RBQkxFUwogI2VuZGlmCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICAgIGNhc2UgSkRDVF9JRkFTVDoKLSAgICAgIHsKLQkvKiBGb3IgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQotCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCi0JICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNwotCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KLQkgKi8KLSNkZWZpbmUgQ09OU1RfQklUUyAxNAotCXN0YXRpYyBjb25zdCBJTlQxNiBhYW5zY2FsZXNbRENUU0laRTJdID0gewotCSAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCi0JICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCi0JICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsIDE3ODU1LCAxMjI5OSwgIDYyNzAsCi0JICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCi0JICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCi0JICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCi0JICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCi0JICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCi0JICAgNDUyMCwgIDYyNzAsICA1OTA2LCAgNTMxNSwgIDQ1MjAsICAzNTUyLCAgMjQ0NiwgIDEyNDcKLQl9OwotCVNISUZUX1RFTVBTCi0KLQlpZiAoZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7Ci0JICBmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKLQkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkJRENUU0laRTIgKiBTSVpFT0YoRENURUxFTSkpOwotCX0KLQlkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKLQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCSAgZHRibFtpXSA9IChEQ1RFTEVNKQotCSAgICBERVNDQUxFKE1VTFRJUExZMTZWMTYoKElOVDMyKSBxdGJsLT5xdWFudHZhbFtpXSwKLQkJCQkgIChJTlQzMikgYWFuc2NhbGVzW2ldKSwKLQkJICAgIENPTlNUX0JJVFMtMyk7Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7CiAjZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0ZMT0FUOgotICAgICAgewotCS8qIEZvciBmbG9hdCBBQSZOIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICogV2UgYXBwbHkgYSBmdXJ0aGVyIHNjYWxlIGZhY3RvciBvZiA4LgotCSAqIFdoYXQncyBhY3R1YWxseSBzdG9yZWQgaXMgMS9kaXZpc29yIHNvIHRoYXQgdGhlIGlubmVyIGxvb3AgY2FuCi0JICogdXNlIGEgbXVsdGlwbGljYXRpb24gcmF0aGVyIHRoYW4gYSBkaXZpc2lvbi4KLQkgKi8KLQlGQVNUX0ZMT0FUICogZmR0Ymw7Ci0JaW50IHJvdywgY29sOwotCXN0YXRpYyBjb25zdCBkb3VibGUgYWFuc2NhbGVmYWN0b3JbRENUU0laRV0gPSB7Ci0JICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCi0JICAxLjAsIDAuNzg1Njk0OTU4LCAwLjU0MTE5NjEwMCwgMC4yNzU4OTkzNzkKLQl9OwotCi0JaWYgKGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgewotCSAgZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXSA9IChGQVNUX0ZMT0FUICopCi0JICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJCURDVFNJWkUyICogU0laRU9GKEZBU1RfRkxPQVQpKTsKLQl9Ci0JZmR0YmwgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dOwotCWkgPSAwOwotCWZvciAocm93ID0gMDsgcm93IDwgRENUU0laRTsgcm93KyspIHsKLQkgIGZvciAoY29sID0gMDsgY29sIDwgRENUU0laRTsgY29sKyspIHsKLQkgICAgZmR0YmxbaV0gPSAoRkFTVF9GTE9BVCkKLQkgICAgICAoMS4wIC8gKCgoZG91YmxlKSBxdGJsLT5xdWFudHZhbFtpXSAqCi0JCSAgICAgICBhYW5zY2FsZWZhY3Rvcltyb3ddICogYWFuc2NhbGVmYWN0b3JbY29sXSAqIDguMCkpKTsKLQkgICAgaSsrOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQogCiAKIC8qCkBAIC0xODUsNDMgKzcwLDE2IEBACiB7CiAgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIGl0IHRpZ2h0bHkuICovCiAgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OwotICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmRvX2RjdDsKKyAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19kY3RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKICAgRENURUxFTSAqIGRpdmlzb3JzID0gZmRjdC0+ZGl2aXNvcnNbY29tcHB0ci0+cXVhbnRfdGJsX25vXTsKICAgRENURUxFTSB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiB3b3JrIGFyZWEgZm9yIEZEQ1Qgc3Vicm91dGluZSAqLwogICBKRElNRU5TSU9OIGJpOwogCiAgIHNhbXBsZV9kYXRhICs9IHN0YXJ0X3JvdzsJLyogZm9sZCBpbiB0aGUgdmVydGljYWwgb2Zmc2V0IG9uY2UgKi8KIAotICBmb3IgKGJpID0gMDsgYmkgPCBudW1fYmxvY2tzOyBiaSsrLCBzdGFydF9jb2wgKz0gRENUU0laRSkgewotICAgIC8qIExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCi0gICAgeyByZWdpc3RlciBEQ1RFTEVNICp3b3Jrc3BhY2VwdHI7Ci0gICAgICByZWdpc3RlciBKU0FNUFJPVyBlbGVtcHRyOwotICAgICAgcmVnaXN0ZXIgaW50IGVsZW1yOwotCi0gICAgICB3b3Jrc3BhY2VwdHIgPSB3b3Jrc3BhY2U7Ci0gICAgICBmb3IgKGVsZW1yID0gMDsgZWxlbXIgPCBEQ1RTSVpFOyBlbGVtcisrKSB7Ci0JZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2VsZW1yXSArIHN0YXJ0X2NvbDsKLSNpZiBEQ1RTSVpFID09IDgJCS8qIHVucm9sbCB0aGUgaW5uZXIgbG9vcCAqLwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotCSp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOwotI2Vsc2UKLQl7IHJlZ2lzdGVyIGludCBlbGVtYzsKLQkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKLQkgICAgKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JICB9Ci0JfQotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCisgIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSkgewogICAgIC8qIFBlcmZvcm0gdGhlIERDVCAqLwotICAgICgqZG9fZGN0KSAod29ya3NwYWNlKTsKKyAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSwgc2FtcGxlX2RhdGEsIHN0YXJ0X2NvbCk7CiAKICAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KICAgICB7IHJlZ2lzdGVyIERDVEVMRU0gdGVtcCwgcXZhbDsKQEAgLTI3NSw0NCArMTMzLDE2IEBACiB7CiAgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIGl0IHRpZ2h0bHkuICovCiAgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OwotICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19mbG9hdF9kY3Q7CisgIGZsb2F0X0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmRvX2Zsb2F0X2RjdFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwogICBGQVNUX0ZMT0FUICogZGl2aXNvcnMgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOwogICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCiAgIEpESU1FTlNJT04gYmk7CiAKICAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLwogCi0gIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7Ci0gICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KLSAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgKndvcmtzcGFjZXB0cjsKLSAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7Ci0gICAgICByZWdpc3RlciBpbnQgZWxlbXI7Ci0KLSAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKLSAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKLQllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOwotI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCi0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotI2Vsc2UKLQl7IHJlZ2lzdGVyIGludCBlbGVtYzsKLQkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKLQkgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpCi0JICAgICAgKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkgIH0KLQl9Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KKyAgZm9yIChiaSA9IDA7IGJpIDwgbnVtX2Jsb2NrczsgYmkrKywgc3RhcnRfY29sICs9IGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplKSB7CiAgICAgLyogUGVyZm9ybSB0aGUgRENUICovCi0gICAgKCpkb19kY3QpICh3b3Jrc3BhY2UpOworICAgICgqZG9fZGN0KSAod29ya3NwYWNlLCBzYW1wbGVfZGF0YSwgc3RhcnRfY29sKTsKIAogICAgIC8qIFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9ja3NbXSAqLwogICAgIHsgcmVnaXN0ZXIgRkFTVF9GTE9BVCB0ZW1wOwpAQCAtMzM4LDYgKzE2OCwyOTUgQEAKIAogCiAvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKiBWZXJpZnkgdGhhdCBhbGwgcmVmZXJlbmNlZCBRLXRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIHNldCB1cAorICogdGhlIGRpdmlzb3IgdGFibGUgZm9yIGVhY2ggb25lLgorICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIERDVCBvZiBhbGwgY29tcG9uZW50cyBpcyBkb25lIGR1cmluZworICogdGhlIGZpcnN0IHBhc3MsIGV2ZW4gaWYgb25seSBzb21lIGNvbXBvbmVudHMgd2lsbCBiZSBvdXRwdXQgaW4gdGhlCisgKiBmaXJzdCBzY2FuLiAgSGVuY2UgYWxsIGNvbXBvbmVudHMgc2hvdWxkIGJlIGV4YW1pbmVkIGhlcmUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2ZkY3RtZ3IgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgaW50IGNpLCBxdGJsbm8sIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludCBtZXRob2QgPSAwOworICBKUVVBTlRfVEJMICogcXRibDsKKyAgRENURUxFTSAqIGR0Ymw7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBTZWxlY3QgdGhlIHByb3BlciBEQ1Qgcm91dGluZSBmb3IgdGhpcyBjb21wb25lbnQncyBzY2FsaW5nICovCisgICAgc3dpdGNoICgoY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemUgPDwgOCkgKyBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSkgeworI2lmZGVmIERDVF9TQ0FMSU5HX1NVUFBPUlRFRAorICAgIGNhc2UgKCgxIDw8IDgpICsgMSk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzF4MTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgyIDw8IDgpICsgMik6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzJ4MjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgzIDw8IDgpICsgMyk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzN4MzsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg0IDw8IDgpICsgNCk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzR4NDsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg1IDw8IDgpICsgNSk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzV4NTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg2IDw8IDgpICsgNik6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzZ4NjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg3IDw8IDgpICsgNyk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0Xzd4NzsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg5IDw8IDgpICsgOSk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0Xzl4OTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxMCA8PCA4KSArIDEwKToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfMTB4MTA7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqZmRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTEgPDwgOCkgKyAxMSk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzExeDExOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDEyIDw8IDgpICsgMTIpOgorICAgICAgZmRjdC0+ZG9fZGN0W2NpXSA9IGpwZWdfZmRjdF8xMngxMjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxMyA8PCA4KSArIDEzKToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfMTN4MTM7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqZmRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTQgPDwgOCkgKyAxNCk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzE0eDE0OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDE1IDw8IDgpICsgMTUpOgorICAgICAgZmRjdC0+ZG9fZGN0W2NpXSA9IGpwZWdfZmRjdF8xNXgxNTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxNiA8PCA4KSArIDE2KToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfMTZ4MTY7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqZmRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTYgPDwgOCkgKyA4KToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfMTZ4ODsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxNCA8PCA4KSArIDcpOgorICAgICAgZmRjdC0+ZG9fZGN0W2NpXSA9IGpwZWdfZmRjdF8xNHg3OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDEyIDw8IDgpICsgNik6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzEyeDY7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqZmRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTAgPDwgOCkgKyA1KToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfMTB4NTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg4IDw8IDgpICsgNCk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0Xzh4NDsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg2IDw8IDgpICsgMyk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzZ4MzsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg0IDw8IDgpICsgMik6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzR4MjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgyIDw8IDgpICsgMSk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0XzJ4MTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg4IDw8IDgpICsgMTYpOgorICAgICAgZmRjdC0+ZG9fZGN0W2NpXSA9IGpwZWdfZmRjdF84eDE2OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDcgPDwgOCkgKyAxNCk6CisgICAgICBmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0Xzd4MTQ7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqZmRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoNiA8PCA4KSArIDEyKToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfNngxMjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGpmZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg1IDw8IDgpICsgMTApOgorICAgICAgZmRjdC0+ZG9fZGN0W2NpXSA9IGpwZWdfZmRjdF81eDEwOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDQgPDwgOCkgKyA4KToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfNHg4OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDMgPDwgOCkgKyA2KToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfM3g2OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDIgPDwgOCkgKyA0KToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfMng0OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDEgPDwgOCkgKyAyKToKKyAgICAgIGZkY3QtPmRvX2RjdFtjaV0gPSBqcGVnX2ZkY3RfMXgyOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamZkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlICgoRENUU0laRSA8PCA4KSArIERDVFNJWkUpOgorICAgICAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgeworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgICAgIGNhc2UgSkRDVF9JU0xPVzoKKwlmZGN0LT5kb19kY3RbY2ldID0ganBlZ19mZGN0X2lzbG93OworCW1ldGhvZCA9IEpEQ1RfSVNMT1c7CisJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgICAgICBjYXNlIEpEQ1RfSUZBU1Q6CisJZmRjdC0+ZG9fZGN0W2NpXSA9IGpwZWdfZmRjdF9pZmFzdDsKKwltZXRob2QgPSBKRENUX0lGQVNUOworCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgICAgY2FzZSBKRENUX0ZMT0FUOgorCWZkY3QtPmRvX2Zsb2F0X2RjdFtjaV0gPSBqcGVnX2ZkY3RfZmxvYXQ7CisJbWV0aG9kID0gSkRDVF9GTE9BVDsKKwlicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKwlFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisJYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0RDVFNJWkUsCisJICAgICAgIGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplLCBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOworICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KKyAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7CisgICAgcXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dOworICAgIC8qIENvbXB1dGUgZGl2aXNvcnMgZm9yIHRoaXMgcXVhbnQgdGFibGUgKi8KKyAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3Igc2FtZSB0YWJsZSwgYnV0IGl0J3Mgbm90IGEgYmlnIGRlYWwgKi8KKyAgICBzd2l0Y2ggKG1ldGhvZCkgeworI2lmZGVmIFBST1ZJREVfSVNMT1dfVEFCTEVTCisgICAgY2FzZSBKRENUX0lTTE9XOgorICAgICAgLyogRm9yIExMJk0gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byByYXcgcXVhbnRpemF0aW9uCisgICAgICAgKiBjb2VmZmljaWVudHMgbXVsdGlwbGllZCBieSA4ICh0byBjb3VudGVyYWN0IHNjYWxpbmcpLgorICAgICAgICovCisgICAgICBpZiAoZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7CisJZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCisJICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIERDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKKyAgICAgIH0KKyAgICAgIGR0YmwgPSBmZGN0LT5kaXZpc29yc1txdGJsbm9dOworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwlkdGJsW2ldID0gKChEQ1RFTEVNKSBxdGJsLT5xdWFudHZhbFtpXSkgPDwgMzsKKyAgICAgIH0KKyAgICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVFtjaV0gPSBmb3J3YXJkX0RDVDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JRkFTVDoKKyAgICAgIHsKKwkvKiBGb3IgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KKwkgKi8KKyNkZWZpbmUgQ09OU1RfQklUUyAxNAorCXN0YXRpYyBjb25zdCBJTlQxNiBhYW5zY2FsZXNbRENUU0laRTJdID0geworCSAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsIDE3ODU1LCAxMjI5OSwgIDYyNzAsCisJICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCisJICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCisJICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCisJICAgNDUyMCwgIDYyNzAsICA1OTA2LCAgNTMxNSwgIDQ1MjAsICAzNTUyLCAgMjQ0NiwgIDEyNDcKKwl9OworCVNISUZUX1RFTVBTCisKKwlpZiAoZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7CisJICBmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKKwkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkJRENUU0laRTIgKiBTSVpFT0YoRENURUxFTSkpOworCX0KKwlkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKKwlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCSAgZHRibFtpXSA9IChEQ1RFTEVNKQorCSAgICBERVNDQUxFKE1VTFRJUExZMTZWMTYoKElOVDMyKSBxdGJsLT5xdWFudHZhbFtpXSwKKwkJCQkgIChJTlQzMikgYWFuc2NhbGVzW2ldKSwKKwkJICAgIENPTlNUX0JJVFMtMyk7CisJfQorICAgICAgfQorICAgICAgZmRjdC0+cHViLmZvcndhcmRfRENUW2NpXSA9IGZvcndhcmRfRENUOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgICAgY2FzZSBKRENUX0ZMT0FUOgorICAgICAgeworCS8qIEZvciBmbG9hdCBBQSZOIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCisJICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCisJICogICBzY2FsZWZhY3RvclswXSA9IDEKKwkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43CisJICogV2UgYXBwbHkgYSBmdXJ0aGVyIHNjYWxlIGZhY3RvciBvZiA4LgorCSAqIFdoYXQncyBhY3R1YWxseSBzdG9yZWQgaXMgMS9kaXZpc29yIHNvIHRoYXQgdGhlIGlubmVyIGxvb3AgY2FuCisJICogdXNlIGEgbXVsdGlwbGljYXRpb24gcmF0aGVyIHRoYW4gYSBkaXZpc2lvbi4KKwkgKi8KKwlGQVNUX0ZMT0FUICogZmR0Ymw7CisJaW50IHJvdywgY29sOworCXN0YXRpYyBjb25zdCBkb3VibGUgYWFuc2NhbGVmYWN0b3JbRENUU0laRV0gPSB7CisJICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCisJICAxLjAsIDAuNzg1Njk0OTU4LCAwLjU0MTE5NjEwMCwgMC4yNzU4OTkzNzkKKwl9OworCisJaWYgKGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCSAgZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXSA9IChGQVNUX0ZMT0FUICopCisJICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJCURDVFNJWkUyICogU0laRU9GKEZBU1RfRkxPQVQpKTsKKwl9CisJZmR0YmwgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dOworCWkgPSAwOworCWZvciAocm93ID0gMDsgcm93IDwgRENUU0laRTsgcm93KyspIHsKKwkgIGZvciAoY29sID0gMDsgY29sIDwgRENUU0laRTsgY29sKyspIHsKKwkgICAgZmR0YmxbaV0gPSAoRkFTVF9GTE9BVCkKKwkgICAgICAoMS4wIC8gKCgoZG91YmxlKSBxdGJsLT5xdWFudHZhbFtpXSAqCisJCSAgICAgICBhYW5zY2FsZWZhY3Rvcltyb3ddICogYWFuc2NhbGVmYWN0b3JbY29sXSAqIDguMCkpKTsKKwkgICAgaSsrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVFtjaV0gPSBmb3J3YXJkX0RDVF9mbG9hdDsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKKy8qCiAgKiBJbml0aWFsaXplIEZEQ1QgbWFuYWdlci4KICAqLwogCkBAIC0zNTMsMzAgKzQ3Miw2IEBACiAgIGNpbmZvLT5mZGN0ID0gKHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICopIGZkY3Q7CiAgIGZkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19mZGN0bWdyOwogCi0gIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JU0xPVzoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaXNsb3c7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JRkFTVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaWZhc3Q7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9GTE9BVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVF9mbG9hdDsKLSAgICBmZGN0LT5kb19mbG9hdF9kY3QgPSBqcGVnX2ZkY3RfZmxvYXQ7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQogICAvKiBNYXJrIGRpdmlzb3IgdGFibGVzIHVuYWxsb2NhdGVkICovCiAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7CiAgICAgZmRjdC0+ZGl2aXNvcnNbaV0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvamNodWZmLmMgYi9qY2h1ZmYuYwppbmRleCBmMjM1MjUwLi4wZmQ1NzhlIDEwMDY0NAotLS0gYS9qY2h1ZmYuYworKysgYi9qY2h1ZmYuYwpAQCAtMiwyMiArMiw0OCBAQAogICogamNodWZmLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDA2LTIwMDkgYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcy4KKyAqIEJvdGggc2VxdWVudGlhbCBhbmQgcHJvZ3Jlc3NpdmUgbW9kZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIHNpbmdsZSBtb2R1bGUuCiAgKgogICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgb3V0cHV0IHN1c3BlbnNpb24uCiAgKiBJZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KICAqIGJhY2sgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUKICAqIHZhcmlhYmxlcyBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlCiAgKiBwZXJtYW5lbnQgSlBFRyBvYmplY3RzIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgorICoKKyAqIFdlIGRvIG5vdCBzdXBwb3J0IG91dHB1dCBzdXNwZW5zaW9uIGZvciB0aGUgcHJvZ3Jlc3NpdmUgSlBFRyBtb2RlLCBzaW5jZQorICogdGhlIGxpYnJhcnkgY3VycmVudGx5IGRvZXMgbm90IGFsbG93IG11bHRpcGxlLXNjYW4gZmlsZXMgdG8gYmUgd3JpdHRlbgorICogd2l0aCBvdXRwdXQgc3VzcGVuc2lvbi4KICAqLwogCiAjZGVmaW5lIEpQRUdfSU5URVJOQUxTCiAjaW5jbHVkZSAiamluY2x1ZGUuaCIKICNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamNodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamNwaHVmZi5jICovCisKKworLyogVGhlIGxlZ2FsIHJhbmdlIG9mIGEgRENUIGNvZWZmaWNpZW50IGlzCisgKiAgLTEwMjQgLi4gKzEwMjMgIGZvciA4LWJpdCBkYXRhOworICogLTE2Mzg0IC4uICsxNjM4MyBmb3IgMTItYml0IGRhdGEuCisgKiBIZW5jZSB0aGUgbWFnbml0dWRlIHNob3VsZCBhbHdheXMgZml0IGluIDEwIG9yIDE0IGJpdHMgcmVzcGVjdGl2ZWx5LgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDEwCisjZWxzZQorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDE0CisjZW5kaWYKKworLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZWh1ZmNvWzI1Nl07CS8qIGNvZGUgZm9yIGVhY2ggc3ltYm9sICovCisgIGNoYXIgZWh1ZnNpWzI1Nl07CQkvKiBsZW5ndGggb2YgY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KKyAgLyogSWYgbm8gY29kZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIGEgc3ltYm9sIFMsIGVodWZzaVtTXSBjb250YWlucyAwICovCit9IGNfZGVyaXZlZF90Ymw7CiAKIAogLyogRXhwYW5kZWQgZW50cm9weSBlbmNvZGVyIG9iamVjdCBmb3IgSHVmZm1hbiBlbmNvZGluZy4KQEAgLTYxLDE5ICs4Nyw0NyBAQAogICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KICAgaW50IG5leHRfcmVzdGFydF9udW07CQkvKiBuZXh0IHJlc3RhcnQgbnVtYmVyIHRvIHdyaXRlICgwLTcpICovCiAKKyAgLyogRm9sbG93aW5nIGZvdXIgZmllbGRzIHVzZWQgb25seSBpbiBzZXF1ZW50aWFsIG1vZGUgKi8KKwogICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLwogICBjX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwogICBjX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwogCi0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECS8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb24gKi8KKyAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbiAqLwogICBsb25nICogZGNfY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKICAgbG9uZyAqIGFjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107Ci0jZW5kaWYKKworICAvKiBGb2xsb3dpbmcgZmllbGRzIHVzZWQgb25seSBpbiBwcm9ncmVzc2l2ZSBtb2RlICovCisKKyAgLyogTW9kZSBmbGFnOiBUUlVFIGZvciBvcHRpbWl6YXRpb24sIEZBTFNFIGZvciBhY3R1YWwgZGF0YSBvdXRwdXQgKi8KKyAgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljczsKKworICAvKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgorICAgKi8KKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLworICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCisgIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KKyAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KKyAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pLgorICAgKiBTaW5jZSBhbnkgb25lIHNjYW4gaW4gcHJvZ3Jlc3NpdmUgbW9kZSBjb2RlcyBvbmx5IERDIG9yIG9ubHkgQUMsCisgICAqIHdlIG9ubHkgbmVlZCBvbmUgc2V0IG9mIHRhYmxlcywgbm90IG9uZSBmb3IgREMgYW5kIG9uZSBmb3IgQUMuCisgICAqLworICBjX2Rlcml2ZWRfdGJsICogZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisgIC8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb247IGFnYWluLCBvbmUgc2V0IGlzIGVub3VnaCAqLworICBsb25nICogY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKIH0gaHVmZl9lbnRyb3B5X2VuY29kZXI7CiAKIHR5cGVkZWYgaHVmZl9lbnRyb3B5X2VuY29kZXIgKiBodWZmX2VudHJvcHlfcHRyOwogCi0vKiBXb3JraW5nIHN0YXRlIHdoaWxlIHdyaXRpbmcgYW4gTUNVLgorLyogV29ya2luZyBzdGF0ZSB3aGlsZSB3cml0aW5nIGFuIE1DVSAoc2VxdWVudGlhbCBtb2RlKS4KICAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGFsbCB0aGUgZmllbGRzIHRoYXQgYXJlIG5lZWRlZCBieSBzdWJyb3V0aW5lcy4KICAqLwogCkBAIC04NCw5OCArMTM4LDM3IEBACiAgIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogZHVtcF9idWZmZXIgbmVlZHMgYWNjZXNzIHRvIHRoaXMgKi8KIH0gd29ya2luZ19zdGF0ZTsKIAotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQlKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9nYXRoZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICogSWYgZ2F0aGVyX3N0YXRpc3RpY3MgaXMgVFJVRSwgd2UgZG8gbm90IG91dHB1dCBhbnl0aGluZyBkdXJpbmcgdGhlIHNjYW4sCi0gKiBqdXN0IGNvdW50IHRoZSBIdWZmbWFuIHN5bWJvbHMgdXNlZCBhbmQgZ2VuZXJhdGUgSHVmZm1hbiBjb2RlIHRhYmxlcy4KKy8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0CisgKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAorICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCisgKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KICAqLwogCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpLCBkY3RibCwgYWN0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworI2RlZmluZSBNQVhfQ09SUl9CSVRTICAxMDAwCS8qIE1heCAjIG9mIGNvcnJlY3Rpb24gYml0cyBJIGNhbiBidWZmZXIgKi8KIAotICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfZ2F0aGVyOwotICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2dhdGhlcjsKKy8qIElSSUdIVF9TSElGVCBpcyBsaWtlIFJJR0hUX1NISUZULCBidXQgd29ya3Mgb24gaW50IHJhdGhlciB0aGFuIElOVDMyLgorICogV2UgYXNzdW1lIHRoYXQgaW50IHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkIGlmIElOVDMyIHJpZ2h0IHNoaWZ0IGlzLAorICogd2hpY2ggc2hvdWxkIGJlIHNhZmUuCisgKi8KKworI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisjZGVmaW5lIElTSElGVF9URU1QUwlpbnQgaXNoaWZ0X3RlbXA7CisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpICBcCisJKChpc2hpZnRfdGVtcCA9ICh4KSkgPCAwID8gXAorCSAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSB8ICgofjApIDw8ICgxNi0oc2hmdCkpKSA6IFwKKwkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkpCiAjZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQogI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2h1ZmY7Ci0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfaHVmZjsKLSAgfQotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIHRhYmxlIGluZGV4ZXMgKi8KLSAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLwotICAgICAgaWYgKGRjdGJsIDwgMCB8fCBkY3RibCA+PSBOVU1fSFVGRl9UQkxTKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGRjdGJsKTsKLSAgICAgIGlmIChhY3RibCA8IDAgfHwgYWN0YmwgPj0gTlVNX0hVRkZfVEJMUykKLQlFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBhY3RibCk7Ci0gICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KLSAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KLSAgICAgIGlmIChlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9PSBOVUxMKQotCWVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID0gKGxvbmcgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIE1FTVpFUk8oZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgICBpZiAoZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPT0gTlVMTCkKLQllbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9IChsb25nICopCi0JICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgICBNRU1aRVJPKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCi0gICAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLwotICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAotCQkJICAgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKLSAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgYWN0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOwotICAgIH0KLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCi0gIGVudHJvcHktPnNhdmVkLnB1dF9idWZmZXIgPSAwOwotICBlbnRyb3B5LT5zYXZlZC5wdXRfYml0cyA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOwotfQogCiAKIC8qCiAgKiBDb21wdXRlIHRoZSBkZXJpdmVkIHZhbHVlcyBmb3IgYSBIdWZmbWFuIHRhYmxlLgogICogVGhpcyByb3V0aW5lIGFsc28gcGVyZm9ybXMgc29tZSB2YWxpZGF0aW9uIGNoZWNrcyBvbiB0aGUgdGFibGUuCi0gKgotICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCiAgKi8KIAotR0xPQkFMKHZvaWQpCitMT0NBTCh2b2lkKQoganBlZ19tYWtlX2NfZGVyaXZlZF90YmwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKIAkJCSBjX2Rlcml2ZWRfdGJsICoqIHBkdGJsKQogewpAQCAtMjY0LDE4ICsyNTcsMjcgQEAKIH0KIAogCi0vKiBPdXRwdXR0aW5nIGJ5dGVzIHRvIHRoZSBmaWxlICovCisvKiBPdXRwdXR0aW5nIGJ5dGVzIHRvIHRoZSBmaWxlLgorICogTkI6IHRoZXNlIG11c3QgYmUgY2FsbGVkIG9ubHkgd2hlbiBhY3R1YWxseSBvdXRwdXR0aW5nLAorICogdGhhdCBpcywgZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MgPT0gRkFMU0UuCisgKi8KIAogLyogRW1pdCBhIGJ5dGUsIHRha2luZyAnYWN0aW9uJyBpZiBtdXN0IHN1c3BlbmQuICovCi0jZGVmaW5lIGVtaXRfYnl0ZShzdGF0ZSx2YWwsYWN0aW9uKSAgXAorI2RlZmluZSBlbWl0X2J5dGVfcyhzdGF0ZSx2YWwsYWN0aW9uKSAgXAogCXsgKihzdGF0ZSktPm5leHRfb3V0cHV0X2J5dGUrKyA9IChKT0NURVQpICh2YWwpOyAgXAogCSAgaWYgKC0tKHN0YXRlKS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKLQkgICAgaWYgKCEgZHVtcF9idWZmZXIoc3RhdGUpKSAgXAorCSAgICBpZiAoISBkdW1wX2J1ZmZlcl9zKHN0YXRlKSkgIFwKIAkgICAgICB7IGFjdGlvbjsgfSB9CiAKKy8qIEVtaXQgYSBieXRlICovCisjZGVmaW5lIGVtaXRfYnl0ZV9lKGVudHJvcHksdmFsKSAgXAorCXsgKihlbnRyb3B5KS0+bmV4dF9vdXRwdXRfYnl0ZSsrID0gKEpPQ1RFVCkgKHZhbCk7ICBcCisJICBpZiAoLS0oZW50cm9weSktPmZyZWVfaW5fYnVmZmVyID09IDApICBcCisJICAgIGR1bXBfYnVmZmVyX2UoZW50cm9weSk7IH0KKwogCiBMT0NBTChib29sZWFuKQotZHVtcF9idWZmZXIgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKK2R1bXBfYnVmZmVyX3MgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKIC8qIEVtcHR5IHRoZSBvdXRwdXQgYnVmZmVyOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KIHsKICAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IHN0YXRlLT5jaW5mby0+ZGVzdDsKQEAgLTI4OSw2ICsyOTEsMjAgQEAKIH0KIAogCitMT0NBTCh2b2lkKQorZHVtcF9idWZmZXJfZSAoaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQorLyogRW1wdHkgdGhlIG91dHB1dCBidWZmZXI7IHdlIGRvIG5vdCBzdXBwb3J0IHN1c3BlbnNpb24gaW4gdGhpcyBjYXNlLiAqLworeworICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gZW50cm9weS0+Y2luZm8tPmRlc3Q7CisKKyAgaWYgKCEgKCpkZXN0LT5lbXB0eV9vdXRwdXRfYnVmZmVyKSAoZW50cm9weS0+Y2luZm8pKQorICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKKyAgLyogQWZ0ZXIgYSBzdWNjZXNzZnVsIGJ1ZmZlciBkdW1wLCBtdXN0IHJlc2V0IGJ1ZmZlciBwb2ludGVycyAqLworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBkZXN0LT5mcmVlX2luX2J1ZmZlcjsKK30KKworCiAvKiBPdXRwdXR0aW5nIGJpdHMgdG8gdGhlIGZpbGUgKi8KIAogLyogT25seSB0aGUgcmlnaHQgMjQgYml0cyBvZiBwdXRfYnVmZmVyIGFyZSB1c2VkOyB0aGUgdmFsaWQgYml0cyBhcmUKQEAgLTI5OSw3ICszMTUsNyBAQAogCiBJTkxJTkUKIExPQ0FMKGJvb2xlYW4pCi1lbWl0X2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCBzaXplKQorZW1pdF9iaXRzX3MgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCBzaXplKQogLyogRW1pdCBzb21lIGJpdHM7IHJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIG11c3Qgc3VzcGVuZCAqLwogewogICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyB0aWdodGx5LiAqLwpAQCAtMzIxLDkgKzMzNyw5IEBACiAgIHdoaWxlIChwdXRfYml0cyA+PSA4KSB7CiAgICAgaW50IGMgPSAoaW50KSAoKHB1dF9idWZmZXIgPj4gMTYpICYgMHhGRik7CiAgICAgCi0gICAgZW1pdF9ieXRlKHN0YXRlLCBjLCByZXR1cm4gRkFMU0UpOworICAgIGVtaXRfYnl0ZV9zKHN0YXRlLCBjLCByZXR1cm4gRkFMU0UpOwogICAgIGlmIChjID09IDB4RkYpIHsJCS8qIG5lZWQgdG8gc3R1ZmYgYSB6ZXJvIGJ5dGU/ICovCi0gICAgICBlbWl0X2J5dGUoc3RhdGUsIDAsIHJldHVybiBGQUxTRSk7CisgICAgICBlbWl0X2J5dGVfcyhzdGF0ZSwgMCwgcmV0dXJuIEZBTFNFKTsKICAgICB9CiAgICAgcHV0X2J1ZmZlciA8PD0gODsKICAgICBwdXRfYml0cyAtPSA4OwpAQCAtMzM2LDE3ICszNTIsNTU0IEBACiB9CiAKIAotTE9DQUwoYm9vbGVhbikKLWZsdXNoX2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKK0lOTElORQorTE9DQUwodm9pZCkKK2VtaXRfYml0c19lIChodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKKy8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCiB7Ci0gIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgMHg3RiwgNykpIC8qIGZpbGwgYW55IHBhcnRpYWwgYnl0ZSB3aXRoIG9uZXMgKi8KKyAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgdGlnaHRseS4gKi8KKyAgcmVnaXN0ZXIgSU5UMzIgcHV0X2J1ZmZlciA9IChJTlQzMikgY29kZTsKKyAgcmVnaXN0ZXIgaW50IHB1dF9iaXRzID0gZW50cm9weS0+c2F2ZWQucHV0X2JpdHM7CisKKyAgLyogaWYgc2l6ZSBpcyAwLCBjYWxsZXIgdXNlZCBhbiBpbnZhbGlkIEh1ZmZtYW4gdGFibGUgZW50cnkgKi8KKyAgaWYgKHNpemUgPT0gMCkKKyAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKKworICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCisgICAgcmV0dXJuOwkJCS8qIGRvIG5vdGhpbmcgaWYgd2UncmUgb25seSBnZXR0aW5nIHN0YXRzICovCisKKyAgcHV0X2J1ZmZlciAmPSAoKChJTlQzMikgMSk8PHNpemUpIC0gMTsgLyogbWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gY29kZSAqLworICAKKyAgcHV0X2JpdHMgKz0gc2l6ZTsJCS8qIG5ldyBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KKworICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCisKKyAgLyogYW5kIG1lcmdlIHdpdGggb2xkIGJ1ZmZlciBjb250ZW50cyAqLworICBwdXRfYnVmZmVyIHw9IGVudHJvcHktPnNhdmVkLnB1dF9idWZmZXI7CisKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKworICAgIGVtaXRfYnl0ZV9lKGVudHJvcHksIGMpOworICAgIGlmIChjID09IDB4RkYpIHsJCS8qIG5lZWQgdG8gc3R1ZmYgYSB6ZXJvIGJ5dGU/ICovCisgICAgICBlbWl0X2J5dGVfZShlbnRyb3B5LCAwKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgZW50cm9weS0+c2F2ZWQucHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+c2F2ZWQucHV0X2JpdHMgPSBwdXRfYml0czsKK30KKworCitMT0NBTChib29sZWFuKQorZmx1c2hfYml0c19zICh3b3JraW5nX3N0YXRlICogc3RhdGUpCit7CisgIGlmICghIGVtaXRfYml0c19zKHN0YXRlLCAweDdGLCA3KSkgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLwogICAgIHJldHVybiBGQUxTRTsKLSAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gMDsJLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gMDsJICAgICAvKiBhbmQgcmVzZXQgYml0LWJ1ZmZlciB0byBlbXB0eSAqLwogICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gMDsKICAgcmV0dXJuIFRSVUU7CiB9CiAKIAorTE9DQUwodm9pZCkKK2ZsdXNoX2JpdHNfZSAoaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQoreworICBlbWl0X2JpdHNfZShlbnRyb3B5LCAweDdGLCA3KTsgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLworICBlbnRyb3B5LT5zYXZlZC5wdXRfYnVmZmVyID0gMDsgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgZW50cm9weS0+c2F2ZWQucHV0X2JpdHMgPSAwOworfQorCisKKy8qCisgKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgorICovCisKK0lOTElORQorTE9DQUwodm9pZCkKK2VtaXRfc3ltYm9sIChodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIGludCB0Ymxfbm8sIGludCBzeW1ib2wpCit7CisgIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKKyAgICBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF9ub11bc3ltYm9sXSsrOworICBlbHNlIHsKKyAgICBjX2Rlcml2ZWRfdGJsICogdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF9ub107CisgICAgZW1pdF9iaXRzX2UoZW50cm9weSwgdGJsLT5laHVmY29bc3ltYm9sXSwgdGJsLT5laHVmc2lbc3ltYm9sXSk7CisgIH0KK30KKworCisvKgorICogRW1pdCBiaXRzIGZyb20gYSBjb3JyZWN0aW9uIGJpdCBidWZmZXIuCisgKi8KKworTE9DQUwodm9pZCkKK2VtaXRfYnVmZmVyZWRfYml0cyAoaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKKyAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCisKKyAgd2hpbGUgKG5iaXRzID4gMCkgeworICAgIGVtaXRfYml0c19lKGVudHJvcHksICh1bnNpZ25lZCBpbnQpICgqYnVmc3RhcnQpLCAxKTsKKyAgICBidWZzdGFydCsrOworICAgIG5iaXRzLS07CisgIH0KK30KKworCisvKgorICogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gc3ltYm9sLgorICovCisKK0xPQ0FMKHZvaWQpCitlbWl0X2VvYnJ1biAoaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQoreworICByZWdpc3RlciBpbnQgdGVtcCwgbmJpdHM7CisKKyAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApIHsJLyogaWYgdGhlcmUgaXMgYW55IHBlbmRpbmcgRU9CUlVOICovCisgICAgdGVtcCA9IGVudHJvcHktPkVPQlJVTjsKKyAgICBuYml0cyA9IDA7CisgICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKKyAgICAgIG5iaXRzKys7CisgICAgLyogc2FmZXR5IGNoZWNrOiBzaG91bGRuJ3QgaGFwcGVuIGdpdmVuIGxpbWl0ZWQgY29ycmVjdGlvbi1iaXQgYnVmZmVyICovCisgICAgaWYgKG5iaXRzID4gMTQpCisgICAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKKworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgbmJpdHMgPDwgNCk7CisgICAgaWYgKG5iaXRzKQorICAgICAgZW1pdF9iaXRzX2UoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7CisKKyAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOworCisgICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCisgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKKyAgICBlbnRyb3B5LT5CRSA9IDA7CisgIH0KK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTChib29sZWFuKQorZW1pdF9yZXN0YXJ0X3MgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgaW50IHJlc3RhcnRfbnVtKQoreworICBpbnQgY2k7CisKKyAgaWYgKCEgZmx1c2hfYml0c19zKHN0YXRlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZW1pdF9ieXRlX3Moc3RhdGUsIDB4RkYsIHJldHVybiBGQUxTRSk7CisgIGVtaXRfYnl0ZV9zKHN0YXRlLCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSwgcmV0dXJuIEZBTFNFKTsKKworICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgc3RhdGUtPmNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIHN0YXRlLT5jdXIubGFzdF9kY192YWxbY2ldID0gMDsKKworICAvKiBUaGUgcmVzdGFydCBjb3VudGVyIGlzIG5vdCB1cGRhdGVkIHVudGlsIHdlIHN1Y2Nlc3NmdWxseSB3cml0ZSB0aGUgTUNVLiAqLworCisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X3Jlc3RhcnRfZSAoaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCit7CisgIGludCBjaTsKKworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgeworICAgIGZsdXNoX2JpdHNfZShlbnRyb3B5KTsKKyAgICBlbWl0X2J5dGVfZShlbnRyb3B5LCAweEZGKTsKKyAgICBlbWl0X2J5dGVfZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7CisgIH0KKworICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKKyAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLworICAgIGVudHJvcHktPkVPQlJVTiA9IDA7CisgICAgZW50cm9weS0+QkUgPSAwOworICB9Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIGludCBibGtuLCBjaTsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICBKQkxPQ0tST1cgYmxvY2s7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBJU0hJRlRfVEVNUFMKKworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGVtaXRfcmVzdGFydF9lKGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCisgICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KKyAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgICAqLworICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKKworICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCisgICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldOworICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOworCisgICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KKyAgICB0ZW1wMiA9IHRlbXA7CisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLworICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgICB0ZW1wMi0tOworICAgIH0KKyAgICAKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgbmJpdHMgPSAwOworICAgIHdoaWxlICh0ZW1wKSB7CisgICAgICBuYml0cysrOworICAgICAgdGVtcCA+Pj0gMTsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCisgICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICAgKi8KKyAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgICAgCisgICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOworICAgIAorICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLworICAgICAgZW1pdF9iaXRzX2UoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKKyAgfQorCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7CisgICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOworICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OworICAgIH0KKyAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgQUMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9BQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgSkJMT0NLUk9XIGJsb2NrOworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0X2UoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLworICBibG9jayA9IE1DVV9kYXRhWzBdOworCisgIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEcuMS4yLjIsIGZpZy4gRy4zICovCisgIAorICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLworICAgCisgIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcworICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5CisgICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZTsgc28gdGhlIGNvZGUgaXMKKyAgICAgKiBpbnRlcndvdmVuIHdpdGggZmluZGluZyB0aGUgYWJzIHZhbHVlICh0ZW1wKSBhbmQgb3V0cHV0IGJpdHMgKHRlbXAyKS4KKyAgICAgKi8KKyAgICBpZiAodGVtcCA8IDApIHsKKyAgICAgIHRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCisgICAgICB0ZW1wID4+PSBBbDsJCS8qIGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gKi8KKyAgICAgIC8qIEZvciBhIG5lZ2F0aXZlIGNvZWYsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGNvZWYpICovCisgICAgICB0ZW1wMiA9IH50ZW1wOworICAgIH0gZWxzZSB7CisgICAgICB0ZW1wID4+PSBBbDsJCS8qIGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gKi8KKyAgICAgIHRlbXAyID0gdGVtcDsKKyAgICB9CisgICAgLyogV2F0Y2ggb3V0IGZvciBjYXNlIHRoYXQgbm9uemVybyBjb2VmIGlzIHplcm8gYWZ0ZXIgcG9pbnQgdHJhbnNmb3JtICovCisgICAgaWYgKHRlbXAgPT0gMCkgeworICAgICAgcisrOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gKi8KKyAgICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkKKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KKyAgICB3aGlsZSAociA+IDE1KSB7CisgICAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIDB4RjApOworICAgICAgciAtPSAxNjsKKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgbmJpdHMgPSAxOwkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCisgICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKKyAgICAgIG5iaXRzKys7CisgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KKyAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOworCisgICAgLyogQ291bnQvZW1pdCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCisgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAociA8PCA0KSArIG5iaXRzKTsKKworICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICAgIGVtaXRfYml0c19lKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7CisKKyAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KKyAgfQorCisgIGlmIChyID4gMCkgewkJCS8qIElmIHRoZXJlIGFyZSB0cmFpbGluZyB6ZXJvZXMsICovCisgICAgZW50cm9weS0+RU9CUlVOKys7CQkvKiBjb3VudCBhbiBFT0IgKi8KKyAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRikKKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwkvKiBmb3JjZSBpdCBvdXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyAgfQorCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7CisgICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOworICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OworICAgIH0KKyAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KKyAqIE5vdGU6IHdlIGFzc3VtZSBzdWNoIHNjYW5zIGNhbiBiZSBtdWx0aS1jb21wb25lbnQsIGFsdGhvdWdoIHRoZSBzcGVjCisgKiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGUgcG9pbnQuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitlbmNvZGVfbWN1X0RDX3JlZmluZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIGludCBibGtuOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGVtaXRfcmVzdGFydF9lKGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKworICAgIC8qIFdlIHNpbXBseSBlbWl0IHRoZSBBbCd0aCBiaXQgb2YgdGhlIERDIGNvZWZmaWNpZW50IHZhbHVlLiAqLworICAgIHRlbXAgPSAoKmJsb2NrKVswXTsKKyAgICBlbWl0X2JpdHNfZShlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICByZWdpc3RlciBpbnQgciwgazsKKyAgaW50IEVPQjsKKyAgY2hhciAqQlJfYnVmZmVyOworICB1bnNpZ25lZCBpbnQgQlI7CisgIGludCBTZSA9IGNpbmZvLT5TZTsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICBKQkxPQ0tST1cgYmxvY2s7CisgIGludCBhYnN2YWx1ZXNbRENUU0laRTJdOworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0X2UoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLworICBibG9jayA9IE1DVV9kYXRhWzBdOworCisgIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKKyAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCisgICAqLworICBFT0IgPSAwOworICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOworICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcworICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5CisgICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAodGVtcCA8IDApCisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KKyAgICBpZiAodGVtcCA9PSAxKQorICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLworICB9CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KKyAgCisgIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCisgIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCisgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCisKKyAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCisgICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgeworICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgICAgLyogRW1pdCBaUkwgKi8KKyAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7CisgICAgICByIC09IDE2OworICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KKyAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCisgICAgICBCUiA9IDA7CisgICAgfQorCisgICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgorICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKKyAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCisgICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCisgICAgICovCisgICAgaWYgKHRlbXAgPiAxKSB7CisgICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKKworICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCisgICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKKyAgICBlbWl0X2JpdHNfZShlbnRyb3B5LCAodW5zaWduZWQgaW50KSB0ZW1wLCAxKTsKKworICAgIC8qIEVtaXQgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIHRoYXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlICovCisgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIEJSX2J1ZmZlciwgQlIpOworICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCisgICAgQlIgPSAwOworICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLworICB9CisKKyAgaWYgKHIgPiAwIHx8IEJSID4gMCkgewkvKiBJZiB0aGVyZSBhcmUgdHJhaWxpbmcgemVyb2VzLCAqLworICAgIGVudHJvcHktPkVPQlJVTisrOwkJLyogY291bnQgYW4gRU9CICovCisgICAgZW50cm9weS0+QkUgKz0gQlI7CQkvKiBjb25jYXQgbXkgY29ycmVjdGlvbiBiaXRzIHRvIG9sZGVyIG9uZXMgKi8KKyAgICAvKiBXZSBmb3JjZSBvdXQgdGhlIEVPQiBpZiB3ZSByaXNrIGVpdGhlcjoKKyAgICAgKiAxLiBvdmVyZmxvdyBvZiB0aGUgRU9CIGNvdW50ZXI7CisgICAgICogMi4gb3ZlcmZsb3cgb2YgdGhlIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciBkdXJpbmcgdGhlIG5leHQgTUNVLgorICAgICAqLworICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGIHx8IGVudHJvcHktPkJFID4gKE1BWF9DT1JSX0JJVFMtRENUU0laRTIrMSkpCisgICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgfQorCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7CisgICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOworICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OworICAgIH0KKyAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKwogLyogRW5jb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCiAKIExPQ0FMKGJvb2xlYW4pCkBAIC0zNTYsOSArOTA5LDkgQEAKICAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOwogICByZWdpc3RlciBpbnQgbmJpdHM7CiAgIHJlZ2lzdGVyIGludCBrLCByLCBpOwotICAKKwogICAvKiBFbmNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgcGVyIHNlY3Rpb24gRi4xLjIuMSAqLwotICAKKwogICB0ZW1wID0gdGVtcDIgPSBibG9ja1swXSAtIGxhc3RfZGNfdmFsOwogCiAgIGlmICh0ZW1wIDwgMCkgewpAQCAtMzY3LDcgKzkyMCw3IEBACiAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCiAgICAgdGVtcDItLTsKICAgfQotICAKKwogICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCiAgIG5iaXRzID0gMDsKICAgd2hpbGUgKHRlbXApIHsKQEAgLTM3OSwyOCArOTMyLDI4IEBACiAgICAqLwogICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCiAgICAgRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLSAgCisKICAgLyogRW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLwotICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGRjdGJsLT5laHVmY29bbmJpdHNdLCBkY3RibC0+ZWh1ZnNpW25iaXRzXSkpCisgIGlmICghIGVtaXRfYml0c19zKHN0YXRlLCBkY3RibC0+ZWh1ZmNvW25iaXRzXSwgZGN0YmwtPmVodWZzaVtuYml0c10pKQogICAgIHJldHVybiBGQUxTRTsKIAogICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCiAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLwotICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKKyAgICBpZiAoISBlbWl0X2JpdHNfcyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKICAgICAgIHJldHVybiBGQUxTRTsKIAogICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBGLjEuMi4yICovCi0gIAorCiAgIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gIAorCiAgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CiAgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgewogICAgICAgcisrOwogICAgIH0gZWxzZSB7CiAgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCiAgICAgICB3aGlsZSAociA+IDE1KSB7Ci0JaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzB4RjBdLCBhY3RibC0+ZWh1ZnNpWzB4RjBdKSkKKwlpZiAoISBlbWl0X2JpdHNfcyhzdGF0ZSwgYWN0YmwtPmVodWZjb1sweEYwXSwgYWN0YmwtPmVodWZzaVsweEYwXSkpCiAJICByZXR1cm4gRkFMU0U7CiAJciAtPSAxNjsKICAgICAgIH0KQEAgLTQxMSw3ICs5NjQsNyBAQAogCS8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLwogCXRlbXAyLS07CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwogICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KICAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCkBAIC00MTksMjQgKzk3MiwyNCBAQAogICAgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KICAgICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCiAJRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLSAgICAgIAorCiAgICAgICAvKiBFbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KICAgICAgIGkgPSAociA8PCA0KSArIG5iaXRzOwotICAgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvW2ldLCBhY3RibC0+ZWh1ZnNpW2ldKSkKKyAgICAgIGlmICghIGVtaXRfYml0c19zKHN0YXRlLCBhY3RibC0+ZWh1ZmNvW2ldLCBhY3RibC0+ZWh1ZnNpW2ldKSkKIAlyZXR1cm4gRkFMU0U7CiAKICAgICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLwogICAgICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCi0gICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisgICAgICBpZiAoISBlbWl0X2JpdHNfcyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKIAlyZXR1cm4gRkFMU0U7Ci0gICAgICAKKwogICAgICAgciA9IDA7CiAgICAgfQogICB9CiAKICAgLyogSWYgdGhlIGxhc3QgY29lZihzKSB3ZXJlIHplcm8sIGVtaXQgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KICAgaWYgKHIgPiAwKQotICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgYWN0YmwtPmVodWZjb1swXSwgYWN0YmwtPmVodWZzaVswXSkpCisgICAgaWYgKCEgZW1pdF9iaXRzX3Moc3RhdGUsIGFjdGJsLT5laHVmY29bMF0sIGFjdGJsLT5laHVmc2lbMF0pKQogICAgICAgcmV0dXJuIEZBTFNFOwogCiAgIHJldHVybiBUUlVFOwpAQCAtNDQ0LDMxICs5OTcsNiBAQAogCiAKIC8qCi0gKiBFbWl0IGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIHByZWRpY3Rpb25zLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1lbWl0X3Jlc3RhcnQgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgaW50IHJlc3RhcnRfbnVtKQotewotICBpbnQgY2k7Ci0KLSAgaWYgKCEgZmx1c2hfYml0cyhzdGF0ZSkpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIGVtaXRfYnl0ZShzdGF0ZSwgMHhGRiwgcmV0dXJuIEZBTFNFKTsKLSAgZW1pdF9ieXRlKHN0YXRlLCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSwgcmV0dXJuIEZBTFNFKTsKLQotICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgc3RhdGUtPmNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotICAgIHN0YXRlLT5jdXIubGFzdF9kY192YWxbY2ldID0gMDsKLQotICAvKiBUaGUgcmVzdGFydCBjb3VudGVyIGlzIG5vdCB1cGRhdGVkIHVudGlsIHdlIHN1Y2Nlc3NmdWxseSB3cml0ZSB0aGUgTUNVLiAqLwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCiAgKiBFbmNvZGUgYW5kIG91dHB1dCBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KICAqLwogCkBAIC00ODksNyArMTAxNyw3IEBACiAgIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCiAgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewogICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgZW1pdF9yZXN0YXJ0KCZzdGF0ZSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSkpCisgICAgICBpZiAoISBlbWl0X3Jlc3RhcnRfcygmc3RhdGUsIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pKQogCXJldHVybiBGQUxTRTsKICAgfQogCkBAIC01MzUsMjAgKzEwNjMsMzIgQEAKICAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwogICB3b3JraW5nX3N0YXRlIHN0YXRlOwogCi0gIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAuLi4gZmx1c2hfYml0cyBuZWVkcyBpdCAqLwotICBzdGF0ZS5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIHN0YXRlLmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotICBBU1NJR05fU1RBVEUoc3RhdGUuY3VyLCBlbnRyb3B5LT5zYXZlZCk7Ci0gIHN0YXRlLmNpbmZvID0gY2luZm87CisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworICAgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKIAotICAvKiBGbHVzaCBvdXQgdGhlIGxhc3QgZGF0YSAqLwotICBpZiAoISBmbHVzaF9iaXRzKCZzdGF0ZSkpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworICAgIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLworICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgIGZsdXNoX2JpdHNfZShlbnRyb3B5KTsKIAotICAvKiBVcGRhdGUgc3RhdGUgKi8KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBzdGF0ZS5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBzdGF0ZS5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZS5jdXIpOworICAgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKyAgfSBlbHNlIHsKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgLi4uIGZsdXNoX2JpdHMgbmVlZHMgaXQgKi8KKyAgICBzdGF0ZS5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgICAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgICAgQVNTSUdOX1NUQVRFKHN0YXRlLmN1ciwgZW50cm9weS0+c2F2ZWQpOworICAgIHN0YXRlLmNpbmZvID0gY2luZm87CisKKyAgICAvKiBGbHVzaCBvdXQgdGhlIGxhc3QgZGF0YSAqLworICAgIGlmICghIGZsdXNoX2JpdHNfcygmc3RhdGUpKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworCisgICAgLyogVXBkYXRlIHN0YXRlICovCisgICAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBzdGF0ZS5uZXh0X291dHB1dF9ieXRlOworICAgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IHN0YXRlLmZyZWVfaW5fYnVmZmVyOworICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKKyAgfQogfQogCiAKQEAgLTU2Myw4ICsxMTAzLDYgQEAKICAqIHRoZSBjb21wcmVzc2VkIGRhdGEuCiAgKi8KIAotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotCiAKIC8qIFByb2Nlc3MgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KIApAQCAtNjc1LDcgKzEyMTMsNiBAQAogCiAvKgogICogR2VuZXJhdGUgdGhlIGJlc3QgSHVmZm1hbiBjb2RlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gY291bnRzLCBmaWxsIGh0YmwuCi0gKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpjcGh1ZmYuYy4KICAqCiAgKiBUaGUgSlBFRyBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IG5vIHN5bWJvbCBiZSBhc3NpZ25lZCBhIGNvZGV3b3JkIG9mIGFsbAogICogb25lIGJpdHMgKHNvIHRoYXQgcGFkZGluZyBiaXRzIGFkZGVkIGF0IHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHNlZ21lbnQKQEAgLTcwMSw3ICsxMjM4LDcgQEAKICAqIFNvIHRoZSBleHRyYSBjb21wbGV4aXR5IG9mIGFuIG9wdGltYWwgYWxnb3JpdGhtIGRvZXNuJ3Qgc2VlbSB3b3J0aHdoaWxlLgogICovCiAKLUdMT0JBTCh2b2lkKQorTE9DQUwodm9pZCkKIGpwZWdfZ2VuX29wdGltYWxfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkKIHsKICNkZWZpbmUgTUFYX0NMRU4gMzIJCS8qIGFzc3VtZWQgbWF4aW11bSBpbml0aWFsIGNvZGUgbGVuZ3RoICovCkBAIC04NDYsNDEgKzEzODMsMjAwIEBACiBmaW5pc2hfcGFzc19nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQogewogICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaSwgZGN0YmwsIGFjdGJsOworICBpbnQgY2ksIGRjdGJsLCBhY3RibCwgdGJsOwogICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKICAgSkhVRkZfVEJMICoqaHRibHB0cjsKICAgYm9vbGVhbiBkaWRfZGNbTlVNX0hVRkZfVEJMU107CiAgIGJvb2xlYW4gZGlkX2FjW05VTV9IVUZGX1RCTFNdOworICBib29sZWFuIGRpZFtOVU1fSFVGRl9UQkxTXTsKIAogICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQogICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCiAgICAqLwotICBNRU1aRVJPKGRpZF9kYywgU0laRU9GKGRpZF9kYykpOwotICBNRU1aRVJPKGRpZF9hYywgU0laRU9GKGRpZF9hYykpOworICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyAgICAvKiBGbHVzaCBvdXQgYnVmZmVyZWQgZGF0YSAoYWxsIHdlIGNhcmUgYWJvdXQgaXMgY291bnRpbmcgdGhlIEVPQiBzeW1ib2wpICovCisgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CiAKLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIGlmICghIGRpZF9kY1tkY3RibF0pIHsKLSAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2RjdGJsXTsKLSAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQotCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSk7Ci0gICAgICBkaWRfZGNbZGN0YmxdID0gVFJVRTsKKyAgICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOworCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICBpZiAoY2luZm8tPlNzID09IDApIHsKKwlpZiAoY2luZm8tPkFoICE9IDApCS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KKwkgIGNvbnRpbnVlOworCXRibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICAgIH0gZWxzZSB7CisJdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgICAgfQorICAgICAgaWYgKCEgZGlkW3RibF0pIHsKKwlpZiAoY2luZm8tPlNzID09IDApCisJICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOworCWVsc2UKKwkgIGh0YmxwdHIgPSAmIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibF07CisJaWYgKCpodGJscHRyID09IE5VTEwpCisJICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisJanBlZ19nZW5fb3B0aW1hbF90YWJsZShjaW5mbywgKmh0YmxwdHIsIGVudHJvcHktPmNvdW50X3B0cnNbdGJsXSk7CisJZGlkW3RibF0gPSBUUlVFOworICAgICAgfQogICAgIH0KLSAgICBpZiAoISBkaWRfYWNbYWN0YmxdKSB7Ci0gICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1thY3RibF07Ci0gICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLQkqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0pOwotICAgICAgZGlkX2FjW2FjdGJsXSA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgTUVNWkVSTyhkaWRfZGMsIFNJWkVPRihkaWRfZGMpKTsKKyAgICBNRU1aRVJPKGRpZF9hYywgU0laRU9GKGRpZF9hYykpOworCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgICAgaWYgKCEgZGlkX2RjW2RjdGJsXSkgeworCWh0YmxwdHIgPSAmIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2RjdGJsXTsKKwlpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKwkgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKwlqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0pOworCWRpZF9kY1tkY3RibF0gPSBUUlVFOworICAgICAgfQorICAgICAgaWYgKCEgZGlkX2FjW2FjdGJsXSkgeworCWh0YmxwdHIgPSAmIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2FjdGJsXTsKKwlpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKwkgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKwlqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0pOworCWRpZF9hY1thY3RibF0gPSBUUlVFOworICAgICAgfQogICAgIH0KICAgfQogfQogCiAKLSNlbmRpZiAvKiBFTlRST1BZX09QVF9TVVBQT1JURUQgKi8KKy8qCisgKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgorICogSWYgZ2F0aGVyX3N0YXRpc3RpY3MgaXMgVFJVRSwgd2UgZG8gbm90IG91dHB1dCBhbnl0aGluZyBkdXJpbmcgdGhlIHNjYW4sCisgKiBqdXN0IGNvdW50IHRoZSBIdWZmbWFuIHN5bWJvbHMgdXNlZCBhbmQgZ2VuZXJhdGUgSHVmZm1hbiBjb2RlIHRhYmxlcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGNpLCBkY3RibCwgYWN0YmwsIHRibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaWYgKGdhdGhlcl9zdGF0aXN0aWNzKQorICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2dhdGhlcjsKKyAgZWxzZQorICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2h1ZmY7CisKKyAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgZW50cm9weS0+Y2luZm8gPSBjaW5mbzsKKyAgICBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9IGdhdGhlcl9zdGF0aXN0aWNzOworCisgICAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KKworICAgIC8qIFNlbGVjdCBleGVjdXRpb24gcm91dGluZSAqLworICAgIGlmIChjaW5mby0+QWggPT0gMCkgeworICAgICAgaWYgKGNpbmZvLT5TcyA9PSAwKQorCWVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19maXJzdDsKKyAgICAgIGVsc2UKKwllbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfZmlyc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjaW5mby0+U3MgPT0gMCkKKwllbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfRENfcmVmaW5lOworICAgICAgZWxzZSB7CisJZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0FDX3JlZmluZTsKKwkvKiBBQyByZWZpbmVtZW50IG5lZWRzIGEgY29ycmVjdGlvbiBiaXQgYnVmZmVyICovCisJaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKKwkgIGVudHJvcHktPmJpdF9idWZmZXIgPSAoY2hhciAqKQorCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCQlNQVhfQ09SUl9CSVRTICogU0laRU9GKGNoYXIpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQorICAgICAqIGZvciBBQyBjb2VmZmljaWVudHMuCisgICAgICovCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgICAvKiBHZXQgdGFibGUgaW5kZXggKi8KKyAgICAgIGlmIChjaW5mby0+U3MgPT0gMCkgeworCWlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLworCSAgY29udGludWU7CisJdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgICAgfSBlbHNlIHsKKwllbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgICB9CisgICAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKwkvKiBDaGVjayBmb3IgaW52YWxpZCB0YWJsZSBpbmRleCAqLworCS8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworCWlmICh0YmwgPCAwIHx8IHRibCA+PSBOVU1fSFVGRl9UQkxTKQorCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsKTsKKwkvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKwkvKiBOb3RlIHRoYXQganBlZ19nZW5fb3B0aW1hbF90YWJsZSBleHBlY3RzIDI1NyBlbnRyaWVzIGluIGVhY2ggdGFibGUhICovCisJaWYgKGVudHJvcHktPmNvdW50X3B0cnNbdGJsXSA9PSBOVUxMKQorCSAgZW50cm9weS0+Y291bnRfcHRyc1t0YmxdID0gKGxvbmcgKikKKwkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkJMjU3ICogU0laRU9GKGxvbmcpKTsKKwlNRU1aRVJPKGVudHJvcHktPmNvdW50X3B0cnNbdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKKyAgICAgIH0gZWxzZSB7CisJLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZSAqLworCS8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisJanBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIGNpbmZvLT5TcyA9PSAwLCB0YmwsCisJCQkJJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLworICAgIGVudHJvcHktPkVPQlJVTiA9IDA7CisgICAgZW50cm9weS0+QkUgPSAwOworICB9IGVsc2UgeworICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9nYXRoZXI7CisgICAgZWxzZQorICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2h1ZmY7CisKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgICAgYWN0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKwkvKiBDaGVjayBmb3IgaW52YWxpZCB0YWJsZSBpbmRleGVzICovCisJLyogKG1ha2VfY19kZXJpdmVkX3RibCBkb2VzIHRoaXMgaW4gdGhlIG90aGVyIHBhdGgpICovCisJaWYgKGRjdGJsIDwgMCB8fCBkY3RibCA+PSBOVU1fSFVGRl9UQkxTKQorCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgZGN0YmwpOworCWlmIChhY3RibCA8IDAgfHwgYWN0YmwgPj0gTlVNX0hVRkZfVEJMUykKKwkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGFjdGJsKTsKKwkvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKwkvKiBOb3RlIHRoYXQganBlZ19nZW5fb3B0aW1hbF90YWJsZSBleHBlY3RzIDI1NyBlbnRyaWVzIGluIGVhY2ggdGFibGUhICovCisJaWYgKGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID09IE5VTEwpCisJICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9IChsb25nICopCisJICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJCTI1NyAqIFNJWkVPRihsb25nKSk7CisJTUVNWkVSTyhlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKKwlpZiAoZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPT0gTlVMTCkKKwkgIGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdID0gKGxvbmcgKikKKwkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkJMjU3ICogU0laRU9GKGxvbmcpKTsKKwlNRU1aRVJPKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgfSBlbHNlIHsKKwkvKiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGZvciBIdWZmbWFuIHRhYmxlcyAqLworCS8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisJanBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAorCQkJCSYgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2RjdGJsXSk7CisJanBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBhY3RibCwKKwkJCQkmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOworICAgICAgfQorICAgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICAgIH0KKyAgfQorCisgIC8qIEluaXRpYWxpemUgYml0IGJ1ZmZlciB0byBlbXB0eSAqLworICBlbnRyb3B5LT5zYXZlZC5wdXRfYnVmZmVyID0gMDsKKyAgZW50cm9weS0+c2F2ZWQucHV0X2JpdHMgPSAwOworCisgIC8qIEluaXRpYWxpemUgcmVzdGFydCBzdHVmZiAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKK30KIAogCiAvKgpAQCAtODk5LDExICsxNTk1LDE4IEBACiAgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OwogICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfaHVmZjsKIAotICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2ldID0gZW50cm9weS0+YWNfY291bnRfcHRyc1tpXSA9IE5VTEw7Ci0jZW5kaWYKKyAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgICBlbnRyb3B5LT5kZXJpdmVkX3RibHNbaV0gPSBOVUxMOworICAgICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7CisgICAgfQorICAgIGVudHJvcHktPmJpdF9idWZmZXIgPSBOVUxMOwkvKiBuZWVkZWQgb25seSBpbiBBQyByZWZpbmVtZW50IHNjYW4gKi8KKyAgfSBlbHNlIHsKKyAgICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tpXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgICAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2ldID0gZW50cm9weS0+YWNfY291bnRfcHRyc1tpXSA9IE5VTEw7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9qY2h1ZmYuaCBiL2pjaHVmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU5OWZjLi4wMDAwMDAwCi0tLSBhL2pjaHVmZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIGpjaHVmZi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMKLSAqIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBzZXF1ZW50aWFsIGVuY29kZXIgKGpjaHVmZi5jKSBhbmQgdGhlCi0gKiBwcm9ncmVzc2l2ZSBlbmNvZGVyIChqY3BodWZmLmMpLiAgTm8gb3RoZXIgbW9kdWxlcyBuZWVkIHRvIHNlZSB0aGVzZS4KLSAqLwotCi0vKiBUaGUgbGVnYWwgcmFuZ2Ugb2YgYSBEQ1QgY29lZmZpY2llbnQgaXMKLSAqICAtMTAyNCAuLiArMTAyMyAgZm9yIDgtYml0IGRhdGE7Ci0gKiAtMTYzODQgLi4gKzE2MzgzIGZvciAxMi1iaXQgZGF0YS4KLSAqIEhlbmNlIHRoZSBtYWduaXR1ZGUgc2hvdWxkIGFsd2F5cyBmaXQgaW4gMTAgb3IgMTQgYml0cyByZXNwZWN0aXZlbHkuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTAKLSNlbHNlCi0jZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTQKLSNlbmRpZgotCi0vKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBlaHVmY29bMjU2XTsJLyogY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KLSAgY2hhciBlaHVmc2lbMjU2XTsJCS8qIGxlbmd0aCBvZiBjb2RlIGZvciBlYWNoIHN5bWJvbCAqLwotICAvKiBJZiBubyBjb2RlIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgYSBzeW1ib2wgUywgZWh1ZnNpW1NdIGNvbnRhaW5zIDAgKi8KLX0gY19kZXJpdmVkX3RibDsKLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCWpNa0NEZXJpdmVkCi0jZGVmaW5lIGpwZWdfZ2VuX29wdGltYWxfdGFibGUJakdlbk9wdFRibAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotLyogRXhwYW5kIGEgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIGludG8gdGhlIGRlcml2ZWQgZm9ybWF0ICovCi1FWFRFUk4odm9pZCkganBlZ19tYWtlX2NfZGVyaXZlZF90YmwKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkgICAgIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpKTsKLQotLyogR2VuZXJhdGUgYW4gb3B0aW1hbCB0YWJsZSBkZWZpbml0aW9uIGdpdmVuIHRoZSBzcGVjaWZpZWQgY291bnRzICovCi1FWFRFUk4odm9pZCkganBlZ19nZW5fb3B0aW1hbF90YWJsZQotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpIVUZGX1RCTCAqIGh0YmwsIGxvbmcgZnJlcVtdKSk7CmRpZmYgLS1naXQgYS9qY2luaXQuYyBiL2pjaW5pdC5jCmluZGV4IGEwZjNlNGYuLjBiYTMxMGYgMTAwNjQ0Ci0tLSBhL2pjaW5pdC5jCisrKyBiL2pjaW5pdC5jCkBAIC00NCwxNCArNDQsNyBAQAogICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpCiAgICAgamluaXRfYXJpdGhfZW5jb2RlcihjaW5mbyk7CiAgIGVsc2UgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICBqaW5pdF9waHVmZl9lbmNvZGVyKGNpbmZvKTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UKLSAgICAgIGppbml0X2h1ZmZfZW5jb2RlcihjaW5mbyk7CisgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKICAgfQogCiAgIC8qIE5lZWQgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciBpbiBhbnkgbXVsdGktcGFzcyBtb2RlLiAqLwpkaWZmIC0tZ2l0IGEvamNtYWluY3QuYyBiL2pjbWFpbmN0LmMKaW5kZXggZTAyNzlhNy4uN2RlNzVkMSAxMDA2NDQKLS0tIGEvamNtYWluY3QuYworKysgYi9qY21haW5jdC5jCkBAIC0xMTgsMTcgKzExOCwxNyBAQAogCiAgIHdoaWxlIChtYWluLT5jdXJfaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CiAgICAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgKEpESU1FTlNJT04pIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUpCiAgICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCiAJCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKIAkJCQkJbWFpbi0+YnVmZmVyLCAmbWFpbi0+cm93Z3JvdXBfY3RyLAotCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7CisJCQkJCShKRElNRU5TSU9OKSBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplKTsKIAogICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBmdWxsIGlNQ1Ugcm93IGJ1ZmZlcmVkLCByZXR1cm4gdG8gYXBwbGljYXRpb24gZm9yCiAgICAgICogbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHByZXByb2Nlc3NvciB3aWxsIGFsd2F5cyBwYWQgdG8gZmlsbCB0aGUgaU1DVSByb3cKICAgICAgKiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4KICAgICAgKi8KLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyICE9IERDVFNJWkUpCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciAhPSAoSkRJTUVOU0lPTikgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSkKICAgICAgIHJldHVybjsKIAogICAgIC8qIFNlbmQgdGhlIGNvbXBsZXRlZCByb3cgdG8gdGhlIGNvbXByZXNzb3IgKi8KQEAgLTI2OSwxMCArMjY5LDEwIEBACiAJIGNpKyssIGNvbXBwdHIrKykgewogICAgICAgbWFpbi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQogCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAorCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSwKIAkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKIAkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgKiBEQ1RTSVpFLAotCSAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisJIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplKSk7CiAgICAgfQogI2Vsc2UKICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CkBAIC0yODYsOCArMjg2LDggQEAKIAkgY2krKywgY29tcHB0cisrKSB7CiAgICAgICBtYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCiAJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSwKLQkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSwKKwkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUpKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2pjbWFya2VyLmMgYi9qY21hcmtlci5jCmluZGV4IDJkN2JkYzMuLjU0ZDEwOWEgMTAwNjQ0Ci0tLSBhL2pjbWFya2VyLmMKKysrIGIvamNtYXJrZXIuYwpAQCAtMjg1LDEzICsyODUsMTMgQEAKICAgZW1pdF8yYnl0ZXMoY2luZm8sIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHMgKyAyICsgNSArIDEpOyAvKiBsZW5ndGggKi8KIAogICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gU09GIGZpZWxkIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gNjU1MzVMIHx8Ci0gICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gNjU1MzVMKQorICBpZiAoKGxvbmcpIGNpbmZvLT5qcGVnX2hlaWdodCA+IDY1NTM1TCB8fAorICAgICAgKGxvbmcpIGNpbmZvLT5qcGVnX3dpZHRoID4gNjU1MzVMKQogICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIDY1NTM1KTsKIAogICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7Ci0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCk7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+anBlZ19oZWlnaHQpOworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPmpwZWdfd2lkdGgpOwogCiAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPm51bV9jb21wb25lbnRzKTsKIApkaWZmIC0tZ2l0IGEvamNtYXN0ZXIuYyBiL2pjbWFzdGVyLmMKaW5kZXggMzY2ZjdjMC4uZGIzZTYxYSAxMDA2NDQKLS0tIGEvamNtYXN0ZXIuYworKysgYi9qY21hc3Rlci5jCkBAIC0yLDYgKzIsNyBAQAogICogamNtYXN0ZXIuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIE1vZGlmaWVkIDIwMDMtMjAwOSBieSBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC00MiwyMyArNDMsMTcyIEBACiAgKiBTdXBwb3J0IHJvdXRpbmVzIHRoYXQgZG8gdmFyaW91cyBlc3NlbnRpYWwgY2FsY3VsYXRpb25zLgogICovCiAKKy8qCisgKiBDb21wdXRlIEpQRUcgaW1hZ2UgZGltZW5zaW9ucyBhbmQgcmVsYXRlZCB2YWx1ZXMuCisgKiBOT1RFOiB0aGlzIGlzIGV4cG9ydGVkIGZvciBwb3NzaWJsZSB1c2UgYnkgYXBwbGljYXRpb24uCisgKiBIZW5jZSBpdCBtdXN0bid0IGRvIGFueXRoaW5nIHRoYXQgY2FuJ3QgYmUgZG9uZSB0d2ljZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY2FsY19qcGVnX2RpbWVuc2lvbnMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgbWFzdGVyIHNlbGVjdGlvbiBwaGFzZSAqLworeworI2lmZGVmIERDVF9TQ0FMSU5HX1NVUFBPUlRFRAorCisgIC8qIENvbXB1dGUgYWN0dWFsIEpQRUcgaW1hZ2UgZGltZW5zaW9ucyBhbmQgRENUIHNjYWxpbmcgY2hvaWNlcy4gKi8KKyAgaWYgKGNpbmZvLT5zY2FsZV9udW0gPj0gY2luZm8tPnNjYWxlX2Rlbm9tICogOCkgeworICAgIC8qIFByb3ZpZGUgOC8xIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aCA8PCAzOworICAgIGNpbmZvLT5qcGVnX2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgPDwgMzsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMTsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gMTsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtID49IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDQpIHsKKyAgICAvKiBQcm92aWRlIDQvMSBzY2FsaW5nICovCisgICAgY2luZm8tPmpwZWdfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGggPDwgMjsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0IDw8IDI7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDI7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDI7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDMgPj0gY2luZm8tPnNjYWxlX2Rlbm9tICogOCkgeworICAgIC8qIFByb3ZpZGUgOC8zIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IChjaW5mby0+aW1hZ2Vfd2lkdGggPDwgMSkgKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIDIsIDNMKTsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSAoY2luZm8tPmltYWdlX2hlaWdodCA8PCAxKSArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDIsIDNMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMzsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gMzsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtID49IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDIpIHsKKyAgICAvKiBQcm92aWRlIDIvMSBzY2FsaW5nICovCisgICAgY2luZm8tPmpwZWdfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGggPDwgMTsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0IDw8IDE7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDQ7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDQ7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDUgPj0gY2luZm8tPnNjYWxlX2Rlbm9tICogOCkgeworICAgIC8qIFByb3ZpZGUgOC81IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogMywgNUwpOworICAgIGNpbmZvLT5qcGVnX2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAzLCA1TCk7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDU7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDU7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDMgPj0gY2luZm8tPnNjYWxlX2Rlbm9tICogNCkgeworICAgIC8qIFByb3ZpZGUgNC8zIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCAzTCk7CisgICAgY2luZm8tPmpwZWdfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgM0wpOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSA2OworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSA2OworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA3ID49IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDgpIHsKKyAgICAvKiBQcm92aWRlIDgvNyBzY2FsaW5nICovCisgICAgY2luZm8tPmpwZWdfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGggKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgN0wpOworICAgIGNpbmZvLT5qcGVnX2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDdMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gNzsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gNzsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtID49IGNpbmZvLT5zY2FsZV9kZW5vbSkgeworICAgIC8qIFByb3ZpZGUgMS8xIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA5ID49IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDgpIHsKKyAgICAvKiBQcm92aWRlIDgvOSBzY2FsaW5nICovCisgICAgY2luZm8tPmpwZWdfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIDgsIDlMKTsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiA4LCA5TCk7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDk7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDk7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDUgPj0gY2luZm8tPnNjYWxlX2Rlbm9tICogNCkgeworICAgIC8qIFByb3ZpZGUgNC81IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogNCwgNUwpOworICAgIGNpbmZvLT5qcGVnX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDQsIDVMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMTA7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDEwOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiAxMSA+PSBjaW5mby0+c2NhbGVfZGVub20gKiA4KSB7CisgICAgLyogUHJvdmlkZSA4LzExIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogOCwgMTFMKTsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiA4LCAxMUwpOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSAxMTsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gMTE7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDMgPj0gY2luZm8tPnNjYWxlX2Rlbm9tICogMikgeworICAgIC8qIFByb3ZpZGUgMi8zIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogMiwgM0wpOworICAgIGNpbmZvLT5qcGVnX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDIsIDNMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMTI7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDEyOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiAxMyA+PSBjaW5mby0+c2NhbGVfZGVub20gKiA4KSB7CisgICAgLyogUHJvdmlkZSA4LzEzIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogOCwgMTNMKTsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiA4LCAxM0wpOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSAxMzsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gMTM7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDcgPj0gY2luZm8tPnNjYWxlX2Rlbm9tICogNCkgeworICAgIC8qIFByb3ZpZGUgNC83IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogNCwgN0wpOworICAgIGNpbmZvLT5qcGVnX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDQsIDdMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMTQ7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDE0OworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiAxNSA+PSBjaW5mby0+c2NhbGVfZGVub20gKiA4KSB7CisgICAgLyogUHJvdmlkZSA4LzE1IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+anBlZ193aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogOCwgMTVMKTsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiA4LCAxNUwpOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSAxNTsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gMTU7CisgIH0gZWxzZSB7CisgICAgLyogUHJvdmlkZSAxLzIgc2NhbGluZyAqLworICAgIGNpbmZvLT5qcGVnX3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDJMKTsKKyAgICBjaW5mby0+anBlZ19oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDJMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMTY7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDE2OworICB9CisKKyNlbHNlIC8qICFEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KKworICAvKiBIYXJkd2lyZSBpdCB0byAibm8gc2NhbGluZyIgKi8KKyAgY2luZm8tPmpwZWdfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisgIGNpbmZvLT5qcGVnX2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gRENUU0laRTsKKworI2VuZGlmIC8qIERDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLworfQorCisKIExPQ0FMKHZvaWQpCiBpbml0aWFsX3NldHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKIC8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIG1hc3RlciBzZWxlY3Rpb24gcGhhc2UgKi8KIHsKLSAgaW50IGNpOworICBpbnQgY2ksIHNzaXplOwogICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwogICBsb25nIHNhbXBsZXNwZXJyb3c7CiAgIEpESU1FTlNJT04gamRfc2FtcGxlc3BlcnJvdzsKIAorICBqcGVnX2NhbGNfanBlZ19kaW1lbnNpb25zKGNpbmZvKTsKKwogICAvKiBTYW5pdHkgY2hlY2sgb24gaW1hZ2UgZGltZW5zaW9ucyAqLwotICBpZiAoY2luZm8tPmltYWdlX2hlaWdodCA8PSAwIHx8IGNpbmZvLT5pbWFnZV93aWR0aCA8PSAwCisgIGlmIChjaW5mby0+anBlZ19oZWlnaHQgPD0gMCB8fCBjaW5mby0+anBlZ193aWR0aCA8PSAwCiAgICAgICB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPD0gMCB8fCBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA8PSAwKQogICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1QVFlfSU1BR0UpOwogCiAgIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAotICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCisgIGlmICgobG9uZykgY2luZm8tPmpwZWdfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAorICAgICAgKGxvbmcpIGNpbmZvLT5qcGVnX3dpZHRoID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTikKICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSBKUEVHX01BWF9ESU1FTlNJT04pOwogCiAgIC8qIFdpZHRoIG9mIGFuIGlucHV0IHNjYW5saW5lIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBKRElNRU5TSU9OLiAqLwpAQCAtOTUsMjIgKzI0NSw1MiBAQAogICAgICAgIGNpKyssIGNvbXBwdHIrKykgewogICAgIC8qIEZpbGwgaW4gdGhlIGNvcnJlY3QgY29tcG9uZW50X2luZGV4IHZhbHVlOyBkb24ndCByZWx5IG9uIGFwcGxpY2F0aW9uICovCiAgICAgY29tcHB0ci0+Y29tcG9uZW50X2luZGV4ID0gY2k7Ci0gICAgLyogRm9yIGNvbXByZXNzaW9uLCB3ZSBuZXZlciBkbyBEQ1Qgc2NhbGluZy4gKi8KLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICAgIC8qIEluIHNlbGVjdGluZyB0aGUgYWN0dWFsIERDVCBzY2FsaW5nIGZvciBlYWNoIGNvbXBvbmVudCwgd2UgdHJ5IHRvCisgICAgICogc2NhbGUgZG93biB0aGUgY2hyb21hIGNvbXBvbmVudHMgdmlhIERDVCBzY2FsaW5nIHJhdGhlciB0aGFuIGRvd25zYW1wbGluZy4KKyAgICAgKiBUaGlzIHNhdmVzIHRpbWUgaWYgdGhlIGRvd25zYW1wbGVyIGdldHMgdG8gdXNlIDE6MSBzY2FsaW5nLgorICAgICAqIE5vdGUgdGhpcyBjb2RlIGFkYXB0cyBzdWJzYW1wbGluZyByYXRpb3Mgd2hpY2ggYXJlIHBvd2VycyBvZiAyLgorICAgICAqLworICAgIHNzaXplID0gMTsKKyNpZmRlZiBEQ1RfU0NBTElOR19TVVBQT1JURUQKKyAgICB3aGlsZSAoY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSAqIHNzaXplIDw9CisJICAgKGNpbmZvLT5kb19mYW5jeV9kb3duc2FtcGxpbmcgPyBEQ1RTSVpFIDogRENUU0laRSAvIDIpICYmCisJICAgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAlIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogc3NpemUgKiAyKSkgPT0gMCkgeworICAgICAgc3NpemUgPSBzc2l6ZSAqIDI7CisgICAgfQorI2VuZGlmCisgICAgY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemUgPSBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplICogc3NpemU7CisgICAgc3NpemUgPSAxOworI2lmZGVmIERDVF9TQ0FMSU5HX1NVUFBPUlRFRAorICAgIHdoaWxlIChjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplICogc3NpemUgPD0KKwkgICAoY2luZm8tPmRvX2ZhbmN5X2Rvd25zYW1wbGluZyA/IERDVFNJWkUgOiBEQ1RTSVpFIC8gMikgJiYKKwkgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIpKSA9PSAwKSB7CisgICAgICBzc2l6ZSA9IHNzaXplICogMjsKKyAgICB9CisjZW5kaWYKKyAgICBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSA9IGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgKiBzc2l6ZTsKKworICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgRENUIHJhdGlvcyBsYXJnZXIgdGhhbiAyLiAqLworICAgIGlmIChjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSA+IGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplICogMikKKwljb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSA9IGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplICogMjsKKyAgICBlbHNlIGlmIChjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSA+IGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplICogMikKKwljb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSA9IGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplICogMjsKKwogICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLwogICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+anBlZ193aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAogCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CiAgICAgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmpwZWdfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCiAJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKICAgICAvKiBTaXplIGluIHNhbXBsZXMgKi8KICAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKTsKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5qcGVnX3dpZHRoICoKKwkJICAgIChsb25nKSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplKSwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOwogICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+anBlZ19oZWlnaHQgKgorCQkgICAgKGxvbmcpIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUpLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CiAgICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkICh0aGlzIGZsYWcgaXNuJ3QgYWN0dWFsbHkgdXNlZCBmb3IgY29tcHJlc3Npb24pICovCiAgICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7CiAgIH0KQEAgLTExOSw3ICsyOTksNyBAQAogICAgKiBtYWluIGNvbnRyb2xsZXIgd2lsbCBjYWxsIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIpLgogICAgKi8KICAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyA9IChKRElNRU5TSU9OKQotICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmpwZWdfaGVpZ2h0LAogCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKIH0KIApAQCAtMzI1LDcgKzUwNSw3IEBACiAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gMTsKICAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gMTsKICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gMTsKLSAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gRENUU0laRTsKKyAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemU7CiAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOwogICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0CiAgICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCkBAIC0zNDcsMTAgKzUyNywxMCBAQAogICAgIAogICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCiAgICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLAorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmpwZWdfd2lkdGgsCiAJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CiAgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+anBlZ19oZWlnaHQsCiAJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CiAgICAgCiAgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOwpAQCAtMzYxLDcgKzU0MSw3IEBACiAgICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwogICAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CiAgICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+TUNVX2hlaWdodDsKLSAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBEQ1RTSVpFOworICAgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplOwogICAgICAgLyogRmlndXJlIG51bWJlciBvZiBub24tZHVtbXkgYmxvY2tzIGluIGxhc3QgTUNVIGNvbHVtbiAmIHJvdyAqLwogICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV93aWR0aCk7CiAgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV93aWR0aDsKZGlmZiAtLWdpdCBhL2pjb25maWcuYmNjIGIvamNvbmZpZy5iY2MKaW5kZXggYzZjNTNmZi4uZTRkYTNkNyAxMDA2NDQKLS0tIGEvamNvbmZpZy5iY2MKKysrIGIvamNvbmZpZy5iY2MKQEAgLTEsNSArMSw1IEBACiAvKiBqY29uZmlnLmJjYyAtLS0gamNvbmZpZy5oIGZvciBCb3JsYW5kIEMgKFR1cmJvIEMpIG9uIE1TLURPUyBvciBPUy8yLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKy8qIHNlZSBqY29uZmlnLnR4dCBmb3IgZXhwbGFuYXRpb25zICovCiAKICNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCiAjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgpkaWZmIC0tZ2l0IGEvamNvbmZpZy5jZmcgYi9qY29uZmlnLmNmZwppbmRleCAzNmEwNGZhLi5hMjM3NThhIDEwMDY0NAotLS0gYS9qY29uZmlnLmNmZworKysgYi9qY29uZmlnLmNmZwpAQCAtMSw1ICsxLDUgQEAKIC8qIGpjb25maWcuY2ZnIC0tLSBzb3VyY2UgZmlsZSBlZGl0ZWQgYnkgY29uZmlndXJlIHNjcmlwdCAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKy8qIHNlZSBqY29uZmlnLnR4dCBmb3IgZXhwbGFuYXRpb25zICovCiAKICN1bmRlZiBIQVZFX1BST1RPVFlQRVMKICN1bmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKQEAgLTksNiArOSw3IEBACiAjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAogI3VuZGVmIEhBVkVfU1REREVGX0gKICN1bmRlZiBIQVZFX1NURExJQl9ICisjdW5kZWYgSEFWRV9MT0NBTEVfSAogI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKICN1bmRlZiBORUVEX1NZU19UWVBFU19ICiAjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKZGlmZiAtLWdpdCBhL2pjb25maWcuZGogYi9qY29uZmlnLmRqCmluZGV4IGY3NTlhOWQuLmEwZDQwOTIgMTAwNjQ0Ci0tLSBhL2pjb25maWcuZGoKKysrIGIvamNvbmZpZy5kagpAQCAtMSw1ICsxLDUgQEAKIC8qIGpjb25maWcuZGogLS0tIGpjb25maWcuaCBmb3IgREpHUFAgKERlbG9yaWUncyBHTlUgQyBwb3J0KSBvbiBNUy1ET1MuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworLyogc2VlIGpjb25maWcudHh0IGZvciBleHBsYW5hdGlvbnMgKi8KIAogI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKICNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCmRpZmYgLS1naXQgYS9qY29uZmlnLm1hYyBiL2pjb25maWcubWFjCmluZGV4IDBkZTNlZmUuLjcwZWQ2NmMgMTAwNjQ0Ci0tLSBhL2pjb25maWcubWFjCisrKyBiL2pjb25maWcubWFjCkBAIC0xLDUgKzEsNSBAQAogLyogamNvbmZpZy5tYWMgLS0tIGpjb25maWcuaCBmb3IgQ29kZVdhcnJpb3Igb24gQXBwbGUgTWFjaW50b3NoICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworLyogc2VlIGpjb25maWcudHh0IGZvciBleHBsYW5hdGlvbnMgKi8KIAogI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKICNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCmRpZmYgLS1naXQgYS9qY29uZmlnLm1hbnggYi9qY29uZmlnLm1hbngKaW5kZXggNmRkMGQwMC4uY2Q1MjlkNyAxMDA2NDQKLS0tIGEvamNvbmZpZy5tYW54CisrKyBiL2pjb25maWcubWFueApAQCAtMSw1ICsxLDUgQEAKIC8qIGpjb25maWcubWFueCAtLS0gamNvbmZpZy5oIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIE1hbnggQXp0ZWMgQyB2ZXIgNS54LiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKy8qIHNlZSBqY29uZmlnLnR4dCBmb3IgZXhwbGFuYXRpb25zICovCiAKICNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCiAjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgpkaWZmIC0tZ2l0IGEvamNvbmZpZy5tYzYgYi9qY29uZmlnLm1jNgppbmRleCBjNTUwODJkLi4xYjE4NTIzIDEwMDY0NAotLS0gYS9qY29uZmlnLm1jNgorKysgYi9qY29uZmlnLm1jNgpAQCAtMSw1ICsxLDUgQEAKIC8qIGpjb25maWcubWM2IC0tLSBqY29uZmlnLmggZm9yIE1pY3Jvc29mdCBDIG9uIE1TLURPUywgdmVyc2lvbiA2LjAwQSAmIHVwLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKy8qIHNlZSBqY29uZmlnLnR4dCBmb3IgZXhwbGFuYXRpb25zICovCiAKICNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCiAjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgpkaWZmIC0tZ2l0IGEvamNvbmZpZy5zYXMgYi9qY29uZmlnLnNhcwppbmRleCBlZmRhYzIyLi5iOGExODE5IDEwMDY0NAotLS0gYS9qY29uZmlnLnNhcworKysgYi9qY29uZmlnLnNhcwpAQCAtMSw1ICsxLDUgQEAKIC8qIGpjb25maWcuc2FzIC0tLSBqY29uZmlnLmggZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgU0FTIEMgNi4wIGFuZCB1cC4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisvKiBzZWUgamNvbmZpZy50eHQgZm9yIGV4cGxhbmF0aW9ucyAqLwogCiAjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwogI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKZGlmZiAtLWdpdCBhL2pjb25maWcuc3QgYi9qY29uZmlnLnN0CmluZGV4IDQ0MjFiN2EuLjVhZmEwYjYgMTAwNjQ0Ci0tLSBhL2pjb25maWcuc3QKKysrIGIvamNvbmZpZy5zdApAQCAtMSw1ICsxLDUgQEAKIC8qIGpjb25maWcuc3QgLS0tIGpjb25maWcuaCBmb3IgQXRhcmkgU1QvU1RFL1RUIHVzaW5nIFB1cmUgQyBvciBUdXJibyBDLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKy8qIHNlZSBqY29uZmlnLnR4dCBmb3IgZXhwbGFuYXRpb25zICovCiAKICNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCiAjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgpkaWZmIC0tZ2l0IGEvamNvbmZpZy5kb2MgYi9qY29uZmlnLnR4dApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBqY29uZmlnLmRvYwpyZW5hbWUgdG8gamNvbmZpZy50eHQKaW5kZXggYzE4ZDFjMC4uODgxOWU3OSAxMDA2NDQKLS0tIGEvamNvbmZpZy5kb2MKKysrIGIvamNvbmZpZy50eHQKQEAgLTEsNSArMSw1IEBACiAvKgotICogamNvbmZpZy5kb2MKKyAqIGpjb25maWcudHh0CiAgKgogICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KQEAgLTI0LDcgKzI0LDcgQEAKICAqLwogCiAvKiBEb2VzIHlvdXIgY29tcGlsZXIgc3VwcG9ydCBmdW5jdGlvbiBwcm90b3R5cGVzPwotICogKElmIG5vdCwgeW91IGFsc28gbmVlZCB0byB1c2UgYW5zaTJrbnIsIHNlZSBpbnN0YWxsLmRvYykKKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC50eHQpCiAgKi8KICNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCiAKZGlmZiAtLWdpdCBhL2pjb25maWcudmMgYi9qY29uZmlnLnZjCmluZGV4IDdlMjkxYzcuLjY3OTQwNGQgMTAwNjQ0Ci0tLSBhL2pjb25maWcudmMKKysrIGIvamNvbmZpZy52YwpAQCAtMSw1ICsxLDUgQEAKIC8qIGpjb25maWcudmMgLS0tIGpjb25maWcuaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgb24gV2luZG93cyA5NSBvciBOVC4gKi8KLS8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisvKiBzZWUgamNvbmZpZy50eHQgZm9yIGV4cGxhbmF0aW9ucyAqLwogCiAjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwogI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKZGlmZiAtLWdpdCBhL2pjb25maWcudm1zIGIvamNvbmZpZy52bXMKaW5kZXggNTVhNmZmYi4uODMzN2IwYiAxMDA2NDQKLS0tIGEvamNvbmZpZy52bXMKKysrIGIvamNvbmZpZy52bXMKQEAgLTEsNSArMSw1IEBACiAvKiBqY29uZmlnLnZtcyAtLS0gamNvbmZpZy5oIGZvciB1c2Ugb24gRGlnaXRhbCBWTVMuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworLyogc2VlIGpjb25maWcudHh0IGZvciBleHBsYW5hdGlvbnMgKi8KIAogI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKICNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCmRpZmYgLS1naXQgYS9qY29uZmlnLndhdCBiL2pjb25maWcud2F0CmluZGV4IDZjYzU0NWIuLjE5MGNjNzUgMTAwNjQ0Ci0tLSBhL2pjb25maWcud2F0CisrKyBiL2pjb25maWcud2F0CkBAIC0xLDUgKzEsNSBAQAogLyogamNvbmZpZy53YXQgLS0tIGpjb25maWcuaCBmb3IgV2F0Y29tIEMvQysrIG9uIE1TLURPUyBvciBPUy8yLiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKy8qIHNlZSBqY29uZmlnLnR4dCBmb3IgZXhwbGFuYXRpb25zICovCiAKICNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCiAjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgpkaWZmIC0tZ2l0IGEvamNwYXJhbS5jIGIvamNwYXJhbS5jCmluZGV4IDZmYzQ4ZjUuLmM1ZTg1ZGQgMTAwNjQ0Ci0tLSBhL2pjcGFyYW0uYworKysgYi9qY3BhcmFtLmMKQEAgLTIsNiArMiw3IEBACiAgKiBqY3BhcmFtLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDAzLTIwMDggYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtNjAsNiArNjEsNDcgQEAKIH0KIAogCisvKiBUaGVzZSBhcmUgdGhlIHNhbXBsZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIEpQRUcgc3BlYyBzZWN0aW9uIEsuMS4KKyAqIFRoZSBzcGVjIHNheXMgdGhhdCB0aGUgdmFsdWVzIGdpdmVuIHByb2R1Y2UgImdvb2QiIHF1YWxpdHksIGFuZAorICogd2hlbiBkaXZpZGVkIGJ5IDIsICJ2ZXJ5IGdvb2QiIHF1YWxpdHkuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RkX2x1bWluYW5jZV9xdWFudF90YmxbRENUU0laRTJdID0geworICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAorICAxMiwgIDEyLCAgMTQsICAxOSwgIDI2LCAgNTgsICA2MCwgIDU1LAorICAxNCwgIDEzLCAgMTYsICAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAorICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAorICAxOCwgIDIyLCAgMzcsICA1NiwgIDY4LCAxMDksIDEwMywgIDc3LAorICAyNCwgIDM1LCAgNTUsICA2NCwgIDgxLCAxMDQsIDExMywgIDkyLAorICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICA3MiwgIDkyLCAgOTUsICA5OCwgMTEyLCAxMDAsIDEwMywgIDk5Cit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgMTcsICAxOCwgIDI0LCAgNDcsICA5OSwgIDk5LCAgOTksICA5OSwKKyAgMTgsICAyMSwgIDI2LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwKKyAgMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgNDcsICA2NiwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OQorfTsKKworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVmYXVsdF9xdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKKy8qIFNldCBvciBjaGFuZ2UgdGhlICdxdWFsaXR5JyAocXVhbnRpemF0aW9uKSBzZXR0aW5nLCB1c2luZyBkZWZhdWx0IHRhYmxlcworICogYW5kIHN0cmFpZ2h0IHBlcmNlbnRhZ2Utc2NhbGluZyBxdWFsaXR5IHNjYWxlcy4KKyAqIFRoaXMgZW50cnkgcG9pbnQgYWxsb3dzIGRpZmZlcmVudCBzY2FsaW5ncyBmb3IgbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZS4KKyAqLworeworICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2FsaW5nICovCisgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAwLCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIGNpbmZvLT5xX3NjYWxlX2ZhY3RvclswXSwgZm9yY2VfYmFzZWxpbmUpOworICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMSwgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIGNpbmZvLT5xX3NjYWxlX2ZhY3RvclsxXSwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKIEdMT0JBTCh2b2lkKQoganBlZ19zZXRfbGluZWFyX3F1YWxpdHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2NhbGVfZmFjdG9yLAogCQkJIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCkBAIC02OSwzMSArMTExLDYgQEAKICAqIGFwcGxpY2F0aW9ucyB0aGF0IGluc2lzdCBvbiBhIGxpbmVhciBwZXJjZW50YWdlIHNjYWxpbmcuCiAgKi8KIHsKLSAgLyogVGhlc2UgYXJlIHRoZSBzYW1wbGUgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBKUEVHIHNwZWMgc2VjdGlvbiBLLjEuCi0gICAqIFRoZSBzcGVjIHNheXMgdGhhdCB0aGUgdmFsdWVzIGdpdmVuIHByb2R1Y2UgImdvb2QiIHF1YWxpdHksIGFuZAotICAgKiB3aGVuIGRpdmlkZWQgYnkgMiwgInZlcnkgZ29vZCIgcXVhbGl0eS4KLSAgICovCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RkX2x1bWluYW5jZV9xdWFudF90YmxbRENUU0laRTJdID0gewotICAgIDE2LCAgMTEsICAxMCwgIDE2LCAgMjQsICA0MCwgIDUxLCAgNjEsCi0gICAgMTIsICAxMiwgIDE0LCAgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKLSAgICAxNCwgIDEzLCAgMTYsICAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAotICAgIDE0LCAgMTcsICAyMiwgIDI5LCAgNTEsICA4NywgIDgwLCAgNjIsCi0gICAgMTgsICAyMiwgIDM3LCAgNTYsICA2OCwgMTA5LCAxMDMsICA3NywKLSAgICAyNCwgIDM1LCAgNTUsICA2NCwgIDgxLCAxMDQsIDExMywgIDkyLAotICAgIDQ5LCAgNjQsICA3OCwgIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsCi0gICAgNzIsICA5MiwgIDk1LCAgOTgsIDExMiwgMTAwLCAxMDMsICA5OQotICB9OwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9jaHJvbWluYW5jZV9xdWFudF90YmxbRENUU0laRTJdID0gewotICAgIDE3LCAgMTgsICAyNCwgIDQ3LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgMTgsICAyMSwgIDI2LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICAyNCwgIDI2LCAgNTYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDQ3LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OQotICB9OwotCiAgIC8qIFNldCB1cCB0d28gcXVhbnRpemF0aW9uIHRhYmxlcyB1c2luZyB0aGUgc3BlY2lmaWVkIHNjYWxpbmcgKi8KICAganBlZ19hZGRfcXVhbnRfdGFibGUoY2luZm8sIDAsIHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsLAogCQkgICAgICAgc2NhbGVfZmFjdG9yLCBmb3JjZV9iYXNlbGluZSk7CkBAIC0yODQsNiArMzAxLDggQEAKIAogICAvKiBJbml0aWFsaXplIGV2ZXJ5dGhpbmcgbm90IGRlcGVuZGVudCBvbiB0aGUgY29sb3Igc3BhY2UgKi8KIAorICBjaW5mby0+c2NhbGVfbnVtID0gMTsJCS8qIDE6MSBzY2FsaW5nICovCisgIGNpbmZvLT5zY2FsZV9kZW5vbSA9IDE7CiAgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsKICAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIGRlZmF1bHQgcXVhbGl0eSBvZiA3NSAqLwogICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCA3NSwgVFJVRSk7CkBAIC0zMjAsNiArMzM5LDkgQEAKICAgLyogQnkgZGVmYXVsdCwgdXNlIHRoZSBzaW1wbGVyIG5vbi1jb3NpdGVkIHNhbXBsaW5nIGFsaWdubWVudCAqLwogICBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IEZBTFNFOwogCisgIC8qIEJ5IGRlZmF1bHQsIGFwcGx5IGZhbmN5IGRvd25zYW1wbGluZyAqLworICBjaW5mby0+ZG9fZmFuY3lfZG93bnNhbXBsaW5nID0gVFJVRTsKKwogICAvKiBObyBpbnB1dCBzbW9vdGhpbmcgKi8KICAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSAwOwogCmRpZmYgLS1naXQgYS9qY3BodWZmLmMgYi9qY3BodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZjkxNzguLjAwMDAwMDAKLS0tIGEvamNwaHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsODMzICswLDAgQEAKLS8qCi0gKiBqY3BodWZmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMgZm9yIHByb2dyZXNzaXZlIEpQRUcuCi0gKgotICogV2UgZG8gbm90IHN1cHBvcnQgb3V0cHV0IHN1c3BlbnNpb24gaW4gdGhpcyBtb2R1bGUsIHNpbmNlIHRoZSBsaWJyYXJ5Ci0gKiBjdXJyZW50bHkgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUtc2NhbiBmaWxlcyB0byBiZSB3cml0dGVuIHdpdGggb3V0cHV0Ci0gKiBzdXNwZW5zaW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqY2h1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqY2h1ZmYuYyAqLwotCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLQotLyogRXhwYW5kZWQgZW50cm9weSBlbmNvZGVyIG9iamVjdCBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbmNvZGluZy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogTW9kZSBmbGFnOiBUUlVFIGZvciBvcHRpbWl6YXRpb24sIEZBTFNFIGZvciBhY3R1YWwgZGF0YSBvdXRwdXQgKi8KLSAgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljczsKLQotICAvKiBCaXQtbGV2ZWwgY29kaW5nIHN0YXR1cy4KLSAgICogbmV4dF9vdXRwdXRfYnl0ZS9mcmVlX2luX2J1ZmZlciBhcmUgbG9jYWwgY29waWVzIG9mIGNpbmZvLT5kZXN0IGZpZWxkcy4KLSAgICovCi0gIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KLSAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLSAgSU5UMzIgcHV0X2J1ZmZlcjsJCS8qIGN1cnJlbnQgYml0LWFjY3VtdWxhdGlvbiBidWZmZXIgKi8KLSAgaW50IHB1dF9iaXRzOwkJCS8qICMgb2YgYml0cyBub3cgaW4gaXQgKi8KLSAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBsaW5rIHRvIGNpbmZvIChuZWVkZWQgZm9yIGR1bXBfYnVmZmVyKSAqLwotCi0gIC8qIENvZGluZyBzdGF0dXMgZm9yIERDIGNvbXBvbmVudHMgKi8KLSAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLwotCi0gIC8qIENvZGluZyBzdGF0dXMgZm9yIEFDIGNvbXBvbmVudHMgKi8KLSAgaW50IGFjX3RibF9ubzsJCS8qIHRoZSB0YWJsZSBudW1iZXIgb2YgdGhlIHNpbmdsZSBjb21wb25lbnQgKi8KLSAgdW5zaWduZWQgaW50IEVPQlJVTjsJCS8qIHJ1biBsZW5ndGggb2YgRU9CcyAqLwotICB1bnNpZ25lZCBpbnQgQkU7CQkvKiAjIG9mIGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyBiZWZvcmUgTUNVICovCi0gIGNoYXIgKiBiaXRfYnVmZmVyOwkJLyogYnVmZmVyIGZvciBjb3JyZWN0aW9uIGJpdHMgKDEgcGVyIGNoYXIpICovCi0gIC8qIHBhY2tpbmcgY29ycmVjdGlvbiBiaXRzIHRpZ2h0bHkgd291bGQgc2F2ZSBzb21lIHNwYWNlIGJ1dCBjb3N0IHRpbWUuLi4gKi8KLQotICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KLSAgaW50IG5leHRfcmVzdGFydF9udW07CQkvKiBuZXh0IHJlc3RhcnQgbnVtYmVyIHRvIHdyaXRlICgwLTcpICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikuCi0gICAqIFNpbmNlIGFueSBvbmUgc2NhbiBjb2RlcyBvbmx5IERDIG9yIG9ubHkgQUMsIHdlIG9ubHkgbmVlZCBvbmUgc2V0Ci0gICAqIG9mIHRhYmxlcywgbm90IG9uZSBmb3IgREMgYW5kIG9uZSBmb3IgQUMuCi0gICAqLwotICBjX2Rlcml2ZWRfdGJsICogZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb247IGFnYWluLCBvbmUgc2V0IGlzIGVub3VnaCAqLwotICBsb25nICogY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLX0gcGh1ZmZfZW50cm9weV9lbmNvZGVyOwotCi10eXBlZGVmIHBodWZmX2VudHJvcHlfZW5jb2RlciAqIHBodWZmX2VudHJvcHlfcHRyOwotCi0vKiBNQVhfQ09SUl9CSVRTIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGUgQUMgcmVmaW5lbWVudCBjb3JyZWN0aW9uLWJpdAotICogYnVmZmVyIGNhbiBob2xkLiAgTGFyZ2VyIHNpemVzIG1heSBzbGlnaHRseSBpbXByb3ZlIGNvbXByZXNzaW9uLCBidXQKLSAqIDEwMDAgaXMgYWxyZWFkeSB3ZWxsIGludG8gdGhlIHJlYWxtIG9mIG92ZXJraWxsLgotICogVGhlIG1pbmltdW0gc2FmZSBzaXplIGlzIDY0IGJpdHMuCi0gKi8KLQotI2RlZmluZSBNQVhfQ09SUl9CSVRTICAxMDAwCS8qIE1heCAjIG9mIGNvcnJlY3Rpb24gYml0cyBJIGNhbiBidWZmZXIgKi8KLQotLyogSVJJR0hUX1NISUZUIGlzIGxpa2UgUklHSFRfU0hJRlQsIGJ1dCB3b3JrcyBvbiBpbnQgcmF0aGVyIHRoYW4gSU5UMzIuCi0gKiBXZSBhc3N1bWUgdGhhdCBpbnQgcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgaWYgSU5UMzIgcmlnaHQgc2hpZnQgaXMsCi0gKiB3aGljaCBzaG91bGQgYmUgc2FmZS4KLSAqLwotCi0jaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLSNkZWZpbmUgSVNISUZUX1RFTVBTCWludCBpc2hpZnRfdGVtcDsKLSNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkgIFwKLQkoKGlzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCi0JIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+MCkgPDwgKDE2LShzaGZ0KSkpIDogXAotCSAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKLSNlbHNlCi0jZGVmaW5lIElTSElGVF9URU1QUwotI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KQkoKHgpID4+IChzaGZ0KSkKLSNlbmRpZgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfRENfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX2ZpcnN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19yZWZpbmUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9BQ19yZWZpbmUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfcGh1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4gdXNpbmcgcHJvZ3Jlc3NpdmUgSlBFRy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKQoteyAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBib29sZWFuIGlzX0RDX2JhbmQ7Ci0gIGludCBjaSwgdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICBlbnRyb3B5LT5jaW5mbyA9IGNpbmZvOwotICBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9IGdhdGhlcl9zdGF0aXN0aWNzOwotCi0gIGlzX0RDX2JhbmQgPSAoY2luZm8tPlNzID09IDApOwotCi0gIC8qIFdlIGFzc3VtZSBqY21hc3Rlci5jIGFscmVhZHkgdmFsaWRhdGVkIHRoZSBzY2FuIHBhcmFtZXRlcnMuICovCi0KLSAgLyogU2VsZWN0IGV4ZWN1dGlvbiByb3V0aW5lcyAqLwotICBpZiAoY2luZm8tPkFoID09IDApIHsKLSAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19maXJzdDsKLSAgICBlbHNlCi0gICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfZmlyc3Q7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGlzX0RDX2JhbmQpCi0gICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfRENfcmVmaW5lOwotICAgIGVsc2UgewotICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0FDX3JlZmluZTsKLSAgICAgIC8qIEFDIHJlZmluZW1lbnQgbmVlZHMgYSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgKi8KLSAgICAgIGlmIChlbnRyb3B5LT5iaXRfYnVmZmVyID09IE5VTEwpCi0JZW50cm9weS0+Yml0X2J1ZmZlciA9IChjaGFyICopCi0JICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIE1BWF9DT1JSX0JJVFMgKiBTSVpFT0YoY2hhcikpOwotICAgIH0KLSAgfQotICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpCi0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmOwotICBlbHNlCi0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfcGh1ZmY7Ci0KLSAgLyogT25seSBEQyBjb2VmZmljaWVudHMgbWF5IGJlIGludGVybGVhdmVkLCBzbyBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IDEKLSAgICogZm9yIEFDIGNvZWZmaWNpZW50cy4KLSAgICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICAgIC8qIEdldCB0YWJsZSBpbmRleCAqLwotICAgIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgICBpZiAoY2luZm8tPkFoICE9IDApCS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KLQljb250aW51ZTsKLSAgICAgIHRibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICB9IGVsc2UgewotICAgICAgZW50cm9weS0+YWNfdGJsX25vID0gdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIH0KLSAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKLSAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIHRhYmxlIGluZGV4ICovCi0gICAgICAvKiAobWFrZV9jX2Rlcml2ZWRfdGJsIGRvZXMgdGhpcyBpbiB0aGUgb3RoZXIgcGF0aCkgKi8KLSAgICAgIGlmICh0YmwgPCAwIHx8IHRibCA+PSBOVU1fSFVGRl9UQkxTKQotICAgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0YmwpOwotICAgICAgLyogQWxsb2NhdGUgYW5kIHplcm8gdGhlIHN0YXRpc3RpY3MgdGFibGVzICovCi0gICAgICAvKiBOb3RlIHRoYXQganBlZ19nZW5fb3B0aW1hbF90YWJsZSBleHBlY3RzIDI1NyBlbnRyaWVzIGluIGVhY2ggdGFibGUhICovCi0gICAgICBpZiAoZW50cm9weS0+Y291bnRfcHRyc1t0YmxdID09IE5VTEwpCi0JZW50cm9weS0+Y291bnRfcHRyc1t0YmxdID0gKGxvbmcgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIE1FTVpFUk8oZW50cm9weS0+Y291bnRfcHRyc1t0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGZvciBIdWZmbWFuIHRhYmxlICovCi0gICAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLwotICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIGlzX0RDX2JhbmQsIHRibCwKLQkJCSAgICAgICYgZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF0pOwotICAgIH0KLSAgfQotCi0gIC8qIEluaXRpYWxpemUgQUMgc3R1ZmYgKi8KLSAgZW50cm9weS0+RU9CUlVOID0gMDsKLSAgZW50cm9weS0+QkUgPSAwOwotCi0gIC8qIEluaXRpYWxpemUgYml0IGJ1ZmZlciB0byBlbXB0eSAqLwotICBlbnRyb3B5LT5wdXRfYnVmZmVyID0gMDsKLSAgZW50cm9weS0+cHV0X2JpdHMgPSAwOwotCi0gIC8qIEluaXRpYWxpemUgcmVzdGFydCBzdHVmZiAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKLX0KLQotCi0vKiBPdXRwdXR0aW5nIGJ5dGVzIHRvIHRoZSBmaWxlLgotICogTkI6IHRoZXNlIG11c3QgYmUgY2FsbGVkIG9ubHkgd2hlbiBhY3R1YWxseSBvdXRwdXR0aW5nLAotICogdGhhdCBpcywgZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MgPT0gRkFMU0UuCi0gKi8KLQotLyogRW1pdCBhIGJ5dGUgKi8KLSNkZWZpbmUgZW1pdF9ieXRlKGVudHJvcHksdmFsKSAgXAotCXsgKihlbnRyb3B5KS0+bmV4dF9vdXRwdXRfYnl0ZSsrID0gKEpPQ1RFVCkgKHZhbCk7ICBcCi0JICBpZiAoLS0oZW50cm9weSktPmZyZWVfaW5fYnVmZmVyID09IDApICBcCi0JICAgIGR1bXBfYnVmZmVyKGVudHJvcHkpOyB9Ci0KLQotTE9DQUwodm9pZCkKLWR1bXBfYnVmZmVyIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQotLyogRW1wdHkgdGhlIG91dHB1dCBidWZmZXI7IHdlIGRvIG5vdCBzdXBwb3J0IHN1c3BlbnNpb24gaW4gdGhpcyBtb2R1bGUuICovCi17Ci0gIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3QgPSBlbnRyb3B5LT5jaW5mby0+ZGVzdDsKLQotICBpZiAoISAoKmRlc3QtPmVtcHR5X291dHB1dF9idWZmZXIpIChlbnRyb3B5LT5jaW5mbykpCi0gICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOwotICAvKiBBZnRlciBhIHN1Y2Nlc3NmdWwgYnVmZmVyIGR1bXAsIG11c3QgcmVzZXQgYnVmZmVyIHBvaW50ZXJzICovCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGRlc3QtPmZyZWVfaW5fYnVmZmVyOwotfQotCi0KLS8qIE91dHB1dHRpbmcgYml0cyB0byB0aGUgZmlsZSAqLwotCi0vKiBPbmx5IHRoZSByaWdodCAyNCBiaXRzIG9mIHB1dF9idWZmZXIgYXJlIHVzZWQ7IHRoZSB2YWxpZCBiaXRzIGFyZQotICogbGVmdC1qdXN0aWZpZWQgaW4gdGhpcyBwYXJ0LiAgQXQgbW9zdCAxNiBiaXRzIGNhbiBiZSBwYXNzZWQgdG8gZW1pdF9iaXRzCi0gKiBpbiBvbmUgY2FsbCwgYW5kIHdlIG5ldmVyIHJldGFpbiBtb3JlIHRoYW4gNyBiaXRzIGluIHB1dF9idWZmZXIKLSAqIGJldHdlZW4gY2FsbHMsIHNvIDI0IGJpdHMgYXJlIHN1ZmZpY2llbnQuCi0gKi8KLQotSU5MSU5FCi1MT0NBTCh2b2lkKQotZW1pdF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHNpemUpCi0vKiBFbWl0IHNvbWUgYml0cywgdW5sZXNzIHdlIGFyZSBpbiBnYXRoZXIgbW9kZSAqLwotewotICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyB0aWdodGx5LiAqLwotICByZWdpc3RlciBJTlQzMiBwdXRfYnVmZmVyID0gKElOVDMyKSBjb2RlOwotICByZWdpc3RlciBpbnQgcHV0X2JpdHMgPSBlbnRyb3B5LT5wdXRfYml0czsKLQotICAvKiBpZiBzaXplIGlzIDAsIGNhbGxlciB1c2VkIGFuIGludmFsaWQgSHVmZm1hbiB0YWJsZSBlbnRyeSAqLwotICBpZiAoc2l6ZSA9PSAwKQotICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOwotCi0gIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKLSAgICByZXR1cm47CQkJLyogZG8gbm90aGluZyBpZiB3ZSdyZSBvbmx5IGdldHRpbmcgc3RhdHMgKi8KLQotICBwdXRfYnVmZmVyICY9ICgoKElOVDMyKSAxKTw8c2l6ZSkgLSAxOyAvKiBtYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiBjb2RlICovCi0gIAotICBwdXRfYml0cyArPSBzaXplOwkJLyogbmV3IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLwotICAKLSAgcHV0X2J1ZmZlciA8PD0gMjQgLSBwdXRfYml0czsgLyogYWxpZ24gaW5jb21pbmcgYml0cyAqLwotCi0gIHB1dF9idWZmZXIgfD0gZW50cm9weS0+cHV0X2J1ZmZlcjsgLyogYW5kIG1lcmdlIHdpdGggb2xkIGJ1ZmZlciBjb250ZW50cyAqLwotCi0gIHdoaWxlIChwdXRfYml0cyA+PSA4KSB7Ci0gICAgaW50IGMgPSAoaW50KSAoKHB1dF9idWZmZXIgPj4gMTYpICYgMHhGRik7Ci0gICAgCi0gICAgZW1pdF9ieXRlKGVudHJvcHksIGMpOwotICAgIGlmIChjID09IDB4RkYpIHsJCS8qIG5lZWQgdG8gc3R1ZmYgYSB6ZXJvIGJ5dGU/ICovCi0gICAgICBlbWl0X2J5dGUoZW50cm9weSwgMCk7Ci0gICAgfQotICAgIHB1dF9idWZmZXIgPDw9IDg7Ci0gICAgcHV0X2JpdHMgLT0gODsKLSAgfQotCi0gIGVudHJvcHktPnB1dF9idWZmZXIgPSBwdXRfYnVmZmVyOyAvKiB1cGRhdGUgdmFyaWFibGVzICovCi0gIGVudHJvcHktPnB1dF9iaXRzID0gcHV0X2JpdHM7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWZsdXNoX2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCi17Ci0gIGVtaXRfYml0cyhlbnRyb3B5LCAweDdGLCA3KTsgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLwotICBlbnRyb3B5LT5wdXRfYnVmZmVyID0gMDsgICAgIC8qIGFuZCByZXNldCBiaXQtYnVmZmVyIHRvIGVtcHR5ICovCi0gIGVudHJvcHktPnB1dF9iaXRzID0gMDsKLX0KLQotCi0vKgotICogRW1pdCAob3IganVzdCBjb3VudCkgYSBIdWZmbWFuIHN5bWJvbC4KLSAqLwotCi1JTkxJTkUKLUxPQ0FMKHZvaWQpCi1lbWl0X3N5bWJvbCAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgaW50IHRibF9ubywgaW50IHN5bWJvbCkKLXsKLSAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQotICAgIGVudHJvcHktPmNvdW50X3B0cnNbdGJsX25vXVtzeW1ib2xdKys7Ci0gIGVsc2UgewotICAgIGNfZGVyaXZlZF90YmwgKiB0YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsX25vXTsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgdGJsLT5laHVmY29bc3ltYm9sXSwgdGJsLT5laHVmc2lbc3ltYm9sXSk7Ci0gIH0KLX0KLQotCi0vKgotICogRW1pdCBiaXRzIGZyb20gYSBjb3JyZWN0aW9uIGJpdCBidWZmZXIuCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfYnVmZmVyZWRfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgY2hhciAqIGJ1ZnN0YXJ0LAotCQkgICAgdW5zaWduZWQgaW50IG5iaXRzKQotewotICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCi0gICAgcmV0dXJuOwkJCS8qIG5vIHJlYWwgd29yayAqLwotCi0gIHdoaWxlIChuYml0cyA+IDApIHsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgKCpidWZzdGFydCksIDEpOwotICAgIGJ1ZnN0YXJ0Kys7Ci0gICAgbmJpdHMtLTsKLSAgfQotfQotCi0KLS8qCi0gKiBFbWl0IGFueSBwZW5kaW5nIEVPQlJVTiBzeW1ib2wuCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfZW9icnVuIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQotewotICByZWdpc3RlciBpbnQgdGVtcCwgbmJpdHM7Ci0KLSAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApIHsJLyogaWYgdGhlcmUgaXMgYW55IHBlbmRpbmcgRU9CUlVOICovCi0gICAgdGVtcCA9IGVudHJvcHktPkVPQlJVTjsKLSAgICBuYml0cyA9IDA7Ci0gICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKLSAgICAgIG5iaXRzKys7Ci0gICAgLyogc2FmZXR5IGNoZWNrOiBzaG91bGRuJ3QgaGFwcGVuIGdpdmVuIGxpbWl0ZWQgY29ycmVjdGlvbi1iaXQgYnVmZmVyICovCi0gICAgaWYgKG5iaXRzID4gMTQpCi0gICAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKLQotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgbmJpdHMgPDwgNCk7Ci0gICAgaWYgKG5iaXRzKQotICAgICAgZW1pdF9iaXRzKGVudHJvcHksIGVudHJvcHktPkVPQlJVTiwgbmJpdHMpOwotCi0gICAgZW50cm9weS0+RU9CUlVOID0gMDsKLQotICAgIC8qIEVtaXQgYW55IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyAqLwotICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBlbnRyb3B5LT5iaXRfYnVmZmVyLCBlbnRyb3B5LT5CRSk7Ci0gICAgZW50cm9weS0+QkUgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIEVtaXQgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgcHJlZGljdGlvbnMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfcmVzdGFydCAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgaW50IHJlc3RhcnRfbnVtKQotewotICBpbnQgY2k7Ci0KLSAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0KLSAgaWYgKCEgZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpIHsKLSAgICBmbHVzaF9iaXRzKGVudHJvcHkpOwotICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAweEZGKTsKLSAgICBlbWl0X2J5dGUoZW50cm9weSwgSlBFR19SU1QwICsgcmVzdGFydF9udW0pOwotICB9Ci0KLSAgaWYgKGVudHJvcHktPmNpbmZvLT5TcyA9PSAwKSB7Ci0gICAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgZW50cm9weS0+Y2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgICBlbnRyb3B5LT5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9IGVsc2UgewotICAgIC8qIFJlLWluaXRpYWxpemUgYWxsIEFDLXJlbGF0ZWQgZmllbGRzIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOwotICAgIGVudHJvcHktPkJFID0gMDsKLSAgfQotfQotCi0KLS8qCi0gKiBNQ1UgZW5jb2RpbmcgZm9yIERDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfRENfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOwotICByZWdpc3RlciBpbnQgbmJpdHM7Ci0gIGludCBibGtuLCBjaTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBJU0hJRlRfVEVNUFMKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGVtaXRfcmVzdGFydChlbnRyb3B5LCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKTsKLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrcyAqLwotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQotICAgIC8qIENvbXB1dGUgdGhlIERDIHZhbHVlIGFmdGVyIHRoZSByZXF1aXJlZCBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuCi0gICAgICogVGhpcyBpcyBzaW1wbHkgYW4gYXJpdGhtZXRpYyByaWdodCBzaGlmdC4KLSAgICAgKi8KLSAgICB0ZW1wMiA9IElSSUdIVF9TSElGVCgoaW50KSAoKCpibG9jaylbMF0pLCBBbCk7Ci0KLSAgICAvKiBEQyBkaWZmZXJlbmNlcyBhcmUgZmlndXJlZCBvbiB0aGUgcG9pbnQtdHJhbnNmb3JtZWQgdmFsdWVzLiAqLwotICAgIHRlbXAgPSB0ZW1wMiAtIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXTsKLSAgICBlbnRyb3B5LT5sYXN0X2RjX3ZhbFtjaV0gPSB0ZW1wMjsKLQotICAgIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBHLjEuMi4xICovCi0gICAgdGVtcDIgPSB0ZW1wOwotICAgIGlmICh0ZW1wIDwgMCkgewotICAgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLSAgICAgIC8qIEZvciBhIG5lZ2F0aXZlIGlucHV0LCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhpbnB1dCkgKi8KLSAgICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLwotICAgICAgdGVtcDItLTsKLSAgICB9Ci0gICAgCi0gICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICAgIG5iaXRzID0gMDsKLSAgICB3aGlsZSAodGVtcCkgewotICAgICAgbmJpdHMrKzsKLSAgICAgIHRlbXAgPj49IDE7Ci0gICAgfQotICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgotICAgICAqIFNpbmNlIHdlJ3JlIGVuY29kaW5nIGEgZGlmZmVyZW5jZSwgdGhlIHJhbmdlIGxpbWl0IGlzIHR3aWNlIGFzIG11Y2guCi0gICAgICovCi0gICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotICAgIAotICAgIC8qIENvdW50L2VtaXQgdGhlIEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBjb21wcHRyLT5kY190Ymxfbm8sIG5iaXRzKTsKLSAgICAKLSAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgICBpZiAobmJpdHMpCQkJLyogZW1pdF9iaXRzIHJlamVjdHMgY2FsbHMgd2l0aCBzaXplIDAgKi8KLSAgICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSB0ZW1wMiwgbmJpdHMpOwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGVuY29kaW5nIGZvciBBQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X0FDX2ZpcnN0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wLCB0ZW1wMjsKLSAgcmVnaXN0ZXIgaW50IG5iaXRzOwotICByZWdpc3RlciBpbnQgciwgazsKLSAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIEpCTE9DS1JPVyBibG9jazsKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGVtaXRfcmVzdGFydChlbnRyb3B5LCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKTsKLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrICovCi0gIGJsb2NrID0gTUNVX2RhdGFbMF07Ci0KLSAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMiwgZmlnLiBHLjMgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gICAKLSAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLyogV2UgbXVzdCBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtIGJ5IEFsLiAgRm9yIEFDIGNvZWZmaWNpZW50cyB0aGlzCi0gICAgICogaXMgYW4gaW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvd2FyZHMgMC4gIFRvIGRvIHRoaXMgcG9ydGFibHkKLSAgICAgKiBpbiBDLCB3ZSBzaGlmdCBhZnRlciBvYnRhaW5pbmcgdGhlIGFic29sdXRlIHZhbHVlOyBzbyB0aGUgY29kZSBpcwotICAgICAqIGludGVyd292ZW4gd2l0aCBmaW5kaW5nIHRoZSBhYnMgdmFsdWUgKHRlbXApIGFuZCBvdXRwdXQgYml0cyAodGVtcDIpLgotICAgICAqLwotICAgIGlmICh0ZW1wIDwgMCkgewotICAgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLSAgICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLwotICAgICAgLyogRm9yIGEgbmVnYXRpdmUgY29lZiwgd2FudCB0ZW1wMiA9IGJpdHdpc2UgY29tcGxlbWVudCBvZiBhYnMoY29lZikgKi8KLSAgICAgIHRlbXAyID0gfnRlbXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLwotICAgICAgdGVtcDIgPSB0ZW1wOwotICAgIH0KLSAgICAvKiBXYXRjaCBvdXQgZm9yIGNhc2UgdGhhdCBub256ZXJvIGNvZWYgaXMgemVybyBhZnRlciBwb2ludCB0cmFuc2Zvcm0gKi8KLSAgICBpZiAodGVtcCA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBFbWl0IGFueSBwZW5kaW5nIEVPQlJVTiAqLwotICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPiAwKQotICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0gICAgLyogaWYgcnVuIGxlbmd0aCA+IDE1LCBtdXN0IGVtaXQgc3BlY2lhbCBydW4tbGVuZ3RoLTE2IGNvZGVzICgweEYwKSAqLwotICAgIHdoaWxlIChyID4gMTUpIHsKLSAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7Ci0gICAgICByIC09IDE2OwotICAgIH0KLQotICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgICBuYml0cyA9IDE7CQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KLSAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQotICAgICAgbmJpdHMrKzsKLSAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLwotICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0KLSAgICAvKiBDb3VudC9lbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIChyIDw8IDQpICsgbmJpdHMpOwotCi0gICAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCi0gICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCi0gICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7Ci0KLSAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KLSAgfQotCi0gIGlmIChyID4gMCkgewkJCS8qIElmIHRoZXJlIGFyZSB0cmFpbGluZyB6ZXJvZXMsICovCi0gICAgZW50cm9weS0+RU9CUlVOKys7CQkvKiBjb3VudCBhbiBFT0IgKi8KLSAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRikKLSAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwkvKiBmb3JjZSBpdCBvdXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLSAgfQotCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBlbmNvZGluZyBmb3IgREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KLSAqIE5vdGU6IHdlIGFzc3VtZSBzdWNoIHNjYW5zIGNhbiBiZSBtdWx0aS1jb21wb25lbnQsIGFsdGhvdWdoIHRoZSBzcGVjCi0gKiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGUgcG9pbnQuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X0RDX3JlZmluZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgaW50IGJsa247Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgSkJMT0NLUk9XIGJsb2NrOwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCi0gIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKLQotICAgIC8qIFdlIHNpbXBseSBlbWl0IHRoZSBBbCd0aCBiaXQgb2YgdGhlIERDIGNvZWZmaWNpZW50IHZhbHVlLiAqLwotICAgIHRlbXAgPSAoKmJsb2NrKVswXTsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgKHRlbXAgPj4gQWwpLCAxKTsKLSAgfQotCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBlbmNvZGluZyBmb3IgQUMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfQUNfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBpbnQgciwgazsKLSAgaW50IEVPQjsKLSAgY2hhciAqQlJfYnVmZmVyOwotICB1bnNpZ25lZCBpbnQgQlI7Ci0gIGludCBTZSA9IGNpbmZvLT5TZTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIGludCBhYnN2YWx1ZXNbRENUU0laRTJdOwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KLSAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKLQotICAvKiBJdCBpcyBjb252ZW5pZW50IHRvIG1ha2UgYSBwcmUtcGFzcyB0byBkZXRlcm1pbmUgdGhlIHRyYW5zZm9ybWVkCi0gICAqIGNvZWZmaWNpZW50cycgYWJzb2x1dGUgdmFsdWVzIGFuZCB0aGUgRU9CIHBvc2l0aW9uLgotICAgKi8KLSAgRU9CID0gMDsKLSAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKLSAgICB0ZW1wID0gKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXTsKLSAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKLSAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQotICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWUuCi0gICAgICovCi0gICAgaWYgKHRlbXAgPCAwKQotICAgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLSAgICB0ZW1wID4+PSBBbDsJCS8qIGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gKi8KLSAgICBhYnN2YWx1ZXNba10gPSB0ZW1wOwkvKiBzYXZlIGFicyB2YWx1ZSBmb3IgbWFpbiBwYXNzICovCi0gICAgaWYgKHRlbXAgPT0gMSkKLSAgICAgIEVPQiA9IGs7CQkJLyogRU9CID0gaW5kZXggb2YgbGFzdCBuZXdseS1ub256ZXJvIGNvZWYgKi8KLSAgfQotCi0gIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEcuMS4yLjMsIGZpZy4gRy43ICovCi0gIAotICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLwotICBCUiA9IDA7CQkJLyogQlIgPSBjb3VudCBvZiBidWZmZXJlZCBiaXRzIGFkZGVkIG5vdyAqLwotICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyICsgZW50cm9weS0+QkU7IC8qIEFwcGVuZCBiaXRzIHRvIGJ1ZmZlciAqLwotCi0gIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7Ci0gICAgaWYgKCh0ZW1wID0gYWJzdmFsdWVzW2tdKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBFbWl0IGFueSByZXF1aXJlZCBaUkxzLCBidXQgbm90IGlmIHRoZXkgY2FuIGJlIGZvbGRlZCBpbnRvIEVPQiAqLwotICAgIHdoaWxlIChyID4gMTUgJiYgayA8PSBFT0IpIHsKLSAgICAgIC8qIGVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIGFuZCB0aGUgQkUgY29ycmVjdGlvbiBiaXRzICovCi0gICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLSAgICAgIC8qIEVtaXQgWlJMICovCi0gICAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIDB4RjApOwotICAgICAgciAtPSAxNjsKLSAgICAgIC8qIEVtaXQgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIHRoYXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggWlJMICovCi0gICAgICBlbWl0X2J1ZmZlcmVkX2JpdHMoZW50cm9weSwgQlJfYnVmZmVyLCBCUik7Ci0gICAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLwotICAgICAgQlIgPSAwOwotICAgIH0KLQotICAgIC8qIElmIHRoZSBjb2VmIHdhcyBwcmV2aW91c2x5IG5vbnplcm8sIGl0IG9ubHkgbmVlZHMgYSBjb3JyZWN0aW9uIGJpdC4KLSAgICAgKiBOT1RFOiBhIHN0cmFpZ2h0IHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjJ3MgZmlndXJlIEcuNyB3b3VsZCBzdWdnZXN0Ci0gICAgICogdGhhdCB3ZSBhbHNvIG5lZWQgdG8gdGVzdCByID4gMTUuICBCdXQgaWYgciA+IDE1LCB3ZSBjYW4gb25seSBnZXQgaGVyZQotICAgICAqIGlmIGsgPiBFT0IsIHdoaWNoIGltcGxpZXMgdGhhdCB0aGlzIGNvZWZmaWNpZW50IGlzIG5vdCAxLgotICAgICAqLwotICAgIGlmICh0ZW1wID4gMSkgewotICAgICAgLyogVGhlIGNvcnJlY3Rpb24gYml0IGlzIHRoZSBuZXh0IGJpdCBvZiB0aGUgYWJzb2x1dGUgdmFsdWUuICovCi0gICAgICBCUl9idWZmZXJbQlIrK10gPSAoY2hhcikgKHRlbXAgJiAxKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIGFuZCB0aGUgQkUgY29ycmVjdGlvbiBiaXRzICovCi0gICAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0KLSAgICAvKiBDb3VudC9lbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIChyIDw8IDQpICsgMSk7Ci0KLSAgICAvKiBFbWl0IG91dHB1dCBiaXQgZm9yIG5ld2x5LW5vbnplcm8gY29lZiAqLwotICAgIHRlbXAgPSAoKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA8IDApID8gMCA6IDE7Ci0gICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAsIDEpOwotCi0gICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGUgKi8KLSAgICBlbWl0X2J1ZmZlcmVkX2JpdHMoZW50cm9weSwgQlJfYnVmZmVyLCBCUik7Ci0gICAgQlJfYnVmZmVyID0gZW50cm9weS0+Yml0X2J1ZmZlcjsgLyogQkUgYml0cyBhcmUgZ29uZSBub3cgKi8KLSAgICBCUiA9IDA7Ci0gICAgciA9IDA7CQkJLyogcmVzZXQgemVybyBydW4gbGVuZ3RoICovCi0gIH0KLQotICBpZiAociA+IDAgfHwgQlIgPiAwKSB7CS8qIElmIHRoZXJlIGFyZSB0cmFpbGluZyB6ZXJvZXMsICovCi0gICAgZW50cm9weS0+RU9CUlVOKys7CQkvKiBjb3VudCBhbiBFT0IgKi8KLSAgICBlbnRyb3B5LT5CRSArPSBCUjsJCS8qIGNvbmNhdCBteSBjb3JyZWN0aW9uIGJpdHMgdG8gb2xkZXIgb25lcyAqLwotICAgIC8qIFdlIGZvcmNlIG91dCB0aGUgRU9CIGlmIHdlIHJpc2sgZWl0aGVyOgotICAgICAqIDEuIG92ZXJmbG93IG9mIHRoZSBFT0IgY291bnRlcjsKLSAgICAgKiAyLiBvdmVyZmxvdyBvZiB0aGUgY29ycmVjdGlvbiBiaXQgYnVmZmVyIGR1cmluZyB0aGUgbmV4dCBNQ1UuCi0gICAgICovCi0gICAgaWYgKGVudHJvcHktPkVPQlJVTiA9PSAweDdGRkYgfHwgZW50cm9weS0+QkUgPiAoTUFYX0NPUlJfQklUUy1EQ1RTSVpFMisxKSkKLSAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBIdWZmbWFuLWNvbXByZXNzZWQgcHJvZ3Jlc3NpdmUgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzX3BodWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsgICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBGbHVzaCBvdXQgYW55IGJ1ZmZlcmVkIGRhdGEgKi8KLSAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0gIGZsdXNoX2JpdHMoZW50cm9weSk7Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcgcGFzcyBhbmQgY3JlYXRlIHRoZSBuZXcgSHVmZm1hbiB0YWJsZXMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19nYXRoZXJfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgYm9vbGVhbiBpc19EQ19iYW5kOwotICBpbnQgY2ksIHRibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIEpIVUZGX1RCTCAqKmh0YmxwdHI7Ci0gIGJvb2xlYW4gZGlkW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIEZsdXNoIG91dCBidWZmZXJlZCBkYXRhIChhbGwgd2UgY2FyZSBhYm91dCBpcyBjb3VudGluZyB0aGUgRU9CIHN5bWJvbCkgKi8KLSAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0KLSAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7Ci0KLSAgLyogSXQncyBpbXBvcnRhbnQgbm90IHRvIGFwcGx5IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgbW9yZSB0aGFuIG9uY2UKLSAgICogcGVyIHRhYmxlLCBiZWNhdXNlIGl0IGNsb2JiZXJzIHRoZSBpbnB1dCBmcmVxdWVuY3kgY291bnRzIQotICAgKi8KLSAgTUVNWkVSTyhkaWQsIFNJWkVPRihkaWQpKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgaWYgKGlzX0RDX2JhbmQpIHsKLSAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLwotCWNvbnRpbnVlOwotICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIH0gZWxzZSB7Ci0gICAgICB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgfQotICAgIGlmICghIGRpZFt0YmxdKSB7Ci0gICAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsXTsKLSAgICAgIGVsc2UKLSAgICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsXTsKLSAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQotICAgICAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+Y291bnRfcHRyc1t0YmxdKTsKLSAgICAgIGRpZFt0YmxdID0gVFJVRTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X3BodWZmX2VuY29kZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgaTsKLQotICBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKHBodWZmX2VudHJvcHlfZW5jb2RlcikpOwotICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKikgZW50cm9weTsKLSAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3BodWZmOwotCi0gIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotICAgIGVudHJvcHktPmNvdW50X3B0cnNbaV0gPSBOVUxMOwotICB9Ci0gIGVudHJvcHktPmJpdF9idWZmZXIgPSBOVUxMOwkvKiBuZWVkZWQgb25seSBpbiBBQyByZWZpbmVtZW50IHNjYW4gKi8KLX0KLQotI2VuZGlmIC8qIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qY3ByZXBjdC5jIGIvamNwcmVwY3QuYwppbmRleCBmYTkzMzMzLi5iZTQ0Y2M0IDEwMDY0NAotLS0gYS9qY3ByZXBjdC5jCisrKyBiL2pjcHJlcGN0LmMKQEAgLTE3MywxMCArMTczLDEyIEBACiAJKm91dF9yb3dfZ3JvdXBfY3RyIDwgb3V0X3Jvd19ncm91cHNfYXZhaWwpIHsKICAgICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CiAJICAgY2krKywgY29tcHB0cisrKSB7CisJbnVtcm93cyA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUpIC8KKwkJICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplOwogCWV4cGFuZF9ib3R0b21fZWRnZShvdXRwdXRfYnVmW2NpXSwKLQkJCSAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCi0JCQkgICAoaW50KSAoKm91dF9yb3dfZ3JvdXBfY3RyICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JCQkgICAoaW50KSAob3V0X3Jvd19ncm91cHNfYXZhaWwgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSk7CisJCQkgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSwKKwkJCSAgIChpbnQpICgqb3V0X3Jvd19ncm91cF9jdHIgKiBudW1yb3dzKSwKKwkJCSAgIChpbnQpIChvdXRfcm93X2dyb3Vwc19hdmFpbCAqIG51bXJvd3MpKTsKICAgICAgIH0KICAgICAgICpvdXRfcm93X2dyb3VwX2N0ciA9IG91dF9yb3dfZ3JvdXBzX2F2YWlsOwogICAgICAgYnJlYWs7CQkJLyogY2FuIGV4aXQgb3V0ZXIgbG9vcCB3aXRob3V0IHRlc3QgKi8KQEAgLTI4OCw3ICsyOTAsOCBAQAogICAgICAqLwogICAgIHRydWVfYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCiAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSAoKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFICoKKyAgICAgICAoSkRJTUVOU0lPTikgKCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICoKKwkJICAgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSAqCiAJCSAgICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcikgLyBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKICAgICAgICAoSkRJTUVOU0lPTikgKDMgKiByZ3JvdXBfaGVpZ2h0KSk7CiAgICAgLyogQ29weSB0cnVlIGJ1ZmZlciByb3cgcG9pbnRlcnMgaW50byB0aGUgbWlkZGxlIG9mIHRoZSBmYWtlIHJvdyBhcnJheSAqLwpAQCAtMzQ2LDcgKzM0OSw4IEBACiAJIGNpKyssIGNvbXBwdHIrKykgewogICAgICAgcHJlcC0+Y29sb3JfYnVmW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQogCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JIChKRElNRU5TSU9OKSAoKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFICoKKwkgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqCisJCQljaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplICoKIAkJCWNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcikgLyBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKIAkgKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamNzYW1wbGUuYyBiL2pjc2FtcGxlLmMKaW5kZXggMjEyZWM4Ny4uNGQzNmY4NSAxMDA2NDQKLS0tIGEvamNzYW1wbGUuYworKysgYi9qY3NhbXBsZS5jCkBAIC02Miw2ICs2MiwxNSBAQAogCiAgIC8qIERvd25zYW1wbGluZyBtZXRob2QgcG9pbnRlcnMsIG9uZSBwZXIgY29tcG9uZW50ICovCiAgIGRvd25zYW1wbGUxX3B0ciBtZXRob2RzW01BWF9DT01QT05FTlRTXTsKKworICAvKiBIZWlnaHQgb2YgYW4gb3V0cHV0IHJvdyBncm91cCBmb3IgZWFjaCBjb21wb25lbnQuICovCisgIGludCByb3dncm91cF9oZWlnaHRbTUFYX0NPTVBPTkVOVFNdOworCisgIC8qIFRoZXNlIGFycmF5cyBzYXZlIHBpeGVsIGV4cGFuc2lvbiBmYWN0b3JzIHNvIHRoYXQgaW50X2Rvd25zYW1wbGUgbmVlZCBub3QKKyAgICogcmVjb21wdXRlIHRoZW0gZWFjaCB0aW1lLiAgVGhleSBhcmUgdW51c2VkIGZvciBvdGhlciBkb3duc2FtcGxpbmcgbWV0aG9kcy4KKyAgICovCisgIFVJTlQ4IGhfZXhwYW5kW01BWF9DT01QT05FTlRTXTsKKyAgVUlOVDggdl9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOwogfSBteV9kb3duc2FtcGxlcjsKIAogdHlwZWRlZiBteV9kb3duc2FtcGxlciAqIG15X2Rvd25zYW1wbGVfcHRyOwpAQCAtMTIzLDcgKzEzMiw4IEBACiAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CiAgICAgICAgY2krKywgY29tcHB0cisrKSB7CiAgICAgaW5fcHRyID0gaW5wdXRfYnVmW2NpXSArIGluX3Jvd19pbmRleDsKLSAgICBvdXRfcHRyID0gb3V0cHV0X2J1ZltjaV0gKyAob3V0X3Jvd19ncm91cF9pbmRleCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIG91dF9wdHIgPSBvdXRwdXRfYnVmW2NpXSArCisJICAgICAgKG91dF9yb3dfZ3JvdXBfaW5kZXggKiBkb3duc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldKTsKICAgICAoKmRvd25zYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsIGluX3B0ciwgb3V0X3B0cik7CiAgIH0KIH0KQEAgLTE0MCwxNCArMTUwLDE1IEBACiBpbnRfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAogCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCiB7CisgIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpIGNpbmZvLT5kb3duc2FtcGxlOwogICBpbnQgaW5yb3csIG91dHJvdywgaF9leHBhbmQsIHZfZXhwYW5kLCBudW1waXgsIG51bXBpeDIsIGgsIHY7CiAgIEpESU1FTlNJT04gb3V0Y29sLCBvdXRjb2xfaDsJLyogb3V0Y29sX2ggPT0gb3V0Y29sKmhfZXhwYW5kICovCi0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemU7CiAgIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CiAgIElOVDMyIG91dHZhbHVlOwogCi0gIGhfZXhwYW5kID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgdl9leHBhbmQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICBoX2V4cGFuZCA9IGRvd25zYW1wbGUtPmhfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisgIHZfZXhwYW5kID0gZG93bnNhbXBsZS0+dl9leHBhbmRbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKICAgbnVtcGl4ID0gaF9leHBhbmQgKiB2X2V4cGFuZDsKICAgbnVtcGl4MiA9IG51bXBpeC8yOwogCkBAIC0xNTgsOCArMTY5LDggQEAKICAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAogCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIGhfZXhwYW5kKTsKIAotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAoaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKICAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwogICAgIGZvciAob3V0Y29sID0gMCwgb3V0Y29sX2ggPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsKIAkgb3V0Y29sKyssIG91dGNvbF9oICs9IGhfZXhwYW5kKSB7CkBAIC0xNzMsNiArMTg0LDcgQEAKICAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG91dHZhbHVlICsgbnVtcGl4MikgLyBudW1waXgpOwogICAgIH0KICAgICBpbnJvdyArPSB2X2V4cGFuZDsKKyAgICBvdXRyb3crKzsKICAgfQogfQogCkBAIC0xOTEsOCArMjAzLDggQEAKICAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfZGF0YSwgMCwgb3V0cHV0X2RhdGEsIDAsCiAJCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsIGNpbmZvLT5pbWFnZV93aWR0aCk7CiAgIC8qIEVkZ2UtZXhwYW5kICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKG91dHB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCi0JCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUpOworICBleHBhbmRfcmlnaHRfZWRnZShvdXRwdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLCBjaW5mby0+aW1hZ2Vfd2lkdGgsCisJCSAgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSk7CiB9CiAKIApAQCAtMjEyLDkgKzIyNCw5IEBACiBoMnYxX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKIAkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKIHsKLSAgaW50IG91dHJvdzsKKyAgaW50IGlucm93OwogICBKRElNRU5TSU9OIG91dGNvbDsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZTsKICAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKICAgcmVnaXN0ZXIgaW50IGJpYXM7CiAKQEAgLTIyNSw5ICsyMzcsOSBAQAogICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCiAJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CiAKLSAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgewotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107Ci0gICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOwogICAgIGJpYXMgPSAwOwkJCS8qIGJpYXMgPSAwLDEsMCwxLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCiAgICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKICAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyKSArIEdFVEpTQU1QTEUoaW5wdHJbMV0pCkBAIC0yNTEsNyArMjYzLDcgQEAKIHsKICAgaW50IGlucm93LCBvdXRyb3c7CiAgIEpESU1FTlNJT04gb3V0Y29sOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplOwogICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgb3V0cHRyOwogICByZWdpc3RlciBpbnQgYmlhczsKIApAQCAtMjYyLDggKzI3NCw4IEBACiAgIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKIAkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiAyKTsKIAotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAoaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKICAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwogICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOwogICAgIGlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07CkBAIC0yNzYsNiArMjg4LDcgQEAKICAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsKICAgICB9CiAgICAgaW5yb3cgKz0gMjsKKyAgICBvdXRyb3crKzsKICAgfQogfQogCkBAIC0yOTQsNyArMzA3LDcgQEAKIHsKICAgaW50IGlucm93LCBvdXRyb3c7CiAgIEpESU1FTlNJT04gY29sY3RyOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplOwogICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKICAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7CiAKQEAgLTMyMSw4ICszMzQsOCBAQAogICBtZW1iZXJzY2FsZSA9IDE2Mzg0IC0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA4MDsgLyogc2NhbGVkICgxLTUqU0YpLzQgKi8KICAgbmVpZ2hzY2FsZSA9IGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogMTY7IC8qIHNjYWxlZCBTRi80ICovCiAKLSAgaW5yb3cgPSAwOwotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7CisgIGlucm93ID0gb3V0cm93ID0gMDsKKyAgd2hpbGUgKGlucm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CiAgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKICAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKICAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOwpAQCAtMzc4LDYgKzM5MSw3IEBACiAgICAgKm91dHB0ciA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7CiAKICAgICBpbnJvdyArPSAyOworICAgIG91dHJvdysrOwogICB9CiB9CiAKQEAgLTM5Miw5ICs0MDYsOSBAQAogZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyLAogCQkJICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKIHsKLSAgaW50IG91dHJvdzsKKyAgaW50IGlucm93OwogICBKRElNRU5TSU9OIGNvbGN0cjsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZTsKICAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIGFib3ZlX3B0ciwgYmVsb3dfcHRyLCBvdXRwdHI7CiAgIElOVDMyIG1lbWJlcnN1bSwgbmVpZ2hzdW0sIG1lbWJlcnNjYWxlLCBuZWlnaHNjYWxlOwogICBpbnQgY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOwpAQCAtNDE1LDExICs0MjksMTEgQEAKICAgbWVtYmVyc2NhbGUgPSA2NTUzNkwgLSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDUxMkw7IC8qIHNjYWxlZCAxLTgqU0YgKi8KICAgbmVpZ2hzY2FsZSA9IGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNjQ7IC8qIHNjYWxlZCBTRiAqLwogCi0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyID0gaW5wdXRfZGF0YVtvdXRyb3ddOwotICAgIGFib3ZlX3B0ciA9IGlucHV0X2RhdGFbb3V0cm93LTFdOwotICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbb3V0cm93KzFdOworICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtpbnJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbaW5yb3crMV07CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLwogICAgIGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cisrKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cisrKSArCkBAIC00NjcsNiArNDgxLDcgQEAKICAgaW50IGNpOwogICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKICAgYm9vbGVhbiBzbW9vdGhvayA9IFRSVUU7CisgIGludCBoX2luX2dyb3VwLCB2X2luX2dyb3VwLCBoX291dF9ncm91cCwgdl9vdXRfZ3JvdXA7CiAKICAgZG93bnNhbXBsZSA9IChteV9kb3duc2FtcGxlX3B0cikKICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLApAQCAtNDgyLDggKzQ5NywxNyBAQAogICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgYW5kIHNldCB1cCBtZXRob2QgcG9pbnRlcnMgKi8KICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKICAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKLQljb21wcHRyLT52X3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgIC8qIENvbXB1dGUgc2l6ZSBvZiBhbiAib3V0cHV0IGdyb3VwIiBmb3IgRENUIHNjYWxpbmcuICBUaGlzIG1hbnkgc2FtcGxlcworICAgICAqIGFyZSB0byBiZSBjb252ZXJ0ZWQgZnJvbSBtYXhfaF9zYW1wX2ZhY3RvciAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVscy4KKyAgICAgKi8KKyAgICBoX291dF9ncm91cCA9IChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemUpIC8KKwkJICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplOworICAgIHZfb3V0X2dyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSkgLworCQkgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemU7CisgICAgaF9pbl9ncm91cCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcjsKKyAgICB2X2luX2dyb3VwID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIGRvd25zYW1wbGUtPnJvd2dyb3VwX2hlaWdodFtjaV0gPSB2X291dF9ncm91cDsgLyogc2F2ZSBmb3IgdXNlIGxhdGVyICovCisgICAgaWYgKGhfaW5fZ3JvdXAgPT0gaF9vdXRfZ3JvdXAgJiYgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgewogI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKICAgICAgIGlmIChjaW5mby0+c21vb3RoaW5nX2ZhY3RvcikgewogCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGU7CkBAIC00OTEsMTIgKzUxNSwxMiBAQAogICAgICAgfSBlbHNlCiAjZW5kaWYKIAlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX2Rvd25zYW1wbGU7Ci0gICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKLQkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgPT0gaF9vdXRfZ3JvdXAgKiAyICYmCisJICAgICAgIHZfaW5fZ3JvdXAgPT0gdl9vdXRfZ3JvdXApIHsKICAgICAgIHNtb290aG9rID0gRkFMU0U7CiAgICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZG93bnNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgotCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgPT0gaF9vdXRfZ3JvdXAgKiAyICYmCisJICAgICAgIHZfaW5fZ3JvdXAgPT0gdl9vdXRfZ3JvdXAgKiAyKSB7CiAjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAogICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7CiAJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Ntb290aF9kb3duc2FtcGxlOwpAQCAtNTA0LDEwICs1MjgsMTIgQEAKICAgICAgIH0gZWxzZQogI2VuZGlmCiAJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2Rvd25zYW1wbGU7Ci0gICAgfSBlbHNlIGlmICgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICUgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgPT0gMCAmJgotCSAgICAgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgPT0gMCkgeworICAgIH0gZWxzZSBpZiAoKGhfaW5fZ3JvdXAgJSBoX291dF9ncm91cCkgPT0gMCAmJgorCSAgICAgICAodl9pbl9ncm91cCAlIHZfb3V0X2dyb3VwKSA9PSAwKSB7CiAgICAgICBzbW9vdGhvayA9IEZBTFNFOwogICAgICAgZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBpbnRfZG93bnNhbXBsZTsKKyAgICAgIGRvd25zYW1wbGUtPmhfZXhwYW5kW2NpXSA9IChVSU5UOCkgKGhfaW5fZ3JvdXAgLyBoX291dF9ncm91cCk7CisgICAgICBkb3duc2FtcGxlLT52X2V4cGFuZFtjaV0gPSAoVUlOVDgpICh2X2luX2dyb3VwIC8gdl9vdXRfZ3JvdXApOwogICAgIH0gZWxzZQogICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GUkFDVF9TQU1QTEVfTk9USU1QTCk7CiAgIH0KZGlmZiAtLWdpdCBhL2pjdHJhbnMuYyBiL2pjdHJhbnMuYwppbmRleCA5NzUzYTQzLi43NGJiMTJjIDEwMDY0NAotLS0gYS9qY3RyYW5zLmMKKysrIGIvamN0cmFucy5jCkBAIC0xNjksMTQgKzE2OSw3IEBACiAgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewogICAgIGppbml0X2FyaXRoX2VuY29kZXIoY2luZm8pOwogICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICBqaW5pdF9waHVmZl9lbmNvZGVyKGNpbmZvKTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UKLSAgICAgIGppbml0X2h1ZmZfZW5jb2RlcihjaW5mbyk7CisgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKICAgfQogCiAgIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLwpkaWZmIC0tZ2l0IGEvamRhcGltaW4uYyBiL2pkYXBpbWluLmMKaW5kZXggY2FkYjU5Zi4uYTU1NDk4ZiAxMDA2NDQKLS0tIGEvamRhcGltaW4uYworKysgYi9qZGFwaW1pbi5jCkBAIC0yLDYgKzIsNyBAQAogICogamRhcGltaW4uYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIE1vZGlmaWVkIDIwMDkgYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtMTg1LDggKzE4Niw4IEBACiAgIH0KIAogICAvKiBTZXQgZGVmYXVsdHMgZm9yIG90aGVyIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KLSAgY2luZm8tPnNjYWxlX251bSA9IDE7CQkvKiAxOjEgc2NhbGluZyAqLwotICBjaW5mby0+c2NhbGVfZGVub20gPSAxOworICBjaW5mby0+c2NhbGVfbnVtID0gRENUU0laRTsJCS8qIDE6MSBzY2FsaW5nICovCisgIGNpbmZvLT5zY2FsZV9kZW5vbSA9IERDVFNJWkU7CiAgIGNpbmZvLT5vdXRwdXRfZ2FtbWEgPSAxLjA7CiAgIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IEZBTFNFOwogICBjaW5mby0+cmF3X2RhdGFfb3V0ID0gRkFMU0U7CmRpZmYgLS1naXQgYS9qZGFwaXN0ZC5jIGIvamRhcGlzdGQuYwppbmRleCBjOGUzZmEwLi45ZDc0NTM3IDEwMDY0NAotLS0gYS9qZGFwaXN0ZC5jCisrKyBiL2pkYXBpc3RkLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogICB9CiAKICAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGNhbiBiZSByZXR1cm5lZC4gKi8KLSAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGxpbmVzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemU7CiAgIGlmIChtYXhfbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCiAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7CiAKZGlmZiAtLWdpdCBhL2pkYXJpdGguYyBiL2pkYXJpdGguYwppbmRleCAxZWY1MTNlLi43MDI5NTBmIDEwMDY0NAotLS0gYS9qZGFyaXRoLmMKKysrIGIvamRhcml0aC5jCkBAIC0xLDEwICsxLDkgQEAKIC8qCiAgKiBqZGFyaXRoLmMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcsIEd1aWRvIFZvbGxiZWRpbmcgPGd1aXZvbEBlc2MuZGU+LgotICogVGhpcyBmaWxlIGlzIE5PVCBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLSAqIGZvciBsZWdhbCByZWFzb25zLgotICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUgZm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UuCisgKiBEZXZlbG9wZWQgMTk5NyBieSBHdWlkbyBWb2xsYmVkaW5nLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgcG9ydGFibGUgYXJpdGhtZXRpYyBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzIGZvciBKUEVHCiAgKiAoaW1wbGVtZW50aW5nIHRoZSBJU08vSUVDIElTIDEwOTE4LTEgYW5kIENDSVRUIFJlY29tbWVuZGF0aW9uIElUVS1UIFQuODEpLgpAQCAtNDYyLDExICs0NjEsMTIgQEAKICAgICBmb3IgKDs7KSB7CiAgICAgICB0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKICAgICAgIGlmICgqdGhpc2NvZWYpIHsJCQkJLyogcHJldmlvdXNseSBub256ZXJvIGNvZWYgKi8KLQlpZiAoYXJpdGhfZGVjb2RlKGNpbmZvLCBzdCArIDIpKQorCWlmIChhcml0aF9kZWNvZGUoY2luZm8sIHN0ICsgMikpIHsKIAkgIGlmICgqdGhpc2NvZWYgPCAwKQogCSAgICAqdGhpc2NvZWYgKz0gbTE7CiAJICBlbHNlCiAJICAgICp0aGlzY29lZiArPSBwMTsKKwl9CiAJYnJlYWs7CiAgICAgICB9CiAgICAgICBpZiAoYXJpdGhfZGVjb2RlKGNpbmZvLCBzdCArIDEpKSB7CS8qIG5ld2x5IG5vbnplcm8gY29lZiAqLwpkaWZmIC0tZ2l0IGEvamRjb2VmY3QuYyBiL2pkY29lZmN0LmMKaW5kZXggNDkzOGQyMC4uNDYyZTkyYyAxMDA2NDQKLS0tIGEvamRjb2VmY3QuYworKysgYi9qZGNvZWZjdC5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAl1c2VmdWxfd2lkdGggPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCiAJCQkJCQkgICAgOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKIAlvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdICsKLQkgIHlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJICB5b2Zmc2V0ICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemU7CiAJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOwogCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKIAkgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93IHx8CkBAIC0xOTcsMTEgKzE5NywxMSBAQAogCSAgICAgICgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwKIAkJCSAgICAgIChKQ09FRlBUUikgY29lZi0+TUNVX2J1ZmZlcltibGtuK3hpbmRleF0sCiAJCQkgICAgICBvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKLQkgICAgICBvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKwkgICAgICBvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplOwogCSAgICB9CiAJICB9CiAJICBibGtuICs9IGNvbXBwdHItPk1DVV93aWR0aDsKLQkgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworCSAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZTsKIAl9CiAgICAgICB9CiAgICAgfQpAQCAtMzYyLDkgKzM2Miw5IEBACiAJKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIGJ1ZmZlcl9wdHIsCiAJCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKIAlidWZmZXJfcHRyKys7Ci0Jb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZTsKICAgICAgIH0KLSAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZTsKICAgICB9CiAgIH0KIApAQCAtNjU0LDkgKzY1NCw5IEBACiAJREM0ID0gREM1OyBEQzUgPSBEQzY7CiAJREM3ID0gREM4OyBEQzggPSBEQzk7CiAJYnVmZmVyX3B0cisrLCBwcmV2X2Jsb2NrX3JvdysrLCBuZXh0X2Jsb2NrX3JvdysrOwotCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemU7CiAgICAgICB9Ci0gICAgICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemU7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2pkY3QuaCBiL2pkY3QuaAppbmRleCAwNDE5MmEyLi4zNjBkZWM4IDEwMDY0NAotLS0gYS9qZGN0LmgKKysrIGIvamRjdC5oCkBAIC0xNCwxMSArMTQsMTYgQEAKIAogCiAvKgotICogQSBmb3J3YXJkIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byBhIHdvcmsgYXJlYSBvZiB0eXBlIERDVEVMRU1bXTsKLSAqIHRoZSBEQ1QgaXMgdG8gYmUgcGVyZm9ybWVkIGluLXBsYWNlIGluIHRoYXQgYnVmZmVyLiAgVHlwZSBEQ1RFTEVNIGlzIGludAotICogZm9yIDgtYml0IHNhbXBsZXMsIElOVDMyIGZvciAxMi1iaXQgc2FtcGxlcy4gIChOT1RFOiBGbG9hdGluZy1wb2ludCBEQ1QKLSAqIGltcGxlbWVudGF0aW9ucyB1c2UgYW4gYXJyYXkgb2YgdHlwZSBGQVNUX0ZMT0FULCBpbnN0ZWFkLikKLSAqIFRoZSBEQ1QgaW5wdXRzIGFyZSBleHBlY3RlZCB0byBiZSBzaWduZWQgKHJhbmdlICstQ0VOVEVSSlNBTVBMRSkuCisgKiBBIGZvcndhcmQgRENUIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIGFuIGlucHV0IHNhbXBsZSBhcnJheSBhbmQKKyAqIGEgcG9pbnRlciB0byBhIHdvcmsgYXJlYSBvZiB0eXBlIERDVEVMRU1bXTsgdGhlIERDVCBpcyB0byBiZSBwZXJmb3JtZWQKKyAqIGluLXBsYWNlIGluIHRoYXQgYnVmZmVyLiAgVHlwZSBEQ1RFTEVNIGlzIGludCBmb3IgOC1iaXQgc2FtcGxlcywgSU5UMzIKKyAqIGZvciAxMi1iaXQgc2FtcGxlcy4gIChOT1RFOiBGbG9hdGluZy1wb2ludCBEQ1QgaW1wbGVtZW50YXRpb25zIHVzZSBhbgorICogYXJyYXkgb2YgdHlwZSBGQVNUX0ZMT0FULCBpbnN0ZWFkLikKKyAqIFRoZSBpbnB1dCBkYXRhIGlzIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IGEKKyAqIHNwZWNpZmllZCBjb2x1bW4uICAoQW55IHJvdyBvZmZzZXQgbmVlZGVkIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJyYXkKKyAqIHBvaW50ZXIgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byB0aGUgRkRDVCBjb2RlLikKKyAqIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZmV0Y2hlZCBieSB0aGUgRkRDVCByb3V0aW5lIGlzCisgKiBEQ1RfaF9zY2FsZWRfc2l6ZSAqIERDVF92X3NjYWxlZF9zaXplLgogICogVGhlIERDVCBvdXRwdXRzIGFyZSByZXR1cm5lZCBzY2FsZWQgdXAgYnkgYSBmYWN0b3Igb2YgODsgdGhleSB0aGVyZWZvcmUKICAqIGhhdmUgYSByYW5nZSBvZiArLThLIGZvciA4LWJpdCBkYXRhLCArLTEyOEsgZm9yIDEyLWJpdCBkYXRhLiAgVGhpcwogICogY29udmVudGlvbiBpbXByb3ZlcyBhY2N1cmFjeSBpbiBpbnRlZ2VyIGltcGxlbWVudGF0aW9ucyBhbmQgc2F2ZXMgc29tZQpAQCAtMzIsOCArMzcsMTIgQEAKIHR5cGVkZWYgSU5UMzIgRENURUxFTTsJCS8qIG11c3QgaGF2ZSAzMiBiaXRzICovCiAjZW5kaWYKIAotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGZvcndhcmRfRENUX21ldGhvZF9wdHIsIChEQ1RFTEVNICogZGF0YSkpOwotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGZsb2F0X0RDVF9tZXRob2RfcHRyLCAoRkFTVF9GTE9BVCAqIGRhdGEpKTsKK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBmb3J3YXJkX0RDVF9tZXRob2RfcHRyLCAoRENURUxFTSAqIGRhdGEsCisJCQkJCSAgICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLAorCQkJCQkgICAgICAgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBmbG9hdF9EQ1RfbWV0aG9kX3B0ciwgKEZBU1RfRkxPQVQgKiBkYXRhLAorCQkJCQkgICAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsCisJCQkJCSAgICAgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKIAogCiAvKgpAQCAtNDQsNyArNTMsNyBAQAogICogc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkIGNvbHVtbi4gIChBbnkgcm93IG9mZnNldCBuZWVkZWQgd2lsbAogICogYmUgYXBwbGllZCB0byB0aGUgYXJyYXkgcG9pbnRlciBiZWZvcmUgaXQgaXMgcGFzc2VkIHRvIHRoZSBJRENUIGNvZGUuKQogICogTm90ZSB0aGF0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBlbWl0dGVkIGJ5IHRoZSBJRENUIHJvdXRpbmUgaXMKLSAqIERDVF9zY2FsZWRfc2l6ZSAqIERDVF9zY2FsZWRfc2l6ZS4KKyAqIERDVF9oX3NjYWxlZF9zaXplICogRENUX3Zfc2NhbGVkX3NpemUuCiAgKi8KIAogLyogdHlwZWRlZiBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGlzIGRlY2xhcmVkIGluIGpwZWdpbnQuaCAqLwpAQCAtODQsMTkgKzkzLDE0MyBAQAogI2RlZmluZSBqcGVnX2ZkY3RfaXNsb3cJCWpGRGlzbG93CiAjZGVmaW5lIGpwZWdfZmRjdF9pZmFzdAkJakZEaWZhc3QKICNkZWZpbmUganBlZ19mZGN0X2Zsb2F0CQlqRkRmbG9hdAorI2RlZmluZSBqcGVnX2ZkY3RfN3g3CQlqRkQ3eDcKKyNkZWZpbmUganBlZ19mZGN0XzZ4NgkJakZENng2CisjZGVmaW5lIGpwZWdfZmRjdF81eDUJCWpGRDV4NQorI2RlZmluZSBqcGVnX2ZkY3RfNHg0CQlqRkQ0eDQKKyNkZWZpbmUganBlZ19mZGN0XzN4MwkJakZEM3gzCisjZGVmaW5lIGpwZWdfZmRjdF8yeDIJCWpGRDJ4MgorI2RlZmluZSBqcGVnX2ZkY3RfMXgxCQlqRkQxeDEKKyNkZWZpbmUganBlZ19mZGN0Xzl4OQkJakZEOXg5CisjZGVmaW5lIGpwZWdfZmRjdF8xMHgxMAkJakZEMTB4MTAKKyNkZWZpbmUganBlZ19mZGN0XzExeDExCQlqRkQxMXgxMQorI2RlZmluZSBqcGVnX2ZkY3RfMTJ4MTIJCWpGRDEyeDEyCisjZGVmaW5lIGpwZWdfZmRjdF8xM3gxMwkJakZEMTN4MTMKKyNkZWZpbmUganBlZ19mZGN0XzE0eDE0CQlqRkQxNHgxNAorI2RlZmluZSBqcGVnX2ZkY3RfMTV4MTUJCWpGRDE1eDE1CisjZGVmaW5lIGpwZWdfZmRjdF8xNngxNgkJakZEMTZ4MTYKKyNkZWZpbmUganBlZ19mZGN0XzE2eDgJCWpGRDE2eDgKKyNkZWZpbmUganBlZ19mZGN0XzE0eDcJCWpGRDE0eDcKKyNkZWZpbmUganBlZ19mZGN0XzEyeDYJCWpGRDEyeDYKKyNkZWZpbmUganBlZ19mZGN0XzEweDUJCWpGRDEweDUKKyNkZWZpbmUganBlZ19mZGN0Xzh4NAkJakZEOHg0CisjZGVmaW5lIGpwZWdfZmRjdF82eDMJCWpGRDZ4MworI2RlZmluZSBqcGVnX2ZkY3RfNHgyCQlqRkQ0eDIKKyNkZWZpbmUganBlZ19mZGN0XzJ4MQkJakZEMngxCisjZGVmaW5lIGpwZWdfZmRjdF84eDE2CQlqRkQ4eDE2CisjZGVmaW5lIGpwZWdfZmRjdF83eDE0CQlqRkQ3eDE0CisjZGVmaW5lIGpwZWdfZmRjdF82eDEyCQlqRkQ2eDEyCisjZGVmaW5lIGpwZWdfZmRjdF81eDEwCQlqRkQ1eDEwCisjZGVmaW5lIGpwZWdfZmRjdF80eDgJCWpGRDR4OAorI2RlZmluZSBqcGVnX2ZkY3RfM3g2CQlqRkQzeDYKKyNkZWZpbmUganBlZ19mZGN0XzJ4NAkJakZEMng0CisjZGVmaW5lIGpwZWdfZmRjdF8xeDIJCWpGRDF4MgogI2RlZmluZSBqcGVnX2lkY3RfaXNsb3cJCWpSRGlzbG93CiAjZGVmaW5lIGpwZWdfaWRjdF9pZmFzdAkJalJEaWZhc3QKICNkZWZpbmUganBlZ19pZGN0X2Zsb2F0CQlqUkRmbG9hdAorI2RlZmluZSBqcGVnX2lkY3RfN3g3CQlqUkQ3eDcKKyNkZWZpbmUganBlZ19pZGN0XzZ4NgkJalJENng2CisjZGVmaW5lIGpwZWdfaWRjdF81eDUJCWpSRDV4NQogI2RlZmluZSBqcGVnX2lkY3RfNHg0CQlqUkQ0eDQKKyNkZWZpbmUganBlZ19pZGN0XzN4MwkJalJEM3gzCiAjZGVmaW5lIGpwZWdfaWRjdF8yeDIJCWpSRDJ4MgogI2RlZmluZSBqcGVnX2lkY3RfMXgxCQlqUkQxeDEKKyNkZWZpbmUganBlZ19pZGN0Xzl4OQkJalJEOXg5CisjZGVmaW5lIGpwZWdfaWRjdF8xMHgxMAkJalJEMTB4MTAKKyNkZWZpbmUganBlZ19pZGN0XzExeDExCQlqUkQxMXgxMQorI2RlZmluZSBqcGVnX2lkY3RfMTJ4MTIJCWpSRDEyeDEyCisjZGVmaW5lIGpwZWdfaWRjdF8xM3gxMwkJalJEMTN4MTMKKyNkZWZpbmUganBlZ19pZGN0XzE0eDE0CQlqUkQxNHgxNAorI2RlZmluZSBqcGVnX2lkY3RfMTV4MTUJCWpSRDE1eDE1CisjZGVmaW5lIGpwZWdfaWRjdF8xNngxNgkJalJEMTZ4MTYKKyNkZWZpbmUganBlZ19pZGN0XzE2eDgJCWpSRDE2eDgKKyNkZWZpbmUganBlZ19pZGN0XzE0eDcJCWpSRDE0eDcKKyNkZWZpbmUganBlZ19pZGN0XzEyeDYJCWpSRDEyeDYKKyNkZWZpbmUganBlZ19pZGN0XzEweDUJCWpSRDEweDUKKyNkZWZpbmUganBlZ19pZGN0Xzh4NAkJalJEOHg0CisjZGVmaW5lIGpwZWdfaWRjdF82eDMJCWpSRDZ4MworI2RlZmluZSBqcGVnX2lkY3RfNHgyCQlqUkQ0eDIKKyNkZWZpbmUganBlZ19pZGN0XzJ4MQkJalJEMngxCisjZGVmaW5lIGpwZWdfaWRjdF84eDE2CQlqUkQ4eDE2CisjZGVmaW5lIGpwZWdfaWRjdF83eDE0CQlqUkQ3eDE0CisjZGVmaW5lIGpwZWdfaWRjdF82eDEyCQlqUkQ2eDEyCisjZGVmaW5lIGpwZWdfaWRjdF81eDEwCQlqUkQ1eDEwCisjZGVmaW5lIGpwZWdfaWRjdF80eDgJCWpSRDR4OAorI2RlZmluZSBqcGVnX2lkY3RfM3g2CQlqUkQzeDgKKyNkZWZpbmUganBlZ19pZGN0XzJ4NAkJalJEMng0CisjZGVmaW5lIGpwZWdfaWRjdF8xeDIJCWpSRDF4MgogI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KIAogLyogRXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZvcndhcmQgYW5kIGludmVyc2UgRENUIHJvdXRpbmVzLiAqLwogCi1FWFRFUk4odm9pZCkganBlZ19mZGN0X2lzbG93IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZkY3RfaWZhc3QgSlBQKChEQ1RFTEVNICogZGF0YSkpOwotRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9mbG9hdCBKUFAoKEZBU1RfRkxPQVQgKiBkYXRhKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0X2lzbG93CisgICAgSlBQKChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfaWZhc3QKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9mbG9hdAorICAgIEpQUCgoRkFTVF9GTE9BVCAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0Xzd4NworICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzZ4NgorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzV4NQorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzR4NAorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzN4MworICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzJ4MgorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzF4MQorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0Xzl4OQorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzEweDEwCisgICAgSlBQKChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfMTF4MTEKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF8xMngxMgorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzEzeDEzCisgICAgSlBQKChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfMTR4MTQKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF8xNXgxNQorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzE2eDE2CisgICAgSlBQKChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfMTZ4OAorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzE0eDcKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF8xMng2CisgICAgSlBQKChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfMTB4NQorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0Xzh4NAorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzZ4MworICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzR4MgorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzJ4MQorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0Xzh4MTYKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF83eDE0CisgICAgSlBQKChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfNngxMgorICAgIEpQUCgoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0XzV4MTAKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF80eDgKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF8zeDYKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF8yeDQKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF8xeDIKKyAgICBKUFAoKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkpOwogCiBFWFRFUk4odm9pZCkganBlZ19pZGN0X2lzbG93CiAgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKQEAgLTEwNywxNSArMjQwLDk5IEBACiBFWFRFUk4odm9pZCkganBlZ19pZGN0X2Zsb2F0CiAgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKIAkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfN3g3CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfNng2CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfNXg1CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKIEVYVEVSTih2b2lkKSBqcGVnX2lkY3RfNHg0CiAgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKIAkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfM3gzCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKIEVYVEVSTih2b2lkKSBqcGVnX2lkY3RfMngyCiAgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKIAkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKIEVYVEVSTih2b2lkKSBqcGVnX2lkY3RfMXgxCiAgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKIAkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfOXg5CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfMTB4MTAKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8xMXgxMQorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzEyeDEyCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfMTN4MTMKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8xNHgxNAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzE1eDE1CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfMTZ4MTYKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8xNng4CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfMTR4NworICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzEyeDYKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8xMHg1CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfOHg0CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfNngzCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfNHgyCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfMngxCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfOHgxNgorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0Xzd4MTQKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF82eDEyCisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfNXgxMAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzR4OAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzN4NgorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzJ4NAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzF4MgorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CiAKIAogLyoKZGlmZiAtLWdpdCBhL2pkZGN0bWdyLmMgYi9qZGRjdG1nci5jCmluZGV4IGJiZjhkMGUuLmJkYmRlMzQgMTAwNjQ0Ci0tLSBhL2pkZGN0bWdyLmMKKysrIGIvamRkY3RtZ3IuYwpAQCAtOTgsMjIgKzk4LDEzNCBAQAogICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwogICAgICAgIGNpKyssIGNvbXBwdHIrKykgewogICAgIC8qIFNlbGVjdCB0aGUgcHJvcGVyIElEQ1Qgcm91dGluZSBmb3IgdGhpcyBjb21wb25lbnQncyBzY2FsaW5nICovCi0gICAgc3dpdGNoIChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIHsKKyAgICBzd2l0Y2ggKChjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSA8PCA4KSArIGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplKSB7CiAjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotICAgIGNhc2UgMToKKyAgICBjYXNlICgoMSA8PCA4KSArIDEpOgogICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xeDE7Ci0gICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCiAgICAgICBicmVhazsKLSAgICBjYXNlIDI6CisgICAgY2FzZSAoKDIgPDwgOCkgKyAyKToKICAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMngyOwotICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgorICAgIGNhc2UgKCgzIDw8IDgpICsgMyk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzN4MzsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg0IDw8IDgpICsgNCk6CiAgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzR4NDsKLSAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg1IDw8IDgpICsgNSk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzV4NTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg2IDw8IDgpICsgNik6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzZ4NjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg3IDw8IDgpICsgNyk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0Xzd4NzsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg5IDw8IDgpICsgOSk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0Xzl4OTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxMCA8PCA4KSArIDEwKToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMTB4MTA7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTEgPDwgOCkgKyAxMSk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzExeDExOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDEyIDw8IDgpICsgMTIpOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xMngxMjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxMyA8PCA4KSArIDEzKToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMTN4MTM7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTQgPDwgOCkgKyAxNCk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzE0eDE0OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDE1IDw8IDgpICsgMTUpOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xNXgxNTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxNiA8PCA4KSArIDE2KToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMTZ4MTY7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTYgPDwgOCkgKyA4KToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMTZ4ODsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgxNCA8PCA4KSArIDcpOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xNHg3OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDEyIDw8IDgpICsgNik6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzEyeDY7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoMTAgPDwgOCkgKyA1KToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMTB4NTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg4IDw8IDgpICsgNCk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0Xzh4NDsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg2IDw8IDgpICsgMyk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzZ4MzsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg0IDw8IDgpICsgMik6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzR4MjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCgyIDw8IDgpICsgMSk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzJ4MTsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg4IDw8IDgpICsgMTYpOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF84eDE2OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDcgPDwgOCkgKyAxNCk6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0Xzd4MTQ7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdGludCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlICgoNiA8PCA4KSArIDEyKToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNngxMjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0aW50IHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgKCg1IDw8IDgpICsgMTApOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF81eDEwOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDQgPDwgOCkgKyA4KToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg4OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDMgPDwgOCkgKyA2KToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfM3g2OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDIgPDwgOCkgKyA0KToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMng0OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAoKDEgPDwgOCkgKyAyKToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMXgyOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RpbnQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLwogICAgICAgYnJlYWs7CiAjZW5kaWYKLSAgICBjYXNlIERDVFNJWkU6CisgICAgY2FzZSAoKERDVFNJWkUgPDwgOCkgKyBEQ1RTSVpFKToKICAgICAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKICNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECiAgICAgICBjYXNlIEpEQ1RfSVNMT1c6CkBAIC0xMzksNyArMjUxLDggQEAKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfRENUU0laRSwgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKTsKKyAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9EQ1RTSVpFLAorCSAgICAgICBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSwgY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlkY3QtPnB1Yi5pbnZlcnNlX0RDVFtjaV0gPSBtZXRob2RfcHRyOwpkaWZmIC0tZ2l0IGEvamRodWZmLmMgYi9qZGh1ZmYuYwppbmRleCBiNWJhMzlmLi5hNWQ2NzllIDEwMDY0NAotLS0gYS9qZGh1ZmYuYworKysgYi9qZGh1ZmYuYwpAQCAtMiwxMCArMiwxMiBAQAogICogamRodWZmLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDA2LTIwMDkgYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcy4KKyAqIEJvdGggc2VxdWVudGlhbCBhbmQgcHJvZ3Jlc3NpdmUgbW9kZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIHNpbmdsZSBtb2R1bGUuCiAgKgogICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgaW5wdXQgc3VzcGVuc2lvbi4KICAqIElmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYmFjawpAQCAtMTcsNyArMTksMTczIEBACiAjZGVmaW5lIEpQRUdfSU5URVJOQUxTCiAjaW5jbHVkZSAiamluY2x1ZGUuaCIKICNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamRwaHVmZi5jICovCisKKworLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KKworI2RlZmluZSBIVUZGX0xPT0tBSEVBRAk4CS8qICMgb2YgYml0cyBvZiBsb29rYWhlYWQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBCYXNpYyB0YWJsZXM6IChlbGVtZW50IFswXSBvZiBlYWNoIGFycmF5IGlzIHVudXNlZCkgKi8KKyAgSU5UMzIgbWF4Y29kZVsxOF07CQkvKiBsYXJnZXN0IGNvZGUgb2YgbGVuZ3RoIGsgKC0xIGlmIG5vbmUpICovCisgIC8qIChtYXhjb2RlWzE3XSBpcyBhIHNlbnRpbmVsIHRvIGVuc3VyZSBqcGVnX2h1ZmZfZGVjb2RlIHRlcm1pbmF0ZXMpICovCisgIElOVDMyIHZhbG9mZnNldFsxN107CQkvKiBodWZmdmFsW10gb2Zmc2V0IGZvciBjb2RlcyBvZiBsZW5ndGggayAqLworICAvKiB2YWxvZmZzZXRba10gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBrLCBsZXNzCisgICAqIHRoZSBzbWFsbGVzdCBjb2RlIG9mIGxlbmd0aCBrOyBzbyBnaXZlbiBhIGNvZGUgb2YgbGVuZ3RoIGssIHRoZQorICAgKiBjb3JyZXNwb25kaW5nIHN5bWJvbCBpcyBodWZmdmFsW2NvZGUgKyB2YWxvZmZzZXRba11dCisgICAqLworCisgIC8qIExpbmsgdG8gcHVibGljIEh1ZmZtYW4gdGFibGUgKG5lZWRlZCBvbmx5IGluIGpwZWdfaHVmZl9kZWNvZGUpICovCisgIEpIVUZGX1RCTCAqcHViOworCisgIC8qIExvb2thaGVhZCB0YWJsZXM6IGluZGV4ZWQgYnkgdGhlIG5leHQgSFVGRl9MT09LQUhFQUQgYml0cyBvZgorICAgKiB0aGUgaW5wdXQgZGF0YSBzdHJlYW0uICBJZiB0aGUgbmV4dCBIdWZmbWFuIGNvZGUgaXMgbm8gbW9yZQorICAgKiB0aGFuIEhVRkZfTE9PS0FIRUFEIGJpdHMgbG9uZywgd2UgY2FuIG9idGFpbiBpdHMgbGVuZ3RoIGFuZAorICAgKiB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2wgZGlyZWN0bHkgZnJvbSB0aGVzZSB0YWJsZXMuCisgICAqLworICBpbnQgbG9va19uYml0c1sxPDxIVUZGX0xPT0tBSEVBRF07IC8qICMgYml0cywgb3IgMCBpZiB0b28gbG9uZyAqLworICBVSU5UOCBsb29rX3N5bVsxPDxIVUZGX0xPT0tBSEVBRF07IC8qIHN5bWJvbCwgb3IgdW51c2VkICovCit9IGRfZGVyaXZlZF90Ymw7CisKKworLyoKKyAqIEZldGNoaW5nIHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaXMgYSB0aW1lLWNyaXRpY2FsIG9wZXJhdGlvbgorICogZm9yIHRoZSBIdWZmbWFuIGRlY29kZXJzLiAgV2UgaW1wbGVtZW50IGl0IHdpdGggYSBjb21iaW5hdGlvbiBvZiBpbmxpbmUKKyAqIG1hY3JvcyBhbmQgb3V0LW9mLWxpbmUgc3Vicm91dGluZXMuICBOb3RlIHRoYXQgTiAodGhlIG51bWJlciBvZiBiaXRzCisgKiBkZW1hbmRlZCBhdCBvbmUgdGltZSkgbmV2ZXIgZXhjZWVkcyAxNSBmb3IgSlBFRyB1c2UuCisgKgorICogV2UgcmVhZCBzb3VyY2UgYnl0ZXMgaW50byBnZXRfYnVmZmVyIGFuZCBkb2xlIG91dCBiaXRzIGFzIG5lZWRlZC4KKyAqIElmIGdldF9idWZmZXIgYWxyZWFkeSBjb250YWlucyBlbm91Z2ggYml0cywgdGhleSBhcmUgZmV0Y2hlZCBpbi1saW5lCisgKiBieSB0aGUgbWFjcm9zIENIRUNLX0JJVF9CVUZGRVIgYW5kIEdFVF9CSVRTLiAgV2hlbiB0aGVyZSBhcmVuJ3QgZW5vdWdoCisgKiBiaXRzLCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBpcyBjYWxsZWQ7IGl0IHdpbGwgYXR0ZW1wdCB0byBmaWxsIGdldF9idWZmZXIKKyAqIGFzIGZ1bGwgYXMgcG9zc2libGUgKG5vdCBqdXN0IHRvIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQ7IHRoaXMKKyAqIHByZWZldGNoaW5nIHJlZHVjZXMgdGhlIG92ZXJoZWFkIGNvc3Qgb2YgY2FsbGluZyBqcGVnX2ZpbGxfYml0X2J1ZmZlcikuCisgKiBOb3RlIHRoYXQganBlZ19maWxsX2JpdF9idWZmZXIgbWF5IHJldHVybiBGQUxTRSB0byBpbmRpY2F0ZSBzdXNwZW5zaW9uLgorICogT24gVFJVRSByZXR1cm4sIGpwZWdfZmlsbF9iaXRfYnVmZmVyIGd1YXJhbnRlZXMgdGhhdCBnZXRfYnVmZmVyIGNvbnRhaW5zCisgKiBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBiaXRzIC0tLSBkdW1teSB6ZXJvZXMgYXJlIGluc2VydGVkIGlmCisgKiBuZWNlc3NhcnkuCisgKi8KKwordHlwZWRlZiBJTlQzMiBiaXRfYnVmX3R5cGU7CS8qIHR5cGUgb2YgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCisjZGVmaW5lIEJJVF9CVUZfU0laRSAgMzIJLyogc2l6ZSBvZiBidWZmZXIgaW4gYml0cyAqLworCisvKiBJZiBsb25nIGlzID4gMzIgYml0cyBvbiB5b3VyIG1hY2hpbmUsIGFuZCBzaGlmdGluZy9tYXNraW5nIGxvbmdzIGlzCisgKiByZWFzb25hYmx5IGZhc3QsIG1ha2luZyBiaXRfYnVmX3R5cGUgYmUgbG9uZyBhbmQgc2V0dGluZyBCSVRfQlVGX1NJWkUKKyAqIGFwcHJvcHJpYXRlbHkgc2hvdWxkIGJlIGEgd2luLiAgVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBkZWZpbmUgdGhlIHNpemUKKyAqIHdpdGggc29tZXRoaW5nIGxpa2UgICNkZWZpbmUgQklUX0JVRl9TSVpFIChzaXplb2YoYml0X2J1Zl90eXBlKSo4KQorICogYmVjYXVzZSBub3QgYWxsIG1hY2hpbmVzIG1lYXN1cmUgc2l6ZW9mIGluIDgtYml0IGJ5dGVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsJCS8qIEJpdHJlYWRpbmcgc3RhdGUgc2F2ZWQgYWNyb3NzIE1DVXMgKi8KKyAgYml0X2J1Zl90eXBlIGdldF9idWZmZXI7CS8qIGN1cnJlbnQgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCisgIGludCBiaXRzX2xlZnQ7CQkvKiAjIG9mIHVudXNlZCBiaXRzIGluIGl0ICovCit9IGJpdHJlYWRfcGVybV9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogQml0cmVhZGluZyB3b3JraW5nIHN0YXRlIHdpdGhpbiBhbiBNQ1UgKi8KKyAgLyogQ3VycmVudCBkYXRhIHNvdXJjZSBsb2NhdGlvbiAqLworICAvKiBXZSBuZWVkIGEgY29weSwgcmF0aGVyIHRoYW4gbXVuZ2luZyB0aGUgb3JpZ2luYWwsIGluIGNhc2Ugb2Ygc3VzcGVuc2lvbiAqLworICBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gc291cmNlICovCisgIHNpemVfdCBieXRlc19pbl9idWZmZXI7CS8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHNvdXJjZSBidWZmZXIgKi8KKyAgLyogQml0IGlucHV0IGJ1ZmZlciAtLS0gbm90ZSB0aGVzZSB2YWx1ZXMgYXJlIGtlcHQgaW4gcmVnaXN0ZXIgdmFyaWFibGVzLAorICAgKiBub3QgaW4gdGhpcyBzdHJ1Y3QsIGluc2lkZSB0aGUgaW5uZXIgbG9vcHMuCisgICAqLworICBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsJLyogY3VycmVudCBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KKyAgaW50IGJpdHNfbGVmdDsJCS8qICMgb2YgdW51c2VkIGJpdHMgaW4gaXQgKi8KKyAgLyogUG9pbnRlciBuZWVkZWQgYnkganBlZ19maWxsX2JpdF9idWZmZXIuICovCisgIGpfZGVjb21wcmVzc19wdHIgY2luZm87CS8qIGJhY2sgbGluayB0byBkZWNvbXByZXNzIG1hc3RlciByZWNvcmQgKi8KK30gYml0cmVhZF93b3JraW5nX3N0YXRlOworCisvKiBNYWNyb3MgdG8gZGVjbGFyZSBhbmQgbG9hZC9zYXZlIGJpdHJlYWQgbG9jYWwgdmFyaWFibGVzLiAqLworI2RlZmluZSBCSVRSRUFEX1NUQVRFX1ZBUlMgIFwKKwlyZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsgIFwKKwlyZWdpc3RlciBpbnQgYml0c19sZWZ0OyAgXAorCWJpdHJlYWRfd29ya2luZ19zdGF0ZSBicl9zdGF0ZQorCisjZGVmaW5lIEJJVFJFQURfTE9BRF9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAorCWJyX3N0YXRlLmNpbmZvID0gY2luZm9wOyBcCisJYnJfc3RhdGUubmV4dF9pbnB1dF9ieXRlID0gY2luZm9wLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsgXAorCWJyX3N0YXRlLmJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvcC0+c3JjLT5ieXRlc19pbl9idWZmZXI7IFwKKwlnZXRfYnVmZmVyID0gcGVybXN0YXRlLmdldF9idWZmZXI7IFwKKwliaXRzX2xlZnQgPSBwZXJtc3RhdGUuYml0c19sZWZ0OworCisjZGVmaW5lIEJJVFJFQURfU0FWRV9TVEFURShjaW5mb3AscGVybXN0YXRlKSAgXAorCWNpbmZvcC0+c3JjLT5uZXh0X2lucHV0X2J5dGUgPSBicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGU7IFwKKwljaW5mb3AtPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyOyBcCisJcGVybXN0YXRlLmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOyBcCisJcGVybXN0YXRlLmJpdHNfbGVmdCA9IGJpdHNfbGVmdAorCisvKgorICogVGhlc2UgbWFjcm9zIHByb3ZpZGUgdGhlIGluLWxpbmUgcG9ydGlvbiBvZiBiaXQgZmV0Y2hpbmcuCisgKiBVc2UgQ0hFQ0tfQklUX0JVRkZFUiB0byBlbnN1cmUgdGhlcmUgYXJlIE4gYml0cyBpbiBnZXRfYnVmZmVyCisgKiBiZWZvcmUgdXNpbmcgR0VUX0JJVFMsIFBFRUtfQklUUywgb3IgRFJPUF9CSVRTLgorICogVGhlIHZhcmlhYmxlcyBnZXRfYnVmZmVyIGFuZCBiaXRzX2xlZnQgYXJlIGFzc3VtZWQgdG8gYmUgbG9jYWxzLAorICogYnV0IHRoZSBzdGF0ZSBzdHJ1Y3QgbWlnaHQgbm90IGJlIChqcGVnX2h1ZmZfZGVjb2RlIG5lZWRzIHRoaXMpLgorICoJQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuLGFjdGlvbik7CisgKgkJRW5zdXJlIHRoZXJlIGFyZSBOIGJpdHMgaW4gZ2V0X2J1ZmZlcjsgaWYgc3VzcGVuZCwgdGFrZSBhY3Rpb24uCisgKiAgICAgIHZhbCA9IEdFVF9CSVRTKG4pOworICoJCUZldGNoIG5leHQgTiBiaXRzLgorICogICAgICB2YWwgPSBQRUVLX0JJVFMobik7CisgKgkJRmV0Y2ggbmV4dCBOIGJpdHMgd2l0aG91dCByZW1vdmluZyB0aGVtIGZyb20gdGhlIGJ1ZmZlci4KKyAqCURST1BfQklUUyhuKTsKKyAqCQlEaXNjYXJkIG5leHQgTiBiaXRzLgorICogVGhlIHZhbHVlIE4gc2hvdWxkIGJlIGEgc2ltcGxlIHZhcmlhYmxlLCBub3QgYW4gZXhwcmVzc2lvbiwgYmVjYXVzZSBpdAorICogaXMgZXZhbHVhdGVkIG11bHRpcGxlIHRpbWVzLgorICovCisKKyNkZWZpbmUgQ0hFQ0tfQklUX0JVRkZFUihzdGF0ZSxuYml0cyxhY3Rpb24pIFwKKwl7IGlmIChiaXRzX2xlZnQgPCAobmJpdHMpKSB7ICBcCisJICAgIGlmICghIGpwZWdfZmlsbF9iaXRfYnVmZmVyKCYoc3RhdGUpLGdldF9idWZmZXIsYml0c19sZWZ0LG5iaXRzKSkgIFwKKwkgICAgICB7IGFjdGlvbjsgfSAgXAorCSAgICBnZXRfYnVmZmVyID0gKHN0YXRlKS5nZXRfYnVmZmVyOyBiaXRzX2xlZnQgPSAoc3RhdGUpLmJpdHNfbGVmdDsgfSB9CisKKyNkZWZpbmUgR0VUX0JJVFMobmJpdHMpIFwKKwkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLT0gKG5iaXRzKSkpKSAmIEJJVF9NQVNLKG5iaXRzKSkKKworI2RlZmluZSBQRUVLX0JJVFMobmJpdHMpIFwKKwkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLSAgKG5iaXRzKSkpKSAmIEJJVF9NQVNLKG5iaXRzKSkKKworI2RlZmluZSBEUk9QX0JJVFMobmJpdHMpIFwKKwkoYml0c19sZWZ0IC09IChuYml0cykpCisKKworLyoKKyAqIENvZGUgZm9yIGV4dHJhY3RpbmcgbmV4dCBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmcm9tIGlucHV0IGJpdCBzdHJlYW0uCisgKiBBZ2FpbiwgdGhpcyBpcyB0aW1lLWNyaXRpY2FsIGFuZCB3ZSBtYWtlIHRoZSBtYWluIHBhdGhzIGJlIG1hY3Jvcy4KKyAqCisgKiBXZSB1c2UgYSBsb29rYWhlYWQgdGFibGUgdG8gcHJvY2VzcyBjb2RlcyBvZiB1cCB0byBIVUZGX0xPT0tBSEVBRCBiaXRzCisgKiB3aXRob3V0IGxvb3BpbmcuICBVc3VhbGx5LCBtb3JlIHRoYW4gOTUlIG9mIHRoZSBIdWZmbWFuIGNvZGVzIHdpbGwgYmUgOAorICogb3IgZmV3ZXIgYml0cyBsb25nLiAgVGhlIGZldyBvdmVybGVuZ3RoIGNvZGVzIGFyZSBoYW5kbGVkIHdpdGggYSBsb29wLAorICogd2hpY2ggbmVlZCBub3QgYmUgaW5saW5lIGNvZGUuCisgKgorICogTm90ZXMgYWJvdXQgdGhlIEhVRkZfREVDT0RFIG1hY3JvOgorICogMS4gTmVhciB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlZ21lbnQsIHdlIG1heSBmYWlsIHRvIGdldCBlbm91Z2ggYml0cworICogICAgZm9yIGEgbG9va2FoZWFkLiAgSW4gdGhhdCBjYXNlLCB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkuCisgKiAyLiBJZiB0aGUgbG9va2FoZWFkIHRhYmxlIGNvbnRhaW5zIG5vIGVudHJ5LCB0aGUgbmV4dCBjb2RlIG11c3QgYmUKKyAqICAgIG1vcmUgdGhhbiBIVUZGX0xPT0tBSEVBRCBiaXRzIGxvbmcuCisgKiAzLiBqcGVnX2h1ZmZfZGVjb2RlIHJldHVybnMgLTEgaWYgZm9yY2VkIHRvIHN1c3BlbmQuCisgKi8KKworI2RlZmluZSBIVUZGX0RFQ09ERShyZXN1bHQsc3RhdGUsaHRibCxmYWlsYWN0aW9uLHNsb3dsYWJlbCkgXAoreyByZWdpc3RlciBpbnQgbmIsIGxvb2s7IFwKKyAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKKyAgICBpZiAoISBqcGVnX2ZpbGxfYml0X2J1ZmZlcigmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsIDApKSB7ZmFpbGFjdGlvbjt9IFwKKyAgICBnZXRfYnVmZmVyID0gc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gc3RhdGUuYml0c19sZWZ0OyBcCisgICAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKKyAgICAgIG5iID0gMTsgZ290byBzbG93bGFiZWw7IFwKKyAgICB9IFwKKyAgfSBcCisgIGxvb2sgPSBQRUVLX0JJVFMoSFVGRl9MT09LQUhFQUQpOyBcCisgIGlmICgobmIgPSBodGJsLT5sb29rX25iaXRzW2xvb2tdKSAhPSAwKSB7IFwKKyAgICBEUk9QX0JJVFMobmIpOyBcCisgICAgcmVzdWx0ID0gaHRibC0+bG9va19zeW1bbG9va107IFwKKyAgfSBlbHNlIHsgXAorICAgIG5iID0gSFVGRl9MT09LQUhFQUQrMTsgXAorc2xvd2xhYmVsOiBcCisgICAgaWYgKChyZXN1bHQ9anBlZ19odWZmX2RlY29kZSgmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsaHRibCxuYikpIDwgMCkgXAorCXsgZmFpbGFjdGlvbjsgfSBcCisgICAgZ2V0X2J1ZmZlciA9IHN0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IHN0YXRlLmJpdHNfbGVmdDsgXAorICB9IFwKK30KIAogCiAvKgpAQCAtMjgsNyArMTk2LDggQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgdW5zaWduZWQgaW50IEVPQlJVTjsJCQkvKiByZW1haW5pbmcgRU9CcyBpbiBFT0JSVU4gKi8KKyAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsJLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLwogfSBzYXZhYmxlX3N0YXRlOwogCiAvKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCkBAIC00MSw3ICsyMTAsOCBAQAogI2Vsc2UKICNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0CiAjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKLQkoKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKKwkoKGRlc3QpLkVPQlJVTiA9IChzcmMpLkVPQlJVTiwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAogCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAogCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAogCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKQEAgLTYxLDYgKzIzMSwxNSBAQAogICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLwogICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KIAorICAvKiBGb2xsb3dpbmcgdHdvIGZpZWxkcyB1c2VkIG9ubHkgaW4gcHJvZ3Jlc3NpdmUgbW9kZSAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCisgIGRfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsOyAvKiBhY3RpdmUgdGFibGUgZHVyaW5nIGFuIEFDIHNjYW4gKi8KKworICAvKiBGb2xsb3dpbmcgZmllbGRzIHVzZWQgb25seSBpbiBzZXF1ZW50aWFsIG1vZGUgKi8KKwogICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLwogICBkX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwogICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwpAQCAtNzEsODEgKzI1MCwzMCBAQAogICBkX2Rlcml2ZWRfdGJsICogZGNfY3VyX3RibHNbRF9NQVhfQkxPQ0tTX0lOX01DVV07CiAgIGRfZGVyaXZlZF90YmwgKiBhY19jdXJfdGJsc1tEX01BWF9CTE9DS1NfSU5fTUNVXTsKICAgLyogV2hldGhlciB3ZSBjYXJlIGFib3V0IHRoZSBEQyBhbmQgQUMgY29lZmZpY2llbnQgdmFsdWVzIGZvciBlYWNoIGJsb2NrICovCi0gIGJvb2xlYW4gZGNfbmVlZGVkW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBib29sZWFuIGFjX25lZWRlZFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgaW50IGNvZWZfbGltaXRbRF9NQVhfQkxPQ0tTX0lOX01DVV07CiB9IGh1ZmZfZW50cm9weV9kZWNvZGVyOwogCiB0eXBlZGVmIGh1ZmZfZW50cm9weV9kZWNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKIAogCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaSwgYmxrbiwgZGN0YmwsIGFjdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbCBhcmUgT0sgZm9yIHNlcXVlbnRpYWwgSlBFRy4KLSAgICogVGhpcyBvdWdodCB0byBiZSBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCB3ZSBtYWtlIGl0IGEgd2FybmluZyBiZWNhdXNlCi0gICAqIHRoZXJlIGFyZSBzb21lIGJhc2VsaW5lIGZpbGVzIG91dCB0aGVyZSB3aXRoIGFsbCB6ZXJvZXMgaW4gdGhlc2UgYnl0ZXMuCi0gICAqLwotICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPlNlICE9IERDVFNJWkUyLTEgfHwKLSAgICAgIGNpbmZvLT5BaCAhPSAwIHx8IGNpbmZvLT5BbCAhPSAwKQotICAgIFdBUk5NUyhjaW5mbywgSldSTl9OT1RfU0VRVUVOVElBTCk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCi0gICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KLSAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCi0JCQkgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKLSAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAotCQkJICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7Ci0gICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgfQotCi0gIC8qIFByZWNhbGN1bGF0ZSBkZWNvZGluZyBpbmZvIGZvciBlYWNoIGJsb2NrIGluIGFuIE1DVSBvZiB0aGlzIHNjYW4gKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIFByZWNhbGN1bGF0ZSB3aGljaCB0YWJsZSB0byB1c2UgZm9yIGVhY2ggYmxvY2sgKi8KLSAgICBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOwotICAgIGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub107Ci0gICAgLyogRGVjaWRlIHdoZXRoZXIgd2UgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyAqLwotICAgIGlmIChjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7Ci0gICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBUUlVFOwotICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgQUNzIGlmIHByb2R1Y2luZyBhIDEvOHRoLXNpemUgaW1hZ2UgKi8KLSAgICAgIGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPiAxKTsKLSAgICB9IGVsc2UgewotICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gRkFMU0U7Ci0gICAgfQotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KLSAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLX0KK3N0YXRpYyBjb25zdCBpbnQganBlZ196aWd6YWdfb3JkZXJbOF1bOF0gPSB7CisgIHsgIDAsICAxLCAgNSwgIDYsIDE0LCAxNSwgMjcsIDI4IH0sCisgIHsgIDIsICA0LCAgNywgMTMsIDE2LCAyNiwgMjksIDQyIH0sCisgIHsgIDMsICA4LCAxMiwgMTcsIDI1LCAzMCwgNDEsIDQzIH0sCisgIHsgIDksIDExLCAxOCwgMjQsIDMxLCA0MCwgNDQsIDUzIH0sCisgIHsgMTAsIDE5LCAyMywgMzIsIDM5LCA0NSwgNTIsIDU0IH0sCisgIHsgMjAsIDIyLCAzMywgMzgsIDQ2LCA1MSwgNTUsIDYwIH0sCisgIHsgMjEsIDM0LCAzNywgNDcsIDUwLCA1NiwgNTksIDYxIH0sCisgIHsgMzUsIDM2LCA0OCwgNDksIDU3LCA1OCwgNjIsIDYzIH0KK307CiAKIAogLyoKICAqIENvbXB1dGUgdGhlIGRlcml2ZWQgdmFsdWVzIGZvciBhIEh1ZmZtYW4gdGFibGUuCiAgKiBUaGlzIHJvdXRpbmUgYWxzbyBwZXJmb3JtcyBzb21lIHZhbGlkYXRpb24gY2hlY2tzIG9uIHRoZSB0YWJsZS4KLSAqCi0gKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpkcGh1ZmYuYy4KICAqLwogCi1HTE9CQUwodm9pZCkKK0xPQ0FMKHZvaWQpCiBqcGVnX21ha2VfZF9kZXJpdmVkX3RibCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCiAJCQkgZF9kZXJpdmVkX3RibCAqKiBwZHRibCkKIHsKQEAgLTI2Nyw4ICszOTUsNyBAQAogCiAKIC8qCi0gKiBPdXQtb2YtbGluZSBjb2RlIGZvciBiaXQgZmV0Y2hpbmcgKHNoYXJlZCB3aXRoIGpkcGh1ZmYuYykuCi0gKiBTZWUgamRodWZmLmggZm9yIGluZm8gYWJvdXQgdXNhZ2UuCisgKiBPdXQtb2YtbGluZSBjb2RlIGZvciBiaXQgZmV0Y2hpbmcuCiAgKiBOb3RlOiBjdXJyZW50IHZhbHVlcyBvZiBnZXRfYnVmZmVyIGFuZCBiaXRzX2xlZnQgYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzLAogICogYnV0IGFyZSByZXR1cm5lZCBpbiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgb2YgdGhlIHN0YXRlIHN0cnVjdC4KICAqCkBAIC0yODgsNyArNDE1LDcgQEAKICNlbmRpZgogCiAKLUdMT0JBTChib29sZWFuKQorTE9DQUwoYm9vbGVhbikKIGpwZWdfZmlsbF9iaXRfYnVmZmVyIChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwKIAkJICAgICAgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsCiAJCSAgICAgIGludCBuYml0cykKQEAgLTM5MCwxMSArNTE3LDMyIEBACiAKIAogLyoKLSAqIE91dC1vZi1saW5lIGNvZGUgZm9yIEh1ZmZtYW4gY29kZSBkZWNvZGluZy4KLSAqIFNlZSBqZGh1ZmYuaCBmb3IgaW5mbyBhYm91dCB1c2FnZS4KKyAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCisgKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBzdWIgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KICAqLwogCi1HTE9CQUwoaW50KQorI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEJJVF9NQVNLKG5iaXRzKSAgICgoMTw8KG5iaXRzKSktMSkKKyNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSAtICgoMTw8KHMpKS0xKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBCSVRfTUFTSyhuYml0cykgICBibWFza1tuYml0c10KKyNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8PSBibWFza1socykgLSAxXSA/ICh4KSAtIGJtYXNrW3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGJtYXNrWzE2XSA9CS8qIGJtYXNrW25dIGlzIG1hc2sgZm9yIG4gcmlnaHRtb3N0IGJpdHMgKi8KKyAgeyAwLCAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMEYsIDB4MDAxRiwgMHgwMDNGLCAweDAwN0YsIDB4MDBGRiwKKyAgICAweDAxRkYsIDB4MDNGRiwgMHgwN0ZGLCAweDBGRkYsIDB4MUZGRiwgMHgzRkZGLCAweDdGRkYgfTsKKworI2VuZGlmIC8qIEFWT0lEX1RBQkxFUyAqLworCisKKy8qCisgKiBPdXQtb2YtbGluZSBjb2RlIGZvciBIdWZmbWFuIGNvZGUgZGVjb2RpbmcuCisgKi8KKworTE9DQUwoaW50KQoganBlZ19odWZmX2RlY29kZSAoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsCiAJCSAgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsIHJlZ2lzdGVyIGludCBiaXRzX2xlZnQsCiAJCSAgZF9kZXJpdmVkX3RibCAqIGh0YmwsIGludCBtaW5fYml0cykKQEAgLTQzNCwzMiArNTgyLDYgQEAKIAogCiAvKgotICogRmlndXJlIEYuMTI6IGV4dGVuZCBzaWduIGJpdC4KLSAqIE9uIHNvbWUgbWFjaGluZXMsIGEgc2hpZnQgYW5kIGFkZCB3aWxsIGJlIGZhc3RlciB0aGFuIGEgdGFibGUgbG9va3VwLgotICovCi0KLSNpZmRlZiBBVk9JRF9UQUJMRVMKLQotI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgKDE8PCgocyktMSkpID8gKHgpICsgKCgoLTEpPDwocykpICsgMSkgOiAoeCkpCi0KLSNlbHNlCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8IGV4dGVuZF90ZXN0W3NdID8gKHgpICsgZXh0ZW5kX29mZnNldFtzXSA6ICh4KSkKLQotc3RhdGljIGNvbnN0IGludCBleHRlbmRfdGVzdFsxNl0gPSAgIC8qIGVudHJ5IG4gaXMgMioqKG4tMSkgKi8KLSAgeyAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKLSAgICAweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAgfTsKLQotc3RhdGljIGNvbnN0IGludCBleHRlbmRfb2Zmc2V0WzE2XSA9IC8qIGVudHJ5IG4gaXMgKC0xIDw8IG4pICsgMSAqLwotICB7IDAsICgoLTEpPDwxKSArIDEsICgoLTEpPDwyKSArIDEsICgoLTEpPDwzKSArIDEsICgoLTEpPDw0KSArIDEsCi0gICAgKCgtMSk8PDUpICsgMSwgKCgtMSk8PDYpICsgMSwgKCgtMSk8PDcpICsgMSwgKCgtMSk8PDgpICsgMSwKLSAgICAoKC0xKTw8OSkgKyAxLCAoKC0xKTw8MTApICsgMSwgKCgtMSk8PDExKSArIDEsICgoLTEpPDwxMikgKyAxLAotICAgICgoLTEpPDwxMykgKyAxLCAoKC0xKTw8MTQpICsgMSwgKCgtMSk8PDE1KSArIDEgfTsKLQotI2VuZGlmIC8qIEFWT0lEX1RBQkxFUyAqLwotCi0KLS8qCiAgKiBDaGVjayBmb3IgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgZGVjb2Rlci4KICAqIFJldHVybnMgRkFMU0UgaWYgbXVzdCBzdXNwZW5kLgogICovCkBAIC00ODIsNiArNjA0LDggQEAKICAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCiAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQogICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIC8qIFJlLWluaXQgRU9CIHJ1biBjb3VudCwgdG9vICovCisgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IDA7CiAKICAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCiAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CkBAIC00OTksMTggKzYyMywzODEgQEAKIAogCiAvKgotICogRGVjb2RlIGFuZCByZXR1cm4gb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKiBIdWZmbWFuIE1DVSBkZWNvZGluZy4KKyAqIEVhY2ggb2YgdGhlc2Ugcm91dGluZXMgZGVjb2RlcyBhbmQgcmV0dXJucyBvbmUgTUNVJ3Mgd29ydGggb2YKKyAqIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuIAogICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKICAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgogICoKICAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKLSAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBIQVMgQkVFTiBaRVJPRUQgQlkgVEhFIENBTExFUi4KKyAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBJUyBJTklUSUFMTFkgWkVST0VEIEJZIFRIRSBDQUxMRVIuCiAgKiAoV2hvbGVzYWxlIHplcm9pbmcgaXMgdXN1YWxseSBhIGxpdHRsZSBmYXN0ZXIgdGhhbiByZXRhaWwuLi4pCiAgKgotICogUmV0dXJucyBGQUxTRSBpZiBkYXRhIHNvdXJjZSByZXF1ZXN0ZWQgc3VzcGVuc2lvbi4gIEluIHRoYXQgY2FzZSBubworICogV2UgcmV0dXJuIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCiAgKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0CiAgKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKLSAqIHRoaXMgbW9kdWxlLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuKQorICogc3BlY3RyYWwgc2VsZWN0aW9uLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuCisgKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBoYXMgdG8gYmUgbW9yZSBjYXJlZnVsLCBob3dldmVyLikKKyAqLworCisvKgorICogTUNVIGRlY29kaW5nIGZvciBEQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCisgKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitkZWNvZGVfbWN1X0RDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgcmVnaXN0ZXIgaW50IHMsIHI7CisgIGludCBibGtuLCBjaTsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIHNhdmFibGVfc3RhdGUgc3RhdGU7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworCisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKKworICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KKworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworICAgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub107CisKKyAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOworICAgICAgaWYgKHMpIHsKKwlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCXIgPSBHRVRfQklUUyhzKTsKKwlzID0gSFVGRl9FWFRFTkQociwgcyk7CisgICAgICB9CisKKyAgICAgIC8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworICAgICAgcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07CisgICAgICBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworICAgICAgLyogU2NhbGUgYW5kIG91dHB1dCB0aGUgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdPTApICovCisgICAgICAoKmJsb2NrKVswXSA9IChKQ09FRikgKHMgPDwgQWwpOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7CisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9BQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgcmVnaXN0ZXIgaW50IHMsIGssIHI7CisgIHVuc2lnbmVkIGludCBFT0JSVU47CisgIEpCTE9DS1JPVyBibG9jazsKKyAgQklUUkVBRF9TVEFURV9WQVJTOworICBkX2Rlcml2ZWRfdGJsICogdGJsOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworCisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlLgorICAgICAqIFdlIGNhbiBhdm9pZCBsb2FkaW5nL3NhdmluZyBiaXRyZWFkIHN0YXRlIGlmIGluIGFuIEVPQiBydW4uCisgICAgICovCisgICAgRU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOwkvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworCisgICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KKworICAgIGlmIChFT0JSVU4gPiAwKQkJLyogaWYgaXQncyBhIGJhbmQgb2YgemVyb2VzLi4uICovCisgICAgICBFT0JSVU4tLTsJCQkvKiAuLi5wcm9jZXNzIGl0IG5vdyAod2UgZG8gbm90aGluZykgKi8KKyAgICBlbHNlIHsKKyAgICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgICBibG9jayA9IE1DVV9kYXRhWzBdOworICAgICAgdGJsID0gZW50cm9weS0+YWNfZGVyaXZlZF90Ymw7CisKKyAgICAgIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7CisJSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDIpOworCXIgPSBzID4+IDQ7CisJcyAmPSAxNTsKKwlpZiAocykgeworCSAgayArPSByOworCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwkgIHIgPSBHRVRfQklUUyhzKTsKKwkgIHMgPSBIVUZGX0VYVEVORChyLCBzKTsKKwkgIC8qIFNjYWxlIGFuZCBvdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyICovCisJICAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dID0gKEpDT0VGKSAocyA8PCBBbCk7CisJfSBlbHNlIHsKKwkgIGlmIChyID09IDE1KSB7CS8qIFpSTCAqLworCSAgICBrICs9IDE1OwkJLyogc2tpcCAxNSB6ZXJvZXMgaW4gYmFuZCAqLworCSAgfSBlbHNlIHsJCS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLworCSAgICBFT0JSVU4gPSAxIDw8IHI7CisJICAgIGlmIChyKSB7CQkvKiBFT0JyLCByID4gMCAqLworCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHIsIHJldHVybiBGQUxTRSk7CisJICAgICAgciA9IEdFVF9CSVRTKHIpOworCSAgICAgIEVPQlJVTiArPSByOworCSAgICB9CisJICAgIEVPQlJVTi0tOwkJLyogdGhpcyBiYW5kIGlzIHByb2Nlc3NlZCBhdCB0aGlzIG1vbWVudCAqLworCSAgICBicmVhazsJCS8qIGZvcmNlIGVuZC1vZi1iYW5kICovCisJICB9CisJfQorICAgICAgfQorCisgICAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IEVPQlJVTjsJLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KKyAgfQorCisgIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGRlY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKKyAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2RlY29kZV9tY3VfRENfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KKyAgaW50IGJsa247CisgIEpCTE9DS1JPVyBibG9jazsKKyAgQklUUkVBRF9TVEFURV9WQVJTOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBOb3Qgd29ydGggdGhlIGN5Y2xlcyB0byBjaGVjayBpbnN1ZmZpY2llbnRfZGF0YSBoZXJlLAorICAgKiBzaW5jZSB3ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIGRhdGEgYW55d2F5IGlmIHdlIHJlYWQgemVyb2VzLgorICAgKi8KKworICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKworICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCisKKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworCisgICAgLyogRW5jb2RlZCBkYXRhIGlzIHNpbXBseSB0aGUgbmV4dCBiaXQgb2YgdGhlIHR3bydzLWNvbXBsZW1lbnQgREMgdmFsdWUgKi8KKyAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCByZXR1cm4gRkFMU0UpOworICAgIGlmIChHRVRfQklUUygxKSkKKyAgICAgICgqYmxvY2spWzBdIHw9IHAxOworICAgIC8qIE5vdGU6IHNpbmNlIHdlIHVzZSB8PSwgcmVwZWF0aW5nIHRoZSBhc3NpZ25tZW50IGxhdGVyIGlzIHNhZmUgKi8KKyAgfQorCisgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworCisgIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGRlY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9BQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7ICAgCisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBtMSA9ICgtMSkgPDwgY2luZm8tPkFsOwkvKiAtMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIHJlZ2lzdGVyIGludCBzLCBrLCByOworICB1bnNpZ25lZCBpbnQgRU9CUlVOOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEpDT0VGUFRSIHRoaXNjb2VmOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGludCBudW1fbmV3bno7CisgIGludCBuZXduel9wb3NbRENUU0laRTJdOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGRvbid0IG1vZGlmeSB0aGUgTUNVLgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsgLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KKworICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCisgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKyAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgIC8qIElmIHdlIGFyZSBmb3JjZWQgdG8gc3VzcGVuZCwgd2UgbXVzdCB1bmRvIHRoZSBhc3NpZ25tZW50cyB0byBhbnkgbmV3bHkKKyAgICAgKiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2ssIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlJ2QgZ2V0IGNvbmZ1c2VkCisgICAgICogbmV4dCB0aW1lIGFib3V0IHdoaWNoIGNvZWZmaWNpZW50cyB3ZXJlIGFscmVhZHkgbm9uemVyby4KKyAgICAgKiBCdXQgd2UgbmVlZCBub3QgdW5kbyBhZGRpdGlvbiBvZiBiaXRzIHRvIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudHM7CisgICAgICogaW5zdGVhZCwgd2UgY2FuIHRlc3QgdGhlIGN1cnJlbnQgYml0IHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGRpZCBpdC4KKyAgICAgKi8KKyAgICBudW1fbmV3bnogPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBjb2VmZmljaWVudCBsb29wIGNvdW50ZXIgdG8gc3RhcnQgb2YgYmFuZCAqLworICAgIGsgPSBjaW5mby0+U3M7CisKKyAgICBpZiAoRU9CUlVOID09IDApIHsKKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCBnb3RvIHVuZG9pdCwgbGFiZWwzKTsKKwlyID0gcyA+PiA0OworCXMgJj0gMTU7CisJaWYgKHMpIHsKKwkgIGlmIChzICE9IDEpCQkvKiBzaXplIG9mIG5ldyBjb2VmIHNob3VsZCBhbHdheXMgYmUgMSAqLworCSAgICBXQVJOTVMoY2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7CisJICBpZiAoR0VUX0JJVFMoMSkpCisJICAgIHMgPSBwMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBwb3NpdGl2ZSAqLworCSAgZWxzZQorCSAgICBzID0gbTE7CQkvKiBuZXdseSBub256ZXJvIGNvZWYgaXMgbmVnYXRpdmUgKi8KKwl9IGVsc2UgeworCSAgaWYgKHIgIT0gMTUpIHsKKwkgICAgRU9CUlVOID0gMSA8PCByOwkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KKwkgICAgaWYgKHIpIHsKKwkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCBnb3RvIHVuZG9pdCk7CisJICAgICAgciA9IEdFVF9CSVRTKHIpOworCSAgICAgIEVPQlJVTiArPSByOworCSAgICB9CisJICAgIGJyZWFrOwkJLyogcmVzdCBvZiBibG9jayBpcyBoYW5kbGVkIGJ5IEVPQiBsb2dpYyAqLworCSAgfQorCSAgLyogbm90ZSBzID0gMCBmb3IgcHJvY2Vzc2luZyBaUkwgKi8KKwl9CisJLyogQWR2YW5jZSBvdmVyIGFscmVhZHktbm9uemVybyBjb2VmcyBhbmQgciBzdGlsbC16ZXJvIGNvZWZzLAorCSAqIGFwcGVuZGluZyBjb3JyZWN0aW9uIGJpdHMgdG8gdGhlIG5vbnplcm9lcy4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQorCSAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisJICovCisJZG8geworCSAgdGhpc2NvZWYgPSAqYmxvY2sgKyBqcGVnX25hdHVyYWxfb3JkZXJba107CisJICBpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOworCSAgICBpZiAoR0VUX0JJVFMoMSkpIHsKKwkgICAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBzZXQgaXQgKi8KKwkJaWYgKCp0aGlzY29lZiA+PSAwKQorCQkgICp0aGlzY29lZiArPSBwMTsKKwkJZWxzZQorCQkgICp0aGlzY29lZiArPSBtMTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIGlmICgtLXIgPCAwKQorCSAgICAgIGJyZWFrOwkJLyogcmVhY2hlZCB0YXJnZXQgemVybyBjb2VmZmljaWVudCAqLworCSAgfQorCSAgaysrOworCX0gd2hpbGUgKGsgPD0gU2UpOworCWlmIChzKSB7CisJICBpbnQgcG9zID0ganBlZ19uYXR1cmFsX29yZGVyW2tdOworCSAgLyogT3V0cHV0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQgKi8KKwkgICgqYmxvY2spW3Bvc10gPSAoSkNPRUYpIHM7CisJICAvKiBSZW1lbWJlciBpdHMgcG9zaXRpb24gaW4gY2FzZSB3ZSBoYXZlIHRvIHN1c3BlbmQgKi8KKwkgIG5ld256X3Bvc1tudW1fbmV3bnorK10gPSBwb3M7CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChFT0JSVU4gPiAwKSB7CisgICAgICAvKiBTY2FuIGFueSByZW1haW5pbmcgY29lZmZpY2llbnQgcG9zaXRpb25zIGFmdGVyIHRoZSBlbmQtb2YtYmFuZAorICAgICAgICogKHRoZSBsYXN0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQsIGlmIGFueSkuICBBcHBlbmQgYSBjb3JyZWN0aW9uCisgICAgICAgKiBiaXQgdG8gZWFjaCBhbHJlYWR5LW5vbnplcm8gY29lZmZpY2llbnQuICBBIGNvcnJlY3Rpb24gYml0IGlzIDEKKyAgICAgICAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisgICAgICAgKi8KKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwl0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKKwlpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKKwkgIGlmIChHRVRfQklUUygxKSkgeworCSAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBjaGFuZ2VkIGl0ICovCisJICAgICAgaWYgKCp0aGlzY29lZiA+PSAwKQorCQkqdGhpc2NvZWYgKz0gcDE7CisJICAgICAgZWxzZQorCQkqdGhpc2NvZWYgKz0gbTE7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBDb3VudCBvbmUgYmxvY2sgY29tcGxldGVkIGluIEVPQiBydW4gKi8KKyAgICAgIEVPQlJVTi0tOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworCit1bmRvaXQ6CisgIC8qIFJlLXplcm8gYW55IG91dHB1dCBjb2VmZmljaWVudHMgdGhhdCB3ZSBtYWRlIG5ld2x5IG5vbnplcm8gKi8KKyAgd2hpbGUgKG51bV9uZXdueiA+IDApCisgICAgKCpibG9jaylbbmV3bnpfcG9zWy0tbnVtX25ld256XV0gPSAwOworCisgIHJldHVybiBGQUxTRTsKK30KKworCisvKgorICogRGVjb2RlIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgogICovCiAKIE1FVEhPRERFRihib29sZWFuKQpAQCAtNTQxLDM5ICsxMDI4LDQwIEBACiAKICAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewogICAgICAgSkJMT0NLUk9XIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgICBkX2Rlcml2ZWRfdGJsICogZGN0YmwgPSBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXTsKLSAgICAgIGRfZGVyaXZlZF90YmwgKiBhY3RibCA9IGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dOworICAgICAgZF9kZXJpdmVkX3RibCAqIGh0Ymw7CiAgICAgICByZWdpc3RlciBpbnQgcywgaywgcjsKKyAgICAgIGludCBjb2VmX2xpbWl0LCBjaTsKIAogICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCiAKICAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCi0gICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgZGN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKLSAgICAgIGlmIChzKSB7Ci0JQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQlyID0gR0VUX0JJVFMocyk7Ci0JcyA9IEhVRkZfRVhURU5EKHIsIHMpOwotICAgICAgfQorICAgICAgaHRibCA9IGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dOworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGh0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKIAotICAgICAgaWYgKGVudHJvcHktPmRjX25lZWRlZFtibGtuXSkgeworICAgICAgaHRibCA9IGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dOworICAgICAgayA9IDE7CisgICAgICBjb2VmX2xpbWl0ID0gZW50cm9weS0+Y29lZl9saW1pdFtibGtuXTsKKyAgICAgIGlmIChjb2VmX2xpbWl0KSB7CiAJLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCi0JaW50IGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworCWlmIChzKSB7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgciA9IEdFVF9CSVRTKHMpOworCSAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOworCX0KKwljaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKIAlzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKIAlzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOwotCS8qIE91dHB1dCB0aGUgREMgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdID0gMCkgKi8KKwkvKiBPdXRwdXQgdGhlIERDIGNvZWZmaWNpZW50ICovCiAJKCpibG9jaylbMF0gPSAoSkNPRUYpIHM7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlbnRyb3B5LT5hY19uZWVkZWRbYmxrbl0pIHsKIAogCS8qIFNlY3Rpb24gRi4yLjIuMjogZGVjb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgKi8KIAkvKiBTaW5jZSB6ZXJvZXMgYXJlIHNraXBwZWQsIG91dHB1dCBhcmVhIG11c3QgYmUgY2xlYXJlZCBiZWZvcmVoYW5kICovCi0JZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLQkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDIpOwotICAgICAgCisJZm9yICg7IGsgPCBjb2VmX2xpbWl0OyBrKyspIHsKKwkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBodGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7CisKIAkgIHIgPSBzID4+IDQ7CiAJICBzICY9IDE1OwotICAgICAgCisKIAkgIGlmIChzKSB7CiAJICAgIGsgKz0gcjsKIAkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKQEAgLTU4NiwzMyArMTA3NCwzNyBAQAogCSAgICAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dID0gKEpDT0VGKSBzOwogCSAgfSBlbHNlIHsKIAkgICAgaWYgKHIgIT0gMTUpCi0JICAgICAgYnJlYWs7CisJICAgICAgZ290byBFbmRPZkJsb2NrOwogCSAgICBrICs9IDE1OwogCSAgfQogCX0KLQogICAgICAgfSBlbHNlIHsKLQotCS8qIFNlY3Rpb24gRi4yLjIuMjogZGVjb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgKi8KLQkvKiBJbiB0aGlzIHBhdGggd2UganVzdCBkaXNjYXJkIHRoZSB2YWx1ZXMgKi8KLQlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMyk7Ci0gICAgICAKLQkgIHIgPSBzID4+IDQ7Ci0JICBzICY9IDE1OwotICAgICAgCi0JICBpZiAocykgewotCSAgICBrICs9IHI7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICAgIERST1BfQklUUyhzKTsKLQkgIH0gZWxzZSB7Ci0JICAgIGlmIChyICE9IDE1KQotCSAgICAgIGJyZWFrOwotCSAgICBrICs9IDE1OwotCSAgfQorCWlmIChzKSB7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgRFJPUF9CSVRTKHMpOwogCX0KLQogICAgICAgfQorCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCisgICAgICAvKiBJbiB0aGlzIHBhdGggd2UganVzdCBkaXNjYXJkIHRoZSB2YWx1ZXMgKi8KKyAgICAgIGZvciAoOyBrIDwgRENUU0laRTI7IGsrKykgeworCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBodGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMyk7CisKKwlyID0gcyA+PiA0OworCXMgJj0gMTU7CisKKwlpZiAocykgeworCSAgayArPSByOworCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwkgIERST1BfQklUUyhzKTsKKwl9IGVsc2UgeworCSAgaWYgKHIgIT0gMTUpCisJICAgIGJyZWFrOworCSAgayArPSAxNTsKKwl9CisgICAgICB9CisKKyAgICAgIEVuZE9mQmxvY2s6IDsKICAgICB9CiAKICAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KQEAgLTYyOCw2ICsxMTIwLDE1NiBAQAogCiAKIC8qCisgKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19odWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGNpLCBibGtuLCBkY3RibCwgYWN0YmwsIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworICAgIC8qIFZhbGlkYXRlIHByb2dyZXNzaXZlIHNjYW4gcGFyYW1ldGVycyAqLworICAgIGlmIChjaW5mby0+U3MgPT0gMCkgeworICAgICAgaWYgKGNpbmZvLT5TZSAhPSAwKQorCWdvdG8gYmFkOworICAgIH0gZWxzZSB7CisgICAgICAvKiBuZWVkIG5vdCBjaGVjayBTcy9TZSA8IDAgc2luY2UgdGhleSBjYW1lIGZyb20gdW5zaWduZWQgYnl0ZXMgKi8KKyAgICAgIGlmIChjaW5mby0+U2UgPCBjaW5mby0+U3MgfHwgY2luZm8tPlNlID49IERDVFNJWkUyKQorCWdvdG8gYmFkOworICAgICAgLyogQUMgc2NhbnMgbWF5IGhhdmUgb25seSBvbmUgY29tcG9uZW50ICovCisgICAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gIT0gMSkKKwlnb3RvIGJhZDsKKyAgICB9CisgICAgaWYgKGNpbmZvLT5BaCAhPSAwKSB7CisgICAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuOiBtdXN0IGhhdmUgQWwgPSBBaC0xLiAqLworICAgICAgaWYgKGNpbmZvLT5BaC0xICE9IGNpbmZvLT5BbCkKKwlnb3RvIGJhZDsKKyAgICB9CisgICAgaWYgKGNpbmZvLT5BbCA+IDEzKSB7CS8qIG5lZWQgbm90IGNoZWNrIGZvciA8IDAgKi8KKyAgICAgIC8qIEFyZ3VhYmx5IHRoZSBtYXhpbXVtIEFsIHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gMTMgZm9yIDgtYml0IHByZWNpc2lvbiwKKyAgICAgICAqIGJ1dCB0aGUgc3BlYyBkb2Vzbid0IHNheSBzbywgYW5kIHdlIHRyeSB0byBiZSBsaWJlcmFsIGFib3V0IHdoYXQgd2UKKyAgICAgICAqIGFjY2VwdC4gIE5vdGU6IGxhcmdlIEFsIHZhbHVlcyBjb3VsZCByZXN1bHQgaW4gb3V0LW9mLXJhbmdlIERDCisgICAgICAgKiBjb2VmZmljaWVudHMgZHVyaW5nIGVhcmx5IHNjYW5zLCBsZWFkaW5nIHRvIGJpemFycmUgZGlzcGxheXMgZHVlIHRvCisgICAgICAgKiBvdmVyZmxvd3MgaW4gdGhlIElEQ1QgbWF0aC4gIEJ1dCB3ZSB3b24ndCBjcmFzaC4KKyAgICAgICAqLworICAgICAgYmFkOgorICAgICAgRVJSRVhJVDQoY2luZm8sIEpFUlJfQkFEX1BST0dSRVNTSU9OLAorCSAgICAgICBjaW5mby0+U3MsIGNpbmZvLT5TZSwgY2luZm8tPkFoLCBjaW5mby0+QWwpOworICAgIH0KKyAgICAvKiBVcGRhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzLCBhbmQgdmVyaWZ5IHRoYXQgc2NhbiBvcmRlciBpcyBsZWdhbC4KKyAgICAgKiBOb3RlIHRoYXQgaW50ZXItc2NhbiBpbmNvbnNpc3RlbmNpZXMgYXJlIHRyZWF0ZWQgYXMgd2FybmluZ3MKKyAgICAgKiBub3QgZmF0YWwgZXJyb3JzIC4uLiBub3QgY2xlYXIgaWYgdGhpcyBpcyByaWdodCB3YXkgdG8gYmVoYXZlLgorICAgICAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBpbnQgY29lZmksIGNpbmRleCA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXS0+Y29tcG9uZW50X2luZGV4OworICAgICAgaW50ICpjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbY2luZGV4XVswXTsKKyAgICAgIGlmIChjaW5mby0+U3MgJiYgY29lZl9iaXRfcHRyWzBdIDwgMCkgLyogQUMgd2l0aG91dCBwcmlvciBEQyBzY2FuICovCisJV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCAwKTsKKyAgICAgIGZvciAoY29lZmkgPSBjaW5mby0+U3M7IGNvZWZpIDw9IGNpbmZvLT5TZTsgY29lZmkrKykgeworCWludCBleHBlY3RlZCA9IChjb2VmX2JpdF9wdHJbY29lZmldIDwgMCkgPyAwIDogY29lZl9iaXRfcHRyW2NvZWZpXTsKKwlpZiAoY2luZm8tPkFoICE9IGV4cGVjdGVkKQorCSAgV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCBjb2VmaSk7CisJY29lZl9iaXRfcHRyW2NvZWZpXSA9IGNpbmZvLT5BbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZWxlY3QgTUNVIGRlY29kaW5nIHJvdXRpbmUgKi8KKyAgICBpZiAoY2luZm8tPkFoID09IDApIHsKKyAgICAgIGlmIChjaW5mby0+U3MgPT0gMCkKKwllbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfRENfZmlyc3Q7CisgICAgICBlbHNlCisJZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0FDX2ZpcnN0OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoY2luZm8tPlNzID09IDApCisJZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0RDX3JlZmluZTsKKyAgICAgIGVsc2UKKwllbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfQUNfcmVmaW5lOworICAgIH0KKworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgLyogTWFrZSBzdXJlIHJlcXVlc3RlZCB0YWJsZXMgYXJlIHByZXNlbnQsIGFuZCBjb21wdXRlIGRlcml2ZWQgdGFibGVzLgorICAgICAgICogV2UgbWF5IGJ1aWxkIHNhbWUgZGVyaXZlZCB0YWJsZSBtb3JlIHRoYW4gb25jZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZS4KKyAgICAgICAqLworICAgICAgaWYgKGNpbmZvLT5TcyA9PSAwKSB7CisJaWYgKGNpbmZvLT5BaCA9PSAwKSB7CS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KKwkgIGkgPSBjb21wcHRyLT5kY190Ymxfbm87CisJICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgaSwKKwkJCQkgICYgZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldKTsKKwl9CisgICAgICB9IGVsc2UgeworCWkgPSBjb21wcHRyLT5hY190Ymxfbm87CisJanBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBpLAorCQkJCSYgZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldKTsKKwkvKiByZW1lbWJlciB0aGUgc2luZ2xlIGFjdGl2ZSB0YWJsZSAqLworCWVudHJvcHktPmFjX2Rlcml2ZWRfdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldOworICAgICAgfQorICAgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSAwOworICB9IGVsc2UgeworICAgIC8qIENoZWNrIHRoYXQgdGhlIHNjYW4gcGFyYW1ldGVycyBTcywgU2UsIEFoL0FsIGFyZSBPSyBmb3Igc2VxdWVudGlhbCBKUEVHLgorICAgICAqIFRoaXMgb3VnaHQgdG8gYmUgYW4gZXJyb3IgY29uZGl0aW9uLCBidXQgd2UgbWFrZSBpdCBhIHdhcm5pbmcgYmVjYXVzZQorICAgICAqIHRoZXJlIGFyZSBzb21lIGJhc2VsaW5lIGZpbGVzIG91dCB0aGVyZSB3aXRoIGFsbCB6ZXJvZXMgaW4gdGhlc2UgYnl0ZXMuCisgICAgICovCisgICAgaWYgKGNpbmZvLT5TcyAhPSAwIHx8IGNpbmZvLT5TZSAhPSBEQ1RTSVpFMi0xIHx8CisJY2luZm8tPkFoICE9IDAgfHwgY2luZm8tPkFsICE9IDApCisgICAgICBXQVJOTVMoY2luZm8sIEpXUk5fTk9UX1NFUVVFTlRJQUwpOworCisgICAgLyogU2VsZWN0IE1DVSBkZWNvZGluZyByb3V0aW5lICovCisgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1OworCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgICAgLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZXMgKi8KKyAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCisJCQkgICAgICAmIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tkY3RibF0pOworICAgICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBhY3RibCwKKwkJCSAgICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7CisgICAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgfQorCisgICAgLyogUHJlY2FsY3VsYXRlIGRlY29kaW5nIGluZm8gZm9yIGVhY2ggYmxvY2sgaW4gYW4gTUNVIG9mIHRoaXMgc2NhbiAqLworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICAvKiBQcmVjYWxjdWxhdGUgd2hpY2ggdGFibGUgdG8gdXNlIGZvciBlYWNoIGJsb2NrICovCisgICAgICBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOworICAgICAgZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbY29tcHB0ci0+YWNfdGJsX25vXTsKKyAgICAgIC8qIERlY2lkZSB3aGV0aGVyIHdlIHJlYWxseSBjYXJlIGFib3V0IHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KKyAgICAgIGlmIChjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisJY2kgPSBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZTsKKwlpZiAoY2kgPD0gMCB8fCBjaSA+IDgpIGNpID0gODsKKwlpID0gY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemU7CisJaWYgKGkgPD0gMCB8fCBpID4gOCkgaSA9IDg7CisJZW50cm9weS0+Y29lZl9saW1pdFtibGtuXSA9IDEgKyBqcGVnX3ppZ3phZ19vcmRlcltjaSAtIDFdW2kgLSAxXTsKKyAgICAgIH0gZWxzZSB7CisJZW50cm9weS0+Y29lZl9saW1pdFtibGtuXSA9IDA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOworICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KKyAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKK30KKworCisvKgogICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KICAqLwogCkBAIC02NDIsMTAgKzEyODQsMjYgQEAKIAkJCQlTSVpFT0YoaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKICAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7CiAgIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19odWZmX2RlY29kZXI7Ci0gIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdTsKIAotICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKKyAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgLyogQ3JlYXRlIHByb2dyZXNzaW9uIHN0YXR1cyB0YWJsZSAqLworICAgIGludCAqY29lZl9iaXRfcHRyLCBjaTsKKyAgICBjaW5mby0+Y29lZl9iaXRzID0gKGludCAoKilbRENUU0laRTJdKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIGNpbmZvLT5udW1fY29tcG9uZW50cypEQ1RTSVpFMipTSVpFT0YoaW50KSk7CisgICAgY29lZl9iaXRfcHRyID0gJiBjaW5mby0+Y29lZl9iaXRzWzBdWzBdOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKQorCSpjb2VmX2JpdF9wdHIrKyA9IC0xOworCisgICAgLyogTWFyayBkZXJpdmVkIHRhYmxlcyB1bmFsbG9jYXRlZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkaHVmZi5oIGIvamRodWZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTliNmMuLjAwMDAwMDAKLS0tIGEvamRodWZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIGpkaHVmZi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMKLSAqIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBzZXF1ZW50aWFsIGRlY29kZXIgKGpkaHVmZi5jKSBhbmQgdGhlCi0gKiBwcm9ncmVzc2l2ZSBkZWNvZGVyIChqZHBodWZmLmMpLiAgTm8gb3RoZXIgbW9kdWxlcyBuZWVkIHRvIHNlZSB0aGVzZS4KLSAqLwotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19tYWtlX2RfZGVyaXZlZF90YmwJak1rRERlcml2ZWQKLSNkZWZpbmUganBlZ19maWxsX2JpdF9idWZmZXIJakZpbEJpdEJ1ZgotI2RlZmluZSBqcGVnX2h1ZmZfZGVjb2RlCWpIdWZEZWNvZGUKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KLQotI2RlZmluZSBIVUZGX0xPT0tBSEVBRAk4CS8qICMgb2YgYml0cyBvZiBsb29rYWhlYWQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBCYXNpYyB0YWJsZXM6IChlbGVtZW50IFswXSBvZiBlYWNoIGFycmF5IGlzIHVudXNlZCkgKi8KLSAgSU5UMzIgbWF4Y29kZVsxOF07CQkvKiBsYXJnZXN0IGNvZGUgb2YgbGVuZ3RoIGsgKC0xIGlmIG5vbmUpICovCi0gIC8qIChtYXhjb2RlWzE3XSBpcyBhIHNlbnRpbmVsIHRvIGVuc3VyZSBqcGVnX2h1ZmZfZGVjb2RlIHRlcm1pbmF0ZXMpICovCi0gIElOVDMyIHZhbG9mZnNldFsxN107CQkvKiBodWZmdmFsW10gb2Zmc2V0IGZvciBjb2RlcyBvZiBsZW5ndGggayAqLwotICAvKiB2YWxvZmZzZXRba10gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBrLCBsZXNzCi0gICAqIHRoZSBzbWFsbGVzdCBjb2RlIG9mIGxlbmd0aCBrOyBzbyBnaXZlbiBhIGNvZGUgb2YgbGVuZ3RoIGssIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHN5bWJvbCBpcyBodWZmdmFsW2NvZGUgKyB2YWxvZmZzZXRba11dCi0gICAqLwotCi0gIC8qIExpbmsgdG8gcHVibGljIEh1ZmZtYW4gdGFibGUgKG5lZWRlZCBvbmx5IGluIGpwZWdfaHVmZl9kZWNvZGUpICovCi0gIEpIVUZGX1RCTCAqcHViOwotCi0gIC8qIExvb2thaGVhZCB0YWJsZXM6IGluZGV4ZWQgYnkgdGhlIG5leHQgSFVGRl9MT09LQUhFQUQgYml0cyBvZgotICAgKiB0aGUgaW5wdXQgZGF0YSBzdHJlYW0uICBJZiB0aGUgbmV4dCBIdWZmbWFuIGNvZGUgaXMgbm8gbW9yZQotICAgKiB0aGFuIEhVRkZfTE9PS0FIRUFEIGJpdHMgbG9uZywgd2UgY2FuIG9idGFpbiBpdHMgbGVuZ3RoIGFuZAotICAgKiB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2wgZGlyZWN0bHkgZnJvbSB0aGVzZSB0YWJsZXMuCi0gICAqLwotICBpbnQgbG9va19uYml0c1sxPDxIVUZGX0xPT0tBSEVBRF07IC8qICMgYml0cywgb3IgMCBpZiB0b28gbG9uZyAqLwotICBVSU5UOCBsb29rX3N5bVsxPDxIVUZGX0xPT0tBSEVBRF07IC8qIHN5bWJvbCwgb3IgdW51c2VkICovCi19IGRfZGVyaXZlZF90Ymw7Ci0KLS8qIEV4cGFuZCBhIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXJpdmVkIGZvcm1hdCAqLwotRVhURVJOKHZvaWQpIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkgICAgIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpKTsKLQotCi0vKgotICogRmV0Y2hpbmcgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpcyBhIHRpbWUtY3JpdGljYWwgb3BlcmF0aW9uCi0gKiBmb3IgdGhlIEh1ZmZtYW4gZGVjb2RlcnMuICBXZSBpbXBsZW1lbnQgaXQgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIGlubGluZQotICogbWFjcm9zIGFuZCBvdXQtb2YtbGluZSBzdWJyb3V0aW5lcy4gIE5vdGUgdGhhdCBOICh0aGUgbnVtYmVyIG9mIGJpdHMKLSAqIGRlbWFuZGVkIGF0IG9uZSB0aW1lKSBuZXZlciBleGNlZWRzIDE1IGZvciBKUEVHIHVzZS4KLSAqCi0gKiBXZSByZWFkIHNvdXJjZSBieXRlcyBpbnRvIGdldF9idWZmZXIgYW5kIGRvbGUgb3V0IGJpdHMgYXMgbmVlZGVkLgotICogSWYgZ2V0X2J1ZmZlciBhbHJlYWR5IGNvbnRhaW5zIGVub3VnaCBiaXRzLCB0aGV5IGFyZSBmZXRjaGVkIGluLWxpbmUKLSAqIGJ5IHRoZSBtYWNyb3MgQ0hFQ0tfQklUX0JVRkZFUiBhbmQgR0VUX0JJVFMuICBXaGVuIHRoZXJlIGFyZW4ndCBlbm91Z2gKLSAqIGJpdHMsIGpwZWdfZmlsbF9iaXRfYnVmZmVyIGlzIGNhbGxlZDsgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbGwgZ2V0X2J1ZmZlcgotICogYXMgZnVsbCBhcyBwb3NzaWJsZSAobm90IGp1c3QgdG8gdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZDsgdGhpcwotICogcHJlZmV0Y2hpbmcgcmVkdWNlcyB0aGUgb3ZlcmhlYWQgY29zdCBvZiBjYWxsaW5nIGpwZWdfZmlsbF9iaXRfYnVmZmVyKS4KLSAqIE5vdGUgdGhhdCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBtYXkgcmV0dXJuIEZBTFNFIHRvIGluZGljYXRlIHN1c3BlbnNpb24uCi0gKiBPbiBUUlVFIHJldHVybiwganBlZ19maWxsX2JpdF9idWZmZXIgZ3VhcmFudGVlcyB0aGF0IGdldF9idWZmZXIgY29udGFpbnMKLSAqIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJpdHMgLS0tIGR1bW15IHplcm9lcyBhcmUgaW5zZXJ0ZWQgaWYKLSAqIG5lY2Vzc2FyeS4KLSAqLwotCi10eXBlZGVmIElOVDMyIGJpdF9idWZfdHlwZTsJLyogdHlwZSBvZiBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KLSNkZWZpbmUgQklUX0JVRl9TSVpFICAzMgkvKiBzaXplIG9mIGJ1ZmZlciBpbiBiaXRzICovCi0KLS8qIElmIGxvbmcgaXMgPiAzMiBiaXRzIG9uIHlvdXIgbWFjaGluZSwgYW5kIHNoaWZ0aW5nL21hc2tpbmcgbG9uZ3MgaXMKLSAqIHJlYXNvbmFibHkgZmFzdCwgbWFraW5nIGJpdF9idWZfdHlwZSBiZSBsb25nIGFuZCBzZXR0aW5nIEJJVF9CVUZfU0laRQotICogYXBwcm9wcmlhdGVseSBzaG91bGQgYmUgYSB3aW4uICBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IGRlZmluZSB0aGUgc2l6ZQotICogd2l0aCBzb21ldGhpbmcgbGlrZSAgI2RlZmluZSBCSVRfQlVGX1NJWkUgKHNpemVvZihiaXRfYnVmX3R5cGUpKjgpCi0gKiBiZWNhdXNlIG5vdCBhbGwgbWFjaGluZXMgbWVhc3VyZSBzaXplb2YgaW4gOC1iaXQgYnl0ZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewkJLyogQml0cmVhZGluZyBzdGF0ZSBzYXZlZCBhY3Jvc3MgTUNVcyAqLwotICBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsJLyogY3VycmVudCBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KLSAgaW50IGJpdHNfbGVmdDsJCS8qICMgb2YgdW51c2VkIGJpdHMgaW4gaXQgKi8KLX0gYml0cmVhZF9wZXJtX3N0YXRlOwotCi10eXBlZGVmIHN0cnVjdCB7CQkvKiBCaXRyZWFkaW5nIHdvcmtpbmcgc3RhdGUgd2l0aGluIGFuIE1DVSAqLwotICAvKiBDdXJyZW50IGRhdGEgc291cmNlIGxvY2F0aW9uICovCi0gIC8qIFdlIG5lZWQgYSBjb3B5LCByYXRoZXIgdGhhbiBtdW5naW5nIHRoZSBvcmlnaW5hbCwgaW4gY2FzZSBvZiBzdXNwZW5zaW9uICovCi0gIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBzb3VyY2UgKi8KLSAgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlcyByZW1haW5pbmcgaW4gc291cmNlIGJ1ZmZlciAqLwotICAvKiBCaXQgaW5wdXQgYnVmZmVyIC0tLSBub3RlIHRoZXNlIHZhbHVlcyBhcmUga2VwdCBpbiByZWdpc3RlciB2YXJpYWJsZXMsCi0gICAqIG5vdCBpbiB0aGlzIHN0cnVjdCwgaW5zaWRlIHRoZSBpbm5lciBsb29wcy4KLSAgICovCi0gIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOwkvKiBjdXJyZW50IGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLwotICBpbnQgYml0c19sZWZ0OwkJLyogIyBvZiB1bnVzZWQgYml0cyBpbiBpdCAqLwotICAvKiBQb2ludGVyIG5lZWRlZCBieSBqcGVnX2ZpbGxfYml0X2J1ZmZlci4gKi8KLSAgal9kZWNvbXByZXNzX3B0ciBjaW5mbzsJLyogYmFjayBsaW5rIHRvIGRlY29tcHJlc3MgbWFzdGVyIHJlY29yZCAqLwotfSBiaXRyZWFkX3dvcmtpbmdfc3RhdGU7Ci0KLS8qIE1hY3JvcyB0byBkZWNsYXJlIGFuZCBsb2FkL3NhdmUgYml0cmVhZCBsb2NhbCB2YXJpYWJsZXMuICovCi0jZGVmaW5lIEJJVFJFQURfU1RBVEVfVkFSUyAgXAotCXJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOyAgXAotCXJlZ2lzdGVyIGludCBiaXRzX2xlZnQ7ICBcCi0JYml0cmVhZF93b3JraW5nX3N0YXRlIGJyX3N0YXRlCi0KLSNkZWZpbmUgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvcCxwZXJtc3RhdGUpICBcCi0JYnJfc3RhdGUuY2luZm8gPSBjaW5mb3A7IFwKLQlicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBjaW5mb3AtPnNyYy0+bmV4dF9pbnB1dF9ieXRlOyBcCi0JYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyID0gY2luZm9wLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsgXAotCWdldF9idWZmZXIgPSBwZXJtc3RhdGUuZ2V0X2J1ZmZlcjsgXAotCWJpdHNfbGVmdCA9IHBlcm1zdGF0ZS5iaXRzX2xlZnQ7Ci0KLSNkZWZpbmUgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvcCxwZXJtc3RhdGUpICBcCi0JY2luZm9wLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSA9IGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZTsgXAotCWNpbmZvcC0+c3JjLT5ieXRlc19pbl9idWZmZXIgPSBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXI7IFwKLQlwZXJtc3RhdGUuZ2V0X2J1ZmZlciA9IGdldF9idWZmZXI7IFwKLQlwZXJtc3RhdGUuYml0c19sZWZ0ID0gYml0c19sZWZ0Ci0KLS8qCi0gKiBUaGVzZSBtYWNyb3MgcHJvdmlkZSB0aGUgaW4tbGluZSBwb3J0aW9uIG9mIGJpdCBmZXRjaGluZy4KLSAqIFVzZSBDSEVDS19CSVRfQlVGRkVSIHRvIGVuc3VyZSB0aGVyZSBhcmUgTiBiaXRzIGluIGdldF9idWZmZXIKLSAqIGJlZm9yZSB1c2luZyBHRVRfQklUUywgUEVFS19CSVRTLCBvciBEUk9QX0JJVFMuCi0gKiBUaGUgdmFyaWFibGVzIGdldF9idWZmZXIgYW5kIGJpdHNfbGVmdCBhcmUgYXNzdW1lZCB0byBiZSBsb2NhbHMsCi0gKiBidXQgdGhlIHN0YXRlIHN0cnVjdCBtaWdodCBub3QgYmUgKGpwZWdfaHVmZl9kZWNvZGUgbmVlZHMgdGhpcykuCi0gKglDSEVDS19CSVRfQlVGRkVSKHN0YXRlLG4sYWN0aW9uKTsKLSAqCQlFbnN1cmUgdGhlcmUgYXJlIE4gYml0cyBpbiBnZXRfYnVmZmVyOyBpZiBzdXNwZW5kLCB0YWtlIGFjdGlvbi4KLSAqICAgICAgdmFsID0gR0VUX0JJVFMobik7Ci0gKgkJRmV0Y2ggbmV4dCBOIGJpdHMuCi0gKiAgICAgIHZhbCA9IFBFRUtfQklUUyhuKTsKLSAqCQlGZXRjaCBuZXh0IE4gYml0cyB3aXRob3V0IHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgYnVmZmVyLgotICoJRFJPUF9CSVRTKG4pOwotICoJCURpc2NhcmQgbmV4dCBOIGJpdHMuCi0gKiBUaGUgdmFsdWUgTiBzaG91bGQgYmUgYSBzaW1wbGUgdmFyaWFibGUsIG5vdCBhbiBleHByZXNzaW9uLCBiZWNhdXNlIGl0Ci0gKiBpcyBldmFsdWF0ZWQgbXVsdGlwbGUgdGltZXMuCi0gKi8KLQotI2RlZmluZSBDSEVDS19CSVRfQlVGRkVSKHN0YXRlLG5iaXRzLGFjdGlvbikgXAotCXsgaWYgKGJpdHNfbGVmdCA8IChuYml0cykpIHsgIFwKLQkgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJihzdGF0ZSksZ2V0X2J1ZmZlcixiaXRzX2xlZnQsbmJpdHMpKSAgXAotCSAgICAgIHsgYWN0aW9uOyB9ICBcCi0JICAgIGdldF9idWZmZXIgPSAoc3RhdGUpLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IChzdGF0ZSkuYml0c19sZWZ0OyB9IH0KLQotI2RlZmluZSBHRVRfQklUUyhuYml0cykgXAotCSgoKGludCkgKGdldF9idWZmZXIgPj4gKGJpdHNfbGVmdCAtPSAobmJpdHMpKSkpICYgKCgxPDwobmJpdHMpKS0xKSkKLQotI2RlZmluZSBQRUVLX0JJVFMobmJpdHMpIFwKLQkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLSAgKG5iaXRzKSkpKSAmICgoMTw8KG5iaXRzKSktMSkpCi0KLSNkZWZpbmUgRFJPUF9CSVRTKG5iaXRzKSBcCi0JKGJpdHNfbGVmdCAtPSAobmJpdHMpKQotCi0vKiBMb2FkIHVwIHRoZSBiaXQgYnVmZmVyIHRvIGEgZGVwdGggb2YgYXQgbGVhc3QgbmJpdHMgKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX2ZpbGxfYml0X2J1ZmZlcgotCUpQUCgoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLAotCSAgICAgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwgaW50IG5iaXRzKSk7Ci0KLQotLyoKLSAqIENvZGUgZm9yIGV4dHJhY3RpbmcgbmV4dCBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmcm9tIGlucHV0IGJpdCBzdHJlYW0uCi0gKiBBZ2FpbiwgdGhpcyBpcyB0aW1lLWNyaXRpY2FsIGFuZCB3ZSBtYWtlIHRoZSBtYWluIHBhdGhzIGJlIG1hY3Jvcy4KLSAqCi0gKiBXZSB1c2UgYSBsb29rYWhlYWQgdGFibGUgdG8gcHJvY2VzcyBjb2RlcyBvZiB1cCB0byBIVUZGX0xPT0tBSEVBRCBiaXRzCi0gKiB3aXRob3V0IGxvb3BpbmcuICBVc3VhbGx5LCBtb3JlIHRoYW4gOTUlIG9mIHRoZSBIdWZmbWFuIGNvZGVzIHdpbGwgYmUgOAotICogb3IgZmV3ZXIgYml0cyBsb25nLiAgVGhlIGZldyBvdmVybGVuZ3RoIGNvZGVzIGFyZSBoYW5kbGVkIHdpdGggYSBsb29wLAotICogd2hpY2ggbmVlZCBub3QgYmUgaW5saW5lIGNvZGUuCi0gKgotICogTm90ZXMgYWJvdXQgdGhlIEhVRkZfREVDT0RFIG1hY3JvOgotICogMS4gTmVhciB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlZ21lbnQsIHdlIG1heSBmYWlsIHRvIGdldCBlbm91Z2ggYml0cwotICogICAgZm9yIGEgbG9va2FoZWFkLiAgSW4gdGhhdCBjYXNlLCB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gKiAyLiBJZiB0aGUgbG9va2FoZWFkIHRhYmxlIGNvbnRhaW5zIG5vIGVudHJ5LCB0aGUgbmV4dCBjb2RlIG11c3QgYmUKLSAqICAgIG1vcmUgdGhhbiBIVUZGX0xPT0tBSEVBRCBiaXRzIGxvbmcuCi0gKiAzLiBqcGVnX2h1ZmZfZGVjb2RlIHJldHVybnMgLTEgaWYgZm9yY2VkIHRvIHN1c3BlbmQuCi0gKi8KLQotI2RlZmluZSBIVUZGX0RFQ09ERShyZXN1bHQsc3RhdGUsaHRibCxmYWlsYWN0aW9uLHNsb3dsYWJlbCkgXAoteyByZWdpc3RlciBpbnQgbmIsIGxvb2s7IFwKLSAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKLSAgICBpZiAoISBqcGVnX2ZpbGxfYml0X2J1ZmZlcigmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsIDApKSB7ZmFpbGFjdGlvbjt9IFwKLSAgICBnZXRfYnVmZmVyID0gc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gc3RhdGUuYml0c19sZWZ0OyBcCi0gICAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKLSAgICAgIG5iID0gMTsgZ290byBzbG93bGFiZWw7IFwKLSAgICB9IFwKLSAgfSBcCi0gIGxvb2sgPSBQRUVLX0JJVFMoSFVGRl9MT09LQUhFQUQpOyBcCi0gIGlmICgobmIgPSBodGJsLT5sb29rX25iaXRzW2xvb2tdKSAhPSAwKSB7IFwKLSAgICBEUk9QX0JJVFMobmIpOyBcCi0gICAgcmVzdWx0ID0gaHRibC0+bG9va19zeW1bbG9va107IFwKLSAgfSBlbHNlIHsgXAotICAgIG5iID0gSFVGRl9MT09LQUhFQUQrMTsgXAotc2xvd2xhYmVsOiBcCi0gICAgaWYgKChyZXN1bHQ9anBlZ19odWZmX2RlY29kZSgmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsaHRibCxuYikpIDwgMCkgXAotCXsgZmFpbGFjdGlvbjsgfSBcCi0gICAgZ2V0X2J1ZmZlciA9IHN0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IHN0YXRlLmJpdHNfbGVmdDsgXAotICB9IFwKLX0KLQotLyogT3V0LW9mLWxpbmUgY2FzZSBmb3IgSHVmZm1hbiBjb2RlIGZldGNoaW5nICovCi1FWFRFUk4oaW50KSBqcGVnX2h1ZmZfZGVjb2RlCi0JSlBQKChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsCi0JICAgICByZWdpc3RlciBpbnQgYml0c19sZWZ0LCBkX2Rlcml2ZWRfdGJsICogaHRibCwgaW50IG1pbl9iaXRzKSk7CmRpZmYgLS1naXQgYS9qZGlucHV0LmMgYi9qZGlucHV0LmMKaW5kZXggMGMyYWM4Zi4uMDhhOWIzNyAxMDA2NDQKLS0tIGEvamRpbnB1dC5jCisrKyBiL2pkaW5wdXQuYwpAQCAtMiwxMyArMiwxNCBAQAogICogamRpbnB1dC5jCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogTW9kaWZpZWQgMjAwMi0yMDA5IGJ5IEd1aWRvIFZvbGxiZWRpbmcuCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKICAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCiAgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggY29udHJvbGxpbmcgdGhlIGRlY29tcHJlc3NvcidzIGlucHV0CiAgKiBwcm9jZXNzaW5nIChtYXJrZXIgcmVhZGluZyBhbmQgY29lZmZpY2llbnQgZGVjb2RpbmcpLiAgVGhlIGFjdHVhbCBpbnB1dAotICogcmVhZGluZyBpcyBkb25lIGluIGpkbWFya2VyLmMsIGpkaHVmZi5jLCBhbmQgamRwaHVmZi5jLgorICogcmVhZGluZyBpcyBkb25lIGluIGpkbWFya2VyLmMsIGpkaHVmZi5jLCBhbmQgamRhcml0aC5jLgogICovCiAKICNkZWZpbmUgSlBFR19JTlRFUk5BTFMKQEAgLTc0LDEyICs3NSwxNCBAQAogICAgKiBJbiB0aGUgZnVsbCBkZWNvbXByZXNzb3IsIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGpkbWFzdGVyLmM7CiAgICAqIGJ1dCBpbiB0aGUgdHJhbnNjb2RlciwgamRtYXN0ZXIuYyBpcyBub3QgdXNlZCwgc28gd2UgbXVzdCBkbyBpdCBoZXJlLgogICAgKi8KLSAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CiAKICAgLyogQ29tcHV0ZSBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHMgKi8KICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKICAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICAgIGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgICBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CiAgICAgLyogU2l6ZSBpbiBEQ1QgYmxvY2tzICovCiAgICAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCiAgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKQEAgLTEzOCw3ICsxNDEsNyBAQAogICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IDE7CiAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IDE7CiAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IDE7Ci0gICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemU7CiAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOwogICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0CiAgICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCkBAIC0xNzQsNyArMTc3LDcgQEAKICAgICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CiAgICAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKICAgICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5NQ1VfaGVpZ2h0OwotICAgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZTsKICAgICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygbm9uLWR1bW15IGJsb2NrcyBpbiBsYXN0IE1DVSBjb2x1bW4gJiByb3cgKi8KICAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOwogICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CmRpZmYgLS1naXQgYS9qZG1haW5jdC5jIGIvamRtYWluY3QuYwppbmRleCAxM2M5NTZmLi4wMjcyM2NhIDEwMDY0NAotLS0gYS9qZG1haW5jdC5jCisrKyBiL2pkbWFpbmN0LmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogewogICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKICAgaW50IGNpLCByZ3JvdXA7Ci0gIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZTsKICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKICAgSlNBTVBBUlJBWSB4YnVmOwogCkBAIC0xNzUsOCArMTc1LDggQEAKIAogICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwogICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KICAgICAvKiBHZXQgc3BhY2UgZm9yIHBvaW50ZXIgbGlzdHMgLS0tIE0rNCByb3cgZ3JvdXBzIGluIGVhY2ggbGlzdC4KICAgICAgKiBXZSBhbGxvYyBib3RoIHBvaW50ZXIgbGlzdHMgd2l0aCBvbmUgY2FsbCB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KICAgICAgKi8KQEAgLTIwMiwxNCArMjAyLDE0IEBACiB7CiAgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwogICBpbnQgY2ksIGksIHJncm91cDsKLSAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgaW50IE0gPSBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplOwogICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwogICBKU0FNUEFSUkFZIGJ1ZiwgeGJ1ZjAsIHhidWYxOwogCiAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CiAgICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLSAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZSkgLworICAgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLwogICAgIHhidWYwID0gbWFpbi0+eGJ1ZmZlclswXVtjaV07CiAgICAgeGJ1ZjEgPSBtYWluLT54YnVmZmVyWzFdW2NpXTsKICAgICAvKiBGaXJzdCBjb3B5IHRoZSB3b3Jrc3BhY2UgcG9pbnRlcnMgYXMtaXMgKi8KQEAgLTI0MiwxNCArMjQyLDE0IEBACiB7CiAgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwogICBpbnQgY2ksIGksIHJncm91cDsKLSAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgaW50IE0gPSBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplOwogICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwogICBKU0FNUEFSUkFZIHhidWYwLCB4YnVmMTsKIAogICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwogICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KICAgICB4YnVmMCA9IG1haW4tPnhidWZmZXJbMF1bY2ldOwogICAgIHhidWYxID0gbWFpbi0+eGJ1ZmZlclsxXVtjaV07CiAgICAgZm9yIChpID0gMDsgaSA8IHJncm91cDsgaSsrKSB7CkBAIC0yNzcsOCArMjc3LDggQEAKICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKICAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKICAgICAvKiBDb3VudCBzYW1wbGUgcm93cyBpbiBvbmUgaU1DVSByb3cgYW5kIGluIG9uZSByb3cgZ3JvdXAgKi8KLSAgICBpTUNVaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLSAgICByZ3JvdXAgPSBpTUNVaGVpZ2h0IC8gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgaU1DVWhlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfdl9zY2FsZWRfc2l6ZTsKKyAgICByZ3JvdXAgPSBpTUNVaGVpZ2h0IC8gY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZTsKICAgICAvKiBDb3VudCBub25kdW1teSBzYW1wbGUgcm93cyByZW1haW5pbmcgZm9yIHRoaXMgY29tcG9uZW50ICovCiAgICAgcm93c19sZWZ0ID0gKGludCkgKGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCAlIChKRElNRU5TSU9OKSBpTUNVaGVpZ2h0KTsKICAgICBpZiAocm93c19sZWZ0ID09IDApIHJvd3NfbGVmdCA9IGlNQ1VoZWlnaHQ7CkBAIC0zNTcsNyArMzU3LDcgQEAKICAgfQogCiAgIC8qIFRoZXJlIGFyZSBhbHdheXMgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzIGluIGFuIGlNQ1Ugcm93LiAqLwotICByb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIHJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplOwogICAvKiBOb3RlOiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgbWF5IHBhc3MgZXh0cmEgZ2FyYmFnZSByb3cgZ3JvdXBzCiAgICAqIHRvIHRoZSBwb3N0cHJvY2Vzc29yLiAgVGhlIHBvc3Rwcm9jZXNzb3IgaGFzIHRvIGNoZWNrIGZvciBib3R0b20KICAgICogb2YgaW1hZ2UgYW55d2F5IChhdCByb3cgcmVzb2x1dGlvbiksIHNvIG5vIHBvaW50IGluIHVzIGRvaW5nIGl0IHRvby4KQEAgLTQxNyw3ICs0MTcsNyBAQAogICBjYXNlIENUWF9QUkVQQVJFX0ZPUl9JTUNVOgogICAgIC8qIFByZXBhcmUgdG8gcHJvY2VzcyBmaXJzdCBNLTEgcm93IGdyb3VwcyBvZiB0aGlzIGlNQ1Ugcm93ICovCiAgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKLSAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIC0gMSk7CisgICAgbWFpbi0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplIC0gMSk7CiAgICAgLyogQ2hlY2sgZm9yIGJvdHRvbSBvZiBpbWFnZTogaWYgc28sIHR3ZWFrIHBvaW50ZXJzIHRvICJkdXBsaWNhdGUiCiAgICAgICogdGhlIGxhc3Qgc2FtcGxlIHJvdywgYW5kIGFkanVzdCByb3dncm91cHNfYXZhaWwgdG8gaWdub3JlIHBhZGRpbmcgcm93cy4KICAgICAgKi8KQEAgLTQ0MCw4ICs0NDAsOCBAQAogICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gRkFMU0U7CiAgICAgLyogU3RpbGwgbmVlZCB0byBwcm9jZXNzIGxhc3Qgcm93IGdyb3VwIG9mIHRoaXMgaU1DVSByb3csICovCiAgICAgLyogd2hpY2ggaXMgc2F2ZWQgYXQgaW5kZXggTSsxIG9mIHRoZSBvdGhlciB4YnVmZmVyICovCi0gICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDEpOwotICAgIG1haW4tPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyKTsKKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgKyAxKTsKKyAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgKyAyKTsKICAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BPU1RQT05FRF9ST1c7CiAgIH0KIH0KQEAgLTQ5MiwyMSArNDkyLDIxIEBACiAgICAqIG5ncm91cHMgaXMgdGhlIG51bWJlciBvZiByb3cgZ3JvdXBzIHdlIG5lZWQuCiAgICAqLwogICBpZiAoY2luZm8tPnVwc2FtcGxlLT5uZWVkX2NvbnRleHRfcm93cykgewotICAgIGlmIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA8IDIpIC8qIHVuc3VwcG9ydGVkLCBzZWUgY29tbWVudHMgYWJvdmUgKi8KKyAgICBpZiAoY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA8IDIpIC8qIHVuc3VwcG9ydGVkLCBzZWUgY29tbWVudHMgYWJvdmUgKi8KICAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9USU1QTCk7CiAgICAgYWxsb2NfZnVubnlfcG9pbnRlcnMoY2luZm8pOyAvKiBBbGxvYyBzcGFjZSBmb3IgeGJ1ZmZlcltdIGxpc3RzICovCi0gICAgbmdyb3VwcyA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMjsKKyAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSArIDI7CiAgIH0gZWxzZSB7Ci0gICAgbmdyb3VwcyA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAgIG5ncm91cHMgPSBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplOwogICB9CiAKICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKICAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KKyAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCiAgICAgbWFpbi0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQogCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUsCisJCQkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemUsCiAJCQkgKEpESU1FTlNJT04pIChyZ3JvdXAgKiBuZ3JvdXBzKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkbWFzdGVyLmMgYi9qZG1hc3Rlci5jCmluZGV4IDZkMjNmZWUuLjA0ZjgzMTIgMTAwNjQ0Ci0tLSBhL2pkbWFzdGVyLmMKKysrIGIvamRtYXN0ZXIuYwpAQCAtMiw2ICsyLDcgQEAKICAqIGpkbWFzdGVyLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDAyLTIwMDggYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtNjEsOSArNjIsMTIgQEAKICAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciAhPSAxKQogICAgIHJldHVybiBGQUxTRTsKICAgLyogZnVydGhlcm1vcmUsIGl0IGRvZXNuJ3Qgd29yayBpZiB3ZSd2ZSBzY2FsZWQgdGhlIElEQ1RzIGRpZmZlcmVudGx5ICovCi0gIGlmIChjaW5mby0+Y29tcF9pbmZvWzBdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSB8fAotICAgICAgY2luZm8tPmNvbXBfaW5mb1sxXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplKQorICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5EQ1RfaF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLkRDVF9oX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0uRENUX2hfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1swXS5EQ1Rfdl9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzFdLkRDVF92X3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0uRENUX3Zfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSkKICAgICByZXR1cm4gRkFMU0U7CiAgIC8qID8/PyBhbHNvIG5lZWQgdG8gdGVzdCBmb3IgdXBzYW1wbGUtdGltZSByZXNjYWxpbmcsIHdoZW4gJiBpZiBzdXBwb3J0ZWQgKi8KICAgcmV0dXJuIFRSVUU7CQkJLyogYnkgZ29sbHksIGl0J2xsIHdvcmsuLi4gKi8KQEAgLTEwMiw0MyArMTA2LDE1MiBAQAogICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA4TCk7CiAgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKICAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDhMKTsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDE7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDE7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDE7CiAgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDQgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CiAgICAgLyogUHJvdmlkZSAxLzQgc2NhbGluZyAqLwogICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKICAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgNEwpOwogICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCiAgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCA0TCk7Ci0gICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSAyOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSAyOworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSAyOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDMpIHsKKyAgICAvKiBQcm92aWRlIDMvOCBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogM0wsIDhMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDNMLCA4TCk7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDM7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDM7CiAgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDIgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CiAgICAgLyogUHJvdmlkZSAxLzIgc2NhbGluZyAqLwogICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKICAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgMkwpOwogICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCiAgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCAyTCk7Ci0gICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSA0OwotICB9IGVsc2UgeworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSA0OworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSA0OworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDUpIHsKKyAgICAvKiBQcm92aWRlIDUvOCBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogNUwsIDhMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDVMLCA4TCk7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDU7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDU7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDQgPD0gY2luZm8tPnNjYWxlX2Rlbm9tICogMykgeworICAgIC8qIFByb3ZpZGUgMy80IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAzTCwgNEwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogM0wsIDRMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gNjsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gNjsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogOCA8PSBjaW5mby0+c2NhbGVfZGVub20gKiA3KSB7CisgICAgLyogUHJvdmlkZSA3Lzggc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIDdMLCA4TCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiA3TCwgOEwpOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSA3OworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSA3OworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CiAgICAgLyogUHJvdmlkZSAxLzEgc2NhbGluZyAqLwogICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CiAgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogOCA8PSBjaW5mby0+c2NhbGVfZGVub20gKiA5KSB7CisgICAgLyogUHJvdmlkZSA5Lzggc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGggKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgOEwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgOEwpOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSA5OworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSA5OworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA0IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDUpIHsKKyAgICAvKiBQcm92aWRlIDUvNCBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA0TCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICsgKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCA0TCk7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDEwOworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSAxMDsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogOCA8PSBjaW5mby0+c2NhbGVfZGVub20gKiAxMSkgeworICAgIC8qIFByb3ZpZGUgMTEvOCBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogM0wsIDhMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAzTCwgOEwpOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSAxMTsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gMTE7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDIgPD0gY2luZm8tPnNjYWxlX2Rlbm9tICogMykgeworICAgIC8qIFByb3ZpZGUgMy8yIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoICsgKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDJMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDJMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMTI7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDEyOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDEzKSB7CisgICAgLyogUHJvdmlkZSAxMy84IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoICsgKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiA1TCwgOEwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDVMLCA4TCk7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDEzOworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSAxMzsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogNCA8PSBjaW5mby0+c2NhbGVfZGVub20gKiA3KSB7CisgICAgLyogUHJvdmlkZSA3LzQgc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGggKyAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIDNMLCA0TCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICsgKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogM0wsIDRMKTsKKyAgICBjaW5mby0+bWluX0RDVF9oX3NjYWxlZF9zaXplID0gMTQ7CisgICAgY2luZm8tPm1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZSA9IDE0OworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSAqIDE1KSB7CisgICAgLyogUHJvdmlkZSAxNS84IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoICsgKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiA3TCwgOEwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodCArIChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIDdMLCA4TCk7CisgICAgY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSA9IDE1OworICAgIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgPSAxNTsKKyAgfSBlbHNlIHsKKyAgICAvKiBQcm92aWRlIDIvMSBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aCA8PCAxOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodCA8PCAxOworICAgIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgPSAxNjsKKyAgICBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplID0gMTY7CiAgIH0KICAgLyogSW4gc2VsZWN0aW5nIHRoZSBhY3R1YWwgRENUIHNjYWxpbmcgZm9yIGVhY2ggY29tcG9uZW50LCB3ZSB0cnkgdG8KICAgICogc2NhbGUgdXAgdGhlIGNocm9tYSBjb21wb25lbnRzIHZpYSBJRENUIHNjYWxpbmcgcmF0aGVyIHRoYW4gdXBzYW1wbGluZy4KICAgICogVGhpcyBzYXZlcyB0aW1lIGlmIHRoZSB1cHNhbXBsZXIgZ2V0cyB0byB1c2UgMToxIHNjYWxpbmcuCi0gICAqIE5vdGUgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3VwcG9ydGVkIERDVCBzY2FsaW5ncyBhcmUgcG93ZXJzIG9mIDIuCisgICAqIE5vdGUgdGhpcyBjb2RlIGFkYXB0cyBzdWJzYW1wbGluZyByYXRpb3Mgd2hpY2ggYXJlIHBvd2VycyBvZiAyLgogICAgKi8KICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKICAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpbnQgc3NpemUgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgICB3aGlsZSAoc3NpemUgPCBEQ1RTSVpFICYmCi0JICAgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIgPD0KLQkgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpICYmCi0JICAgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIgPD0KLQkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUpKSB7CisgICAgaW50IHNzaXplID0gMTsKKyAgICB3aGlsZSAoY2luZm8tPm1pbl9EQ1RfaF9zY2FsZWRfc2l6ZSAqIHNzaXplIDw9CisJICAgKGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID8gRENUU0laRSA6IERDVFNJWkUgLyAyKSAmJgorCSAgIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIHNzaXplICogMikpID09IDApIHsKICAgICAgIHNzaXplID0gc3NpemUgKiAyOwogICAgIH0KLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBzc2l6ZTsKKyAgICBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSA9IGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemUgKiBzc2l6ZTsKKyAgICBzc2l6ZSA9IDE7CisgICAgd2hpbGUgKGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemUgKiBzc2l6ZSA8PQorCSAgIChjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA/IERDVFNJWkUgOiBEQ1RTSVpFIC8gMikgJiYKKwkgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBzc2l6ZSAqIDIpKSA9PSAwKSB7CisgICAgICBzc2l6ZSA9IHNzaXplICogMjsKKyAgICB9CisgICAgY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUgPSBjaW5mby0+bWluX0RDVF92X3NjYWxlZF9zaXplICogc3NpemU7CisKKyAgICAvKiBXZSBkb24ndCBzdXBwb3J0IElEQ1QgcmF0aW9zIGxhcmdlciB0aGFuIDIuICovCisgICAgaWYgKGNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplID4gY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUgKiAyKQorCWNvbXBwdHItPkRDVF9oX3NjYWxlZF9zaXplID0gY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUgKiAyOworICAgIGVsc2UgaWYgKGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplID4gY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemUgKiAyKQorCWNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplID0gY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemUgKiAyOwogICB9CiAKICAgLyogUmVjb21wdXRlIGRvd25zYW1wbGVkIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50czsKQEAgLTE0OSwxMSArMjYyLDExIEBACiAgICAgLyogU2l6ZSBpbiBzYW1wbGVzLCBhZnRlciBJRENUIHNjYWxpbmcgKi8KICAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQogICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICoKLQkJICAgIChsb25nKSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCisJCSAgICAobG9uZykgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1RfaF9zY2FsZWRfc2l6ZSksCiAJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKICAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKICAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKgotCQkgICAgKGxvbmcpIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSwKKwkJICAgIChsb25nKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF92X3NjYWxlZF9zaXplKSwKIAkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOwogICB9CiAKQEAgLTM3NSwxNCArNDg4LDcgQEAKICAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CiAgICAgamluaXRfYXJpdGhfZGVjb2RlcihjaW5mbyk7CiAgIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKKyAgICBqaW5pdF9odWZmX2RlY29kZXIoY2luZm8pOwogICB9CiAKICAgLyogSW5pdGlhbGl6ZSBwcmluY2lwYWwgYnVmZmVyIGNvbnRyb2xsZXJzLiAqLwpkaWZmIC0tZ2l0IGEvamRwaHVmZi5jIGIvamRwaHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjY3ODA5Li4wMDAwMDAwCi0tLSBhL2pkcGh1ZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi0vKgotICogamRwaHVmZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgotICoKLSAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCi0gKiBJZiB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGJhY2sKLSAqIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlIHZhcmlhYmxlcwotICogaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZSBwZXJtYW5lbnQKLSAqIHN0b3JhZ2Ugb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpkaHVmZi5jICovCi0KLQotI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0KLS8qCi0gKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGRlY29kaW5nLgotICoKLSAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKLSAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJCS8qIHJlbWFpbmluZyBFT0JzIGluIEVPQlJVTiAqLwotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOwkvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi19IHNhdmFibGVfc3RhdGU7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KLSAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQotICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgotICovCi0KLSNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCi0jZWxzZQotI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAotCSgoZGVzdCkuRU9CUlVOID0gKHNyYykuRU9CUlVOLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQotI2VuZGlmCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIGxvYWRlZCBpbnRvIGxvY2FsIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBlYWNoIE1DVS4KLSAgICogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCB3ZSBleGl0IFdJVEhPVVQgdXBkYXRpbmcgdGhlbS4KLSAgICovCi0gIGJpdHJlYWRfcGVybV9zdGF0ZSBiaXRzdGF0ZTsJLyogQml0IGJ1ZmZlciBhdCBzdGFydCBvZiBNQ1UgKi8KLSAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIE90aGVyIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLwotCi0gIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCi0gIGRfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0KLSAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsOyAvKiBhY3RpdmUgdGFibGUgZHVyaW5nIGFuIEFDIHNjYW4gKi8KLX0gcGh1ZmZfZW50cm9weV9kZWNvZGVyOwotCi10eXBlZGVmIHBodWZmX2VudHJvcHlfZGVjb2RlciAqIHBodWZmX2VudHJvcHlfcHRyOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfcmVmaW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9BQ19yZWZpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGJvb2xlYW4gaXNfRENfYmFuZCwgYmFkOwotICBpbnQgY2ksIGNvZWZpLCB0Ymw7Ci0gIGludCAqY29lZl9iaXRfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKLQotICAvKiBWYWxpZGF0ZSBzY2FuIHBhcmFtZXRlcnMgKi8KLSAgYmFkID0gRkFMU0U7Ci0gIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgaWYgKGNpbmZvLT5TZSAhPSAwKQotICAgICAgYmFkID0gVFJVRTsKLSAgfSBlbHNlIHsKLSAgICAvKiBuZWVkIG5vdCBjaGVjayBTcy9TZSA8IDAgc2luY2UgdGhleSBjYW1lIGZyb20gdW5zaWduZWQgYnl0ZXMgKi8KLSAgICBpZiAoY2luZm8tPlNzID4gY2luZm8tPlNlIHx8IGNpbmZvLT5TZSA+PSBEQ1RTSVpFMikKLSAgICAgIGJhZCA9IFRSVUU7Ci0gICAgLyogQUMgc2NhbnMgbWF5IGhhdmUgb25seSBvbmUgY29tcG9uZW50ICovCi0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuICE9IDEpCi0gICAgICBiYWQgPSBUUlVFOwotICB9Ci0gIGlmIChjaW5mby0+QWggIT0gMCkgewotICAgIC8qIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW46IG11c3QgaGF2ZSBBbCA9IEFoLTEuICovCi0gICAgaWYgKGNpbmZvLT5BbCAhPSBjaW5mby0+QWgtMSkKLSAgICAgIGJhZCA9IFRSVUU7Ci0gIH0KLSAgaWYgKGNpbmZvLT5BbCA+IDEzKQkJLyogbmVlZCBub3QgY2hlY2sgZm9yIDwgMCAqLwotICAgIGJhZCA9IFRSVUU7Ci0gIC8qIEFyZ3VhYmx5IHRoZSBtYXhpbXVtIEFsIHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gMTMgZm9yIDgtYml0IHByZWNpc2lvbiwKLSAgICogYnV0IHRoZSBzcGVjIGRvZXNuJ3Qgc2F5IHNvLCBhbmQgd2UgdHJ5IHRvIGJlIGxpYmVyYWwgYWJvdXQgd2hhdCB3ZQotICAgKiBhY2NlcHQuICBOb3RlOiBsYXJnZSBBbCB2YWx1ZXMgY291bGQgcmVzdWx0IGluIG91dC1vZi1yYW5nZSBEQwotICAgKiBjb2VmZmljaWVudHMgZHVyaW5nIGVhcmx5IHNjYW5zLCBsZWFkaW5nIHRvIGJpemFycmUgZGlzcGxheXMgZHVlIHRvCi0gICAqIG92ZXJmbG93cyBpbiB0aGUgSURDVCBtYXRoLiAgQnV0IHdlIHdvbid0IGNyYXNoLgotICAgKi8KLSAgaWYgKGJhZCkKLSAgICBFUlJFWElUNChjaW5mbywgSkVSUl9CQURfUFJPR1JFU1NJT04sCi0JICAgICBjaW5mby0+U3MsIGNpbmZvLT5TZSwgY2luZm8tPkFoLCBjaW5mby0+QWwpOwotICAvKiBVcGRhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzLCBhbmQgdmVyaWZ5IHRoYXQgc2NhbiBvcmRlciBpcyBsZWdhbC4KLSAgICogTm90ZSB0aGF0IGludGVyLXNjYW4gaW5jb25zaXN0ZW5jaWVzIGFyZSB0cmVhdGVkIGFzIHdhcm5pbmdzCi0gICAqIG5vdCBmYXRhbCBlcnJvcnMgLi4uIG5vdCBjbGVhciBpZiB0aGlzIGlzIHJpZ2h0IHdheSB0byBiZWhhdmUuCi0gICAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGludCBjaW5kZXggPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0tPmNvbXBvbmVudF9pbmRleDsKLSAgICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbY2luZGV4XVswXTsKLSAgICBpZiAoIWlzX0RDX2JhbmQgJiYgY29lZl9iaXRfcHRyWzBdIDwgMCkgLyogQUMgd2l0aG91dCBwcmlvciBEQyBzY2FuICovCi0gICAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIDApOwotICAgIGZvciAoY29lZmkgPSBjaW5mby0+U3M7IGNvZWZpIDw9IGNpbmZvLT5TZTsgY29lZmkrKykgewotICAgICAgaW50IGV4cGVjdGVkID0gKGNvZWZfYml0X3B0cltjb2VmaV0gPCAwKSA/IDAgOiBjb2VmX2JpdF9wdHJbY29lZmldOwotICAgICAgaWYgKGNpbmZvLT5BaCAhPSBleHBlY3RlZCkKLQlXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIGNvZWZpKTsKLSAgICAgIGNvZWZfYml0X3B0cltjb2VmaV0gPSBjaW5mby0+QWw7Ci0gICAgfQotICB9Ci0KLSAgLyogU2VsZWN0IE1DVSBkZWNvZGluZyByb3V0aW5lICovCi0gIGlmIChjaW5mby0+QWggPT0gMCkgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0RDX2ZpcnN0OwotICAgIGVsc2UKLSAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19maXJzdDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19yZWZpbmU7Ci0gICAgZWxzZQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0FDX3JlZmluZTsKLSAgfQotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBNYWtlIHN1cmUgcmVxdWVzdGVkIHRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIGNvbXB1dGUgZGVyaXZlZCB0YWJsZXMuCi0gICAgICogV2UgbWF5IGJ1aWxkIHNhbWUgZGVyaXZlZCB0YWJsZSBtb3JlIHRoYW4gb25jZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZS4KLSAgICAgKi8KLSAgICBpZiAoaXNfRENfYmFuZCkgewotICAgICAgaWYgKGNpbmZvLT5BaCA9PSAwKSB7CS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KLQl0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0JanBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIHRibCwKLQkJCQkmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCB0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKLSAgICAgIC8qIHJlbWVtYmVyIHRoZSBzaW5nbGUgYWN0aXZlIHRhYmxlICovCi0gICAgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdOwotICAgIH0KLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KLSAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSAwOwotCi0gIC8qIEluaXRpYWxpemUgcmVzdGFydCBjb3VudGVyICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci19Ci0KLQotLyoKLSAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCi0gKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KLSAqLwotCi0jaWZkZWYgQVZPSURfVEFCTEVTCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQotCi0jZWxzZQotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCi0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCi0gIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KLSAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAotICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCi0gICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKLSAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07Ci0KLSNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KLQotCi0vKgotICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCi0gKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KLSAqLwotCi1MT0NBTChib29sZWFuKQotcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpOwotCi0gIC8qIFRocm93IGF3YXkgYW55IHVudXNlZCBiaXRzIHJlbWFpbmluZyBpbiBiaXQgYnVmZmVyOyAqLwotICAvKiBpbmNsdWRlIGFueSBmdWxsIGJ5dGVzIGluIG5leHRfbWFya2VyJ3MgY291bnQgb2YgZGlzY2FyZGVkIGJ5dGVzICovCi0gIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgLyA4OwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotCi0gIC8qIEFkdmFuY2UgcGFzdCB0aGUgUlNUbiBtYXJrZXIgKi8KLSAgaWYgKCEgKCpjaW5mby0+bWFya2VyLT5yZWFkX3Jlc3RhcnRfbWFya2VyKSAoY2luZm8pKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgLyogUmUtaW5pdCBFT0IgcnVuIGNvdW50LCB0b28gKi8KLSAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKLQotICAvKiBSZXNldCByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLQotICAvKiBSZXNldCBvdXQtb2YtZGF0YSBmbGFnLCB1bmxlc3MgcmVhZF9yZXN0YXJ0X21hcmtlciBsZWZ0IHVzIHNtYWNrIHVwCi0gICAqIGFnYWluc3QgYSBtYXJrZXIuICBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBlbmQgdXAgdHJlYXRpbmcgdGhlIG5leHQgZGF0YQotICAgKiBzZWdtZW50IGFzIGVtcHR5LCBhbmQgd2UgY2FuIGF2b2lkIHByb2R1Y2luZyBib2d1cyBvdXRwdXQgcGl4ZWxzIGJ5Ci0gICAqIGxlYXZpbmcgdGhlIGZsYWcgc2V0LgotICAgKi8KLSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApCi0gICAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEh1ZmZtYW4gTUNVIGRlY29kaW5nLgotICogRWFjaCBvZiB0aGVzZSByb3V0aW5lcyBkZWNvZGVzIGFuZCByZXR1cm5zIG9uZSBNQ1UncyB3b3J0aCBvZgotICogSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4gCi0gKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAotICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCi0gKgotICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQotICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIElTIElOSVRJQUxMWSBaRVJPRUQgQlkgVEhFIENBTExFUi4KLSAqCi0gKiBXZSByZXR1cm4gRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KLSAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKLSAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgotICogc3BlY3RyYWwgc2VsZWN0aW9uLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuCi0gKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBoYXMgdG8gYmUgbW9yZSBjYXJlZnVsLCBob3dldmVyLikKLSAqLwotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBEQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0RDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICByZWdpc3RlciBpbnQgcywgcjsKLSAgaW50IGJsa24sIGNpOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCi0gICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgotICAgKi8KLSAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7Ci0KLSAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOwotCi0gICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLwotCi0gICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICB0YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXTsKLQotICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLSAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCi0gICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7Ci0gICAgICBpZiAocykgewotCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JciA9IEdFVF9CSVRTKHMpOwotCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKLSAgICAgIH0KLQotICAgICAgLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCi0gICAgICBzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKLSAgICAgIHN0YXRlLmxhc3RfZGNfdmFsW2NpXSA9IHM7Ci0gICAgICAvKiBTY2FsZSBhbmQgb3V0cHV0IHRoZSBjb2VmZmljaWVudCAoYXNzdW1lcyBqcGVnX25hdHVyYWxfb3JkZXJbMF09MCkgKi8KLSAgICAgICgqYmxvY2spWzBdID0gKEpDT0VGKSAocyA8PCBBbCk7Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBBQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0FDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIHJlZ2lzdGVyIGludCBzLCBrLCByOwotICB1bnNpZ25lZCBpbnQgRU9CUlVOOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KLSAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZS4KLSAgICAgKiBXZSBjYW4gYXZvaWQgbG9hZGluZy9zYXZpbmcgYml0cmVhZCBzdGF0ZSBpZiBpbiBhbiBFT0IgcnVuLgotICAgICAqLwotICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsJLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KLQotICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCi0KLSAgICBpZiAoRU9CUlVOID4gMCkJCS8qIGlmIGl0J3MgYSBiYW5kIG9mIHplcm9lcy4uLiAqLwotICAgICAgRU9CUlVOLS07CQkJLyogLi4ucHJvY2VzcyBpdCBub3cgKHdlIGRvIG5vdGhpbmcpICovCi0gICAgZWxzZSB7Ci0gICAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKLSAgICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwotCi0gICAgICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKLQlyID0gcyA+PiA0OwotCXMgJj0gMTU7Ci0JaWYgKHMpIHsKLQkgIGsgKz0gcjsKLQkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICByID0gR0VUX0JJVFMocyk7Ci0JICBzID0gSFVGRl9FWFRFTkQociwgcyk7Ci0JICAvKiBTY2FsZSBhbmQgb3V0cHV0IGNvZWZmaWNpZW50IGluIG5hdHVyYWwgKGRlemlnemFnZ2VkKSBvcmRlciAqLwotCSAgKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA9IChKQ09FRikgKHMgPDwgQWwpOwotCX0gZWxzZSB7Ci0JICBpZiAociA9PSAxNSkgewkvKiBaUkwgKi8KLQkgICAgayArPSAxNTsJCS8qIHNraXAgMTUgemVyb2VzIGluIGJhbmQgKi8KLQkgIH0gZWxzZSB7CQkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KLQkgICAgRU9CUlVOID0gMSA8PCByOwotCSAgICBpZiAocikgewkJLyogRU9CciwgciA+IDAgKi8KLQkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCByZXR1cm4gRkFMU0UpOwotCSAgICAgIHIgPSBHRVRfQklUUyhyKTsKLQkgICAgICBFT0JSVU4gKz0gcjsKLQkgICAgfQotCSAgICBFT0JSVU4tLTsJCS8qIHRoaXMgYmFuZCBpcyBwcm9jZXNzZWQgYXQgdGhpcyBtb21lbnQgKi8KLQkgICAgYnJlYWs7CQkvKiBmb3JjZSBlbmQtb2YtYmFuZCAqLwotCSAgfQotCX0KLSAgICAgIH0KLQotICAgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0gIH0KLQotICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBkZWNvZGluZyBmb3IgREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KLSAqIE5vdGU6IHdlIGFzc3VtZSBzdWNoIHNjYW5zIGNhbiBiZSBtdWx0aS1jb21wb25lbnQsIGFsdGhvdWdoIHRoZSBzcGVjCi0gKiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGUgcG9pbnQuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0RDX3JlZmluZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsgICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgaW50IGJsa247Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotCi0gIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBOb3Qgd29ydGggdGhlIGN5Y2xlcyB0byBjaGVjayBpbnN1ZmZpY2llbnRfZGF0YSBoZXJlLAotICAgKiBzaW5jZSB3ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIGRhdGEgYW55d2F5IGlmIHdlIHJlYWQgemVyb2VzLgotICAgKi8KLQotICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLQotICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotCi0gICAgLyogRW5jb2RlZCBkYXRhIGlzIHNpbXBseSB0aGUgbmV4dCBiaXQgb2YgdGhlIHR3bydzLWNvbXBsZW1lbnQgREMgdmFsdWUgKi8KLSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCByZXR1cm4gRkFMU0UpOwotICAgIGlmIChHRVRfQklUUygxKSkKLSAgICAgICgqYmxvY2spWzBdIHw9IHAxOwotICAgIC8qIE5vdGU6IHNpbmNlIHdlIHVzZSB8PSwgcmVwZWF0aW5nIHRoZSBhc3NpZ25tZW50IGxhdGVyIGlzIHNhZmUgKi8KLSAgfQotCi0gIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZGVjb2RlX21jdV9BQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgaW50IG0xID0gKC0xKSA8PCBjaW5mby0+QWw7CS8qIC0xIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0gIHVuc2lnbmVkIGludCBFT0JSVU47Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgSkNPRUZQVFIgdGhpc2NvZWY7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLSAgaW50IG51bV9uZXduejsKLSAgaW50IG5ld256X3Bvc1tEQ1RTSVpFMl07Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwgZG9uJ3QgbW9kaWZ5IHRoZSBNQ1UuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgRU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLwotCi0gICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KLSAgICBibG9jayA9IE1DVV9kYXRhWzBdOwotICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwotCi0gICAgLyogSWYgd2UgYXJlIGZvcmNlZCB0byBzdXNwZW5kLCB3ZSBtdXN0IHVuZG8gdGhlIGFzc2lnbm1lbnRzIHRvIGFueSBuZXdseQotICAgICAqIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoZSBibG9jaywgYmVjYXVzZSBvdGhlcndpc2Ugd2UnZCBnZXQgY29uZnVzZWQKLSAgICAgKiBuZXh0IHRpbWUgYWJvdXQgd2hpY2ggY29lZmZpY2llbnRzIHdlcmUgYWxyZWFkeSBub256ZXJvLgotICAgICAqIEJ1dCB3ZSBuZWVkIG5vdCB1bmRvIGFkZGl0aW9uIG9mIGJpdHMgdG8gYWxyZWFkeS1ub256ZXJvIGNvZWZmaWNpZW50czsKLSAgICAgKiBpbnN0ZWFkLCB3ZSBjYW4gdGVzdCB0aGUgY3VycmVudCBiaXQgdG8gc2VlIGlmIHdlIGFscmVhZHkgZGlkIGl0LgotICAgICAqLwotICAgIG51bV9uZXdueiA9IDA7Ci0KLSAgICAvKiBpbml0aWFsaXplIGNvZWZmaWNpZW50IGxvb3AgY291bnRlciB0byBzdGFydCBvZiBiYW5kICovCi0gICAgayA9IGNpbmZvLT5TczsKLQotICAgIGlmIChFT0JSVU4gPT0gMCkgewotICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgewotCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIGdvdG8gdW5kb2l0LCBsYWJlbDMpOwotCXIgPSBzID4+IDQ7Ci0JcyAmPSAxNTsKLQlpZiAocykgewotCSAgaWYgKHMgIT0gMSkJCS8qIHNpemUgb2YgbmV3IGNvZWYgc2hvdWxkIGFsd2F5cyBiZSAxICovCi0JICAgIFdBUk5NUyhjaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKLQkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKLQkgIGlmIChHRVRfQklUUygxKSkKLQkgICAgcyA9IHAxOwkJLyogbmV3bHkgbm9uemVybyBjb2VmIGlzIHBvc2l0aXZlICovCi0JICBlbHNlCi0JICAgIHMgPSBtMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBuZWdhdGl2ZSAqLwotCX0gZWxzZSB7Ci0JICBpZiAociAhPSAxNSkgewotCSAgICBFT0JSVU4gPSAxIDw8IHI7CS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLwotCSAgICBpZiAocikgewotCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHIsIGdvdG8gdW5kb2l0KTsKLQkgICAgICByID0gR0VUX0JJVFMocik7Ci0JICAgICAgRU9CUlVOICs9IHI7Ci0JICAgIH0KLQkgICAgYnJlYWs7CQkvKiByZXN0IG9mIGJsb2NrIGlzIGhhbmRsZWQgYnkgRU9CIGxvZ2ljICovCi0JICB9Ci0JICAvKiBub3RlIHMgPSAwIGZvciBwcm9jZXNzaW5nIFpSTCAqLwotCX0KLQkvKiBBZHZhbmNlIG92ZXIgYWxyZWFkeS1ub256ZXJvIGNvZWZzIGFuZCByIHN0aWxsLXplcm8gY29lZnMsCi0JICogYXBwZW5kaW5nIGNvcnJlY3Rpb24gYml0cyB0byB0aGUgbm9uemVyb2VzLiAgQSBjb3JyZWN0aW9uIGJpdCBpcyAxCi0JICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KLQkgKi8KLQlkbyB7Ci0JICB0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKLQkgIGlmICgqdGhpc2NvZWYgIT0gMCkgewotCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7Ci0JICAgIGlmIChHRVRfQklUUygxKSkgewotCSAgICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IHNldCBpdCAqLwotCQlpZiAoKnRoaXNjb2VmID49IDApCi0JCSAgKnRoaXNjb2VmICs9IHAxOwotCQllbHNlCi0JCSAgKnRoaXNjb2VmICs9IG0xOwotCSAgICAgIH0KLQkgICAgfQotCSAgfSBlbHNlIHsKLQkgICAgaWYgKC0tciA8IDApCi0JICAgICAgYnJlYWs7CQkvKiByZWFjaGVkIHRhcmdldCB6ZXJvIGNvZWZmaWNpZW50ICovCi0JICB9Ci0JICBrKys7Ci0JfSB3aGlsZSAoayA8PSBTZSk7Ci0JaWYgKHMpIHsKLQkgIGludCBwb3MgPSBqcGVnX25hdHVyYWxfb3JkZXJba107Ci0JICAvKiBPdXRwdXQgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCAqLwotCSAgKCpibG9jaylbcG9zXSA9IChKQ09FRikgczsKLQkgIC8qIFJlbWVtYmVyIGl0cyBwb3NpdGlvbiBpbiBjYXNlIHdlIGhhdmUgdG8gc3VzcGVuZCAqLwotCSAgbmV3bnpfcG9zW251bV9uZXdueisrXSA9IHBvczsKLQl9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKEVPQlJVTiA+IDApIHsKLSAgICAgIC8qIFNjYW4gYW55IHJlbWFpbmluZyBjb2VmZmljaWVudCBwb3NpdGlvbnMgYWZ0ZXIgdGhlIGVuZC1vZi1iYW5kCi0gICAgICAgKiAodGhlIGxhc3QgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCwgaWYgYW55KS4gIEFwcGVuZCBhIGNvcnJlY3Rpb24KLSAgICAgICAqIGJpdCB0byBlYWNoIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudC4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQotICAgICAgICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KLSAgICAgICAqLwotICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgewotCXRoaXNjb2VmID0gKmJsb2NrICsganBlZ19uYXR1cmFsX29yZGVyW2tdOwotCWlmICgqdGhpc2NvZWYgIT0gMCkgewotCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOwotCSAgaWYgKEdFVF9CSVRTKDEpKSB7Ci0JICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IGNoYW5nZWQgaXQgKi8KLQkgICAgICBpZiAoKnRoaXNjb2VmID49IDApCi0JCSp0aGlzY29lZiArPSBwMTsKLQkgICAgICBlbHNlCi0JCSp0aGlzY29lZiArPSBtMTsKLQkgICAgfQotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIC8qIENvdW50IG9uZSBibG9jayBjb21wbGV0ZWQgaW4gRU9CIHJ1biAqLwotICAgICAgRU9CUlVOLS07Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47IC8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0gIH0KLQotICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0KLSAgcmV0dXJuIFRSVUU7Ci0KLXVuZG9pdDoKLSAgLyogUmUtemVybyBhbnkgb3V0cHV0IGNvZWZmaWNpZW50cyB0aGF0IHdlIG1hZGUgbmV3bHkgbm9uemVybyAqLwotICB3aGlsZSAobnVtX25ld256ID4gMCkKLSAgICAoKmJsb2NrKVtuZXduel9wb3NbLS1udW1fbmV3bnpdXSA9IDA7Ci0KLSAgcmV0dXJuIEZBTFNFOwotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKLSAgaW50ICpjb2VmX2JpdF9wdHI7Ci0gIGludCBjaSwgaTsKLQotICBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKHBodWZmX2VudHJvcHlfZGVjb2RlcikpOwotICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKLSAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3BodWZmX2RlY29kZXI7Ci0KLSAgLyogTWFyayBkZXJpdmVkIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSAgfQotCi0gIC8qIENyZWF0ZSBwcm9ncmVzc2lvbiBzdGF0dXMgdGFibGUgKi8KLSAgY2luZm8tPmNvZWZfYml0cyA9IChpbnQgKCopW0RDVFNJWkUyXSkKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCWNpbmZvLT5udW1fY29tcG9uZW50cypEQ1RTSVpFMipTSVpFT0YoaW50KSk7Ci0gIGNvZWZfYml0X3B0ciA9ICYgY2luZm8tPmNvZWZfYml0c1swXVswXTsKLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKLSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykKLSAgICAgICpjb2VmX2JpdF9wdHIrKyA9IC0xOwotfQotCi0jZW5kaWYgLyogRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2pkc2FtcGxlLmMgYi9qZHNhbXBsZS5jCmluZGV4IDgwZmZlZmIuLjdiYzg4ODUgMTAwNjQ0Ci0tLSBhL2pkc2FtcGxlLmMKKysrIGIvamRzYW1wbGUuYwpAQCAtMiwxMyArMiwxNCBAQAogICogamRzYW1wbGUuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIE1vZGlmaWVkIDIwMDItMjAwOCBieSBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdXBzYW1wbGluZyByb3V0aW5lcy4KICAqCiAgKiBVcHNhbXBsaW5nIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSAodl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUpCisgKiBpcyBkZWZpbmVkIHRvIGJlICh2X3NhbXBfZmFjdG9yICogRENUX3Zfc2NhbGVkX3NpemUgLyBtaW5fRENUX3Zfc2NhbGVkX3NpemUpCiAgKiBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFVwc2FtcGxpbmcgd2lsbCBub3JtYWxseSBwcm9kdWNlCiAgKiBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIGZyb20gZWFjaCByb3cgZ3JvdXAgKGJ1dCB0aGlzIGNvdWxkIHZhcnkKICAqIGlmIHRoZSB1cHNhbXBsZXIgaXMgYXBwbHlpbmcgYSBzY2FsZSBmYWN0b3Igb2YgaXRzIG93bikuCkBAIC0yMzcsMTEgKzIzOCwxMSBAQAogICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwogICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CiAgIEpTQU1QUk9XIG91dGVuZDsKLSAgaW50IGlucm93OworICBpbnQgb3V0cm93OwogCi0gIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgewotICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOworICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbb3V0cm93XTsKKyAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwogICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7CiAgICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgewogICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCkBAIC0yODYsMTEyICsyODcsNiBAQAogCiAKIC8qCi0gKiBGYW5jeSBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLSAqCi0gKiBUaGUgdXBzYW1wbGluZyBhbGdvcml0aG0gaXMgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBwaXhlbCBjZW50ZXJzLAotICogYWxzbyBrbm93biBhcyBhICJ0cmlhbmdsZSBmaWx0ZXIiLiAgVGhpcyBpcyBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuCi0gKiBzcGVlZCBhbmQgdmlzdWFsIHF1YWxpdHkuICBUaGUgY2VudGVycyBvZiB0aGUgb3V0cHV0IHBpeGVscyBhcmUgMS80IGFuZCAzLzQKLSAqIG9mIHRoZSB3YXkgYmV0d2VlbiBpbnB1dCBwaXhlbCBjZW50ZXJzLgotICoKLSAqIEEgbm90ZSBhYm91dCB0aGUgImJpYXMiIGNhbGN1bGF0aW9uczogd2hlbiByb3VuZGluZyBmcmFjdGlvbmFsIHZhbHVlcyB0bwotICogaW50ZWdlciwgd2UgZG8gbm90IHdhbnQgdG8gYWx3YXlzIHJvdW5kIDAuNSB1cCB0byB0aGUgbmV4dCBpbnRlZ2VyLgotICogSWYgd2UgZGlkIHRoYXQsIHdlJ2QgaW50cm9kdWNlIGEgbm90aWNlYWJsZSBiaWFzIHRvd2FyZHMgbGFyZ2VyIHZhbHVlcy4KLSAqIEluc3RlYWQsIHRoaXMgY29kZSBpcyBhcnJhbmdlZCBzbyB0aGF0IDAuNSB3aWxsIGJlIHJvdW5kZWQgdXAgb3IgZG93biBhdAotICogYWx0ZXJuYXRlIHBpeGVsIGxvY2F0aW9ucyAoYSBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgcGF0dGVybikuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX2ZhbmN5X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgaW52YWx1ZTsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2xjdHI7Ci0gIGludCBpbnJvdzsKLQotICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKLSAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLwotICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgaW52YWx1ZTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICogMyArIEdFVEpTQU1QTEUoKmlucHRyKSArIDIpID4+IDIpOwotCi0gICAgZm9yIChjb2xjdHIgPSBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7Ci0gICAgICAvKiBHZW5lcmFsIGNhc2U6IDMvNCAqIG5lYXJlciBwaXhlbCArIDEvNCAqIGZ1cnRoZXIgcGl4ZWwgKi8KLSAgICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cisrKSAqIDM7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICsgR0VUSlNBTVBMRShpbnB0clstMl0pICsgMSkgPj4gMik7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICsgR0VUSlNBTVBMRSgqaW5wdHIpICsgMikgPj4gMik7Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSAqIDMgKyBHRVRKU0FNUExFKGlucHRyWy0xXSkgKyAxKSA+PiAyKTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgaW52YWx1ZTsKLSAgfQotfQotCi0KLS8qCi0gKiBGYW5jeSBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KLSAqIEFnYWluIGEgdHJpYW5nbGUgZmlsdGVyOyBzZWUgY29tbWVudHMgZm9yIGgydjEgY2FzZSwgYWJvdmUuCi0gKgotICogSXQgaXMgT0sgZm9yIHVzIHRvIHJlZmVyZW5jZSB0aGUgYWRqYWNlbnQgaW5wdXQgcm93cyBiZWNhdXNlIHdlIGRlbWFuZGVkCi0gKiBjb250ZXh0IGZyb20gdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgKHNlZSBpbml0aWFsaXphdGlvbiBjb2RlKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBvdXRwdHI7Ci0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSAgcmVnaXN0ZXIgaW50IHRoaXNjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07Ci0jZWxzZQotICByZWdpc3RlciBJTlQzMiB0aGlzY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOwotI2VuZGlmCi0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sY3RyOwotICBpbnQgaW5yb3csIG91dHJvdywgdjsKLQotICBpbnJvdyA9IG91dHJvdyA9IDA7Ci0gIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICBmb3IgKHYgPSAwOyB2IDwgMjsgdisrKSB7Ci0gICAgICAvKiBpbnB0cjAgcG9pbnRzIHRvIG5lYXJlc3QgaW5wdXQgcm93LCBpbnB0cjEgcG9pbnRzIHRvIG5leHQgbmVhcmVzdCAqLwotICAgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgICBpZiAodiA9PSAwKQkJLyogbmV4dCBuZWFyZXN0IGlzIHJvdyBhYm92ZSAqLwotCWlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3ctMV07Ci0gICAgICBlbHNlCQkJLyogbmV4dCBuZWFyZXN0IGlzIHJvdyBiZWxvdyAqLwotCWlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07Ci0gICAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3crK107Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCi0gICAgICB0aGlzY29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgIG5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDQgKyA4KSA+PiA0KTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbmV4dGNvbHN1bSArIDcpID4+IDQpOwotICAgICAgbGFzdGNvbHN1bSA9IHRoaXNjb2xzdW07IHRoaXNjb2xzdW0gPSBuZXh0Y29sc3VtOwotCi0gICAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKLQkvKiBHZW5lcmFsIGNhc2U6IDMvNCAqIG5lYXJlciBwaXhlbCArIDEvNCAqIGZ1cnRoZXIgcGl4ZWwgaW4gZWFjaCAqLwotCS8qIGRpbWVuc2lvbiwgdGh1cyA5LzE2LCAzLzE2LCAzLzE2LCAxLzE2IG92ZXJhbGwgKi8KLQluZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLQkqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIGxhc3Rjb2xzdW0gKyA4KSA+PiA0KTsKLQkqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIG5leHRjb2xzdW0gKyA3KSA+PiA0KTsKLQlsYXN0Y29sc3VtID0gdGhpc2NvbHN1bTsgdGhpc2NvbHN1bSA9IG5leHRjb2xzdW07Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbGFzdGNvbHN1bSArIDgpID4+IDQpOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDQgKyA3KSA+PiA0KTsKLSAgICB9Ci0gICAgaW5yb3crKzsKLSAgfQotfQotCi0KLS8qCiAgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgdXBzYW1wbGluZy4KICAqLwogCkBAIC00MDEsNyArMjk2LDcgQEAKICAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlOwogICBpbnQgY2k7CiAgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBib29sZWFuIG5lZWRfYnVmZmVyLCBkb19mYW5jeTsKKyAgYm9vbGVhbiBuZWVkX2J1ZmZlcjsKICAgaW50IGhfaW5fZ3JvdXAsIHZfaW5fZ3JvdXAsIGhfb3V0X2dyb3VwLCB2X291dF9ncm91cDsKIAogICB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpCkBAIC00MTUsMTEgKzMxMCw2IEBACiAgIGlmIChjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykJLyogdGhpcyBpc24ndCBzdXBwb3J0ZWQgKi8KICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NDSVI2MDFfTk9USU1QTCk7CiAKLSAgLyogamRtYWluY3QuYyBkb2Vzbid0IHN1cHBvcnQgY29udGV4dCByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSA9IDEsCi0gICAqIHNvIGRvbid0IGFzayBmb3IgaXQuCi0gICAqLwotICBkb19mYW5jeSA9IGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nICYmIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID4gMTsKLQogICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgc2VsZWN0IHBlci1jb21wb25lbnQgbWV0aG9kcywKICAgICogYW5kIGNyZWF0ZSBzdG9yYWdlIGFzIG5lZWRlZC4KICAgICovCkBAIC00MjgsMTAgKzMxOCwxMCBAQAogICAgIC8qIENvbXB1dGUgc2l6ZSBvZiBhbiAiaW5wdXQgZ3JvdXAiIGFmdGVyIElEQ1Qgc2NhbGluZy4gIFRoaXMgbWFueSBzYW1wbGVzCiAgICAgICogYXJlIHRvIGJlIGNvbnZlcnRlZCB0byBtYXhfaF9zYW1wX2ZhY3RvciAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVscy4KICAgICAgKi8KLSAgICBoX2luX2dyb3VwID0gKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLQkJIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIHZfaW5fZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotCQkgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgaF9pbl9ncm91cCA9IChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX2hfc2NhbGVkX3NpemUpIC8KKwkJIGNpbmZvLT5taW5fRENUX2hfc2NhbGVkX3NpemU7CisgICAgdl9pbl9ncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3Zfc2NhbGVkX3NpemUpIC8KKwkJIGNpbmZvLT5taW5fRENUX3Zfc2NhbGVkX3NpemU7CiAgICAgaF9vdXRfZ3JvdXAgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3I7CiAgICAgdl9vdXRfZ3JvdXAgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CiAgICAgdXBzYW1wbGUtPnJvd2dyb3VwX2hlaWdodFtjaV0gPSB2X2luX2dyb3VwOyAvKiBzYXZlIGZvciB1c2UgbGF0ZXIgKi8KQEAgLTQ0NiwxOSArMzM2LDEyIEBACiAgICAgICBuZWVkX2J1ZmZlciA9IEZBTFNFOwogICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKIAkgICAgICAgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgewotICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgMmgxdiB1cHNhbXBsaW5nICovCi0gICAgICBpZiAoZG9fZmFuY3kgJiYgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPiAyKQotCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZmFuY3lfdXBzYW1wbGU7Ci0gICAgICBlbHNlCi0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV91cHNhbXBsZTsKKyAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgMmgxdiB1cHNhbXBsaW5nICovCisgICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX3Vwc2FtcGxlOwogICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKIAkgICAgICAgdl9pbl9ncm91cCAqIDIgPT0gdl9vdXRfZ3JvdXApIHsKLSAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMnYgdXBzYW1wbGluZyAqLwotICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikgewotCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZmFuY3lfdXBzYW1wbGU7Ci0JdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7Ci0gICAgICB9IGVsc2UKLQl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Vwc2FtcGxlOworICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciAyaDJ2IHVwc2FtcGxpbmcgKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfdXBzYW1wbGU7CiAgICAgfSBlbHNlIGlmICgoaF9vdXRfZ3JvdXAgJSBoX2luX2dyb3VwKSA9PSAwICYmCiAJICAgICAgICh2X291dF9ncm91cCAlIHZfaW5fZ3JvdXApID09IDApIHsKICAgICAgIC8qIEdlbmVyaWMgaW50ZWdyYWwtZmFjdG9ycyB1cHNhbXBsaW5nIG1ldGhvZCAqLwpkaWZmIC0tZ2l0IGEvamR0cmFucy5jIGIvamR0cmFucy5jCmluZGV4IDdhM2IyNjguLjM4NWMzMzYgMTAwNjQ0Ci0tLSBhL2pkdHJhbnMuYworKysgYi9qZHRyYW5zLmMKQEAgLTEwMywxNCArMTAzLDcgQEAKICAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKQogICAgIGppbml0X2FyaXRoX2RlY29kZXIoY2luZm8pOwogICBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICBqaW5pdF9odWZmX2RlY29kZXIoY2luZm8pOworICAgIGppbml0X2h1ZmZfZGVjb2RlcihjaW5mbyk7CiAgIH0KIAogICAvKiBBbHdheXMgZ2V0IGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIuICovCmRpZmYgLS1naXQgYS9qZXJyb3IuaCBiL2plcnJvci5oCmluZGV4IDEwOWUzZDMuLjFjZmIyYjEgMTAwNjQ0Ci0tLSBhL2plcnJvci5oCisrKyBiL2plcnJvci5oCkBAIC0yLDYgKzIsNyBAQAogICogamVycm9yLmgKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAxOTk3LTIwMDkgYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtMzksMTQgKzQwLDE1IEBACiBKTUVTU0FHRShKTVNHX05PTUVTU0FHRSwgIkJvZ3VzIG1lc3NhZ2UgY29kZSAlZCIpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCiAKIC8qIEZvciBtYWludGVuYW5jZSBjb252ZW5pZW5jZSwgbGlzdCBpcyBhbHBoYWJldGljYWwgYnkgbWVzc2FnZSBjb2RlIG5hbWUgKi8KLUpNRVNTQUdFKEpFUlJfQVJJVEhfTk9USU1QTCwKLQkgIlNvcnJ5LCB0aGVyZSBhcmUgbGVnYWwgcmVzdHJpY3Rpb25zIG9uIGFyaXRobWV0aWMgY29kaW5nIikKIEpNRVNTQUdFKEpFUlJfQkFEX0FMSUdOX1RZUEUsICJBTElHTl9UWVBFIGlzIHdyb25nLCBwbGVhc2UgZml4IikKIEpNRVNTQUdFKEpFUlJfQkFEX0FMTE9DX0NIVU5LLCAiTUFYX0FMTE9DX0NIVU5LIGlzIHdyb25nLCBwbGVhc2UgZml4IikKIEpNRVNTQUdFKEpFUlJfQkFEX0JVRkZFUl9NT0RFLCAiQm9ndXMgYnVmZmVyIGNvbnRyb2wgbW9kZSIpCiBKTUVTU0FHRShKRVJSX0JBRF9DT01QT05FTlRfSUQsICJJbnZhbGlkIGNvbXBvbmVudCBJRCAlZCBpbiBTT1MiKQorSk1FU1NBR0UoSkVSUl9CQURfQ1JPUF9TUEVDLCAiSW52YWxpZCBjcm9wIHJlcXVlc3QiKQogSk1FU1NBR0UoSkVSUl9CQURfRENUX0NPRUYsICJEQ1QgY29lZmZpY2llbnQgb3V0IG9mIHJhbmdlIikKLUpNRVNTQUdFKEpFUlJfQkFEX0RDVFNJWkUsICJJRENUIG91dHB1dCBibG9jayBzaXplICVkIG5vdCBzdXBwb3J0ZWQiKQorSk1FU1NBR0UoSkVSUl9CQURfRENUU0laRSwgIkRDVCBzY2FsZWQgYmxvY2sgc2l6ZSAlZHglZCBub3Qgc3VwcG9ydGVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX0RST1BfU0FNUExJTkcsCisJICJDb21wb25lbnQgaW5kZXggJWQ6IG1pc21hdGNoaW5nIHNhbXBsaW5nIHJhdGlvICVkOiVkLCAlZDolZCwgJWMiKQogSk1FU1NBR0UoSkVSUl9CQURfSFVGRl9UQUJMRSwgIkJvZ3VzIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiIpCiBKTUVTU0FHRShKRVJSX0JBRF9JTl9DT0xPUlNQQUNFLCAiQm9ndXMgaW5wdXQgY29sb3JzcGFjZSIpCiBKTUVTU0FHRShKRVJSX0JBRF9KX0NPTE9SU1BBQ0UsICJCb2d1cyBKUEVHIGNvbG9yc3BhY2UiKQpAQCAtMjI5LDYgKzIzMSwxNSBAQAogICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzJdID0gKHAzKSwgXAogICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzNdID0gKHA0KSwgXAogICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKyNkZWZpbmUgRVJSRVhJVDYoY2luZm8sY29kZSxwMSxwMixwMyxwNCxwNSxwNikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsyXSA9IChwMyksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVszXSA9IChwNCksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVs0XSA9IChwNSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVs1XSA9IChwNiksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCiAjZGVmaW5lIEVSUkVYSVRTKGNpbmZvLGNvZGUsc3RyKSAgXAogICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAogICAgc3RybmNweSgoY2luZm8pLT5lcnItPm1zZ19wYXJtLnMsIChzdHIpLCBKTVNHX1NUUl9QQVJNX01BWCksIFwKZGlmZiAtLWdpdCBhL2pmZGN0Zmx0LmMgYi9qZmRjdGZsdC5jCmluZGV4IDc5ZDdhMDAuLjc0ZDBkODYgMTAwNjQ0Ci0tLSBhL2pmZGN0Zmx0LmMKKysrIGIvamZkY3RmbHQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIGpmZGN0Zmx0LmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDAzLTIwMDkgYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtNTYsNDEgKzU3LDQ2IEBACiAgKi8KIAogR0xPQkFMKHZvaWQpCi1qcGVnX2ZkY3RfZmxvYXQgKEZBU1RfRkxPQVQgKiBkYXRhKQoranBlZ19mZGN0X2Zsb2F0IChGQVNUX0ZMT0FUICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCiB7CiAgIEZBU1RfRkxPQVQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKICAgRkFTVF9GTE9BVCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKICAgRkFTVF9GTE9BVCB6MSwgejIsIHozLCB6NCwgejUsIHoxMSwgejEzOwogICBGQVNUX0ZMT0FUICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOwogICBpbnQgY3RyOwogCiAgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLwogCiAgIGRhdGFwdHIgPSBkYXRhOwotICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7Ci0gICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOwotICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKLSAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07Ci0gICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOwotICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKLSAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07Ci0gICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOwotICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKLSAgICAKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlICovCisgICAgdG1wMCA9IChGQVNUX0ZMT0FUKSAoR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSkpOworICAgIHRtcDcgPSAoRkFTVF9GTE9BVCkgKEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbN10pKTsKKyAgICB0bXAxID0gKEZBU1RfRkxPQVQpIChHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzZdKSk7CisgICAgdG1wNiA9IChGQVNUX0ZMT0FUKSAoR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls2XSkpOworICAgIHRtcDIgPSAoRkFTVF9GTE9BVCkgKEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNV0pKTsKKyAgICB0bXA1ID0gKEZBU1RfRkxPQVQpIChHRVRKU0FNUExFKGVsZW1wdHJbMl0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKSk7CisgICAgdG1wMyA9IChGQVNUX0ZMT0FUKSAoR0VUSlNBTVBMRShlbGVtcHRyWzNdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls0XSkpOworICAgIHRtcDQgPSAoRkFTVF9GTE9BVCkgKEdFVEpTQU1QTEUoZWxlbXB0clszXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pKTsKKwogICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAorCiAgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLwogICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CiAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKICAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIGRhdGFwdHJbMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisKKyAgICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMSAtIDggKiBDRU5URVJKU0FNUExFOyAvKiBwaGFzZSAzICovCiAgICAgZGF0YXB0cls0XSA9IHRtcDEwIC0gdG1wMTE7Ci0gICAgCisKICAgICB6MSA9ICh0bXAxMiArIHRtcDEzKSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLwogICAgIGRhdGFwdHJbMl0gPSB0bXAxMyArIHoxOwkvKiBwaGFzZSA1ICovCiAgICAgZGF0YXB0cls2XSA9IHRtcDEzIC0gejE7Ci0gICAgCisKICAgICAvKiBPZGQgcGFydCAqLwogCiAgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLwpAQCAtMTI2LDIxICsxMzIsMjEgQEAKICAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOwogICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CiAgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICAKKwogICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAorCiAgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLwogICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CiAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKICAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAorCiAgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwogICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IHRtcDEwIC0gdG1wMTE7Ci0gICAgCisKICAgICB6MSA9ICh0bXAxMiArIHRtcDEzKSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLwogICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KICAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOwotICAgIAorCiAgICAgLyogT2RkIHBhcnQgKi8KIAogICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KZGlmZiAtLWdpdCBhL2pmZGN0ZnN0LmMgYi9qZmRjdGZzdC5jCmluZGV4IGNjYjM3OGEuLjhjYWQ1ZjIgMTAwNjQ0Ci0tLSBhL2pmZGN0ZnN0LmMKKysrIGIvamZkY3Rmc3QuYwpAQCAtMiw2ICsyLDcgQEAKICAqIGpmZGN0ZnN0LmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDAzLTIwMDkgYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtMTExLDQyICsxMTIsNDcgQEAKICAqLwogCiBHTE9CQUwodm9pZCkKLWpwZWdfZmRjdF9pZmFzdCAoRENURUxFTSAqIGRhdGEpCitqcGVnX2ZkY3RfaWZhc3QgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKIHsKICAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwogICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwogICBEQ1RFTEVNIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7CiAgIERDVEVMRU0gKmRhdGFwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CiAgIGludCBjdHI7CiAgIFNISUZUX1RFTVBTCiAKICAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCiAKICAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOwotICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKLSAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOwotICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKLSAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOwotICAgIAorICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UgKi8KKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wNyA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKyAgICB0bXA2ID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls2XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNV0pOworICAgIHRtcDUgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0clszXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworCiAgICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCisKICAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCiAgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKICAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwogICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0clswXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSB0bXAxMCArIHRtcDExIC0gOCAqIENFTlRFUkpTQU1QTEU7IC8qIHBoYXNlIDMgKi8KICAgICBkYXRhcHRyWzRdID0gdG1wMTAgLSB0bXAxMTsKLSAgICAKKwogICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KICAgICBkYXRhcHRyWzJdID0gdG1wMTMgKyB6MTsJLyogcGhhc2UgNSAqLwogICAgIGRhdGFwdHJbNl0gPSB0bXAxMyAtIHoxOwotICAgIAorCiAgICAgLyogT2RkIHBhcnQgKi8KIAogICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KQEAgLTE4MiwyMSArMTg4LDIxIEBACiAgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKICAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOwogICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgCisKICAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKKwogICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KICAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwogICAgIHRtcDExID0gdG1wMSArIHRtcDI7CiAgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKKwogICAgIGRhdGFwdHJbRENUU0laRSowXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KICAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSB0bXAxMCAtIHRtcDExOwotICAgIAorCiAgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwogICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KICAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOwotICAgIAorCiAgICAgLyogT2RkIHBhcnQgKi8KIAogICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KZGlmZiAtLWdpdCBhL2pmZGN0aW50LmMgYi9qZmRjdGludC5jCmluZGV4IDBhNzhiNjQuLjFkZGU1OGMgMTAwNjQ0Ci0tLSBhL2pmZGN0aW50LmMKKysrIGIvamZkY3RpbnQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIGpmZGN0aW50LmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmljYXRpb24gZGV2ZWxvcGVkIDIwMDMtMjAwOSBieSBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC0yMSw2ICsyMiwyMyBAQAogICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCiAgKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KICAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgorICoKKyAqIFdlIGFsc28gcHJvdmlkZSBGRENUIHJvdXRpbmVzIHdpdGggdmFyaW91cyBpbnB1dCBzYW1wbGUgYmxvY2sgc2l6ZXMgZm9yCisgKiBkaXJlY3QgcmVzb2x1dGlvbiByZWR1Y3Rpb24gb3IgZW5sYXJnZW1lbnQgYW5kIGZvciBkaXJlY3QgcmVzb2x2aW5nIHRoZQorICogY29tbW9uIDJ4MSBhbmQgMXgyIHN1YnNhbXBsaW5nIGNhc2VzIHdpdGhvdXQgYWRkaXRpb25hbCByZXNhbXBsaW5nOiBOeE4KKyAqIChOPTEuLi4xNiksIDJOeE4sIGFuZCBOeDJOIChOPTEuLi44KSBwaXhlbHMgZm9yIG9uZSA4eDggb3V0cHV0IERDVCBibG9jay4KKyAqCisgKiBGb3IgTjw4IHdlIGZpbGwgdGhlIHJlbWFpbmluZyBibG9jayBjb2VmZmljaWVudHMgd2l0aCB6ZXJvLgorICogRm9yIE4+OCB3ZSBhcHBseSBhIHBhcnRpYWwgTi1wb2ludCBGRENUIG9uIHRoZSBpbnB1dCBzYW1wbGVzLCBjb21wdXRpbmcKKyAqIGp1c3QgdGhlIGxvd2VyIDggZnJlcXVlbmN5IGNvZWZmaWNpZW50cyBhbmQgZGlzY2FyZGluZyB0aGUgcmVzdC4KKyAqCisgKiBXZSBtdXN0IHNjYWxlIHRoZSBvdXRwdXQgY29lZmZpY2llbnRzIG9mIHRoZSBOLXBvaW50IEZEQ1QgYXBwcm9wcmlhdGVseQorICogdG8gdGhlIHN0YW5kYXJkIDgtcG9pbnQgRkRDVCBsZXZlbCBieSA4L04gcGVyIDEtRCBwYXNzLiAgVGhpcyBzY2FsaW5nCisgKiBpcyBmb2xkZWQgaW50byB0aGUgY29uc3RhbnQgbXVsdGlwbGllcnMgKHBhc3MgMikgYW5kL29yIGZpbmFsL2luaXRpYWwKKyAqIHNoaWZ0aW5nLgorICoKKyAqIENBVVRJT046IFdlIHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvIGV4Y2VwdCBmb3IgdGhlIE49MSwyLDQsOCBjYXNlcworICogc2luY2UgdGhlcmUgd291bGQgYmUgdG9vIG1hbnkgYWRkaXRpb25hbCBjb25zdGFudHMgdG8gcHJlLWNhbGN1bGF0ZS4KICAqLwogCiAjZGVmaW5lIEpQRUdfSU5URVJOQUxTCkBAIC0zNiw3ICs1NCw3IEBACiAgKi8KIAogI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1QgYmxvY2tzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KICNlbmRpZgogCiAKQEAgLTEzNywxMiArMTU1LDEzIEBACiAgKi8KIAogR0xPQkFMKHZvaWQpCi1qcGVnX2ZkY3RfaXNsb3cgKERDVEVMRU0gKiBkYXRhKQoranBlZ19mZGN0X2lzbG93IChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCiB7Ci0gIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7CisgIElOVDMyIHoxOwogICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOwogICBpbnQgY3RyOwogICBTSElGVF9URU1QUwogCkBAIC0xNTEsNjIgKzE3MCw3NCBAQAogICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KIAogICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKLSAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107Ci0gICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOwotICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKLSAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07Ci0gICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOwotICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKLSAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07Ci0gICAgCisgIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKwogICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OwogICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCiAgICAgICovCi0gICAgCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisKICAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTIgPSB0bXAwIC0gdG1wMzsKICAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKSAoKHRtcDEwICsgdG1wMTEpIDw8IFBBU1MxX0JJVFMpOworICAgIHRtcDEzID0gdG1wMSAtIHRtcDI7CisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisKKyAgICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pICgodG1wMTAgKyB0bXAxMSAtIDggKiBDRU5URVJKU0FNUExFKSA8PCBQQVNTMV9CSVRTKTsKICAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pICgodG1wMTAgLSB0bXAxMSkgPDwgUEFTUzFfQklUUyk7Ci0gICAgCisKICAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7Ci0gICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCi0JCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAotCQkJCSAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHoxICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkgUklHSFRfU0hJRlQoejEgKyBNVUxUSVBMWSh0bXAxMiwgRklYXzBfNzY1MzY2ODY1KSwKKwkJCQkgICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pIFJJR0hUX1NISUZUKHoxIC0gTVVMVElQTFkodG1wMTMsIEZJWF8xXzg0Nzc1OTA2NSksCisJCQkJICAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKICAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCi0gICAgICogY0sgcmVwcmVzZW50cyBjb3MoSypwaS8xNikuCi0gICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wNC4udG1wNyBoZXJlLgorICAgICAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzE2KS4KKyAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXAwLi50bXAzIGhlcmUuCiAgICAgICovCi0gICAgCi0gICAgejEgPSB0bXA0ICsgdG1wNzsKLSAgICB6MiA9IHRtcDUgKyB0bXA2OwotICAgIHozID0gdG1wNCArIHRtcDY7Ci0gICAgejQgPSB0bXA1ICsgdG1wNzsKLSAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLwotICAgIAotICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KLSAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCi0gICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCi0gICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KLSAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLwotICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KLSAgICAKLSAgICB6MyArPSB6NTsKLSAgICB6NCArPSB6NTsKLSAgICAKLSAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wNCArIHoxICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA2ICsgejIgKyB6MywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNyArIHoxICsgejQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgCisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzFfMTc1ODc1NjAyKTsgLyogIGMzICovCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHoxICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgdG1wMCAgPSBNVUxUSVBMWSh0bXAwLCAgICBGSVhfMV81MDEzMjExMTApOyAgICAvKiAgYzErYzMtYzUtYzcgKi8KKyAgICB0bXAxICA9IE1VTFRJUExZKHRtcDEsICAgIEZJWF8zXzA3MjcxMTAyNik7ICAgIC8qICBjMStjMytjNS1jNyAqLworICAgIHRtcDIgID0gTVVMVElQTFkodG1wMiwgICAgRklYXzJfMDUzMTE5ODY5KTsgICAgLyogIGMxK2MzLWM1K2M3ICovCisgICAgdG1wMyAgPSBNVUxUSVBMWSh0bXAzLCAgICBGSVhfMF8yOTg2MzEzMzYpOyAgICAvKiAtYzErYzMrYzUtYzcgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEwLCAtIEZJWF8wXzg5OTk3NjIyMyk7ICAgIC8qICBjNy1jMyAqLworICAgIHRtcDExID0gTVVMVElQTFkodG1wMTEsIC0gRklYXzJfNTYyOTE1NDQ3KTsgICAgLyogLWMxLWMzICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMF8zOTAxODA2NDQpOyAgICAvKiAgYzUtYzMgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHRtcDEzLCAtIEZJWF8xXzk2MTU3MDU2MCk7ICAgIC8qIC1jMy1jNSAqLworCisgICAgdG1wMTIgKz0gejE7CisgICAgdG1wMTMgKz0gejE7CisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwICsgdG1wMTAgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAxICsgdG1wMTEgKyB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAyICsgdG1wMTEgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAzICsgdG1wMTAgKyB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKwogICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwogICB9CiAKQEAgLTIxNyw2NyArMjQ4LDQxMDEgQEAKIAogICBkYXRhcHRyID0gZGF0YTsKICAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICAKICAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKICAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgogICAgICAqLwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7Ci0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMyArIChPTkUgPDwgKFBBU1MxX0JJVFMtMSkpOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDM7CiAgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwICsgdG1wMTEsIFBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwIC0gdG1wMTEsIFBBU1MxX0JJVFMpOwotICAgIAorICAgIHRtcDEzID0gdG1wMSAtIHRtcDI7CisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMTEsIFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDExLCBQQVNTMV9CSVRTKTsKKwogICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEzLCBGSVhfMF83NjUzNjY4NjUpLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTIsIC0gRklYXzFfODQ3NzU5MDY1KSwKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICAKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejEgKz0gT05FIDw8IChDT05TVF9CSVRTK1BBU1MxX0JJVFMtMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh6MSArIE1VTFRJUExZKHRtcDEyLCBGSVhfMF83NjUzNjY4NjUpLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQoejEgLSBNVUxUSVBMWSh0bXAxMywgRklYXzFfODQ3NzU5MDY1KSwgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKwogICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KLSAgICAgKiBjSyByZXByZXNlbnRzIGNvcyhLKnBpLzE2KS4KLSAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXA0Li50bXA3IGhlcmUuCisgICAgICogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDAuLnRtcDMgaGVyZS4KICAgICAgKi8KLSAgICAKLSAgICB6MSA9IHRtcDQgKyB0bXA3OwotICAgIHoyID0gdG1wNSArIHRtcDY7Ci0gICAgejMgPSB0bXA0ICsgdG1wNjsKLSAgICB6NCA9IHRtcDUgKyB0bXA3OwotICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCi0gICAgCi0gICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KLSAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCi0gICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KLSAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLwotICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCi0gICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLwotICAgIAotICAgIHozICs9IHo1OwotICAgIHo0ICs9IHo1OwotICAgIAotICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIAorCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAxICsgdG1wMzsKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8xXzE3NTg3NTYwMik7IC8qICBjMyAqLworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB6MSArPSBPTkUgPDwgKENPTlNUX0JJVFMrUEFTUzFfQklUUy0xKTsKKworICAgIHRtcDAgID0gTVVMVElQTFkodG1wMCwgICAgRklYXzFfNTAxMzIxMTEwKTsgICAgLyogIGMxK2MzLWM1LWM3ICovCisgICAgdG1wMSAgPSBNVUxUSVBMWSh0bXAxLCAgICBGSVhfM18wNzI3MTEwMjYpOyAgICAvKiAgYzErYzMrYzUtYzcgKi8KKyAgICB0bXAyICA9IE1VTFRJUExZKHRtcDIsICAgIEZJWF8yXzA1MzExOTg2OSk7ICAgIC8qICBjMStjMy1jNStjNyAqLworICAgIHRtcDMgID0gTVVMVElQTFkodG1wMywgICAgRklYXzBfMjk4NjMxMzM2KTsgICAgLyogLWMxK2MzK2M1LWM3ICovCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxMCwgLSBGSVhfMF84OTk5NzYyMjMpOyAgICAvKiAgYzctYzMgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7ICAgIC8qIC1jMS1jMyAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTIsIC0gRklYXzBfMzkwMTgwNjQ0KTsgICAgLyogIGM1LWMzICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAxMywgLSBGSVhfMV85NjE1NzA1NjApOyAgICAvKiAtYzMtYzUgKi8KKworICAgIHRtcDEyICs9IHoxOworICAgIHRtcDEzICs9IHoxOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwICsgdG1wMTAgKyB0bXAxMiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkKKyAgICAgIFJJR0hUX1NISUZUKHRtcDEgKyB0bXAxMSArIHRtcDEzLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQodG1wMiArIHRtcDExICsgdG1wMTIsIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAzICsgdG1wMTAgKyB0bXAxMywgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKwogICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KICAgfQogfQogCisjaWZkZWYgRENUX1NDQUxJTkdfU1VQUE9SVEVECisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgN3g3IHNhbXBsZSBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF83eDcgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMjsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQcmUtemVybyBvdXRwdXQgY29lZmZpY2llbnQgYmxvY2suICovCisgIE1FTVpFUk8oZGF0YSwgU0laRU9GKERDVEVMRU0pICogRENUU0laRTIpOworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworICAvKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNCkuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNzsgY3RyKyspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisgICAgdG1wMyA9IEdFVEpTQU1QTEUoZWxlbXB0clszXSk7CisKKyAgICB0bXAxMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDExID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisgICAgdG1wMTIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKTsKKworICAgIHoxID0gdG1wMCArIHRtcDI7CisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh6MSArIHRtcDEgKyB0bXAzIC0gNyAqIENFTlRFUkpTQU1QTEUpIDw8IFBBU1MxX0JJVFMpOworICAgIHRtcDMgKz0gdG1wMzsKKyAgICB6MSAtPSB0bXAzOworICAgIHoxIC09IHRtcDM7CisgICAgejEgPSBNVUxUSVBMWSh6MSwgRklYKDAuMzUzNTUzMzkxKSk7ICAgICAgICAgICAgICAgIC8qIChjMitjNi1jNCkvMiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMCAtIHRtcDIsIEZJWCgwLjkyMDYwOTAwMikpOyAgICAgICAvKiAoYzIrYzQtYzYpLzIgKi8KKyAgICB6MyA9IE1VTFRJUExZKHRtcDEgLSB0bXAyLCBGSVgoMC4zMTQ2OTIxMjMpKTsgICAgICAgLyogYzYgKi8KKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyB6MiArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHoxIC09IHoyOworICAgIHoyID0gTVVMVElQTFkodG1wMCAtIHRtcDEsIEZJWCgwLjg4MTc0NzczNCkpOyAgICAgICAvKiBjNCAqLworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoejIgKyB6MyAtIE1VTFRJUExZKHRtcDEgLSB0bXAzLCBGSVgoMC43MDcxMDY3ODEpKSwgLyogYzIrYzYtYzQgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIHoyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVgoMC45MzU0MTQzNDcpKTsgICAvKiAoYzMrYzEtYzUpLzIgKi8KKyAgICB0bXAyID0gTVVMVElQTFkodG1wMTAgLSB0bXAxMSwgRklYKDAuMTcwMjYyMzM5KSk7ICAgLyogKGMzK2M1LWMxKS8yICovCisgICAgdG1wMCA9IHRtcDEgLSB0bXAyOworICAgIHRtcDEgKz0gdG1wMjsKKyAgICB0bXAyID0gTVVMVElQTFkodG1wMTEgKyB0bXAxMiwgLSBGSVgoMS4zNzg3NTYyNzYpKTsgLyogLWMxICovCisgICAgdG1wMSArPSB0bXAyOworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDEyLCBGSVgoMC42MTM2MDQyNjgpKTsgICAvKiBjNSAqLworICAgIHRtcDAgKz0gdG1wMzsKKyAgICB0bXAyICs9IHRtcDMgKyBNVUxUSVBMWSh0bXAxMiwgRklYKDEuODcwODI4NjkzKSk7ICAgLyogYzMrYzEtYzUgKi8KKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvNykqKjIgPSA2NC80OSwgd2hpY2ggd2UgZm9sZAorICAgKiBpbnRvIHRoZSBjb25zdGFudCBtdWx0aXBsaWVyczoKKyAgICogY0sgbm93IHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzE0KSAqIDY0LzQ5LgorICAgKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA3OyBjdHIrKykgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXTsKKworICAgIHRtcDEwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDExID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDEyID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworCisgICAgejEgPSB0bXAwICsgdG1wMjsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkoejEgKyB0bXAxICsgdG1wMywgRklYKDEuMzA2MTIyNDQ5KSksIC8qIDY0LzQ5ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICB0bXAzICs9IHRtcDM7CisgICAgejEgLT0gdG1wMzsKKyAgICB6MSAtPSB0bXAzOworICAgIHoxID0gTVVMVElQTFkoejEsIEZJWCgwLjQ2MTc4NDAyMCkpOyAgICAgICAgICAgICAgICAvKiAoYzIrYzYtYzQpLzIgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDAgLSB0bXAyLCBGSVgoMS4yMDI0MjgwODQpKTsgICAgICAgLyogKGMyK2M0LWM2KS8yICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMiwgRklYKDAuNDExMDI2NDQ2KSk7ICAgICAgIC8qIGM2ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyB6MiArIHozLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIHoxIC09IHoyOworICAgIHoyID0gTVVMVElQTFkodG1wMCAtIHRtcDEsIEZJWCgxLjE1MTY3MDUwOSkpOyAgICAgICAvKiBjNCAqLworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh6MiArIHozIC0gTVVMVElQTFkodG1wMSAtIHRtcDMsIEZJWCgwLjkyMzU2ODA0MSkpLCAvKiBjMitjNi1jNCAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyB6MiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYKDEuMjIxNzY1Njc3KSk7ICAgLyogKGMzK2MxLWM1KS8yICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTEsIEZJWCgwLjIyMjM4MzQ2NCkpOyAgIC8qIChjMytjNS1jMSkvMiAqLworICAgIHRtcDAgPSB0bXAxIC0gdG1wMjsKKyAgICB0bXAxICs9IHRtcDI7CisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDExICsgdG1wMTIsIC0gRklYKDEuODAwODI0NTIzKSk7IC8qIC1jMSAqLworICAgIHRtcDEgKz0gdG1wMjsKKyAgICB0bXAzID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMiwgRklYKDAuODAxNDQyMzEwKSk7ICAgLyogYzUgKi8KKyAgICB0bXAwICs9IHRtcDM7CisgICAgdG1wMiArPSB0bXAzICsgTVVMVElQTFkodG1wMTIsIEZJWCgyLjQ0MzUzMTM1NSkpOyAgIC8qIGMzK2MxLWM1ICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAwLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEsIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDZ4NiBzYW1wbGUgYmxvY2suCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfNng2IChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDI7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTI7CisgIERDVEVMRU0gKmRhdGFwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUHJlLXplcm8gb3V0cHV0IGNvZWZmaWNpZW50IGJsb2NrLiAqLworICBNRU1aRVJPKGRhdGEsIFNJWkVPRihEQ1RFTEVNKSAqIERDVFNJWkUyKTsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKyAgLyogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTIpLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDY7IGN0cisrKSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAxMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzNdKTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAwIC0gdG1wMjsKKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbM10pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAxMCArIHRtcDExIC0gNiAqIENFTlRFUkpTQU1QTEUpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTIsIEZJWCgxLjIyNDc0NDg3MSkpLCAgICAgICAgICAgICAgICAgLyogYzIgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgLSB0bXAxMSAtIHRtcDExLCBGSVgoMC43MDcxMDY3ODEpKSwgLyogYzQgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gREVTQ0FMRShNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDAuMzY2MDI1NDA0KSksICAgICAvKiBjNSAqLworCQkgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgKHRtcDEwICsgKCh0bXAwICsgdG1wMSkgPDwgUEFTUzFfQklUUykpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgKCh0bXAwIC0gdG1wMSAtIHRtcDIpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgKHRtcDEwICsgKCh0bXAyIC0gdG1wMSkgPDwgUEFTUzFfQklUUykpOworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvNikqKjIgPSAxNi85LCB3aGljaCB3ZSBmb2xkCisgICAqIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzOgorICAgKiBjSyBub3cgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTIpICogMTYvOS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNjsgY3RyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMTEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSozXTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAwIC0gdG1wMjsKKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjNdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwICsgdG1wMTEsIEZJWCgxLjc3Nzc3Nzc3OCkpLCAgICAgICAgIC8qIDE2LzkgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMiwgRklYKDIuMTc3MzI0MjE2KSksICAgICAgICAgICAgICAgICAvKiBjMiAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTEgLSB0bXAxMSwgRklYKDEuMjU3MDc4NzIyKSksIC8qIGM0ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDAgKyB0bXAyLCBGSVgoMC42NTA3MTE4MjkpKTsgICAgICAgICAgICAgLyogYzUgKi8KKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDAgKyB0bXAxLCBGSVgoMS43Nzc3Nzc3NzgpKSwgICAvKiAxNi85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMCAtIHRtcDEgLSB0bXAyLCBGSVgoMS43Nzc3Nzc3NzgpKSwgICAgLyogMTYvOSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgTVVMVElQTFkodG1wMiAtIHRtcDEsIEZJWCgxLjc3Nzc3Nzc3OCkpLCAgIC8qIDE2LzkgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgNXg1IHNhbXBsZSBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF81eDUgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMjsKKyAgSU5UMzIgdG1wMTAsIHRtcDExOworICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFByZS16ZXJvIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTyhkYXRhLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFMik7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisgIC8qIFdlIHNjYWxlIHRoZSByZXN1bHRzIGZ1cnRoZXIgYnkgMiBhcyBwYXJ0IG9mIG91dHB1dCBhZGFwdGlvbiAqLworICAvKiBzY2FsaW5nIGZvciBkaWZmZXJlbnQgRENUIHNpemUuICovCisgIC8qIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzEwKS4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA1OyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbM10pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMTsKKyAgICB0bXAxMSA9IHRtcDAgLSB0bXAxOworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICgodG1wMTAgKyB0bXAyIC0gNSAqIENFTlRFUkpTQU1QTEUpIDw8IChQQVNTMV9CSVRTKzEpKTsKKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC43OTA1Njk0MTUpKTsgICAgICAgICAgLyogKGMyK2M0KS8yICovCisgICAgdG1wMTAgLT0gdG1wMiA8PCAyOworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIEZJWCgwLjM1MzU1MzM5MSkpOyAgICAgICAgICAvKiAoYzItYzQpLzIgKi8KKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTEgKyB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMSAtIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDAuODMxMjUzODc2KSk7ICAgIC8qIGMzICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgTVVMVElQTFkodG1wMCwgRklYKDAuNTEzNzQzMTQ4KSksIC8qIGMxLWMzICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxLCBGSVgoMi4xNzYyNTA4OTkpKSwgLyogYzErYzMgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC81KSoqMiA9IDY0LzI1LCB3aGljaCB3ZSBwYXJ0aWFsbHkKKyAgICogZm9sZCBpbnRvIHRoZSBjb25zdGFudCBtdWx0aXBsaWVycyAob3RoZXIgcGFydCB3YXMgZG9uZSBpbiBwYXNzIDEpOgorICAgKiBjSyBub3cgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTApICogMzIvMjUuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDU7IGN0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqM107CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDE7CisgICAgdG1wMTEgPSB0bXAwIC0gdG1wMTsKKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSozXTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCArIHRtcDIsIEZJWCgxLjI4KSksICAgICAgICAvKiAzMi8yNSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAxMSwgRklYKDEuMDExOTI4ODUxKSk7ICAgICAgICAgIC8qIChjMitjNCkvMiAqLworICAgIHRtcDEwIC09IHRtcDIgPDwgMjsKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEwLCBGSVgoMC40NTI1NDgzNDApKTsgICAgICAgICAgLyogKGMyLWM0KS8yICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTEgKyB0bXAxMCwgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMSAtIHRtcDEwLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMCArIHRtcDEsIEZJWCgxLjA2NDAwNDk2MSkpOyAgICAvKiBjMyAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgTVVMVElQTFkodG1wMCwgRklYKDAuNjU3NTkxMjMwKSksIC8qIGMxLWMzICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxLCBGSVgoMi43ODU2MDExNTEpKSwgLyogYzErYzMgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgNHg0IHNhbXBsZSBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF80eDQgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMTsKKyAgSU5UMzIgdG1wMTAsIHRtcDExOworICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFByZS16ZXJvIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTyhkYXRhLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFMik7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisgIC8qIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5ICg4LzQpKioyID0gMioqMiwgd2hpY2ggd2UgYWRkIGhlcmUuICovCisgIC8qIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzE2KSBbcmVmZXJzIHRvIDgtcG9pbnQgRkRDVF0uICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbM10pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzJdKTsKKworICAgIHRtcDEwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clszXSk7CisgICAgdG1wMTEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICgodG1wMCArIHRtcDEgLSA0ICogQ0VOVEVSSlNBTVBMRSkgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkgKCh0bXAwIC0gdG1wMSkgPDwgKFBBU1MxX0JJVFMrMikpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAvKiBjNiAqLworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTMpOworCisgICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQodG1wMCArIE1VTFRJUExZKHRtcDEwLCBGSVhfMF83NjUzNjY4NjUpLCAvKiBjMi1jNiAqLworCQkgIENPTlNUX0JJVFMtUEFTUzFfQklUUy0yKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwIC0gTVVMVElQTFkodG1wMTEsIEZJWF8xXzg0Nzc1OTA2NSksIC8qIGMyK2M2ICovCisJCSAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTIpOworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjNdICsgKE9ORSA8PCAoUEFTUzFfQklUUy0xKSk7CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSoyXTsKKworICAgIHRtcDEwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjNdOworICAgIHRtcDExID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjJdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pIFJJR0hUX1NISUZUKHRtcDAgKyB0bXAxLCBQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkgUklHSFRfU0hJRlQodG1wMCAtIHRtcDEsIFBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAvKiBjNiAqLworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUytQQVNTMV9CSVRTLTEpOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwICsgTVVMVElQTFkodG1wMTAsIEZJWF8wXzc2NTM2Njg2NSksIC8qIGMyLWM2ICovCisJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkKKyAgICAgIFJJR0hUX1NISUZUKHRtcDAgLSBNVUxUSVBMWSh0bXAxMSwgRklYXzFfODQ3NzU5MDY1KSwgLyogYzIrYzYgKi8KKwkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgM3gzIHNhbXBsZSBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF8zeDMgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMjsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQcmUtemVybyBvdXRwdXQgY29lZmZpY2llbnQgYmxvY2suICovCisgIE1FTVpFUk8oZGF0YSwgU0laRU9GKERDVEVMRU0pICogRENUU0laRTIpOworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworICAvKiBXZSBzY2FsZSB0aGUgcmVzdWx0cyBmdXJ0aGVyIGJ5IDIqKjIgYXMgcGFydCBvZiBvdXRwdXQgYWRhcHRpb24gKi8KKyAgLyogc2NhbGluZyBmb3IgZGlmZmVyZW50IERDVCBzaXplLiAqLworICAvKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS82KS4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAzOyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsyXSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSk7CisKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsyXSk7CisKKyAgICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pCisgICAgICAoKHRtcDAgKyB0bXAxIC0gMyAqIENFTlRFUkpTQU1QTEUpIDw8IChQQVNTMV9CSVRTKzIpKTsKKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgLSB0bXAxIC0gdG1wMSwgRklYKDAuNzA3MTA2NzgxKSksIC8qIGMyICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTIpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMiwgRklYKDEuMjI0NzQ0ODcxKSksICAgICAgICAgICAgICAgLyogYzEgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMik7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8zKSoqMiA9IDY0LzksIHdoaWNoIHdlIHBhcnRpYWxseQorICAgKiBmb2xkIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzIChvdGhlciBwYXJ0IHdhcyBkb25lIGluIHBhc3MgMSk6CisgICAqIGNLIG5vdyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS82KSAqIDE2LzkuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDM7IGN0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjJdOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV07CisKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjJdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgKyB0bXAxLCBGSVgoMS43Nzc3Nzc3NzgpKSwgICAgICAgIC8qIDE2LzkgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAwIC0gdG1wMSAtIHRtcDEsIEZJWCgxLjI1NzA3ODcyMikpLCAvKiBjMiAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDIsIEZJWCgyLjE3NzMyNDIxNikpLCAgICAgICAgICAgICAgIC8qIGMxICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDJ4MiBzYW1wbGUgYmxvY2suCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfMngyIChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisKKyAgLyogUHJlLXplcm8gb3V0cHV0IGNvZWZmaWNpZW50IGJsb2NrLiAqLworICBNRU1aRVJPKGRhdGEsIFNJWkVPRihEQ1RFTEVNKSAqIERDVFNJWkUyKTsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENULiAqLworCisgIC8qIFJvdyAwICovCisgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVswXSArIHN0YXJ0X2NvbDsKKworICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxXSk7CisgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKTsKKworICAvKiBSb3cgMSAqLworICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbMV0gKyBzdGFydF9jb2w7CisKKyAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMV0pOworICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxXSk7CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cCBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8yKSoqMiA9IDIqKjQuCisgICAqLworCisgIC8qIENvbHVtbiAwICovCisgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICBkYXRhW0RDVFNJWkUqMF0gPSAoRENURUxFTSkgKCh0bXAwICsgdG1wMiAtIDQgKiBDRU5URVJKU0FNUExFKSA8PCA0KTsKKyAgZGF0YVtEQ1RTSVpFKjFdID0gKERDVEVMRU0pICgodG1wMCAtIHRtcDIpIDw8IDQpOworCisgIC8qIENvbHVtbiAxICovCisgIGRhdGFbRENUU0laRSowKzFdID0gKERDVEVMRU0pICgodG1wMSArIHRtcDMpIDw8IDQpOworICBkYXRhW0RDVFNJWkUqMSsxXSA9IChEQ1RFTEVNKSAoKHRtcDEgLSB0bXAzKSA8PCA0KTsKK30KKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gYSAxeDEgc2FtcGxlIGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzF4MSAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICAvKiBQcmUtemVybyBvdXRwdXQgY29lZmZpY2llbnQgYmxvY2suICovCisgIE1FTVpFUk8oZGF0YSwgU0laRU9GKERDVEVMRU0pICogRENUU0laRTIpOworCisgIC8qIFdlIGxlYXZlIHRoZSByZXN1bHQgc2NhbGVkIHVwIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguICovCisgIC8qIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5ICg4LzEpKioyID0gMioqNi4gKi8KKyAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgIGRhdGFbMF0gPSAoRENURUxFTSkKKyAgICAoKEdFVEpTQU1QTEUoc2FtcGxlX2RhdGFbMF1bc3RhcnRfY29sXSkgLSBDRU5URVJKU0FNUExFKSA8PCA2KTsKK30KKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gYSA5eDkgc2FtcGxlIGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0Xzl4OSAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyOworICBEQ1RFTEVNIHdvcmtzcGFjZVs4XTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogd2Ugc2NhbGUgdGhlIHJlc3VsdHMgZnVydGhlciBieSAyIGFzIHBhcnQgb2Ygb3V0cHV0IGFkYXB0aW9uICovCisgIC8qIHNjYWxpbmcgZm9yIGRpZmZlcmVudCBEQ1Qgc2l6ZS4gKi8KKyAgLyogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTgpLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXA0ID0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKTsKKworICAgIHRtcDEwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wMTEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzddKTsKKyAgICB0bXAxMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDEzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisKKyAgICB6MSA9IHRtcDAgKyB0bXAyICsgdG1wMzsKKyAgICB6MiA9IHRtcDEgKyB0bXA0OworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkgKCh6MSArIHoyIC0gOSAqIENFTlRFUkpTQU1QTEUpIDw8IDEpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkoejEgLSB6MiAtIHoyLCBGSVgoMC43MDcxMDY3ODEpKSwgIC8qIGM2ICovCisJICAgICAgQ09OU1RfQklUUy0xKTsKKyAgICB6MSA9IE1VTFRJUExZKHRtcDAgLSB0bXAyLCBGSVgoMS4zMjg5MjYwNDkpKTsgICAgICAgIC8qIGMyICovCisgICAgejIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wNCAtIHRtcDQsIEZJWCgwLjcwNzEwNjc4MSkpOyAvKiBjNiAqLworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMiAtIHRtcDMsIEZJWCgxLjA4MzM1MDQ0MSkpICAgIC8qIGM0ICovCisJICAgICAgKyB6MSArIHoyLCBDT05TVF9CSVRTLTEpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMyAtIHRtcDAsIEZJWCgwLjI0NTU3NTYwOCkpICAgIC8qIGM4ICovCisJICAgICAgKyB6MSAtIHoyLCBDT05TVF9CSVRTLTEpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgLSB0bXAxMiAtIHRtcDEzLCBGSVgoMS4yMjQ3NDQ4NzEpKSwgLyogYzMgKi8KKwkgICAgICBDT05TVF9CSVRTLTEpOworCisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAxMSwgRklYKDEuMjI0NzQ0ODcxKSk7ICAgICAgICAvKiBjMyAqLworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDEyLCBGSVgoMC45MDkwMzg5NTUpKTsgLyogYzUgKi8KKyAgICB0bXAxID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMywgRklYKDAuNDgzNjg5NTI1KSk7IC8qIGM3ICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTEgKyB0bXAwICsgdG1wMSwgQ09OU1RfQklUUy0xKTsKKworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAxMiAtIHRtcDEzLCBGSVgoMS4zOTI3Mjg0ODEpKTsgLyogYzEgKi8KKworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAwIC0gdG1wMTEgLSB0bXAyLCBDT05TVF9CSVRTLTEpOworICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxIC0gdG1wMTEgKyB0bXAyLCBDT05TVF9CSVRTLTEpOworCisgICAgY3RyKys7CisKKyAgICBpZiAoY3RyICE9IERDVFNJWkUpIHsKKyAgICAgIGlmIChjdHIgPT0gOSkKKwlicmVhazsJCQkvKiBEb25lLiAqLworICAgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICB9IGVsc2UKKyAgICAgIGRhdGFwdHIgPSB3b3Jrc3BhY2U7CS8qIHN3aXRjaCBwb2ludGVyIHRvIGV4dGVuZGVkIHdvcmtzcGFjZSAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cCBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC85KSoqMiA9IDY0LzgxLCB3aGljaCB3ZSBwYXJ0aWFsbHkKKyAgICogZm9sZCBpbnRvIHRoZSBjb25zdGFudCBtdWx0aXBsaWVycyBhbmQgZmluYWwvaW5pdGlhbCBzaGlmdGluZzoKKyAgICogY0sgbm93IHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzE4KSAqIDEyOC84MS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjRdOworCisgICAgdG1wMTAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSB3c3B0cltEQ1RTSVpFKjBdOworICAgIHRtcDExID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEyID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDEzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworCisgICAgejEgPSB0bXAwICsgdG1wMiArIHRtcDM7CisgICAgejIgPSB0bXAxICsgdG1wNDsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkoejEgKyB6MiwgRklYKDEuNTgwMjQ2OTE0KSksICAgICAgIC8qIDEyOC84MSAqLworCSAgICAgIENPTlNUX0JJVFMrMik7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHoxIC0gejIgLSB6MiwgRklYKDEuMTE3NDAzMzA5KSksICAvKiBjNiAqLworCSAgICAgIENPTlNUX0JJVFMrMik7CisgICAgejEgPSBNVUxUSVBMWSh0bXAwIC0gdG1wMiwgRklYKDIuMTAwMDMxMjg3KSk7ICAgICAgICAvKiBjMiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMSAtIHRtcDQgLSB0bXA0LCBGSVgoMS4xMTc0MDMzMDkpKTsgLyogYzYgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMiAtIHRtcDMsIEZJWCgxLjcxMTk2MTE5MCkpICAgIC8qIGM0ICovCisJICAgICAgKyB6MSArIHoyLCBDT05TVF9CSVRTKzIpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAzIC0gdG1wMCwgRklYKDAuMzg4MDcwMDk2KSkgICAgLyogYzggKi8KKwkgICAgICArIHoxIC0gejIsIENPTlNUX0JJVFMrMik7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTIgLSB0bXAxMywgRklYKDEuOTM1Mzk5MzAzKSksIC8qIGMzICovCisJICAgICAgQ09OU1RfQklUUysyKTsKKworICAgIHRtcDExID0gTVVMVElQTFkodG1wMTEsIEZJWCgxLjkzNTM5OTMwMykpOyAgICAgICAgLyogYzMgKi8KKyAgICB0bXAwID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMiwgRklYKDEuNDM2NTA2MDA0KSk7IC8qIGM1ICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEwICsgdG1wMTMsIEZJWCgwLjc2NDM0ODg3OSkpOyAvKiBjNyAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDExICsgdG1wMCArIHRtcDEsIENPTlNUX0JJVFMrMik7CisKKyAgICB0bXAyID0gTVVMVElQTFkodG1wMTIgLSB0bXAxMywgRklYKDIuMjAwODU0ODgzKSk7IC8qIGMxICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMCAtIHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUysyKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMSAtIHRtcDExICsgdG1wMiwgQ09OU1RfQklUUysyKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICB3c3B0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgMTB4MTAgc2FtcGxlIGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzEweDEwIChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNDsKKyAgRENURUxFTSB3b3Jrc3BhY2VbOCoyXTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogd2Ugc2NhbGUgdGhlIHJlc3VsdHMgZnVydGhlciBieSAyIGFzIHBhcnQgb2Ygb3V0cHV0IGFkYXB0aW9uICovCisgIC8qIHNjYWxpbmcgZm9yIGRpZmZlcmVudCBEQ1Qgc2l6ZS4gKi8KKyAgLyogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMjApLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wMTIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzddKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls2XSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNV0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNDsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXA0OworICAgIHRtcDExID0gdG1wMSArIHRtcDM7CisgICAgdG1wMTQgPSB0bXAxIC0gdG1wMzsKKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKyAgICB0bXA0ID0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisKKyAgICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pCisgICAgICAoKHRtcDEwICsgdG1wMTEgKyB0bXAxMiAtIDEwICogQ0VOVEVSSlNBTVBMRSkgPDwgMSk7CisgICAgdG1wMTIgKz0gdG1wMTI7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDEyLCBGSVgoMS4xNDQxMjI4MDYpKSAtIC8qIGM0ICovCisJICAgICAgTVVMVElQTFkodG1wMTEgLSB0bXAxMiwgRklYKDAuNDM3MDE2MDI0KSksICAvKiBjOCAqLworCSAgICAgIENPTlNUX0JJVFMtMSk7CisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxMyArIHRtcDE0LCBGSVgoMC44MzEyNTM4NzYpKTsgICAgLyogYzYgKi8KKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgTVVMVElQTFkodG1wMTMsIEZJWCgwLjUxMzc0MzE0OCkpLCAgLyogYzItYzYgKi8KKwkgICAgICBDT05TVF9CSVRTLTEpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxNCwgRklYKDIuMTc2MjUwODk5KSksICAvKiBjMitjNiAqLworCSAgICAgIENPTlNUX0JJVFMtMSk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNDsKKyAgICB0bXAxMSA9IHRtcDEgLSB0bXAzOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgKCh0bXAxMCAtIHRtcDExIC0gdG1wMikgPDwgMSk7CisgICAgdG1wMiA8PD0gQ09OU1RfQklUUzsKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAsIEZJWCgxLjM5NjgwMjI0NykpICsgICAgICAgICAgLyogYzEgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxLCBGSVgoMS4yNjAwNzM1MTEpKSArIHRtcDIgKyAgIC8qIGMzICovCisJICAgICAgTVVMVElQTFkodG1wMywgRklYKDAuNjQyMDM5NTIyKSkgKyAgICAgICAgICAvKiBjNyAqLworCSAgICAgIE1VTFRJUExZKHRtcDQsIEZJWCgwLjIyMTIzMTc0MikpLCAgICAgICAgICAgLyogYzkgKi8KKwkgICAgICBDT05TVF9CSVRTLTEpOworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMCAtIHRtcDQsIEZJWCgwLjk1MTA1NjUxNikpIC0gICAgIC8qIChjMytjNykvMiAqLworCSAgICBNVUxUSVBMWSh0bXAxICsgdG1wMywgRklYKDAuNTg3Nzg1MjUyKSk7ICAgICAgLyogKGMxLWM5KS8yICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVgoMC4zMDkwMTY5OTQpKSArICAgLyogKGMzLWM3KS8yICovCisJICAgICh0bXAxMSA8PCAoQ09OU1RfQklUUyAtIDEpKSAtIHRtcDI7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyICsgdG1wMTMsIENPTlNUX0JJVFMtMSk7CisgICAgZGF0YXB0cls3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyIC0gdG1wMTMsIENPTlNUX0JJVFMtMSk7CisKKyAgICBjdHIrKzsKKworICAgIGlmIChjdHIgIT0gRENUU0laRSkgeworICAgICAgaWYgKGN0ciA9PSAxMCkKKwlicmVhazsJCQkvKiBEb25lLiAqLworICAgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICB9IGVsc2UKKyAgICAgIGRhdGFwdHIgPSB3b3Jrc3BhY2U7CS8qIHN3aXRjaCBwb2ludGVyIHRvIGV4dGVuZGVkIHdvcmtzcGFjZSAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cCBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8xMCkqKjIgPSAxNi8yNSwgd2hpY2ggd2UgcGFydGlhbGx5CisgICAqIGZvbGQgaW50byB0aGUgY29uc3RhbnQgbXVsdGlwbGllcnMgYW5kIGZpbmFsL2luaXRpYWwgc2hpZnRpbmc6CisgICAqIGNLIG5vdyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yMCkgKiAzMi8yNS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgd3NwdHJbRENUU0laRSoxXTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXAxMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqNF0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA0OworICAgIHRtcDEzID0gdG1wMCAtIHRtcDQ7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMzsKKyAgICB0bXAxNCA9IHRtcDEgLSB0bXAzOworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqNF0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgKyB0bXAxMSArIHRtcDEyLCBGSVgoMS4yOCkpLCAvKiAzMi8yNSAqLworCSAgICAgIENPTlNUX0JJVFMrMik7CisgICAgdG1wMTIgKz0gdG1wMTI7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWCgxLjQ2NDQ3NzE5MSkpIC0gLyogYzQgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMSAtIHRtcDEyLCBGSVgoMC41NTkzODA1MTEpKSwgIC8qIGM4ICovCisJICAgICAgQ09OU1RfQklUUysyKTsKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEzICsgdG1wMTQsIEZJWCgxLjA2NDAwNDk2MSkpOyAgICAvKiBjNiAqLworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDEzLCBGSVgoMC42NTc1OTEyMzApKSwgIC8qIGMyLWM2ICovCisJICAgICAgQ09OU1RfQklUUysyKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxNCwgRklYKDIuNzg1NjAxMTUxKSksICAvKiBjMitjNiAqLworCSAgICAgIENPTlNUX0JJVFMrMik7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNDsKKyAgICB0bXAxMSA9IHRtcDEgLSB0bXAzOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDExIC0gdG1wMiwgRklYKDEuMjgpKSwgIC8qIDMyLzI1ICovCisJICAgICAgQ09OU1RfQklUUysyKTsKKyAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYKDEuMjgpKTsgICAgICAgICAgICAgICAgICAgICAvKiAzMi8yNSAqLworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAwLCBGSVgoMS43ODc5MDY4NzYpKSArICAgICAgICAgIC8qIGMxICovCisJICAgICAgTVVMVElQTFkodG1wMSwgRklYKDEuNjEyODk0MDk0KSkgKyB0bXAyICsgICAvKiBjMyAqLworCSAgICAgIE1VTFRJUExZKHRtcDMsIEZJWCgwLjgyMTgxMDU4OCkpICsgICAgICAgICAgLyogYzcgKi8KKwkgICAgICBNVUxUSVBMWSh0bXA0LCBGSVgoMC4yODMxNzY2MzApKSwgICAgICAgICAgIC8qIGM5ICovCisJICAgICAgQ09OU1RfQklUUysyKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDAgLSB0bXA0LCBGSVgoMS4yMTczNTIzNDEpKSAtICAgICAvKiAoYzMrYzcpLzIgKi8KKwkgICAgTVVMVElQTFkodG1wMSArIHRtcDMsIEZJWCgwLjc1MjM2NTEyMykpOyAgICAgIC8qIChjMS1jOSkvMiAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYKDAuMzk1NTQxNzUzKSkgKyAgIC8qIChjMy1jNykvMiAqLworCSAgICBNVUxUSVBMWSh0bXAxMSwgRklYKDAuNjQpKSAtIHRtcDI7ICAgICAgICAgICAgLyogMTYvMjUgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMiArIHRtcDEzLCBDT05TVF9CSVRTKzIpOworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyIC0gdG1wMTMsIENPTlNUX0JJVFMrMik7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgICAgd3NwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhbiAxMXgxMSBzYW1wbGUgYmxvY2suCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfMTF4MTEgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0OworICBJTlQzMiB6MSwgejIsIHozOworICBEQ1RFTEVNIHdvcmtzcGFjZVs4KjNdOworICBEQ1RFTEVNICpkYXRhcHRyOworICBEQ1RFTEVNICp3c3B0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBmdXJ0aGVyIGJ5IDIgYXMgcGFydCBvZiBvdXRwdXQgYWRhcHRpb24gKi8KKyAgLyogc2NhbGluZyBmb3IgZGlmZmVyZW50IERDVCBzaXplLiAqLworICAvKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yMikuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGN0ciA9IDA7CisgIGZvciAoOzspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTBdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls5XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbOF0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzddKTsKKyAgICB0bXA0ID0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls2XSk7CisgICAgdG1wNSA9IEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisKKyAgICB0bXAxMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTBdKTsKKyAgICB0bXAxMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDEyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wMTMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzddKTsKKyAgICB0bXAxNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAwICsgdG1wMSArIHRtcDIgKyB0bXAzICsgdG1wNCArIHRtcDUgLSAxMSAqIENFTlRFUkpTQU1QTEUpIDw8IDEpOworICAgIHRtcDUgKz0gdG1wNTsKKyAgICB0bXAwIC09IHRtcDU7CisgICAgdG1wMSAtPSB0bXA1OworICAgIHRtcDIgLT0gdG1wNTsKKyAgICB0bXAzIC09IHRtcDU7CisgICAgdG1wNCAtPSB0bXA1OworICAgIHoxID0gTVVMVElQTFkodG1wMCArIHRtcDMsIEZJWCgxLjM1NjkyNzk3NikpICsgICAgICAgLyogYzIgKi8KKwkgTVVMVElQTFkodG1wMiArIHRtcDQsIEZJWCgwLjIwMTI2MzU3NCkpOyAgICAgICAgLyogYzEwICovCisgICAgejIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYKDAuOTI2MTEyOTMxKSk7ICAgICAgICAvKiBjNiAqLworICAgIHozID0gTVVMVElQTFkodG1wMCAtIHRtcDEsIEZJWCgxLjE4OTcxMjE1NikpOyAgICAgICAgLyogYzQgKi8KKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHoxICsgejIgLSBNVUxUSVBMWSh0bXAzLCBGSVgoMS4wMTgzMDA1OTApKSAvKiBjMitjOC1jNiAqLworCSAgICAgIC0gTVVMVElQTFkodG1wNCwgRklYKDEuMzkwOTc1NzMwKSksICAgICAgICAvKiBjNCtjMTAgKi8KKwkgICAgICBDT05TVF9CSVRTLTEpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoejIgKyB6MyArIE1VTFRJUExZKHRtcDEsIEZJWCgwLjA2MjMzNTY1MCkpIC8qIGM0LWM2LWMxMCAqLworCSAgICAgIC0gTVVMVElQTFkodG1wMiwgRklYKDEuMzU2OTI3OTc2KSkgICAgICAgICAvKiBjMiAqLworCSAgICAgICsgTVVMVElQTFkodG1wNCwgRklYKDAuNTg3NDg1NTQ1KSksICAgICAgICAvKiBjOCAqLworCSAgICAgIENPTlNUX0JJVFMtMSk7CisgICAgZGF0YXB0cls2XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh6MSArIHozIC0gTVVMVElQTFkodG1wMCwgRklYKDEuNjIwNTI3MjAwKSkgLyogYzIrYzQtYzYgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDIsIEZJWCgwLjc4ODc0OTEyMCkpLCAgICAgICAgLyogYzgrYzEwICovCisJICAgICAgQ09OU1RfQklUUy0xKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYKDEuMjg2NDEzOTA1KSk7ICAgIC8qIGMzICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDEwICsgdG1wMTIsIEZJWCgxLjA2ODc5MTI5OCkpOyAgICAvKiBjNSAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDEzLCBGSVgoMC43NjQ1ODE1NzYpKTsgICAgLyogYzcgKi8KKyAgICB0bXAwID0gdG1wMSArIHRtcDIgKyB0bXAzIC0gTVVMVElQTFkodG1wMTAsIEZJWCgxLjcxOTk2Nzg3MSkpIC8qIGM3K2M1K2MzLWMxICovCisJICAgKyBNVUxUSVBMWSh0bXAxNCwgRklYKDAuMzk4NDMwMDAzKSk7ICAgICAgICAgIC8qIGM5ICovCisgICAgdG1wNCA9IE1VTFRJUExZKHRtcDExICsgdG1wMTIsIC0gRklYKDAuNzY0NTgxNTc2KSk7ICAvKiAtYzcgKi8KKyAgICB0bXA1ID0gTVVMVElQTFkodG1wMTEgKyB0bXAxMywgLSBGSVgoMS4zOTk4MTg5MDcpKTsgIC8qIC1jMSAqLworICAgIHRtcDEgKz0gdG1wNCArIHRtcDUgKyBNVUxUSVBMWSh0bXAxMSwgRklYKDEuMjc2NDE2NTgyKSkgLyogYzkrYzcrYzEtYzMgKi8KKwkgICAgLSBNVUxUSVBMWSh0bXAxNCwgRklYKDEuMDY4NzkxMjk4KSk7ICAgICAgICAgLyogYzUgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWCgwLjM5ODQzMDAwMykpOyAgIC8qIGM5ICovCisgICAgdG1wMiArPSB0bXA0ICsgdG1wMTAgLSBNVUxUSVBMWSh0bXAxMiwgRklYKDEuOTg5MDUzNjI5KSkgLyogYzkrYzUrYzMtYzcgKi8KKwkgICAgKyBNVUxUSVBMWSh0bXAxNCwgRklYKDEuMzk5ODE4OTA3KSk7ICAgICAgICAgLyogYzEgKi8KKyAgICB0bXAzICs9IHRtcDUgKyB0bXAxMCArIE1VTFRJUExZKHRtcDEzLCBGSVgoMS4zMDU1OTg2MjYpKSAvKiBjMStjNS1jOS1jNyAqLworCSAgICAtIE1VTFRJUExZKHRtcDE0LCBGSVgoMS4yODY0MTM5MDUpKTsgICAgICAgICAvKiBjMyAqLworCisgICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDAsIENPTlNUX0JJVFMtMSk7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEsIENPTlNUX0JJVFMtMSk7CisgICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDIsIENPTlNUX0JJVFMtMSk7CisgICAgZGF0YXB0cls3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDMsIENPTlNUX0JJVFMtMSk7CisKKyAgICBjdHIrKzsKKworICAgIGlmIChjdHIgIT0gRENUU0laRSkgeworICAgICAgaWYgKGN0ciA9PSAxMSkKKwlicmVhazsJCQkvKiBEb25lLiAqLworICAgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICB9IGVsc2UKKyAgICAgIGRhdGFwdHIgPSB3b3Jrc3BhY2U7CS8qIHN3aXRjaCBwb2ludGVyIHRvIGV4dGVuZGVkIHdvcmtzcGFjZSAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cCBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8xMSkqKjIgPSA2NC8xMjEsIHdoaWNoIHdlIHBhcnRpYWxseQorICAgKiBmb2xkIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzIGFuZCBmaW5hbC9pbml0aWFsIHNoaWZ0aW5nOgorICAgKiBjSyBub3cgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMjIpICogMTI4LzEyMS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgd3NwdHJbRENUU0laRSoyXTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgd3NwdHJbRENUU0laRSoxXTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqNF0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XTsKKworICAgIHRtcDEwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gd3NwdHJbRENUU0laRSoyXTsKKyAgICB0bXAxMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wMTIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSB3c3B0cltEQ1RTSVpFKjBdOworICAgIHRtcDEzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDE0ID0gZGF0YXB0cltEQ1RTSVpFKjRdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgKyB0bXAxICsgdG1wMiArIHRtcDMgKyB0bXA0ICsgdG1wNSwKKwkJICAgICAgIEZJWCgxLjA1Nzg1MTI0MCkpLCAgICAgICAgICAgICAgICAvKiAxMjgvMTIxICovCisJICAgICAgQ09OU1RfQklUUysyKTsKKyAgICB0bXA1ICs9IHRtcDU7CisgICAgdG1wMCAtPSB0bXA1OworICAgIHRtcDEgLT0gdG1wNTsKKyAgICB0bXAyIC09IHRtcDU7CisgICAgdG1wMyAtPSB0bXA1OworICAgIHRtcDQgLT0gdG1wNTsKKyAgICB6MSA9IE1VTFRJUExZKHRtcDAgKyB0bXAzLCBGSVgoMS40MzU0Mjc5NDIpKSArICAgICAgIC8qIGMyICovCisJIE1VTFRJUExZKHRtcDIgKyB0bXA0LCBGSVgoMC4yMTI5MDY5MjIpKTsgICAgICAgIC8qIGMxMCAqLworICAgIHoyID0gTVVMVElQTFkodG1wMSAtIHRtcDMsIEZJWCgwLjk3OTY4OTcxMykpOyAgICAgICAgLyogYzYgKi8KKyAgICB6MyA9IE1VTFRJUExZKHRtcDAgLSB0bXAxLCBGSVgoMS4yNTg1Mzg0NzkpKTsgICAgICAgIC8qIGM0ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHoxICsgejIgLSBNVUxUSVBMWSh0bXAzLCBGSVgoMS4wNzcyMTA1NDIpKSAvKiBjMitjOC1jNiAqLworCSAgICAgIC0gTVVMVElQTFkodG1wNCwgRklYKDEuNDcxNDQ1NDAwKSksICAgICAgICAvKiBjNCtjMTAgKi8KKwkgICAgICBDT05TVF9CSVRTKzIpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh6MiArIHozICsgTVVMVElQTFkodG1wMSwgRklYKDAuMDY1OTQxODQ0KSkgLyogYzQtYzYtYzEwICovCisJICAgICAgLSBNVUxUSVBMWSh0bXAyLCBGSVgoMS40MzU0Mjc5NDIpKSAgICAgICAgIC8qIGMyICovCisJICAgICAgKyBNVUxUSVBMWSh0bXA0LCBGSVgoMC42MjE0NzIzMTIpKSwgICAgICAgIC8qIGM4ICovCisJICAgICAgQ09OU1RfQklUUysyKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoejEgKyB6MyAtIE1VTFRJUExZKHRtcDAsIEZJWCgxLjcxNDI3NjcwOCkpIC8qIGMyK2M0LWM2ICovCisJICAgICAgLSBNVUxUSVBMWSh0bXAyLCBGSVgoMC44MzQzNzkyMzQpKSwgICAgICAgIC8qIGM4K2MxMCAqLworCSAgICAgIENPTlNUX0JJVFMrMik7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEwICsgdG1wMTEsIEZJWCgxLjM2MDgzNDU0NCkpOyAgICAvKiBjMyAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDEyLCBGSVgoMS4xMzA2MjIxOTkpKTsgICAgLyogYzUgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMywgRklYKDAuODA4ODEzNTY4KSk7ICAgIC8qIGM3ICovCisgICAgdG1wMCA9IHRtcDEgKyB0bXAyICsgdG1wMyAtIE1VTFRJUExZKHRtcDEwLCBGSVgoMS44MTk0NzAxNDUpKSAvKiBjNytjNStjMy1jMSAqLworCSAgICsgTVVMVElQTFkodG1wMTQsIEZJWCgwLjQyMTQ3OTY3MikpOyAgICAgICAgICAvKiBjOSAqLworICAgIHRtcDQgPSBNVUxUSVBMWSh0bXAxMSArIHRtcDEyLCAtIEZJWCgwLjgwODgxMzU2OCkpOyAgLyogLWM3ICovCisgICAgdG1wNSA9IE1VTFRJUExZKHRtcDExICsgdG1wMTMsIC0gRklYKDEuNDgwODAwMTY3KSk7ICAvKiAtYzEgKi8KKyAgICB0bXAxICs9IHRtcDQgKyB0bXA1ICsgTVVMVElQTFkodG1wMTEsIEZJWCgxLjM1MDI1ODg2NCkpIC8qIGM5K2M3K2MxLWMzICovCisJICAgIC0gTVVMVElQTFkodG1wMTQsIEZJWCgxLjEzMDYyMjE5OSkpOyAgICAgICAgIC8qIGM1ICovCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVgoMC40MjE0Nzk2NzIpKTsgICAvKiBjOSAqLworICAgIHRtcDIgKz0gdG1wNCArIHRtcDEwIC0gTVVMVElQTFkodG1wMTIsIEZJWCgyLjEwNDEyMjg0NykpIC8qIGM5K2M1K2MzLWM3ICovCisJICAgICsgTVVMVElQTFkodG1wMTQsIEZJWCgxLjQ4MDgwMDE2NykpOyAgICAgICAgIC8qIGMxICovCisgICAgdG1wMyArPSB0bXA1ICsgdG1wMTAgKyBNVUxUSVBMWSh0bXAxMywgRklYKDEuMzgxMTI5MTI1KSkgLyogYzErYzUtYzktYzcgKi8KKwkgICAgLSBNVUxUSVBMWSh0bXAxNCwgRklYKDEuMzYwODM0NTQ0KSk7ICAgICAgICAgLyogYzMgKi8KKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDAsIENPTlNUX0JJVFMrMik7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMSwgQ09OU1RfQklUUysyKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAyLCBDT05TVF9CSVRTKzIpOworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDMsIENPTlNUX0JJVFMrMik7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgICAgd3NwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDEyeDEyIHNhbXBsZSBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF8xMngxMiAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1OworICBEQ1RFTEVNIHdvcmtzcGFjZVs4KjRdOworICBEQ1RFTEVNICpkYXRhcHRyOworICBEQ1RFTEVNICp3c3B0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENULiAqLworICAvKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yNCkuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGN0ciA9IDA7CisgIGZvciAoOzspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTFdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMF0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworICAgIHRtcDUgPSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDU7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wNTsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXA0OworICAgIHRtcDE0ID0gdG1wMSAtIHRtcDQ7CisgICAgdG1wMTIgPSB0bXAyICsgdG1wMzsKKyAgICB0bXAxNSA9IHRtcDIgLSB0bXAzOworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTFdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxMF0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworICAgIHRtcDUgPSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkgKHRtcDEwICsgdG1wMTEgKyB0bXAxMiAtIDEyICogQ0VOVEVSSlNBTVBMRSk7CisgICAgZGF0YXB0cls2XSA9IChEQ1RFTEVNKSAodG1wMTMgLSB0bXAxNCAtIHRtcDE1KTsKKyAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWCgxLjIyNDc0NDg3MSkpLCAvKiBjNCAqLworCSAgICAgIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTQgLSB0bXAxNSArIE1VTFRJUExZKHRtcDEzICsgdG1wMTUsIEZJWCgxLjM2NjAyNTQwNCkpLCAvKiBjMiAqLworCSAgICAgIENPTlNUX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMSArIHRtcDQsIEZJWF8wXzU0MTE5NjEwMCk7ICAgIC8qIGM5ICovCisgICAgdG1wMTQgPSB0bXAxMCArIE1VTFRJUExZKHRtcDEsIEZJWF8wXzc2NTM2Njg2NSk7ICAgLyogYzMtYzkgKi8KKyAgICB0bXAxNSA9IHRtcDEwIC0gTVVMVElQTFkodG1wNCwgRklYXzFfODQ3NzU5MDY1KTsgICAvKiBjMytjOSAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMCArIHRtcDIsIEZJWCgxLjEyMTk3MTA1NCkpOyAgIC8qIGM1ICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgRklYKDAuODYwOTE4NjY5KSk7ICAgLyogYzcgKi8KKyAgICB0bXAxMCA9IHRtcDEyICsgdG1wMTMgKyB0bXAxNCAtIE1VTFRJUExZKHRtcDAsIEZJWCgwLjU4MDc3NDk1MykpIC8qIGM1K2M3LWMxICovCisJICAgICsgTVVMVElQTFkodG1wNSwgRklYKDAuMTg0NTkxOTExKSk7ICAgICAgICAvKiBjMTEgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDIgKyB0bXAzLCAtIEZJWCgwLjE4NDU5MTkxMSkpOyAvKiAtYzExICovCisgICAgdG1wMTIgKz0gdG1wMTEgLSB0bXAxNSAtIE1VTFRJUExZKHRtcDIsIEZJWCgyLjMzOTQ5MzkxMikpIC8qIGMxK2M1LWMxMSAqLworCSAgICArIE1VTFRJUExZKHRtcDUsIEZJWCgwLjg2MDkxODY2OSkpOyAgICAgICAgLyogYzcgKi8KKyAgICB0bXAxMyArPSB0bXAxMSAtIHRtcDE0ICsgTVVMVElQTFkodG1wMywgRklYKDAuNzI1Nzg4MDExKSkgLyogYzErYzExLWM3ICovCisJICAgIC0gTVVMVElQTFkodG1wNSwgRklYKDEuMTIxOTcxMDU0KSk7ICAgICAgICAvKiBjNSAqLworICAgIHRtcDExID0gdG1wMTUgKyBNVUxUSVBMWSh0bXAwIC0gdG1wMywgRklYKDEuMzA2NTYyOTY1KSkgLyogYzMgKi8KKwkgICAgLSBNVUxUSVBMWSh0bXAyICsgdG1wNSwgRklYXzBfNTQxMTk2MTAwKTsgIC8qIGM5ICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAsIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMSwgQ09OU1RfQklUUyk7CisgICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyLCBDT05TVF9CSVRTKTsKKyAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTMsIENPTlNUX0JJVFMpOworCisgICAgY3RyKys7CisKKyAgICBpZiAoY3RyICE9IERDVFNJWkUpIHsKKyAgICAgIGlmIChjdHIgPT0gMTIpCisJYnJlYWs7CQkJLyogRG9uZS4gKi8KKyAgICAgIGRhdGFwdHIgKz0gRENUU0laRTsJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgfSBlbHNlCisgICAgICBkYXRhcHRyID0gd29ya3NwYWNlOwkvKiBzd2l0Y2ggcG9pbnRlciB0byBleHRlbmRlZCB3b3Jrc3BhY2UgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAgYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvMTIpKioyID0gNC85LCB3aGljaCB3ZSBwYXJ0aWFsbHkKKyAgICogZm9sZCBpbnRvIHRoZSBjb25zdGFudCBtdWx0aXBsaWVycyBhbmQgZmluYWwgc2hpZnRpbmc6CisgICAqIGNLIG5vdyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yNCkgKiA4LzkuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIHdzcHRyW0RDVFNJWkUqM107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjVdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNTsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXA1OworICAgIHRtcDExID0gdG1wMSArIHRtcDQ7CisgICAgdG1wMTQgPSB0bXAxIC0gdG1wNDsKKyAgICB0bXAxMiA9IHRtcDIgKyB0bXAzOworICAgIHRtcDE1ID0gdG1wMiAtIHRtcDM7CisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gd3NwdHJbRENUU0laRSozXTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gd3NwdHJbRENUU0laRSoyXTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gd3NwdHJbRENUU0laRSoxXTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjRdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqNV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgKyB0bXAxMSArIHRtcDEyLCBGSVgoMC44ODg4ODg4ODkpKSwgLyogOC85ICovCisJICAgICAgQ09OU1RfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTMgLSB0bXAxNCAtIHRtcDE1LCBGSVgoMC44ODg4ODg4ODkpKSwgLyogOC85ICovCisJICAgICAgQ09OU1RfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYKDEuMDg4NjYyMTA4KSksICAgICAgICAgLyogYzQgKi8KKwkgICAgICBDT05TVF9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxNCAtIHRtcDE1LCBGSVgoMC44ODg4ODg4ODkpKSArICAgICAgICAvKiA4LzkgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMyArIHRtcDE1LCBGSVgoMS4yMTQyNDQ4MDMpKSwgICAgICAgICAvKiBjMiAqLworCSAgICAgIENPTlNUX0JJVFMrMSk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxICsgdG1wNCwgRklYKDAuNDgxMDYzMjAwKSk7ICAgLyogYzkgKi8KKyAgICB0bXAxNCA9IHRtcDEwICsgTVVMVElQTFkodG1wMSwgRklYKDAuNjgwMzI2MTAyKSk7ICAvKiBjMy1jOSAqLworICAgIHRtcDE1ID0gdG1wMTAgLSBNVUxUSVBMWSh0bXA0LCBGSVgoMS42NDI0NTI1MDIpKTsgIC8qIGMzK2M5ICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDAuOTk3MzA3NjAzKSk7ICAgLyogYzUgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHRtcDAgKyB0bXAzLCBGSVgoMC43NjUyNjEwMzkpKTsgICAvKiBjNyAqLworICAgIHRtcDEwID0gdG1wMTIgKyB0bXAxMyArIHRtcDE0IC0gTVVMVElQTFkodG1wMCwgRklYKDAuNTE2MjQ0NDAzKSkgLyogYzUrYzctYzEgKi8KKwkgICAgKyBNVUxUSVBMWSh0bXA1LCBGSVgoMC4xNjQwODE2OTkpKTsgICAgICAgIC8qIGMxMSAqLworICAgIHRtcDExID0gTVVMVElQTFkodG1wMiArIHRtcDMsIC0gRklYKDAuMTY0MDgxNjk5KSk7IC8qIC1jMTEgKi8KKyAgICB0bXAxMiArPSB0bXAxMSAtIHRtcDE1IC0gTVVMVElQTFkodG1wMiwgRklYKDIuMDc5NTUwMTQ0KSkgLyogYzErYzUtYzExICovCisJICAgICsgTVVMVElQTFkodG1wNSwgRklYKDAuNzY1MjYxMDM5KSk7ICAgICAgICAvKiBjNyAqLworICAgIHRtcDEzICs9IHRtcDExIC0gdG1wMTQgKyBNVUxUSVBMWSh0bXAzLCBGSVgoMC42NDUxNDQ4OTkpKSAvKiBjMStjMTEtYzcgKi8KKwkgICAgLSBNVUxUSVBMWSh0bXA1LCBGSVgoMC45OTczMDc2MDMpKTsgICAgICAgIC8qIGM1ICovCisgICAgdG1wMTEgPSB0bXAxNSArIE1VTFRJUExZKHRtcDAgLSB0bXAzLCBGSVgoMS4xNjEzODkzMDIpKSAvKiBjMyAqLworCSAgICAtIE1VTFRJUExZKHRtcDIgKyB0bXA1LCBGSVgoMC40ODEwNjMyMDApKTsgLyogYzkgKi8KKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwLCBDT05TVF9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDExLCBDT05TVF9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyLCBDT05TVF9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEzLCBDT05TVF9CSVRTKzEpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICAgIHdzcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gYSAxM3gxMyBzYW1wbGUgYmxvY2suCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfMTN4MTMgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNjsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNTsKKyAgSU5UMzIgejEsIHoyOworICBEQ1RFTEVNIHdvcmtzcGFjZVs4KjVdOworICBEQ1RFTEVNICpkYXRhcHRyOworICBEQ1RFTEVNICp3c3B0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENULiAqLworICAvKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yNikuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGN0ciA9IDA7CisgIGZvciAoOzspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTJdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMV0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzEwXSk7CisgICAgdG1wMyA9IEdFVEpTQU1QTEUoZWxlbXB0clszXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDQgPSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXA1ID0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wNiA9IEdFVEpTQU1QTEUoZWxlbXB0cls2XSk7CisKKyAgICB0bXAxMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTJdKTsKKyAgICB0bXAxMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTFdKTsKKyAgICB0bXAxMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTBdKTsKKyAgICB0bXAxMyA9IEdFVEpTQU1QTEUoZWxlbXB0clszXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDE0ID0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wMTUgPSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzddKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICh0bXAwICsgdG1wMSArIHRtcDIgKyB0bXAzICsgdG1wNCArIHRtcDUgKyB0bXA2IC0gMTMgKiBDRU5URVJKU0FNUExFKTsKKyAgICB0bXA2ICs9IHRtcDY7CisgICAgdG1wMCAtPSB0bXA2OworICAgIHRtcDEgLT0gdG1wNjsKKyAgICB0bXAyIC09IHRtcDY7CisgICAgdG1wMyAtPSB0bXA2OworICAgIHRtcDQgLT0gdG1wNjsKKyAgICB0bXA1IC09IHRtcDY7CisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAwLCBGSVgoMS4zNzMxMTkwODYpKSArICAgLyogYzIgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxLCBGSVgoMS4wNTg1NTQwNTIpKSArICAgLyogYzYgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAyLCBGSVgoMC41MDE0ODcwNDEpKSAtICAgLyogYzEwICovCisJICAgICAgTVVMVElQTFkodG1wMywgRklYKDAuMTcwNDY0NjA4KSkgLSAgIC8qIGMxMiAqLworCSAgICAgIE1VTFRJUExZKHRtcDQsIEZJWCgwLjgwMzM2NDg2OSkpIC0gICAvKiBjOCAqLworCSAgICAgIE1VTFRJUExZKHRtcDUsIEZJWCgxLjI1MjIyMzkyMCkpLCAgICAvKiBjNCAqLworCSAgICAgIENPTlNUX0JJVFMpOworICAgIHoxID0gTVVMVElQTFkodG1wMCAtIHRtcDIsIEZJWCgxLjE1NTM4ODk4NikpIC0gLyogKGM0K2M2KS8yICovCisJIE1VTFRJUExZKHRtcDMgLSB0bXA0LCBGSVgoMC40MzU4MTYwMjMpKSAtIC8qIChjMi1jMTApLzIgKi8KKwkgTVVMVElQTFkodG1wMSAtIHRtcDUsIEZJWCgwLjMxNjQ1MDEzMSkpOyAgLyogKGM4LWMxMikvMiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMCArIHRtcDIsIEZJWCgwLjA5NjgzNDkzNCkpIC0gLyogKGM0LWM2KS8yICovCisJIE1VTFRJUExZKHRtcDMgKyB0bXA0LCBGSVgoMC45MzczMDMwNjQpKSArIC8qIChjMitjMTApLzIgKi8KKwkgTVVMVElQTFkodG1wMSArIHRtcDUsIEZJWCgwLjQ4NjkxNDczOSkpOyAgLyogKGM4K2MxMikvMiAqLworCisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgejIsIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSAtIHoyLCBDT05TVF9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYKDEuMzIyMzEyNjUxKSk7ICAgLyogYzMgKi8KKyAgICB0bXAyID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMiwgRklYKDEuMTYzODc0OTQ1KSk7ICAgLyogYzUgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMywgRklYKDAuOTM3Nzk3MDU3KSkgKyAgLyogYzcgKi8KKwkgICBNVUxUSVBMWSh0bXAxNCArIHRtcDE1LCBGSVgoMC4zMzg0NDM0NTgpKTsgICAvKiBjMTEgKi8KKyAgICB0bXAwID0gdG1wMSArIHRtcDIgKyB0bXAzIC0KKwkgICBNVUxUSVBMWSh0bXAxMCwgRklYKDIuMDIwMDgyMzAwKSkgKyAgICAgICAgICAvKiBjMytjNStjNy1jMSAqLworCSAgIE1VTFRJUExZKHRtcDE0LCBGSVgoMC4zMTg3NzQzNTUpKTsgICAgICAgICAgIC8qIGM5LWMxMSAqLworICAgIHRtcDQgPSBNVUxUSVBMWSh0bXAxNCAtIHRtcDE1LCBGSVgoMC45Mzc3OTcwNTcpKSAtICAvKiBjNyAqLworCSAgIE1VTFRJUExZKHRtcDExICsgdG1wMTIsIEZJWCgwLjMzODQ0MzQ1OCkpOyAgIC8qIGMxMSAqLworICAgIHRtcDUgPSBNVUxUSVBMWSh0bXAxMSArIHRtcDEzLCAtIEZJWCgxLjE2Mzg3NDk0NSkpOyAvKiAtYzUgKi8KKyAgICB0bXAxICs9IHRtcDQgKyB0bXA1ICsKKwkgICAgTVVMVElQTFkodG1wMTEsIEZJWCgwLjgzNzIyMzU2NCkpIC0gICAgICAgICAvKiBjNStjOStjMTEtYzMgKi8KKwkgICAgTVVMVElQTFkodG1wMTQsIEZJWCgyLjM0MTY5OTQxMCkpOyAgICAgICAgICAvKiBjMStjNyAqLworICAgIHRtcDYgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCAtIEZJWCgwLjY1NzIxNzgxMykpOyAvKiAtYzkgKi8KKyAgICB0bXAyICs9IHRtcDQgKyB0bXA2IC0KKwkgICAgTVVMVElQTFkodG1wMTIsIEZJWCgxLjU3MjExNjAyNykpICsgICAgICAgICAvKiBjMStjNS1jOS1jMTEgKi8KKwkgICAgTVVMVElQTFkodG1wMTUsIEZJWCgyLjI2MDEwOTcwOCkpOyAgICAgICAgICAvKiBjMytjNyAqLworICAgIHRtcDMgKz0gdG1wNSArIHRtcDYgKworCSAgICBNVUxUSVBMWSh0bXAxMywgRklYKDIuMjA1NjA4MzUyKSkgLSAgICAgICAgIC8qIGMzK2M1K2M5LWM3ICovCisJICAgIE1VTFRJUExZKHRtcDE1LCBGSVgoMS43NDIzNDU4MTEpKTsgICAgICAgICAgLyogYzErYzExICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMCwgQ09OU1RfQklUUyk7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEsIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAyLCBDT05TVF9CSVRTKTsKKyAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMywgQ09OU1RfQklUUyk7CisKKyAgICBjdHIrKzsKKworICAgIGlmIChjdHIgIT0gRENUU0laRSkgeworICAgICAgaWYgKGN0ciA9PSAxMykKKwlicmVhazsJCQkvKiBEb25lLiAqLworICAgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICB9IGVsc2UKKyAgICAgIGRhdGFwdHIgPSB3b3Jrc3BhY2U7CS8qIHN3aXRjaCBwb2ludGVyIHRvIGV4dGVuZGVkIHdvcmtzcGFjZSAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cCBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8xMykqKjIgPSA2NC8xNjksIHdoaWNoIHdlIHBhcnRpYWxseQorICAgKiBmb2xkIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzIGFuZCBmaW5hbCBzaGlmdGluZzoKKyAgICogY0sgbm93IHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzI2KSAqIDEyOC8xNjkuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIHdzcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIHdzcHRyW0RDVFNJWkUqM107CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSArIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjZdOworCisgICAgdG1wMTAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSB3c3B0cltEQ1RTSVpFKjRdOworICAgIHRtcDExID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gd3NwdHJbRENUU0laRSozXTsKKyAgICB0bXAxMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wMTMgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSB3c3B0cltEQ1RTSVpFKjFdOworICAgIHRtcDE0ID0gZGF0YXB0cltEQ1RTSVpFKjRdIC0gd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXAxNSA9IGRhdGFwdHJbRENUU0laRSo1XSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAwICsgdG1wMSArIHRtcDIgKyB0bXAzICsgdG1wNCArIHRtcDUgKyB0bXA2LAorCQkgICAgICAgRklYKDAuNzU3Mzk2NDUwKSksICAgICAgICAgIC8qIDEyOC8xNjkgKi8KKwkgICAgICBDT05TVF9CSVRTKzEpOworICAgIHRtcDYgKz0gdG1wNjsKKyAgICB0bXAwIC09IHRtcDY7CisgICAgdG1wMSAtPSB0bXA2OworICAgIHRtcDIgLT0gdG1wNjsKKyAgICB0bXAzIC09IHRtcDY7CisgICAgdG1wNCAtPSB0bXA2OworICAgIHRtcDUgLT0gdG1wNjsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMCwgRklYKDEuMDM5OTk1NTIxKSkgKyAgIC8qIGMyICovCisJICAgICAgTVVMVElQTFkodG1wMSwgRklYKDAuODAxNzQ1MDgxKSkgKyAgIC8qIGM2ICovCisJICAgICAgTVVMVElQTFkodG1wMiwgRklYKDAuMzc5ODI0NTA0KSkgLSAgIC8qIGMxMCAqLworCSAgICAgIE1VTFRJUExZKHRtcDMsIEZJWCgwLjEyOTEwOTI4OSkpIC0gICAvKiBjMTIgKi8KKwkgICAgICBNVUxUSVBMWSh0bXA0LCBGSVgoMC42MDg0NjU3MDApKSAtICAgLyogYzggKi8KKwkgICAgICBNVUxUSVBMWSh0bXA1LCBGSVgoMC45NDg0Mjk5NTIpKSwgICAgLyogYzQgKi8KKwkgICAgICBDT05TVF9CSVRTKzEpOworICAgIHoxID0gTVVMVElQTFkodG1wMCAtIHRtcDIsIEZJWCgwLjg3NTA4NzUxNikpIC0gLyogKGM0K2M2KS8yICovCisJIE1VTFRJUExZKHRtcDMgLSB0bXA0LCBGSVgoMC4zMzAwODU1MDkpKSAtIC8qIChjMi1jMTApLzIgKi8KKwkgTVVMVElQTFkodG1wMSAtIHRtcDUsIEZJWCgwLjIzOTY3ODIwNSkpOyAgLyogKGM4LWMxMikvMiAqLworICAgIHoyID0gTVVMVElQTFkodG1wMCArIHRtcDIsIEZJWCgwLjA3MzM0MjQzNSkpIC0gLyogKGM0LWM2KS8yICovCisJIE1VTFRJUExZKHRtcDMgKyB0bXA0LCBGSVgoMC43MDk5MTAwMTMpKSArIC8qIChjMitjMTApLzIgKi8KKwkgTVVMVElQTFkodG1wMSArIHRtcDUsIEZJWCgwLjM2ODc4NzQ5NCkpOyAgLyogKGM4K2MxMikvMiAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyB6MiwgQ09OU1RfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSAtIHoyLCBDT05TVF9CSVRTKzEpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVgoMS4wMDE1MTQ5MDgpKTsgICAvKiBjMyAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDEyLCBGSVgoMC44ODE1MTQ3NTEpKTsgICAvKiBjNSAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDEzLCBGSVgoMC43MTAyODQxNjEpKSArICAvKiBjNyAqLworCSAgIE1VTFRJUExZKHRtcDE0ICsgdG1wMTUsIEZJWCgwLjI1NjMzNTg3NCkpOyAgIC8qIGMxMSAqLworICAgIHRtcDAgPSB0bXAxICsgdG1wMiArIHRtcDMgLQorCSAgIE1VTFRJUExZKHRtcDEwLCBGSVgoMS41MzAwMDMxNjIpKSArICAgICAgICAgIC8qIGMzK2M1K2M3LWMxICovCisJICAgTVVMVElQTFkodG1wMTQsIEZJWCgwLjI0MTQzODU2NCkpOyAgICAgICAgICAgLyogYzktYzExICovCisgICAgdG1wNCA9IE1VTFRJUExZKHRtcDE0IC0gdG1wMTUsIEZJWCgwLjcxMDI4NDE2MSkpIC0gIC8qIGM3ICovCisJICAgTVVMVElQTFkodG1wMTEgKyB0bXAxMiwgRklYKDAuMjU2MzM1ODc0KSk7ICAgLyogYzExICovCisgICAgdG1wNSA9IE1VTFRJUExZKHRtcDExICsgdG1wMTMsIC0gRklYKDAuODgxNTE0NzUxKSk7IC8qIC1jNSAqLworICAgIHRtcDEgKz0gdG1wNCArIHRtcDUgKworCSAgICBNVUxUSVBMWSh0bXAxMSwgRklYKDAuNjM0MTEwMTU1KSkgLSAgICAgICAgIC8qIGM1K2M5K2MxMS1jMyAqLworCSAgICBNVUxUSVBMWSh0bXAxNCwgRklYKDEuNzczNTk0ODE5KSk7ICAgICAgICAgIC8qIGMxK2M3ICovCisgICAgdG1wNiA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIC0gRklYKDAuNDk3Nzc0NDM4KSk7IC8qIC1jOSAqLworICAgIHRtcDIgKz0gdG1wNCArIHRtcDYgLQorCSAgICBNVUxUSVBMWSh0bXAxMiwgRklYKDEuMTkwNzE1MDk4KSkgKyAgICAgICAgIC8qIGMxK2M1LWM5LWMxMSAqLworCSAgICBNVUxUSVBMWSh0bXAxNSwgRklYKDEuNzExNzk5MDY5KSk7ICAgICAgICAgIC8qIGMzK2M3ICovCisgICAgdG1wMyArPSB0bXA1ICsgdG1wNiArCisJICAgIE1VTFRJUExZKHRtcDEzLCBGSVgoMS42NzA1MTk5MzUpKSAtICAgICAgICAgLyogYzMrYzUrYzktYzcgKi8KKwkgICAgTVVMVElQTFkodG1wMTUsIEZJWCgxLjMxOTY0NjUzMikpOyAgICAgICAgICAvKiBjMStjMTEgKi8KKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDAsIENPTlNUX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMSwgQ09OU1RfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAyLCBDT05TVF9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDMsIENPTlNUX0JJVFMrMSk7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgICAgd3NwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDE0eDE0IHNhbXBsZSBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF8xNHgxNCAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCB0bXAxNjsKKyAgRENURUxFTSB3b3Jrc3BhY2VbOCo2XTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVC4gKi8KKyAgLyogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMjgpLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzEzXSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTJdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMV0pOworICAgIHRtcDEzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMF0pOworICAgIHRtcDQgPSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXA1ID0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wNiA9IEdFVEpTQU1QTEUoZWxlbXB0cls2XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNjsKKyAgICB0bXAxNCA9IHRtcDAgLSB0bXA2OworICAgIHRtcDExID0gdG1wMSArIHRtcDU7CisgICAgdG1wMTUgPSB0bXAxIC0gdG1wNTsKKyAgICB0bXAxMiA9IHRtcDIgKyB0bXA0OworICAgIHRtcDE2ID0gdG1wMiAtIHRtcDQ7CisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxM10pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzEyXSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTFdKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxMF0pOworICAgIHRtcDQgPSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXA1ID0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisgICAgdG1wNiA9IEdFVEpTQU1QTEUoZWxlbXB0cls2XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKHRtcDEwICsgdG1wMTEgKyB0bXAxMiArIHRtcDEzIC0gMTQgKiBDRU5URVJKU0FNUExFKTsKKyAgICB0bXAxMyArPSB0bXAxMzsKKyAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTMsIEZJWCgxLjI3NDE2MjM5MikpICsgLyogYzQgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMSAtIHRtcDEzLCBGSVgoMC4zMTQ2OTIxMjMpKSAtIC8qIGMxMiAqLworCSAgICAgIE1VTFRJUExZKHRtcDEyIC0gdG1wMTMsIEZJWCgwLjg4MTc0NzczNCkpLCAgLyogYzggKi8KKwkgICAgICBDT05TVF9CSVRTKTsKKworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTQgKyB0bXAxNSwgRklYKDEuMTA1Njc2Njg2KSk7ICAgIC8qIGM2ICovCisKKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgTVVMVElQTFkodG1wMTQsIEZJWCgwLjI3MzA3OTU5MCkpICAgLyogYzItYzYgKi8KKwkgICAgICArIE1VTFRJUExZKHRtcDE2LCBGSVgoMC42MTM2MDQyNjgpKSwgICAgICAgIC8qIGMxMCAqLworCSAgICAgIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxNSwgRklYKDEuNzE5MjgwOTU0KSkgICAvKiBjNitjMTAgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDE2LCBGSVgoMS4zNzg3NTYyNzYpKSwgICAgICAgIC8qIGMyICovCisJICAgICAgQ09OU1RfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMSA9IHRtcDUgLSB0bXA0OworICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgKHRtcDAgLSB0bXAxMCArIHRtcDMgLSB0bXAxMSAtIHRtcDYpOworICAgIHRtcDMgPDw9IENPTlNUX0JJVFM7CisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxMCwgLSBGSVgoMC4xNTgzNDE2ODEpKTsgICAgICAgICAgLyogLWMxMyAqLworICAgIHRtcDExID0gTVVMVElQTFkodG1wMTEsIEZJWCgxLjQwNTMyMTI4NCkpOyAgICAgICAgICAgIC8qIGMxICovCisgICAgdG1wMTAgKz0gdG1wMTEgLSB0bXAzOworICAgIHRtcDExID0gTVVMVElQTFkodG1wMCArIHRtcDIsIEZJWCgxLjE5NzQ0ODg0NikpICsgICAgIC8qIGM1ICovCisJICAgIE1VTFRJUExZKHRtcDQgKyB0bXA2LCBGSVgoMC43NTI0MDY5NzgpKTsgICAgICAvKiBjOSAqLworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyB0bXAxMSAtIE1VTFRJUExZKHRtcDIsIEZJWCgyLjM3Mzk1OTc3MykpIC8qIGMzK2M1LWMxMyAqLworCSAgICAgICsgTVVMVElQTFkodG1wNCwgRklYKDEuMTE5OTk5NDM1KSksICAgICAgICAgLyogYzErYzExLWM5ICovCisJICAgICAgQ09OU1RfQklUUyk7CisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDEuMzM0ODUyNjA3KSkgKyAgICAgLyogYzMgKi8KKwkgICAgTVVMVElQTFkodG1wNSAtIHRtcDYsIEZJWCgwLjQ2NzA4NTEyOSkpOyAgICAgIC8qIGMxMSAqLworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyB0bXAxMiAtIE1VTFRJUExZKHRtcDEsIEZJWCgwLjQyNDEwMzk0OCkpIC8qIGMzLWM5LWMxMyAqLworCSAgICAgIC0gTVVMVElQTFkodG1wNSwgRklYKDMuMDY5ODU1MjU5KSksICAgICAgICAgLyogYzErYzUrYzExICovCisJICAgICAgQ09OU1RfQklUUyk7CisgICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMSArIHRtcDEyICsgdG1wMyArIHRtcDYgLQorCSAgICAgIE1VTFRJUExZKHRtcDAgKyB0bXA2LCBGSVgoMS4xMjY5ODAxNjkpKSwgICAgLyogYzMrYzUtYzEgKi8KKwkgICAgICBDT05TVF9CSVRTKTsKKworICAgIGN0cisrOworCisgICAgaWYgKGN0ciAhPSBEQ1RTSVpFKSB7CisgICAgICBpZiAoY3RyID09IDE0KQorCWJyZWFrOwkJCS8qIERvbmUuICovCisgICAgICBkYXRhcHRyICs9IERDVFNJWkU7CS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgIH0gZWxzZQorICAgICAgZGF0YXB0ciA9IHdvcmtzcGFjZTsJLyogc3dpdGNoIHBvaW50ZXIgdG8gZXh0ZW5kZWQgd29ya3NwYWNlICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5ICg4LzE0KSoqMiA9IDE2LzQ5LCB3aGljaCB3ZSBwYXJ0aWFsbHkKKyAgICogZm9sZCBpbnRvIHRoZSBjb25zdGFudCBtdWx0aXBsaWVycyBhbmQgZmluYWwgc2hpZnRpbmc6CisgICAqIGNLIG5vdyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yOCkgKiAzMi80OS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgd3NwdHJbRENUU0laRSo1XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgd3NwdHJbRENUU0laRSo0XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgd3NwdHJbRENUU0laRSozXTsKKyAgICB0bXAxMyA9IGRhdGFwdHJbRENUU0laRSozXSArIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSArIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XSArIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSo2XSArIGRhdGFwdHJbRENUU0laRSo3XTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDY7CisgICAgdG1wMTQgPSB0bXAwIC0gdG1wNjsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXA1OworICAgIHRtcDE1ID0gdG1wMSAtIHRtcDU7CisgICAgdG1wMTIgPSB0bXAyICsgdG1wNDsKKyAgICB0bXAxNiA9IHRtcDIgLSB0bXA0OworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIHdzcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIHdzcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIHdzcHRyW0RDVFNJWkUqM107CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSAtIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSAtIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XSAtIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSo2XSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCArIHRtcDExICsgdG1wMTIgKyB0bXAxMywKKwkJICAgICAgIEZJWCgwLjY1MzA2MTIyNCkpLCAgICAgICAgICAgICAgICAgLyogMzIvNDkgKi8KKwkgICAgICBDT05TVF9CSVRTKzEpOworICAgIHRtcDEzICs9IHRtcDEzOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDEzLCBGSVgoMC44MzIxMDYwNTIpKSArIC8qIGM0ICovCisJICAgICAgTVVMVElQTFkodG1wMTEgLSB0bXAxMywgRklYKDAuMjA1NTEzMjIzKSkgLSAvKiBjMTIgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMiAtIHRtcDEzLCBGSVgoMC41NzU4MzUyNTUpKSwgIC8qIGM4ICovCisJICAgICAgQ09OU1RfQklUUysxKTsKKworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTQgKyB0bXAxNSwgRklYKDAuNzIyMDc0NTcwKSk7ICAgIC8qIGM2ICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyBNVUxUSVBMWSh0bXAxNCwgRklYKDAuMTc4MzM3NjkxKSkgICAvKiBjMi1jNiAqLworCSAgICAgICsgTVVMVElQTFkodG1wMTYsIEZJWCgwLjQwMDcyMTE1NSkpLCAgICAgICAgLyogYzEwICovCisJICAgICAgQ09OU1RfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxNSwgRklYKDEuMTIyNzk1NzI1KSkgICAvKiBjNitjMTAgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDE2LCBGSVgoMC45MDA0MTIyNjIpKSwgICAgICAgIC8qIGMyICovCisJICAgICAgQ09OU1RfQklUUysxKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDEgKyB0bXAyOworICAgIHRtcDExID0gdG1wNSAtIHRtcDQ7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgLSB0bXAxMCArIHRtcDMgLSB0bXAxMSAtIHRtcDYsCisJCSAgICAgICBGSVgoMC42NTMwNjEyMjQpKSwgICAgICAgICAgICAgICAgIC8qIDMyLzQ5ICovCisJICAgICAgQ09OU1RfQklUUysxKTsKKyAgICB0bXAzICA9IE1VTFRJUExZKHRtcDMgLCBGSVgoMC42NTMwNjEyMjQpKTsgICAgICAgICAgICAvKiAzMi80OSAqLworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIC0gRklYKDAuMTAzNDA2ODEyKSk7ICAgICAgICAgIC8qIC1jMTMgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC45MTc3NjA4MzkpKTsgICAgICAgICAgICAvKiBjMSAqLworICAgIHRtcDEwICs9IHRtcDExIC0gdG1wMzsKKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDAgKyB0bXAyLCBGSVgoMC43ODIwMDc0MTApKSArICAgICAvKiBjNSAqLworCSAgICBNVUxUSVBMWSh0bXA0ICsgdG1wNiwgRklYKDAuNDkxMzY3ODIzKSk7ICAgICAgLyogYzkgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyB0bXAxMSAtIE1VTFRJUExZKHRtcDIsIEZJWCgxLjU1MDM0MTA3NikpIC8qIGMzK2M1LWMxMyAqLworCSAgICAgICsgTVVMVElQTFkodG1wNCwgRklYKDAuNzMxNDI4MjAyKSksICAgICAgICAgLyogYzErYzExLWM5ICovCisJICAgICAgQ09OU1RfQklUUysxKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDAgKyB0bXAxLCBGSVgoMC44NzE3NDA0NzgpKSArICAgICAvKiBjMyAqLworCSAgICBNVUxUSVBMWSh0bXA1IC0gdG1wNiwgRklYKDAuMzA1MDM1MTg2KSk7ICAgICAgLyogYzExICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgdG1wMTIgLSBNVUxUSVBMWSh0bXAxLCBGSVgoMC4yNzY5NjU4NDQpKSAvKiBjMy1jOS1jMTMgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDUsIEZJWCgyLjAwNDgwMzQzNSkpLCAgICAgICAgIC8qIGMxK2M1K2MxMSAqLworCSAgICAgIENPTlNUX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDExICsgdG1wMTIgKyB0bXAzCisJICAgICAgLSBNVUxUSVBMWSh0bXAwLCBGSVgoMC43MzU5ODcwNDkpKSAgICAgICAgICAvKiBjMytjNS1jMSAqLworCSAgICAgIC0gTVVMVElQTFkodG1wNiwgRklYKDAuMDgyOTI1ODI1KSksICAgICAgICAgLyogYzktYzExLWMxMyAqLworCSAgICAgIENPTlNUX0JJVFMrMSk7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgICAgd3NwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDE1eDE1IHNhbXBsZSBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF8xNXgxNSAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCB0bXAxNjsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgRENURUxFTSB3b3Jrc3BhY2VbOCo3XTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVC4gKi8KKyAgLyogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMzApLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzE0XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTNdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMl0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzExXSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTBdKTsKKyAgICB0bXA1ID0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls5XSk7CisgICAgdG1wNiA9IEdFVEpTQU1QTEUoZWxlbXB0cls2XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbOF0pOworICAgIHRtcDcgPSBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworCisgICAgdG1wMTAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzE0XSk7CisgICAgdG1wMTEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzEzXSk7CisgICAgdG1wMTIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzEyXSk7CisgICAgdG1wMTMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzExXSk7CisgICAgdG1wMTQgPSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzEwXSk7CisgICAgdG1wMTUgPSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXAxNiA9IEdFVEpTQU1QTEUoZWxlbXB0cls2XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOF0pOworCisgICAgejEgPSB0bXAwICsgdG1wNCArIHRtcDU7CisgICAgejIgPSB0bXAxICsgdG1wMyArIHRtcDY7CisgICAgejMgPSB0bXAyICsgdG1wNzsKKyAgICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pICh6MSArIHoyICsgejMgLSAxNSAqIENFTlRFUkpTQU1QTEUpOworICAgIHozICs9IHozOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkoejEgLSB6MywgRklYKDEuMTQ0MTIyODA2KSkgLSAvKiBjNiAqLworCSAgICAgIE1VTFRJUExZKHoyIC0gejMsIEZJWCgwLjQzNzAxNjAyNCkpLCAgLyogYzEyICovCisJICAgICAgQ09OU1RfQklUUyk7CisgICAgdG1wMiArPSAoKHRtcDEgKyB0bXA0KSA+PiAxKSAtIHRtcDcgLSB0bXA3OworICAgIHoxID0gTVVMVElQTFkodG1wMyAtIHRtcDIsIEZJWCgxLjUzMTEzNTE3MykpIC0gIC8qIGMyK2MxNCAqLworICAgICAgICAgTVVMVElQTFkodG1wNiAtIHRtcDIsIEZJWCgyLjIzODI0MTk1NSkpOyAgIC8qIGM0K2M4ICovCisgICAgejIgPSBNVUxUSVBMWSh0bXA1IC0gdG1wMiwgRklYKDAuNzk4NDY4MDA4KSkgLSAgLyogYzgtYzE0ICovCisJIE1VTFRJUExZKHRtcDAgLSB0bXAyLCBGSVgoMC4wOTEzNjEyMjcpKTsgICAvKiBjMi1jNCAqLworICAgIHozID0gTVVMVElQTFkodG1wMCAtIHRtcDMsIEZJWCgxLjM4MzMwOTYwMykpICsgIC8qIGMyICovCisJIE1VTFRJUExZKHRtcDYgLSB0bXA1LCBGSVgoMC45NDYyOTM1NzkpKSArICAvKiBjOCAqLworCSBNVUxUSVBMWSh0bXAxIC0gdG1wNCwgRklYKDAuNzkwNTY5NDE1KSk7ICAgLyogKGM2K2MxMikvMiAqLworCisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgejMsIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkgREVTQ0FMRSh6MiArIHozLCBDT05TVF9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAyID0gTVVMVElQTFkodG1wMTAgLSB0bXAxMiAtIHRtcDEzICsgdG1wMTUgKyB0bXAxNiwKKwkJICAgIEZJWCgxLjIyNDc0NDg3MSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjNSAqLworICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDE0IC0gdG1wMTUsIEZJWCgxLjM0NDk5NzAyNCkpICsgLyogYzMgKi8KKwkgICBNVUxUSVBMWSh0bXAxMSAtIHRtcDEzIC0gdG1wMTYsIEZJWCgwLjgzMTI1Mzg3NikpOyAgLyogYzkgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEyLCBGSVgoMS4yMjQ3NDQ4NzEpKTsgICAgICAgICAgICAgICAgIC8qIGM1ICovCisgICAgdG1wNCA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTYsIEZJWCgxLjQwNjQ2NjM1MykpICsgICAgICAgICAvKiBjMSAqLworCSAgIE1VTFRJUExZKHRtcDExICsgdG1wMTQsIEZJWCgxLjM0NDk5NzAyNCkpICsgICAgICAgICAvKiBjMyAqLworCSAgIE1VTFRJUExZKHRtcDEzICsgdG1wMTUsIEZJWCgwLjU3NTIxMjQ3NykpOyAgICAgICAgICAvKiBjMTEgKi8KKyAgICB0bXAwID0gTVVMVElQTFkodG1wMTMsIEZJWCgwLjQ3NTc1MzAxNCkpIC0gICAgICAgICAgICAgICAgIC8qIGM3LWMxMSAqLworCSAgIE1VTFRJUExZKHRtcDE0LCBGSVgoMC41MTM3NDMxNDgpKSArICAgICAgICAgICAgICAgICAvKiBjMy1jOSAqLworCSAgIE1VTFRJUExZKHRtcDE2LCBGSVgoMS43MDA0OTc4ODUpKSArIHRtcDQgKyB0bXAxMjsgICAvKiBjMStjMTMgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMTAsIC0gRklYKDAuMzU1NTAwODYyKSkgLSAgICAgICAgICAgICAgIC8qIC0oYzEtYzcpICovCisJICAgTVVMVElQTFkodG1wMTEsIEZJWCgyLjE3NjI1MDg5OSkpIC0gICAgICAgICAgICAgICAgIC8qIGMzK2M5ICovCisJICAgTVVMVElQTFkodG1wMTUsIEZJWCgwLjg2OTI0NDAxMCkpICsgdG1wNCAtIHRtcDEyOyAgIC8qIGMxMStjMTMgKi8KKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAwLCBDT05TVF9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMSwgQ09OU1RfQklUUyk7CisgICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDIsIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAzLCBDT05TVF9CSVRTKTsKKworICAgIGN0cisrOworCisgICAgaWYgKGN0ciAhPSBEQ1RTSVpFKSB7CisgICAgICBpZiAoY3RyID09IDE1KQorCWJyZWFrOwkJCS8qIERvbmUuICovCisgICAgICBkYXRhcHRyICs9IERDVFNJWkU7CS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgIH0gZWxzZQorICAgICAgZGF0YXB0ciA9IHdvcmtzcGFjZTsJLyogc3dpdGNoIHBvaW50ZXIgdG8gZXh0ZW5kZWQgd29ya3NwYWNlICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5ICg4LzE1KSoqMiA9IDY0LzIyNSwgd2hpY2ggd2UgcGFydGlhbGx5CisgICAqIGZvbGQgaW50byB0aGUgY29uc3RhbnQgbXVsdGlwbGllcnMgYW5kIGZpbmFsIHNoaWZ0aW5nOgorICAgKiBjSyBub3cgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMzApICogMjU2LzIyNS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgd3NwdHJbRENUU0laRSo2XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgd3NwdHJbRENUU0laRSo1XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgd3NwdHJbRENUU0laRSo0XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgd3NwdHJbRENUU0laRSozXTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjRdICsgd3NwdHJbRENUU0laRSoyXTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjVdICsgd3NwdHJbRENUU0laRSoxXTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjZdICsgd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjddOworCisgICAgdG1wMTAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSB3c3B0cltEQ1RTSVpFKjZdOworICAgIHRtcDExID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gd3NwdHJbRENUU0laRSo1XTsKKyAgICB0bXAxMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIHdzcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMTMgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSB3c3B0cltEQ1RTSVpFKjNdOworICAgIHRtcDE0ID0gZGF0YXB0cltEQ1RTSVpFKjRdIC0gd3NwdHJbRENUU0laRSoyXTsKKyAgICB0bXAxNSA9IGRhdGFwdHJbRENUU0laRSo1XSAtIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wMTYgPSBkYXRhcHRyW0RDVFNJWkUqNl0gLSB3c3B0cltEQ1RTSVpFKjBdOworCisgICAgejEgPSB0bXAwICsgdG1wNCArIHRtcDU7CisgICAgejIgPSB0bXAxICsgdG1wMyArIHRtcDY7CisgICAgejMgPSB0bXAyICsgdG1wNzsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkoejEgKyB6MiArIHozLCBGSVgoMS4xMzc3Nzc3NzgpKSwgLyogMjU2LzIyNSAqLworCSAgICAgIENPTlNUX0JJVFMrMik7CisgICAgejMgKz0gejM7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHoxIC0gejMsIEZJWCgxLjMwMTc1NzUwMykpIC0gLyogYzYgKi8KKwkgICAgICBNVUxUSVBMWSh6MiAtIHozLCBGSVgoMC40OTcyMjcxMjEpKSwgIC8qIGMxMiAqLworCSAgICAgIENPTlNUX0JJVFMrMik7CisgICAgdG1wMiArPSAoKHRtcDEgKyB0bXA0KSA+PiAxKSAtIHRtcDcgLSB0bXA3OworICAgIHoxID0gTVVMVElQTFkodG1wMyAtIHRtcDIsIEZJWCgxLjc0MjA5MTU3NSkpIC0gIC8qIGMyK2MxNCAqLworICAgICAgICAgTVVMVElQTFkodG1wNiAtIHRtcDIsIEZJWCgyLjU0NjYyMTk1NykpOyAgIC8qIGM0K2M4ICovCisgICAgejIgPSBNVUxUSVBMWSh0bXA1IC0gdG1wMiwgRklYKDAuOTA4NDc5MTU2KSkgLSAgLyogYzgtYzE0ICovCisJIE1VTFRJUExZKHRtcDAgLSB0bXAyLCBGSVgoMC4xMDM5NDg3NzQpKTsgICAvKiBjMi1jNCAqLworICAgIHozID0gTVVMVElQTFkodG1wMCAtIHRtcDMsIEZJWCgxLjU3Mzg5ODkyNikpICsgIC8qIGMyICovCisJIE1VTFRJUExZKHRtcDYgLSB0bXA1LCBGSVgoMS4wNzY2NzE4MDUpKSArICAvKiBjOCAqLworCSBNVUxUSVBMWSh0bXAxIC0gdG1wNCwgRklYKDAuODk5NDkyMzEyKSk7ICAgLyogKGM2K2MxMikvMiAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyB6MywgQ09OU1RfQklUUysyKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkgREVTQ0FMRSh6MiArIHozLCBDT05TVF9CSVRTKzIpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAxMCAtIHRtcDEyIC0gdG1wMTMgKyB0bXAxNSArIHRtcDE2LAorCQkgICAgRklYKDEuMzkzNDg3NDk4KSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGM1ICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTQgLSB0bXAxNSwgRklYKDEuNTMwMzA3NzI1KSkgKyAvKiBjMyAqLworCSAgIE1VTFRJUExZKHRtcDExIC0gdG1wMTMgLSB0bXAxNiwgRklYKDAuOTQ1NzgyMTg3KSk7ICAvKiBjOSAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTIsIEZJWCgxLjM5MzQ4NzQ5OCkpOyAgICAgICAgICAgICAgICAgLyogYzUgKi8KKyAgICB0bXA0ID0gTVVMVElQTFkodG1wMTAgLSB0bXAxNiwgRklYKDEuNjAwMjQ2MTYxKSkgKyAgICAgICAgIC8qIGMxICovCisJICAgTVVMVElQTFkodG1wMTEgKyB0bXAxNCwgRklYKDEuNTMwMzA3NzI1KSkgKyAgICAgICAgIC8qIGMzICovCisJICAgTVVMVElQTFkodG1wMTMgKyB0bXAxNSwgRklYKDAuNjU0NDYzOTc0KSk7ICAgICAgICAgIC8qIGMxMSAqLworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMywgRklYKDAuNTQxMzAxMjA3KSkgLSAgICAgICAgICAgICAgICAgLyogYzctYzExICovCisJICAgTVVMVElQTFkodG1wMTQsIEZJWCgwLjU4NDUyNTUzOCkpICsgICAgICAgICAgICAgICAgIC8qIGMzLWM5ICovCisJICAgTVVMVElQTFkodG1wMTYsIEZJWCgxLjkzNDc4ODcwNSkpICsgdG1wNCArIHRtcDEyOyAgIC8qIGMxK2MxMyAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAxMCwgLSBGSVgoMC40MDQ0ODA5ODApKSAtICAgICAgICAgICAgICAgLyogLShjMS1jNykgKi8KKwkgICBNVUxUSVBMWSh0bXAxMSwgRklYKDIuNDc2MDg5OTEyKSkgLSAgICAgICAgICAgICAgICAgLyogYzMrYzkgKi8KKwkgICBNVUxUSVBMWSh0bXAxNSwgRklYKDAuOTg5MDA2NTE4KSkgKyB0bXA0IC0gdG1wMTI7ICAgLyogYzExK2MxMyAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMCwgQ09OU1RfQklUUysyKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxLCBDT05TVF9CSVRTKzIpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDIsIENPTlNUX0JJVFMrMik7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMywgQ09OU1RfQklUUysyKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICB3c3B0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgMTZ4MTYgc2FtcGxlIGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzE2eDE2IChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUsIHRtcDE2LCB0bXAxNzsKKyAgRENURUxFTSB3b3Jrc3BhY2VbRENUU0laRTJdOworICBEQ1RFTEVNICpkYXRhcHRyOworICBEQ1RFTEVNICp3c3B0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKyAgLyogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMzIpLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzE1XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTRdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxM10pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzEyXSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTFdKTsKKyAgICB0bXA1ID0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMF0pOworICAgIHRtcDYgPSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXA3ID0gR0VUSlNBTVBMRShlbGVtcHRyWzddKSArIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA3OworICAgIHRtcDE0ID0gdG1wMCAtIHRtcDc7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wNjsKKyAgICB0bXAxNSA9IHRtcDEgLSB0bXA2OworICAgIHRtcDEyID0gdG1wMiArIHRtcDU7CisgICAgdG1wMTYgPSB0bXAyIC0gdG1wNTsKKyAgICB0bXAxMyA9IHRtcDMgKyB0bXA0OworICAgIHRtcDE3ID0gdG1wMyAtIHRtcDQ7CisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxNV0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzE0XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTNdKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxMl0pOworICAgIHRtcDQgPSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzExXSk7CisgICAgdG1wNSA9IEdFVEpTQU1QTEUoZWxlbXB0cls1XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTBdKTsKKyAgICB0bXA2ID0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls5XSk7CisgICAgdG1wNyA9IEdFVEpTQU1QTEUoZWxlbXB0cls3XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOF0pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAxMCArIHRtcDExICsgdG1wMTIgKyB0bXAxMyAtIDE2ICogQ0VOVEVSSlNBTVBMRSkgPDwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDEzLCBGSVgoMS4zMDY1NjI5NjUpKSArIC8qIGM0WzE2XSA9IGMyWzhdICovCisJICAgICAgTVVMVElQTFkodG1wMTEgLSB0bXAxMiwgRklYXzBfNTQxMTk2MTAwKSwgICAvKiBjMTJbMTZdID0gYzZbOF0gKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxNyAtIHRtcDE1LCBGSVgoMC4yNzU4OTkzNzkpKSArICAgLyogYzE0WzE2XSA9IGM3WzhdICovCisJICAgIE1VTFRJUExZKHRtcDE0IC0gdG1wMTYsIEZJWCgxLjM4NzAzOTg0NSkpOyAgICAvKiBjMlsxNl0gPSBjMVs4XSAqLworCisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDE1LCBGSVgoMS40NTE3NzQ5ODIpKSAgIC8qIGM2K2MxNCAqLworCSAgICAgICsgTVVMVElQTFkodG1wMTYsIEZJWCgyLjE3MjczNDgwNCkpLCAgICAgICAgLyogYzIrYzEwICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwIC0gTVVMVElQTFkodG1wMTQsIEZJWCgwLjIxMTE2NDI0MykpICAgLyogYzItYzYgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDE3LCBGSVgoMS4wNjE1OTQzMzgpKSwgICAgICAgIC8qIGMxMCtjMTQgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDExID0gTVVMVElQTFkodG1wMCArIHRtcDEsIEZJWCgxLjM1MzMxODAwMSkpICsgICAgICAgICAvKiBjMyAqLworCSAgICBNVUxUSVBMWSh0bXA2IC0gdG1wNywgRklYKDAuNDEwNTI0NTI4KSk7ICAgICAgICAgIC8qIGMxMyAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMCArIHRtcDIsIEZJWCgxLjI0NzIyNTAxMykpICsgICAgICAgICAvKiBjNSAqLworCSAgICBNVUxUSVBMWSh0bXA1ICsgdG1wNywgRklYKDAuNjY2NjU1NjU4KSk7ICAgICAgICAgIC8qIGMxMSAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMCArIHRtcDMsIEZJWCgxLjA5MzIwMTg2NykpICsgICAgICAgICAvKiBjNyAqLworCSAgICBNVUxUSVBMWSh0bXA0IC0gdG1wNywgRklYKDAuODk3MTY3NTg2KSk7ICAgICAgICAgIC8qIGM5ICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh0bXAxICsgdG1wMiwgRklYKDAuMTM4NjE3MTY5KSkgKyAgICAgICAgIC8qIGMxNSAqLworCSAgICBNVUxUSVBMWSh0bXA2IC0gdG1wNSwgRklYKDEuNDA3NDAzNzM4KSk7ICAgICAgICAgIC8qIGMxICovCisgICAgdG1wMTUgPSBNVUxUSVBMWSh0bXAxICsgdG1wMywgLSBGSVgoMC42NjY2NTU2NTgpKSArICAgICAgIC8qIC1jMTEgKi8KKwkgICAgTVVMVElQTFkodG1wNCArIHRtcDYsIC0gRklYKDEuMjQ3MjI1MDEzKSk7ICAgICAgICAvKiAtYzUgKi8KKyAgICB0bXAxNiA9IE1VTFRJUExZKHRtcDIgKyB0bXAzLCAtIEZJWCgxLjM1MzMxODAwMSkpICsgICAgICAgLyogLWMzICovCisJICAgIE1VTFRJUExZKHRtcDUgLSB0bXA0LCBGSVgoMC40MTA1MjQ1MjgpKTsgICAgICAgICAgLyogYzEzICovCisgICAgdG1wMTAgPSB0bXAxMSArIHRtcDEyICsgdG1wMTMgLQorCSAgICBNVUxUSVBMWSh0bXAwLCBGSVgoMi4yODYzNDExNDQpKSArICAgICAgICAgICAgICAgIC8qIGM3K2M1K2MzLWMxICovCisJICAgIE1VTFRJUExZKHRtcDcsIEZJWCgwLjc3OTY1MzYyNSkpOyAgICAgICAgICAgICAgICAgLyogYzE1K2MxMy1jMTErYzkgKi8KKyAgICB0bXAxMSArPSB0bXAxNCArIHRtcDE1ICsgTVVMVElQTFkodG1wMSwgRklYKDAuMDcxODg4MDc0KSkgLyogYzktYzMtYzE1K2MxMSAqLworCSAgICAgLSBNVUxUSVBMWSh0bXA2LCBGSVgoMS42NjM5MDUxMTkpKTsgICAgICAgICAgICAgIC8qIGM3K2MxMytjMS1jNSAqLworICAgIHRtcDEyICs9IHRtcDE0ICsgdG1wMTYgLSBNVUxUSVBMWSh0bXAyLCBGSVgoMS4xMjU3MjYwNDgpKSAvKiBjNytjNStjMTUtYzMgKi8KKwkgICAgICsgTVVMVElQTFkodG1wNSwgRklYKDEuMjI3MzkxMTM4KSk7ICAgICAgICAgICAgICAvKiBjOS1jMTErYzEtYzEzICovCisgICAgdG1wMTMgKz0gdG1wMTUgKyB0bXAxNiArIE1VTFRJUExZKHRtcDMsIEZJWCgxLjA2NTM4ODk2MikpIC8qIGMxNStjMytjMTEtYzcgKi8KKwkgICAgICsgTVVMVElQTFkodG1wNCwgRklYKDIuMTY3OTg1NjkyKSk7ICAgICAgICAgICAgICAvKiBjMStjMTMrYzUtYzkgKi8KKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIGN0cisrOworCisgICAgaWYgKGN0ciAhPSBEQ1RTSVpFKSB7CisgICAgICBpZiAoY3RyID09IERDVFNJWkUgKiAyKQorCWJyZWFrOwkJCS8qIERvbmUuICovCisgICAgICBkYXRhcHRyICs9IERDVFNJWkU7CS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgIH0gZWxzZQorICAgICAgZGF0YXB0ciA9IHdvcmtzcGFjZTsJLyogc3dpdGNoIHBvaW50ZXIgdG8gZXh0ZW5kZWQgd29ya3NwYWNlICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvMTYpKioyID0gMS8yKioyLgorICAgKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyB3c3B0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyB3c3B0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyB3c3B0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyB3c3B0cltEQ1RTSVpFKjRdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqNF0gKyB3c3B0cltEQ1RTSVpFKjNdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqNV0gKyB3c3B0cltEQ1RTSVpFKjJdOworICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqNl0gKyB3c3B0cltEQ1RTSVpFKjFdOworICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqN10gKyB3c3B0cltEQ1RTSVpFKjBdOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNzsKKyAgICB0bXAxNCA9IHRtcDAgLSB0bXA3OworICAgIHRtcDExID0gdG1wMSArIHRtcDY7CisgICAgdG1wMTUgPSB0bXAxIC0gdG1wNjsKKyAgICB0bXAxMiA9IHRtcDIgKyB0bXA1OworICAgIHRtcDE2ID0gdG1wMiAtIHRtcDU7CisgICAgdG1wMTMgPSB0bXAzICsgdG1wNDsKKyAgICB0bXAxNyA9IHRtcDMgLSB0bXA0OworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIHdzcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIHdzcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIHdzcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSAtIHdzcHRyW0RDVFNJWkUqNF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSAtIHdzcHRyW0RDVFNJWkUqM107CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XSAtIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSo2XSAtIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSo3XSAtIHdzcHRyW0RDVFNJWkUqMF07CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyB0bXAxMSArIHRtcDEyICsgdG1wMTMsIFBBU1MxX0JJVFMrMik7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTMsIEZJWCgxLjMwNjU2Mjk2NSkpICsgLyogYzRbMTZdID0gYzJbOF0gKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMSAtIHRtcDEyLCBGSVhfMF81NDExOTYxMDApLCAgIC8qIGMxMlsxNl0gPSBjNls4XSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUysyKTsKKworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTcgLSB0bXAxNSwgRklYKDAuMjc1ODk5Mzc5KSkgKyAgIC8qIGMxNFsxNl0gPSBjN1s4XSAqLworCSAgICBNVUxUSVBMWSh0bXAxNCAtIHRtcDE2LCBGSVgoMS4zODcwMzk4NDUpKTsgICAgLyogYzJbMTZdID0gYzFbOF0gKi8KKworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDE1LCBGSVgoMS40NTE3NzQ5ODIpKSAgIC8qIGM2K2MxNCAqLworCSAgICAgICsgTVVMVElQTFkodG1wMTYsIEZJWCgyLjE3MjczNDgwNCkpLCAgICAgICAgLyogYzIrMTAgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMik7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwIC0gTVVMVElQTFkodG1wMTQsIEZJWCgwLjIxMTE2NDI0MykpICAgLyogYzItYzYgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDE3LCBGSVgoMS4wNjE1OTQzMzgpKSwgICAgICAgIC8qIGMxMCtjMTQgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMik7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDEuMzUzMzE4MDAxKSkgKyAgICAgICAgIC8qIGMzICovCisJICAgIE1VTFRJUExZKHRtcDYgLSB0bXA3LCBGSVgoMC40MTA1MjQ1MjgpKTsgICAgICAgICAgLyogYzEzICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDEuMjQ3MjI1MDEzKSkgKyAgICAgICAgIC8qIGM1ICovCisJICAgIE1VTFRJUExZKHRtcDUgKyB0bXA3LCBGSVgoMC42NjY2NTU2NTgpKTsgICAgICAgICAgLyogYzExICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgRklYKDEuMDkzMjAxODY3KSkgKyAgICAgICAgIC8qIGM3ICovCisJICAgIE1VTFRJUExZKHRtcDQgLSB0bXA3LCBGSVgoMC44OTcxNjc1ODYpKTsgICAgICAgICAgLyogYzkgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHRtcDEgKyB0bXAyLCBGSVgoMC4xMzg2MTcxNjkpKSArICAgICAgICAgLyogYzE1ICovCisJICAgIE1VTFRJUExZKHRtcDYgLSB0bXA1LCBGSVgoMS40MDc0MDM3MzgpKTsgICAgICAgICAgLyogYzEgKi8KKyAgICB0bXAxNSA9IE1VTFRJUExZKHRtcDEgKyB0bXAzLCAtIEZJWCgwLjY2NjY1NTY1OCkpICsgICAgICAgLyogLWMxMSAqLworCSAgICBNVUxUSVBMWSh0bXA0ICsgdG1wNiwgLSBGSVgoMS4yNDcyMjUwMTMpKTsgICAgICAgIC8qIC1jNSAqLworICAgIHRtcDE2ID0gTVVMVElQTFkodG1wMiArIHRtcDMsIC0gRklYKDEuMzUzMzE4MDAxKSkgKyAgICAgICAvKiAtYzMgKi8KKwkgICAgTVVMVElQTFkodG1wNSAtIHRtcDQsIEZJWCgwLjQxMDUyNDUyOCkpOyAgICAgICAgICAvKiBjMTMgKi8KKyAgICB0bXAxMCA9IHRtcDExICsgdG1wMTIgKyB0bXAxMyAtCisJICAgIE1VTFRJUExZKHRtcDAsIEZJWCgyLjI4NjM0MTE0NCkpICsgICAgICAgICAgICAgICAgLyogYzcrYzUrYzMtYzEgKi8KKwkgICAgTVVMVElQTFkodG1wNywgRklYKDAuNzc5NjUzNjI1KSk7ICAgICAgICAgICAgICAgICAvKiBjMTUrYzEzLWMxMStjOSAqLworICAgIHRtcDExICs9IHRtcDE0ICsgdG1wMTUgKyBNVUxUSVBMWSh0bXAxLCBGSVgoMC4wNzE4ODgwNzQpKSAvKiBjOS1jMy1jMTUrYzExICovCisJICAgICAtIE1VTFRJUExZKHRtcDYsIEZJWCgxLjY2MzkwNTExOSkpOyAgICAgICAgICAgICAgLyogYzcrYzEzK2MxLWM1ICovCisgICAgdG1wMTIgKz0gdG1wMTQgKyB0bXAxNiAtIE1VTFRJUExZKHRtcDIsIEZJWCgxLjEyNTcyNjA0OCkpIC8qIGM3K2M1K2MxNS1jMyAqLworCSAgICAgKyBNVUxUSVBMWSh0bXA1LCBGSVgoMS4yMjczOTExMzgpKTsgICAgICAgICAgICAgIC8qIGM5LWMxMStjMS1jMTMgKi8KKyAgICB0bXAxMyArPSB0bXAxNSArIHRtcDE2ICsgTVVMVElQTFkodG1wMywgRklYKDEuMDY1Mzg4OTYyKSkgLyogYzE1K2MzK2MxMS1jNyAqLworCSAgICAgKyBNVUxUSVBMWSh0bXA0LCBGSVgoMi4xNjc5ODU2OTIpKTsgICAgICAgICAgICAgIC8qIGMxK2MxMytjNS1jOSAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAsIENPTlNUX0JJVFMrUEFTUzFfQklUUysyKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMSwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzIpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMik7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTMsIENPTlNUX0JJVFMrUEFTUzFfQklUUysyKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICB3c3B0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgMTZ4OCBzYW1wbGUgYmxvY2suCisgKgorICogMTYtcG9pbnQgRkRDVCBpbiBwYXNzIDEgKHJvd3MpLCA4LXBvaW50IGluIHBhc3MgMiAoY29sdW1ucykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfMTZ4OCAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCB0bXAxNiwgdG1wMTc7CisgIElOVDMyIHoxOworICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworICAvKiAxNi1wb2ludCBGRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMzIpLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzE1XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTRdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxM10pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzEyXSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTFdKTsKKyAgICB0bXA1ID0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMF0pOworICAgIHRtcDYgPSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzldKTsKKyAgICB0bXA3ID0gR0VUSlNBTVBMRShlbGVtcHRyWzddKSArIEdFVEpTQU1QTEUoZWxlbXB0cls4XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA3OworICAgIHRtcDE0ID0gdG1wMCAtIHRtcDc7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wNjsKKyAgICB0bXAxNSA9IHRtcDEgLSB0bXA2OworICAgIHRtcDEyID0gdG1wMiArIHRtcDU7CisgICAgdG1wMTYgPSB0bXAyIC0gdG1wNTsKKyAgICB0bXAxMyA9IHRtcDMgKyB0bXA0OworICAgIHRtcDE3ID0gdG1wMyAtIHRtcDQ7CisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxNV0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzE0XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTNdKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxMl0pOworICAgIHRtcDQgPSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzExXSk7CisgICAgdG1wNSA9IEdFVEpTQU1QTEUoZWxlbXB0cls1XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTBdKTsKKyAgICB0bXA2ID0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls5XSk7CisgICAgdG1wNyA9IEdFVEpTQU1QTEUoZWxlbXB0cls3XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOF0pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAxMCArIHRtcDExICsgdG1wMTIgKyB0bXAxMyAtIDE2ICogQ0VOVEVSSlNBTVBMRSkgPDwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDEzLCBGSVgoMS4zMDY1NjI5NjUpKSArIC8qIGM0WzE2XSA9IGMyWzhdICovCisJICAgICAgTVVMVElQTFkodG1wMTEgLSB0bXAxMiwgRklYXzBfNTQxMTk2MTAwKSwgICAvKiBjMTJbMTZdID0gYzZbOF0gKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxNyAtIHRtcDE1LCBGSVgoMC4yNzU4OTkzNzkpKSArICAgLyogYzE0WzE2XSA9IGM3WzhdICovCisJICAgIE1VTFRJUExZKHRtcDE0IC0gdG1wMTYsIEZJWCgxLjM4NzAzOTg0NSkpOyAgICAvKiBjMlsxNl0gPSBjMVs4XSAqLworCisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDE1LCBGSVgoMS40NTE3NzQ5ODIpKSAgIC8qIGM2K2MxNCAqLworCSAgICAgICsgTVVMVElQTFkodG1wMTYsIEZJWCgyLjE3MjczNDgwNCkpLCAgICAgICAgLyogYzIrYzEwICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwIC0gTVVMVElQTFkodG1wMTQsIEZJWCgwLjIxMTE2NDI0MykpICAgLyogYzItYzYgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDE3LCBGSVgoMS4wNjE1OTQzMzgpKSwgICAgICAgIC8qIGMxMCtjMTQgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDExID0gTVVMVElQTFkodG1wMCArIHRtcDEsIEZJWCgxLjM1MzMxODAwMSkpICsgICAgICAgICAvKiBjMyAqLworCSAgICBNVUxUSVBMWSh0bXA2IC0gdG1wNywgRklYKDAuNDEwNTI0NTI4KSk7ICAgICAgICAgIC8qIGMxMyAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMCArIHRtcDIsIEZJWCgxLjI0NzIyNTAxMykpICsgICAgICAgICAvKiBjNSAqLworCSAgICBNVUxUSVBMWSh0bXA1ICsgdG1wNywgRklYKDAuNjY2NjU1NjU4KSk7ICAgICAgICAgIC8qIGMxMSAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMCArIHRtcDMsIEZJWCgxLjA5MzIwMTg2NykpICsgICAgICAgICAvKiBjNyAqLworCSAgICBNVUxUSVBMWSh0bXA0IC0gdG1wNywgRklYKDAuODk3MTY3NTg2KSk7ICAgICAgICAgIC8qIGM5ICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh0bXAxICsgdG1wMiwgRklYKDAuMTM4NjE3MTY5KSkgKyAgICAgICAgIC8qIGMxNSAqLworCSAgICBNVUxUSVBMWSh0bXA2IC0gdG1wNSwgRklYKDEuNDA3NDAzNzM4KSk7ICAgICAgICAgIC8qIGMxICovCisgICAgdG1wMTUgPSBNVUxUSVBMWSh0bXAxICsgdG1wMywgLSBGSVgoMC42NjY2NTU2NTgpKSArICAgICAgIC8qIC1jMTEgKi8KKwkgICAgTVVMVElQTFkodG1wNCArIHRtcDYsIC0gRklYKDEuMjQ3MjI1MDEzKSk7ICAgICAgICAvKiAtYzUgKi8KKyAgICB0bXAxNiA9IE1VTFRJUExZKHRtcDIgKyB0bXAzLCAtIEZJWCgxLjM1MzMxODAwMSkpICsgICAgICAgLyogLWMzICovCisJICAgIE1VTFRJUExZKHRtcDUgLSB0bXA0LCBGSVgoMC40MTA1MjQ1MjgpKTsgICAgICAgICAgLyogYzEzICovCisgICAgdG1wMTAgPSB0bXAxMSArIHRtcDEyICsgdG1wMTMgLQorCSAgICBNVUxUSVBMWSh0bXAwLCBGSVgoMi4yODYzNDExNDQpKSArICAgICAgICAgICAgICAgIC8qIGM3K2M1K2MzLWMxICovCisJICAgIE1VTFRJUExZKHRtcDcsIEZJWCgwLjc3OTY1MzYyNSkpOyAgICAgICAgICAgICAgICAgLyogYzE1K2MxMy1jMTErYzkgKi8KKyAgICB0bXAxMSArPSB0bXAxNCArIHRtcDE1ICsgTVVMVElQTFkodG1wMSwgRklYKDAuMDcxODg4MDc0KSkgLyogYzktYzMtYzE1K2MxMSAqLworCSAgICAgLSBNVUxUSVBMWSh0bXA2LCBGSVgoMS42NjM5MDUxMTkpKTsgICAgICAgICAgICAgIC8qIGM3K2MxMytjMS1jNSAqLworICAgIHRtcDEyICs9IHRtcDE0ICsgdG1wMTYgLSBNVUxUSVBMWSh0bXAyLCBGSVgoMS4xMjU3MjYwNDgpKSAvKiBjNytjNStjMTUtYzMgKi8KKwkgICAgICsgTVVMVElQTFkodG1wNSwgRklYKDEuMjI3MzkxMTM4KSk7ICAgICAgICAgICAgICAvKiBjOS1jMTErYzEtYzEzICovCisgICAgdG1wMTMgKz0gdG1wMTUgKyB0bXAxNiArIE1VTFRJUExZKHRtcDMsIEZJWCgxLjA2NTM4ODk2MikpIC8qIGMxNStjMytjMTEtYzcgKi8KKwkgICAgICsgTVVMVElQTFkodG1wNCwgRklYKDIuMTY3OTg1NjkyKSk7ICAgICAgICAgICAgICAvKiBjMStjMTMrYzUtYzkgKi8KKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIHJlbW92ZSB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLCBidXQgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwCisgICAqIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5IDgvMTYgPSAxLzIuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgLyogRXZlbiBwYXJ0IHBlciBMTCZNIGZpZ3VyZSAxIC0tLSBub3RlIHRoYXQgcHVibGlzaGVkIGZpZ3VyZSBpcyBmYXVsdHk7CisgICAgICogcm90YXRvciAic3FydCgyKSpjMSIgc2hvdWxkIGJlICJzcXJ0KDIpKmM2Ii4KKyAgICAgKi8KKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDEgLSB0bXAyOworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwICsgdG1wMTEsIFBBU1MxX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAgLSB0bXAxMSwgUEFTUzFfQklUUysxKTsKKworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCBGSVhfMF83NjUzNjY4NjUpLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgLSBNVUxUSVBMWSh0bXAxMywgRklYXzFfODQ3NzU5MDY1KSwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgorICAgICAqIDgtcG9pbnQgRkRDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzE2KS4KKyAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXAwLi50bXAzIGhlcmUuCisgICAgICovCisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzFfMTc1ODc1NjAyKTsgLyogIGMzICovCisKKyAgICB0bXAwICA9IE1VTFRJUExZKHRtcDAsICAgIEZJWF8xXzUwMTMyMTExMCk7ICAgIC8qICBjMStjMy1jNS1jNyAqLworICAgIHRtcDEgID0gTVVMVElQTFkodG1wMSwgICAgRklYXzNfMDcyNzExMDI2KTsgICAgLyogIGMxK2MzK2M1LWM3ICovCisgICAgdG1wMiAgPSBNVUxUSVBMWSh0bXAyLCAgICBGSVhfMl8wNTMxMTk4NjkpOyAgICAvKiAgYzErYzMtYzUrYzcgKi8KKyAgICB0bXAzICA9IE1VTFRJUExZKHRtcDMsICAgIEZJWF8wXzI5ODYzMTMzNik7ICAgIC8qIC1jMStjMytjNS1jNyAqLworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIC0gRklYXzBfODk5OTc2MjIzKTsgICAgLyogIGM3LWMzICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAxMSwgLSBGSVhfMl81NjI5MTU0NDcpOyAgICAvKiAtYzEtYzMgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEyLCAtIEZJWF8wXzM5MDE4MDY0NCk7ICAgIC8qICBjNS1jMyAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMTMsIC0gRklYXzFfOTYxNTcwNTYwKTsgICAgLyogLWMzLWM1ICovCisKKyAgICB0bXAxMiArPSB6MTsKKyAgICB0bXAxMyArPSB6MTsKKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDAgKyB0bXAxMCArIHRtcDEyLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMSArIHRtcDExICsgdG1wMTMsCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAyICsgdG1wMTEgKyB0bXAxMiwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDMgKyB0bXAxMCArIHRtcDEzLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gYSAxNHg3IHNhbXBsZSBibG9jay4KKyAqCisgKiAxNC1wb2ludCBGRENUIGluIHBhc3MgMSAocm93cyksIDctcG9pbnQgaW4gcGFzcyAyIChjb2x1bW5zKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF8xNHg3IChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDY7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUsIHRtcDE2OworICBJTlQzMiB6MSwgejIsIHozOworICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFplcm8gYm90dG9tIHJvdyBvZiBvdXRwdXQgY29lZmZpY2llbnQgYmxvY2suICovCisgIE1FTVpFUk8oJmRhdGFbRENUU0laRSo3XSwgU0laRU9GKERDVEVMRU0pICogRENUU0laRSk7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisgIC8qIDE0LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yOCkuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNzsgY3RyKyspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMTNdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMl0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzExXSk7CisgICAgdG1wMTMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzEwXSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDUgPSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXA2ID0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA2OworICAgIHRtcDE0ID0gdG1wMCAtIHRtcDY7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wNTsKKyAgICB0bXAxNSA9IHRtcDEgLSB0bXA1OworICAgIHRtcDEyID0gdG1wMiArIHRtcDQ7CisgICAgdG1wMTYgPSB0bXAyIC0gdG1wNDsKKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzEzXSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMTJdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxMV0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzEwXSk7CisgICAgdG1wNCA9IEdFVEpTQU1QTEUoZWxlbXB0cls0XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDUgPSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXA2ID0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisKKyAgICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pCisgICAgICAoKHRtcDEwICsgdG1wMTEgKyB0bXAxMiArIHRtcDEzIC0gMTQgKiBDRU5URVJKU0FNUExFKSA8PCBQQVNTMV9CSVRTKTsKKyAgICB0bXAxMyArPSB0bXAxMzsKKyAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTMsIEZJWCgxLjI3NDE2MjM5MikpICsgLyogYzQgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMSAtIHRtcDEzLCBGSVgoMC4zMTQ2OTIxMjMpKSAtIC8qIGMxMiAqLworCSAgICAgIE1VTFRJUExZKHRtcDEyIC0gdG1wMTMsIEZJWCgwLjg4MTc0NzczNCkpLCAgLyogYzggKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxNCArIHRtcDE1LCBGSVgoMS4xMDU2NzY2ODYpKTsgICAgLyogYzYgKi8KKworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyBNVUxUSVBMWSh0bXAxNCwgRklYKDAuMjczMDc5NTkwKSkgICAvKiBjMi1jNiAqLworCSAgICAgICsgTVVMVElQTFkodG1wMTYsIEZJWCgwLjYxMzYwNDI2OCkpLCAgICAgICAgLyogYzEwICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwIC0gTVVMVElQTFkodG1wMTUsIEZJWCgxLjcxOTI4MDk1NCkpICAgLyogYzYrYzEwICovCisJICAgICAgLSBNVUxUSVBMWSh0bXAxNiwgRklYKDEuMzc4NzU2Mjc2KSksICAgICAgICAvKiBjMiAqLworCSAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMSA9IHRtcDUgLSB0bXA0OworICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgKCh0bXAwIC0gdG1wMTAgKyB0bXAzIC0gdG1wMTEgLSB0bXA2KSA8PCBQQVNTMV9CSVRTKTsKKyAgICB0bXAzIDw8PSBDT05TVF9CSVRTOworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIC0gRklYKDAuMTU4MzQxNjgxKSk7ICAgICAgICAgIC8qIC1jMTMgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCBGSVgoMS40MDUzMjEyODQpKTsgICAgICAgICAgICAvKiBjMSAqLworICAgIHRtcDEwICs9IHRtcDExIC0gdG1wMzsKKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDAgKyB0bXAyLCBGSVgoMS4xOTc0NDg4NDYpKSArICAgICAvKiBjNSAqLworCSAgICBNVUxUSVBMWSh0bXA0ICsgdG1wNiwgRklYKDAuNzUyNDA2OTc4KSk7ICAgICAgLyogYzkgKi8KKyAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgdG1wMTEgLSBNVUxUSVBMWSh0bXAyLCBGSVgoMi4zNzM5NTk3NzMpKSAvKiBjMytjNS1jMTMgKi8KKwkgICAgICArIE1VTFRJUExZKHRtcDQsIEZJWCgxLjExOTk5OTQzNSkpLCAgICAgICAgIC8qIGMxK2MxMS1jOSAqLworCSAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDEuMzM0ODUyNjA3KSkgKyAgICAgLyogYzMgKi8KKwkgICAgTVVMVElQTFkodG1wNSAtIHRtcDYsIEZJWCgwLjQ2NzA4NTEyOSkpOyAgICAgIC8qIGMxMSAqLworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyB0bXAxMiAtIE1VTFRJUExZKHRtcDEsIEZJWCgwLjQyNDEwMzk0OCkpIC8qIGMzLWM5LWMxMyAqLworCSAgICAgIC0gTVVMVElQTFkodG1wNSwgRklYKDMuMDY5ODU1MjU5KSksICAgICAgICAgLyogYzErYzUrYzExICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDExICsgdG1wMTIgKyB0bXAzICsgdG1wNiAtCisJICAgICAgTVVMVElQTFkodG1wMCArIHRtcDYsIEZJWCgxLjEyNjk4MDE2OSkpLCAgICAvKiBjMytjNS1jMSAqLworCSAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8xNCkqKDgvNykgPSAzMi80OSwgd2hpY2ggd2UKKyAgICogcGFydGlhbGx5IGZvbGQgaW50byB0aGUgY29uc3RhbnQgbXVsdGlwbGllcnMgYW5kIGZpbmFsIHNoaWZ0aW5nOgorICAgKiA3LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNCkgKiA2NC80OS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM107CisKKyAgICB0bXAxMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAxMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAxMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKworICAgIHoxID0gdG1wMCArIHRtcDI7CisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHoxICsgdG1wMSArIHRtcDMsIEZJWCgxLjMwNjEyMjQ0OSkpLCAvKiA2NC80OSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUysxKTsKKyAgICB0bXAzICs9IHRtcDM7CisgICAgejEgLT0gdG1wMzsKKyAgICB6MSAtPSB0bXAzOworICAgIHoxID0gTVVMVElQTFkoejEsIEZJWCgwLjQ2MTc4NDAyMCkpOyAgICAgICAgICAgICAgICAvKiAoYzIrYzYtYzQpLzIgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDAgLSB0bXAyLCBGSVgoMS4yMDI0MjgwODQpKTsgICAgICAgLyogKGMyK2M0LWM2KS8yICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMiwgRklYKDAuNDExMDI2NDQ2KSk7ICAgICAgIC8qIGM2ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyB6MiArIHozLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisgICAgejEgLT0gejI7CisgICAgejIgPSBNVUxUSVBMWSh0bXAwIC0gdG1wMSwgRklYKDEuMTUxNjcwNTA5KSk7ICAgICAgIC8qIGM0ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHoyICsgejMgLSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYKDAuOTIzNTY4MDQxKSksIC8qIGMyK2M2LWM0ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgejIsIENPTlNUX0JJVFMrUEFTUzFfQklUUysxKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYKDEuMjIxNzY1Njc3KSk7ICAgLyogKGMzK2MxLWM1KS8yICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTEsIEZJWCgwLjIyMjM4MzQ2NCkpOyAgIC8qIChjMytjNS1jMSkvMiAqLworICAgIHRtcDAgPSB0bXAxIC0gdG1wMjsKKyAgICB0bXAxICs9IHRtcDI7CisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDExICsgdG1wMTIsIC0gRklYKDEuODAwODI0NTIzKSk7IC8qIC1jMSAqLworICAgIHRtcDEgKz0gdG1wMjsKKyAgICB0bXAzID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMiwgRklYKDAuODAxNDQyMzEwKSk7ICAgLyogYzUgKi8KKyAgICB0bXAwICs9IHRtcDM7CisgICAgdG1wMiArPSB0bXAzICsgTVVMVElQTFkodG1wMTIsIEZJWCgyLjQ0MzUzMTM1NSkpOyAgIC8qIGMzK2MxLWM1ICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAwLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMSwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDIsIENPTlNUX0JJVFMrUEFTUzFfQklUUysxKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDEyeDYgc2FtcGxlIGJsb2NrLgorICoKKyAqIDEyLXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgNi1wb2ludCBpbiBwYXNzIDIgKGNvbHVtbnMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzEyeDYgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBaZXJvIDIgYm90dG9tIHJvd3Mgb2Ygb3V0cHV0IGNvZWZmaWNpZW50IGJsb2NrLiAqLworICBNRU1aRVJPKCZkYXRhW0RDVFNJWkUqNl0sIFNJWkVPRihEQ1RFTEVNKSAqIERDVFNJWkUgKiAyKTsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKyAgLyogMTItcG9pbnQgRkRDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzI0KS4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA2OyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsxMV0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzEwXSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXA0ID0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wNSA9IEdFVEpTQU1QTEUoZWxlbXB0cls1XSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNTsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXA1OworICAgIHRtcDExID0gdG1wMSArIHRtcDQ7CisgICAgdG1wMTQgPSB0bXAxIC0gdG1wNDsKKyAgICB0bXAxMiA9IHRtcDIgKyB0bXAzOworICAgIHRtcDE1ID0gdG1wMiAtIHRtcDM7CisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsxMV0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzEwXSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXA0ID0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wNSA9IEdFVEpTQU1QTEUoZWxlbXB0cls1XSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAxMCArIHRtcDExICsgdG1wMTIgLSAxMiAqIENFTlRFUkpTQU1QTEUpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkgKCh0bXAxMyAtIHRtcDE0IC0gdG1wMTUpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYKDEuMjI0NzQ0ODcxKSksIC8qIGM0ICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDE0IC0gdG1wMTUgKyBNVUxUSVBMWSh0bXAxMyArIHRtcDE1LCBGSVgoMS4zNjYwMjU0MDQpKSwgLyogYzIgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMSArIHRtcDQsIEZJWF8wXzU0MTE5NjEwMCk7ICAgIC8qIGM5ICovCisgICAgdG1wMTQgPSB0bXAxMCArIE1VTFRJUExZKHRtcDEsIEZJWF8wXzc2NTM2Njg2NSk7ICAgLyogYzMtYzkgKi8KKyAgICB0bXAxNSA9IHRtcDEwIC0gTVVMVElQTFkodG1wNCwgRklYXzFfODQ3NzU5MDY1KTsgICAvKiBjMytjOSAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMCArIHRtcDIsIEZJWCgxLjEyMTk3MTA1NCkpOyAgIC8qIGM1ICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgRklYKDAuODYwOTE4NjY5KSk7ICAgLyogYzcgKi8KKyAgICB0bXAxMCA9IHRtcDEyICsgdG1wMTMgKyB0bXAxNCAtIE1VTFRJUExZKHRtcDAsIEZJWCgwLjU4MDc3NDk1MykpIC8qIGM1K2M3LWMxICovCisJICAgICsgTVVMVElQTFkodG1wNSwgRklYKDAuMTg0NTkxOTExKSk7ICAgICAgICAvKiBjMTEgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDIgKyB0bXAzLCAtIEZJWCgwLjE4NDU5MTkxMSkpOyAvKiAtYzExICovCisgICAgdG1wMTIgKz0gdG1wMTEgLSB0bXAxNSAtIE1VTFRJUExZKHRtcDIsIEZJWCgyLjMzOTQ5MzkxMikpIC8qIGMxK2M1LWMxMSAqLworCSAgICArIE1VTFRJUExZKHRtcDUsIEZJWCgwLjg2MDkxODY2OSkpOyAgICAgICAgLyogYzcgKi8KKyAgICB0bXAxMyArPSB0bXAxMSAtIHRtcDE0ICsgTVVMVElQTFkodG1wMywgRklYKDAuNzI1Nzg4MDExKSkgLyogYzErYzExLWM3ICovCisJICAgIC0gTVVMVElQTFkodG1wNSwgRklYKDEuMTIxOTcxMDU0KSk7ICAgICAgICAvKiBjNSAqLworICAgIHRtcDExID0gdG1wMTUgKyBNVUxUSVBMWSh0bXAwIC0gdG1wMywgRklYKDEuMzA2NTYyOTY1KSkgLyogYzMgKi8KKwkgICAgLSBNVUxUSVBMWSh0bXAyICsgdG1wNSwgRklYXzBfNTQxMTk2MTAwKTsgIC8qIGM5ICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8xMikqKDgvNikgPSA4LzksIHdoaWNoIHdlCisgICAqIHBhcnRpYWxseSBmb2xkIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzIGFuZCBmaW5hbCBzaGlmdGluZzoKKyAgICogNi1wb2ludCBGRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTIpICogMTYvOS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMTEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSozXTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAwIC0gdG1wMjsKKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjNdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwICsgdG1wMTEsIEZJWCgxLjc3Nzc3Nzc3OCkpLCAgICAgICAgIC8qIDE2LzkgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEyLCBGSVgoMi4xNzczMjQyMTYpKSwgICAgICAgICAgICAgICAgIC8qIGMyICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDExIC0gdG1wMTEsIEZJWCgxLjI1NzA3ODcyMikpLCAvKiBjNCAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUysxKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDAgKyB0bXAyLCBGSVgoMC42NTA3MTE4MjkpKTsgICAgICAgICAgICAgLyogYzUgKi8KKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDAgKyB0bXAxLCBGSVgoMS43Nzc3Nzc3NzgpKSwgICAvKiAxNi85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAwIC0gdG1wMSAtIHRtcDIsIEZJWCgxLjc3Nzc3Nzc3OCkpLCAgICAvKiAxNi85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDIgLSB0bXAxLCBGSVgoMS43Nzc3Nzc3NzgpKSwgICAvKiAxNi85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgMTB4NSBzYW1wbGUgYmxvY2suCisgKgorICogMTAtcG9pbnQgRkRDVCBpbiBwYXNzIDEgKHJvd3MpLCA1LXBvaW50IGluIHBhc3MgMiAoY29sdW1ucykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfMTB4NSAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQ7CisgIERDVEVMRU0gKmRhdGFwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogWmVybyAzIGJvdHRvbSByb3dzIG9mIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTygmZGF0YVtEQ1RTSVpFKjVdLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFICogMyk7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisgIC8qIDEwLXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yMCkuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNTsgY3RyKyspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXAxMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pICsgR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKyAgICB0bXA0ID0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA0OworICAgIHRtcDEzID0gdG1wMCAtIHRtcDQ7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMzsKKyAgICB0bXAxNCA9IHRtcDEgLSB0bXAzOworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbOV0pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzhdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wMyA9IEdFVEpTQU1QTEUoZWxlbXB0clszXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDQgPSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICgodG1wMTAgKyB0bXAxMSArIHRtcDEyIC0gMTAgKiBDRU5URVJKU0FNUExFKSA8PCBQQVNTMV9CSVRTKTsKKyAgICB0bXAxMiArPSB0bXAxMjsKKyAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWCgxLjE0NDEyMjgwNikpIC0gLyogYzQgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMSAtIHRtcDEyLCBGSVgoMC40MzcwMTYwMjQpKSwgIC8qIGM4ICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEzICsgdG1wMTQsIEZJWCgwLjgzMTI1Mzg3NikpOyAgICAvKiBjNiAqLworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyBNVUxUSVBMWSh0bXAxMywgRklYKDAuNTEzNzQzMTQ4KSksICAvKiBjMi1jNiAqLworCSAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls2XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCAtIE1VTFRJUExZKHRtcDE0LCBGSVgoMi4xNzYyNTA4OTkpKSwgIC8qIGMyK2M2ICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA0OworICAgIHRtcDExID0gdG1wMSAtIHRtcDM7CisgICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSAoKHRtcDEwIC0gdG1wMTEgLSB0bXAyKSA8PCBQQVNTMV9CSVRTKTsKKyAgICB0bXAyIDw8PSBDT05TVF9CSVRTOworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMCwgRklYKDEuMzk2ODAyMjQ3KSkgKyAgICAgICAgICAvKiBjMSAqLworCSAgICAgIE1VTFRJUExZKHRtcDEsIEZJWCgxLjI2MDA3MzUxMSkpICsgdG1wMiArICAgLyogYzMgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAzLCBGSVgoMC42NDIwMzk1MjIpKSArICAgICAgICAgIC8qIGM3ICovCisJICAgICAgTVVMVElQTFkodG1wNCwgRklYKDAuMjIxMjMxNzQyKSksICAgICAgICAgICAvKiBjOSAqLworCSAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAwIC0gdG1wNCwgRklYKDAuOTUxMDU2NTE2KSkgLSAgICAgLyogKGMzK2M3KS8yICovCisJICAgIE1VTFRJUExZKHRtcDEgKyB0bXAzLCBGSVgoMC41ODc3ODUyNTIpKTsgICAgICAvKiAoYzEtYzkpLzIgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHRtcDEwICsgdG1wMTEsIEZJWCgwLjMwOTAxNjk5NCkpICsgICAvKiAoYzMtYzcpLzIgKi8KKwkgICAgKHRtcDExIDw8IChDT05TVF9CSVRTIC0gMSkpIC0gdG1wMjsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTIgKyB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTIgLSB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIHJlbW92ZSB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLCBidXQgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwCisgICAqIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5ICg4LzEwKSooOC81KSA9IDMyLzI1LCB3aGljaCB3ZQorICAgKiBmb2xkIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzOgorICAgKiA1LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xMCkgKiAzMi8yNS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSozXTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMTsKKyAgICB0bXAxMSA9IHRtcDAgLSB0bXAxOworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjNdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwICsgdG1wMiwgRklYKDEuMjgpKSwgICAgICAgIC8qIDMyLzI1ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCBGSVgoMS4wMTE5Mjg4NTEpKTsgICAgICAgICAgLyogKGMyK2M0KS8yICovCisgICAgdG1wMTAgLT0gdG1wMiA8PCAyOworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIEZJWCgwLjQ1MjU0ODM0MCkpOyAgICAgICAgICAvKiAoYzItYzQpLzIgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMSArIHRtcDEwLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDExIC0gdG1wMTAsIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDEuMDY0MDA0OTYxKSk7ICAgIC8qIGMzICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyBNVUxUSVBMWSh0bXAwLCBGSVgoMC42NTc1OTEyMzApKSwgLyogYzEtYzMgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCAtIE1VTFRJUExZKHRtcDEsIEZJWCgyLjc4NTYwMTE1MSkpLCAvKiBjMStjMyAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gYW4gOHg0IHNhbXBsZSBibG9jay4KKyAqCisgKiA4LXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgNC1wb2ludCBpbiBwYXNzIDIgKGNvbHVtbnMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0Xzh4NCAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejE7CisgIERDVEVMRU0gKmRhdGFwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogWmVybyA0IGJvdHRvbSByb3dzIG9mIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTygmZGF0YVtEQ1RTSVpFKjRdLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFICogNCk7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisgIC8qIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5IDgvNCA9IDIsIHdoaWNoIHdlIGFkZCBoZXJlLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKKyAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgorICAgICAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisgICAgdG1wMyA9IEdFVEpTQU1QTEUoZWxlbXB0clszXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMiA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAxIC0gdG1wMjsKKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzddKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls2XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzRdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICgodG1wMTAgKyB0bXAxMSAtIDggKiBDRU5URVJKU0FNUExFKSA8PCAoUEFTUzFfQklUUysxKSk7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSAoKHRtcDEwIC0gdG1wMTEpIDw8IChQQVNTMV9CSVRTKzEpKTsKKworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejEgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMik7CisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBSSUdIVF9TSElGVCh6MSArIE1VTFRJUExZKHRtcDEyLCBGSVhfMF83NjUzNjY4NjUpLAorCQkJCSAgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisgICAgZGF0YXB0cls2XSA9IChEQ1RFTEVNKSBSSUdIVF9TSElGVCh6MSAtIE1VTFRJUExZKHRtcDEzLCBGSVhfMV84NDc3NTkwNjUpLAorCQkJCSAgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCisgICAgICogOC1wb2ludCBGRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDAuLnRtcDMgaGVyZS4KKyAgICAgKi8KKworICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEzID0gdG1wMSArIHRtcDM7CisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMV8xNzU4NzU2MDIpOyAvKiAgYzMgKi8KKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejEgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMik7CisKKyAgICB0bXAwICA9IE1VTFRJUExZKHRtcDAsICAgIEZJWF8xXzUwMTMyMTExMCk7ICAgIC8qICBjMStjMy1jNS1jNyAqLworICAgIHRtcDEgID0gTVVMVElQTFkodG1wMSwgICAgRklYXzNfMDcyNzExMDI2KTsgICAgLyogIGMxK2MzK2M1LWM3ICovCisgICAgdG1wMiAgPSBNVUxUSVBMWSh0bXAyLCAgICBGSVhfMl8wNTMxMTk4NjkpOyAgICAvKiAgYzErYzMtYzUrYzcgKi8KKyAgICB0bXAzICA9IE1VTFRJUExZKHRtcDMsICAgIEZJWF8wXzI5ODYzMTMzNik7ICAgIC8qIC1jMStjMytjNS1jNyAqLworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIC0gRklYXzBfODk5OTc2MjIzKTsgICAgLyogIGM3LWMzICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAxMSwgLSBGSVhfMl81NjI5MTU0NDcpOyAgICAvKiAtYzEtYzMgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEyLCAtIEZJWF8wXzM5MDE4MDY0NCk7ICAgIC8qICBjNS1jMyAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMTMsIC0gRklYXzFfOTYxNTcwNTYwKTsgICAgLyogLWMzLWM1ICovCisKKyAgICB0bXAxMiArPSB6MTsKKyAgICB0bXAxMyArPSB6MTsKKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkKKyAgICAgIFJJR0hUX1NISUZUKHRtcDAgKyB0bXAxMCArIHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQodG1wMSArIHRtcDExICsgdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUy0xKTsKKyAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAyICsgdG1wMTEgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkKKyAgICAgIFJJR0hUX1NISUZUKHRtcDMgKyB0bXAxMCArIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiA0LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNikuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSozXSArIChPTkUgPDwgKFBBU1MxX0JJVFMtMSkpOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqMl07CisKKyAgICB0bXAxMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSozXTsKKyAgICB0bXAxMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSoyXTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKSBSSUdIVF9TSElGVCh0bXAwICsgdG1wMSwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIFJJR0hUX1NISUZUKHRtcDAgLSB0bXAxLCBQQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYXzBfNTQxMTk2MTAwKTsgICAvKiBjNiAqLworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUytQQVNTMV9CSVRTLTEpOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwICsgTVVMVElQTFkodG1wMTAsIEZJWF8wXzc2NTM2Njg2NSksIC8qIGMyLWM2ICovCisJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkKKyAgICAgIFJJR0hUX1NISUZUKHRtcDAgLSBNVUxUSVBMWSh0bXAxMSwgRklYXzFfODQ3NzU5MDY1KSwgLyogYzIrYzYgKi8KKwkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgNngzIHNhbXBsZSBibG9jay4KKyAqCisgKiA2LXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgMy1wb2ludCBpbiBwYXNzIDIgKGNvbHVtbnMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzZ4MyAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyOworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyOworICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFByZS16ZXJvIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTyhkYXRhLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFMik7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisgIC8qIFdlIHNjYWxlIHRoZSByZXN1bHRzIGZ1cnRoZXIgYnkgMiBhcyBwYXJ0IG9mIG91dHB1dCBhZGFwdGlvbiAqLworICAvKiBzY2FsaW5nIGZvciBkaWZmZXJlbnQgRENUIHNpemUuICovCisgIC8qIDYtcG9pbnQgRkRDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzEyKS4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAzOyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisgICAgdG1wMTEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzRdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSArIEdFVEpTQU1QTEUoZWxlbXB0clszXSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICgodG1wMTAgKyB0bXAxMSAtIDYgKiBDRU5URVJKU0FNUExFKSA8PCAoUEFTUzFfQklUUysxKSk7CisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMiwgRklYKDEuMjI0NzQ0ODcxKSksICAgICAgICAgICAgICAgICAvKiBjMiAqLworCSAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUy0xKTsKKyAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTEgLSB0bXAxMSwgRklYKDAuNzA3MTA2NzgxKSksIC8qIGM0ICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gREVTQ0FMRShNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDAuMzY2MDI1NDA0KSksICAgICAvKiBjNSAqLworCQkgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKSAodG1wMTAgKyAoKHRtcDAgKyB0bXAxKSA8PCAoUEFTUzFfQklUUysxKSkpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgKCh0bXAwIC0gdG1wMSAtIHRtcDIpIDw8IChQQVNTMV9CSVRTKzEpKTsKKyAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pICh0bXAxMCArICgodG1wMiAtIHRtcDEpIDw8IChQQVNTMV9CSVRTKzEpKSk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC82KSooOC8zKSA9IDMyLzksIHdoaWNoIHdlIHBhcnRpYWxseQorICAgKiBmb2xkIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzIChvdGhlciBwYXJ0IHdhcyBkb25lIGluIHBhc3MgMSk6CisgICAqIDMtcG9pbnQgRkRDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzYpICogMTYvOS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNjsgY3RyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqMl07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXTsKKworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqMl07CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMCArIHRtcDEsIEZJWCgxLjc3Nzc3Nzc3OCkpLCAgICAgICAgLyogMTYvOSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgLSB0bXAxIC0gdG1wMSwgRklYKDEuMjU3MDc4NzIyKSksIC8qIGMyICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMiwgRklYKDIuMTc3MzI0MjE2KSksICAgICAgICAgICAgICAgLyogYzEgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgNHgyIHNhbXBsZSBibG9jay4KKyAqCisgKiA0LXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgMi1wb2ludCBpbiBwYXNzIDIgKGNvbHVtbnMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzR4MiAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxOworICBJTlQzMiB0bXAxMCwgdG1wMTE7CisgIERDVEVMRU0gKmRhdGFwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUHJlLXplcm8gb3V0cHV0IGNvZWZmaWNpZW50IGJsb2NrLiAqLworICBNRU1aRVJPKGRhdGEsIFNJWkVPRihEQ1RFTEVNKSAqIERDVFNJWkUyKTsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKyAgLyogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvNCkqKDgvMikgPSAyKiozLCB3aGljaCB3ZSBhZGQgaGVyZS4gKi8KKyAgLyogNC1wb2ludCBGRENUIGtlcm5lbCwgKi8KKyAgLyogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTYpIFtyZWZlcnMgdG8gOC1wb2ludCBGRENUXS4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAyOyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0clszXSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbMl0pOworCisgICAgdG1wMTAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKTsKKyAgICB0bXAxMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAwICsgdG1wMSAtIDQgKiBDRU5URVJKU0FNUExFKSA8PCAoUEFTUzFfQklUUyszKSk7CisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSAoKHRtcDAgLSB0bXAxKSA8PCAoUEFTUzFfQklUUyszKSk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMCA9IE1VTFRJUExZKHRtcDEwICsgdG1wMTEsIEZJWF8wXzU0MTE5NjEwMCk7ICAgICAgIC8qIGM2ICovCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDAgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtNCk7CisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwICsgTVVMVElQTFkodG1wMTAsIEZJWF8wXzc2NTM2Njg2NSksIC8qIGMyLWM2ICovCisJCSAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTMpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkKKyAgICAgIFJJR0hUX1NISUZUKHRtcDAgLSBNVUxUSVBMWSh0bXAxMSwgRklYXzFfODQ3NzU5MDY1KSwgLyogYzIrYzYgKi8KKwkJICBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMyk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA0OyBjdHIrKykgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyAoT05FIDw8IChQQVNTMV9CSVRTLTEpKTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pIFJJR0hUX1NISUZUKHRtcDAgKyB0bXAxLCBQQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkgUklHSFRfU0hJRlQodG1wMCAtIHRtcDEsIFBBU1MxX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgMngxIHNhbXBsZSBibG9jay4KKyAqCisgKiAyLXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgMS1wb2ludCBpbiBwYXNzIDIgKGNvbHVtbnMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzJ4MSAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxOworICBKU0FNUFJPVyBlbGVtcHRyOworCisgIC8qIFByZS16ZXJvIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTyhkYXRhLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFMik7CisKKyAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhWzBdICsgc3RhcnRfY29sOworCisgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pOworICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKTsKKworICAvKiBXZSBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAgYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvMikqKDgvMSkgPSAyKio1LgorICAgKi8KKworICAvKiBFdmVuIHBhcnQgKi8KKyAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgIGRhdGFbMF0gPSAoRENURUxFTSkgKCh0bXAwICsgdG1wMSAtIDIgKiBDRU5URVJKU0FNUExFKSA8PCA1KTsKKworICAvKiBPZGQgcGFydCAqLworICBkYXRhWzFdID0gKERDVEVMRU0pICgodG1wMCAtIHRtcDEpIDw8IDUpOworfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhbiA4eDE2IHNhbXBsZSBibG9jay4KKyAqCisgKiA4LXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgMTYtcG9pbnQgaW4gcGFzcyAyIChjb2x1bW5zKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF84eDE2IChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUsIHRtcDE2LCB0bXAxNzsKKyAgSU5UMzIgejE7CisgIERDVEVMRU0gd29ya3NwYWNlW0RDVFNJWkUyXTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGN0ciA9IDA7CisgIGZvciAoOzspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OworICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCisgICAgICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls3XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNl0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAzID0gR0VUSlNBTVBMRShlbGVtcHRyWzNdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDEgLSB0bXAyOworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbN10pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisgICAgdG1wMyA9IEdFVEpTQU1QTEUoZWxlbXB0clszXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKSAoKHRtcDEwICsgdG1wMTEgLSA4ICogQ0VOVEVSSlNBTVBMRSkgPDwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSAoKHRtcDEwIC0gdG1wMTEpIDw8IFBBU1MxX0JJVFMpOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF81NDExOTYxMDApOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCBGSVhfMF83NjUzNjY4NjUpLAorCQkJCSAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls2XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxIC0gTVVMVElQTFkodG1wMTMsIEZJWF8xXzg0Nzc1OTA2NSksCisJCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KKyAgICAgKiA4LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNikuCisgICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wMC4udG1wMyBoZXJlLgorICAgICAqLworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAxICsgdG1wMzsKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8xXzE3NTg3NTYwMik7IC8qICBjMyAqLworCisgICAgdG1wMCAgPSBNVUxUSVBMWSh0bXAwLCAgICBGSVhfMV81MDEzMjExMTApOyAgICAvKiAgYzErYzMtYzUtYzcgKi8KKyAgICB0bXAxICA9IE1VTFRJUExZKHRtcDEsICAgIEZJWF8zXzA3MjcxMTAyNik7ICAgIC8qICBjMStjMytjNS1jNyAqLworICAgIHRtcDIgID0gTVVMVElQTFkodG1wMiwgICAgRklYXzJfMDUzMTE5ODY5KTsgICAgLyogIGMxK2MzLWM1K2M3ICovCisgICAgdG1wMyAgPSBNVUxUSVBMWSh0bXAzLCAgICBGSVhfMF8yOTg2MzEzMzYpOyAgICAvKiAtYzErYzMrYzUtYzcgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEwLCAtIEZJWF8wXzg5OTk3NjIyMyk7ICAgIC8qICBjNy1jMyAqLworICAgIHRtcDExID0gTVVMVElQTFkodG1wMTEsIC0gRklYXzJfNTYyOTE1NDQ3KTsgICAgLyogLWMxLWMzICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMF8zOTAxODA2NDQpOyAgICAvKiAgYzUtYzMgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHRtcDEzLCAtIEZJWF8xXzk2MTU3MDU2MCk7ICAgIC8qIC1jMy1jNSAqLworCisgICAgdG1wMTIgKz0gejE7CisgICAgdG1wMTMgKz0gejE7CisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMCArIHRtcDEwICsgdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEgKyB0bXAxMSArIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAyICsgdG1wMTEgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMyArIHRtcDEwICsgdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICBjdHIrKzsKKworICAgIGlmIChjdHIgIT0gRENUU0laRSkgeworICAgICAgaWYgKGN0ciA9PSBEQ1RTSVpFICogMikKKwlicmVhazsJCQkvKiBEb25lLiAqLworICAgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICB9IGVsc2UKKyAgICAgIGRhdGFwdHIgPSB3b3Jrc3BhY2U7CS8qIHN3aXRjaCBwb2ludGVyIHRvIGV4dGVuZGVkIHdvcmtzcGFjZSAqLworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCisgICAqIFdlIHJlbW92ZSB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLCBidXQgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwCisgICAqIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5IDgvMTYgPSAxLzIuCisgICAqIDE2LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8zMikuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIHdzcHRyW0RDVFNJWkUqN107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIHdzcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIHdzcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIHdzcHRyW0RDVFNJWkUqNF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSArIHdzcHRyW0RDVFNJWkUqM107CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XSArIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSo2XSArIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSo3XSArIHdzcHRyW0RDVFNJWkUqMF07CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA3OworICAgIHRtcDE0ID0gdG1wMCAtIHRtcDc7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wNjsKKyAgICB0bXAxNSA9IHRtcDEgLSB0bXA2OworICAgIHRtcDEyID0gdG1wMiArIHRtcDU7CisgICAgdG1wMTYgPSB0bXAyIC0gdG1wNTsKKyAgICB0bXAxMyA9IHRtcDMgKyB0bXA0OworICAgIHRtcDE3ID0gdG1wMyAtIHRtcDQ7CisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gd3NwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gd3NwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gd3NwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gd3NwdHJbRENUU0laRSo0XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjRdIC0gd3NwdHJbRENUU0laRSozXTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjVdIC0gd3NwdHJbRENUU0laRSoyXTsKKyAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjZdIC0gd3NwdHJbRENUU0laRSoxXTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjddIC0gd3NwdHJbRENUU0laRSowXTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIHRtcDExICsgdG1wMTIgKyB0bXAxMywgUEFTUzFfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgLSB0bXAxMywgRklYKDEuMzA2NTYyOTY1KSkgKyAvKiBjNFsxNl0gPSBjMls4XSAqLworCSAgICAgIE1VTFRJUExZKHRtcDExIC0gdG1wMTIsIEZJWF8wXzU0MTE5NjEwMCksICAgLyogYzEyWzE2XSA9IGM2WzhdICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxNyAtIHRtcDE1LCBGSVgoMC4yNzU4OTkzNzkpKSArICAgLyogYzE0WzE2XSA9IGM3WzhdICovCisJICAgIE1VTFRJUExZKHRtcDE0IC0gdG1wMTYsIEZJWCgxLjM4NzAzOTg0NSkpOyAgICAvKiBjMlsxNl0gPSBjMVs4XSAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgTVVMVElQTFkodG1wMTUsIEZJWCgxLjQ1MTc3NDk4MikpICAgLyogYzYrYzE0ICovCisJICAgICAgKyBNVUxUSVBMWSh0bXAxNiwgRklYKDIuMTcyNzM0ODA0KSksICAgICAgICAvKiBjMitjMTAgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwIC0gTVVMVElQTFkodG1wMTQsIEZJWCgwLjIxMTE2NDI0MykpICAgLyogYzItYzYgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDE3LCBGSVgoMS4wNjE1OTQzMzgpKSwgICAgICAgIC8qIGMxMCtjMTQgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDEuMzUzMzE4MDAxKSkgKyAgICAgICAgIC8qIGMzICovCisJICAgIE1VTFRJUExZKHRtcDYgLSB0bXA3LCBGSVgoMC40MTA1MjQ1MjgpKTsgICAgICAgICAgLyogYzEzICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDEuMjQ3MjI1MDEzKSkgKyAgICAgICAgIC8qIGM1ICovCisJICAgIE1VTFRJUExZKHRtcDUgKyB0bXA3LCBGSVgoMC42NjY2NTU2NTgpKTsgICAgICAgICAgLyogYzExICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgRklYKDEuMDkzMjAxODY3KSkgKyAgICAgICAgIC8qIGM3ICovCisJICAgIE1VTFRJUExZKHRtcDQgLSB0bXA3LCBGSVgoMC44OTcxNjc1ODYpKTsgICAgICAgICAgLyogYzkgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHRtcDEgKyB0bXAyLCBGSVgoMC4xMzg2MTcxNjkpKSArICAgICAgICAgLyogYzE1ICovCisJICAgIE1VTFRJUExZKHRtcDYgLSB0bXA1LCBGSVgoMS40MDc0MDM3MzgpKTsgICAgICAgICAgLyogYzEgKi8KKyAgICB0bXAxNSA9IE1VTFRJUExZKHRtcDEgKyB0bXAzLCAtIEZJWCgwLjY2NjY1NTY1OCkpICsgICAgICAgLyogLWMxMSAqLworCSAgICBNVUxUSVBMWSh0bXA0ICsgdG1wNiwgLSBGSVgoMS4yNDcyMjUwMTMpKTsgICAgICAgIC8qIC1jNSAqLworICAgIHRtcDE2ID0gTVVMVElQTFkodG1wMiArIHRtcDMsIC0gRklYKDEuMzUzMzE4MDAxKSkgKyAgICAgICAvKiAtYzMgKi8KKwkgICAgTVVMVElQTFkodG1wNSAtIHRtcDQsIEZJWCgwLjQxMDUyNDUyOCkpOyAgICAgICAgICAvKiBjMTMgKi8KKyAgICB0bXAxMCA9IHRtcDExICsgdG1wMTIgKyB0bXAxMyAtCisJICAgIE1VTFRJUExZKHRtcDAsIEZJWCgyLjI4NjM0MTE0NCkpICsgICAgICAgICAgICAgICAgLyogYzcrYzUrYzMtYzEgKi8KKwkgICAgTVVMVElQTFkodG1wNywgRklYKDAuNzc5NjUzNjI1KSk7ICAgICAgICAgICAgICAgICAvKiBjMTUrYzEzLWMxMStjOSAqLworICAgIHRtcDExICs9IHRtcDE0ICsgdG1wMTUgKyBNVUxUSVBMWSh0bXAxLCBGSVgoMC4wNzE4ODgwNzQpKSAvKiBjOS1jMy1jMTUrYzExICovCisJICAgICAtIE1VTFRJUExZKHRtcDYsIEZJWCgxLjY2MzkwNTExOSkpOyAgICAgICAgICAgICAgLyogYzcrYzEzK2MxLWM1ICovCisgICAgdG1wMTIgKz0gdG1wMTQgKyB0bXAxNiAtIE1VTFRJUExZKHRtcDIsIEZJWCgxLjEyNTcyNjA0OCkpIC8qIGM3K2M1K2MxNS1jMyAqLworCSAgICAgKyBNVUxUSVBMWSh0bXA1LCBGSVgoMS4yMjczOTExMzgpKTsgICAgICAgICAgICAgIC8qIGM5LWMxMStjMS1jMTMgKi8KKyAgICB0bXAxMyArPSB0bXAxNSArIHRtcDE2ICsgTVVMVElQTFkodG1wMywgRklYKDEuMDY1Mzg4OTYyKSkgLyogYzE1K2MzK2MxMS1jNyAqLworCSAgICAgKyBNVUxUSVBMWSh0bXA0LCBGSVgoMi4xNjc5ODU2OTIpKTsgICAgICAgICAgICAgIC8qIGMxK2MxMytjNS1jOSAqLworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAsIENPTlNUX0JJVFMrUEFTUzFfQklUUysxKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMSwgQ09OU1RfQklUUytQQVNTMV9CSVRTKzEpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTMsIENPTlNUX0JJVFMrUEFTUzFfQklUUysxKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICB3c3B0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgN3gxNCBzYW1wbGUgYmxvY2suCisgKgorICogNy1wb2ludCBGRENUIGluIHBhc3MgMSAocm93cyksIDE0LXBvaW50IGluIHBhc3MgMiAoY29sdW1ucykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfN3gxNCAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCB0bXAxNjsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgRENURUxFTSB3b3Jrc3BhY2VbOCo2XTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUHJlLXplcm8gb3V0cHV0IGNvZWZmaWNpZW50IGJsb2NrLiAqLworICBNRU1aRVJPKGRhdGEsIFNJWkVPRihEQ1RFTEVNKSAqIERDVFNJWkUyKTsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKyAgLyogNy1wb2ludCBGRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTQpLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0cls1XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworICAgIHRtcDMgPSBHRVRKU0FNUExFKGVsZW1wdHJbM10pOworCisgICAgdG1wMTAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzZdKTsKKyAgICB0bXAxMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbNV0pOworICAgIHRtcDEyID0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisKKyAgICB6MSA9IHRtcDAgKyB0bXAyOworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICgoejEgKyB0bXAxICsgdG1wMyAtIDcgKiBDRU5URVJKU0FNUExFKSA8PCBQQVNTMV9CSVRTKTsKKyAgICB0bXAzICs9IHRtcDM7CisgICAgejEgLT0gdG1wMzsKKyAgICB6MSAtPSB0bXAzOworICAgIHoxID0gTVVMVElQTFkoejEsIEZJWCgwLjM1MzU1MzM5MSkpOyAgICAgICAgICAgICAgICAvKiAoYzIrYzYtYzQpLzIgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDAgLSB0bXAyLCBGSVgoMC45MjA2MDkwMDIpKTsgICAgICAgLyogKGMyK2M0LWM2KS8yICovCisgICAgejMgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMiwgRklYKDAuMzE0NjkyMTIzKSk7ICAgICAgIC8qIGM2ICovCisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgejIgKyB6MywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB6MSAtPSB6MjsKKyAgICB6MiA9IE1VTFRJUExZKHRtcDAgLSB0bXAxLCBGSVgoMC44ODE3NDc3MzQpKTsgICAgICAgLyogYzQgKi8KKyAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHoyICsgejMgLSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYKDAuNzA3MTA2NzgxKSksIC8qIGMyK2M2LWM0ICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyB6MiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYKDAuOTM1NDE0MzQ3KSk7ICAgLyogKGMzK2MxLWM1KS8yICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTEsIEZJWCgwLjE3MDI2MjMzOSkpOyAgIC8qIChjMytjNS1jMSkvMiAqLworICAgIHRtcDAgPSB0bXAxIC0gdG1wMjsKKyAgICB0bXAxICs9IHRtcDI7CisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDExICsgdG1wMTIsIC0gRklYKDEuMzc4NzU2Mjc2KSk7IC8qIC1jMSAqLworICAgIHRtcDEgKz0gdG1wMjsKKyAgICB0bXAzID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMiwgRklYKDAuNjEzNjA0MjY4KSk7ICAgLyogYzUgKi8KKyAgICB0bXAwICs9IHRtcDM7CisgICAgdG1wMiArPSB0bXAzICsgTVVMVElQTFkodG1wMTIsIEZJWCgxLjg3MDgyODY5MykpOyAgIC8qIGMzK2MxLWM1ICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIGN0cisrOworCisgICAgaWYgKGN0ciAhPSBEQ1RTSVpFKSB7CisgICAgICBpZiAoY3RyID09IDE0KQorCWJyZWFrOwkJCS8qIERvbmUuICovCisgICAgICBkYXRhcHRyICs9IERDVFNJWkU7CS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgIH0gZWxzZQorICAgICAgZGF0YXB0ciA9IHdvcmtzcGFjZTsJLyogc3dpdGNoIHBvaW50ZXIgdG8gZXh0ZW5kZWQgd29ya3NwYWNlICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvNykqKDgvMTQpID0gMzIvNDksIHdoaWNoIHdlCisgICAqIGZvbGQgaW50byB0aGUgY29uc3RhbnQgbXVsdGlwbGllcnM6CisgICAqIDE0LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yOCkgKiAzMi80OS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDc7IGN0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgd3NwdHJbRENUU0laRSo1XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgd3NwdHJbRENUU0laRSo0XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgd3NwdHJbRENUU0laRSozXTsKKyAgICB0bXAxMyA9IGRhdGFwdHJbRENUU0laRSozXSArIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSArIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XSArIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSo2XSArIGRhdGFwdHJbRENUU0laRSo3XTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDY7CisgICAgdG1wMTQgPSB0bXAwIC0gdG1wNjsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXA1OworICAgIHRtcDE1ID0gdG1wMSAtIHRtcDU7CisgICAgdG1wMTIgPSB0bXAyICsgdG1wNDsKKyAgICB0bXAxNiA9IHRtcDIgLSB0bXA0OworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIHdzcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIHdzcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIHdzcHRyW0RDVFNJWkUqM107CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSAtIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSAtIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSo1XSAtIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSo2XSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCArIHRtcDExICsgdG1wMTIgKyB0bXAxMywKKwkJICAgICAgIEZJWCgwLjY1MzA2MTIyNCkpLCAgICAgICAgICAgICAgICAgLyogMzIvNDkgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIHRtcDEzICs9IHRtcDEzOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDEzLCBGSVgoMC44MzIxMDYwNTIpKSArIC8qIGM0ICovCisJICAgICAgTVVMVElQTFkodG1wMTEgLSB0bXAxMywgRklYKDAuMjA1NTEzMjIzKSkgLSAvKiBjMTIgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMiAtIHRtcDEzLCBGSVgoMC41NzU4MzUyNTUpKSwgIC8qIGM4ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTQgKyB0bXAxNSwgRklYKDAuNzIyMDc0NTcwKSk7ICAgIC8qIGM2ICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyBNVUxUSVBMWSh0bXAxNCwgRklYKDAuMTc4MzM3NjkxKSkgICAvKiBjMi1jNiAqLworCSAgICAgICsgTVVMVElQTFkodG1wMTYsIEZJWCgwLjQwMDcyMTE1NSkpLCAgICAgICAgLyogYzEwICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxNSwgRklYKDEuMTIyNzk1NzI1KSkgICAvKiBjNitjMTAgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDE2LCBGSVgoMC45MDA0MTIyNjIpKSwgICAgICAgIC8qIGMyICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHRtcDEgKyB0bXAyOworICAgIHRtcDExID0gdG1wNSAtIHRtcDQ7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgLSB0bXAxMCArIHRtcDMgLSB0bXAxMSAtIHRtcDYsCisJCSAgICAgICBGSVgoMC42NTMwNjEyMjQpKSwgICAgICAgICAgICAgICAgIC8qIDMyLzQ5ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICB0bXAzICA9IE1VTFRJUExZKHRtcDMgLCBGSVgoMC42NTMwNjEyMjQpKTsgICAgICAgICAgICAvKiAzMi80OSAqLworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIC0gRklYKDAuMTAzNDA2ODEyKSk7ICAgICAgICAgIC8qIC1jMTMgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC45MTc3NjA4MzkpKTsgICAgICAgICAgICAvKiBjMSAqLworICAgIHRtcDEwICs9IHRtcDExIC0gdG1wMzsKKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDAgKyB0bXAyLCBGSVgoMC43ODIwMDc0MTApKSArICAgICAvKiBjNSAqLworCSAgICBNVUxUSVBMWSh0bXA0ICsgdG1wNiwgRklYKDAuNDkxMzY3ODIzKSk7ICAgICAgLyogYzkgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyB0bXAxMSAtIE1VTFRJUExZKHRtcDIsIEZJWCgxLjU1MDM0MTA3NikpIC8qIGMzK2M1LWMxMyAqLworCSAgICAgICsgTVVMVElQTFkodG1wNCwgRklYKDAuNzMxNDI4MjAyKSksICAgICAgICAgLyogYzErYzExLWM5ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDAgKyB0bXAxLCBGSVgoMC44NzE3NDA0NzgpKSArICAgICAvKiBjMyAqLworCSAgICBNVUxUSVBMWSh0bXA1IC0gdG1wNiwgRklYKDAuMzA1MDM1MTg2KSk7ICAgICAgLyogYzExICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgdG1wMTIgLSBNVUxUSVBMWSh0bXAxLCBGSVgoMC4yNzY5NjU4NDQpKSAvKiBjMy1jOS1jMTMgKi8KKwkgICAgICAtIE1VTFRJUExZKHRtcDUsIEZJWCgyLjAwNDgwMzQzNSkpLCAgICAgICAgIC8qIGMxK2M1K2MxMSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDExICsgdG1wMTIgKyB0bXAzCisJICAgICAgLSBNVUxUSVBMWSh0bXAwLCBGSVgoMC43MzU5ODcwNDkpKSAgICAgICAgICAvKiBjMytjNS1jMSAqLworCSAgICAgIC0gTVVMVElQTFkodG1wNiwgRklYKDAuMDgyOTI1ODI1KSksICAgICAgICAgLyogYzktYzExLWMxMyAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgICAgd3NwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDZ4MTIgc2FtcGxlIGJsb2NrLgorICoKKyAqIDYtcG9pbnQgRkRDVCBpbiBwYXNzIDEgKHJvd3MpLCAxMi1wb2ludCBpbiBwYXNzIDIgKGNvbHVtbnMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzZ4MTIgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNTsKKyAgRENURUxFTSB3b3Jrc3BhY2VbOCo0XTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUHJlLXplcm8gb3V0cHV0IGNvZWZmaWNpZW50IGJsb2NrLiAqLworICBNRU1aRVJPKGRhdGEsIFNJWkVPRihEQ1RFTEVNKSAqIERDVFNJWkUyKTsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKyAgLyogNi1wb2ludCBGRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTIpLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAxMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbNF0pOworICAgIHRtcDIgPSBHRVRKU0FNUExFKGVsZW1wdHJbMl0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzNdKTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAwIC0gdG1wMjsKKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzVdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbM10pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAxMCArIHRtcDExIC0gNiAqIENFTlRFUkpTQU1QTEUpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTIsIEZJWCgxLjIyNDc0NDg3MSkpLCAgICAgICAgICAgICAgICAgLyogYzIgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgLSB0bXAxMSAtIHRtcDExLCBGSVgoMC43MDcxMDY3ODEpKSwgLyogYzQgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gREVTQ0FMRShNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDAuMzY2MDI1NDA0KSksICAgICAvKiBjNSAqLworCQkgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgKHRtcDEwICsgKCh0bXAwICsgdG1wMSkgPDwgUEFTUzFfQklUUykpOworICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgKCh0bXAwIC0gdG1wMSAtIHRtcDIpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgKHRtcDEwICsgKCh0bXAyIC0gdG1wMSkgPDwgUEFTUzFfQklUUykpOworCisgICAgY3RyKys7CisKKyAgICBpZiAoY3RyICE9IERDVFNJWkUpIHsKKyAgICAgIGlmIChjdHIgPT0gMTIpCisJYnJlYWs7CQkJLyogRG9uZS4gKi8KKyAgICAgIGRhdGFwdHIgKz0gRENUU0laRTsJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgfSBlbHNlCisgICAgICBkYXRhcHRyID0gd29ya3NwYWNlOwkvKiBzd2l0Y2ggcG9pbnRlciB0byBleHRlbmRlZCB3b3Jrc3BhY2UgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC82KSooOC8xMikgPSA4LzksIHdoaWNoIHdlCisgICAqIGZvbGQgaW50byB0aGUgY29uc3RhbnQgbXVsdGlwbGllcnM6CisgICAqIDEyLXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yNCkgKiA4LzkuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA2OyBjdHIrKykgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIHdzcHRyW0RDVFNJWkUqM107CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIHdzcHRyW0RDVFNJWkUqMl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSo0XSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjVdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNTsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXA1OworICAgIHRtcDExID0gdG1wMSArIHRtcDQ7CisgICAgdG1wMTQgPSB0bXAxIC0gdG1wNDsKKyAgICB0bXAxMiA9IHRtcDIgKyB0bXAzOworICAgIHRtcDE1ID0gdG1wMiAtIHRtcDM7CisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gd3NwdHJbRENUU0laRSozXTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gd3NwdHJbRENUU0laRSoyXTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gd3NwdHJbRENUU0laRSoxXTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjRdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqNV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgKyB0bXAxMSArIHRtcDEyLCBGSVgoMC44ODg4ODg4ODkpKSwgLyogOC85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTMgLSB0bXAxNCAtIHRtcDE1LCBGSVgoMC44ODg4ODg4ODkpKSwgLyogOC85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYKDEuMDg4NjYyMTA4KSksICAgICAgICAgLyogYzQgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxNCAtIHRtcDE1LCBGSVgoMC44ODg4ODg4ODkpKSArICAgICAgICAvKiA4LzkgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMyArIHRtcDE1LCBGSVgoMS4yMTQyNDQ4MDMpKSwgICAgICAgICAvKiBjMiAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxICsgdG1wNCwgRklYKDAuNDgxMDYzMjAwKSk7ICAgLyogYzkgKi8KKyAgICB0bXAxNCA9IHRtcDEwICsgTVVMVElQTFkodG1wMSwgRklYKDAuNjgwMzI2MTAyKSk7ICAvKiBjMy1jOSAqLworICAgIHRtcDE1ID0gdG1wMTAgLSBNVUxUSVBMWSh0bXA0LCBGSVgoMS42NDI0NTI1MDIpKTsgIC8qIGMzK2M5ICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDAuOTk3MzA3NjAzKSk7ICAgLyogYzUgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHRtcDAgKyB0bXAzLCBGSVgoMC43NjUyNjEwMzkpKTsgICAvKiBjNyAqLworICAgIHRtcDEwID0gdG1wMTIgKyB0bXAxMyArIHRtcDE0IC0gTVVMVElQTFkodG1wMCwgRklYKDAuNTE2MjQ0NDAzKSkgLyogYzUrYzctYzEgKi8KKwkgICAgKyBNVUxUSVBMWSh0bXA1LCBGSVgoMC4xNjQwODE2OTkpKTsgICAgICAgIC8qIGMxMSAqLworICAgIHRtcDExID0gTVVMVElQTFkodG1wMiArIHRtcDMsIC0gRklYKDAuMTY0MDgxNjk5KSk7IC8qIC1jMTEgKi8KKyAgICB0bXAxMiArPSB0bXAxMSAtIHRtcDE1IC0gTVVMVElQTFkodG1wMiwgRklYKDIuMDc5NTUwMTQ0KSkgLyogYzErYzUtYzExICovCisJICAgICsgTVVMVElQTFkodG1wNSwgRklYKDAuNzY1MjYxMDM5KSk7ICAgICAgICAvKiBjNyAqLworICAgIHRtcDEzICs9IHRtcDExIC0gdG1wMTQgKyBNVUxUSVBMWSh0bXAzLCBGSVgoMC42NDUxNDQ4OTkpKSAvKiBjMStjMTEtYzcgKi8KKwkgICAgLSBNVUxUSVBMWSh0bXA1LCBGSVgoMC45OTczMDc2MDMpKTsgICAgICAgIC8qIGM1ICovCisgICAgdG1wMTEgPSB0bXAxNSArIE1VTFRJUExZKHRtcDAgLSB0bXAzLCBGSVgoMS4xNjEzODkzMDIpKSAvKiBjMyAqLworCSAgICAtIE1VTFRJUExZKHRtcDIgKyB0bXA1LCBGSVgoMC40ODEwNjMyMDApKTsgLyogYzkgKi8KKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDExLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEzLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICAgIHdzcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gYSA1eDEwIHNhbXBsZSBibG9jay4KKyAqCisgKiA1LXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgMTAtcG9pbnQgaW4gcGFzcyAyIChjb2x1bW5zKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF81eDEwIChEQ1RFTEVNICogZGF0YSwgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkRJTUVOU0lPTiBzdGFydF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNDsKKyAgRENURUxFTSB3b3Jrc3BhY2VbOCoyXTsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgRENURUxFTSAqd3NwdHI7CisgIEpTQU1QUk9XIGVsZW1wdHI7CisgIGludCBjdHI7CisgIFNISUZUX1RFTVBTCisKKyAgLyogUHJlLXplcm8gb3V0cHV0IGNvZWZmaWNpZW50IGJsb2NrLiAqLworICBNRU1aRVJPKGRhdGEsIFNJWkVPRihEQ1RFTEVNKSAqIERDVFNJWkUyKTsKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLworICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KKyAgLyogNS1wb2ludCBGRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTApLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBjdHIgPSAwOworICBmb3IgKDs7KSB7CisgICAgZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2N0cl0gKyBzdGFydF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBHRVRKU0FNUExFKGVsZW1wdHJbMF0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzRdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKSArIEdFVEpTQU1QTEUoZWxlbXB0clszXSk7CisgICAgdG1wMiA9IEdFVEpTQU1QTEUoZWxlbXB0clsyXSk7CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAxOworICAgIHRtcDExID0gdG1wMCAtIHRtcDE7CisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0cls0XSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSkgLSBHRVRKU0FNUExFKGVsZW1wdHJbM10pOworCisgICAgLyogQXBwbHkgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKQorICAgICAgKCh0bXAxMCArIHRtcDIgLSA1ICogQ0VOVEVSSlNBTVBMRSkgPDwgUEFTUzFfQklUUyk7CisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAxMSwgRklYKDAuNzkwNTY5NDE1KSk7ICAgICAgICAgIC8qIChjMitjNCkvMiAqLworICAgIHRtcDEwIC09IHRtcDIgPDwgMjsKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEwLCBGSVgoMC4zNTM1NTMzOTEpKTsgICAgICAgICAgLyogKGMyLWM0KS8yICovCisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDExICsgdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDExIC0gdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDAuODMxMjUzODc2KSk7ICAgIC8qIGMzICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwICsgTVVMVElQTFkodG1wMCwgRklYKDAuNTEzNzQzMTQ4KSksIC8qIGMxLWMzICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKHRtcDEwIC0gTVVMVElQTFkodG1wMSwgRklYKDIuMTc2MjUwODk5KSksIC8qIGMxK2MzICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIGN0cisrOworCisgICAgaWYgKGN0ciAhPSBEQ1RTSVpFKSB7CisgICAgICBpZiAoY3RyID09IDEwKQorCWJyZWFrOwkJCS8qIERvbmUuICovCisgICAgICBkYXRhcHRyICs9IERDVFNJWkU7CS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgIH0gZWxzZQorICAgICAgZGF0YXB0ciA9IHdvcmtzcGFjZTsJLyogc3dpdGNoIHBvaW50ZXIgdG8gZXh0ZW5kZWQgd29ya3NwYWNlICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvNSkqKDgvMTApID0gMzIvMjUsIHdoaWNoIHdlCisgICAqIGZvbGQgaW50byB0aGUgY29uc3RhbnQgbXVsdGlwbGllcnM6CisgICAqIDEwLXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yMCkgKiAzMi8yNS4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDU7IGN0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgd3NwdHJbRENUU0laRSoxXTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgd3NwdHJbRENUU0laRSowXTsKKyAgICB0bXAxMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqNF0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXA0OworICAgIHRtcDEzID0gdG1wMCAtIHRtcDQ7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMzsKKyAgICB0bXAxNCA9IHRtcDEgLSB0bXAzOworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIHdzcHRyW0RDVFNJWkUqMV07CisgICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIHdzcHRyW0RDVFNJWkUqMF07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqNF0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTAgKyB0bXAxMSArIHRtcDEyLCBGSVgoMS4yOCkpLCAvKiAzMi8yNSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgdG1wMTIgKz0gdG1wMTI7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWCgxLjQ2NDQ3NzE5MSkpIC0gLyogYzQgKi8KKwkgICAgICBNVUxUSVBMWSh0bXAxMSAtIHRtcDEyLCBGSVgoMC41NTkzODA1MTEpKSwgIC8qIGM4ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDEzICsgdG1wMTQsIEZJWCgxLjA2NDAwNDk2MSkpOyAgICAvKiBjNiAqLworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDEzLCBGSVgoMC42NTc1OTEyMzApKSwgIC8qIGMyLWM2ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgLSBNVUxUSVBMWSh0bXAxNCwgRklYKDIuNzg1NjAxMTUxKSksICAvKiBjMitjNiAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wNDsKKyAgICB0bXAxMSA9IHRtcDEgLSB0bXAzOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDExIC0gdG1wMiwgRklYKDEuMjgpKSwgIC8qIDMyLzI1ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYKDEuMjgpKTsgICAgICAgICAgICAgICAgICAgICAvKiAzMi8yNSAqLworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAwLCBGSVgoMS43ODc5MDY4NzYpKSArICAgICAgICAgIC8qIGMxICovCisJICAgICAgTVVMVElQTFkodG1wMSwgRklYKDEuNjEyODk0MDk0KSkgKyB0bXAyICsgICAvKiBjMyAqLworCSAgICAgIE1VTFRJUExZKHRtcDMsIEZJWCgwLjgyMTgxMDU4OCkpICsgICAgICAgICAgLyogYzcgKi8KKwkgICAgICBNVUxUSVBMWSh0bXA0LCBGSVgoMC4yODMxNzY2MzApKSwgICAgICAgICAgIC8qIGM5ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDAgLSB0bXA0LCBGSVgoMS4yMTczNTIzNDEpKSAtICAgICAvKiAoYzMrYzcpLzIgKi8KKwkgICAgTVVMVElQTFkodG1wMSArIHRtcDMsIEZJWCgwLjc1MjM2NTEyMykpOyAgICAgIC8qIChjMS1jOSkvMiAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMTAgKyB0bXAxMSwgRklYKDAuMzk1NTQxNzUzKSkgKyAgIC8qIChjMy1jNykvMiAqLworCSAgICBNVUxUSVBMWSh0bXAxMSwgRklYKDAuNjQpKSAtIHRtcDI7ICAgICAgICAgICAgLyogMTYvMjUgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMiArIHRtcDEzLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEyIC0gdG1wMTMsIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgICAgd3NwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDR4OCBzYW1wbGUgYmxvY2suCisgKgorICogNC1wb2ludCBGRENUIGluIHBhc3MgMSAocm93cyksIDgtcG9pbnQgaW4gcGFzcyAyIChjb2x1bW5zKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF80eDggKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIElOVDMyIHoxOworICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFByZS16ZXJvIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTyhkYXRhLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFMik7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisgIC8qIFdlIG11c3QgYWxzbyBzY2FsZSB0aGUgb3V0cHV0IGJ5IDgvNCA9IDIsIHdoaWNoIHdlIGFkZCBoZXJlLiAqLworICAvKiA0LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNikuICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKKyAgICBlbGVtcHRyID0gc2FtcGxlX2RhdGFbY3RyXSArIHN0YXJ0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IEdFVEpTQU1QTEUoZWxlbXB0clswXSkgKyBHRVRKU0FNUExFKGVsZW1wdHJbM10pOworICAgIHRtcDEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pICsgR0VUSlNBTVBMRShlbGVtcHRyWzJdKTsKKworICAgIHRtcDEwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clszXSk7CisgICAgdG1wMTEgPSBHRVRKU0FNUExFKGVsZW1wdHJbMV0pIC0gR0VUSlNBTVBMRShlbGVtcHRyWzJdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkKKyAgICAgICgodG1wMCArIHRtcDEgLSA0ICogQ0VOVEVSSlNBTVBMRSkgPDwgKFBBU1MxX0JJVFMrMSkpOworICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkgKCh0bXAwIC0gdG1wMSkgPDwgKFBBU1MxX0JJVFMrMSkpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAvKiBjNiAqLworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTIpOworCisgICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQodG1wMCArIE1VTFRJUExZKHRtcDEwLCBGSVhfMF83NjUzNjY4NjUpLCAvKiBjMi1jNiAqLworCQkgIENPTlNUX0JJVFMtUEFTUzFfQklUUy0xKTsKKyAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwIC0gTVVMVElQTFkodG1wMTEsIEZJWF8xXzg0Nzc1OTA2NSksIC8qIGMyK2M2ICovCisJCSAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKKyAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KKyAgICovCisKKyAgZGF0YXB0ciA9IGRhdGE7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKKyAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgorICAgICAqLworCisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzICsgKE9ORSA8PCAoUEFTUzFfQklUUy0xKSk7CisgICAgdG1wMTIgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEzID0gdG1wMSAtIHRtcDI7CisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMTEsIFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDExLCBQQVNTMV9CSVRTKTsKKworICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejEgKz0gT05FIDw8IChDT05TVF9CSVRTK1BBU1MxX0JJVFMtMSk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh6MSArIE1VTFRJUExZKHRtcDEyLCBGSVhfMF83NjUzNjY4NjUpLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQoejEgLSBNVUxUSVBMWSh0bXAxMywgRklYXzFfODQ3NzU5MDY1KSwgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KKyAgICAgKiA4LXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNikuCisgICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wMC4udG1wMyBoZXJlLgorICAgICAqLworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAxICsgdG1wMzsKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8xXzE3NTg3NTYwMik7IC8qICBjMyAqLworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB6MSArPSBPTkUgPDwgKENPTlNUX0JJVFMrUEFTUzFfQklUUy0xKTsKKworICAgIHRtcDAgID0gTVVMVElQTFkodG1wMCwgICAgRklYXzFfNTAxMzIxMTEwKTsgICAgLyogIGMxK2MzLWM1LWM3ICovCisgICAgdG1wMSAgPSBNVUxUSVBMWSh0bXAxLCAgICBGSVhfM18wNzI3MTEwMjYpOyAgICAvKiAgYzErYzMrYzUtYzcgKi8KKyAgICB0bXAyICA9IE1VTFRJUExZKHRtcDIsICAgIEZJWF8yXzA1MzExOTg2OSk7ICAgIC8qICBjMStjMy1jNStjNyAqLworICAgIHRtcDMgID0gTVVMVElQTFkodG1wMywgICAgRklYXzBfMjk4NjMxMzM2KTsgICAgLyogLWMxK2MzK2M1LWM3ICovCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxMCwgLSBGSVhfMF84OTk5NzYyMjMpOyAgICAvKiAgYzctYzMgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7ICAgIC8qIC1jMS1jMyAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTIsIC0gRklYXzBfMzkwMTgwNjQ0KTsgICAgLyogIGM1LWMzICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAxMywgLSBGSVhfMV85NjE1NzA1NjApOyAgICAvKiAtYzMtYzUgKi8KKworICAgIHRtcDEyICs9IHoxOworICAgIHRtcDEzICs9IHoxOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAwICsgdG1wMTAgKyB0bXAxMiwgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkKKyAgICAgIFJJR0hUX1NISUZUKHRtcDEgKyB0bXAxMSArIHRtcDEzLCBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQodG1wMiArIHRtcDExICsgdG1wMTIsIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pCisgICAgICBSSUdIVF9TSElGVCh0bXAzICsgdG1wMTAgKyB0bXAxMywgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDN4NiBzYW1wbGUgYmxvY2suCisgKgorICogMy1wb2ludCBGRENUIGluIHBhc3MgMSAocm93cyksIDYtcG9pbnQgaW4gcGFzcyAyIChjb2x1bW5zKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF8zeDYgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMjsKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMjsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgSlNBTVBST1cgZWxlbXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQcmUtemVybyBvdXRwdXQgY29lZmZpY2llbnQgYmxvY2suICovCisgIE1FTVpFUk8oZGF0YSwgU0laRU9GKERDVEVMRU0pICogRENUU0laRTIpOworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworICAvKiBXZSBzY2FsZSB0aGUgcmVzdWx0cyBmdXJ0aGVyIGJ5IDIgYXMgcGFydCBvZiBvdXRwdXQgYWRhcHRpb24gKi8KKyAgLyogc2NhbGluZyBmb3IgZGlmZmVyZW50IERDVCBzaXplLiAqLworICAvKiAzLXBvaW50IEZEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS82KS4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA2OyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSArIEdFVEpTQU1QTEUoZWxlbXB0clsyXSk7CisgICAgdG1wMSA9IEdFVEpTQU1QTEUoZWxlbXB0clsxXSk7CisKKyAgICB0bXAyID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKSAtIEdFVEpTQU1QTEUoZWxlbXB0clsyXSk7CisKKyAgICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pCisgICAgICAoKHRtcDAgKyB0bXAxIC0gMyAqIENFTlRFUkpTQU1QTEUpIDw8IChQQVNTMV9CSVRTKzEpKTsKKyAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgLSB0bXAxIC0gdG1wMSwgRklYKDAuNzA3MTA2NzgxKSksIC8qIGMyICovCisJICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMiwgRklYKDEuMjI0NzQ0ODcxKSksICAgICAgICAgICAgICAgLyogYzEgKi8KKwkgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC82KSooOC8zKSA9IDMyLzksIHdoaWNoIHdlIHBhcnRpYWxseQorICAgKiBmb2xkIGludG8gdGhlIGNvbnN0YW50IG11bHRpcGxpZXJzIChvdGhlciBwYXJ0IHdhcyBkb25lIGluIHBhc3MgMSk6CisgICAqIDYtcG9pbnQgRkRDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzEyKSAqIDE2LzkuCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDM7IGN0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDExID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqM107CisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSozXTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVgoMS43Nzc3Nzc3NzgpKSwgICAgICAgICAvKiAxNi85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUoTVVMVElQTFkodG1wMTIsIEZJWCgyLjE3NzMyNDIxNikpLCAgICAgICAgICAgICAgICAgLyogYzIgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRShNVUxUSVBMWSh0bXAxMCAtIHRtcDExIC0gdG1wMTEsIEZJWCgxLjI1NzA3ODcyMikpLCAvKiBjNCAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAwICsgdG1wMiwgRklYKDAuNjUwNzExODI5KSk7ICAgICAgICAgICAgIC8qIGM1ICovCisKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkKKyAgICAgIERFU0NBTEUodG1wMTAgKyBNVUxUSVBMWSh0bXAwICsgdG1wMSwgRklYKDEuNzc3Nzc3Nzc4KSksICAgLyogMTYvOSAqLworCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pCisgICAgICBERVNDQUxFKE1VTFRJUExZKHRtcDAgLSB0bXAxIC0gdG1wMiwgRklYKDEuNzc3Nzc3Nzc4KSksICAgIC8qIDE2LzkgKi8KKwkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKQorICAgICAgREVTQ0FMRSh0bXAxMCArIE1VTFRJUExZKHRtcDIgLSB0bXAxLCBGSVgoMS43Nzc3Nzc3NzgpKSwgICAvKiAxNi85ICovCisJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBhIDJ4NCBzYW1wbGUgYmxvY2suCisgKgorICogMi1wb2ludCBGRENUIGluIHBhc3MgMSAocm93cyksIDQtcG9pbnQgaW4gcGFzcyAyIChjb2x1bW5zKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF8yeDQgKERDVEVMRU0gKiBkYXRhLCBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKRElNRU5TSU9OIHN0YXJ0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMTsKKyAgSU5UMzIgdG1wMTAsIHRtcDExOworICBEQ1RFTEVNICpkYXRhcHRyOworICBKU0FNUFJPVyBlbGVtcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFByZS16ZXJvIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTyhkYXRhLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFMik7CisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVC4gKi8KKyAgLyogV2UgbXVzdCBhbHNvIHNjYWxlIHRoZSBvdXRwdXQgYnkgKDgvMikqKDgvNCkgPSAyKiozLCB3aGljaCB3ZSBhZGQgaGVyZS4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA0OyBjdHIrKykgeworICAgIGVsZW1wdHIgPSBzYW1wbGVfZGF0YVtjdHJdICsgc3RhcnRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gR0VUSlNBTVBMRShlbGVtcHRyWzBdKTsKKyAgICB0bXAxID0gR0VUSlNBTVBMRShlbGVtcHRyWzFdKTsKKworICAgIC8qIEFwcGx5IHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkgKCh0bXAwICsgdG1wMSAtIDIgKiBDRU5URVJKU0FNUExFKSA8PCAzKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pICgodG1wMCAtIHRtcDEpIDw8IDMpOworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KKyAgICogV2UgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCisgICAqIDQtcG9pbnQgRkRDVCBrZXJuZWwsCisgICAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzE2KSBbcmVmZXJzIHRvIDgtcG9pbnQgRkRDVF0uCisgICAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDI7IGN0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjNdOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqMl07CisKKyAgICB0bXAxMCA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSozXTsKKyAgICB0bXAxMSA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSoyXTsKKworICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKSAodG1wMCArIHRtcDEpOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKSAodG1wMCAtIHRtcDEpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMCArIHRtcDExLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAvKiBjNiAqLworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy0xKTsKKworICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQodG1wMCArIE1VTFRJUExZKHRtcDEwLCBGSVhfMF83NjUzNjY4NjUpLCAvKiBjMi1jNiAqLworCQkgIENPTlNUX0JJVFMpOworICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKQorICAgICAgUklHSFRfU0hJRlQodG1wMCAtIE1VTFRJUExZKHRtcDExLCBGSVhfMV84NDc3NTkwNjUpLCAvKiBjMitjNiAqLworCQkgIENPTlNUX0JJVFMpOworCisgICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIGEgMXgyIHNhbXBsZSBibG9jay4KKyAqCisgKiAxLXBvaW50IEZEQ1QgaW4gcGFzcyAxIChyb3dzKSwgMi1wb2ludCBpbiBwYXNzIDIgKGNvbHVtbnMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19mZGN0XzF4MiAoRENURUxFTSAqIGRhdGEsIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpESU1FTlNJT04gc3RhcnRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxOworCisgIC8qIFByZS16ZXJvIG91dHB1dCBjb2VmZmljaWVudCBibG9jay4gKi8KKyAgTUVNWkVSTyhkYXRhLCBTSVpFT0YoRENURUxFTSkgKiBEQ1RTSVpFMik7CisKKyAgdG1wMCA9IEdFVEpTQU1QTEUoc2FtcGxlX2RhdGFbMF1bc3RhcnRfY29sXSk7CisgIHRtcDEgPSBHRVRKU0FNUExFKHNhbXBsZV9kYXRhWzFdW3N0YXJ0X2NvbF0pOworCisgIC8qIFdlIGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cCBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKiBXZSBtdXN0IGFsc28gc2NhbGUgdGhlIG91dHB1dCBieSAoOC8xKSooOC8yKSA9IDIqKjUuCisgICAqLworCisgIC8qIEV2ZW4gcGFydCAqLworICAvKiBBcHBseSB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgZGF0YVtEQ1RTSVpFKjBdID0gKERDVEVMRU0pICgodG1wMCArIHRtcDEgLSAyICogQ0VOVEVSSlNBTVBMRSkgPDwgNSk7CisKKyAgLyogT2RkIHBhcnQgKi8KKyAgZGF0YVtEQ1RTSVpFKjFdID0gKERDVEVMRU0pICgodG1wMCAtIHRtcDEpIDw8IDUpOworfQorCisjZW5kaWYgLyogRENUX1NDQUxJTkdfU1VQUE9SVEVEICovCiAjZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvamlkY3RpbnQuYyBiL2ppZGN0aW50LmMKaW5kZXggYTcyYjMyMC4uZGNkZjdjZSAxMDA2NDQKLS0tIGEvamlkY3RpbnQuYworKysgYi9qaWRjdGludC5jCkBAIC0yLDYgKzIsNyBAQAogICogamlkY3RpbnQuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIE1vZGlmaWNhdGlvbiBkZXZlbG9wZWQgMjAwMi0yMDA5IGJ5IEd1aWRvIFZvbGxiZWRpbmcuCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKQEAgLTIzLDYgKzI0LDI4IEBACiAgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKICAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgogICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCisgKgorICogV2UgYWxzbyBwcm92aWRlIElEQ1Qgcm91dGluZXMgd2l0aCB2YXJpb3VzIG91dHB1dCBzYW1wbGUgYmxvY2sgc2l6ZXMgZm9yCisgKiBkaXJlY3QgcmVzb2x1dGlvbiByZWR1Y3Rpb24gb3IgZW5sYXJnZW1lbnQgYW5kIGZvciBkaXJlY3QgcmVzb2x2aW5nIHRoZQorICogY29tbW9uIDJ4MSBhbmQgMXgyIHN1YnNhbXBsaW5nIGNhc2VzIHdpdGhvdXQgYWRkaXRpb25hbCByZXNhbXBsaW5nOiBOeE4KKyAqIChOPTEuLi4xNiksIDJOeE4sIGFuZCBOeDJOIChOPTEuLi44KSBwaXhlbHMgZm9yIG9uZSA4eDggaW5wdXQgRENUIGJsb2NrLgorICoKKyAqIEZvciBOPDggd2Ugc2ltcGx5IHRha2UgdGhlIGNvcnJlc3BvbmRpbmcgbG93LWZyZXF1ZW5jeSBjb2VmZmljaWVudHMgb2YKKyAqIHRoZSA4eDggaW5wdXQgRENUIGJsb2NrIGFuZCBhcHBseSBhbiBOeE4gcG9pbnQgSURDVCBvbiB0aGUgc3ViLWJsb2NrCisgKiB0byB5aWVsZCB0aGUgZG93bnNjYWxlZCBvdXRwdXRzLgorICogVGhpcyBjYW4gYmUgc2VlbiBhcyBkaXJlY3QgbG93LXBhc3MgZG93bnNhbXBsaW5nIGZyb20gdGhlIERDVCBkb21haW4KKyAqIHBvaW50IG9mIHZpZXcgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIHNwYXRpYWwgZG9tYWluIHBvaW50IG9mIHZpZXcsCisgKiB5aWVsZGluZyBzaWduaWZpY2FudCBjb21wdXRhdGlvbmFsIHNhdmluZ3MgYW5kIHJlc3VsdHMgYXQgbGVhc3QKKyAqIGFzIGdvb2QgYXMgY29tbW9uIGJpbGluZWFyIChhdmVyYWdpbmcpIHNwYXRpYWwgZG93bnNhbXBsaW5nLgorICoKKyAqIEZvciBOPjggd2UgYXBwbHkgYSBwYXJ0aWFsIE54TiBJRENUIG9uIHRoZSA4IGlucHV0IGNvZWZmaWNpZW50cyBhcworICogbG93ZXIgZnJlcXVlbmNpZXMgYW5kIGhpZ2hlciBmcmVxdWVuY2llcyBhc3N1bWVkIHRvIGJlIHplcm8uCisgKiBJdCB0dXJucyBvdXQgdGhhdCB0aGUgY29tcHV0YXRpb25hbCBlZmZvcnQgaXMgc2ltaWxhciB0byB0aGUgOHg4IElEQ1QKKyAqIHJlZ2FyZGluZyB0aGUgb3V0cHV0IHNpemUuCisgKiBGdXJ0aGVybW9yZSwgdGhlIHNjYWxpbmcgYW5kIGRlc2NhbGluZyBpcyB0aGUgc2FtZSBmb3IgYWxsIElEQ1Qgc2l6ZXMuCisgKgorICogQ0FVVElPTjogV2UgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8gZXhjZXB0IGZvciB0aGUgTj0xLDIsNCw4IGNhc2VzCisgKiBzaW5jZSB0aGVyZSB3b3VsZCBiZSB0b28gbWFueSBhZGRpdGlvbmFsIGNvbnN0YW50cyB0byBwcmUtY2FsY3VsYXRlLgogICovCiAKICNkZWZpbmUgSlBFR19JTlRFUk5BTFMKQEAgLTM4LDcgKzYxLDcgQEAKICAqLwogCiAjaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVCBibG9ja3MuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwogI2VuZGlmCiAKIApAQCAtMTUxLDcgKzE3NCw3IEBACiB7CiAgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7CisgIElOVDMyIHoxLCB6MiwgejM7CiAgIEpDT0VGUFRSIGlucHRyOwogICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKICAgaW50ICogd3NwdHI7CkBAIC0xNzcsNiArMjAwLDI2NTcgQEAKICAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCiAgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCiAgICAgICovCisKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjRdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo2XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOworCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7CisKKyAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgICAgcXVhbnRwdHIrKzsKKyAgICAgIHdzcHRyKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCisgICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KKyAgICAKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOworICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOworICAgIHRtcDMgPSB6MSAtIE1VTFRJUExZKHozLCBGSVhfMV84NDc3NTkwNjUpOworCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MiA8PD0gQ09OU1RfQklUUzsKKyAgICB6MyA8PD0gQ09OU1RfQklUUzsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejIgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICB0bXAwID0gejIgKyB6MzsKKyAgICB0bXAxID0gejIgLSB6MzsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMjsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAzOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDM7CisKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCisgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCisgICAgICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKKyAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICAKKyAgICB6MiA9IHRtcDAgKyB0bXAyOworICAgIHozID0gdG1wMSArIHRtcDM7CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIHoyICs9IHoxOworICAgIHozICs9IHoxOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgdG1wMCArPSB6MSArIHoyOworICAgIHRtcDMgKz0gejEgKyB6MzsKKworICAgIHoxID0gTVVMVElQTFkodG1wMSArIHRtcDIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXAxICs9IHoxICsgejM7CisgICAgdG1wMiArPSB6MSArIHoyOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLworCisgICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo2XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqNV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTMgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIAorICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIHF1YW50cHRyKys7CisgICAgd3NwdHIrKzsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisgIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLCAqLworICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCisgICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCisgICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCisgICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCisgICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCisgICAgICovCisKKyNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAorICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzJdID0gZGN2YWw7CisgICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls0XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzVdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls3XSA9IGRjdmFsOworCisgICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIAorICAgIHoyID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgdG1wMyA9IHoxIC0gTVVMVElQTFkoejMsIEZJWF8xXzg0Nzc1OTA2NSk7CisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzRdOworCisgICAgdG1wMCA9ICh6MiArIHozKSA8PCBDT05TVF9CSVRTOworICAgIHRtcDEgPSAoejIgLSB6MykgPDwgQ09OU1RfQklUUzsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDI7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMzsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAzOworCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cworICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgorICAgICAqLworCisgICAgdG1wMCA9IChJTlQzMikgd3NwdHJbN107CisgICAgdG1wMSA9IChJTlQzMikgd3NwdHJbNV07CisgICAgdG1wMiA9IChJTlQzMikgd3NwdHJbM107CisgICAgdG1wMyA9IChJTlQzMikgd3NwdHJbMV07CisKKyAgICB6MiA9IHRtcDAgKyB0bXAyOworICAgIHozID0gdG1wMSArIHRtcDM7CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIHoyICs9IHoxOworICAgIHozICs9IHoxOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgdG1wMCArPSB6MSArIHoyOworICAgIHRtcDMgKz0gejEgKyB6MzsKKworICAgIHoxID0gTVVMVElQTFkodG1wMSArIHRtcDIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXAxICs9IHoxICsgejM7CisgICAgdG1wMiArPSB6MSArIHoyOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAzLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMywKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgLSB0bXAyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyICsgdG1wMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTMgKyB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEzIC0gdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgN3g3IG91dHB1dCBibG9jay4KKyAqCisgKiBPcHRpbWl6ZWQgYWxnb3JpdGhtIHdpdGggMTIgbXVsdGlwbGljYXRpb25zIGluIHRoZSAxLUQga2VybmVsLgorICogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTQpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0Xzd4NyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzcqN107CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDc7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMTMgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEzICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAxMCA9IE1VTFRJUExZKHoyIC0gejMsIEZJWCgwLjg4MTc0NzczNCkpOyAgICAgLyogYzQgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxIC0gejIsIEZJWCgwLjMxNDY5MjEyMykpOyAgICAgLyogYzYgKi8KKyAgICB0bXAxMSA9IHRtcDEwICsgdG1wMTIgKyB0bXAxMyAtIE1VTFRJUExZKHoyLCBGSVgoMS44NDEyMTgwMDMpKTsgLyogYzIrYzQtYzYgKi8KKyAgICB0bXAwID0gejEgKyB6MzsKKyAgICB6MiAtPSB0bXAwOworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVgoMS4yNzQxNjIzOTIpKSArIHRtcDEzOyAvKiBjMiAqLworICAgIHRtcDEwICs9IHRtcDAgLSBNVUxUSVBMWSh6MywgRklYKDAuMDc3NzIyNTM2KSk7ICAvKiBjMi1jNC1jNiAqLworICAgIHRtcDEyICs9IHRtcDAgLSBNVUxUSVBMWSh6MSwgRklYKDIuNDcwNjAyMjQ5KSk7ICAvKiBjMitjNCtjNiAqLworICAgIHRtcDEzICs9IE1VTFRJUExZKHoyLCBGSVgoMS40MTQyMTM1NjIpKTsgICAgICAgICAvKiBjMCAqLworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworCisgICAgdG1wMSA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgwLjkzNTQxNDM0NykpOyAgICAgIC8qIChjMytjMS1jNSkvMiAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh6MSAtIHoyLCBGSVgoMC4xNzAyNjIzMzkpKTsgICAgICAvKiAoYzMrYzUtYzEpLzIgKi8KKyAgICB0bXAwID0gdG1wMSAtIHRtcDI7CisgICAgdG1wMSArPSB0bXAyOworICAgIHRtcDIgPSBNVUxUSVBMWSh6MiArIHozLCAtIEZJWCgxLjM3ODc1NjI3NikpOyAgICAvKiAtYzEgKi8KKyAgICB0bXAxICs9IHRtcDI7CisgICAgejIgPSBNVUxUSVBMWSh6MSArIHozLCBGSVgoMC42MTM2MDQyNjgpKTsgICAgICAgIC8qIGM1ICovCisgICAgdG1wMCArPSB6MjsKKyAgICB0bXAyICs9IHoyICsgTVVMVElQTFkoejMsIEZJWCgxLjg3MDgyODY5MykpOyAgICAgLyogYzMrYzEtYzUgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgd3NwdHJbNyowXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls3KjZdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzcqMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNyo1XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDExIC0gdG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls3KjJdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTIgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzcqNF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNyozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDcgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDc7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEzID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDEzIDw8PSBDT05TVF9CSVRTOworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHoyID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07CisKKyAgICB0bXAxMCA9IE1VTFRJUExZKHoyIC0gejMsIEZJWCgwLjg4MTc0NzczNCkpOyAgICAgLyogYzQgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxIC0gejIsIEZJWCgwLjMxNDY5MjEyMykpOyAgICAgLyogYzYgKi8KKyAgICB0bXAxMSA9IHRtcDEwICsgdG1wMTIgKyB0bXAxMyAtIE1VTFRJUExZKHoyLCBGSVgoMS44NDEyMTgwMDMpKTsgLyogYzIrYzQtYzYgKi8KKyAgICB0bXAwID0gejEgKyB6MzsKKyAgICB6MiAtPSB0bXAwOworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVgoMS4yNzQxNjIzOTIpKSArIHRtcDEzOyAvKiBjMiAqLworICAgIHRtcDEwICs9IHRtcDAgLSBNVUxUSVBMWSh6MywgRklYKDAuMDc3NzIyNTM2KSk7ICAvKiBjMi1jNC1jNiAqLworICAgIHRtcDEyICs9IHRtcDAgLSBNVUxUSVBMWSh6MSwgRklYKDIuNDcwNjAyMjQ5KSk7ICAvKiBjMitjNCtjNiAqLworICAgIHRtcDEzICs9IE1VTFRJUExZKHoyLCBGSVgoMS40MTQyMTM1NjIpKTsgICAgICAgICAvKiBjMCAqLworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxID0gKElOVDMyKSB3c3B0clsxXTsKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbM107CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzVdOworCisgICAgdG1wMSA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgwLjkzNTQxNDM0NykpOyAgICAgIC8qIChjMytjMS1jNSkvMiAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh6MSAtIHoyLCBGSVgoMC4xNzAyNjIzMzkpKTsgICAgICAvKiAoYzMrYzUtYzEpLzIgKi8KKyAgICB0bXAwID0gdG1wMSAtIHRtcDI7CisgICAgdG1wMSArPSB0bXAyOworICAgIHRtcDIgPSBNVUxUSVBMWSh6MiArIHozLCAtIEZJWCgxLjM3ODc1NjI3NikpOyAgICAvKiAtYzEgKi8KKyAgICB0bXAxICs9IHRtcDI7CisgICAgejIgPSBNVUxUSVBMWSh6MSArIHozLCBGSVgoMC42MTM2MDQyNjgpKTsgICAgICAgIC8qIGM1ICovCisgICAgdG1wMCArPSB6MjsKKyAgICB0bXAyICs9IHoyICsgTVVMVElQTFkoejMsIEZJWCgxLjg3MDgyODY5MykpOyAgICAgLyogYzMrYzEtYzUgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgLSB0bXAxLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyICsgdG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTMsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSA3OwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA2eDYgb3V0cHV0IGJsb2NrLgorICoKKyAqIE9wdGltaXplZCBhbGdvcml0aG0gd2l0aCAzIG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgMS1EIGtlcm5lbC4KKyAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzEyKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF82eDYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMTAsIHRtcDExLCB0bXAxMjsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzYqNl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDY7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMiwgRklYKDAuNzA3MTA2NzgxKSk7ICAgLyogYzQgKi8KKyAgICB0bXAxID0gdG1wMCArIHRtcDEwOworICAgIHRtcDExID0gUklHSFRfU0hJRlQodG1wMCAtIHRtcDEwIC0gdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgdG1wMTAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMCwgRklYKDEuMjI0NzQ0ODcxKSk7ICAgLyogYzIgKi8KKyAgICB0bXAxMCA9IHRtcDEgKyB0bXAwOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDA7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wMSA9IE1VTFRJUExZKHoxICsgejMsIEZJWCgwLjM2NjAyNTQwNCkpOyAvKiBjNSAqLworICAgIHRtcDAgPSB0bXAxICsgKCh6MSArIHoyKSA8PCBDT05TVF9CSVRTKTsKKyAgICB0bXAyID0gdG1wMSArICgoejMgLSB6MikgPDwgQ09OU1RfQklUUyk7CisgICAgdG1wMSA9ICh6MSAtIHoyIC0gejMpIDw8IFBBU1MxX0JJVFM7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzYqMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNio1XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls2KjFdID0gKGludCkgKHRtcDExICsgdG1wMSk7CisgICAgd3NwdHJbNio0XSA9IChpbnQpICh0bXAxMSAtIHRtcDEpOworICAgIHdzcHRyWzYqMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMiArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNiozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEyIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyA2IHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA2OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDAgPDw9IENPTlNUX0JJVFM7CisgICAgdG1wMiA9IChJTlQzMikgd3NwdHJbNF07CisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAyLCBGSVgoMC43MDcxMDY3ODEpKTsgICAvKiBjNCAqLworICAgIHRtcDEgPSB0bXAwICsgdG1wMTA7CisgICAgdG1wMTEgPSB0bXAwIC0gdG1wMTAgLSB0bXAxMDsKKyAgICB0bXAxMCA9IChJTlQzMikgd3NwdHJbMl07CisgICAgdG1wMCA9IE1VTFRJUExZKHRtcDEwLCBGSVgoMS4yMjQ3NDQ4NzEpKTsgICAvKiBjMiAqLworICAgIHRtcDEwID0gdG1wMSArIHRtcDA7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMDsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHozID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB0bXAxID0gTVVMVElQTFkoejEgKyB6MywgRklYKDAuMzY2MDI1NDA0KSk7IC8qIGM1ICovCisgICAgdG1wMCA9IHRtcDEgKyAoKHoxICsgejIpIDw8IENPTlNUX0JJVFMpOworICAgIHRtcDIgPSB0bXAxICsgKCh6MyAtIHoyKSA8PCBDT05TVF9CSVRTKTsKKyAgICB0bXAxID0gKHoxIC0gejIgLSB6MykgPDwgQ09OU1RfQklUUzsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgLSB0bXAxLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyICsgdG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSA2OwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA1eDUgb3V0cHV0IGJsb2NrLgorICoKKyAqIE9wdGltaXplZCBhbGdvcml0aG0gd2l0aCA1IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgMS1EIGtlcm5lbC4KKyAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzEwKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF81eDUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMTAsIHRtcDExLCB0bXAxMjsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzUqNV07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDU7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMTIgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEyICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHoxID0gTVVMVElQTFkodG1wMCArIHRtcDEsIEZJWCgwLjc5MDU2OTQxNSkpOyAvKiAoYzIrYzQpLzIgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDAgLSB0bXAxLCBGSVgoMC4zNTM1NTMzOTEpKTsgLyogKGMyLWM0KS8yICovCisgICAgejMgPSB0bXAxMiArIHoyOworICAgIHRtcDEwID0gejMgKyB6MTsKKyAgICB0bXAxMSA9IHozIC0gejE7CisgICAgdG1wMTIgLT0gejIgPDwgMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVgoMC44MzEyNTM4NzYpKTsgICAgIC8qIGMzICovCisgICAgdG1wMCA9IHoxICsgTVVMVElQTFkoejIsIEZJWCgwLjUxMzc0MzE0OCkpOyAgIC8qIGMxLWMzICovCisgICAgdG1wMSA9IHoxIC0gTVVMVElQTFkoejMsIEZJWCgyLjE3NjI1MDg5OSkpOyAgIC8qIGMxK2MzICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzUqMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNSo0XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls1KjFdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTEgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzUqM10gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSAtIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNSoyXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDUgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDU7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEyID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDEyIDw8PSBDT05TVF9CSVRTOworICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHRtcDEgPSAoSU5UMzIpIHdzcHRyWzRdOworICAgIHoxID0gTVVMVElQTFkodG1wMCArIHRtcDEsIEZJWCgwLjc5MDU2OTQxNSkpOyAvKiAoYzIrYzQpLzIgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDAgLSB0bXAxLCBGSVgoMC4zNTM1NTMzOTEpKTsgLyogKGMyLWM0KS8yICovCisgICAgejMgPSB0bXAxMiArIHoyOworICAgIHRtcDEwID0gejMgKyB6MTsKKyAgICB0bXAxMSA9IHozIC0gejE7CisgICAgdG1wMTIgLT0gejIgPDwgMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzNdOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVgoMC44MzEyNTM4NzYpKTsgICAgIC8qIGMzICovCisgICAgdG1wMCA9IHoxICsgTVVMVElQTFkoejIsIEZJWCgwLjUxMzc0MzE0OCkpOyAgIC8qIGMxLWMzICovCisgICAgdG1wMSA9IHoxIC0gTVVMVElQTFkoejMsIEZJWCgyLjE3NjI1MDg5OSkpOyAgIC8qIGMxK2MzICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgKyB0bXAxLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDExIC0gdG1wMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDR4NCBvdXRwdXQgYmxvY2suCisgKgorICogT3B0aW1pemVkIGFsZ29yaXRobSB3aXRoIDMgbXVsdGlwbGljYXRpb25zIGluIHRoZSAxLUQga2VybmVsLgorICogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTYpIFtyZWZlcnMgdG8gOC1wb2ludCBJRENUXS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMiwgdG1wMTAsIHRtcDEyOworICBJTlQzMiB6MSwgejIsIHozOworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbNCo0XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyssIGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIAorICAgIHRtcDEwID0gKHRtcDAgKyB0bXAyKSA8PCBQQVNTMV9CSVRTOworICAgIHRtcDEyID0gKHRtcDAgLSB0bXAyKSA8PCBQQVNTMV9CSVRTOworCisgICAgLyogT2RkIHBhcnQgKi8KKyAgICAvKiBTYW1lIHJvdGF0aW9uIGFzIGluIHRoZSBldmVuIHBhcnQgb2YgdGhlIDh4OCBMTCZNIElEQ1QgKi8KKworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7ICAgICAgICAgICAgICAgLyogYzYgKi8KKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejEgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisgICAgdG1wMCA9IFJJR0hUX1NISUZUKHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSksIC8qIGMyLWM2ICovCisJCSAgICAgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHRtcDIgPSBSSUdIVF9TSElGVCh6MSAtIE1VTFRJUExZKHozLCBGSVhfMV84NDc3NTkwNjUpLCAvKiBjMitjNiAqLworCQkgICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgd3NwdHJbNCowXSA9IChpbnQpICh0bXAxMCArIHRtcDApOworICAgIHdzcHRyWzQqM10gPSAoaW50KSAodG1wMTAgLSB0bXAwKTsKKyAgICB3c3B0cls0KjFdID0gKGludCkgKHRtcDEyICsgdG1wMik7CisgICAgd3NwdHJbNCoyXSA9IChpbnQpICh0bXAxMiAtIHRtcDIpOworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgdG1wMiA9IChJTlQzMikgd3NwdHJbMl07CisKKyAgICB0bXAxMCA9ICh0bXAwICsgdG1wMikgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxMiA9ICh0bXAwIC0gdG1wMikgPDwgQ09OU1RfQklUUzsKKworICAgIC8qIE9kZCBwYXJ0ICovCisgICAgLyogU2FtZSByb3RhdGlvbiBhcyBpbiB0aGUgZXZlbiBwYXJ0IG9mIHRoZSA4eDggTEwmTSBJRENUICovCisKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzNdOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOyAgIC8qIGM2ICovCisgICAgdG1wMCA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7IC8qIGMyLWM2ICovCisgICAgdG1wMiA9IHoxIC0gTVVMVElQTFkoejMsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIGMyK2M2ICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTIgKyB0bXAyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyIC0gdG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDQ7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDN4MyBvdXRwdXQgYmxvY2suCisgKgorICogT3B0aW1pemVkIGFsZ29yaXRobSB3aXRoIDIgbXVsdGlwbGljYXRpb25zIGluIHRoZSAxLUQga2VybmVsLgorICogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvNikuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfM3gzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDIsIHRtcDEwLCB0bXAxMjsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzMqM107CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDM7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMiwgRklYKDAuNzA3MTA2NzgxKSk7IC8qIGMyICovCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDAgLSB0bXAxMiAtIHRtcDEyOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMTIsIEZJWCgxLjIyNDc0NDg3MSkpOyAvKiBjMSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0clszKjBdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzMqMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbMyoxXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgMyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMzsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMCA9IChJTlQzMikgd3NwdHJbMF0gKyAoT05FIDw8IChQQVNTMV9CSVRTKzIpKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworICAgIHRtcDIgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMiwgRklYKDAuNzA3MTA2NzgxKSk7IC8qIGMyICovCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDAgLSB0bXAxMiAtIHRtcDEyOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEyID0gKElOVDMyKSB3c3B0clsxXTsKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMTIsIEZJWCgxLjIyNDc0NDg3MSkpOyAvKiBjMSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSAzOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSAyeDIgb3V0cHV0IGJsb2NrLgorICoKKyAqIE11bHRpcGxpY2F0aW9uLWxlc3MgYWxnb3JpdGhtLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzJ4MiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQuICovCisKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKworICAvKiBDb2x1bW4gMCAqLworICB0bXA0ID0gREVRVUFOVElaRShjb2VmX2Jsb2NrW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICB0bXA1ID0gREVRVUFOVElaRShjb2VmX2Jsb2NrW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgIHRtcDQgKz0gT05FIDw8IDI7CisKKyAgdG1wMCA9IHRtcDQgKyB0bXA1OworICB0bXAyID0gdG1wNCAtIHRtcDU7CisKKyAgLyogQ29sdW1uIDEgKi8KKyAgdG1wNCA9IERFUVVBTlRJWkUoY29lZl9ibG9ja1tEQ1RTSVpFKjArMV0sIHF1YW50cHRyW0RDVFNJWkUqMCsxXSk7CisgIHRtcDUgPSBERVFVQU5USVpFKGNvZWZfYmxvY2tbRENUU0laRSoxKzFdLCBxdWFudHB0cltEQ1RTSVpFKjErMV0pOworCisgIHRtcDEgPSB0bXA0ICsgdG1wNTsKKyAgdG1wMyA9IHRtcDQgLSB0bXA1OworCisgIC8qIFBhc3MgMjogcHJvY2VzcyAyIHJvd3MsIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIC8qIFJvdyAwICovCisgIG91dHB0ciA9IG91dHB1dF9idWZbMF0gKyBvdXRwdXRfY29sOworCisgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDAgKyB0bXAxLCAzKSAmIFJBTkdFX01BU0tdOworICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAwIC0gdG1wMSwgMykgJiBSQU5HRV9NQVNLXTsKKworICAvKiBSb3cgMSAqLworICBvdXRwdHIgPSBvdXRwdXRfYnVmWzFdICsgb3V0cHV0X2NvbDsKKworICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyICsgdG1wMywgMykgJiBSQU5HRV9NQVNLXTsKKyAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMiAtIHRtcDMsIDMpICYgUkFOR0VfTUFTS107Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMXgxIG91dHB1dCBibG9jay4KKyAqCisgKiBXZSBoYXJkbHkgbmVlZCBhbiBpbnZlcnNlIERDVCByb3V0aW5lIGZvciB0aGlzOiBqdXN0IHRha2UgdGhlCisgKiBhdmVyYWdlIHBpeGVsIHZhbHVlLCB3aGljaCBpcyBvbmUtZWlnaHRoIG9mIHRoZSBEQyBjb2VmZmljaWVudC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xeDEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgaW50IGRjdmFsOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgU0hJRlRfVEVNUFMKKworICAvKiAxeDEgaXMgdHJpdmlhbDoganVzdCB0YWtlIHRoZSBEQyBjb2VmZmljaWVudCBkaXZpZGVkIGJ5IDguICovCisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIGRjdmFsID0gREVRVUFOVElaRShjb2VmX2Jsb2NrWzBdLCBxdWFudHB0clswXSk7CisgIGRjdmFsID0gKGludCkgREVTQ0FMRSgoSU5UMzIpIGRjdmFsLCAzKTsKKworICBvdXRwdXRfYnVmWzBdW291dHB1dF9jb2xdID0gcmFuZ2VfbGltaXRbZGN2YWwgJiBSQU5HRV9NQVNLXTsKK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIDl4OSBvdXRwdXQgYmxvY2suCisgKgorICogT3B0aW1pemVkIGFsZ29yaXRobSB3aXRoIDEwIG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgMS1EIGtlcm5lbC4KKyAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzE4KS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF85eDkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0OworICBJTlQzMiB6MSwgejIsIHozLCB6NDsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzgqOV07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAzID0gTVVMVElQTFkoejMsIEZJWCgwLjcwNzEwNjc4MSkpOyAgICAgIC8qIGM2ICovCisgICAgdG1wMSA9IHRtcDAgKyB0bXAzOworICAgIHRtcDIgPSB0bXAwIC0gdG1wMyAtIHRtcDM7CisKKyAgICB0bXAwID0gTVVMVElQTFkoejEgLSB6MiwgRklYKDAuNzA3MTA2NzgxKSk7IC8qIGM2ICovCisgICAgdG1wMTEgPSB0bXAyICsgdG1wMDsKKyAgICB0bXAxNCA9IHRtcDIgLSB0bXAwIC0gdG1wMDsKKworICAgIHRtcDAgPSBNVUxUSVBMWSh6MSArIHoyLCBGSVgoMS4zMjg5MjYwNDkpKTsgLyogYzIgKi8KKyAgICB0bXAyID0gTVVMVElQTFkoejEsIEZJWCgxLjA4MzM1MDQ0MSkpOyAgICAgIC8qIGM0ICovCisgICAgdG1wMyA9IE1VTFRJUExZKHoyLCBGSVgoMC4yNDU1NzU2MDgpKTsgICAgICAvKiBjOCAqLworCisgICAgdG1wMTAgPSB0bXAxICsgdG1wMCAtIHRtcDM7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMCArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAxIC0gdG1wMiArIHRtcDM7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMS4yMjQ3NDQ4NzEpKTsgICAgICAgICAgIC8qIC1jMyAqLworCisgICAgdG1wMiA9IE1VTFRJUExZKHoxICsgejMsIEZJWCgwLjkwOTAzODk1NSkpOyAgICAgIC8qIGM1ICovCisgICAgdG1wMyA9IE1VTFRJUExZKHoxICsgejQsIEZJWCgwLjQ4MzY4OTUyNSkpOyAgICAgIC8qIGM3ICovCisgICAgdG1wMCA9IHRtcDIgKyB0bXAzIC0gejI7CisgICAgdG1wMSA9IE1VTFRJUExZKHozIC0gejQsIEZJWCgxLjM5MjcyODQ4MSkpOyAgICAgIC8qIGMxICovCisgICAgdG1wMiArPSB6MiAtIHRtcDE7CisgICAgdG1wMyArPSB6MiArIHRtcDE7CisgICAgdG1wMSA9IE1VTFRJUExZKHoxIC0gejMgLSB6NCwgRklYKDEuMjI0NzQ0ODcxKSk7IC8qIGMzICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzgqMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo4XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjFdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTEgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqN10gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSAtIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoyXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEyICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjZdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTIgLSB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqM10gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMyArIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo1XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEzIC0gdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjRdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgOSByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgOTsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMCA9IChJTlQzMikgd3NwdHJbMF0gKyAoT05FIDw8IChQQVNTMV9CSVRTKzIpKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHoyID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07CisKKyAgICB0bXAzID0gTVVMVElQTFkoejMsIEZJWCgwLjcwNzEwNjc4MSkpOyAgICAgIC8qIGM2ICovCisgICAgdG1wMSA9IHRtcDAgKyB0bXAzOworICAgIHRtcDIgPSB0bXAwIC0gdG1wMyAtIHRtcDM7CisKKyAgICB0bXAwID0gTVVMVElQTFkoejEgLSB6MiwgRklYKDAuNzA3MTA2NzgxKSk7IC8qIGM2ICovCisgICAgdG1wMTEgPSB0bXAyICsgdG1wMDsKKyAgICB0bXAxNCA9IHRtcDIgLSB0bXAwIC0gdG1wMDsKKworICAgIHRtcDAgPSBNVUxUSVBMWSh6MSArIHoyLCBGSVgoMS4zMjg5MjYwNDkpKTsgLyogYzIgKi8KKyAgICB0bXAyID0gTVVMVElQTFkoejEsIEZJWCgxLjA4MzM1MDQ0MSkpOyAgICAgIC8qIGM0ICovCisgICAgdG1wMyA9IE1VTFRJUExZKHoyLCBGSVgoMC4yNDU1NzU2MDgpKTsgICAgICAvKiBjOCAqLworCisgICAgdG1wMTAgPSB0bXAxICsgdG1wMCAtIHRtcDM7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMCArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAxIC0gdG1wMiArIHRtcDM7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHoyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNV07CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzddOworCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMS4yMjQ3NDQ4NzEpKTsgICAgICAgICAgIC8qIC1jMyAqLworCisgICAgdG1wMiA9IE1VTFRJUExZKHoxICsgejMsIEZJWCgwLjkwOTAzODk1NSkpOyAgICAgIC8qIGM1ICovCisgICAgdG1wMyA9IE1VTFRJUExZKHoxICsgejQsIEZJWCgwLjQ4MzY4OTUyNSkpOyAgICAgIC8qIGM3ICovCisgICAgdG1wMCA9IHRtcDIgKyB0bXAzIC0gejI7CisgICAgdG1wMSA9IE1VTFRJUExZKHozIC0gejQsIEZJWCgxLjM5MjcyODQ4MSkpOyAgICAgIC8qIGMxICovCisgICAgdG1wMiArPSB6MiAtIHRtcDE7CisgICAgdG1wMyArPSB6MiArIHRtcDE7CisgICAgdG1wMSA9IE1VTFRJUExZKHoxIC0gejMgLSB6NCwgRklYKDEuMjI0NzQ0ODcxKSk7IC8qIGMzICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgKyB0bXAxLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDExIC0gdG1wMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiArIHRtcDIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTIgLSB0bXAyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEzICsgdG1wMywKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMyAtIHRtcDMsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTQsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSA4OwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIDEweDEwIG91dHB1dCBibG9jay4KKyAqCisgKiBPcHRpbWl6ZWQgYWxnb3JpdGhtIHdpdGggMTIgbXVsdGlwbGljYXRpb25zIGluIHRoZSAxLUQga2VybmVsLgorICogY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMjApLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzEweDEwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0OworICBJTlQzMiB0bXAyMCwgdG1wMjEsIHRtcDIyLCB0bXAyMywgdG1wMjQ7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0LCB6NTsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzgqMTBdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA4OyBjdHIrKywgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKykgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHozIDw8PSBDT05TVF9CSVRTOworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB6MyArPSBPTkUgPDwgKENPTlNUX0JJVFMtUEFTUzFfQklUUy0xKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7CisgICAgejEgPSBNVUxUSVBMWSh6NCwgRklYKDEuMTQ0MTIyODA2KSk7ICAgICAgICAgLyogYzQgKi8KKyAgICB6MiA9IE1VTFRJUExZKHo0LCBGSVgoMC40MzcwMTYwMjQpKTsgICAgICAgICAvKiBjOCAqLworICAgIHRtcDEwID0gejMgKyB6MTsKKyAgICB0bXAxMSA9IHozIC0gejI7CisKKyAgICB0bXAyMiA9IFJJR0hUX1NISUZUKHozIC0gKCh6MSAtIHoyKSA8PCAxKSwgICAvKiBjMCA9IChjNC1jOCkqMiAqLworCQkJQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWCgwLjgzMTI1Mzg3NikpOyAgICAvKiBjNiAqLworICAgIHRtcDEyID0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDAuNTEzNzQzMTQ4KSk7IC8qIGMyLWM2ICovCisgICAgdG1wMTMgPSB6MSAtIE1VTFRJUExZKHozLCBGSVgoMi4xNzYyNTA4OTkpKTsgLyogYzIrYzYgKi8KKworICAgIHRtcDIwID0gdG1wMTAgKyB0bXAxMjsKKyAgICB0bXAyNCA9IHRtcDEwIC0gdG1wMTI7CisgICAgdG1wMjEgPSB0bXAxMSArIHRtcDEzOworICAgIHRtcDIzID0gdG1wMTEgLSB0bXAxMzsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisKKyAgICB0bXAxMSA9IHoyICsgejQ7CisgICAgdG1wMTMgPSB6MiAtIHo0OworCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxMywgRklYKDAuMzA5MDE2OTk0KSk7ICAgICAgICAvKiAoYzMtYzcpLzIgKi8KKyAgICB6NSA9IHozIDw8IENPTlNUX0JJVFM7CisKKyAgICB6MiA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC45NTEwNTY1MTYpKTsgICAgICAgICAgIC8qIChjMytjNykvMiAqLworICAgIHo0ID0gejUgKyB0bXAxMjsKKworICAgIHRtcDEwID0gTVVMVElQTFkoejEsIEZJWCgxLjM5NjgwMjI0NykpICsgejIgKyB6NDsgLyogYzEgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHoxLCBGSVgoMC4yMjEyMzE3NDIpKSAtIHoyICsgejQ7IC8qIGM5ICovCisKKyAgICB6MiA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC41ODc3ODUyNTIpKTsgICAgICAgICAgIC8qIChjMS1jOSkvMiAqLworICAgIHo0ID0gejUgLSB0bXAxMiAtICh0bXAxMyA8PCAoQ09OU1RfQklUUyAtIDEpKTsKKworICAgIHRtcDEyID0gKHoxIC0gdG1wMTMgLSB6MykgPDwgUEFTUzFfQklUUzsKKworICAgIHRtcDExID0gTVVMVElQTFkoejEsIEZJWCgxLjI2MDA3MzUxMSkpIC0gejIgLSB6NDsgLyogYzMgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHoxLCBGSVgoMC42NDIwMzk1MjIpKSAtIHoyICsgejQ7IC8qIGM3ICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzgqMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCArIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqOV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqOF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMSAtIHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMl0gPSAoaW50KSAodG1wMjIgKyB0bXAxMik7CisgICAgd3NwdHJbOCo3XSA9IChpbnQpICh0bXAyMiAtIHRtcDEyKTsKKyAgICB3c3B0cls4KjNdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjZdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjMgLSB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjRdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgKyB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjVdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyAxMCByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMTA7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHozID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHozIDw8PSBDT05TVF9CSVRTOworICAgIHo0ID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB6MSA9IE1VTFRJUExZKHo0LCBGSVgoMS4xNDQxMjI4MDYpKTsgICAgICAgICAvKiBjNCAqLworICAgIHoyID0gTVVMVElQTFkoejQsIEZJWCgwLjQzNzAxNjAyNCkpOyAgICAgICAgIC8qIGM4ICovCisgICAgdG1wMTAgPSB6MyArIHoxOworICAgIHRtcDExID0gejMgLSB6MjsKKworICAgIHRtcDIyID0gejMgLSAoKHoxIC0gejIpIDw8IDEpOyAgICAgICAgICAgICAgIC8qIGMwID0gKGM0LWM4KSoyICovCisKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzZdOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVgoMC44MzEyNTM4NzYpKTsgICAgLyogYzYgKi8KKyAgICB0bXAxMiA9IHoxICsgTVVMVElQTFkoejIsIEZJWCgwLjUxMzc0MzE0OCkpOyAvKiBjMi1jNiAqLworICAgIHRtcDEzID0gejEgLSBNVUxUSVBMWSh6MywgRklYKDIuMTc2MjUwODk5KSk7IC8qIGMyK2M2ICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTI7CisgICAgdG1wMjQgPSB0bXAxMCAtIHRtcDEyOworICAgIHRtcDIxID0gdG1wMTEgKyB0bXAxMzsKKyAgICB0bXAyMyA9IHRtcDExIC0gdG1wMTM7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHoyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNV07CisgICAgejMgPDw9IENPTlNUX0JJVFM7CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzddOworCisgICAgdG1wMTEgPSB6MiArIHo0OworICAgIHRtcDEzID0gejIgLSB6NDsKKworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTMsIEZJWCgwLjMwOTAxNjk5NCkpOyAgICAgICAgLyogKGMzLWM3KS8yICovCisKKyAgICB6MiA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC45NTEwNTY1MTYpKTsgICAgICAgICAgIC8qIChjMytjNykvMiAqLworICAgIHo0ID0gejMgKyB0bXAxMjsKKworICAgIHRtcDEwID0gTVVMVElQTFkoejEsIEZJWCgxLjM5NjgwMjI0NykpICsgejIgKyB6NDsgLyogYzEgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHoxLCBGSVgoMC4yMjEyMzE3NDIpKSAtIHoyICsgejQ7IC8qIGM5ICovCisKKyAgICB6MiA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC41ODc3ODUyNTIpKTsgICAgICAgICAgIC8qIChjMS1jOSkvMiAqLworICAgIHo0ID0gejMgLSB0bXAxMiAtICh0bXAxMyA8PCAoQ09OU1RfQklUUyAtIDEpKTsKKworICAgIHRtcDEyID0gKCh6MSAtIHRtcDEzKSA8PCBDT05TVF9CSVRTKSAtIHozOworCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6MSwgRklYKDEuMjYwMDczNTExKSkgLSB6MiAtIHo0OyAvKiBjMyAqLworICAgIHRtcDEzID0gTVVMVElQTFkoejEsIEZJWCgwLjY0MjAzOTUyMikpIC0gejIgKyB6NDsgLyogYzcgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxICsgdG1wMTEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzhdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAxMywKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0ICsgdG1wMTQsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDg7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgMTF4MTEgb3V0cHV0IGJsb2NrLgorICoKKyAqIE9wdGltaXplZCBhbGdvcml0aG0gd2l0aCAyNCBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIDEtRCBrZXJuZWwuCisgKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yMikuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfMTF4MTEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQ7CisgIElOVDMyIHRtcDIwLCB0bXAyMSwgdG1wMjIsIHRtcDIzLCB0bXAyNCwgdG1wMjU7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCoxMV07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMTAgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAyMCA9IE1VTFRJUExZKHoyIC0gejMsIEZJWCgyLjU0NjY0MDEzMikpOyAgICAgLyogYzIrYzQgKi8KKyAgICB0bXAyMyA9IE1VTFRJUExZKHoyIC0gejEsIEZJWCgwLjQzMDgxNTA0NSkpOyAgICAgLyogYzItYzYgKi8KKyAgICB6NCA9IHoxICsgejM7CisgICAgdG1wMjQgPSBNVUxUSVBMWSh6NCwgLSBGSVgoMS4xNTU2NjQ0MDIpKTsgICAgICAgIC8qIC0oYzItYzEwKSAqLworICAgIHo0IC09IHoyOworICAgIHRtcDI1ID0gdG1wMTAgKyBNVUxUSVBMWSh6NCwgRklYKDEuMzU2OTI3OTc2KSk7ICAvKiBjMiAqLworICAgIHRtcDIxID0gdG1wMjAgKyB0bXAyMyArIHRtcDI1IC0KKwkgICAgTVVMVElQTFkoejIsIEZJWCgxLjgyMTc5MDc3NSkpOyAgICAgICAgICAvKiBjMitjNCtjMTAtYzYgKi8KKyAgICB0bXAyMCArPSB0bXAyNSArIE1VTFRJUExZKHozLCBGSVgoMi4xMTU4MjUwODcpKTsgLyogYzQrYzYgKi8KKyAgICB0bXAyMyArPSB0bXAyNSAtIE1VTFRJUExZKHoxLCBGSVgoMS41MTM1OTg0NzcpKTsgLyogYzYrYzggKi8KKyAgICB0bXAyNCArPSB0bXAyNTsKKyAgICB0bXAyMiA9IHRtcDI0IC0gTVVMVElQTFkoejMsIEZJWCgwLjc4ODc0OTEyMCkpOyAgLyogYzgrYzEwICovCisgICAgdG1wMjQgKz0gTVVMVElQTFkoejIsIEZJWCgxLjk0NDQxMzUyMikpIC0gICAgICAgIC8qIGMyK2M4ICovCisJICAgICBNVUxUSVBMWSh6MSwgRklYKDEuMzkwOTc1NzMwKSk7ICAgICAgICAgLyogYzQrYzEwICovCisgICAgdG1wMjUgPSB0bXAxMCAtIE1VTFRJUExZKHo0LCBGSVgoMS40MTQyMTM1NjIpKTsgIC8qIGMwICovCisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgdG1wMTEgPSB6MSArIHoyOworICAgIHRtcDE0ID0gTVVMVElQTFkodG1wMTEgKyB6MyArIHo0LCBGSVgoMC4zOTg0MzAwMDMpKTsgLyogYzkgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC44ODc5ODM5MDIpKTsgICAgICAgICAgIC8qIGMzLWM5ICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MSArIHozLCBGSVgoMC42NzAzNjEyOTUpKTsgICAgICAgICAvKiBjNS1jOSAqLworICAgIHRtcDEzID0gdG1wMTQgKyBNVUxUSVBMWSh6MSArIHo0LCBGSVgoMC4zNjYxNTE1NzQpKTsgLyogYzctYzkgKi8KKyAgICB0bXAxMCA9IHRtcDExICsgdG1wMTIgKyB0bXAxMyAtCisJICAgIE1VTFRJUExZKHoxLCBGSVgoMC45MjMxMDc4NjYpKTsgICAgICAgICAgICAgIC8qIGM3K2M1K2MzLWMxLTIqYzkgKi8KKyAgICB6MSAgICA9IHRtcDE0IC0gTVVMVElQTFkoejIgKyB6MywgRklYKDEuMTYzMDExNTc5KSk7IC8qIGM3K2M5ICovCisgICAgdG1wMTEgKz0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDIuMDczMjc2NTg4KSk7ICAgICAgICAvKiBjMStjNyszKmM5LWMzICovCisgICAgdG1wMTIgKz0gejEgLSBNVUxUSVBMWSh6MywgRklYKDEuMTkyMTkzNjIzKSk7ICAgICAgICAvKiBjMytjNS1jNy1jOSAqLworICAgIHoxICAgID0gTVVMVElQTFkoejIgKyB6NCwgLSBGSVgoMS43OTgyNDg5MTApKTsgICAgICAgLyogLShjMStjOSkgKi8KKyAgICB0bXAxMSArPSB6MTsKKyAgICB0bXAxMyArPSB6MSArIE1VTFRJUExZKHo0LCBGSVgoMi4xMDI0NTg2MzIpKTsgICAgICAgIC8qIGMxK2M1K2M5LWM3ICovCisgICAgdG1wMTQgKz0gTVVMVElQTFkoejIsIC0gRklYKDEuNDY3MjIxMzAxKSkgKyAgICAgICAgICAvKiAtKGM1K2M5KSAqLworCSAgICAgTVVMVElQTFkoejMsIEZJWCgxLjAwMTM4ODkwNSkpIC0gICAgICAgICAgICAvKiBjMS1jOSAqLworCSAgICAgTVVMVElQTFkoejQsIEZJWCgxLjY4NDg0MzkwNykpOyAgICAgICAgICAgICAvKiBjMytjOSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls4KjBdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjldICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoyXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqOF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjNdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo3XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgKyB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjZdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo1XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyAxMSByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMTE7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEwID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDEwIDw8PSBDT05TVF9CSVRTOworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHoyID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07CisKKyAgICB0bXAyMCA9IE1VTFRJUExZKHoyIC0gejMsIEZJWCgyLjU0NjY0MDEzMikpOyAgICAgLyogYzIrYzQgKi8KKyAgICB0bXAyMyA9IE1VTFRJUExZKHoyIC0gejEsIEZJWCgwLjQzMDgxNTA0NSkpOyAgICAgLyogYzItYzYgKi8KKyAgICB6NCA9IHoxICsgejM7CisgICAgdG1wMjQgPSBNVUxUSVBMWSh6NCwgLSBGSVgoMS4xNTU2NjQ0MDIpKTsgICAgICAgIC8qIC0oYzItYzEwKSAqLworICAgIHo0IC09IHoyOworICAgIHRtcDI1ID0gdG1wMTAgKyBNVUxUSVBMWSh6NCwgRklYKDEuMzU2OTI3OTc2KSk7ICAvKiBjMiAqLworICAgIHRtcDIxID0gdG1wMjAgKyB0bXAyMyArIHRtcDI1IC0KKwkgICAgTVVMVElQTFkoejIsIEZJWCgxLjgyMTc5MDc3NSkpOyAgICAgICAgICAvKiBjMitjNCtjMTAtYzYgKi8KKyAgICB0bXAyMCArPSB0bXAyNSArIE1VTFRJUExZKHozLCBGSVgoMi4xMTU4MjUwODcpKTsgLyogYzQrYzYgKi8KKyAgICB0bXAyMyArPSB0bXAyNSAtIE1VTFRJUExZKHoxLCBGSVgoMS41MTM1OTg0NzcpKTsgLyogYzYrYzggKi8KKyAgICB0bXAyNCArPSB0bXAyNTsKKyAgICB0bXAyMiA9IHRtcDI0IC0gTVVMVElQTFkoejMsIEZJWCgwLjc4ODc0OTEyMCkpOyAgLyogYzgrYzEwICovCisgICAgdG1wMjQgKz0gTVVMVElQTFkoejIsIEZJWCgxLjk0NDQxMzUyMikpIC0gICAgICAgIC8qIGMyK2M4ICovCisJICAgICBNVUxUSVBMWSh6MSwgRklYKDEuMzkwOTc1NzMwKSk7ICAgICAgICAgLyogYzQrYzEwICovCisgICAgdG1wMjUgPSB0bXAxMCAtIE1VTFRJUExZKHo0LCBGSVgoMS40MTQyMTM1NjIpKTsgIC8qIGMwICovCisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHoyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNV07CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzddOworCisgICAgdG1wMTEgPSB6MSArIHoyOworICAgIHRtcDE0ID0gTVVMVElQTFkodG1wMTEgKyB6MyArIHo0LCBGSVgoMC4zOTg0MzAwMDMpKTsgLyogYzkgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC44ODc5ODM5MDIpKTsgICAgICAgICAgIC8qIGMzLWM5ICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MSArIHozLCBGSVgoMC42NzAzNjEyOTUpKTsgICAgICAgICAvKiBjNS1jOSAqLworICAgIHRtcDEzID0gdG1wMTQgKyBNVUxUSVBMWSh6MSArIHo0LCBGSVgoMC4zNjYxNTE1NzQpKTsgLyogYzctYzkgKi8KKyAgICB0bXAxMCA9IHRtcDExICsgdG1wMTIgKyB0bXAxMyAtCisJICAgIE1VTFRJUExZKHoxLCBGSVgoMC45MjMxMDc4NjYpKTsgICAgICAgICAgICAgIC8qIGM3K2M1K2MzLWMxLTIqYzkgKi8KKyAgICB6MSAgICA9IHRtcDE0IC0gTVVMVElQTFkoejIgKyB6MywgRklYKDEuMTYzMDExNTc5KSk7IC8qIGM3K2M5ICovCisgICAgdG1wMTEgKz0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDIuMDczMjc2NTg4KSk7ICAgICAgICAvKiBjMStjNyszKmM5LWMzICovCisgICAgdG1wMTIgKz0gejEgLSBNVUxUSVBMWSh6MywgRklYKDEuMTkyMTkzNjIzKSk7ICAgICAgICAvKiBjMytjNS1jNy1jOSAqLworICAgIHoxICAgID0gTVVMVElQTFkoejIgKyB6NCwgLSBGSVgoMS43OTgyNDg5MTApKTsgICAgICAgLyogLShjMStjOSkgKi8KKyAgICB0bXAxMSArPSB6MTsKKyAgICB0bXAxMyArPSB6MSArIE1VTFRJUExZKHo0LCBGSVgoMi4xMDI0NTg2MzIpKTsgICAgICAgIC8qIGMxK2M1K2M5LWM3ICovCisgICAgdG1wMTQgKz0gTVVMVElQTFkoejIsIC0gRklYKDEuNDY3MjIxMzAxKSkgKyAgICAgICAgICAvKiAtKGM1K2M5KSAqLworCSAgICAgTVVMVElQTFkoejMsIEZJWCgxLjAwMTM4ODkwNSkpIC0gICAgICAgICAgICAvKiBjMS1jOSAqLworCSAgICAgTVVMVElQTFkoejQsIEZJWCgxLjY4NDg0MzkwNykpOyAgICAgICAgICAgICAvKiBjMytjOSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxICsgdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzhdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0ICsgdG1wMTQsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworCisgICAgd3NwdHIgKz0gODsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSAxMngxMiBvdXRwdXQgYmxvY2suCisgKgorICogT3B0aW1pemVkIGFsZ29yaXRobSB3aXRoIDE1IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgMS1EIGtlcm5lbC4KKyAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzI0KS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xMngxMiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTU7CisgIElOVDMyIHRtcDIwLCB0bXAyMSwgdG1wMjIsIHRtcDIzLCB0bXAyNCwgdG1wMjU7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCoxMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgejMgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHozICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHo0ID0gTVVMVElQTFkoejQsIEZJWCgxLjIyNDc0NDg3MSkpOyAvKiBjNCAqLworCisgICAgdG1wMTAgPSB6MyArIHo0OworICAgIHRtcDExID0gejMgLSB6NDsKKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6NCA9IE1VTFRJUExZKHoxLCBGSVgoMS4zNjYwMjU0MDQpKTsgLyogYzIgKi8KKyAgICB6MSA8PD0gQ09OU1RfQklUUzsKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisgICAgejIgPDw9IENPTlNUX0JJVFM7CisKKyAgICB0bXAxMiA9IHoxIC0gejI7CisKKyAgICB0bXAyMSA9IHozICsgdG1wMTI7CisgICAgdG1wMjQgPSB6MyAtIHRtcDEyOworCisgICAgdG1wMTIgPSB6NCArIHoyOworCisgICAgdG1wMjAgPSB0bXAxMCArIHRtcDEyOworICAgIHRtcDI1ID0gdG1wMTAgLSB0bXAxMjsKKworICAgIHRtcDEyID0gejQgLSB6MSAtIHoyOworCisgICAgdG1wMjIgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIzID0gdG1wMTEgLSB0bXAxMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisKKyAgICB0bXAxMSA9IE1VTFRJUExZKHoyLCBGSVgoMS4zMDY1NjI5NjUpKTsgICAgICAgICAgICAgICAgICAvKiBjMyAqLworICAgIHRtcDE0ID0gTVVMVElQTFkoejIsIC0gRklYXzBfNTQxMTk2MTAwKTsgICAgICAgICAgICAgICAgIC8qIC1jOSAqLworCisgICAgdG1wMTAgPSB6MSArIHozOworICAgIHRtcDE1ID0gTVVMVElQTFkodG1wMTAgKyB6NCwgRklYKDAuODYwOTE4NjY5KSk7ICAgICAgICAgIC8qIGM3ICovCisgICAgdG1wMTIgPSB0bXAxNSArIE1VTFRJUExZKHRtcDEwLCBGSVgoMC4yNjEwNTIzODQpKTsgICAgICAgLyogYzUtYzcgKi8KKyAgICB0bXAxMCA9IHRtcDEyICsgdG1wMTEgKyBNVUxUSVBMWSh6MSwgRklYKDAuMjgwMTQzNzE2KSk7ICAvKiBjMS1jNSAqLworICAgIHRtcDEzID0gTVVMVElQTFkoejMgKyB6NCwgLSBGSVgoMS4wNDU1MTA1ODApKTsgICAgICAgICAgIC8qIC0oYzcrYzExKSAqLworICAgIHRtcDEyICs9IHRtcDEzICsgdG1wMTQgLSBNVUxUSVBMWSh6MywgRklYKDEuNDc4NTc1MjQyKSk7IC8qIGMxK2M1LWM3LWMxMSAqLworICAgIHRtcDEzICs9IHRtcDE1IC0gdG1wMTEgKyBNVUxUSVBMWSh6NCwgRklYKDEuNTg2NzA2NjgxKSk7IC8qIGMxK2MxMSAqLworICAgIHRtcDE1ICs9IHRtcDE0IC0gTVVMVElQTFkoejEsIEZJWCgwLjY3NjMyNjc1OCkpIC0gICAgICAgIC8qIGM3LWMxMSAqLworCSAgICAgTVVMVElQTFkoejQsIEZJWCgxLjk4Mjg4OTcyMykpOyAgICAgICAgICAgICAgICAgLyogYzUrYzcgKi8KKworICAgIHoxIC09IHo0OworICAgIHoyIC09IHozOworICAgIHozID0gTVVMVElQTFkoejEgKyB6MiwgRklYXzBfNTQxMTk2MTAwKTsgICAgICAgICAgICAgICAgIC8qIGM5ICovCisgICAgdG1wMTEgPSB6MyArIE1VTFRJUExZKHoxLCBGSVhfMF83NjUzNjY4NjUpOyAgICAgICAgICAgICAgLyogYzMtYzkgKi8KKyAgICB0bXAxNCA9IHozIC0gTVVMVElQTFkoejIsIEZJWF8xXzg0Nzc1OTA2NSk7ICAgICAgICAgICAgICAvKiBjMytjOSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls4KjBdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjEwXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoyXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqOV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjNdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo4XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgKyB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjddICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo1XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSArIHRtcDE1LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNl0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjUgLSB0bXAxNSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyAxMiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMTI7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHozID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHozIDw8PSBDT05TVF9CSVRTOworCisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzRdOworICAgIHo0ID0gTVVMVElQTFkoejQsIEZJWCgxLjIyNDc0NDg3MSkpOyAvKiBjNCAqLworCisgICAgdG1wMTAgPSB6MyArIHo0OworICAgIHRtcDExID0gejMgLSB6NDsKKworICAgIHoxID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6NCA9IE1VTFRJUExZKHoxLCBGSVgoMS4zNjYwMjU0MDQpKTsgLyogYzIgKi8KKyAgICB6MSA8PD0gQ09OU1RfQklUUzsKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbNl07CisgICAgejIgPDw9IENPTlNUX0JJVFM7CisKKyAgICB0bXAxMiA9IHoxIC0gejI7CisKKyAgICB0bXAyMSA9IHozICsgdG1wMTI7CisgICAgdG1wMjQgPSB6MyAtIHRtcDEyOworCisgICAgdG1wMTIgPSB6NCArIHoyOworCisgICAgdG1wMjAgPSB0bXAxMCArIHRtcDEyOworICAgIHRtcDI1ID0gdG1wMTAgLSB0bXAxMjsKKworICAgIHRtcDEyID0gejQgLSB6MSAtIHoyOworCisgICAgdG1wMjIgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIzID0gdG1wMTEgLSB0bXAxMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHozID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbN107CisKKyAgICB0bXAxMSA9IE1VTFRJUExZKHoyLCBGSVgoMS4zMDY1NjI5NjUpKTsgICAgICAgICAgICAgICAgICAvKiBjMyAqLworICAgIHRtcDE0ID0gTVVMVElQTFkoejIsIC0gRklYXzBfNTQxMTk2MTAwKTsgICAgICAgICAgICAgICAgIC8qIC1jOSAqLworCisgICAgdG1wMTAgPSB6MSArIHozOworICAgIHRtcDE1ID0gTVVMVElQTFkodG1wMTAgKyB6NCwgRklYKDAuODYwOTE4NjY5KSk7ICAgICAgICAgIC8qIGM3ICovCisgICAgdG1wMTIgPSB0bXAxNSArIE1VTFRJUExZKHRtcDEwLCBGSVgoMC4yNjEwNTIzODQpKTsgICAgICAgLyogYzUtYzcgKi8KKyAgICB0bXAxMCA9IHRtcDEyICsgdG1wMTEgKyBNVUxUSVBMWSh6MSwgRklYKDAuMjgwMTQzNzE2KSk7ICAvKiBjMS1jNSAqLworICAgIHRtcDEzID0gTVVMVElQTFkoejMgKyB6NCwgLSBGSVgoMS4wNDU1MTA1ODApKTsgICAgICAgICAgIC8qIC0oYzcrYzExKSAqLworICAgIHRtcDEyICs9IHRtcDEzICsgdG1wMTQgLSBNVUxUSVBMWSh6MywgRklYKDEuNDc4NTc1MjQyKSk7IC8qIGMxK2M1LWM3LWMxMSAqLworICAgIHRtcDEzICs9IHRtcDE1IC0gdG1wMTEgKyBNVUxUSVBMWSh6NCwgRklYKDEuNTg2NzA2NjgxKSk7IC8qIGMxK2MxMSAqLworICAgIHRtcDE1ICs9IHRtcDE0IC0gTVVMVElQTFkoejEsIEZJWCgwLjY3NjMyNjc1OCkpIC0gICAgICAgIC8qIGM3LWMxMSAqLworCSAgICAgTVVMVElQTFkoejQsIEZJWCgxLjk4Mjg4OTcyMykpOyAgICAgICAgICAgICAgICAgLyogYzUrYzcgKi8KKworICAgIHoxIC09IHo0OworICAgIHoyIC09IHozOworICAgIHozID0gTVVMVElQTFkoejEgKyB6MiwgRklYXzBfNTQxMTk2MTAwKTsgICAgICAgICAgICAgICAgIC8qIGM5ICovCisgICAgdG1wMTEgPSB6MyArIE1VTFRJUExZKHoxLCBGSVhfMF83NjUzNjY4NjUpOyAgICAgICAgICAgICAgLyogYzMtYzkgKi8KKyAgICB0bXAxNCA9IHozIC0gTVVMVElQTFkoejIsIEZJWF8xXzg0Nzc1OTA2NSk7ICAgICAgICAgICAgICAvKiBjMytjOSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxICsgdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzldICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls4XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0ICsgdG1wMTQsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSArIHRtcDE1LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI1IC0gdG1wMTUsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDg7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgMTN4MTMgb3V0cHV0IGJsb2NrLgorICoKKyAqIE9wdGltaXplZCBhbGdvcml0aG0gd2l0aCAyOSBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIDEtRCBrZXJuZWwuCisgKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yNikuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfMTN4MTMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1OworICBJTlQzMiB0bXAyMCwgdG1wMjEsIHRtcDIyLCB0bXAyMywgdG1wMjQsIHRtcDI1LCB0bXAyNjsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQ7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVs4KjEzXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgODsgY3RyKyssIGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB6MSA8PD0gQ09OU1RfQklUUzsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejEgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHo0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKworICAgIHRtcDEwID0gejMgKyB6NDsKKyAgICB0bXAxMSA9IHozIC0gejQ7CisKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEwLCBGSVgoMS4xNTUzODg5ODYpKTsgICAgICAgICAgICAgICAgLyogKGM0K2M2KS8yICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAxMSwgRklYKDAuMDk2ODM0OTM0KSkgKyB6MTsgICAgICAgICAgIC8qIChjNC1jNikvMiAqLworCisgICAgdG1wMjAgPSBNVUxUSVBMWSh6MiwgRklYKDEuMzczMTE5MDg2KSkgKyB0bXAxMiArIHRtcDEzOyAgIC8qIGMyICovCisgICAgdG1wMjIgPSBNVUxUSVBMWSh6MiwgRklYKDAuNTAxNDg3MDQxKSkgLSB0bXAxMiArIHRtcDEzOyAgIC8qIGMxMCAqLworCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxMCwgRklYKDAuMzE2NDUwMTMxKSk7ICAgICAgICAgICAgICAgIC8qIChjOC1jMTIpLzIgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC40ODY5MTQ3MzkpKSArIHoxOyAgICAgICAgICAgLyogKGM4K2MxMikvMiAqLworCisgICAgdG1wMjEgPSBNVUxUSVBMWSh6MiwgRklYKDEuMDU4NTU0MDUyKSkgLSB0bXAxMiArIHRtcDEzOyAgIC8qIGM2ICovCisgICAgdG1wMjUgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMS4yNTIyMjM5MjApKSArIHRtcDEyICsgdG1wMTM7IC8qIGM0ICovCisKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEwLCBGSVgoMC40MzU4MTYwMjMpKTsgICAgICAgICAgICAgICAgLyogKGMyLWMxMCkvMiAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMTEsIEZJWCgwLjkzNzMwMzA2NCkpIC0gejE7ICAgICAgICAgICAvKiAoYzIrYzEwKS8yICovCisKKyAgICB0bXAyMyA9IE1VTFRJUExZKHoyLCAtIEZJWCgwLjE3MDQ2NDYwOCkpIC0gdG1wMTIgLSB0bXAxMzsgLyogYzEyICovCisgICAgdG1wMjQgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMC44MDMzNjQ4NjkpKSArIHRtcDEyIC0gdG1wMTM7IC8qIGM4ICovCisKKyAgICB0bXAyNiA9IE1VTFRJUExZKHRtcDExIC0gejIsIEZJWCgxLjQxNDIxMzU2MikpICsgejE7ICAgICAgLyogYzAgKi8KKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisKKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgxLjMyMjMxMjY1MSkpOyAgICAgLyogYzMgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxICsgejMsIEZJWCgxLjE2Mzg3NDk0NSkpOyAgICAgLyogYzUgKi8KKyAgICB0bXAxNSA9IHoxICsgejQ7CisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAxNSwgRklYKDAuOTM3Nzk3MDU3KSk7ICAgICAgIC8qIGM3ICovCisgICAgdG1wMTAgPSB0bXAxMSArIHRtcDEyICsgdG1wMTMgLQorCSAgICBNVUxUSVBMWSh6MSwgRklYKDIuMDIwMDgyMzAwKSk7ICAgICAgICAgIC8qIGM3K2M1K2MzLWMxICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh6MiArIHozLCAtIEZJWCgwLjMzODQ0MzQ1OCkpOyAgIC8qIC1jMTEgKi8KKyAgICB0bXAxMSArPSB0bXAxNCArIE1VTFRJUExZKHoyLCBGSVgoMC44MzcyMjM1NjQpKTsgLyogYzUrYzkrYzExLWMzICovCisgICAgdG1wMTIgKz0gdG1wMTQgLSBNVUxUSVBMWSh6MywgRklYKDEuNTcyMTE2MDI3KSk7IC8qIGMxK2M1LWM5LWMxMSAqLworICAgIHRtcDE0ID0gTVVMVElQTFkoejIgKyB6NCwgLSBGSVgoMS4xNjM4NzQ5NDUpKTsgICAvKiAtYzUgKi8KKyAgICB0bXAxMSArPSB0bXAxNDsKKyAgICB0bXAxMyArPSB0bXAxNCArIE1VTFRJUExZKHo0LCBGSVgoMi4yMDU2MDgzNTIpKTsgLyogYzMrYzUrYzktYzcgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHozICsgejQsIC0gRklYKDAuNjU3MjE3ODEzKSk7ICAgLyogLWM5ICovCisgICAgdG1wMTIgKz0gdG1wMTQ7CisgICAgdG1wMTMgKz0gdG1wMTQ7CisgICAgdG1wMTUgPSBNVUxUSVBMWSh0bXAxNSwgRklYKDAuMzM4NDQzNDU4KSk7ICAgICAgIC8qIGMxMSAqLworICAgIHRtcDE0ID0gdG1wMTUgKyBNVUxUSVBMWSh6MSwgRklYKDAuMzE4Nzc0MzU1KSkgLSAvKiBjOS1jMTEgKi8KKwkgICAgTVVMVElQTFkoejIsIEZJWCgwLjQ2NjEwNTI5NikpOyAgICAgICAgICAvKiBjMS1jNyAqLworICAgIHoxICAgID0gTVVMVElQTFkoejMgLSB6MiwgRklYKDAuOTM3Nzk3MDU3KSk7ICAgICAvKiBjNyAqLworICAgIHRtcDE0ICs9IHoxOworICAgIHRtcDE1ICs9IHoxICsgTVVMVElQTFkoejMsIEZJWCgwLjM4NDUxNTU5NSkpIC0gICAvKiBjMy1jNyAqLworCSAgICAgTVVMVElQTFkoejQsIEZJWCgxLjc0MjM0NTgxMSkpOyAgICAgICAgIC8qIGMxK2MxMSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls4KjBdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjExXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoyXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMTBdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjNdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo5XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgKyB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjhdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo1XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSArIHRtcDE1LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqN10gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjUgLSB0bXAxNSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjZdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI2LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDEzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAxMzsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgejEgPDw9IENPTlNUX0JJVFM7CisKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzRdOworICAgIHo0ID0gKElOVDMyKSB3c3B0cls2XTsKKworICAgIHRtcDEwID0gejMgKyB6NDsKKyAgICB0bXAxMSA9IHozIC0gejQ7CisKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEwLCBGSVgoMS4xNTUzODg5ODYpKTsgICAgICAgICAgICAgICAgLyogKGM0K2M2KS8yICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAxMSwgRklYKDAuMDk2ODM0OTM0KSkgKyB6MTsgICAgICAgICAgIC8qIChjNC1jNikvMiAqLworCisgICAgdG1wMjAgPSBNVUxUSVBMWSh6MiwgRklYKDEuMzczMTE5MDg2KSkgKyB0bXAxMiArIHRtcDEzOyAgIC8qIGMyICovCisgICAgdG1wMjIgPSBNVUxUSVBMWSh6MiwgRklYKDAuNTAxNDg3MDQxKSkgLSB0bXAxMiArIHRtcDEzOyAgIC8qIGMxMCAqLworCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxMCwgRklYKDAuMzE2NDUwMTMxKSk7ICAgICAgICAgICAgICAgIC8qIChjOC1jMTIpLzIgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC40ODY5MTQ3MzkpKSArIHoxOyAgICAgICAgICAgLyogKGM4K2MxMikvMiAqLworCisgICAgdG1wMjEgPSBNVUxUSVBMWSh6MiwgRklYKDEuMDU4NTU0MDUyKSkgLSB0bXAxMiArIHRtcDEzOyAgIC8qIGM2ICovCisgICAgdG1wMjUgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMS4yNTIyMjM5MjApKSArIHRtcDEyICsgdG1wMTM7IC8qIGM0ICovCisKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDEwLCBGSVgoMC40MzU4MTYwMjMpKTsgICAgICAgICAgICAgICAgLyogKGMyLWMxMCkvMiAqLworICAgIHRtcDEzID0gTVVMVElQTFkodG1wMTEsIEZJWCgwLjkzNzMwMzA2NCkpIC0gejE7ICAgICAgICAgICAvKiAoYzIrYzEwKS8yICovCisKKyAgICB0bXAyMyA9IE1VTFRJUExZKHoyLCAtIEZJWCgwLjE3MDQ2NDYwOCkpIC0gdG1wMTIgLSB0bXAxMzsgLyogYzEyICovCisgICAgdG1wMjQgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMC44MDMzNjQ4NjkpKSArIHRtcDEyIC0gdG1wMTM7IC8qIGM4ICovCisKKyAgICB0bXAyNiA9IE1VTFRJUExZKHRtcDExIC0gejIsIEZJWCgxLjQxNDIxMzU2MikpICsgejE7ICAgICAgLyogYzAgKi8KKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHozID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbN107CisKKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgxLjMyMjMxMjY1MSkpOyAgICAgLyogYzMgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxICsgejMsIEZJWCgxLjE2Mzg3NDk0NSkpOyAgICAgLyogYzUgKi8KKyAgICB0bXAxNSA9IHoxICsgejQ7CisgICAgdG1wMTMgPSBNVUxUSVBMWSh0bXAxNSwgRklYKDAuOTM3Nzk3MDU3KSk7ICAgICAgIC8qIGM3ICovCisgICAgdG1wMTAgPSB0bXAxMSArIHRtcDEyICsgdG1wMTMgLQorCSAgICBNVUxUSVBMWSh6MSwgRklYKDIuMDIwMDgyMzAwKSk7ICAgICAgICAgIC8qIGM3K2M1K2MzLWMxICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh6MiArIHozLCAtIEZJWCgwLjMzODQ0MzQ1OCkpOyAgIC8qIC1jMTEgKi8KKyAgICB0bXAxMSArPSB0bXAxNCArIE1VTFRJUExZKHoyLCBGSVgoMC44MzcyMjM1NjQpKTsgLyogYzUrYzkrYzExLWMzICovCisgICAgdG1wMTIgKz0gdG1wMTQgLSBNVUxUSVBMWSh6MywgRklYKDEuNTcyMTE2MDI3KSk7IC8qIGMxK2M1LWM5LWMxMSAqLworICAgIHRtcDE0ID0gTVVMVElQTFkoejIgKyB6NCwgLSBGSVgoMS4xNjM4NzQ5NDUpKTsgICAvKiAtYzUgKi8KKyAgICB0bXAxMSArPSB0bXAxNDsKKyAgICB0bXAxMyArPSB0bXAxNCArIE1VTFRJUExZKHo0LCBGSVgoMi4yMDU2MDgzNTIpKTsgLyogYzMrYzUrYzktYzcgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHozICsgejQsIC0gRklYKDAuNjU3MjE3ODEzKSk7ICAgLyogLWM5ICovCisgICAgdG1wMTIgKz0gdG1wMTQ7CisgICAgdG1wMTMgKz0gdG1wMTQ7CisgICAgdG1wMTUgPSBNVUxUSVBMWSh0bXAxNSwgRklYKDAuMzM4NDQzNDU4KSk7ICAgICAgIC8qIGMxMSAqLworICAgIHRtcDE0ID0gdG1wMTUgKyBNVUxUSVBMWSh6MSwgRklYKDAuMzE4Nzc0MzU1KSkgLSAvKiBjOS1jMTEgKi8KKwkgICAgTVVMVElQTFkoejIsIEZJWCgwLjQ2NjEwNTI5NikpOyAgICAgICAgICAvKiBjMS1jNyAqLworICAgIHoxICAgID0gTVVMVElQTFkoejMgLSB6MiwgRklYKDAuOTM3Nzk3MDU3KSk7ICAgICAvKiBjNyAqLworICAgIHRtcDE0ICs9IHoxOworICAgIHRtcDE1ICs9IHoxICsgTVVMVElQTFkoejMsIEZJWCgwLjM4NDUxNTU5NSkpIC0gICAvKiBjMy1jNyAqLworCSAgICAgTVVMVElQTFkoejQsIEZJWCgxLjc0MjM0NTgxMSkpOyAgICAgICAgIC8qIGMxK2MxMSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxICsgdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzEwXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls5XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzRdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0ICsgdG1wMTQsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSArIHRtcDE1LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzddICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI1IC0gdG1wMTUsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjYsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDg7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgMTR4MTQgb3V0cHV0IGJsb2NrLgorICoKKyAqIE9wdGltaXplZCBhbGdvcml0aG0gd2l0aCAyMCBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIDEtRCBrZXJuZWwuCisgKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yOCkuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfMTR4MTQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCB0bXAxNjsKKyAgSU5UMzIgdG1wMjAsIHRtcDIxLCB0bXAyMiwgdG1wMjMsIHRtcDI0LCB0bXAyNSwgdG1wMjY7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCoxNF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgejEgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHoxICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHo0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MiA9IE1VTFRJUExZKHo0LCBGSVgoMS4yNzQxNjIzOTIpKTsgICAgICAgICAvKiBjNCAqLworICAgIHozID0gTVVMVElQTFkoejQsIEZJWCgwLjMxNDY5MjEyMykpOyAgICAgICAgIC8qIGMxMiAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIEZJWCgwLjg4MTc0NzczNCkpOyAgICAgICAgIC8qIGM4ICovCisKKyAgICB0bXAxMCA9IHoxICsgejI7CisgICAgdG1wMTEgPSB6MSArIHozOworICAgIHRtcDEyID0gejEgLSB6NDsKKworICAgIHRtcDIzID0gUklHSFRfU0hJRlQoejEgLSAoKHoyICsgejMgLSB6NCkgPDwgMSksIC8qIGMwID0gKGM0K2MxMi1jOCkqMiAqLworCQkJQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB6MyA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgxLjEwNTY3NjY4NikpOyAgICAvKiBjNiAqLworCisgICAgdG1wMTMgPSB6MyArIE1VTFRJUExZKHoxLCBGSVgoMC4yNzMwNzk1OTApKTsgLyogYzItYzYgKi8KKyAgICB0bXAxNCA9IHozIC0gTVVMVElQTFkoejIsIEZJWCgxLjcxOTI4MDk1NCkpOyAvKiBjNitjMTAgKi8KKyAgICB0bXAxNSA9IE1VTFRJUExZKHoxLCBGSVgoMC42MTM2MDQyNjgpKSAtICAgICAvKiBjMTAgKi8KKwkgICAgTVVMVElQTFkoejIsIEZJWCgxLjM3ODc1NjI3NikpOyAgICAgIC8qIGMyICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMjYgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDIxID0gdG1wMTEgKyB0bXAxNDsKKyAgICB0bXAyNSA9IHRtcDExIC0gdG1wMTQ7CisgICAgdG1wMjIgPSB0bXAxMiArIHRtcDE1OworICAgIHRtcDI0ID0gdG1wMTIgLSB0bXAxNTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMTMgPSB6NCA8PCBDT05TVF9CSVRTOworCisgICAgdG1wMTQgPSB6MSArIHozOworICAgIHRtcDExID0gTVVMVElQTFkoejEgKyB6MiwgRklYKDEuMzM0ODUyNjA3KSk7ICAgICAgICAgICAvKiBjMyAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTQsIEZJWCgxLjE5NzQ0ODg0NikpOyAgICAgICAgICAgICAvKiBjNSAqLworICAgIHRtcDEwID0gdG1wMTEgKyB0bXAxMiArIHRtcDEzIC0gTVVMVElQTFkoejEsIEZJWCgxLjEyNjk4MDE2OSkpOyAvKiBjMytjNS1jMSAqLworICAgIHRtcDE0ID0gTVVMVElQTFkodG1wMTQsIEZJWCgwLjc1MjQwNjk3OCkpOyAgICAgICAgICAgICAvKiBjOSAqLworICAgIHRtcDE2ID0gdG1wMTQgLSBNVUxUSVBMWSh6MSwgRklYKDEuMDYxMTUwNDI2KSk7ICAgICAgICAvKiBjOStjMTEtYzEzICovCisgICAgejEgICAgLT0gejI7CisgICAgdG1wMTUgPSBNVUxUSVBMWSh6MSwgRklYKDAuNDY3MDg1MTI5KSkgLSB0bXAxMzsgICAgICAgIC8qIGMxMSAqLworICAgIHRtcDE2ICs9IHRtcDE1OworICAgIHoxICAgICs9IHo0OworICAgIHo0ICAgID0gTVVMVElQTFkoejIgKyB6MywgLSBGSVgoMC4xNTgzNDE2ODEpKSAtIHRtcDEzOyAvKiAtYzEzICovCisgICAgdG1wMTEgKz0gejQgLSBNVUxUSVBMWSh6MiwgRklYKDAuNDI0MTAzOTQ4KSk7ICAgICAgICAgIC8qIGMzLWM5LWMxMyAqLworICAgIHRtcDEyICs9IHo0IC0gTVVMVElQTFkoejMsIEZJWCgyLjM3Mzk1OTc3MykpOyAgICAgICAgICAvKiBjMytjNS1jMTMgKi8KKyAgICB6NCAgICA9IE1VTFRJUExZKHozIC0gejIsIEZJWCgxLjQwNTMyMTI4NCkpOyAgICAgICAgICAgLyogYzEgKi8KKyAgICB0bXAxNCArPSB6NCArIHRtcDEzIC0gTVVMVElQTFkoejMsIEZJWCgxLjY5MDY0MzEzMzQpKTsgLyogYzErYzktYzExICovCisgICAgdG1wMTUgKz0gejQgKyBNVUxUSVBMWSh6MiwgRklYKDAuNjc0OTU3NTY3KSk7ICAgICAgICAgIC8qIGMxK2MxMS1jNSAqLworCisgICAgdG1wMTMgPSAoejEgLSB6MykgPDwgUEFTUzFfQklUUzsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgd3NwdHJbOCowXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCArIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMTNdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjFdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIxICsgdG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMSAtIHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMl0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjExXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCozXSAgPSAoaW50KSAodG1wMjMgKyB0bXAxMyk7CisgICAgd3NwdHJbOCoxMF0gPSAoaW50KSAodG1wMjMgLSB0bXAxMyk7CisgICAgd3NwdHJbOCo0XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDE0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqOV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjVdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI1ICsgdG1wMTUsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo4XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDE1LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNl0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjYgKyB0bXAxNiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjddICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI2IC0gdG1wMTYsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgMTQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDE0OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMF0gKyAoT05FIDw8IChQQVNTMV9CSVRTKzIpKTsKKyAgICB6MSA8PD0gQ09OU1RfQklUUzsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbNF07CisgICAgejIgPSBNVUxUSVBMWSh6NCwgRklYKDEuMjc0MTYyMzkyKSk7ICAgICAgICAgLyogYzQgKi8KKyAgICB6MyA9IE1VTFRJUExZKHo0LCBGSVgoMC4zMTQ2OTIxMjMpKTsgICAgICAgICAvKiBjMTIgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCBGSVgoMC44ODE3NDc3MzQpKTsgICAgICAgICAvKiBjOCAqLworCisgICAgdG1wMTAgPSB6MSArIHoyOworICAgIHRtcDExID0gejEgKyB6MzsKKyAgICB0bXAxMiA9IHoxIC0gejQ7CisKKyAgICB0bXAyMyA9IHoxIC0gKCh6MiArIHozIC0gejQpIDw8IDEpOyAgICAgICAgICAvKiBjMCA9IChjNCtjMTItYzgpKjIgKi8KKworICAgIHoxID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbNl07CisKKyAgICB6MyA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgxLjEwNTY3NjY4NikpOyAgICAvKiBjNiAqLworCisgICAgdG1wMTMgPSB6MyArIE1VTFRJUExZKHoxLCBGSVgoMC4yNzMwNzk1OTApKTsgLyogYzItYzYgKi8KKyAgICB0bXAxNCA9IHozIC0gTVVMVElQTFkoejIsIEZJWCgxLjcxOTI4MDk1NCkpOyAvKiBjNitjMTAgKi8KKyAgICB0bXAxNSA9IE1VTFRJUExZKHoxLCBGSVgoMC42MTM2MDQyNjgpKSAtICAgICAvKiBjMTAgKi8KKwkgICAgTVVMVElQTFkoejIsIEZJWCgxLjM3ODc1NjI3NikpOyAgICAgIC8qIGMyICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMjYgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDIxID0gdG1wMTEgKyB0bXAxNDsKKyAgICB0bXAyNSA9IHRtcDExIC0gdG1wMTQ7CisgICAgdG1wMjIgPSB0bXAxMiArIHRtcDE1OworICAgIHRtcDI0ID0gdG1wMTIgLSB0bXAxNTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHozID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbN107CisgICAgejQgPDw9IENPTlNUX0JJVFM7CisKKyAgICB0bXAxNCA9IHoxICsgejM7CisgICAgdG1wMTEgPSBNVUxUSVBMWSh6MSArIHoyLCBGSVgoMS4zMzQ4NTI2MDcpKTsgICAgICAgICAgIC8qIGMzICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxNCwgRklYKDEuMTk3NDQ4ODQ2KSk7ICAgICAgICAgICAgIC8qIGM1ICovCisgICAgdG1wMTAgPSB0bXAxMSArIHRtcDEyICsgejQgLSBNVUxUSVBMWSh6MSwgRklYKDEuMTI2OTgwMTY5KSk7IC8qIGMzK2M1LWMxICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh0bXAxNCwgRklYKDAuNzUyNDA2OTc4KSk7ICAgICAgICAgICAgIC8qIGM5ICovCisgICAgdG1wMTYgPSB0bXAxNCAtIE1VTFRJUExZKHoxLCBGSVgoMS4wNjExNTA0MjYpKTsgICAgICAgIC8qIGM5K2MxMS1jMTMgKi8KKyAgICB6MSAgICAtPSB6MjsKKyAgICB0bXAxNSA9IE1VTFRJUExZKHoxLCBGSVgoMC40NjcwODUxMjkpKSAtIHo0OyAgICAgICAgICAgLyogYzExICovCisgICAgdG1wMTYgKz0gdG1wMTU7CisgICAgdG1wMTMgPSBNVUxUSVBMWSh6MiArIHozLCAtIEZJWCgwLjE1ODM0MTY4MSkpIC0gejQ7ICAgIC8qIC1jMTMgKi8KKyAgICB0bXAxMSArPSB0bXAxMyAtIE1VTFRJUExZKHoyLCBGSVgoMC40MjQxMDM5NDgpKTsgICAgICAgLyogYzMtYzktYzEzICovCisgICAgdG1wMTIgKz0gdG1wMTMgLSBNVUxUSVBMWSh6MywgRklYKDIuMzczOTU5NzczKSk7ICAgICAgIC8qIGMzK2M1LWMxMyAqLworICAgIHRtcDEzID0gTVVMVElQTFkoejMgLSB6MiwgRklYKDEuNDA1MzIxMjg0KSk7ICAgICAgICAgICAvKiBjMSAqLworICAgIHRtcDE0ICs9IHRtcDEzICsgejQgLSBNVUxUSVBMWSh6MywgRklYKDEuNjkwNjQzMTMzNCkpOyAvKiBjMStjOS1jMTEgKi8KKyAgICB0bXAxNSArPSB0bXAxMyArIE1VTFRJUExZKHoyLCBGSVgoMC42NzQ5NTc1NjcpKTsgICAgICAgLyogYzErYzExLWM1ICovCisKKyAgICB0bXAxMyA9ICgoejEgLSB6MykgPDwgQ09OU1RfQklUUykgKyB6NDsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDExLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzEyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgLSB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDE0LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzldICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjUgKyB0bXAxNSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls4XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDE1LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI2ICsgdG1wMTYsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjYgLSB0bXAxNiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworCisgICAgd3NwdHIgKz0gODsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSAxNXgxNSBvdXRwdXQgYmxvY2suCisgKgorICogT3B0aW1pemVkIGFsZ29yaXRobSB3aXRoIDIyIG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgMS1EIGtlcm5lbC4KKyAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzMwKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xNXgxNSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUsIHRtcDE2OworICBJTlQzMiB0bXAyMCwgdG1wMjEsIHRtcDIyLCB0bXAyMywgdG1wMjQsIHRtcDI1LCB0bXAyNiwgdG1wMjc7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCoxNV07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgejEgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHoxICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAxMCA9IE1VTFRJUExZKHo0LCBGSVgoMC40MzcwMTYwMjQpKTsgLyogYzEyICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6NCwgRklYKDEuMTQ0MTIyODA2KSk7IC8qIGM2ICovCisKKyAgICB0bXAxMiA9IHoxIC0gdG1wMTA7CisgICAgdG1wMTMgPSB6MSArIHRtcDExOworICAgIHoxIC09ICh0bXAxMSAtIHRtcDEwKSA8PCAxOyAgICAgICAgICAgICAvKiBjMCA9IChjNi1jMTIpKjIgKi8KKworICAgIHo0ID0gejIgLSB6MzsKKyAgICB6MyArPSB6MjsKKyAgICB0bXAxMCA9IE1VTFRJUExZKHozLCBGSVgoMS4zMzc2Mjg5OTApKTsgLyogKGMyK2M0KS8yICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6NCwgRklYKDAuMDQ1NjgwNjEzKSk7IC8qIChjMi1jNCkvMiAqLworICAgIHoyID0gTVVMVElQTFkoejIsIEZJWCgxLjQzOTc3Mzk0NikpOyAgICAvKiBjNCtjMTQgKi8KKworICAgIHRtcDIwID0gdG1wMTMgKyB0bXAxMCArIHRtcDExOworICAgIHRtcDIzID0gdG1wMTIgLSB0bXAxMCArIHRtcDExICsgejI7CisKKyAgICB0bXAxMCA9IE1VTFRJUExZKHozLCBGSVgoMC41NDcwNTk1NzQpKTsgLyogKGM4K2MxNCkvMiAqLworICAgIHRtcDExID0gTVVMVElQTFkoejQsIEZJWCgwLjM5OTIzNDAwNCkpOyAvKiAoYzgtYzE0KS8yICovCisKKyAgICB0bXAyNSA9IHRtcDEzIC0gdG1wMTAgLSB0bXAxMTsKKyAgICB0bXAyNiA9IHRtcDEyICsgdG1wMTAgLSB0bXAxMSAtIHoyOworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh6MywgRklYKDAuNzkwNTY5NDE1KSk7IC8qIChjNitjMTIpLzIgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHo0LCBGSVgoMC4zNTM1NTMzOTEpKTsgLyogKGM2LWMxMikvMiAqLworCisgICAgdG1wMjEgPSB0bXAxMiArIHRtcDEwICsgdG1wMTE7CisgICAgdG1wMjQgPSB0bXAxMyAtIHRtcDEwICsgdG1wMTE7CisgICAgdG1wMTEgKz0gdG1wMTE7CisgICAgdG1wMjIgPSB6MSArIHRtcDExOyAgICAgICAgICAgICAgICAgICAgIC8qIGMxMCA9IGM2LWMxMiAqLworICAgIHRtcDI3ID0gejEgLSB0bXAxMSAtIHRtcDExOyAgICAgICAgICAgICAvKiBjMCA9IChjNi1jMTIpKjIgKi8KKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHo0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6MyA9IE1VTFRJUExZKHo0LCBGSVgoMS4yMjQ3NDQ4NzEpKTsgICAgICAgICAgICAgICAgICAgIC8qIGM1ICovCisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgdG1wMTMgPSB6MiAtIHo0OworICAgIHRtcDE1ID0gTVVMVElQTFkoejEgKyB0bXAxMywgRklYKDAuODMxMjUzODc2KSk7ICAgICAgICAgLyogYzkgKi8KKyAgICB0bXAxMSA9IHRtcDE1ICsgTVVMVElQTFkoejEsIEZJWCgwLjUxMzc0MzE0OCkpOyAgICAgICAgIC8qIGMzLWM5ICovCisgICAgdG1wMTQgPSB0bXAxNSAtIE1VTFRJUExZKHRtcDEzLCBGSVgoMi4xNzYyNTA4OTkpKTsgICAgICAvKiBjMytjOSAqLworCisgICAgdG1wMTMgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMC44MzEyNTM4NzYpKTsgICAgICAgICAgICAgICAvKiAtYzkgKi8KKyAgICB0bXAxNSA9IE1VTFRJUExZKHoyLCAtIEZJWCgxLjM0NDk5NzAyNCkpOyAgICAgICAgICAgICAgIC8qIC1jMyAqLworICAgIHoyID0gejEgLSB6NDsKKyAgICB0bXAxMiA9IHozICsgTVVMVElQTFkoejIsIEZJWCgxLjQwNjQ2NjM1MykpOyAgICAgICAgICAgIC8qIGMxICovCisKKyAgICB0bXAxMCA9IHRtcDEyICsgTVVMVElQTFkoejQsIEZJWCgyLjQ1NzQzMTg0NCkpIC0gdG1wMTU7IC8qIGMxK2M3ICovCisgICAgdG1wMTYgPSB0bXAxMiAtIE1VTFRJUExZKHoxLCBGSVgoMS4xMTI0MzQ4MjApKSArIHRtcDEzOyAvKiBjMS1jMTMgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoyLCBGSVgoMS4yMjQ3NDQ4NzEpKSAtIHozOyAgICAgICAgICAgIC8qIGM1ICovCisgICAgejIgPSBNVUxUSVBMWSh6MSArIHo0LCBGSVgoMC41NzUyMTI0NzcpKTsgICAgICAgICAgICAgICAvKiBjMTEgKi8KKyAgICB0bXAxMyArPSB6MiArIE1VTFRJUExZKHoxLCBGSVgoMC40NzU3NTMwMTQpKSAtIHozOyAgICAgIC8qIGM3LWMxMSAqLworICAgIHRtcDE1ICs9IHoyIC0gTVVMVElQTFkoejQsIEZJWCgwLjg2OTI0NDAxMCkpICsgejM7ICAgICAgLyogYzExK2MxMyAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls4KjBdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxNF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjEzXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoyXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMTJdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjNdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgKyB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjEwXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo1XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSArIHRtcDE1LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqOV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjUgLSB0bXAxNSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjZdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI2ICsgdG1wMTYsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo4XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNiAtIHRtcDE2LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqN10gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjcsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgMTUgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDE1OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMF0gKyAoT05FIDw8IChQQVNTMV9CSVRTKzIpKTsKKyAgICB6MSA8PD0gQ09OU1RfQklUUzsKKworICAgIHoyID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNF07CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzZdOworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh6NCwgRklYKDAuNDM3MDE2MDI0KSk7IC8qIGMxMiAqLworICAgIHRtcDExID0gTVVMVElQTFkoejQsIEZJWCgxLjE0NDEyMjgwNikpOyAvKiBjNiAqLworCisgICAgdG1wMTIgPSB6MSAtIHRtcDEwOworICAgIHRtcDEzID0gejEgKyB0bXAxMTsKKyAgICB6MSAtPSAodG1wMTEgLSB0bXAxMCkgPDwgMTsgICAgICAgICAgICAgLyogYzAgPSAoYzYtYzEyKSoyICovCisKKyAgICB6NCA9IHoyIC0gejM7CisgICAgejMgKz0gejI7CisgICAgdG1wMTAgPSBNVUxUSVBMWSh6MywgRklYKDEuMzM3NjI4OTkwKSk7IC8qIChjMitjNCkvMiAqLworICAgIHRtcDExID0gTVVMVElQTFkoejQsIEZJWCgwLjA0NTY4MDYxMykpOyAvKiAoYzItYzQpLzIgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCBGSVgoMS40Mzk3NzM5NDYpKTsgICAgLyogYzQrYzE0ICovCisKKyAgICB0bXAyMCA9IHRtcDEzICsgdG1wMTAgKyB0bXAxMTsKKyAgICB0bXAyMyA9IHRtcDEyIC0gdG1wMTAgKyB0bXAxMSArIHoyOworCisgICAgdG1wMTAgPSBNVUxUSVBMWSh6MywgRklYKDAuNTQ3MDU5NTc0KSk7IC8qIChjOCtjMTQpLzIgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHo0LCBGSVgoMC4zOTkyMzQwMDQpKTsgLyogKGM4LWMxNCkvMiAqLworCisgICAgdG1wMjUgPSB0bXAxMyAtIHRtcDEwIC0gdG1wMTE7CisgICAgdG1wMjYgPSB0bXAxMiArIHRtcDEwIC0gdG1wMTEgLSB6MjsKKworICAgIHRtcDEwID0gTVVMVElQTFkoejMsIEZJWCgwLjc5MDU2OTQxNSkpOyAvKiAoYzYrYzEyKS8yICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6NCwgRklYKDAuMzUzNTUzMzkxKSk7IC8qIChjNi1jMTIpLzIgKi8KKworICAgIHRtcDIxID0gdG1wMTIgKyB0bXAxMCArIHRtcDExOworICAgIHRtcDI0ID0gdG1wMTMgLSB0bXAxMCArIHRtcDExOworICAgIHRtcDExICs9IHRtcDExOworICAgIHRtcDIyID0gejEgKyB0bXAxMTsgICAgICAgICAgICAgICAgICAgICAvKiBjMTAgPSBjNi1jMTIgKi8KKyAgICB0bXAyNyA9IHoxIC0gdG1wMTEgLSB0bXAxMTsgICAgICAgICAgICAgLyogYzAgPSAoYzYtYzEyKSoyICovCisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHoyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbNV07CisgICAgejMgPSBNVUxUSVBMWSh6NCwgRklYKDEuMjI0NzQ0ODcxKSk7ICAgICAgICAgICAgICAgICAgICAvKiBjNSAqLworICAgIHo0ID0gKElOVDMyKSB3c3B0cls3XTsKKworICAgIHRtcDEzID0gejIgLSB6NDsKKyAgICB0bXAxNSA9IE1VTFRJUExZKHoxICsgdG1wMTMsIEZJWCgwLjgzMTI1Mzg3NikpOyAgICAgICAgIC8qIGM5ICovCisgICAgdG1wMTEgPSB0bXAxNSArIE1VTFRJUExZKHoxLCBGSVgoMC41MTM3NDMxNDgpKTsgICAgICAgICAvKiBjMy1jOSAqLworICAgIHRtcDE0ID0gdG1wMTUgLSBNVUxUSVBMWSh0bXAxMywgRklYKDIuMTc2MjUwODk5KSk7ICAgICAgLyogYzMrYzkgKi8KKworICAgIHRtcDEzID0gTVVMVElQTFkoejIsIC0gRklYKDAuODMxMjUzODc2KSk7ICAgICAgICAgICAgICAgLyogLWM5ICovCisgICAgdG1wMTUgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMS4zNDQ5OTcwMjQpKTsgICAgICAgICAgICAgICAvKiAtYzMgKi8KKyAgICB6MiA9IHoxIC0gejQ7CisgICAgdG1wMTIgPSB6MyArIE1VTFRJUExZKHoyLCBGSVgoMS40MDY0NjYzNTMpKTsgICAgICAgICAgICAvKiBjMSAqLworCisgICAgdG1wMTAgPSB0bXAxMiArIE1VTFRJUExZKHo0LCBGSVgoMi40NTc0MzE4NDQpKSAtIHRtcDE1OyAvKiBjMStjNyAqLworICAgIHRtcDE2ID0gdG1wMTIgLSBNVUxUSVBMWSh6MSwgRklYKDEuMTEyNDM0ODIwKSkgKyB0bXAxMzsgLyogYzEtYzEzICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MiwgRklYKDEuMjI0NzQ0ODcxKSkgLSB6MzsgICAgICAgICAgICAvKiBjNSAqLworICAgIHoyID0gTVVMVElQTFkoejEgKyB6NCwgRklYKDAuNTc1MjEyNDc3KSk7ICAgICAgICAgICAgICAgLyogYzExICovCisgICAgdG1wMTMgKz0gejIgKyBNVUxUSVBMWSh6MSwgRklYKDAuNDc1NzUzMDE0KSkgLSB6MzsgICAgICAvKiBjNy1jMTEgKi8KKyAgICB0bXAxNSArPSB6MiAtIE1VTFRJUExZKHo0LCBGSVgoMC44NjkyNDQwMTApKSArIHozOyAgICAgIC8qIGMxMStjMTMgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTRdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDExLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzEzXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgLSB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDE0LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzEwXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjUgKyB0bXAxNSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls5XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDE1LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI2ICsgdG1wMTYsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjYgLSB0bXAxNiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworCisgICAgd3NwdHIgKz0gODsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSAxNngxNiBvdXRwdXQgYmxvY2suCisgKgorICogT3B0aW1pemVkIGFsZ29yaXRobSB3aXRoIDI4IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgMS1EIGtlcm5lbC4KKyAqIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzMyKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xNngxNiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBJTlQzMiB0bXAyMCwgdG1wMjEsIHRtcDIyLCB0bXAyMywgdG1wMjQsIHRtcDI1LCB0bXAyNiwgdG1wMjc7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCoxNl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IDEgPDwgKENPTlNUX0JJVFMtUEFTUzFfQklUUy0xKTsKKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB0bXAxID0gTVVMVElQTFkoejEsIEZJWCgxLjMwNjU2Mjk2NSkpOyAgICAgIC8qIGM0WzE2XSA9IGMyWzhdICovCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAvKiBjMTJbMTZdID0gYzZbOF0gKi8KKworICAgIHRtcDEwID0gdG1wMCArIHRtcDE7CisgICAgdG1wMTEgPSB0bXAwIC0gdG1wMTsKKyAgICB0bXAxMiA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDI7CisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworICAgIHozID0gejEgLSB6MjsKKyAgICB6NCA9IE1VTFRJUExZKHozLCBGSVgoMC4yNzU4OTkzNzkpKTsgICAgICAgIC8qIGMxNFsxNl0gPSBjN1s4XSAqLworICAgIHozID0gTVVMVElQTFkoejMsIEZJWCgxLjM4NzAzOTg0NSkpOyAgICAgICAgLyogYzJbMTZdID0gYzFbOF0gKi8KKworICAgIHRtcDAgPSB6MyArIE1VTFRJUExZKHoyLCBGSVhfMl81NjI5MTU0NDcpOyAgLyogKGM2K2MyKVsxNl0gPSAoYzMrYzEpWzhdICovCisgICAgdG1wMSA9IHo0ICsgTVVMVElQTFkoejEsIEZJWF8wXzg5OTk3NjIyMyk7ICAvKiAoYzYtYzE0KVsxNl0gPSAoYzMtYzcpWzhdICovCisgICAgdG1wMiA9IHozIC0gTVVMVElQTFkoejEsIEZJWCgwLjYwMTM0NDg4NykpOyAvKiAoYzItYzEwKVsxNl0gPSAoYzEtYzUpWzhdICovCisgICAgdG1wMyA9IHo0IC0gTVVMVElQTFkoejIsIEZJWCgwLjUwOTc5NTU3OSkpOyAvKiAoYzEwLWMxNClbMTZdID0gKGM1LWM3KVs4XSAqLworCisgICAgdG1wMjAgPSB0bXAxMCArIHRtcDA7CisgICAgdG1wMjcgPSB0bXAxMCAtIHRtcDA7CisgICAgdG1wMjEgPSB0bXAxMiArIHRtcDE7CisgICAgdG1wMjYgPSB0bXAxMiAtIHRtcDE7CisgICAgdG1wMjIgPSB0bXAxMyArIHRtcDI7CisgICAgdG1wMjUgPSB0bXAxMyAtIHRtcDI7CisgICAgdG1wMjMgPSB0bXAxMSArIHRtcDM7CisgICAgdG1wMjQgPSB0bXAxMSAtIHRtcDM7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgdG1wMTEgPSB6MSArIHozOworCisgICAgdG1wMSAgPSBNVUxUSVBMWSh6MSArIHoyLCBGSVgoMS4zNTMzMTgwMDEpKTsgICAvKiBjMyAqLworICAgIHRtcDIgID0gTVVMVElQTFkodG1wMTEsICAgRklYKDEuMjQ3MjI1MDEzKSk7ICAgLyogYzUgKi8KKyAgICB0bXAzICA9IE1VTFRJUExZKHoxICsgejQsIEZJWCgxLjA5MzIwMTg2NykpOyAgIC8qIGM3ICovCisgICAgdG1wMTAgPSBNVUxUSVBMWSh6MSAtIHo0LCBGSVgoMC44OTcxNjc1ODYpKTsgICAvKiBjOSAqLworICAgIHRtcDExID0gTVVMVElQTFkodG1wMTEsICAgRklYKDAuNjY2NjU1NjU4KSk7ICAgLyogYzExICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MSAtIHoyLCBGSVgoMC40MTA1MjQ1MjgpKTsgICAvKiBjMTMgKi8KKyAgICB0bXAwICA9IHRtcDEgKyB0bXAyICsgdG1wMyAtCisJICAgIE1VTFRJUExZKHoxLCBGSVgoMi4yODYzNDExNDQpKTsgICAgICAgIC8qIGM3K2M1K2MzLWMxICovCisgICAgdG1wMTMgPSB0bXAxMCArIHRtcDExICsgdG1wMTIgLQorCSAgICBNVUxUSVBMWSh6MSwgRklYKDEuODM1NzMwNjAzKSk7ICAgICAgICAvKiBjOStjMTErYzEzLWMxNSAqLworICAgIHoxICAgID0gTVVMVElQTFkoejIgKyB6MywgRklYKDAuMTM4NjE3MTY5KSk7ICAgLyogYzE1ICovCisgICAgdG1wMSAgKz0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDAuMDcxODg4MDc0KSk7ICAvKiBjOStjMTEtYzMtYzE1ICovCisgICAgdG1wMiAgKz0gejEgLSBNVUxUSVBMWSh6MywgRklYKDEuMTI1NzI2MDQ4KSk7ICAvKiBjNStjNytjMTUtYzMgKi8KKyAgICB6MSAgICA9IE1VTFRJUExZKHozIC0gejIsIEZJWCgxLjQwNzQwMzczOCkpOyAgIC8qIGMxICovCisgICAgdG1wMTEgKz0gejEgLSBNVUxUSVBMWSh6MywgRklYKDAuNzY2MzY3MjgyKSk7ICAvKiBjMStjMTEtYzktYzEzICovCisgICAgdG1wMTIgKz0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDEuOTcxOTUxNDExKSk7ICAvKiBjMStjNStjMTMtYzcgKi8KKyAgICB6MiAgICArPSB6NDsKKyAgICB6MSAgICA9IE1VTFRJUExZKHoyLCAtIEZJWCgwLjY2NjY1NTY1OCkpOyAgICAgIC8qIC1jMTEgKi8KKyAgICB0bXAxICArPSB6MTsKKyAgICB0bXAzICArPSB6MSArIE1VTFRJUExZKHo0LCBGSVgoMS4wNjUzODg5NjIpKTsgIC8qIGMzK2MxMStjMTUtYzcgKi8KKyAgICB6MiAgICA9IE1VTFRJUExZKHoyLCAtIEZJWCgxLjI0NzIyNTAxMykpOyAgICAgIC8qIC1jNSAqLworICAgIHRtcDEwICs9IHoyICsgTVVMVElQTFkoejQsIEZJWCgzLjE0MTI3MTgwOSkpOyAgLyogYzErYzUrYzktYzEzICovCisgICAgdG1wMTIgKz0gejI7CisgICAgejIgICAgPSBNVUxUSVBMWSh6MyArIHo0LCAtIEZJWCgxLjM1MzMxODAwMSkpOyAvKiAtYzMgKi8KKyAgICB0bXAyICArPSB6MjsKKyAgICB0bXAzICArPSB6MjsKKyAgICB6MiAgICA9IE1VTFRJUExZKHo0IC0gejMsIEZJWCgwLjQxMDUyNDUyOCkpOyAgIC8qIGMxMyAqLworICAgIHRtcDEwICs9IHoyOworICAgIHRtcDExICs9IHoyOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls4KjBdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMCwgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxNV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDAsICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxLCAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjE0XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMSwgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoyXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDIsICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMTNdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAyLCAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjNdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMywgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDMsICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgKyB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjExXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo1XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSArIHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMTBdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjUgLSB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjZdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI2ICsgdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo5XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNiAtIHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqN10gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjcgKyB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjhdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI3IC0gdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgMTYgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDE2OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDAgPDw9IENPTlNUX0JJVFM7CisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbNF07CisgICAgdG1wMSA9IE1VTFRJUExZKHoxLCBGSVgoMS4zMDY1NjI5NjUpKTsgICAgICAvKiBjNFsxNl0gPSBjMls4XSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgRklYXzBfNTQxMTk2MTAwKTsgICAgICAgLyogYzEyWzE2XSA9IGM2WzhdICovCisKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAxOworICAgIHRtcDExID0gdG1wMCAtIHRtcDE7CisgICAgdG1wMTIgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAyOworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHoyID0gKElOVDMyKSB3c3B0cls2XTsKKyAgICB6MyA9IHoxIC0gejI7CisgICAgejQgPSBNVUxUSVBMWSh6MywgRklYKDAuMjc1ODk5Mzc5KSk7ICAgICAgICAvKiBjMTRbMTZdID0gYzdbOF0gKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCBGSVgoMS4zODcwMzk4NDUpKTsgICAgICAgIC8qIGMyWzE2XSA9IGMxWzhdICovCisKKyAgICB0bXAwID0gejMgKyBNVUxUSVBMWSh6MiwgRklYXzJfNTYyOTE1NDQ3KTsgIC8qIChjNitjMilbMTZdID0gKGMzK2MxKVs4XSAqLworICAgIHRtcDEgPSB6NCArIE1VTFRJUExZKHoxLCBGSVhfMF84OTk5NzYyMjMpOyAgLyogKGM2LWMxNClbMTZdID0gKGMzLWM3KVs4XSAqLworICAgIHRtcDIgPSB6MyAtIE1VTFRJUExZKHoxLCBGSVgoMC42MDEzNDQ4ODcpKTsgLyogKGMyLWMxMClbMTZdID0gKGMxLWM1KVs4XSAqLworICAgIHRtcDMgPSB6NCAtIE1VTFRJUExZKHoyLCBGSVgoMC41MDk3OTU1NzkpKTsgLyogKGMxMC1jMTQpWzE2XSA9IChjNS1jNylbOF0gKi8KKworICAgIHRtcDIwID0gdG1wMTAgKyB0bXAwOworICAgIHRtcDI3ID0gdG1wMTAgLSB0bXAwOworICAgIHRtcDIxID0gdG1wMTIgKyB0bXAxOworICAgIHRtcDI2ID0gdG1wMTIgLSB0bXAxOworICAgIHRtcDIyID0gdG1wMTMgKyB0bXAyOworICAgIHRtcDI1ID0gdG1wMTMgLSB0bXAyOworICAgIHRtcDIzID0gdG1wMTEgKyB0bXAzOworICAgIHRtcDI0ID0gdG1wMTEgLSB0bXAzOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxID0gKElOVDMyKSB3c3B0clsxXTsKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbM107CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHo0ID0gKElOVDMyKSB3c3B0cls3XTsKKworICAgIHRtcDExID0gejEgKyB6MzsKKworICAgIHRtcDEgID0gTVVMVElQTFkoejEgKyB6MiwgRklYKDEuMzUzMzE4MDAxKSk7ICAgLyogYzMgKi8KKyAgICB0bXAyICA9IE1VTFRJUExZKHRtcDExLCAgIEZJWCgxLjI0NzIyNTAxMykpOyAgIC8qIGM1ICovCisgICAgdG1wMyAgPSBNVUxUSVBMWSh6MSArIHo0LCBGSVgoMS4wOTMyMDE4NjcpKTsgICAvKiBjNyAqLworICAgIHRtcDEwID0gTVVMVElQTFkoejEgLSB6NCwgRklYKDAuODk3MTY3NTg2KSk7ICAgLyogYzkgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHRtcDExLCAgIEZJWCgwLjY2NjY1NTY1OCkpOyAgIC8qIGMxMSAqLworICAgIHRtcDEyID0gTVVMVElQTFkoejEgLSB6MiwgRklYKDAuNDEwNTI0NTI4KSk7ICAgLyogYzEzICovCisgICAgdG1wMCAgPSB0bXAxICsgdG1wMiArIHRtcDMgLQorCSAgICBNVUxUSVBMWSh6MSwgRklYKDIuMjg2MzQxMTQ0KSk7ICAgICAgICAvKiBjNytjNStjMy1jMSAqLworICAgIHRtcDEzID0gdG1wMTAgKyB0bXAxMSArIHRtcDEyIC0KKwkgICAgTVVMVElQTFkoejEsIEZJWCgxLjgzNTczMDYwMykpOyAgICAgICAgLyogYzkrYzExK2MxMy1jMTUgKi8KKyAgICB6MSAgICA9IE1VTFRJUExZKHoyICsgejMsIEZJWCgwLjEzODYxNzE2OSkpOyAgIC8qIGMxNSAqLworICAgIHRtcDEgICs9IHoxICsgTVVMVElQTFkoejIsIEZJWCgwLjA3MTg4ODA3NCkpOyAgLyogYzkrYzExLWMzLWMxNSAqLworICAgIHRtcDIgICs9IHoxIC0gTVVMVElQTFkoejMsIEZJWCgxLjEyNTcyNjA0OCkpOyAgLyogYzUrYzcrYzE1LWMzICovCisgICAgejEgICAgPSBNVUxUSVBMWSh6MyAtIHoyLCBGSVgoMS40MDc0MDM3MzgpKTsgICAvKiBjMSAqLworICAgIHRtcDExICs9IHoxIC0gTVVMVElQTFkoejMsIEZJWCgwLjc2NjM2NzI4MikpOyAgLyogYzErYzExLWM5LWMxMyAqLworICAgIHRtcDEyICs9IHoxICsgTVVMVElQTFkoejIsIEZJWCgxLjk3MTk1MTQxMSkpOyAgLyogYzErYzUrYzEzLWM3ICovCisgICAgejIgICAgKz0gejQ7CisgICAgejEgICAgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMC42NjY2NTU2NTgpKTsgICAgICAvKiAtYzExICovCisgICAgdG1wMSAgKz0gejE7CisgICAgdG1wMyAgKz0gejEgKyBNVUxUSVBMWSh6NCwgRklYKDEuMDY1Mzg4OTYyKSk7ICAvKiBjMytjMTErYzE1LWM3ICovCisgICAgejIgICAgPSBNVUxUSVBMWSh6MiwgLSBGSVgoMS4yNDcyMjUwMTMpKTsgICAgICAvKiAtYzUgKi8KKyAgICB0bXAxMCArPSB6MiArIE1VTFRJUExZKHo0LCBGSVgoMy4xNDEyNzE4MDkpKTsgIC8qIGMxK2M1K2M5LWMxMyAqLworICAgIHRtcDEyICs9IHoyOworICAgIHoyICAgID0gTVVMVElQTFkoejMgKyB6NCwgLSBGSVgoMS4zNTMzMTgwMDEpKTsgLyogLWMzICovCisgICAgdG1wMiAgKz0gejI7CisgICAgdG1wMyAgKz0gejI7CisgICAgejIgICAgPSBNVUxUSVBMWSh6NCAtIHozLCBGSVgoMC40MTA1MjQ1MjgpKTsgICAvKiBjMTMgKi8KKyAgICB0bXAxMCArPSB6MjsKKyAgICB0bXAxMSArPSB6MjsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxNV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDAsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzE0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDIsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDMsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjQgKyB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNCAtIHRtcDEwLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI1ICsgdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjUgLSB0bXAxMSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNiArIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzldICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI2IC0gdG1wMTIsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjcgKyB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls4XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNyAtIHRtcDEzLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSA4OwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIDE2eDggb3V0cHV0IGJsb2NrLgorICoKKyAqIDgtcG9pbnQgSURDVCBpbiBwYXNzIDEgKGNvbHVtbnMpLCAxNi1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzE2eDggKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIElOVDMyIHRtcDIwLCB0bXAyMSwgdG1wMjIsIHRtcDIzLCB0bXAyNCwgdG1wMjUsIHRtcDI2LCB0bXAyNzsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQ7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVs4KjhdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIElEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCiAgICAgCiAgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKIAlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCkBAIC0yMDcsMTkgKzI4ODEsMjMgQEAKICAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CiAgICAgCiAgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOwotICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7Ci0gICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgdG1wMyA9IHoxIC0gTVVMVElQTFkoejMsIEZJWF8xXzg0Nzc1OTA2NSk7CiAgICAgCiAgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwogICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MiA8PD0gQ09OU1RfQklUUzsKKyAgICB6MyA8PD0gQ09OU1RfQklUUzsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejIgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CiAKLSAgICB0bXAwID0gKHoyICsgejMpIDw8IENPTlNUX0JJVFM7Ci0gICAgdG1wMSA9ICh6MiAtIHozKSA8PCBDT05TVF9CSVRTOworICAgIHRtcDAgPSB6MiArIHozOworICAgIHRtcDEgPSB6MiAtIHozOwogICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7Ci0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAyOworICAgIHRtcDExID0gdG1wMSArIHRtcDM7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMzsKICAgICAKICAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCiAgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCkBAIC0yMzAsODAgKzI5MDgsMTI0MCBAQAogICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwogICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwogICAgIAotICAgIHoxID0gdG1wMCArIHRtcDM7Ci0gICAgejIgPSB0bXAxICsgdG1wMjsKLSAgICB6MyA9IHRtcDAgKyB0bXAyOwotICAgIHo0ID0gdG1wMSArIHRtcDM7Ci0gICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KLSAgICAKKyAgICB6MiA9IHRtcDAgKyB0bXAyOworICAgIHozID0gdG1wMSArIHRtcDM7CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIHoyICs9IHoxOworICAgIHozICs9IHoxOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwogICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgdG1wMCArPSB6MSArIHoyOworICAgIHRtcDMgKz0gejEgKyB6MzsKKworICAgIHoxID0gTVVMVElQTFkodG1wMSArIHRtcDIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCiAgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLwogICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KLSAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwotICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCi0gICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KLSAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCi0gICAgCi0gICAgejMgKz0gejU7Ci0gICAgejQgKz0gejU7Ci0gICAgCi0gICAgdG1wMCArPSB6MSArIHozOwotICAgIHRtcDEgKz0gejIgKyB6NDsKLSAgICB0bXAyICs9IHoyICsgejM7Ci0gICAgdG1wMyArPSB6MSArIHo0OworICAgIHRtcDEgKz0gejEgKyB6MzsKKyAgICB0bXAyICs9IHoxICsgejI7CiAgICAgCiAgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLwogICAgIAotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqNl0gPSAoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo2XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqNV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTMgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwogICAgIAogICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwogICAgIHF1YW50cHRyKys7CiAgICAgd3NwdHIrKzsKICAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyA4IHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4KKyAgICogMTYtcG9pbnQgSURDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzMyKS4KKyAgICovCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgdG1wMCA8PD0gQ09OU1RfQklUUzsKKworICAgIHoxID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB0bXAxID0gTVVMVElQTFkoejEsIEZJWCgxLjMwNjU2Mjk2NSkpOyAgICAgIC8qIGM0WzE2XSA9IGMyWzhdICovCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAvKiBjMTJbMTZdID0gYzZbOF0gKi8KKworICAgIHRtcDEwID0gdG1wMCArIHRtcDE7CisgICAgdG1wMTEgPSB0bXAwIC0gdG1wMTsKKyAgICB0bXAxMiA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDI7CisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzZdOworICAgIHozID0gejEgLSB6MjsKKyAgICB6NCA9IE1VTFRJUExZKHozLCBGSVgoMC4yNzU4OTkzNzkpKTsgICAgICAgIC8qIGMxNFsxNl0gPSBjN1s4XSAqLworICAgIHozID0gTVVMVElQTFkoejMsIEZJWCgxLjM4NzAzOTg0NSkpOyAgICAgICAgLyogYzJbMTZdID0gYzFbOF0gKi8KKworICAgIHRtcDAgPSB6MyArIE1VTFRJUExZKHoyLCBGSVhfMl81NjI5MTU0NDcpOyAgLyogKGM2K2MyKVsxNl0gPSAoYzMrYzEpWzhdICovCisgICAgdG1wMSA9IHo0ICsgTVVMVElQTFkoejEsIEZJWF8wXzg5OTk3NjIyMyk7ICAvKiAoYzYtYzE0KVsxNl0gPSAoYzMtYzcpWzhdICovCisgICAgdG1wMiA9IHozIC0gTVVMVElQTFkoejEsIEZJWCgwLjYwMTM0NDg4NykpOyAvKiAoYzItYzEwKVsxNl0gPSAoYzEtYzUpWzhdICovCisgICAgdG1wMyA9IHo0IC0gTVVMVElQTFkoejIsIEZJWCgwLjUwOTc5NTU3OSkpOyAvKiAoYzEwLWMxNClbMTZdID0gKGM1LWM3KVs4XSAqLworCisgICAgdG1wMjAgPSB0bXAxMCArIHRtcDA7CisgICAgdG1wMjcgPSB0bXAxMCAtIHRtcDA7CisgICAgdG1wMjEgPSB0bXAxMiArIHRtcDE7CisgICAgdG1wMjYgPSB0bXAxMiAtIHRtcDE7CisgICAgdG1wMjIgPSB0bXAxMyArIHRtcDI7CisgICAgdG1wMjUgPSB0bXAxMyAtIHRtcDI7CisgICAgdG1wMjMgPSB0bXAxMSArIHRtcDM7CisgICAgdG1wMjQgPSB0bXAxMSAtIHRtcDM7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHoyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNV07CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzddOworCisgICAgdG1wMTEgPSB6MSArIHozOworCisgICAgdG1wMSAgPSBNVUxUSVBMWSh6MSArIHoyLCBGSVgoMS4zNTMzMTgwMDEpKTsgICAvKiBjMyAqLworICAgIHRtcDIgID0gTVVMVElQTFkodG1wMTEsICAgRklYKDEuMjQ3MjI1MDEzKSk7ICAgLyogYzUgKi8KKyAgICB0bXAzICA9IE1VTFRJUExZKHoxICsgejQsIEZJWCgxLjA5MzIwMTg2NykpOyAgIC8qIGM3ICovCisgICAgdG1wMTAgPSBNVUxUSVBMWSh6MSAtIHo0LCBGSVgoMC44OTcxNjc1ODYpKTsgICAvKiBjOSAqLworICAgIHRtcDExID0gTVVMVElQTFkodG1wMTEsICAgRklYKDAuNjY2NjU1NjU4KSk7ICAgLyogYzExICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MSAtIHoyLCBGSVgoMC40MTA1MjQ1MjgpKTsgICAvKiBjMTMgKi8KKyAgICB0bXAwICA9IHRtcDEgKyB0bXAyICsgdG1wMyAtCisJICAgIE1VTFRJUExZKHoxLCBGSVgoMi4yODYzNDExNDQpKTsgICAgICAgIC8qIGM3K2M1K2MzLWMxICovCisgICAgdG1wMTMgPSB0bXAxMCArIHRtcDExICsgdG1wMTIgLQorCSAgICBNVUxUSVBMWSh6MSwgRklYKDEuODM1NzMwNjAzKSk7ICAgICAgICAvKiBjOStjMTErYzEzLWMxNSAqLworICAgIHoxICAgID0gTVVMVElQTFkoejIgKyB6MywgRklYKDAuMTM4NjE3MTY5KSk7ICAgLyogYzE1ICovCisgICAgdG1wMSAgKz0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDAuMDcxODg4MDc0KSk7ICAvKiBjOStjMTEtYzMtYzE1ICovCisgICAgdG1wMiAgKz0gejEgLSBNVUxUSVBMWSh6MywgRklYKDEuMTI1NzI2MDQ4KSk7ICAvKiBjNStjNytjMTUtYzMgKi8KKyAgICB6MSAgICA9IE1VTFRJUExZKHozIC0gejIsIEZJWCgxLjQwNzQwMzczOCkpOyAgIC8qIGMxICovCisgICAgdG1wMTEgKz0gejEgLSBNVUxUSVBMWSh6MywgRklYKDAuNzY2MzY3MjgyKSk7ICAvKiBjMStjMTEtYzktYzEzICovCisgICAgdG1wMTIgKz0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDEuOTcxOTUxNDExKSk7ICAvKiBjMStjNStjMTMtYzcgKi8KKyAgICB6MiAgICArPSB6NDsKKyAgICB6MSAgICA9IE1VTFRJUExZKHoyLCAtIEZJWCgwLjY2NjY1NTY1OCkpOyAgICAgIC8qIC1jMTEgKi8KKyAgICB0bXAxICArPSB6MTsKKyAgICB0bXAzICArPSB6MSArIE1VTFRJUExZKHo0LCBGSVgoMS4wNjUzODg5NjIpKTsgIC8qIGMzK2MxMStjMTUtYzcgKi8KKyAgICB6MiAgICA9IE1VTFRJUExZKHoyLCAtIEZJWCgxLjI0NzIyNTAxMykpOyAgICAgIC8qIC1jNSAqLworICAgIHRtcDEwICs9IHoyICsgTVVMVElQTFkoejQsIEZJWCgzLjE0MTI3MTgwOSkpOyAgLyogYzErYzUrYzktYzEzICovCisgICAgdG1wMTIgKz0gejI7CisgICAgejIgICAgPSBNVUxUSVBMWSh6MyArIHo0LCAtIEZJWCgxLjM1MzMxODAwMSkpOyAvKiAtYzMgKi8KKyAgICB0bXAyICArPSB6MjsKKyAgICB0bXAzICArPSB6MjsKKyAgICB6MiAgICA9IE1VTFRJUExZKHo0IC0gejMsIEZJWCgwLjQxMDUyNDUyOCkpOyAgIC8qIGMxMyAqLworICAgIHRtcDEwICs9IHoyOworICAgIHRtcDExICs9IHoyOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAwLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzE1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwIC0gdG1wMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTRdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIyICsgdG1wMiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxM10gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDIsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAzLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzEyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIzIC0gdG1wMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDEwLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzExXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTAsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjUgKyB0bXAxMSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDExLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI2ICsgdG1wMTIsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjYgLSB0bXAxMiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNyArIHRtcDEzLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzhdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI3IC0gdG1wMTMsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDg7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgMTR4NyBvdXRwdXQgYmxvY2suCisgKgorICogNy1wb2ludCBJRENUIGluIHBhc3MgMSAoY29sdW1ucyksIDE0LXBvaW50IGluIHBhc3MgMiAocm93cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfMTR4NyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCUpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCB0bXAxNjsKKyAgSU5UMzIgdG1wMjAsIHRtcDIxLCB0bXAyMiwgdG1wMjMsIHRtcDI0LCB0bXAyNSwgdG1wMjY7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCo3XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgorICAgKiA3LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNCkuCisgICAqLworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAyMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMjMgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDIzICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB0bXAyMCA9IE1VTFRJUExZKHoyIC0gejMsIEZJWCgwLjg4MTc0NzczNCkpOyAgICAgICAvKiBjNCAqLworICAgIHRtcDIyID0gTVVMVElQTFkoejEgLSB6MiwgRklYKDAuMzE0NjkyMTIzKSk7ICAgICAgIC8qIGM2ICovCisgICAgdG1wMjEgPSB0bXAyMCArIHRtcDIyICsgdG1wMjMgLSBNVUxUSVBMWSh6MiwgRklYKDEuODQxMjE4MDAzKSk7IC8qIGMyK2M0LWM2ICovCisgICAgdG1wMTAgPSB6MSArIHozOworICAgIHoyIC09IHRtcDEwOworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMTAsIEZJWCgxLjI3NDE2MjM5MikpICsgdG1wMjM7IC8qIGMyICovCisgICAgdG1wMjAgKz0gdG1wMTAgLSBNVUxUSVBMWSh6MywgRklYKDAuMDc3NzIyNTM2KSk7ICAgLyogYzItYzQtYzYgKi8KKyAgICB0bXAyMiArPSB0bXAxMCAtIE1VTFRJUExZKHoxLCBGSVgoMi40NzA2MDIyNDkpKTsgICAvKiBjMitjNCtjNiAqLworICAgIHRtcDIzICs9IE1VTFRJUExZKHoyLCBGSVgoMS40MTQyMTM1NjIpKTsgICAgICAgICAgIC8qIGMwICovCisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisKKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgwLjkzNTQxNDM0NykpOyAgICAgICAvKiAoYzMrYzEtYzUpLzIgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxIC0gejIsIEZJWCgwLjE3MDI2MjMzOSkpOyAgICAgICAvKiAoYzMrYzUtYzEpLzIgKi8KKyAgICB0bXAxMCA9IHRtcDExIC0gdG1wMTI7CisgICAgdG1wMTEgKz0gdG1wMTI7CisgICAgdG1wMTIgPSBNVUxUSVBMWSh6MiArIHozLCAtIEZJWCgxLjM3ODc1NjI3NikpOyAgICAgLyogLWMxICovCisgICAgdG1wMTEgKz0gdG1wMTI7CisgICAgejIgPSBNVUxUSVBMWSh6MSArIHozLCBGSVgoMC42MTM2MDQyNjgpKTsgICAgICAgICAgLyogYzUgKi8KKyAgICB0bXAxMCArPSB6MjsKKyAgICB0bXAxMiArPSB6MiArIE1VTFRJUExZKHozLCBGSVgoMS44NzA4Mjg2OTMpKTsgICAgICAvKiBjMytjMS1jNSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls4KjBdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjZdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjFdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjVdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjJdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjRdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjNdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgNyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCisgICAqIDE0LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yOCkuCisgICAqLworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA3OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMF0gKyAoT05FIDw8IChQQVNTMV9CSVRTKzIpKTsKKyAgICB6MSA8PD0gQ09OU1RfQklUUzsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbNF07CisgICAgejIgPSBNVUxUSVBMWSh6NCwgRklYKDEuMjc0MTYyMzkyKSk7ICAgICAgICAgLyogYzQgKi8KKyAgICB6MyA9IE1VTFRJUExZKHo0LCBGSVgoMC4zMTQ2OTIxMjMpKTsgICAgICAgICAvKiBjMTIgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCBGSVgoMC44ODE3NDc3MzQpKTsgICAgICAgICAvKiBjOCAqLworCisgICAgdG1wMTAgPSB6MSArIHoyOworICAgIHRtcDExID0gejEgKyB6MzsKKyAgICB0bXAxMiA9IHoxIC0gejQ7CisKKyAgICB0bXAyMyA9IHoxIC0gKCh6MiArIHozIC0gejQpIDw8IDEpOyAgICAgICAgICAvKiBjMCA9IChjNCtjMTItYzgpKjIgKi8KKworICAgIHoxID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbNl07CisKKyAgICB6MyA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgxLjEwNTY3NjY4NikpOyAgICAvKiBjNiAqLworCisgICAgdG1wMTMgPSB6MyArIE1VTFRJUExZKHoxLCBGSVgoMC4yNzMwNzk1OTApKTsgLyogYzItYzYgKi8KKyAgICB0bXAxNCA9IHozIC0gTVVMVElQTFkoejIsIEZJWCgxLjcxOTI4MDk1NCkpOyAvKiBjNitjMTAgKi8KKyAgICB0bXAxNSA9IE1VTFRJUExZKHoxLCBGSVgoMC42MTM2MDQyNjgpKSAtICAgICAvKiBjMTAgKi8KKwkgICAgTVVMVElQTFkoejIsIEZJWCgxLjM3ODc1NjI3NikpOyAgICAgIC8qIGMyICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMjYgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDIxID0gdG1wMTEgKyB0bXAxNDsKKyAgICB0bXAyNSA9IHRtcDExIC0gdG1wMTQ7CisgICAgdG1wMjIgPSB0bXAxMiArIHRtcDE1OworICAgIHRtcDI0ID0gdG1wMTIgLSB0bXAxNTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHozID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbN107CisgICAgejQgPDw9IENPTlNUX0JJVFM7CisKKyAgICB0bXAxNCA9IHoxICsgejM7CisgICAgdG1wMTEgPSBNVUxUSVBMWSh6MSArIHoyLCBGSVgoMS4zMzQ4NTI2MDcpKTsgICAgICAgICAgIC8qIGMzICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxNCwgRklYKDEuMTk3NDQ4ODQ2KSk7ICAgICAgICAgICAgIC8qIGM1ICovCisgICAgdG1wMTAgPSB0bXAxMSArIHRtcDEyICsgejQgLSBNVUxUSVBMWSh6MSwgRklYKDEuMTI2OTgwMTY5KSk7IC8qIGMzK2M1LWMxICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh0bXAxNCwgRklYKDAuNzUyNDA2OTc4KSk7ICAgICAgICAgICAgIC8qIGM5ICovCisgICAgdG1wMTYgPSB0bXAxNCAtIE1VTFRJUExZKHoxLCBGSVgoMS4wNjExNTA0MjYpKTsgICAgICAgIC8qIGM5K2MxMS1jMTMgKi8KKyAgICB6MSAgICAtPSB6MjsKKyAgICB0bXAxNSA9IE1VTFRJUExZKHoxLCBGSVgoMC40NjcwODUxMjkpKSAtIHo0OyAgICAgICAgICAgLyogYzExICovCisgICAgdG1wMTYgKz0gdG1wMTU7CisgICAgdG1wMTMgPSBNVUxUSVBMWSh6MiArIHozLCAtIEZJWCgwLjE1ODM0MTY4MSkpIC0gejQ7ICAgIC8qIC1jMTMgKi8KKyAgICB0bXAxMSArPSB0bXAxMyAtIE1VTFRJUExZKHoyLCBGSVgoMC40MjQxMDM5NDgpKTsgICAgICAgLyogYzMtYzktYzEzICovCisgICAgdG1wMTIgKz0gdG1wMTMgLSBNVUxUSVBMWSh6MywgRklYKDIuMzczOTU5NzczKSk7ICAgICAgIC8qIGMzK2M1LWMxMyAqLworICAgIHRtcDEzID0gTVVMVElQTFkoejMgLSB6MiwgRklYKDEuNDA1MzIxMjg0KSk7ICAgICAgICAgICAvKiBjMSAqLworICAgIHRtcDE0ICs9IHRtcDEzICsgejQgLSBNVUxUSVBMWSh6MywgRklYKDEuNjkwNjQzMTMzNCkpOyAvKiBjMStjOS1jMTEgKi8KKyAgICB0bXAxNSArPSB0bXAxMyArIE1VTFRJUExZKHoyLCBGSVgoMC42NzQ5NTc1NjcpKTsgICAgICAgLyogYzErYzExLWM1ICovCisKKyAgICB0bXAxMyA9ICgoejEgLSB6MykgPDwgQ09OU1RfQklUUykgKyB6NDsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDExLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzEyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgLSB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDE0LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzldICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjUgKyB0bXAxNSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls4XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDE1LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI2ICsgdG1wMTYsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjYgLSB0bXAxNiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworCisgICAgd3NwdHIgKz0gODsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSAxMng2IG91dHB1dCBibG9jay4KKyAqCisgKiA2LXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgMTItcG9pbnQgaW4gcGFzcyAyIChyb3dzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xMng2IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTU7CisgIElOVDMyIHRtcDIwLCB0bXAyMSwgdG1wMjIsIHRtcDIzLCB0bXAyNCwgdG1wMjU7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCo2XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgorICAgKiA2LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xMikuCisgICAqLworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMTAgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHRtcDEyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB0bXAyMCA9IE1VTFRJUExZKHRtcDEyLCBGSVgoMC43MDcxMDY3ODEpKTsgICAvKiBjNCAqLworICAgIHRtcDExID0gdG1wMTAgKyB0bXAyMDsKKyAgICB0bXAyMSA9IFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMjAgLSB0bXAyMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB0bXAyMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAyMCwgRklYKDEuMjI0NzQ0ODcxKSk7ICAgLyogYzIgKi8KKyAgICB0bXAyMCA9IHRtcDExICsgdG1wMTA7CisgICAgdG1wMjIgPSB0bXAxMSAtIHRtcDEwOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDExID0gTVVMVElQTFkoejEgKyB6MywgRklYKDAuMzY2MDI1NDA0KSk7IC8qIGM1ICovCisgICAgdG1wMTAgPSB0bXAxMSArICgoejEgKyB6MikgPDwgQ09OU1RfQklUUyk7CisgICAgdG1wMTIgPSB0bXAxMSArICgoejMgLSB6MikgPDwgQ09OU1RfQklUUyk7CisgICAgdG1wMTEgPSAoejEgLSB6MiAtIHozKSA8PCBQQVNTMV9CSVRTOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls4KjBdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjVdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjFdID0gKGludCkgKHRtcDIxICsgdG1wMTEpOworICAgIHdzcHRyWzgqNF0gPSAoaW50KSAodG1wMjEgLSB0bXAxMSk7CisgICAgd3NwdHJbOCoyXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIyICsgdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgNiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCisgICAqIDEyLXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yNCkuCisgICAqLworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA2OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB6MyA9IChJTlQzMikgd3NwdHJbMF0gKyAoT05FIDw8IChQQVNTMV9CSVRTKzIpKTsKKyAgICB6MyA8PD0gQ09OU1RfQklUUzsKKworICAgIHo0ID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB6NCA9IE1VTFRJUExZKHo0LCBGSVgoMS4yMjQ3NDQ4NzEpKTsgLyogYzQgKi8KKworICAgIHRtcDEwID0gejMgKyB6NDsKKyAgICB0bXAxMSA9IHozIC0gejQ7CisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejQgPSBNVUxUSVBMWSh6MSwgRklYKDEuMzY2MDI1NDA0KSk7IC8qIGMyICovCisgICAgejEgPDw9IENPTlNUX0JJVFM7CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzZdOworICAgIHoyIDw8PSBDT05TVF9CSVRTOworCisgICAgdG1wMTIgPSB6MSAtIHoyOworCisgICAgdG1wMjEgPSB6MyArIHRtcDEyOworICAgIHRtcDI0ID0gejMgLSB0bXAxMjsKKworICAgIHRtcDEyID0gejQgKyB6MjsKKworICAgIHRtcDIwID0gdG1wMTAgKyB0bXAxMjsKKyAgICB0bXAyNSA9IHRtcDEwIC0gdG1wMTI7CisKKyAgICB0bXAxMiA9IHo0IC0gejEgLSB6MjsKKworICAgIHRtcDIyID0gdG1wMTEgKyB0bXAxMjsKKyAgICB0bXAyMyA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHoyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNV07CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzddOworCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6MiwgRklYKDEuMzA2NTYyOTY1KSk7ICAgICAgICAgICAgICAgICAgLyogYzMgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHoyLCAtIEZJWF8wXzU0MTE5NjEwMCk7ICAgICAgICAgICAgICAgICAvKiAtYzkgKi8KKworICAgIHRtcDEwID0gejEgKyB6MzsKKyAgICB0bXAxNSA9IE1VTFRJUExZKHRtcDEwICsgejQsIEZJWCgwLjg2MDkxODY2OSkpOyAgICAgICAgICAvKiBjNyAqLworICAgIHRtcDEyID0gdG1wMTUgKyBNVUxUSVBMWSh0bXAxMCwgRklYKDAuMjYxMDUyMzg0KSk7ICAgICAgIC8qIGM1LWM3ICovCisgICAgdG1wMTAgPSB0bXAxMiArIHRtcDExICsgTVVMVElQTFkoejEsIEZJWCgwLjI4MDE0MzcxNikpOyAgLyogYzEtYzUgKi8KKyAgICB0bXAxMyA9IE1VTFRJUExZKHozICsgejQsIC0gRklYKDEuMDQ1NTEwNTgwKSk7ICAgICAgICAgICAvKiAtKGM3K2MxMSkgKi8KKyAgICB0bXAxMiArPSB0bXAxMyArIHRtcDE0IC0gTVVMVElQTFkoejMsIEZJWCgxLjQ3ODU3NTI0MikpOyAvKiBjMStjNS1jNy1jMTEgKi8KKyAgICB0bXAxMyArPSB0bXAxNSAtIHRtcDExICsgTVVMVElQTFkoejQsIEZJWCgxLjU4NjcwNjY4MSkpOyAvKiBjMStjMTEgKi8KKyAgICB0bXAxNSArPSB0bXAxNCAtIE1VTFRJUExZKHoxLCBGSVgoMC42NzYzMjY3NTgpKSAtICAgICAgICAvKiBjNy1jMTEgKi8KKwkgICAgIE1VTFRJUExZKHo0LCBGSVgoMS45ODI4ODk3MjMpKTsgICAgICAgICAgICAgICAgIC8qIGM1K2M3ICovCisKKyAgICB6MSAtPSB6NDsKKyAgICB6MiAtPSB6MzsKKyAgICB6MyA9IE1VTFRJUExZKHoxICsgejIsIEZJWF8wXzU0MTE5NjEwMCk7ICAgICAgICAgICAgICAgICAvKiBjOSAqLworICAgIHRtcDExID0gejMgKyBNVUxUSVBMWSh6MSwgRklYXzBfNzY1MzY2ODY1KTsgICAgICAgICAgICAgIC8qIGMzLWM5ICovCisgICAgdG1wMTQgPSB6MyAtIE1VTFRJUExZKHoyLCBGSVhfMV84NDc3NTkwNjUpOyAgICAgICAgICAgICAgLyogYzMrYzkgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMTFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDExLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzEwXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls5XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDEyLAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOF0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgLSB0bXAxMywKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDE0LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzddICA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsCisJCQkJCSAgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjUgKyB0bXAxNSwKKwkJCQkJICAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSAgPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDE1LAorCQkJCQkgICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSA4OwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIDEweDUgb3V0cHV0IGJsb2NrLgorICoKKyAqIDUtcG9pbnQgSURDVCBpbiBwYXNzIDEgKGNvbHVtbnMpLCAxMC1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzEweDUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0OworICBJTlQzMiB0bXAyMCwgdG1wMjEsIHRtcDIyLCB0bXAyMywgdG1wMjQ7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbOCo1XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgorICAgKiA1LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xMCkuCisgICAqLworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMTIgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEyICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHRtcDEzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB0bXAxNCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7CisgICAgejEgPSBNVUxUSVBMWSh0bXAxMyArIHRtcDE0LCBGSVgoMC43OTA1Njk0MTUpKTsgLyogKGMyK2M0KS8yICovCisgICAgejIgPSBNVUxUSVBMWSh0bXAxMyAtIHRtcDE0LCBGSVgoMC4zNTM1NTMzOTEpKTsgLyogKGMyLWM0KS8yICovCisgICAgejMgPSB0bXAxMiArIHoyOworICAgIHRtcDEwID0gejMgKyB6MTsKKyAgICB0bXAxMSA9IHozIC0gejE7CisgICAgdG1wMTIgLT0gejIgPDwgMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVgoMC44MzEyNTM4NzYpKTsgICAgICAgLyogYzMgKi8KKyAgICB0bXAxMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWCgwLjUxMzc0MzE0OCkpOyAgICAvKiBjMS1jMyAqLworICAgIHRtcDE0ID0gejEgLSBNVUxUSVBMWSh6MywgRklYKDIuMTc2MjUwODk5KSk7ICAgIC8qIGMxK2MzICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzgqMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDE0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqM10gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSAtIHRtcDE0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyA1IHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4KKyAgICogMTAtcG9pbnQgSURDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzIwKS4KKyAgICovCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDU7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHozID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHozIDw8PSBDT05TVF9CSVRTOworICAgIHo0ID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB6MSA9IE1VTFRJUExZKHo0LCBGSVgoMS4xNDQxMjI4MDYpKTsgICAgICAgICAvKiBjNCAqLworICAgIHoyID0gTVVMVElQTFkoejQsIEZJWCgwLjQzNzAxNjAyNCkpOyAgICAgICAgIC8qIGM4ICovCisgICAgdG1wMTAgPSB6MyArIHoxOworICAgIHRtcDExID0gejMgLSB6MjsKKworICAgIHRtcDIyID0gejMgLSAoKHoxIC0gejIpIDw8IDEpOyAgICAgICAgICAgICAgIC8qIGMwID0gKGM0LWM4KSoyICovCisKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzZdOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVgoMC44MzEyNTM4NzYpKTsgICAgLyogYzYgKi8KKyAgICB0bXAxMiA9IHoxICsgTVVMVElQTFkoejIsIEZJWCgwLjUxMzc0MzE0OCkpOyAvKiBjMi1jNiAqLworICAgIHRtcDEzID0gejEgLSBNVUxUSVBMWSh6MywgRklYKDIuMTc2MjUwODk5KSk7IC8qIGMyK2M2ICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTI7CisgICAgdG1wMjQgPSB0bXAxMCAtIHRtcDEyOworICAgIHRtcDIxID0gdG1wMTEgKyB0bXAxMzsKKyAgICB0bXAyMyA9IHRtcDExIC0gdG1wMTM7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHoyID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNV07CisgICAgejMgPDw9IENPTlNUX0JJVFM7CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzddOworCisgICAgdG1wMTEgPSB6MiArIHo0OworICAgIHRtcDEzID0gejIgLSB6NDsKKworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTMsIEZJWCgwLjMwOTAxNjk5NCkpOyAgICAgICAgLyogKGMzLWM3KS8yICovCisKKyAgICB6MiA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC45NTEwNTY1MTYpKTsgICAgICAgICAgIC8qIChjMytjNykvMiAqLworICAgIHo0ID0gejMgKyB0bXAxMjsKKworICAgIHRtcDEwID0gTVVMVElQTFkoejEsIEZJWCgxLjM5NjgwMjI0NykpICsgejIgKyB6NDsgLyogYzEgKi8KKyAgICB0bXAxNCA9IE1VTFRJUExZKHoxLCBGSVgoMC4yMjEyMzE3NDIpKSAtIHoyICsgejQ7IC8qIGM5ICovCisKKyAgICB6MiA9IE1VTFRJUExZKHRtcDExLCBGSVgoMC41ODc3ODUyNTIpKTsgICAgICAgICAgIC8qIChjMS1jOSkvMiAqLworICAgIHo0ID0gejMgLSB0bXAxMiAtICh0bXAxMyA8PCAoQ09OU1RfQklUUyAtIDEpKTsKKworICAgIHRtcDEyID0gKCh6MSAtIHRtcDEzKSA8PCBDT05TVF9CSVRTKSAtIHozOworCisgICAgdG1wMTEgPSBNVUxUSVBMWSh6MSwgRklYKDEuMjYwMDczNTExKSkgLSB6MiAtIHo0OyAvKiBjMyAqLworICAgIHRtcDEzID0gTVVMVElQTFkoejEsIEZJWCgwLjY0MjAzOTUyMikpIC0gejIgKyB6NDsgLyogYzcgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbOV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMCAtIHRtcDEwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxICsgdG1wMTEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzhdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiArIHRtcDEyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAxMywKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMyAtIHRtcDEzLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDI0ICsgdG1wMTQsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDg7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgOHg0IG91dHB1dCBibG9jay4KKyAqCisgKiA0LXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgOC1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0Xzh4NCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzgqNF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4KKyAgICogNC1wb2ludCBJRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTYpLgorICAgKi8KKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA4OyBjdHIrKywgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKykgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisKKyAgICB0bXAxMCA9ICh0bXAwICsgdG1wMikgPDwgUEFTUzFfQklUUzsKKyAgICB0bXAxMiA9ICh0bXAwIC0gdG1wMikgPDwgUEFTUzFfQklUUzsKKworICAgIC8qIE9kZCBwYXJ0ICovCisgICAgLyogU2FtZSByb3RhdGlvbiBhcyBpbiB0aGUgZXZlbiBwYXJ0IG9mIHRoZSA4eDggTEwmTSBJRENUICovCisKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAgICAgICAgIC8qIGM2ICovCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHoxICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHRtcDAgPSBSSUdIVF9TSElGVCh6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpLCAvKiBjMi1jNiAqLworCQkgICAgICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB0bXAyID0gUklHSFRfU0hJRlQoejEgLSBNVUxUSVBMWSh6MywgRklYXzFfODQ3NzU5MDY1KSwgLyogYzIrYzYgKi8KKwkJICAgICAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzgqMF0gPSAoaW50KSAodG1wMTAgKyB0bXAwKTsKKyAgICB3c3B0cls4KjNdID0gKGludCkgKHRtcDEwIC0gdG1wMCk7CisgICAgd3NwdHJbOCoxXSA9IChpbnQpICh0bXAxMiArIHRtcDIpOworICAgIHdzcHRyWzgqMl0gPSAoaW50KSAodG1wMTIgLSB0bXAyKTsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisgIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLCAqLworICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0OiByZXZlcnNlIHRoZSBldmVuIHBhcnQgb2YgdGhlIGZvcndhcmQgRENULiAqLworICAgIC8qIFRoZSByb3RhdG9yIGlzIHNxcnQoMikqYygtNikuICovCisKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzZdOworICAgIAorICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsKKyAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsKKyAgICB0bXAzID0gejEgLSBNVUxUSVBMWSh6MywgRklYXzFfODQ3NzU5MDY1KTsKKyAgICAKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzRdOworICAgIAorICAgIHRtcDAgPSAoejIgKyB6MykgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKHoyIC0gejMpIDw8IENPTlNUX0JJVFM7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAyOworICAgIHRtcDExID0gdG1wMSArIHRtcDM7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMzsKKworICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgODsgdGhlIG1hdHJpeCBpcyB1bml0YXJ5IGFuZCBoZW5jZSBpdHMKKyAgICAgKiB0cmFuc3Bvc2UgaXMgaXRzIGludmVyc2UuICBpMC4uaTMgYXJlIHk3LHk1LHkzLHkxIHJlc3BlY3RpdmVseS4KKyAgICAgKi8KKworICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzddOworICAgIHRtcDEgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHRtcDIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHRtcDMgPSAoSU5UMzIpIHdzcHRyWzFdOworCisgICAgejIgPSB0bXAwICsgdG1wMjsKKyAgICB6MyA9IHRtcDEgKyB0bXAzOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICB6MiArPSB6MTsKKyAgICB6MyArPSB6MTsKKworICAgIHoxID0gTVVMVElQTFkodG1wMCArIHRtcDMsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KKyAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wMyA9IE1VTFRJUExZKHRtcDMsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLworICAgIHRtcDAgKz0gejEgKyB6MjsKKyAgICB0bXAzICs9IHoxICsgejM7CisKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEgKyB0bXAyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLworICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxLCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KKyAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCisgICAgdG1wMSArPSB6MSArIHozOworICAgIHRtcDIgKz0gejEgKyB6MjsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMywKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDMsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgKyB0bXAyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDExIC0gdG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiArIHRtcDEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTIgLSB0bXAxLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEzICsgdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMyAtIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA2eDMgb3V0cHV0IGJsb2NrLgorICoKKyAqIDMtcG9pbnQgSURDVCBpbiBwYXNzIDEgKGNvbHVtbnMpLCA2LXBvaW50IGluIHBhc3MgMiAocm93cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfNngzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDEwLCB0bXAxMSwgdG1wMTI7CisgIElOVDMyIHoxLCB6MiwgejM7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVs2KjNdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuCisgICAqIDMtcG9pbnQgSURDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzYpLgorICAgKi8KKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA2OyBjdHIrKywgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKykgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMCA8PD0gQ09OU1RfQklUUzsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMCArPSBPTkUgPDwgKENPTlNUX0JJVFMtUEFTUzFfQklUUy0xKTsKKyAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKHRtcDIsIEZJWCgwLjcwNzEwNjc4MSkpOyAvKiBjMiAqLworICAgIHRtcDEwID0gdG1wMCArIHRtcDEyOworICAgIHRtcDIgPSB0bXAwIC0gdG1wMTIgLSB0bXAxMjsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAxMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgdG1wMCA9IE1VTFRJUExZKHRtcDEyLCBGSVgoMS4yMjQ3NDQ4NzEpKTsgLyogYzEgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgd3NwdHJbNiowXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls2KjJdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzYqMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3MgMyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuCisgICAqIDYtcG9pbnQgSURDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzEyKS4KKyAgICovCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDM7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgdG1wMCA8PD0gQ09OU1RfQklUUzsKKyAgICB0bXAyID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB0bXAxMCA9IE1VTFRJUExZKHRtcDIsIEZJWCgwLjcwNzEwNjc4MSkpOyAgIC8qIGM0ICovCisgICAgdG1wMSA9IHRtcDAgKyB0bXAxMDsKKyAgICB0bXAxMSA9IHRtcDAgLSB0bXAxMCAtIHRtcDEwOworICAgIHRtcDEwID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMTAsIEZJWCgxLjIyNDc0NDg3MSkpOyAgIC8qIGMyICovCisgICAgdG1wMTAgPSB0bXAxICsgdG1wMDsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAwOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxID0gKElOVDMyKSB3c3B0clsxXTsKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbM107CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHRtcDEgPSBNVUxUSVBMWSh6MSArIHozLCBGSVgoMC4zNjYwMjU0MDQpKTsgLyogYzUgKi8KKyAgICB0bXAwID0gdG1wMSArICgoejEgKyB6MikgPDwgQ09OU1RfQklUUyk7CisgICAgdG1wMiA9IHRtcDEgKyAoKHozIC0gejIpIDw8IENPTlNUX0JJVFMpOworICAgIHRtcDEgPSAoejEgLSB6MiAtIHozKSA8PCBDT05TVF9CSVRTOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDExICsgdG1wMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMSAtIHRtcDEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTIgKyB0bXAyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyIC0gdG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDY7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgNHgyIG91dHB1dCBibG9jay4KKyAqCisgKiAyLXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgNC1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzR4MiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAyLCB0bXAxMCwgdG1wMTI7CisgIElOVDMyIHoxLCB6MiwgejM7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSU5UMzIgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBJTlQzMiB3b3Jrc3BhY2VbNCoyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyssIGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDEwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgd3NwdHJbNCowXSA9IHRtcDEwICsgdG1wMDsKKyAgICB3c3B0cls0KjFdID0gdG1wMTAgLSB0bXAwOworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDIgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgorICAgKiA0LXBvaW50IElEQ1Qga2VybmVsLAorICAgKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNikgW3JlZmVycyB0byA4LXBvaW50IElEQ1RdLgorICAgKi8KKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMjsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMCA9IHdzcHRyWzBdICsgKE9ORSA8PCAyKTsKKyAgICB0bXAyID0gd3NwdHJbMl07CisKKyAgICB0bXAxMCA9ICh0bXAwICsgdG1wMikgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxMiA9ICh0bXAwIC0gdG1wMikgPDwgQ09OU1RfQklUUzsKKworICAgIC8qIE9kZCBwYXJ0ICovCisgICAgLyogU2FtZSByb3RhdGlvbiBhcyBpbiB0aGUgZXZlbiBwYXJ0IG9mIHRoZSA4eDggTEwmTSBJRENUICovCisKKyAgICB6MiA9IHdzcHRyWzFdOworICAgIHozID0gd3NwdHJbM107CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7ICAgLyogYzYgKi8KKyAgICB0bXAwID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsgLyogYzItYzYgKi8KKyAgICB0bXAyID0gejEgLSBNVUxUSVBMWSh6MywgRklYXzFfODQ3NzU5MDY1KTsgLyogYzIrYzYgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyICsgdG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTIgLSB0bXAyLAorCQkJCQkgICAgICBDT05TVF9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDQ7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgMngxIG91dHB1dCBibG9jay4KKyAqCisgKiAxLXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgMi1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzJ4MSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxMDsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IGVtcHR5LiAqLworCisgIC8qIFBhc3MgMjogcHJvY2VzcyAxIHJvdyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdICsgb3V0cHV0X2NvbDsKKworICAvKiBFdmVuIHBhcnQgKi8KKworICB0bXAxMCA9IERFUVVBTlRJWkUoY29lZl9ibG9ja1swXSwgcXVhbnRwdHJbMF0pOworICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgIHRtcDEwICs9IE9ORSA8PCAyOworCisgIC8qIE9kZCBwYXJ0ICovCisKKyAgdG1wMCA9IERFUVVBTlRJWkUoY29lZl9ibG9ja1sxXSwgcXVhbnRwdHJbMV0pOworCisgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMCwgMykgJiBSQU5HRV9NQVNLXTsKKyAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAwLCAzKSAmIFJBTkdFX01BU0tdOworfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgOHgxNiBvdXRwdXQgYmxvY2suCisgKgorICogMTYtcG9pbnQgSURDVCBpbiBwYXNzIDEgKGNvbHVtbnMpLCA4LXBvaW50IGluIHBhc3MgMiAocm93cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfOHgxNiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCUpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgdG1wMjAsIHRtcDIxLCB0bXAyMiwgdG1wMjMsIHRtcDI0LCB0bXAyNSwgdG1wMjYsIHRtcDI3OworICBJTlQzMiB6MSwgejIsIHozLCB6NDsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzgqMTZdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuCisgICAqIDE2LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8zMikuCisgICAqLworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDg7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDEgPSBNVUxUSVBMWSh6MSwgRklYKDEuMzA2NTYyOTY1KSk7ICAgICAgLyogYzRbMTZdID0gYzJbOF0gKi8KKyAgICB0bXAyID0gTVVMVElQTFkoejEsIEZJWF8wXzU0MTE5NjEwMCk7ICAgICAgIC8qIGMxMlsxNl0gPSBjNls4XSAqLworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMTsKKyAgICB0bXAxMSA9IHRtcDAgLSB0bXAxOworICAgIHRtcDEyID0gdG1wMCArIHRtcDI7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMjsKKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisgICAgejMgPSB6MSAtIHoyOworICAgIHo0ID0gTVVMVElQTFkoejMsIEZJWCgwLjI3NTg5OTM3OSkpOyAgICAgICAgLyogYzE0WzE2XSA9IGM3WzhdICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgRklYKDEuMzg3MDM5ODQ1KSk7ICAgICAgICAvKiBjMlsxNl0gPSBjMVs4XSAqLworCisgICAgdG1wMCA9IHozICsgTVVMVElQTFkoejIsIEZJWF8yXzU2MjkxNTQ0Nyk7ICAvKiAoYzYrYzIpWzE2XSA9IChjMytjMSlbOF0gKi8KKyAgICB0bXAxID0gejQgKyBNVUxUSVBMWSh6MSwgRklYXzBfODk5OTc2MjIzKTsgIC8qIChjNi1jMTQpWzE2XSA9IChjMy1jNylbOF0gKi8KKyAgICB0bXAyID0gejMgLSBNVUxUSVBMWSh6MSwgRklYKDAuNjAxMzQ0ODg3KSk7IC8qIChjMi1jMTApWzE2XSA9IChjMS1jNSlbOF0gKi8KKyAgICB0bXAzID0gejQgLSBNVUxUSVBMWSh6MiwgRklYKDAuNTA5Nzk1NTc5KSk7IC8qIChjMTAtYzE0KVsxNl0gPSAoYzUtYzcpWzhdICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMDsKKyAgICB0bXAyNyA9IHRtcDEwIC0gdG1wMDsKKyAgICB0bXAyMSA9IHRtcDEyICsgdG1wMTsKKyAgICB0bXAyNiA9IHRtcDEyIC0gdG1wMTsKKyAgICB0bXAyMiA9IHRtcDEzICsgdG1wMjsKKyAgICB0bXAyNSA9IHRtcDEzIC0gdG1wMjsKKyAgICB0bXAyMyA9IHRtcDExICsgdG1wMzsKKyAgICB0bXAyNCA9IHRtcDExIC0gdG1wMzsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisKKyAgICB0bXAxMSA9IHoxICsgejM7CisKKyAgICB0bXAxICA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgxLjM1MzMxODAwMSkpOyAgIC8qIGMzICovCisgICAgdG1wMiAgPSBNVUxUSVBMWSh0bXAxMSwgICBGSVgoMS4yNDcyMjUwMTMpKTsgICAvKiBjNSAqLworICAgIHRtcDMgID0gTVVMVElQTFkoejEgKyB6NCwgRklYKDEuMDkzMjAxODY3KSk7ICAgLyogYzcgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxIC0gejQsIEZJWCgwLjg5NzE2NzU4NikpOyAgIC8qIGM5ICovCisgICAgdG1wMTEgPSBNVUxUSVBMWSh0bXAxMSwgICBGSVgoMC42NjY2NTU2NTgpKTsgICAvKiBjMTEgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxIC0gejIsIEZJWCgwLjQxMDUyNDUyOCkpOyAgIC8qIGMxMyAqLworICAgIHRtcDAgID0gdG1wMSArIHRtcDIgKyB0bXAzIC0KKwkgICAgTVVMVElQTFkoejEsIEZJWCgyLjI4NjM0MTE0NCkpOyAgICAgICAgLyogYzcrYzUrYzMtYzEgKi8KKyAgICB0bXAxMyA9IHRtcDEwICsgdG1wMTEgKyB0bXAxMiAtCisJICAgIE1VTFRJUExZKHoxLCBGSVgoMS44MzU3MzA2MDMpKTsgICAgICAgIC8qIGM5K2MxMStjMTMtYzE1ICovCisgICAgejEgICAgPSBNVUxUSVBMWSh6MiArIHozLCBGSVgoMC4xMzg2MTcxNjkpKTsgICAvKiBjMTUgKi8KKyAgICB0bXAxICArPSB6MSArIE1VTFRJUExZKHoyLCBGSVgoMC4wNzE4ODgwNzQpKTsgIC8qIGM5K2MxMS1jMy1jMTUgKi8KKyAgICB0bXAyICArPSB6MSAtIE1VTFRJUExZKHozLCBGSVgoMS4xMjU3MjYwNDgpKTsgIC8qIGM1K2M3K2MxNS1jMyAqLworICAgIHoxICAgID0gTVVMVElQTFkoejMgLSB6MiwgRklYKDEuNDA3NDAzNzM4KSk7ICAgLyogYzEgKi8KKyAgICB0bXAxMSArPSB6MSAtIE1VTFRJUExZKHozLCBGSVgoMC43NjYzNjcyODIpKTsgIC8qIGMxK2MxMS1jOS1jMTMgKi8KKyAgICB0bXAxMiArPSB6MSArIE1VTFRJUExZKHoyLCBGSVgoMS45NzE5NTE0MTEpKTsgIC8qIGMxK2M1K2MxMy1jNyAqLworICAgIHoyICAgICs9IHo0OworICAgIHoxICAgID0gTVVMVElQTFkoejIsIC0gRklYKDAuNjY2NjU1NjU4KSk7ICAgICAgLyogLWMxMSAqLworICAgIHRtcDEgICs9IHoxOworICAgIHRtcDMgICs9IHoxICsgTVVMVElQTFkoejQsIEZJWCgxLjA2NTM4ODk2MikpOyAgLyogYzMrYzExK2MxNS1jNyAqLworICAgIHoyICAgID0gTVVMVElQTFkoejIsIC0gRklYKDEuMjQ3MjI1MDEzKSk7ICAgICAgLyogLWM1ICovCisgICAgdG1wMTAgKz0gejIgKyBNVUxUSVBMWSh6NCwgRklYKDMuMTQxMjcxODA5KSk7ICAvKiBjMStjNStjOS1jMTMgKi8KKyAgICB0bXAxMiArPSB6MjsKKyAgICB6MiAgICA9IE1VTFRJUExZKHozICsgejQsIC0gRklYKDEuMzUzMzE4MDAxKSk7IC8qIC1jMyAqLworICAgIHRtcDIgICs9IHoyOworICAgIHRtcDMgICs9IHoyOworICAgIHoyICAgID0gTVVMVElQTFkoejQgLSB6MywgRklYKDAuNDEwNTI0NTI4KSk7ICAgLyogYzEzICovCisgICAgdG1wMTAgKz0gejI7CisgICAgdG1wMTEgKz0gejI7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzgqMF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAwLCAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjE1XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIwIC0gdG1wMCwgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDEsICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMTRdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxLCAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjJdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIyICsgdG1wMiwgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxM10gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDIsICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqM10gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAzLCAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjEyXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzIC0gdG1wMywgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo0XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqMTFdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjVdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI1ICsgdG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCoxMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqNl0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjYgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls4KjldICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI2IC0gdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbOCo3XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNyArIHRtcDEzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzgqOF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjcgLSB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgfQogICAKICAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KICAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCiAgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KIAogICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDE2OyBjdHIrKykgewogICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0gICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KLSAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KLSAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KLSAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KLSAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KLSAgICAgKi8KLSAgICAKLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCi0Jd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzJdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls0XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzVdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls3XSA9IGRjdmFsOwotCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKICAgICAKICAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCiAgICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KQEAgLTMxMiwxNiArNDE1MCwyMCBAQAogICAgIHozID0gKElOVDMyKSB3c3B0cls2XTsKICAgICAKICAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7Ci0gICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejMsIC0gRklYXzFfODQ3NzU5MDY1KTsKLSAgICB0bXAzID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsKKyAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MiwgRklYXzBfNzY1MzY2ODY1KTsKKyAgICB0bXAzID0gejEgLSBNVUxUSVBMWSh6MywgRklYXzFfODQ3NzU5MDY1KTsKICAgICAKLSAgICB0bXAwID0gKChJTlQzMikgd3NwdHJbMF0gKyAoSU5UMzIpIHdzcHRyWzRdKSA8PCBDT05TVF9CSVRTOwotICAgIHRtcDEgPSAoKElOVDMyKSB3c3B0clswXSAtIChJTlQzMikgd3NwdHJbNF0pIDw8IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHoyID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHozID0gKElOVDMyKSB3c3B0cls0XTsKICAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIHRtcDAgPSAoejIgKyB6MykgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKHoyIC0gejMpIDw8IENPTlNUX0JJVFM7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAyOworICAgIHRtcDExID0gdG1wMSArIHRtcDM7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMzsKICAgICAKICAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCiAgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCkBAIC0zMzIsNTggKzQxNzQsOTY0IEBACiAgICAgdG1wMiA9IChJTlQzMikgd3NwdHJbM107CiAgICAgdG1wMyA9IChJTlQzMikgd3NwdHJbMV07CiAgICAgCi0gICAgejEgPSB0bXAwICsgdG1wMzsKLSAgICB6MiA9IHRtcDEgKyB0bXAyOwotICAgIHozID0gdG1wMCArIHRtcDI7Ci0gICAgejQgPSB0bXAxICsgdG1wMzsKLSAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLwotICAgIAorICAgIHoyID0gdG1wMCArIHRtcDI7CisgICAgejMgPSB0bXAxICsgdG1wMzsKKworICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgejIgKz0gejE7CisgICAgejMgKz0gejE7CisKKyAgICB6MSA9IE1VTFRJUExZKHRtcDAgKyB0bXAzLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCiAgICAgdG1wMCA9IE1VTFRJUExZKHRtcDAsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB0bXAwICs9IHoxICsgejI7CisgICAgdG1wMyArPSB6MSArIHozOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAxICsgdG1wMiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KICAgICB0bXAxID0gTVVMVElQTFkodG1wMSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCiAgICAgdG1wMiA9IE1VTFRJUExZKHRtcDIsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCi0gICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KLSAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLwotICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KLSAgICAKLSAgICB6MyArPSB6NTsKLSAgICB6NCArPSB6NTsKLSAgICAKLSAgICB0bXAwICs9IHoxICsgejM7Ci0gICAgdG1wMSArPSB6MiArIHo0OwotICAgIHRtcDIgKz0gejIgKyB6MzsKLSAgICB0bXAzICs9IHoxICsgejQ7CisgICAgdG1wMSArPSB6MSArIHozOworICAgIHRtcDIgKz0gejEgKyB6MjsKICAgICAKICAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCiAgICAgCi0gICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDMsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAzLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKIAkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMywKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCiAJCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDExICsgdG1wMiwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQogCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSAtIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgLSB0bXAyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKIAkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyICsgdG1wMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCiAJCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMSwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKyAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQogCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMyArIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTMgKyB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKIAkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEzIC0gdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCiAJCQkgICAgJiBSQU5HRV9NQVNLXTsKICAgICAKICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCiAgIH0KIH0KIAorCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIDd4MTQgb3V0cHV0IGJsb2NrLgorICoKKyAqIDE0LXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgNy1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0Xzd4MTQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNSwgdG1wMTY7CisgIElOVDMyIHRtcDIwLCB0bXAyMSwgdG1wMjIsIHRtcDIzLCB0bXAyNCwgdG1wMjUsIHRtcDI2OworICBJTlQzMiB6MSwgejIsIHozLCB6NDsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzcqMTRdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuCisgICAqIDE0LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8yOCkuCisgICAqLworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDc7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgejEgPDw9IENPTlNUX0JJVFM7CisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHoxICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHo0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MiA9IE1VTFRJUExZKHo0LCBGSVgoMS4yNzQxNjIzOTIpKTsgICAgICAgICAvKiBjNCAqLworICAgIHozID0gTVVMVElQTFkoejQsIEZJWCgwLjMxNDY5MjEyMykpOyAgICAgICAgIC8qIGMxMiAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIEZJWCgwLjg4MTc0NzczNCkpOyAgICAgICAgIC8qIGM4ICovCisKKyAgICB0bXAxMCA9IHoxICsgejI7CisgICAgdG1wMTEgPSB6MSArIHozOworICAgIHRtcDEyID0gejEgLSB6NDsKKworICAgIHRtcDIzID0gUklHSFRfU0hJRlQoejEgLSAoKHoyICsgejMgLSB6NCkgPDwgMSksIC8qIGMwID0gKGM0K2MxMi1jOCkqMiAqLworCQkJQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisKKyAgICB6MyA9IE1VTFRJUExZKHoxICsgejIsIEZJWCgxLjEwNTY3NjY4NikpOyAgICAvKiBjNiAqLworCisgICAgdG1wMTMgPSB6MyArIE1VTFRJUExZKHoxLCBGSVgoMC4yNzMwNzk1OTApKTsgLyogYzItYzYgKi8KKyAgICB0bXAxNCA9IHozIC0gTVVMVElQTFkoejIsIEZJWCgxLjcxOTI4MDk1NCkpOyAvKiBjNitjMTAgKi8KKyAgICB0bXAxNSA9IE1VTFRJUExZKHoxLCBGSVgoMC42MTM2MDQyNjgpKSAtICAgICAvKiBjMTAgKi8KKwkgICAgTVVMVElQTFkoejIsIEZJWCgxLjM3ODc1NjI3NikpOyAgICAgIC8qIGMyICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMjYgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDIxID0gdG1wMTEgKyB0bXAxNDsKKyAgICB0bXAyNSA9IHRtcDExIC0gdG1wMTQ7CisgICAgdG1wMjIgPSB0bXAxMiArIHRtcDE1OworICAgIHRtcDI0ID0gdG1wMTIgLSB0bXAxNTsKKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMTMgPSB6NCA8PCBDT05TVF9CSVRTOworCisgICAgdG1wMTQgPSB6MSArIHozOworICAgIHRtcDExID0gTVVMVElQTFkoejEgKyB6MiwgRklYKDEuMzM0ODUyNjA3KSk7ICAgICAgICAgICAvKiBjMyAqLworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTQsIEZJWCgxLjE5NzQ0ODg0NikpOyAgICAgICAgICAgICAvKiBjNSAqLworICAgIHRtcDEwID0gdG1wMTEgKyB0bXAxMiArIHRtcDEzIC0gTVVMVElQTFkoejEsIEZJWCgxLjEyNjk4MDE2OSkpOyAvKiBjMytjNS1jMSAqLworICAgIHRtcDE0ID0gTVVMVElQTFkodG1wMTQsIEZJWCgwLjc1MjQwNjk3OCkpOyAgICAgICAgICAgICAvKiBjOSAqLworICAgIHRtcDE2ID0gdG1wMTQgLSBNVUxUSVBMWSh6MSwgRklYKDEuMDYxMTUwNDI2KSk7ICAgICAgICAvKiBjOStjMTEtYzEzICovCisgICAgejEgICAgLT0gejI7CisgICAgdG1wMTUgPSBNVUxUSVBMWSh6MSwgRklYKDAuNDY3MDg1MTI5KSkgLSB0bXAxMzsgICAgICAgIC8qIGMxMSAqLworICAgIHRtcDE2ICs9IHRtcDE1OworICAgIHoxICAgICs9IHo0OworICAgIHo0ICAgID0gTVVMVElQTFkoejIgKyB6MywgLSBGSVgoMC4xNTgzNDE2ODEpKSAtIHRtcDEzOyAvKiAtYzEzICovCisgICAgdG1wMTEgKz0gejQgLSBNVUxUSVBMWSh6MiwgRklYKDAuNDI0MTAzOTQ4KSk7ICAgICAgICAgIC8qIGMzLWM5LWMxMyAqLworICAgIHRtcDEyICs9IHo0IC0gTVVMVElQTFkoejMsIEZJWCgyLjM3Mzk1OTc3MykpOyAgICAgICAgICAvKiBjMytjNS1jMTMgKi8KKyAgICB6NCAgICA9IE1VTFRJUExZKHozIC0gejIsIEZJWCgxLjQwNTMyMTI4NCkpOyAgICAgICAgICAgLyogYzEgKi8KKyAgICB0bXAxNCArPSB6NCArIHRtcDEzIC0gTVVMVElQTFkoejMsIEZJWCgxLjY5MDY0MzEzMzQpKTsgLyogYzErYzktYzExICovCisgICAgdG1wMTUgKz0gejQgKyBNVUxUSVBMWSh6MiwgRklYKDAuNjc0OTU3NTY3KSk7ICAgICAgICAgIC8qIGMxK2MxMS1jNSAqLworCisgICAgdG1wMTMgPSAoejEgLSB6MykgPDwgUEFTUzFfQklUUzsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgd3NwdHJbNyowXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMCArIHRtcDEwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzcqMTNdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls3KjFdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIxICsgdG1wMTEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNyoxMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMSAtIHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzcqMl0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls3KjExXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIyIC0gdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNyozXSAgPSAoaW50KSAodG1wMjMgKyB0bXAxMyk7CisgICAgd3NwdHJbNyoxMF0gPSAoaW50KSAodG1wMjMgLSB0bXAxMyk7CisgICAgd3NwdHJbNyo0XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDE0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzcqOV0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls3KjVdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI1ICsgdG1wMTUsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNyo4XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDE1LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzcqNl0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjYgKyB0bXAxNiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls3KjddICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI2IC0gdG1wMTYsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgMTQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgorICAgKiA3LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNCkuCisgICAqLworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAxNDsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMjMgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgdG1wMjMgPDw9IENPTlNUX0JJVFM7CisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMl07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzRdOworICAgIHozID0gKElOVDMyKSB3c3B0cls2XTsKKworICAgIHRtcDIwID0gTVVMVElQTFkoejIgLSB6MywgRklYKDAuODgxNzQ3NzM0KSk7ICAgICAgIC8qIGM0ICovCisgICAgdG1wMjIgPSBNVUxUSVBMWSh6MSAtIHoyLCBGSVgoMC4zMTQ2OTIxMjMpKTsgICAgICAgLyogYzYgKi8KKyAgICB0bXAyMSA9IHRtcDIwICsgdG1wMjIgKyB0bXAyMyAtIE1VTFRJUExZKHoyLCBGSVgoMS44NDEyMTgwMDMpKTsgLyogYzIrYzQtYzYgKi8KKyAgICB0bXAxMCA9IHoxICsgejM7CisgICAgejIgLT0gdG1wMTA7CisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAxMCwgRklYKDEuMjc0MTYyMzkyKSkgKyB0bXAyMzsgLyogYzIgKi8KKyAgICB0bXAyMCArPSB0bXAxMCAtIE1VTFRJUExZKHozLCBGSVgoMC4wNzc3MjI1MzYpKTsgICAvKiBjMi1jNC1jNiAqLworICAgIHRtcDIyICs9IHRtcDEwIC0gTVVMVElQTFkoejEsIEZJWCgyLjQ3MDYwMjI0OSkpOyAgIC8qIGMyK2M0K2M2ICovCisgICAgdG1wMjMgKz0gTVVMVElQTFkoejIsIEZJWCgxLjQxNDIxMzU2MikpOyAgICAgICAgICAgLyogYzAgKi8KKworICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbMV07CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHozID0gKElOVDMyKSB3c3B0cls1XTsKKworICAgIHRtcDExID0gTVVMVElQTFkoejEgKyB6MiwgRklYKDAuOTM1NDE0MzQ3KSk7ICAgICAgIC8qIChjMytjMS1jNSkvMiAqLworICAgIHRtcDEyID0gTVVMVElQTFkoejEgLSB6MiwgRklYKDAuMTcwMjYyMzM5KSk7ICAgICAgIC8qIChjMytjNS1jMSkvMiAqLworICAgIHRtcDEwID0gdG1wMTEgLSB0bXAxMjsKKyAgICB0bXAxMSArPSB0bXAxMjsKKyAgICB0bXAxMiA9IE1VTFRJUExZKHoyICsgejMsIC0gRklYKDEuMzc4NzU2Mjc2KSk7ICAgICAvKiAtYzEgKi8KKyAgICB0bXAxMSArPSB0bXAxMjsKKyAgICB6MiA9IE1VTFRJUExZKHoxICsgejMsIEZJWCgwLjYxMzYwNDI2OCkpOyAgICAgICAgICAvKiBjNSAqLworICAgIHRtcDEwICs9IHoyOworICAgIHRtcDEyICs9IHoyICsgTVVMVElQTFkoejMsIEZJWCgxLjg3MDgyODY5MykpOyAgICAgIC8qIGMzK2MxLWM1ICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwICsgdG1wMTAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDExLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIxIC0gdG1wMTEsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjIgKyB0bXAxMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDEyLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIzLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworCisgICAgd3NwdHIgKz0gNzsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSA2eDEyIG91dHB1dCBibG9jay4KKyAqCisgKiAxMi1wb2ludCBJRENUIGluIHBhc3MgMSAoY29sdW1ucyksIDYtcG9pbnQgaW4gcGFzcyAyIChyb3dzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF82eDEyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTU7CisgIElOVDMyIHRtcDIwLCB0bXAyMSwgdG1wMjIsIHRtcDIzLCB0bXAyNCwgdG1wMjU7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbNioxMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4KKyAgICogMTItcG9pbnQgSURDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzI0KS4KKyAgICovCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNjsgY3RyKyssIGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB6MyA8PD0gQ09OU1RfQklUUzsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejMgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7CisgICAgejQgPSBNVUxUSVBMWSh6NCwgRklYKDEuMjI0NzQ0ODcxKSk7IC8qIGM0ICovCisKKyAgICB0bXAxMCA9IHozICsgejQ7CisgICAgdG1wMTEgPSB6MyAtIHo0OworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHo0ID0gTVVMVElQTFkoejEsIEZJWCgxLjM2NjAyNTQwNCkpOyAvKiBjMiAqLworICAgIHoxIDw8PSBDT05TVF9CSVRTOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKyAgICB6MiA8PD0gQ09OU1RfQklUUzsKKworICAgIHRtcDEyID0gejEgLSB6MjsKKworICAgIHRtcDIxID0gejMgKyB0bXAxMjsKKyAgICB0bXAyNCA9IHozIC0gdG1wMTI7CisKKyAgICB0bXAxMiA9IHo0ICsgejI7CisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTI7CisgICAgdG1wMjUgPSB0bXAxMCAtIHRtcDEyOworCisgICAgdG1wMTIgPSB6NCAtIHoxIC0gejI7CisKKyAgICB0bXAyMiA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMjMgPSB0bXAxMSAtIHRtcDEyOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHo0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKKworICAgIHRtcDExID0gTVVMVElQTFkoejIsIEZJWCgxLjMwNjU2Mjk2NSkpOyAgICAgICAgICAgICAgICAgIC8qIGMzICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMF81NDExOTYxMDApOyAgICAgICAgICAgICAgICAgLyogLWM5ICovCisKKyAgICB0bXAxMCA9IHoxICsgejM7CisgICAgdG1wMTUgPSBNVUxUSVBMWSh0bXAxMCArIHo0LCBGSVgoMC44NjA5MTg2NjkpKTsgICAgICAgICAgLyogYzcgKi8KKyAgICB0bXAxMiA9IHRtcDE1ICsgTVVMVElQTFkodG1wMTAsIEZJWCgwLjI2MTA1MjM4NCkpOyAgICAgICAvKiBjNS1jNyAqLworICAgIHRtcDEwID0gdG1wMTIgKyB0bXAxMSArIE1VTFRJUExZKHoxLCBGSVgoMC4yODAxNDM3MTYpKTsgIC8qIGMxLWM1ICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh6MyArIHo0LCAtIEZJWCgxLjA0NTUxMDU4MCkpOyAgICAgICAgICAgLyogLShjNytjMTEpICovCisgICAgdG1wMTIgKz0gdG1wMTMgKyB0bXAxNCAtIE1VTFRJUExZKHozLCBGSVgoMS40Nzg1NzUyNDIpKTsgLyogYzErYzUtYzctYzExICovCisgICAgdG1wMTMgKz0gdG1wMTUgLSB0bXAxMSArIE1VTFRJUExZKHo0LCBGSVgoMS41ODY3MDY2ODEpKTsgLyogYzErYzExICovCisgICAgdG1wMTUgKz0gdG1wMTQgLSBNVUxUSVBMWSh6MSwgRklYKDAuNjc2MzI2NzU4KSkgLSAgICAgICAgLyogYzctYzExICovCisJICAgICBNVUxUSVBMWSh6NCwgRklYKDEuOTgyODg5NzIzKSk7ICAgICAgICAgICAgICAgICAvKiBjNStjNyAqLworCisgICAgejEgLT0gejQ7CisgICAgejIgLT0gejM7CisgICAgejMgPSBNVUxUSVBMWSh6MSArIHoyLCBGSVhfMF81NDExOTYxMDApOyAgICAgICAgICAgICAgICAgLyogYzkgKi8KKyAgICB0bXAxMSA9IHozICsgTVVMVElQTFkoejEsIEZJWF8wXzc2NTM2Njg2NSk7ICAgICAgICAgICAgICAvKiBjMy1jOSAqLworICAgIHRtcDE0ID0gejMgLSBNVUxUSVBMWSh6MiwgRklYXzFfODQ3NzU5MDY1KTsgICAgICAgICAgICAgIC8qIGMzK2M5ICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzYqMF0gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls2KjExXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIwIC0gdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNioxXSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMSArIHRtcDExLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzYqMTBdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls2KjJdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIyICsgdG1wMTIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNio5XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyMiAtIHRtcDEyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzYqM10gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjMgKyB0bXAxMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls2KjhdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzIC0gdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNio0XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNCArIHRtcDE0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzYqN10gID0gKGludCkgUklHSFRfU0hJRlQodG1wMjQgLSB0bXAxNCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls2KjVdICA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI1ICsgdG1wMTUsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNio2XSAgPSAoaW50KSBSSUdIVF9TSElGVCh0bXAyNSAtIHRtcDE1LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDEyIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4KKyAgICogNi1wb2ludCBJRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvMTIpLgorICAgKi8KKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMTI7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgLyogQWRkIGZ1ZGdlIGZhY3RvciBoZXJlIGZvciBmaW5hbCBkZXNjYWxlLiAqLworICAgIHRtcDEwID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDEwIDw8PSBDT05TVF9CSVRTOworICAgIHRtcDEyID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB0bXAyMCA9IE1VTFRJUExZKHRtcDEyLCBGSVgoMC43MDcxMDY3ODEpKTsgICAvKiBjNCAqLworICAgIHRtcDExID0gdG1wMTAgKyB0bXAyMDsKKyAgICB0bXAyMSA9IHRtcDEwIC0gdG1wMjAgLSB0bXAyMDsKKyAgICB0bXAyMCA9IChJTlQzMikgd3NwdHJbMl07CisgICAgdG1wMTAgPSBNVUxUSVBMWSh0bXAyMCwgRklYKDEuMjI0NzQ0ODcxKSk7ICAgLyogYzIgKi8KKyAgICB0bXAyMCA9IHRtcDExICsgdG1wMTA7CisgICAgdG1wMjIgPSB0bXAxMSAtIHRtcDEwOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxID0gKElOVDMyKSB3c3B0clsxXTsKKyAgICB6MiA9IChJTlQzMikgd3NwdHJbM107CisgICAgejMgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHRtcDExID0gTVVMVElQTFkoejEgKyB6MywgRklYKDAuMzY2MDI1NDA0KSk7IC8qIGM1ICovCisgICAgdG1wMTAgPSB0bXAxMSArICgoejEgKyB6MikgPDwgQ09OU1RfQklUUyk7CisgICAgdG1wMTIgPSB0bXAxMSArICgoejMgLSB6MikgPDwgQ09OU1RfQklUUyk7CisgICAgdG1wMTEgPSAoejEgLSB6MiAtIHozKSA8PCBDT05TVF9CSVRTOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMCArIHRtcDEwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIwIC0gdG1wMTAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxMSwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAyMSAtIHRtcDExLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDIyICsgdG1wMTIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMjIgLSB0bXAxMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDY7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgNXgxMCBvdXRwdXQgYmxvY2suCisgKgorICogMTAtcG9pbnQgSURDVCBpbiBwYXNzIDEgKGNvbHVtbnMpLCA1LXBvaW50IGluIHBhc3MgMiAocm93cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfNXgxMCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCUpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQ7CisgIElOVDMyIHRtcDIwLCB0bXAyMSwgdG1wMjIsIHRtcDIzLCB0bXAyNDsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbNSoxMF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4KKyAgICogMTAtcG9pbnQgSURDVCBrZXJuZWwsIGNLIHJlcHJlc2VudHMgc3FydCgyKSAqIGNvcyhLKnBpLzIwKS4KKyAgICovCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNTsgY3RyKyssIGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyspIHsKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB6MyA8PD0gQ09OU1RfQklUUzsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejMgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHoxID0gTVVMVElQTFkoejQsIEZJWCgxLjE0NDEyMjgwNikpOyAgICAgICAgIC8qIGM0ICovCisgICAgejIgPSBNVUxUSVBMWSh6NCwgRklYKDAuNDM3MDE2MDI0KSk7ICAgICAgICAgLyogYzggKi8KKyAgICB0bXAxMCA9IHozICsgejE7CisgICAgdG1wMTEgPSB6MyAtIHoyOworCisgICAgdG1wMjIgPSBSSUdIVF9TSElGVCh6MyAtICgoejEgLSB6MikgPDwgMSksICAgLyogYzAgPSAoYzQtYzgpKjIgKi8KKwkJCUNPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVgoMC44MzEyNTM4NzYpKTsgICAgLyogYzYgKi8KKyAgICB0bXAxMiA9IHoxICsgTVVMVElQTFkoejIsIEZJWCgwLjUxMzc0MzE0OCkpOyAvKiBjMi1jNiAqLworICAgIHRtcDEzID0gejEgLSBNVUxUSVBMWSh6MywgRklYKDIuMTc2MjUwODk5KSk7IC8qIGMyK2M2ICovCisKKyAgICB0bXAyMCA9IHRtcDEwICsgdG1wMTI7CisgICAgdG1wMjQgPSB0bXAxMCAtIHRtcDEyOworICAgIHRtcDIxID0gdG1wMTEgKyB0bXAxMzsKKyAgICB0bXAyMyA9IHRtcDExIC0gdG1wMTM7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgdG1wMTEgPSB6MiArIHo0OworICAgIHRtcDEzID0gejIgLSB6NDsKKworICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTMsIEZJWCgwLjMwOTAxNjk5NCkpOyAgICAgICAgLyogKGMzLWM3KS8yICovCisgICAgejUgPSB6MyA8PCBDT05TVF9CSVRTOworCisgICAgejIgPSBNVUxUSVBMWSh0bXAxMSwgRklYKDAuOTUxMDU2NTE2KSk7ICAgICAgICAgICAvKiAoYzMrYzcpLzIgKi8KKyAgICB6NCA9IHo1ICsgdG1wMTI7CisKKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxLCBGSVgoMS4zOTY4MDIyNDcpKSArIHoyICsgejQ7IC8qIGMxICovCisgICAgdG1wMTQgPSBNVUxUSVBMWSh6MSwgRklYKDAuMjIxMjMxNzQyKSkgLSB6MiArIHo0OyAvKiBjOSAqLworCisgICAgejIgPSBNVUxUSVBMWSh0bXAxMSwgRklYKDAuNTg3Nzg1MjUyKSk7ICAgICAgICAgICAvKiAoYzEtYzkpLzIgKi8KKyAgICB6NCA9IHo1IC0gdG1wMTIgLSAodG1wMTMgPDwgKENPTlNUX0JJVFMgLSAxKSk7CisKKyAgICB0bXAxMiA9ICh6MSAtIHRtcDEzIC0gejMpIDw8IFBBU1MxX0JJVFM7CisKKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxLCBGSVgoMS4yNjAwNzM1MTEpKSAtIHoyIC0gejQ7IC8qIGMzICovCisgICAgdG1wMTMgPSBNVUxUSVBMWSh6MSwgRklYKDAuNjQyMDM5NTIyKSkgLSB6MiArIHo0OyAvKiBjNyAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICB3c3B0cls1KjBdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgKyB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls1KjldID0gKGludCkgUklHSFRfU0hJRlQodG1wMjAgLSB0bXAxMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls1KjFdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgKyB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls1KjhdID0gKGludCkgUklHSFRfU0hJRlQodG1wMjEgLSB0bXAxMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls1KjJdID0gKGludCkgKHRtcDIyICsgdG1wMTIpOworICAgIHdzcHRyWzUqN10gPSAoaW50KSAodG1wMjIgLSB0bXAxMik7CisgICAgd3NwdHJbNSozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzICsgdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNSo2XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDIzIC0gdG1wMTMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNSo0XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI0ICsgdG1wMTQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNSo1XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDI0IC0gdG1wMTQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgMTAgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgorICAgKiA1LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xMCkuCisgICAqLworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAxMDsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMTIgPSAoSU5UMzIpIHdzcHRyWzBdICsgKE9ORSA8PCAoUEFTUzFfQklUUysyKSk7CisgICAgdG1wMTIgPDw9IENPTlNUX0JJVFM7CisgICAgdG1wMTMgPSAoSU5UMzIpIHdzcHRyWzJdOworICAgIHRtcDE0ID0gKElOVDMyKSB3c3B0cls0XTsKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEzICsgdG1wMTQsIEZJWCgwLjc5MDU2OTQxNSkpOyAvKiAoYzIrYzQpLzIgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDEzIC0gdG1wMTQsIEZJWCgwLjM1MzU1MzM5MSkpOyAvKiAoYzItYzQpLzIgKi8KKyAgICB6MyA9IHRtcDEyICsgejI7CisgICAgdG1wMTAgPSB6MyArIHoxOworICAgIHRtcDExID0gejMgLSB6MTsKKyAgICB0bXAxMiAtPSB6MiA8PCAyOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoyID0gKElOVDMyKSB3c3B0clsxXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbM107CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWCgwLjgzMTI1Mzg3NikpOyAgICAgICAvKiBjMyAqLworICAgIHRtcDEzID0gejEgKyBNVUxUSVBMWSh6MiwgRklYKDAuNTEzNzQzMTQ4KSk7ICAgIC8qIGMxLWMzICovCisgICAgdG1wMTQgPSB6MSAtIE1VTFRJUExZKHozLCBGSVgoMi4xNzYyNTA4OTkpKTsgICAgLyogYzErYzMgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAxMywKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDEzLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDExICsgdG1wMTQsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTEgLSB0bXAxNCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgNHg4IG91dHB1dCBibG9jay4KKyAqCisgKiA4LXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgNC1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzR4OCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlWzQqOF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKyAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgSURDVDsgKi8KKyAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSA0OyBjdHIgPiAwOyBjdHItLSkgeworICAgIC8qIER1ZSB0byBxdWFudGl6YXRpb24sIHdlIHdpbGwgdXN1YWxseSBmaW5kIHRoYXQgbWFueSBvZiB0aGUgaW5wdXQKKyAgICAgKiBjb2VmZmljaWVudHMgYXJlIHplcm8sIGVzcGVjaWFsbHkgdGhlIEFDIHRlcm1zLiAgV2UgY2FuIGV4cGxvaXQgdGhpcworICAgICAqIGJ5IHNob3J0LWNpcmN1aXRpbmcgdGhlIElEQ1QgY2FsY3VsYXRpb24gZm9yIGFueSBjb2x1bW4gaW4gd2hpY2ggYWxsCisgICAgICogdGhlIEFDIHRlcm1zIGFyZSB6ZXJvLiAgSW4gdGhhdCBjYXNlIGVhY2ggb3V0cHV0IGlzIGVxdWFsIHRvIHRoZQorICAgICAqIERDIGNvZWZmaWNpZW50ICh3aXRoIHNjYWxlIGZhY3RvciBhcyBuZWVkZWQpLgorICAgICAqIFdpdGggdHlwaWNhbCBpbWFnZXMgYW5kIHF1YW50aXphdGlvbiB0YWJsZXMsIGhhbGYgb3IgbW9yZSBvZiB0aGUKKyAgICAgKiBjb2x1bW4gRENUIGNhbGN1bGF0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCB0aGlzIHdheS4KKyAgICAgKi8KKworICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCisJaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7CisKKyAgICAgIHdzcHRyWzQqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyWzQqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyWzQqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyWzQqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyWzQqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyWzQqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyWzQqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyWzQqN10gPSBkY3ZhbDsKKworICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgdG1wMiA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgdG1wMyA9IHoxIC0gTVVMVElQTFkoejMsIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB6MiA8PD0gQ09OU1RfQklUUzsKKyAgICB6MyA8PD0gQ09OU1RfQklUUzsKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgejIgKz0gT05FIDw8IChDT05TVF9CSVRTLVBBU1MxX0JJVFMtMSk7CisKKyAgICB0bXAwID0gejIgKyB6MzsKKyAgICB0bXAxID0gejIgLSB6MzsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEzID0gdG1wMCAtIHRtcDI7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMzsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAzOworCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cworICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgorICAgICAqLworCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisKKyAgICB6MiA9IHRtcDAgKyB0bXAyOworICAgIHozID0gdG1wMSArIHRtcDM7CisKKyAgICB6MSA9IE1VTFRJUExZKHoyICsgejMsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIHoyICs9IHoxOworICAgIHozICs9IHoxOworCisgICAgejEgPSBNVUxUSVBMWSh0bXAwICsgdG1wMywgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgdG1wMCArPSB6MSArIHoyOworICAgIHRtcDMgKz0gejEgKyB6MzsKKworICAgIHoxID0gTVVMVElQTFkodG1wMSArIHRtcDIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXAxICs9IHoxICsgejM7CisgICAgdG1wMiArPSB6MSArIHoyOworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLworCisgICAgd3NwdHJbNCowXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls0KjddID0gKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzQqMV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMSArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNCo2XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls0KjJdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyWzQqNV0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbNCozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cls0KjRdID0gKGludCkgUklHSFRfU0hJRlQodG1wMTMgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworCisgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgcXVhbnRwdHIrKzsKKyAgICB3c3B0cisrOworICB9CisKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDggcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LgorICAgKiA0LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNikuCisgICAqLworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA4OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDIgPSAoSU5UMzIpIHdzcHRyWzJdOworCisgICAgdG1wMTAgPSAodG1wMCArIHRtcDIpIDw8IENPTlNUX0JJVFM7CisgICAgdG1wMTIgPSAodG1wMCAtIHRtcDIpIDw8IENPTlNUX0JJVFM7CisKKyAgICAvKiBPZGQgcGFydCAqLworICAgIC8qIFNhbWUgcm90YXRpb24gYXMgaW4gdGhlIGV2ZW4gcGFydCBvZiB0aGUgOHg4IExMJk0gSURDVCAqLworCisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHozID0gKElOVDMyKSB3c3B0clszXTsKKworICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsgICAvKiBjNiAqLworICAgIHRtcDAgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOyAvKiBjMi1jNiAqLworICAgIHRtcDIgPSB6MSAtIE1VTFRJUExZKHozLCBGSVhfMV84NDc3NTkwNjUpOyAvKiBjMitjNiAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgLSB0bXAwLAorCQkJCQkgICAgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEyICsgdG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMiAtIHRtcDIsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gNDsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgM3g2IG91dHB1dCBibG9jay4KKyAqCisgKiA2LXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgMy1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzN4NiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAxMCwgdG1wMTEsIHRtcDEyOworICBJTlQzMiB6MSwgejIsIHozOworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbMyo2XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgorICAgKiA2LXBvaW50IElEQ1Qga2VybmVsLCBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xMikuCisgICAqLworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDM7IGN0cisrLCBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrKSB7CisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSBDT05TVF9CSVRTOworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwICs9IE9ORSA8PCAoQ09OU1RfQklUUy1QQVNTMV9CSVRTLTEpOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDEwID0gTVVMVElQTFkodG1wMiwgRklYKDAuNzA3MTA2NzgxKSk7ICAgLyogYzQgKi8KKyAgICB0bXAxID0gdG1wMCArIHRtcDEwOworICAgIHRtcDExID0gUklHSFRfU0hJRlQodG1wMCAtIHRtcDEwIC0gdG1wMTAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgdG1wMTAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMCwgRklYKDEuMjI0NzQ0ODcxKSk7ICAgLyogYzIgKi8KKyAgICB0bXAxMCA9IHRtcDEgKyB0bXAwOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDA7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wMSA9IE1VTFRJUExZKHoxICsgejMsIEZJWCgwLjM2NjAyNTQwNCkpOyAvKiBjNSAqLworICAgIHRtcDAgPSB0bXAxICsgKCh6MSArIHoyKSA8PCBDT05TVF9CSVRTKTsKKyAgICB0bXAyID0gdG1wMSArICgoejMgLSB6MikgPDwgQ09OU1RfQklUUyk7CisgICAgdG1wMSA9ICh6MSAtIHoyIC0gejMpIDw8IFBBU1MxX0JJVFM7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzMqMF0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMCArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbMyo1XSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0clszKjFdID0gKGludCkgKHRtcDExICsgdG1wMSk7CisgICAgd3NwdHJbMyo0XSA9IChpbnQpICh0bXAxMSAtIHRtcDEpOworICAgIHdzcHRyWzMqMl0gPSAoaW50KSBSSUdIVF9TSElGVCh0bXAxMiArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbMyozXSA9IChpbnQpIFJJR0hUX1NISUZUKHRtcDEyIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyA2IHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4KKyAgICogMy1wb2ludCBJRENUIGtlcm5lbCwgY0sgcmVwcmVzZW50cyBzcXJ0KDIpICogY29zKEsqcGkvNikuCisgICAqLworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCA2OyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIC8qIEFkZCBmdWRnZSBmYWN0b3IgaGVyZSBmb3IgZmluYWwgZGVzY2FsZS4gKi8KKyAgICB0bXAwID0gKElOVDMyKSB3c3B0clswXSArIChPTkUgPDwgKFBBU1MxX0JJVFMrMikpOworICAgIHRtcDAgPDw9IENPTlNUX0JJVFM7CisgICAgdG1wMiA9IChJTlQzMikgd3NwdHJbMl07CisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAyLCBGSVgoMC43MDcxMDY3ODEpKTsgLyogYzIgKi8KKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAxMjsKKyAgICB0bXAyID0gdG1wMCAtIHRtcDEyIC0gdG1wMTI7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTIgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAxMiwgRklYKDEuMjI0NzQ0ODcxKSk7IC8qIGMxICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIFJJR0hUX1NISUZUKHRtcDEwICsgdG1wMCwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsCisJCQkJCSAgICAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMiwKKwkJCQkJICAgICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKworICAgIHdzcHRyICs9IDM7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgMng0IG91dHB1dCBibG9jay4KKyAqCisgKiA0LXBvaW50IElEQ1QgaW4gcGFzcyAxIChjb2x1bW5zKSwgMi1wb2ludCBpbiBwYXNzIDIgKHJvd3MpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzJ4NCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAyLCB0bXAxMCwgdG1wMTI7CisgIElOVDMyIHoxLCB6MiwgejM7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSU5UMzIgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBJTlQzMiB3b3Jrc3BhY2VbMio0XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LgorICAgKiA0LXBvaW50IElEQ1Qga2VybmVsLAorICAgKiBjSyByZXByZXNlbnRzIHNxcnQoMikgKiBjb3MoSypwaS8xNikgW3JlZmVycyB0byA4LXBvaW50IElEQ1RdLgorICAgKi8KKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAyOyBjdHIrKywgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKykgeworICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisKKyAgICB0bXAxMCA9ICh0bXAwICsgdG1wMikgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxMiA9ICh0bXAwIC0gdG1wMikgPDwgQ09OU1RfQklUUzsKKworICAgIC8qIE9kZCBwYXJ0ICovCisgICAgLyogU2FtZSByb3RhdGlvbiBhcyBpbiB0aGUgZXZlbiBwYXJ0IG9mIHRoZSA4eDggTEwmTSBJRENUICovCisKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOyAgIC8qIGM2ICovCisgICAgdG1wMCA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7IC8qIGMyLWM2ICovCisgICAgdG1wMiA9IHoxIC0gTVVMVElQTFkoejMsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIGMyK2M2ICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICAgIHdzcHRyWzIqMF0gPSB0bXAxMCArIHRtcDA7CisgICAgd3NwdHJbMiozXSA9IHRtcDEwIC0gdG1wMDsKKyAgICB3c3B0clsyKjFdID0gdG1wMTIgKyB0bXAyOworICAgIHdzcHRyWzIqMl0gPSB0bXAxMiAtIHRtcDI7CisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgNCByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgICAgdG1wMTAgPSB3c3B0clswXSArIChPTkUgPDwgKENPTlNUX0JJVFMrMikpOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDAgPSB3c3B0clsxXTsKKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworCisgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAwLCBDT05TVF9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsIENPTlNUX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworCisgICAgd3NwdHIgKz0gMjsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSAxeDIgb3V0cHV0IGJsb2NrLgorICoKKyAqIDItcG9pbnQgSURDVCBpbiBwYXNzIDEgKGNvbHVtbnMpLCAxLXBvaW50IGluIHBhc3MgMiAocm93cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfMXgyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElOVDMyIHRtcDAsIHRtcDEwOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQcm9jZXNzIDEgY29sdW1uIGZyb20gaW5wdXQsIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisKKyAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgIHRtcDEwID0gREVRVUFOVElaRShjb2VmX2Jsb2NrW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAvKiBBZGQgZnVkZ2UgZmFjdG9yIGhlcmUgZm9yIGZpbmFsIGRlc2NhbGUuICovCisgIHRtcDEwICs9IE9ORSA8PCAyOworCisgIC8qIE9kZCBwYXJ0ICovCisKKyAgdG1wMCA9IERFUVVBTlRJWkUoY29lZl9ibG9ja1tEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKworICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKworICBvdXRwdXRfYnVmWzBdW291dHB1dF9jb2xdID0gcmFuZ2VfbGltaXRbKGludCkgUklHSFRfU0hJRlQodG1wMTAgKyB0bXAwLCAzKQorCQkJCQkgICYgUkFOR0VfTUFTS107CisgIG91dHB1dF9idWZbMV1bb3V0cHV0X2NvbF0gPSByYW5nZV9saW1pdFsoaW50KSBSSUdIVF9TSElGVCh0bXAxMCAtIHRtcDAsIDMpCisJCQkJCSAgJiBSQU5HRV9NQVNLXTsKK30KKworI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KICNlbmRpZiAvKiBEQ1RfSVNMT1dfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9qaWRjdHJlZC5jIGIvamlkY3RyZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZjNjNy4uMDAwMDAwMAotLS0gYS9qaWRjdHJlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0gKiBqaWRjdHJlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW52ZXJzZS1EQ1Qgcm91dGluZXMgdGhhdCBwcm9kdWNlIHJlZHVjZWQtc2l6ZSBvdXRwdXQ6Ci0gKiBlaXRoZXIgNHg0LCAyeDIsIG9yIDF4MSBwaXhlbHMgZnJvbSBhbiA4eDggRENUIGJsb2NrLgotICoKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgTG9lZmZsZXIsIExpZ3RlbmJlcmcgYW5kIE1vc2NoeXR6IChMTCZNKQotICogYWxnb3JpdGhtIHVzZWQgaW4gamlkY3RpbnQuYy4gIFdlIHNpbXBseSByZXBsYWNlIGVhY2ggOC10by04IDEtRCBJRENUIHN0ZXAKLSAqIHdpdGggYW4gOC10by00IHN0ZXAgdGhhdCBwcm9kdWNlcyB0aGUgZm91ciBhdmVyYWdlcyBvZiB0d28gYWRqYWNlbnQgb3V0cHV0cwotICogKG9yIGFuIDgtdG8tMiBzdGVwIHByb2R1Y2luZyB0d28gYXZlcmFnZXMgb2YgZm91ciBvdXRwdXRzLCBmb3IgMngyIG91dHB1dCkuCi0gKiBUaGVzZSBzdGVwcyB3ZXJlIGRlcml2ZWQgYnkgY29tcHV0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgbm9ybWFsIExMJk0gY29kZSwgdGhlbiBzaW1wbGlmeWluZyBhcyBtdWNoIGFzIHBvc3NpYmxlLgotICoKLSAqIDF4MSBpcyB0cml2aWFsOiBqdXN0IHRha2UgdGhlIERDIGNvZWZmaWNpZW50IGRpdmlkZWQgYnkgOC4KLSAqCi0gKiBTZWUgamlkY3RpbnQuYyBmb3IgYWRkaXRpb25hbCBjb21tZW50cy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLQotCi0vKgotICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi0gKi8KLQotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotCi0vKiBTY2FsaW5nIGlzIHRoZSBzYW1lIGFzIGluIGppZGN0aW50LmMuICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAyCi0jZWxzZQotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSAxMwotI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgICgoSU5UMzIpICAxNzMwKQkvKiBGSVgoMC4yMTExNjQyNDMpICovCi0jZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgKChJTlQzMikgIDQxNzYpCS8qIEZJWCgwLjUwOTc5NTU3OSkgKi8KLSNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICAoKElOVDMyKSAgNDkyNikJLyogRklYKDAuNjAxMzQ0ODg3KSAqLwotI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgICgoSU5UMzIpICA1OTA2KQkvKiBGSVgoMC43MjA5NTk4MjIpICovCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KLSNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICAoKElOVDMyKSAgNjk2NykJLyogRklYKDAuODUwNDMwMDk1KSAqLwotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCi0jZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgKChJTlQzMikgIDg2OTcpCS8qIEZJWCgxLjA2MTU5NDMzNykgKi8KLSNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICAoKElOVDMyKSAgMTA0MjYpCS8qIEZJWCgxLjI3Mjc1ODU4MCkgKi8KLSNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICAoKElOVDMyKSAgMTE4OTMpCS8qIEZJWCgxLjQ1MTc3NDk4MSkgKi8KLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KLSNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICAoKElOVDMyKSAgMTc3OTkpCS8qIEZJWCgyLjE3MjczNDgwMykgKi8KLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KLSNkZWZpbmUgRklYXzNfNjI0NTA5Nzg1ICAoKElOVDMyKSAgMjk2OTIpCS8qIEZJWCgzLjYyNDUwOTc4NSkgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgRklYKDAuMjExMTY0MjQzKQotI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgIEZJWCgwLjUwOTc5NTU3OSkKLSNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICBGSVgoMC42MDEzNDQ4ODcpCi0jZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgRklYKDAuNzIwOTU5ODIyKQotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKLSNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICBGSVgoMC44NTA0MzAwOTUpCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQotI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgIEZJWCgxLjA2MTU5NDMzNykKLSNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICBGSVgoMS4yNzI3NTg1ODApCi0jZGVmaW5lIEZJWF8xXzQ1MTc3NDk4MSAgRklYKDEuNDUxNzc0OTgxKQotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKLSNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICBGSVgoMi4xNzI3MzQ4MDMpCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQotI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgIEZJWCgzLjYyNDUwOTc4NSkKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KLSAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKLSAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKLSAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCi0gKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQotI2Vsc2UKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKLSNlbmRpZgotCi0KLS8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQotICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0Ci0gKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KLSAqLwotCi0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCi0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi0gKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgNHg0IG91dHB1dCBibG9jay4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMiwgdG1wMTAsIHRtcDEyOwotICBJTlQzMiB6MSwgejIsIHozLCB6NDsKLSAgSkNPRUZQVFIgaW5wdHI7Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBpbnQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBpbnQgd29ya3NwYWNlW0RDVFNJWkUqNF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyssIGN0ci0tKSB7Ci0gICAgLyogRG9uJ3QgYm90aGVyIHRvIHByb2Nlc3MgY29sdW1uIDQsIGJlY2F1c2Ugc2Vjb25kIHBhc3Mgd29uJ3QgdXNlIGl0ICovCi0gICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTQpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtIDQgZm9yIDR4NCBvdXRwdXQgKi8KLSAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKLSAgICAgIAotICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOwotICAgICAgCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMCA8PD0gKENPTlNUX0JJVFMrMSk7Ci0gICAgCi0gICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOwotICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKLQotICAgIHRtcDIgPSBNVUxUSVBMWSh6MiwgRklYXzFfODQ3NzU5MDY1KSArIE1VTFRJUExZKHozLCAtIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0gICAgCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCi0JICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KLQkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLwotICAgIAotICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCi0JICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLwotCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIDQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLwotCi0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvKiBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIGEgemVybyByb3cgdGVzdCBpcyB3b3J0aHdoaWxlIGhlcmUgLi4uICovCi0KLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJgotCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQotCQkJCSAgJiBSQU5HRV9NQVNLXTsKLSAgICAgIAotICAgICAgb3V0cHRyWzBdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsyXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzNdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSkgPDwgKENPTlNUX0JJVFMrMSk7Ci0gICAgCi0gICAgdG1wMiA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbMl0sIEZJWF8xXzg0Nzc1OTA2NSkKLQkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzZdLCAtIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0gICAgCi0gICAgejEgPSAoSU5UMzIpIHdzcHRyWzddOwotICAgIHoyID0gKElOVDMyKSB3c3B0cls1XTsKLSAgICB6MyA9IChJTlQzMikgd3NwdHJbM107Ci0gICAgejQgPSAoSU5UMzIpIHdzcHRyWzFdOwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCi0JICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KLQkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLwotICAgIAotICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCi0JICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLwotCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi0gKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMngyIG91dHB1dCBibG9jay4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMTAsIHoxOwotICBKQ09FRlBUUiBpbnB0cjsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIGludCAqIHdzcHRyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIGludCBjdHI7Ci0gIGludCB3b3Jrc3BhY2VbRENUU0laRSoyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotCi0gIGlucHRyID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW5zIDIsNCw2ICovCi0gICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTIgfHwgY3RyID09IERDVFNJWkUtNCB8fCBjdHIgPT0gRENUU0laRS02KQotICAgICAgY29udGludWU7Ci0gICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtcyAyLDQsNiBmb3IgMngyIG91dHB1dCAqLwotICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOwotICAgICAgCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMTAgPSB6MSA8PCAoQ09OU1RfQklUUysyKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF83MjA5NTk4MjIpOyAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLwotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfMF84NTA0MzAwOTUpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgLSBGSVhfMV8yNzI3NTg1ODApOyAvKiBzcXJ0KDIpICogKC1jMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KLQotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLwotICAgIAotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOwotICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOwotICB9Ci0gIAotICAvKiBQYXNzIDI6IHByb2Nlc3MgMiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgMjsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KLQotI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCi0gICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls1XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysyKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wMCA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbN10sIC0gRklYXzBfNzIwOTU5ODIyKSAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLwotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNV0sIEZJWF8wXzg1MDQzMDA5NSkgLyogc3FydCgyKSAqICgtYzErYzMrYzUrYzcpICovCi0JICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clszXSwgLSBGSVhfMV8yNzI3NTg1ODApIC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLwotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbMV0sIEZJWF8zXzYyNDUwOTc4NSk7IC8qIHNxcnQoMikgKiAoYzErYzMrYzUrYzcpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIAotICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDF4MSBvdXRwdXQgYmxvY2suCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfMXgxIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIGludCBkY3ZhbDsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogV2UgaGFyZGx5IG5lZWQgYW4gaW52ZXJzZSBEQ1Qgcm91dGluZSBmb3IgdGhpczoganVzdCB0YWtlIHRoZQotICAgKiBhdmVyYWdlIHBpeGVsIHZhbHVlLCB3aGljaCBpcyBvbmUtZWlnaHRoIG9mIHRoZSBEQyBjb2VmZmljaWVudC4KLSAgICovCi0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIGRjdmFsID0gREVRVUFOVElaRShjb2VmX2Jsb2NrWzBdLCBxdWFudHB0clswXSk7Ci0gIGRjdmFsID0gKGludCkgREVTQ0FMRSgoSU5UMzIpIGRjdmFsLCAzKTsKLQotICBvdXRwdXRfYnVmWzBdW291dHB1dF9jb2xdID0gcmFuZ2VfbGltaXRbZGN2YWwgJiBSQU5HRV9NQVNLXTsKLX0KLQotI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2ptb3JlY2ZnLmggYi9qbW9yZWNmZy5oCmluZGV4IGJkNmQ2MDUuLmM2MTBiYzIgMTAwNjQ0Ci0tLSBhL2ptb3JlY2ZnLmgKKysrIGIvam1vcmVjZmcuaApAQCAtMiw2ICsyLDcgQEAKICAqIGptb3JlY2ZnLmgKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAxOTk3LTIwMDkgYnkgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtMTU4LDggKzE1OSwxMiBAQAogLyogSU5UMzIgbXVzdCBob2xkIGF0IGxlYXN0IHNpZ25lZCAzMi1iaXQgdmFsdWVzLiAqLwogCiAjaWZuZGVmIFhNRF9ICQkJLyogWDExL3htZC5oIGNvcnJlY3RseSBkZWZpbmVzIElOVDMyICovCisjaWZuZGVmIF9CQVNFVFNEX0hfCQkvKiBNaWNyb3NvZnQgZGVmaW5lcyBpdCBpbiBiYXNldHNkLmggKi8KKyNpZm5kZWYgUUdMT0JBTF9ICQkvKiBRdCBkZWZpbmVzIGl0IGluIHFnbG9iYWwuaCAqLwogdHlwZWRlZiBsb25nIElOVDMyOwogI2VuZGlmCisjZW5kaWYKKyNlbmRpZgogCiAvKiBEYXRhdHlwZSB1c2VkIGZvciBpbWFnZSBkaW1lbnNpb25zLiAgVGhlIEpQRUcgc3RhbmRhcmQgb25seSBzdXBwb3J0cwogICogaW1hZ2VzIHVwIHRvIDY0Syo2NEsgZHVlIHRvIDE2LWJpdCBmaWVsZHMgaW4gU09GIG1hcmtlcnMuICBUaGVyZWZvcmUKQEAgLTIwOSwxMSArMjE0LDEzIEBACiAgKiBleHBsaWNpdCBjb2RpbmcgaXMgbmVlZGVkOyBzZWUgdXNlcyBvZiB0aGUgTkVFRF9GQVJfUE9JTlRFUlMgc3ltYm9sLgogICovCiAKKyNpZm5kZWYgRkFSCiAjaWZkZWYgTkVFRF9GQVJfUE9JTlRFUlMKICNkZWZpbmUgRkFSICBmYXIKICNlbHNlCiAjZGVmaW5lIEZBUgogI2VuZGlmCisjZW5kaWYKIAogCiAvKgpAQCAtMjU2LDggKzI2Myw2IEBACiAgKiAoWW91IG1heSBIQVZFIHRvIGRvIHRoYXQgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGxpa2UgbnVsbCBzb3VyY2UgZmlsZXMuKQogICovCiAKLS8qIEFyaXRobWV0aWMgY29kaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLiAgQ29tcGxhaW50cyB0byBJQk0uICovCi0KIC8qIENhcGFiaWxpdHkgb3B0aW9ucyBjb21tb24gdG8gZW5jb2RlciBhbmQgZGVjb2RlcjogKi8KIAogI2RlZmluZSBEQ1RfSVNMT1dfU1VQUE9SVEVECS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCkBAIC0yNjksNiArMjc0LDcgQEAKICNkZWZpbmUgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVEICAgIC8qIEFyaXRobWV0aWMgY29kaW5nIGJhY2sgZW5kPyAqLwogI2RlZmluZSBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgLyogTXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzPyAqLwogI2RlZmluZSBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAkgICAgLyogUHJvZ3Jlc3NpdmUgSlBFRz8gKFJlcXVpcmVzIE1VTFRJU0NBTikqLworI2RlZmluZSBEQ1RfU0NBTElOR19TVVBQT1JURUQJICAgIC8qIElucHV0IHJlc2NhbGluZyB2aWEgRENUPyAoUmVxdWlyZXMgRENUX0lTTE9XKSovCiAjZGVmaW5lIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAkgICAgLyogT3B0aW1pemF0aW9uIG9mIGVudHJvcHkgY29kaW5nIHBhcm1zPyAqLwogLyogTm90ZTogaWYgeW91IHNlbGVjdGVkIDEyLWJpdCBkYXRhIHByZWNpc2lvbiwgaXQgaXMgZGFuZ2Vyb3VzIHRvIHR1cm4gb2ZmCiAgKiBFTlRST1BZX09QVF9TVVBQT1JURUQuICBUaGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgYXJlIG9ubHkgZ29vZCBmb3IgOC1iaXQKQEAgLTI4NSw5ICsyOTEsOSBAQAogI2RlZmluZSBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCiAjZGVmaW5lIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCiAjZGVmaW5lIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCisjZGVmaW5lIElEQ1RfU0NBTElOR19TVVBQT1JURUQJICAgIC8qIE91dHB1dCByZXNjYWxpbmcgdmlhIElEQ1Q/ICovCiAjZGVmaW5lIFNBVkVfTUFSS0VSU19TVVBQT1JURUQJICAgIC8qIGpwZWdfc2F2ZV9tYXJrZXJzKCkgbmVlZGVkPyAqLwogI2RlZmluZSBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICAgLyogQmxvY2sgc21vb3RoaW5nPyAoUHJvZ3Jlc3NpdmUgb25seSkgKi8KLSNkZWZpbmUgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAkgICAgLyogT3V0cHV0IHJlc2NhbGluZyB2aWEgSURDVD8gKi8KICN1bmRlZiAgVVBTQU1QTEVfU0NBTElOR19TVVBQT1JURUQgIC8qIE91dHB1dCByZXNjYWxpbmcgYXQgdXBzYW1wbGUgc3RhZ2U/ICovCiAjZGVmaW5lIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICAvKiBGYXN0IHBhdGggZm9yIHNsb3BweSB1cHNhbXBsaW5nPyAqLwogI2RlZmluZSBRVUFOVF8xUEFTU19TVVBQT1JURUQJICAgIC8qIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24/ICovCmRpZmYgLS1naXQgYS9qcGVnaW50LmggYi9qcGVnaW50LmgKaW5kZXggMzM3ODEzMy4uNjliNzgxYiAxMDA2NDQKLS0tIGEvanBlZ2ludC5oCisrKyBiL2pwZWdpbnQuaApAQCAtMiw2ICsyLDcgQEAKICAqIGpwZWdpbnQuaAogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIE1vZGlmaWVkIDE5OTctMjAwOSBieSBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC05OSwxNCArMTAwLDE2IEBACiB9OwogCiAvKiBGb3J3YXJkIERDVCAoYWxzbyBjb250cm9scyBjb2VmZmljaWVudCBxdWFudGl6YXRpb24pICovCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1RfcHRyLAorCQkoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAorCQkgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAorCQkgSkRJTUVOU0lPTiBudW1fYmxvY2tzKSk7CisKIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHsKICAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogcGVyaGFwcyB0aGlzIHNob3VsZCBiZSBhbiBhcnJheT8/PyAqLwotICBKTUVUSE9EKHZvaWQsIGZvcndhcmRfRENULCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJCSAgICAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpCTE9DS1JPVyBjb2VmX2Jsb2NrcywKLQkJCSAgICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKLQkJCSAgICAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykpOworICAvKiBJdCBpcyB1c2VmdWwgdG8gYWxsb3cgZWFjaCBjb21wb25lbnQgdG8gaGF2ZSBhIHNlcGFyYXRlIEZEQ1QgbWV0aG9kLiAqLworICBmb3J3YXJkX0RDVF9wdHIgZm9yd2FyZF9EQ1RbTUFYX0NPTVBPTkVOVFNdOwogfTsKIAogLyogRW50cm9weSBlbmNvZGluZyAqLwpAQCAtMzAzLDcgKzMwNiw3IEBACiAjZGVmaW5lIGppbml0X2Rvd25zYW1wbGVyCWpJRG93bnNhbXBsZXIKICNkZWZpbmUgamluaXRfZm9yd2FyZF9kY3QJaklGRENUCiAjZGVmaW5lIGppbml0X2h1ZmZfZW5jb2RlcglqSUhFbmNvZGVyCi0jZGVmaW5lIGppbml0X3BodWZmX2VuY29kZXIJaklQSEVuY29kZXIKKyNkZWZpbmUgamluaXRfYXJpdGhfZW5jb2RlcglqSUFFbmNvZGVyCiAjZGVmaW5lIGppbml0X21hcmtlcl93cml0ZXIJaklNV3JpdGVyCiAjZGVmaW5lIGppbml0X21hc3Rlcl9kZWNvbXByZXNzCWpJRE1hc3RlcgogI2RlZmluZSBqaW5pdF9kX21haW5fY29udHJvbGxlcglqSURNYWluQwpAQCAtMzEyLDcgKzMxNSw3IEBACiAjZGVmaW5lIGppbml0X2lucHV0X2NvbnRyb2xsZXIJaklJbkN0bHIKICNkZWZpbmUgamluaXRfbWFya2VyX3JlYWRlcglqSU1SZWFkZXIKICNkZWZpbmUgamluaXRfaHVmZl9kZWNvZGVyCWpJSERlY29kZXIKLSNkZWZpbmUgamluaXRfcGh1ZmZfZGVjb2RlcglqSVBIRGVjb2RlcgorI2RlZmluZSBqaW5pdF9hcml0aF9kZWNvZGVyCWpJQURlY29kZXIKICNkZWZpbmUgamluaXRfaW52ZXJzZV9kY3QJaklJRENUCiAjZGVmaW5lIGppbml0X3Vwc2FtcGxlcgkJaklVcHNhbXBsZXIKICNkZWZpbmUgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIJaklEQ29sb3IKQEAgLTM0NCw3ICszNDcsNiBAQAogRVhURVJOKHZvaWQpIGppbml0X2Rvd25zYW1wbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKIEVYVEVSTih2b2lkKSBqaW5pdF9mb3J3YXJkX2RjdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CiBFWFRFUk4odm9pZCkgamluaXRfaHVmZl9lbmNvZGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9waHVmZl9lbmNvZGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKIEVYVEVSTih2b2lkKSBqaW5pdF9hcml0aF9lbmNvZGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKIEVYVEVSTih2b2lkKSBqaW5pdF9tYXJrZXJfd3JpdGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKIC8qIERlY29tcHJlc3Npb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCkBAIC0zNTgsNyArMzYwLDYgQEAKIEVYVEVSTih2b2lkKSBqaW5pdF9pbnB1dF9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwogRVhURVJOKHZvaWQpIGppbml0X21hcmtlcl9yZWFkZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CiBFWFRFUk4odm9pZCkgamluaXRfaHVmZl9kZWNvZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X3BodWZmX2RlY29kZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CiBFWFRFUk4odm9pZCkgamluaXRfYXJpdGhfZGVjb2RlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKIEVYVEVSTih2b2lkKSBqaW5pdF9pbnZlcnNlX2RjdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKIEVYVEVSTih2b2lkKSBqaW5pdF91cHNhbXBsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CmRpZmYgLS1naXQgYS9qcGVnbGliLmggYi9qcGVnbGliLmgKaW5kZXggZDFiZThkZC4uMzQxYTE5YyAxMDA2NDQKLS0tIGEvanBlZ2xpYi5oCisrKyBiL2pwZWdsaWIuaApAQCAtMiw2ICsyLDcgQEAKICAqIGpwZWdsaWIuaAogICoKICAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIE1vZGlmaWVkIDIwMDItMjAwOSBieSBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC0yNiwxMSArMjcsMTcgQEAKICNpbmNsdWRlICJqbW9yZWNmZy5oIgkJLyogc2VsZG9tIGNoYW5nZWQgb3B0aW9ucyAqLwogCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBET05UX1VTRV9FWFRFUk5fQworZXh0ZXJuICJDIiB7CisjZW5kaWYKKyNlbmRpZgorCiAvKiBWZXJzaW9uIElEIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgotICogTWlnaHQgYmUgdXNlZnVsIGZvciB0ZXN0cyBsaWtlICIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MCIuCisgKiBNaWdodCBiZSB1c2VmdWwgZm9yIHRlc3RzIGxpa2UgIiNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDcwIi4KICAqLwogCi0jZGVmaW5lIEpQRUdfTElCX1ZFUlNJT04gIDYyCS8qIFZlcnNpb24gNmIgKi8KKyNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTiAgNzAJLyogVmVyc2lvbiA3LjAgKi8KIAogCiAvKiBWYXJpb3VzIGNvbnN0YW50cyBkZXRlcm1pbmluZyB0aGUgc2l6ZXMgb2YgdGhpbmdzLgpAQCAtMTM4LDE4ICsxNDUsMTggQEAKICAgICovCiAgIEpESU1FTlNJT04gd2lkdGhfaW5fYmxvY2tzOwogICBKRElNRU5TSU9OIGhlaWdodF9pbl9ibG9ja3M7Ci0gIC8qIFNpemUgb2YgYSBEQ1QgYmxvY2sgaW4gc2FtcGxlcy4gIEFsd2F5cyBEQ1RTSVpFIGZvciBjb21wcmVzc2lvbi4KLSAgICogRm9yIGRlY29tcHJlc3Npb24gdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGZyb20gb25lIERDVCBibG9jaywKLSAgICogcmVmbGVjdGluZyBhbnkgc2NhbGluZyB3ZSBjaG9vc2UgdG8gYXBwbHkgZHVyaW5nIHRoZSBJRENUIHN0ZXAuCi0gICAqIFZhbHVlcyBvZiAxLDIsNCw4IGFyZSBsaWtlbHkgdG8gYmUgc3VwcG9ydGVkLiAgTm90ZSB0aGF0IGRpZmZlcmVudAotICAgKiBjb21wb25lbnRzIG1heSByZWNlaXZlIGRpZmZlcmVudCBJRENUIHNjYWxpbmdzLgorICAvKiBTaXplIG9mIGEgRENUIGJsb2NrIGluIHNhbXBsZXMsCisgICAqIHJlZmxlY3RpbmcgYW55IHNjYWxpbmcgd2UgY2hvb3NlIHRvIGFwcGx5IGR1cmluZyB0aGUgRENUIHN0ZXAuCisgICAqIFZhbHVlcyBmcm9tIDEgdG8gMTYgYXJlIHN1cHBvcnRlZC4KKyAgICogTm90ZSB0aGF0IGRpZmZlcmVudCBjb21wb25lbnRzIG1heSByZWNlaXZlIGRpZmZlcmVudCBEQ1Qgc2NhbGluZ3MuCiAgICAqLwotICBpbnQgRENUX3NjYWxlZF9zaXplOworICBpbnQgRENUX2hfc2NhbGVkX3NpemU7CisgIGludCBEQ1Rfdl9zY2FsZWRfc2l6ZTsKICAgLyogVGhlIGRvd25zYW1wbGVkIGRpbWVuc2lvbnMgYXJlIHRoZSBjb21wb25lbnQncyBhY3R1YWwsIHVucGFkZGVkIG51bWJlcgotICAgKiBvZiBzYW1wbGVzIGF0IHRoZSBtYWluIGJ1ZmZlciAocHJlcHJvY2Vzc2luZy9jb21wcmVzc2lvbiBpbnRlcmZhY2UpLCB0aHVzCi0gICAqIGRvd25zYW1wbGVkX3dpZHRoID0gY2VpbChpbWFnZV93aWR0aCAqIEhpL0htYXgpCi0gICAqIGFuZCBzaW1pbGFybHkgZm9yIGhlaWdodC4gIEZvciBkZWNvbXByZXNzaW9uLCBJRENUIHNjYWxpbmcgaXMgaW5jbHVkZWQsIHNvCi0gICAqIGRvd25zYW1wbGVkX3dpZHRoID0gY2VpbChpbWFnZV93aWR0aCAqIEhpL0htYXggKiBEQ1Rfc2NhbGVkX3NpemUvRENUU0laRSkKKyAgICogb2Ygc2FtcGxlcyBhdCB0aGUgbWFpbiBidWZmZXIgKHByZXByb2Nlc3NpbmcvY29tcHJlc3Npb24gaW50ZXJmYWNlKTsKKyAgICogRENUIHNjYWxpbmcgaXMgaW5jbHVkZWQsIHNvCisgICAqIGRvd25zYW1wbGVkX3dpZHRoID0gY2VpbChpbWFnZV93aWR0aCAqIEhpL0htYXggKiBEQ1RfaF9zY2FsZWRfc2l6ZS9EQ1RTSVpFKQorICAgKiBhbmQgc2ltaWxhcmx5IGZvciBoZWlnaHQuCiAgICAqLwogICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoOwkgLyogYWN0dWFsIHdpZHRoIGluIHNhbXBsZXMgKi8KICAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF9oZWlnaHQ7IC8qIGFjdHVhbCBoZWlnaHQgaW4gc2FtcGxlcyAqLwpAQCAtMjkxLDYgKzI5OCwxNyBAQAogICAgKiBoZWxwZXIgcm91dGluZXMgdG8gc2ltcGxpZnkgY2hhbmdpbmcgcGFyYW1ldGVycy4KICAgICovCiAKKyAgdW5zaWduZWQgaW50IHNjYWxlX251bSwgc2NhbGVfZGVub207IC8qIGZyYWN0aW9uIGJ5IHdoaWNoIHRvIHNjYWxlIGltYWdlICovCisKKyAgSkRJTUVOU0lPTiBqcGVnX3dpZHRoOwkvKiBzY2FsZWQgSlBFRyBpbWFnZSB3aWR0aCAqLworICBKRElNRU5TSU9OIGpwZWdfaGVpZ2h0OwkvKiBzY2FsZWQgSlBFRyBpbWFnZSBoZWlnaHQgKi8KKyAgLyogRGltZW5zaW9ucyBvZiBhY3R1YWwgSlBFRyBpbWFnZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBmaWxlLAorICAgKiBkZXJpdmVkIGZyb20gaW5wdXQgZGltZW5zaW9ucyBieSBzY2FsaW5nIGZhY3RvcnMgYWJvdmUuCisgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgYnkganBlZ19zdGFydF9jb21wcmVzcygpLgorICAgKiBZb3UgY2FuIGFsc28gdXNlIGpwZWdfY2FsY19qcGVnX2RpbWVuc2lvbnMoKSB0byBkZXRlcm1pbmUgdGhlc2UgdmFsdWVzCisgICAqIGluIGFkdmFuY2Ugb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuCisgICAqLworCiAgIGludCBkYXRhX3ByZWNpc2lvbjsJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIGltYWdlIGRhdGEgKi8KIAogICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLwpAQCAtMjk4LDE0ICszMTYsMTcgQEAKIAogICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOwogICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KLSAgCisKICAgSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXTsKLSAgLyogcHRycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0gIAorICBpbnQgcV9zY2FsZV9mYWN0b3JbTlVNX1FVQU5UX1RCTFNdOworICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQsCisgICAqIGFuZCBjb3JyZXNwb25kaW5nIHNjYWxlIGZhY3RvcnMgKHBlcmNlbnRhZ2UsIGluaXRpYWxpemVkIDEwMCkuCisgICAqLworCiAgIEpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107CiAgIEpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107CiAgIC8qIHB0cnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0gIAorCiAgIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwogICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KICAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwpAQCAtMzIxLDYgKzM0Miw3IEBACiAgIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KICAgYm9vbGVhbiBvcHRpbWl6ZV9jb2Rpbmc7CS8qIFRSVUU9b3B0aW1pemUgZW50cm9weSBlbmNvZGluZyBwYXJtcyAqLwogICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworICBib29sZWFuIGRvX2ZhbmN5X2Rvd25zYW1wbGluZzsgLyogVFJVRT1hcHBseSBmYW5jeSBkb3duc2FtcGxpbmcgKi8KICAgaW50IHNtb290aGluZ19mYWN0b3I7CQkvKiAxLi4xMDAsIG9yIDAgZm9yIG5vIGlucHV0IHNtb290aGluZyAqLwogICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogRENUIGFsZ29yaXRobSBzZWxlY3RvciAqLwogCkBAIC0zNjQsNiArMzg2LDkgQEAKICAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IGhfc2FtcF9mYWN0b3IgKi8KICAgaW50IG1heF92X3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IHZfc2FtcF9mYWN0b3IgKi8KIAorICBpbnQgbWluX0RDVF9oX3NjYWxlZF9zaXplOwkvKiBzbWFsbGVzdCBEQ1RfaF9zY2FsZWRfc2l6ZSBvZiBhbnkgY29tcG9uZW50ICovCisgIGludCBtaW5fRENUX3Zfc2NhbGVkX3NpemU7CS8qIHNtYWxsZXN0IERDVF92X3NjYWxlZF9zaXplIG9mIGFueSBjb21wb25lbnQgKi8KKwogICBKRElNRU5TSU9OIHRvdGFsX2lNQ1Vfcm93czsJLyogIyBvZiBpTUNVIHJvd3MgdG8gYmUgaW5wdXQgdG8gY29lZiBjdGxyICovCiAgIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHJlY2VpdmVzIGRhdGEgaW4gdW5pdHMgb2YgTUNVIHJvd3MgYXMgZGVmaW5lZAogICAgKiBmb3IgZnVsbHkgaW50ZXJsZWF2ZWQgc2NhbnMgKHdoZXRoZXIgdGhlIEpQRUcgZmlsZSBpcyBpbnRlcmxlYXZlZCBvciBub3QpLgpAQCAtNTc1LDcgKzYwMCw4IEBACiAgIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCiAgIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCiAKLSAgaW50IG1pbl9EQ1Rfc2NhbGVkX3NpemU7CS8qIHNtYWxsZXN0IERDVF9zY2FsZWRfc2l6ZSBvZiBhbnkgY29tcG9uZW50ICovCisgIGludCBtaW5fRENUX2hfc2NhbGVkX3NpemU7CS8qIHNtYWxsZXN0IERDVF9oX3NjYWxlZF9zaXplIG9mIGFueSBjb21wb25lbnQgKi8KKyAgaW50IG1pbl9EQ1Rfdl9zY2FsZWRfc2l6ZTsJLyogc21hbGxlc3QgRENUX3Zfc2NhbGVkX3NpemUgb2YgYW55IGNvbXBvbmVudCAqLwogCiAgIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyBpbiBpbWFnZSAqLwogICAvKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlcidzIGlucHV0IGFuZCBvdXRwdXQgcHJvZ3Jlc3MgaXMgbWVhc3VyZWQgaW4KQEAgLTU4Myw3ICs2MDksNyBAQAogICAgKiBpbiBmdWxseSBpbnRlcmxlYXZlZCBKUEVHIHNjYW5zLCBidXQgYXJlIHVzZWQgd2hldGhlciB0aGUgc2NhbiBpcwogICAgKiBpbnRlcmxlYXZlZCBvciBub3QuICBXZSBkZWZpbmUgYW4gaU1DVSByb3cgYXMgdl9zYW1wX2ZhY3RvciBEQ1QgYmxvY2sKICAgICogcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFRoZXJlZm9yZSwgdGhlIElEQ1Qgb3V0cHV0IGNvbnRhaW5zCi0gICAqIHZfc2FtcF9mYWN0b3IqRENUX3NjYWxlZF9zaXplIHNhbXBsZSByb3dzIG9mIGEgY29tcG9uZW50IHBlciBpTUNVIHJvdy4KKyAgICogdl9zYW1wX2ZhY3RvcipEQ1Rfdl9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cyBvZiBhIGNvbXBvbmVudCBwZXIgaU1DVSByb3cuCiAgICAqLwogCiAgIEpTQU1QTEUgKiBzYW1wbGVfcmFuZ2VfbGltaXQ7IC8qIHRhYmxlIGZvciBmYXN0IHJhbmdlLWxpbWl0aW5nICovCkBAIC04NDEsNiArODY3LDcgQEAKICNkZWZpbmUganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UJakRlZkNvbG9yc3BhY2UKICNkZWZpbmUganBlZ19zZXRfcXVhbGl0eQlqU2V0UXVhbGl0eQogI2RlZmluZSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eQlqU2V0TFF1YWxpdHkKKyNkZWZpbmUganBlZ19kZWZhdWx0X3F0YWJsZXMJakRlZlFUYWJsZXMKICNkZWZpbmUganBlZ19hZGRfcXVhbnRfdGFibGUJakFkZFF1YW50VGFibGUKICNkZWZpbmUganBlZ19xdWFsaXR5X3NjYWxpbmcJalF1YWxpdHlTY2FsaW5nCiAjZGVmaW5lIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uCWpTaW1Qcm9ncmVzcwpAQCAtODUwLDYgKzg3Nyw3IEBACiAjZGVmaW5lIGpwZWdfc3RhcnRfY29tcHJlc3MJalN0cnRDb21wcmVzcwogI2RlZmluZSBqcGVnX3dyaXRlX3NjYW5saW5lcwlqV3J0U2NhbmxpbmVzCiAjZGVmaW5lIGpwZWdfZmluaXNoX2NvbXByZXNzCWpGaW5Db21wcmVzcworI2RlZmluZSBqcGVnX2NhbGNfanBlZ19kaW1lbnNpb25zCWpDanBlZ0RpbWVuc2lvbnMKICNkZWZpbmUganBlZ193cml0ZV9yYXdfZGF0YQlqV3J0UmF3RGF0YQogI2RlZmluZSBqcGVnX3dyaXRlX21hcmtlcglqV3J0TWFya2VyCiAjZGVmaW5lIGpwZWdfd3JpdGVfbV9oZWFkZXIJaldydE1IZWFkZXIKQEAgLTkyMSw2ICs5NDksOCBAQAogRVhURVJOKHZvaWQpIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCiAJCQkJCSAgaW50IHNjYWxlX2ZhY3RvciwKIAkJCQkJICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7CitFWFRFUk4odm9pZCkganBlZ19kZWZhdWx0X3F0YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwogRVhURVJOKHZvaWQpIGpwZWdfYWRkX3F1YW50X3RhYmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCiAJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCiAJCQkJICAgICAgIGludCBzY2FsZV9mYWN0b3IsCkBAIC05NDAsMTIgKzk3MCwxNSBAQAogCQkJCQkgICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKSk7CiBFWFRFUk4odm9pZCkganBlZ19maW5pc2hfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwogCisvKiBQcmVjYWxjdWxhdGUgSlBFRyBkaW1lbnNpb25zIGZvciBjdXJyZW50IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICovCitFWFRFUk4odm9pZCkganBlZ19jYWxjX2pwZWdfZGltZW5zaW9ucyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKIC8qIFJlcGxhY2VzIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdoZW4gd3JpdGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KIEVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3Jhd19kYXRhIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCiAJCQkJCSAgICBKU0FNUElNQUdFIGRhdGEsCiAJCQkJCSAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOwogCi0vKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLiAgU2VlIGxpYmpwZWcuZG9jIGNvbmNlcm5pbmcgc2FmZSB1c2FnZS4gKi8KKy8qIFdyaXRlIGEgc3BlY2lhbCBtYXJrZXIuICBTZWUgbGlianBlZy50eHQgY29uY2VybmluZyBzYWZlIHVzYWdlLiAqLwogRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbWFya2VyCiAJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKIAkgICAgIGNvbnN0IEpPQ1RFVCAqIGRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7CkBAIC0xMDkzLDQgKzExMjYsMTAgQEAKICNpbmNsdWRlICJqZXJyb3IuaCIJCS8qIGZldGNoIGVycm9yIGNvZGVzIHRvbyAqLwogI2VuZGlmCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBET05UX1VTRV9FWFRFUk5fQworfQorI2VuZGlmCisjZW5kaWYKKwogI2VuZGlmIC8qIEpQRUdMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvanBlZ3RyYW4uMSBiL2pwZWd0cmFuLjEKaW5kZXggNmRlMThlMi4uYTdjMGE0ZCAxMDA2NDQKLS0tIGEvanBlZ3RyYW4uMQorKysgYi9qcGVndHJhbi4xCkBAIC0xLDQgKzEsNCBAQAotLlRIIEpQRUdUUkFOIDEgIjMgQXVndXN0IDE5OTciCisuVEggSlBFR1RSQU4gMSAiMjggTWFyY2ggMjAwOSIKIC5TSCBOQU1FCiBqcGVndHJhbiBcLSBsb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbiBvZiBKUEVHIGZpbGVzCiAuU0ggU1lOT1BTSVMKQEAgLTYwLDYgKzYwLDkgQEAKIEVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5IE4gTUNVIGJsb2NrcyBpZiAiQiIgaXMKIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCiAuVFAKKy5CIFwtYXJpdGhtZXRpYworVXNlIGFyaXRobWV0aWMgY29kaW5nLgorLlRQCiAuQkkgXC1zY2FucyAiIGZpbGUiCiBVc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgogLlBQCkBAIC05MSwxMiArOTQsMTIgQEAKIC5UUAogLkIgXC10cmFuc3ZlcnNlCiBUcmFuc3ZlcnNlIHRyYW5zcG9zZSAoYWNyb3NzIFVSLXRvLUxMIGF4aXMpLgotLlBQCisuSVAKIFRoZSB0cmFuc3Bvc2UgdHJhbnNmb3JtYXRpb24gaGFzIG5vIHJlc3RyaWN0aW9ucyByZWdhcmRpbmcgaW1hZ2UgZGltZW5zaW9ucy4KIFRoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgb3BlcmF0ZSByYXRoZXIgb2RkbHkgaWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdAogYSBtdWx0aXBsZSBvZiB0aGUgaU1DVSBzaXplICh1c3VhbGx5IDggb3IgMTYgcGl4ZWxzKSwgYmVjYXVzZSB0aGV5IGNhbiBvbmx5CiB0cmFuc2Zvcm0gY29tcGxldGUgYmxvY2tzIG9mIERDVCBjb2VmZmljaWVudCBkYXRhIGluIHRoZSBkZXNpcmVkIHdheS4KLS5QUAorLklQCiAuQlIganBlZ3RyYW4gJ3MKIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiB0cmFuc2Zvcm1pbmcgYW4gb2RkLXNpemUgaW1hZ2UgaXMgZGVzaWduZWQKIHRvIHByZXNlcnZlIGV4YWN0IHJldmVyc2liaWxpdHkgYW5kIG1hdGhlbWF0aWNhbCBjb25zaXN0ZW5jeSBvZiB0aGUKQEAgLTEwOCw3ICsxMTEsNyBAQAogb2YgdHJhbnNwb3NlIGFuZCBmbGlwIG9wZXJhdGlvbnM7IGZvciBjb25zaXN0ZW5jeSwgdGhlaXIgYWN0aW9ucyBvbiBlZGdlCiBwaXhlbHMgYXJlIGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGVuZCByZXN1bHQgb2YgdGhlIGNvcnJlc3BvbmRpbmcKIHRyYW5zcG9zZS1hbmQtZmxpcCBzZXF1ZW5jZS4KLS5QUAorLklQCiBGb3IgcHJhY3RpY2FsIHVzZSwgeW91IG1heSBwcmVmZXIgdG8gZGlzY2FyZCBhbnkgdW50cmFuc2Zvcm1hYmxlIGVkZ2UgcGl4ZWxzCiByYXRoZXIgdGhhbiBoYXZpbmcgYSBzdHJhbmdlLWxvb2tpbmcgc3RyaXAgYWxvbmcgdGhlIHJpZ2h0IGFuZC9vciBib3R0b20gZWRnZXMKIG9mIGEgdHJhbnNmb3JtZWQgaW1hZ2UuICBUbyBkbyB0aGlzLCBhZGQgdGhlCkBAIC0xMTcsNyArMTIwLDcgQEAKIC5UUAogLkIgXC10cmltCiBEcm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzLgotLlBQCisuSVAKIE9idmlvdXNseSwgYSB0cmFuc2Zvcm1hdGlvbiB3aXRoCiAuQiBcLXRyaW0KIGlzIG5vdCByZXZlcnNpYmxlLCBzbyBzdHJpY3RseSBzcGVha2luZwpAQCAtMTMwLDEyICsxMzMsNDMgQEAKIGZvbGxvd2VkIGJ5CiAuQiBcLXJvdCAxODAgLXRyaW0KIHRyaW1zIGJvdGggZWRnZXMuCisuSVAKK0lmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHBlcmZlY3QgdHJhbnNmb3JtYXRpb24sIGFkZCB0aGUKKy5CIFwtcGVyZmVjdAorc3dpdGNoOgorLlRQCisuQiBcLXBlcmZlY3QKK0ZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIG5vdCBwZXJmZWN0LgorLklQCitGb3IgZXhhbXBsZSB5b3UgbWF5IHdhbnQgdG8gZG8KKy5JUAorLkIgKGpwZWd0cmFuIFwtcm90IDkwIC1wZXJmZWN0CisuSSBmb28uanBnCisuQiB8fCBkanBlZworLkkgZm9vLmpwZworLkIgfCBwbm1mbGlwIFwtcjkwIHwgY2pwZWcpCisuSVAKK3RvIGRvIGEgcGVyZmVjdCByb3RhdGlvbiBpZiBhdmFpbGFibGUgb3IgYW4gYXBwcm94aW1hdGVkIG9uZSBpZiBub3QuCisuUFAKK1dlIGFsc28gb2ZmZXIgYSBsb3NzbGVzcy1jcm9wIG9wdGlvbiwgd2hpY2ggZGlzY2FyZHMgZGF0YSBvdXRzaWRlIGEgZ2l2ZW4KK2ltYWdlIHJlZ2lvbiBidXQgbG9zc2xlc3NseSBwcmVzZXJ2ZXMgd2hhdCBpcyBpbnNpZGUuICBMaWtlIHRoZSByb3RhdGUgYW5kCitmbGlwIHRyYW5zZm9ybXMsIGxvc3NsZXNzIGNyb3AgaXMgcmVzdHJpY3RlZCBieSB0aGUgY3VycmVudCBKUEVHIGZvcm1hdDogdGhlCit1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc2VsZWN0ZWQgcmVnaW9uIG11c3QgZmFsbCBvbiBhbiBpTUNVIGJvdW5kYXJ5LiAgSWYKK3RoaXMgZG9lcyBub3QgaG9sZCBmb3IgdGhlIGdpdmVuIGNyb3AgcGFyYW1ldGVycywgd2Ugc2lsZW50bHkgbW92ZSB0aGUgdXBwZXIKK2xlZnQgY29ybmVyIHVwIGFuZC9vciBsZWZ0IHRvIG1ha2UgaXQgc28sIHNpbXVsdGFuZW91c2x5IGluY3JlYXNpbmcgdGhlIHJlZ2lvbgorZGltZW5zaW9ucyB0byBrZWVwIHRoZSBsb3dlciByaWdodCBjcm9wIGNvcm5lciB1bmNoYW5nZWQuICAoVGh1cywgdGhlIG91dHB1dAoraW1hZ2UgY292ZXJzIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgcmVnaW9uLCBidXQgbWF5IGNvdmVyIG1vcmUuKQorCitUaGUgaW1hZ2UgY2FuIGJlIGxvc3NsZXNzbHkgY3JvcHBlZCBieSBnaXZpbmcgdGhlIHN3aXRjaDoKKy5UUAorLkIgXC1jcm9wIFd4SCtYK1kKK0Nyb3AgdG8gYSByZWN0YW5ndWxhciBzdWJhcmVhIG9mIHdpZHRoIFcsIGhlaWdodCBIIHN0YXJ0aW5nIGF0IHBvaW50IFgsWS4KIC5QUAogQW5vdGhlciBub3Qtc3RyaWN0bHktbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gc3dpdGNoIGlzOgogLlRQCiAuQiBcLWdyYXlzY2FsZQogRm9yY2UgZ3JheXNjYWxlIG91dHB1dC4KLS5QUAorLklQCiBUaGlzIG9wdGlvbiBkaXNjYXJkcyB0aGUgY2hyb21pbmFuY2UgY2hhbm5lbHMgaWYgdGhlIGlucHV0IGltYWdlIGlzIFlDYkNyCiAoaWUsIGEgc3RhbmRhcmQgY29sb3IgSlBFRyksIHJlc3VsdGluZyBpbiBhIGdyYXlzY2FsZSBKUEVHIGZpbGUuICBUaGUKIGx1bWluYW5jZSBjaGFubmVsIGlzIHByZXNlcnZlZCBleGFjdGx5LCBzbyB0aGlzIGlzIGEgYmV0dGVyIG1ldGhvZCBvZiByZWR1Y2luZwpAQCAtMTU1LDEzICsxODksMTMgQEAKIC5UUAogLkIgXC1jb3B5IGNvbW1lbnRzCiBDb3B5IG9ubHkgY29tbWVudCBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIGNvcGllcyBjb21tZW50cyBmcm9tIHRoZSBzb3VyY2UgZmlsZSwKLWJ1dCBkaXNjYXJkcyBhbnkgb3RoZXIgaW5lc3NlbnRpYWwgZGF0YS4KK2J1dCBkaXNjYXJkcyBhbnkgb3RoZXIgaW5lc3NlbnRpYWwgKGZvciBpbWFnZSBkaXNwbGF5KSBkYXRhLgogLlRQCiAuQiBcLWNvcHkgYWxsCiBDb3B5IGFsbCBleHRyYSBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIHByZXNlcnZlcyBtaXNjZWxsYW5lb3VzIG1hcmtlcnMKLWZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZSwgc3VjaCBhcyBKRklGIHRodW1ibmFpbHMgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4KLUluIHNvbWUgZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KLS5QUAorZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLCBzdWNoIGFzIEpGSUYgdGh1bWJuYWlscywgRXhpZiBkYXRhLCBhbmQgUGhvdG9zaG9wCitzZXR0aW5ncy4gIEluIHNvbWUgZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KKy5JUAogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKIC5CUiAiXC1jb3B5IGNvbW1lbnRzIiAuCiAoTm90ZTogaW4gSUpHIHJlbGVhc2VzIHY2IGFuZCB2NmEsCkBAIC0yMjcsMTEgKzI2MSwxMSBAQAogLlNIIEFVVEhPUgogSW5kZXBlbmRlbnQgSlBFRyBHcm91cAogLlNIIEJVR1MKLUFyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuCi0uUFAKIFRoZSB0cmFuc2Zvcm0gb3B0aW9ucyBjYW4ndCB0cmFuc2Zvcm0gb2RkLXNpemUgaW1hZ2VzIHBlcmZlY3RseS4gIFVzZQogLkIgXC10cmltCi1pZiB5b3UgZG9uJ3QgbGlrZSB0aGUgcmVzdWx0cyB3aXRob3V0IGl0Lgorb3IKKy5CIFwtcGVyZmVjdAoraWYgeW91IGRvbid0IGxpa2UgdGhlIHJlc3VsdHMuCiAuUFAKIFRoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbnRvIG1lbW9yeSBhbmQgdGhlbiB3cml0dGVuIG91dCBhZ2FpbiwgZXZlbiBpbgogY2FzZXMgd2hlcmUgdGhpcyBpc24ndCByZWFsbHkgbmVjZXNzYXJ5LiAgRXhwZWN0IHN3YXBwaW5nIG9uIGxhcmdlIGltYWdlcywKZGlmZiAtLWdpdCBhL2pwZWd0cmFuLmMgYi9qcGVndHJhbi5jCmluZGV4IDIwZWYxMTEuLjQ0YzA2MWEgMTAwNjQ0Ci0tLSBhL2pwZWd0cmFuLmMKKysrIGIvanBlZ3RyYW4uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBqcGVndHJhbi5jCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDEsIFRob21hcyBHLiBMYW5lLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC02NCw4ICs2NCwxMCBAQAogI2VuZGlmCiAjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKICAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgbW9kaWZ5aW5nIHRoZSBpbWFnZTpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNyb3AgV3hIK1grWSAgQ3JvcCB0byBhIHJlY3Rhbmd1bGFyIHN1YmFyZWFcbiIpOwogICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgUmVkdWNlIHRvIGdyYXlzY2FsZSAob21pdCBjb2xvciBkYXRhKVxuIik7CiAgIGZwcmludGYoc3RkZXJyLCAiICAtZmxpcCBbaG9yaXpvbnRhbHx2ZXJ0aWNhbF0gIE1pcnJvciBpbWFnZSAobGVmdC1yaWdodCBvciB0b3AtYm90dG9tKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcGVyZmVjdCAgICAgICBGYWlsIGlmIHRoZXJlIGlzIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzXG4iKTsKICAgZnByaW50ZihzdGRlcnIsICIgIC1yb3RhdGUgWzkwfDE4MHwyNzBdICAgICAgICAgUm90YXRlIGltYWdlIChkZWdyZWVzIGNsb2Nrd2lzZSlcbiIpOwogICBmcHJpbnRmKHN0ZGVyciwgIiAgLXRyYW5zcG9zZSAgICAgVHJhbnNwb3NlIGltYWdlXG4iKTsKICAgZnByaW50ZihzdGRlcnIsICIgIC10cmFuc3ZlcnNlICAgIFRyYW5zdmVyc2UgdHJhbnNwb3NlIGltYWdlXG4iKTsKQEAgLTEzMyw3ICsxMzUsOSBAQAogICBjb3B5b3B0aW9uID0gSkNPUFlPUFRfREVGQVVMVDsKICAgdHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9IEpYRk9STV9OT05FOwogICB0cmFuc2Zvcm1vcHRpb24udHJpbSA9IEZBTFNFOworICB0cmFuc2Zvcm1vcHRpb24ucGVyZmVjdCA9IEZBTFNFOwogICB0cmFuc2Zvcm1vcHRpb24uZm9yY2VfZ3JheXNjYWxlID0gRkFMU0U7CisgIHRyYW5zZm9ybW9wdGlvbi5jcm9wID0gRkFMU0U7CiAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKIAogICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLwpAQCAtMTYwLDcgKzE2NCw3IEBACiAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAjZW5kaWYKIAotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29weSIsIDEpKSB7CisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjb3B5IiwgMikpIHsKICAgICAgIC8qIFNlbGVjdCB3aGljaCBleHRyYSBtYXJrZXJzIHRvIGNvcHkuICovCiAgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLwogCXVzYWdlKCk7CkBAIC0xNzMsNiArMTc3LDIwIEBACiAgICAgICB9IGVsc2UKIAl1c2FnZSgpOwogCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjcm9wIiwgMikpIHsKKyAgICAgIC8qIFBlcmZvcm0gbG9zc2xlc3MgY3JvcHBpbmcuICovCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmICghIGp0cmFuc2Zvcm1fcGFyc2VfY3JvcF9zcGVjKCZ0cmFuc2Zvcm1vcHRpb24sIGFyZ3ZbYXJnbl0pKSB7CisJZnByaW50ZihzdGRlcnIsICIlczogYm9ndXMgLWNyb3AgYXJndW1lbnQgJyVzJ1xuIiwKKwkJcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9OT05FKTsJLyogZm9yY2UgYW4gZXJyb3IgKi8KKyNlbmRpZgorCiAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewogICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KICAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCkBAIC0yMzMsNyArMjUxLDEyIEBACiAJdXNhZ2UoKTsKICAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KIAotICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicHJvZ3Jlc3NpdmUiLCAxKSkgeworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicGVyZmVjdCIsIDIpKSB7CisgICAgICAvKiBGYWlsIGlmIHRoZXJlIGlzIGFueSBwYXJ0aWFsIGVkZ2UgTUNVcyB0aGF0IHRoZSB0cmFuc2Zvcm0gY2FuJ3QKKyAgICAgICAqIGhhbmRsZS4gKi8KKyAgICAgIHRyYW5zZm9ybW9wdGlvbi5wZXJmZWN0ID0gVFJVRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicHJvZ3Jlc3NpdmUiLCAyKSkgewogICAgICAgLyogU2VsZWN0IHNpbXBsZSBwcm9ncmVzc2l2ZSBtb2RlLiAqLwogI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECiAgICAgICBzaW1wbGVfcHJvZ3Jlc3NpdmUgPSBUUlVFOwpAQCAtMzQyLDggKzM2NSwxMCBAQAogICBqdmlydF9iYXJyYXlfcHRyICogc3JjX2NvZWZfYXJyYXlzOwogICBqdmlydF9iYXJyYXlfcHRyICogZHN0X2NvZWZfYXJyYXlzOwogICBpbnQgZmlsZV9pbmRleDsKLSAgRklMRSAqIGlucHV0X2ZpbGU7Ci0gIEZJTEUgKiBvdXRwdXRfZmlsZTsKKyAgLyogV2UgYXNzdW1lIGFsbC1pbi1tZW1vcnkgcHJvY2Vzc2luZyBhbmQgY2FuIHRoZXJlZm9yZSB1c2Ugb25seSBhCisgICAqIHNpbmdsZSBmaWxlIHBvaW50ZXIgZm9yIHNlcXVlbnRpYWwgaW5wdXQgYW5kIG91dHB1dCBvcGVyYXRpb24uIAorICAgKi8KKyAgRklMRSAqIGZwOwogCiAgIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCiAjaWZkZWYgVVNFX0NDT01NQU5ECkBAIC00MDYsMjQgKzQzMSwxMyBAQAogCiAgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCiAgIGlmIChmaWxlX2luZGV4IDwgYXJnYykgewotICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOworICAgIGlmICgoZnAgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXMgZm9yIHJlYWRpbmdcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCi0gICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKLSAgfQotCi0gIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLwotICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgewotICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KLSAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOworICAgIGZwID0gcmVhZF9zdGRpbigpOwogICB9CiAKICNpZmRlZiBQUk9HUkVTU19SRVBPUlQKQEAgLTQzMSw3ICs0NDUsNyBAQAogI2VuZGlmCiAKICAgLyogU3BlY2lmeSBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbiAqLwotICBqcGVnX3N0ZGlvX3NyYygmc3JjaW5mbywgaW5wdXRfZmlsZSk7CisgIGpwZWdfc3RkaW9fc3JjKCZzcmNpbmZvLCBmcCk7CiAKICAgLyogRW5hYmxlIHNhdmluZyBvZiBleHRyYSBtYXJrZXJzIHRoYXQgd2Ugd2FudCB0byBjb3B5ICovCiAgIGpjb3B5X21hcmtlcnNfc2V0dXAoJnNyY2luZm8sIGNvcHlvcHRpb24pOwpAQCAtNDQzLDYgKzQ1NywxNSBAQAogICAgKiBqcGVnX3JlYWRfY29lZmZpY2llbnRzIHNvIHRoYXQgbWVtb3J5IGFsbG9jYXRpb24gd2lsbCBiZSBkb25lIHJpZ2h0LgogICAgKi8KICNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorICAvKiBGYWlscyByaWdodCBhd2F5IGlmIC1wZXJmZWN0IGlzIGdpdmVuIGFuZCB0cmFuc2Zvcm1hdGlvbiBpcyBub3QgcGVyZmVjdC4KKyAgICovCisgIGlmICh0cmFuc2Zvcm1vcHRpb24ucGVyZmVjdCAmJgorICAgICAgIWp0cmFuc2Zvcm1fcGVyZmVjdF90cmFuc2Zvcm0oc3JjaW5mby5pbWFnZV93aWR0aCwgc3JjaW5mby5pbWFnZV9oZWlnaHQsCisgICAgICBzcmNpbmZvLm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSwgc3JjaW5mby5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUsCisgICAgICB0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHRyYW5zZm9ybWF0aW9uIGlzIG5vdCBwZXJmZWN0XG4iLCBwcm9nbmFtZSk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CiAgIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UoJnNyY2luZm8sICZ0cmFuc2Zvcm1vcHRpb24pOwogI2VuZGlmCiAKQEAgLTQ2MywxMSArNDg2LDMyIEBACiAgIGRzdF9jb2VmX2FycmF5cyA9IHNyY19jb2VmX2FycmF5czsKICNlbmRpZgogCisgIC8qIENsb3NlIGlucHV0IGZpbGUsIGlmIHdlIG9wZW5lZCBpdC4KKyAgICogTm90ZTogd2UgYXNzdW1lIHRoYXQganBlZ19yZWFkX2NvZWZmaWNpZW50cyBjb25zdW1lZCBhbGwgaW5wdXQKKyAgICogdW50aWwgSlBFR19SRUFDSEVEX0VPSSwgYW5kIHRoYXQganBlZ19maW5pc2hfZGVjb21wcmVzcyB3aWxsCisgICAqIG9ubHkgY29uc3VtZSBtb3JlIHdoaWxlICghIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpLgorICAgKiBXZSBjYW5ub3QgY2FsbCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIGhlcmUgc2luY2Ugd2Ugc3RpbGwgbmVlZCB0aGUKKyAgICogdmlydHVhbCBhcnJheXMgYWxsb2NhdGVkIGZyb20gdGhlIHNvdXJjZSBvYmplY3QgZm9yIHByb2Nlc3NpbmcuCisgICAqLworICBpZiAoZnAgIT0gc3RkaW4pCisgICAgZmNsb3NlKGZwKTsKKworICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KKyAgaWYgKG91dGZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICBpZiAoKGZwID0gZm9wZW4ob3V0ZmlsZW5hbWUsIFdSSVRFX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXMgZm9yIHdyaXRpbmdcbiIsIHByb2duYW1lLCBvdXRmaWxlbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgaXMgc3Rkb3V0ICovCisgICAgZnAgPSB3cml0ZV9zdGRvdXQoKTsKKyAgfQorCiAgIC8qIEFkanVzdCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLwogICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmRzdGluZm8sIGFyZ2MsIGFyZ3YsIDAsIFRSVUUpOwogCiAgIC8qIFNwZWNpZnkgZGF0YSBkZXN0aW5hdGlvbiBmb3IgY29tcHJlc3Npb24gKi8KLSAganBlZ19zdGRpb19kZXN0KCZkc3RpbmZvLCBvdXRwdXRfZmlsZSk7CisgIGpwZWdfc3RkaW9fZGVzdCgmZHN0aW5mbywgZnApOwogCiAgIC8qIFN0YXJ0IGNvbXByZXNzb3IgKG5vdGUgbm8gaW1hZ2UgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuIGhlcmUpICovCiAgIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCZkc3RpbmZvLCBkc3RfY29lZl9hcnJheXMpOwpAQCAtNDg4LDExICs1MzIsOSBAQAogICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmc3JjaW5mbyk7CiAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZzcmNpbmZvKTsKIAotICAvKiBDbG9zZSBmaWxlcywgaWYgd2Ugb3BlbmVkIHRoZW0gKi8KLSAgaWYgKGlucHV0X2ZpbGUgIT0gc3RkaW4pCi0gICAgZmNsb3NlKGlucHV0X2ZpbGUpOwotICBpZiAob3V0cHV0X2ZpbGUgIT0gc3Rkb3V0KQotICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7CisgIC8qIENsb3NlIG91dHB1dCBmaWxlLCBpZiB3ZSBvcGVuZWQgaXQgKi8KKyAgaWYgKGZwICE9IHN0ZG91dCkKKyAgICBmY2xvc2UoZnApOwogCiAjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCiAgIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZkc3RpbmZvKTsKZGlmZiAtLWdpdCBhL2p2ZXJzaW9uLmggYi9qdmVyc2lvbi5oCmluZGV4IDY0NzJjNTguLjUxNTE3MzEgMTAwNjQ0Ci0tLSBhL2p2ZXJzaW9uLmgKKysrIGIvanZlcnNpb24uaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBqdmVyc2lvbi5oCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDksIFRob21hcyBHLiBMYW5lLCBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC05LDYgKzksNiBAQAogICovCiAKIAotI2RlZmluZSBKVkVSU0lPTgkiNmIgIDI3LU1hci0xOTk4IgorI2RlZmluZSBKVkVSU0lPTgkiNyAgMjctSnVuLTIwMDkiCiAKLSNkZWZpbmUgSkNPUFlSSUdIVAkiQ29weXJpZ2h0IChDKSAxOTk4LCBUaG9tYXMgRy4gTGFuZSIKKyNkZWZpbmUgSkNPUFlSSUdIVAkiQ29weXJpZ2h0IChDKSAyMDA5LCBUaG9tYXMgRy4gTGFuZSwgR3VpZG8gVm9sbGJlZGluZyIKZGlmZiAtLWdpdCBhL2xpYmpwZWcubWFwIGIvbGlianBlZy5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhYzBkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmpwZWcubWFwCkBAIC0wLDAgKzEsNCBAQAorTElCSlBFR183LjAgeworICBnbG9iYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9saWJqcGVnLmRvYyBiL2xpYmpwZWcudHh0CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGxpYmpwZWcuZG9jCnJlbmFtZSB0byBsaWJqcGVnLnR4dAppbmRleCA2ODliMjA2Li4zMjRlMjM0IDEwMDY0NAotLS0gYS9saWJqcGVnLmRvYworKysgYi9saWJqcGVnLnR4dApAQCAtMSw2ICsxLDYgQEAKIFVTSU5HIFRIRSBJSkcgSlBFRyBMSUJSQVJZCiAKLUNvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK0NvcHlyaWdodCAoQykgMTk5NC0yMDA5LCBUaG9tYXMgRy4gTGFuZSwgR3VpZG8gVm9sbGJlZGluZy4KIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAKQEAgLTkzLDcgKzkzLDYgQEAKIHVzZS4pICBVbnN1cHBvcnRlZCBJU08gb3B0aW9ucyBpbmNsdWRlOgogCSogSGllcmFyY2hpY2FsIHN0b3JhZ2UKIAkqIExvc3NsZXNzIEpQRUcKLQkqIEFyaXRobWV0aWMgZW50cm9weSBjb2RpbmcgKHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zKQogCSogRE5MIG1hcmtlcgogCSogTm9uaW50ZWdyYWwgc3Vic2FtcGxpbmcgcmF0aW9zCiBXZSBzdXBwb3J0IGJvdGggOC0gYW5kIDEyLWJpdCBkYXRhIHByZWNpc2lvbiwgYnV0IHRoaXMgaXMgYSBjb21waWxlLXRpbWUKQEAgLTc1MCw3ICs3NDksNyBAQAogbWFjaGluZXMpIGFuZCByZWZlcmVuY2UgaXQgYXQgeW91ciBsaW5rIHN0ZXAuICBJZiB5b3UgdXNlIG9ubHkgaGFsZiBvZiB0aGUKIGxpYnJhcnkgKG9ubHkgY29tcHJlc3Npb24gb3Igb25seSBkZWNvbXByZXNzaW9uKSwgb25seSB0aGF0IG11Y2ggY29kZSB3aWxsIGJlCiBpbmNsdWRlZCBmcm9tIHRoZSBsaWJyYXJ5LCB1bmxlc3MgeW91ciBsaW5rZXIgaXMgaG9wZWxlc3NseSBicmFpbi1kYW1hZ2VkLgotVGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBidWlsZCBsaWJqcGVnLmEgYXV0b21hdGljYWxseSAoc2VlIGluc3RhbGwuZG9jKS4KK1RoZSBzdXBwbGllZCBtYWtlZmlsZXMgYnVpbGQgbGlianBlZy5hIGF1dG9tYXRpY2FsbHkgKHNlZSBpbnN0YWxsLnR4dCkuCiAKIFdoaWxlIHlvdSBjYW4gYnVpbGQgdGhlIEpQRUcgbGlicmFyeSBhcyBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSB3aGltIHN0cmlrZXMKIHlvdSwgd2UgZG9uJ3QgcmVhbGx5IHJlY29tbWVuZCBpdC4gIFRoZSB0cm91YmxlIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpcyB0aGF0CkBAIC04NTAsNiArODQ5LDEwIEBACiAJY2FuJ3QgYmUgZXhwcmVzc2VkIGFzIGEgc2ltcGxlIHNjYWxhciBtdWx0aXBsaWVyLCBpbiB3aGljaCBjYXNlIHRoZQogCXByZW1pc2Ugb2YgdGhpcyByb3V0aW5lIGNvbGxhcHNlcy4gIENhdmVhdCB1c2VyLgogCitqcGVnX2RlZmF1bHRfcXRhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisJU2V0IGRlZmF1bHQgcXVhbnRpemF0aW9uIHRhYmxlcyB3aXRoIGxpbmVhciBxX3NjYWxlX2ZhY3RvcltdIHZhbHVlcworCShzZWUgYmVsb3cpLgorCiBqcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCiAJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCiAJCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCkBAIC04ODksNiArODkyLDEyIEBACiAJcmVjb21tZW5kZWQgaWYgaGlnaCBxdWFsaXR5IGlzIGEgY29uY2Vybi4gIEpEQ1RfREVGQVVMVCBhbmQKIAlKRENUX0ZBU1RFU1QgYXJlIG1hY3JvcyBjb25maWd1cmFibGUgYnkgZWFjaCBpbnN0YWxsYXRpb24uCiAKK3Vuc2lnbmVkIGludCBzY2FsZV9udW0sIHNjYWxlX2Rlbm9tCisJU2NhbGUgdGhlIGltYWdlIGJ5IHRoZSBmcmFjdGlvbiBzY2FsZV9udW0vc2NhbGVfZGVub20uICBEZWZhdWx0IGlzCisJMS8xLCBvciBubyBzY2FsaW5nLiAgQ3VycmVudGx5LCB0aGUgc3VwcG9ydGVkIHNjYWxpbmcgcmF0aW9zIGFyZQorCTgvTiB3aXRoIGFsbCBOIGZyb20gMSB0byAxNi4gIChUaGUgbGlicmFyeSBkZXNpZ24gYWxsb3dzIGZvciBhcmJpdHJhcnkKKwlzY2FsaW5nIHJhdGlvcyBidXQgdGhpcyBpcyBub3QgbGlrZWx5IHRvIGJlIGltcGxlbWVudGVkIGFueSB0aW1lIHNvb24uKQorCiBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2UKIGludCBudW1fY29tcG9uZW50cwogCVRoZSBKUEVHIGNvbG9yIHNwYWNlIGFuZCBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBjb21wb25lbnRzOyBzZWUKQEAgLTkzMCw2ICs5MzksMTUgQEAKIAlhIHN1aXRhYmxlIHNjYW4gZGVmaW5pdGlvbiBhcnJheSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4pICBUaGlzIGlzCiAJZGlzY3Vzc2VkIGZ1cnRoZXIgdW5kZXIgIlByb2dyZXNzaXZlIEpQRUcgc3VwcG9ydCIuCiAKK2Jvb2xlYW4gZG9fZmFuY3lfZG93bnNhbXBsaW5nCisJSWYgVFJVRSwgdXNlIGRpcmVjdCBEQ1Qgc2NhbGluZyB3aXRoIERDVCBzaXplID4gOCBmb3IgZG93bnNhbXBsaW5nCisJb2YgY2hyb21hIGNvbXBvbmVudHMuCisJSWYgRkFMU0UsIHVzZSBvbmx5IERDVCBzaXplIDw9IDggYW5kIHNpbXBsZSBzZXBhcmF0ZSBkb3duc2FtcGxpbmcuCisJRGVmYXVsdCBpcyBUUlVFLgorCUZvciBiZXR0ZXIgaW1hZ2Ugc3RhYmlsaXR5IGluIG11bHRpcGxlIGdlbmVyYXRpb24gY29tcHJlc3Npb24gY3ljbGVzCisJaXQgaXMgcHJlZmVyYWJsZSB0aGF0IHRoaXMgdmFsdWUgbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZworCWRvX2ZhbmN5X3Vwc2FtcGxpbmcgdmFsdWUgaW4gZGVjb21wcmVzc2lvbi4KKwogaW50IHNtb290aGluZ19mYWN0b3IKIAlJZiBub24temVybywgdGhlIGlucHV0IGltYWdlIGlzIHNtb290aGVkOyB0aGUgdmFsdWUgc2hvdWxkIGJlIDEgZm9yCiAJbWluaW1hbCBzbW9vdGhpbmcgdG8gMTAwIGZvciBtYXhpbXVtIHNtb290aGluZy4gIENvbnN1bHQgamNzYW1wbGUuYwpAQCAtOTcyLDYgKzk5MCwzMCBAQAogCXJvdXRpbmVzIHdpbGwgc2V0IHVwIHRhYmxlIHNsb3QgMCBmb3IgbHVtaW5hbmNlIHF1YWxpdHkgYW5kIHRhYmxlCiAJc2xvdCAxIGZvciBjaHJvbWluYW5jZS4KIAoraW50IHFfc2NhbGVfZmFjdG9yW05VTV9RVUFOVF9UQkxTXQorCUxpbmVhciBxdWFudGl6YXRpb24gc2NhbGluZyBmYWN0b3JzIChwZXJjZW50YWdlLCBpbml0aWFsaXplZCAxMDApCisJZm9yIHVzZSB3aXRoIGpwZWdfZGVmYXVsdF9xdGFibGVzKCkuCisJU2VlIHJkc3dpdGNoLmMgYW5kIGNqcGVnLmMgZm9yIGFuIGV4YW1wbGUgb2YgdXNhZ2UuCisJTm90ZSB0aGF0IHRoZSBxX3NjYWxlX2ZhY3RvcltdIGZpZWxkcyBhcmUgdGhlICJsaW5lYXIiIHNjYWxlcywgc28geW91CisJaGF2ZSB0byBjb252ZXJ0IGZyb20gdXNlci1kZWZpbmVkIHJhdGluZ3MgdmlhIGpwZWdfcXVhbGl0eV9zY2FsaW5nKCkuCisJSGVyZSBpcyBhbiBleGFtcGxlIGNvZGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gY2pwZWcgLXF1YWxpdHkgOTAsNzA6CisKKwkJanBlZ19zZXRfZGVmYXVsdHMoY2luZm8pOworCisJCS8qIFNldCBsdW1pbmFuY2UgcXVhbGl0eSA5MC4gKi8KKwkJY2luZm8tPnFfc2NhbGVfZmFjdG9yWzBdID0ganBlZ19xdWFsaXR5X3NjYWxpbmcoOTApOworCQkvKiBTZXQgY2hyb21pbmFuY2UgcXVhbGl0eSA3MC4gKi8KKwkJY2luZm8tPnFfc2NhbGVfZmFjdG9yWzFdID0ganBlZ19xdWFsaXR5X3NjYWxpbmcoNzApOworCisJCWpwZWdfZGVmYXVsdF9xdGFibGVzKGNpbmZvLCBmb3JjZV9iYXNlbGluZSk7CisKKwlDQVVUSU9OOiBZb3UgbXVzdCBhbHNvIHNldCAxeDEgc3Vic2FtcGxpbmcgZm9yIGVmZmljaWVudCBzZXBhcmF0ZQorCWNvbG9yIHF1YWxpdHkgc2VsZWN0aW9uLCBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSB1c2VkIGJ5IGxpYnJhcnkKKwlpcyAyeDI6CisKKwkJY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMTsKKwkJY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gMTsKKwogSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXQogSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXQogCVBvaW50ZXJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb25lIHBlciB0YWJsZSBzbG90LCBvciBOVUxMIGlmCkBAIC05ODIsOSArMTAyNCwxNiBAQAogCWJ5IHNldHRpbmcgb3B0aW1pemVfY29kaW5nLCBhcyBkaXNjdXNzZWQgYWJvdmU7IHRoZXJlJ3Mgc2VsZG9tCiAJYW55IG5lZWQgdG8gbWVzcyB3aXRoIHByb3ZpZGluZyB5b3VyIG93biBIdWZmbWFuIHRhYmxlcy4KIAotVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBjaW5mbyBmaWVsZHMgd2hpY2ggYXJlIG5vdCBkb2N1bWVudGVkIGhlcmUKLWJlY2F1c2UgeW91IGN1cnJlbnRseSBjYW4ndCBjaGFuZ2UgdGhlbTsgZm9yIGV4YW1wbGUsIHlvdSBjYW4ndCBzZXQKLWFyaXRoX2NvZGUgVFJVRSBiZWNhdXNlIGFyaXRobWV0aWMgY29kaW5nIGlzIHVuc3VwcG9ydGVkLgorCitUaGUgYWN0dWFsIGRpbWVuc2lvbnMgb2YgdGhlIEpQRUcgaW1hZ2UgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYXJlCitnaXZlbiBieSB0aGUgZm9sbG93aW5nIGZpZWxkcy4gIFRoZXNlIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBpbnB1dCBpbWFnZQorZGltZW5zaW9ucyBhbmQgdGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkganBlZ19zdGFydF9jb21wcmVzcygpLiAgWW91IGNhbgorYWxzbyBjYWxsIGpwZWdfY2FsY19qcGVnX2RpbWVuc2lvbnMoKSB0byBvYnRhaW4gdGhlIHZhbHVlcyB0aGF0IHdpbGwgcmVzdWx0Citmcm9tIHRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXR0aW5ncy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgYXJlIHRyeWluZwordG8gcGljayBhIHNjYWxpbmcgcmF0aW8gdGhhdCB3aWxsIGdldCBjbG9zZSB0byBhIGRlc2lyZWQgdGFyZ2V0IHNpemUuCisKK0pESU1FTlNJT04ganBlZ193aWR0aAkJQWN0dWFsIGRpbWVuc2lvbnMgb2Ygb3V0cHV0IGltYWdlLgorSkRJTUVOU0lPTiBqcGVnX2hlaWdodAogCiAKIFBlci1jb21wb25lbnQgcGFyYW1ldGVycyBhcmUgc3RvcmVkIGluIHRoZSBzdHJ1Y3QgY2luZm8uY29tcF9pbmZvW2ldIGZvcgpAQCAtMTA3MywxMiArMTEyMiwxNyBAQAogCXVudXN1YWwgY29udmVyc2lvbi4KIAogdW5zaWduZWQgaW50IHNjYWxlX251bSwgc2NhbGVfZGVub20KLQlTY2FsZSB0aGUgaW1hZ2UgYnkgdGhlIGZyYWN0aW9uIHNjYWxlX251bS9zY2FsZV9kZW5vbS4gIERlZmF1bHQgaXMKLQkxLzEsIG9yIG5vIHNjYWxpbmcuICBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCBzY2FsaW5nIHJhdGlvcwotCWFyZSAxLzEsIDEvMiwgMS80LCBhbmQgMS84LiAgKFRoZSBsaWJyYXJ5IGRlc2lnbiBhbGxvd3MgZm9yIGFyYml0cmFyeQotCXNjYWxpbmcgcmF0aW9zIGJ1dCB0aGlzIGlzIG5vdCBsaWtlbHkgdG8gYmUgaW1wbGVtZW50ZWQgYW55IHRpbWUgc29vbi4pCi0JU21hbGxlciBzY2FsaW5nIHJhdGlvcyBwZXJtaXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZGVjb2Rpbmcgc2luY2UKLQlmZXdlciBwaXhlbHMgbmVlZCBiZSBwcm9jZXNzZWQgYW5kIGEgc2ltcGxlciBJRENUIG1ldGhvZCBjYW4gYmUgdXNlZC4KKwlTY2FsZSB0aGUgaW1hZ2UgYnkgdGhlIGZyYWN0aW9uIHNjYWxlX251bS9zY2FsZV9kZW5vbS4gIEN1cnJlbnRseSwKKwl0aGUgc3VwcG9ydGVkIHNjYWxpbmcgcmF0aW9zIGFyZSBOLzggd2l0aCBhbGwgTiBmcm9tIDEgdG8gMTYuICAoVGhlCisJbGlicmFyeSBkZXNpZ24gYWxsb3dzIGZvciBhcmJpdHJhcnkgc2NhbGluZyByYXRpb3MgYnV0IHRoaXMgaXMgbm90CisJbGlrZWx5IHRvIGJlIGltcGxlbWVudGVkIGFueSB0aW1lIHNvb24uKSAgVGhlIHZhbHVlcyBhcmUgaW5pdGlhbGl6ZWQKKwlieSBqcGVnX3JlYWRfaGVhZGVyKCkgd2l0aCB0aGUgc291cmNlIERDVCBzaXplLCB3aGljaCBpcyBjdXJyZW50bHkKKwk4LzguICBJZiB5b3UgY2hhbmdlIG9ubHkgdGhlIHNjYWxlX251bSB2YWx1ZSB3aGlsZSBsZWF2aW5nIHRoZSBvdGhlcgorCXVuY2hhbmdlZCwgdGhlbiB0aGlzIHNwZWNpZmllcyB0aGUgRENUIHNjYWxlZCBzaXplIHRvIGJlIGFwcGxpZWQgb24KKwl0aGUgZ2l2ZW4gaW5wdXQsIHdoaWNoIGlzIGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIE4vOCBzY2FsaW5nLCBzaW5jZQorCXRoZSBzb3VyY2UgRENUIHNpemUgaXMgY3VycmVudGx5IGFsd2F5cyA4LiAgU21hbGxlciBzY2FsaW5nIHJhdGlvcworCXBlcm1pdCBzaWduaWZpY2FudGx5IGZhc3RlciBkZWNvZGluZyBzaW5jZSBmZXdlciBwaXhlbHMgbmVlZCBiZQorCXByb2Nlc3NlZCBhbmQgYSBzaW1wbGVyIElEQ1QgbWV0aG9kIGNhbiBiZSB1c2VkLgogCiBib29sZWFuIHF1YW50aXplX2NvbG9ycwogCUlmIHNldCBUUlVFLCBjb2xvcm1hcHBlZCBvdXRwdXQgd2lsbCBiZSBkZWxpdmVyZWQuICBEZWZhdWx0IGlzIEZBTFNFLApAQCAtMTEzMiw5ICsxMTg2LDEzIEBACiAJYXMgZGVzY3JpYmVkIGFib3ZlIGZvciBjb21wcmVzc2lvbi4KIAogYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nCi0JSWYgVFJVRSwgZG8gY2FyZWZ1bCB1cHNhbXBsaW5nIG9mIGNocm9tYSBjb21wb25lbnRzLiAgSWYgRkFMU0UsCi0JYSBmYXN0ZXIgYnV0IHNsb3BwaWVyIG1ldGhvZCBpcyB1c2VkLiAgRGVmYXVsdCBpcyBUUlVFLiAgVGhlIHZpc3VhbAotCWltcGFjdCBvZiB0aGUgc2xvcHBpZXIgbWV0aG9kIGlzIG9mdGVuIHZlcnkgc21hbGwuCisJSWYgVFJVRSwgdXNlIGRpcmVjdCBEQ1Qgc2NhbGluZyB3aXRoIERDVCBzaXplID4gOCBmb3IgdXBzYW1wbGluZworCW9mIGNocm9tYSBjb21wb25lbnRzLgorCUlmIEZBTFNFLCB1c2Ugb25seSBEQ1Qgc2l6ZSA8PSA4IGFuZCBzaW1wbGUgc2VwYXJhdGUgdXBzYW1wbGluZy4KKwlEZWZhdWx0IGlzIFRSVUUuCisJRm9yIGJldHRlciBpbWFnZSBzdGFiaWxpdHkgaW4gbXVsdGlwbGUgZ2VuZXJhdGlvbiBjb21wcmVzc2lvbiBjeWNsZXMKKwlpdCBpcyBwcmVmZXJhYmxlIHRoYXQgdGhpcyB2YWx1ZSBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nCisJZG9fZmFuY3lfZG93bnNhbXBsaW5nIHZhbHVlIGluIGNvbXByZXNzaW9uLgogCiBib29sZWFuIGRvX2Jsb2NrX3Ntb290aGluZwogCUlmIFRSVUUsIGludGVyYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpZWQgaW4gZWFybHkgc3RhZ2VzIG9mIGRlY29kaW5nCkBAIC0yNTA3LDYgKzI1NjUsOCBAQAogdGhlIGZvbGxvd2luZzoKICAgKiBTZXQgY2luZm8tPnJhd19kYXRhX2luIHRvIFRSVUUuICAoSXQgaXMgc2V0IEZBTFNFIGJ5IGpwZWdfc2V0X2RlZmF1bHRzKCkuKQogICAgIFRoaXMgbm90aWZpZXMgdGhlIGxpYnJhcnkgdGhhdCB5b3Ugd2lsbCBiZSBzdXBwbHlpbmcgcmF3IGRhdGEuCisgICAgRnVydGhlcm1vcmUsIHNldCBjaW5mby0+ZG9fZmFuY3lfZG93bnNhbXBsaW5nIHRvIEZBTFNFIGlmIHlvdSB3YW50IHRvIHVzZQorICAgIHJlYWwgZG93bnNhbXBsZWQgZGF0YS4gIChJdCBpcyBzZXQgVFJVRSBieSBqcGVnX3NldF9kZWZhdWx0cygpLikKICAgKiBFbnN1cmUganBlZ19jb2xvcl9zcGFjZSBpcyBjb3JyZWN0IC0tLSBhbiBleHBsaWNpdCBqcGVnX3NldF9jb2xvcnNwYWNlKCkKICAgICBjYWxsIGlzIGEgZ29vZCBpZGVhLiAgTm90ZSB0aGF0IHNpbmNlIGNvbG9yIGNvbnZlcnNpb24gaXMgYnlwYXNzZWQsCiAgICAgaW5fY29sb3Jfc3BhY2UgaXMgaWdub3JlZCwgZXhjZXB0IHRoYXQganBlZ19zZXRfZGVmYXVsdHMoKSB1c2VzIGl0IHRvCkBAIC0yNTY1LDE2ICsyNjI1LDE3IEBACiBJbiB0aGlzIGNhc2UgdGhlIHNhbWUgZGF0YSByb3dzIG11c3QgYmUgcGFzc2VkIGFnYWluIG9uIHRoZSBuZXh0IGNhbGwuCiAKIAotRGVjb21wcmVzc2lvbiB3aXRoIHJhdyBkYXRhIG91dHB1dCBpbXBsaWVzIGJ5cGFzc2luZyBhbGwgcG9zdHByb2Nlc3Npbmc6Ci15b3UgY2Fubm90IGFzayBmb3IgcmVzY2FsaW5nIG9yIGNvbG9yIHF1YW50aXphdGlvbiwgZm9yIGluc3RhbmNlLiAgTW9yZQotc2VyaW91c2x5LCB5b3UgbXVzdCBkZWFsIHdpdGggdGhlIGNvbG9yIHNwYWNlIGFuZCBzYW1wbGluZyBmYWN0b3JzIHByZXNlbnQgaW4KLXRoZSBpbmNvbWluZyBmaWxlLiAgSWYgeW91ciBhcHBsaWNhdGlvbiBvbmx5IGhhbmRsZXMsIHNheSwgMmgxdiBZQ2JDciBkYXRhLAorRGVjb21wcmVzc2lvbiB3aXRoIHJhdyBkYXRhIG91dHB1dCBpbXBsaWVzIGJ5cGFzc2luZyBhbGwgcG9zdHByb2Nlc3NpbmcuCitZb3UgbXVzdCBkZWFsIHdpdGggdGhlIGNvbG9yIHNwYWNlIGFuZCBzYW1wbGluZyBmYWN0b3JzIHByZXNlbnQgaW4gdGhlCitpbmNvbWluZyBmaWxlLiAgSWYgeW91ciBhcHBsaWNhdGlvbiBvbmx5IGhhbmRsZXMsIHNheSwgMmgxdiBZQ2JDciBkYXRhLAogeW91IG11c3QgY2hlY2sgZm9yIGFuZCBmYWlsIG9uIG90aGVyIGNvbG9yIHNwYWNlcyBvciBvdGhlciBzYW1wbGluZyBmYWN0b3JzLgogVGhlIGxpYnJhcnkgd2lsbCBub3QgY29udmVydCB0byBhIGRpZmZlcmVudCBjb2xvciBzcGFjZSBmb3IgeW91LgogCiBUbyBvYnRhaW4gcmF3IGRhdGEgb3V0cHV0LCBzZXQgY2luZm8tPnJhd19kYXRhX291dCA9IFRSVUUgYmVmb3JlCiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSAoaXQgaXMgc2V0IEZBTFNFIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKSkuICBCZSBzdXJlIHRvCiB2ZXJpZnkgdGhhdCB0aGUgY29sb3Igc3BhY2UgYW5kIHNhbXBsaW5nIGZhY3RvcnMgYXJlIG9uZXMgeW91IGNhbiBoYW5kbGUuCitGdXJ0aGVybW9yZSwgc2V0IGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0UgaWYgeW91IHdhbnQgdG8gZ2V0IHJlYWwKK2Rvd25zYW1wbGVkIGRhdGEgKGl0IGlzIHNldCBUUlVFIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKSkuCiBUaGVuIGNhbGwganBlZ19yZWFkX3Jhd19kYXRhKCkgaW4gcGxhY2Ugb2YganBlZ19yZWFkX3NjYW5saW5lcygpLiAgVGhlCiBkZWNvbXByZXNzaW9uIHByb2Nlc3MgaXMgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIHVzdWFsLgogCkBAIC0yNjA4LDcgKzI2NjksNyBAQAogY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmlydHVhbC1hcnJheQogZGVzY3JpcHRvcnMuICBFYWNoIHZpcnR1YWwgYXJyYXkgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHVzaW5nIHRoZSBKUEVHCiBtZW1vcnkgbWFuYWdlcidzIGFjY2Vzc192aXJ0X2JhcnJheSBtZXRob2QgKHNlZSBNZW1vcnkgbWFuYWdlbWVudCwgYmVsb3csCi1hbmQgYWxzbyByZWFkIHN0cnVjdHVyZS5kb2MncyBkaXNjdXNzaW9uIG9mIHZpcnR1YWwgYXJyYXkgaGFuZGxpbmcpLiAgT3IsCithbmQgYWxzbyByZWFkIHN0cnVjdHVyZS50eHQncyBkaXNjdXNzaW9uIG9mIHZpcnR1YWwgYXJyYXkgaGFuZGxpbmcpLiAgT3IsCiBmb3Igc2ltcGxlIHRyYW5zY29kaW5nIHRvIGEgZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXQsIHRoZSBhcnJheSBsaXN0IGNhbgoganVzdCBiZSBoYW5kZWQgZGlyZWN0bHkgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KIApAQCAtMjc1Miw3ICsyODEzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgc2VjdGlvbiBjb3ZlcnMgc29tZSBrZXkgZmFjdHMgYWJvdXQgdGhlIEpQRUcgbGlicmFyeSdzIGJ1aWx0LWluIG1lbW9yeQotbWFuYWdlci4gIEZvciBtb3JlIGluZm8sIHBsZWFzZSByZWFkIHN0cnVjdHVyZS5kb2MncyBzZWN0aW9uIGFib3V0IHRoZSBtZW1vcnkKK21hbmFnZXIuICBGb3IgbW9yZSBpbmZvLCBwbGVhc2UgcmVhZCBzdHJ1Y3R1cmUudHh0J3Mgc2VjdGlvbiBhYm91dCB0aGUgbWVtb3J5CiBtYW5hZ2VyLCBhbmQgY29uc3VsdCB0aGUgc291cmNlIGNvZGUgaWYgbmVjZXNzYXJ5LgogCiBBbGwgbWVtb3J5IGFuZCB0ZW1wb3JhcnkgZmlsZSBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgbGlicmFyeSBpcyBkb25lIHZpYSB0aGUKQEAgLTI4NjcsNyArMjkyOCw3IEBACiBsYXJnZXIgdGhhbiBhIGNoYXIsIHNvIGl0IGFmZmVjdHMgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uJ3MgaW1hZ2UgZGF0YS4KIFRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnIGFuZCBkanBlZyBjYW4gc3VwcG9ydCAxMi1iaXQgbW9kZSBvbmx5IGZvciBQUE0KIGFuZCBHSUYgZmlsZSBmb3JtYXRzOyB5b3UgbXVzdCBkaXNhYmxlIHRoZSBvdGhlciBmaWxlIGZvcm1hdHMgdG8gY29tcGlsZSBhCi0xMi1iaXQgY2pwZWcgb3IgZGpwZWcuICAoaW5zdGFsbC5kb2MgaGFzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdC4pCisxMi1iaXQgY2pwZWcgb3IgZGpwZWcuICAoaW5zdGFsbC50eHQgaGFzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdC4pCiBBdCBwcmVzZW50LCBhIDEyLWJpdCBsaWJyYXJ5IGNhbiBoYW5kbGUgKm9ubHkqIDEyLWJpdCBpbWFnZXMsIG5vdCBib3RoCiBwcmVjaXNpb25zLiAgKElmIHlvdSBuZWVkIHRvIGluY2x1ZGUgYm90aCA4LSBhbmQgMTItYml0IGxpYnJhcmllcyBpbiBhIHNpbmdsZQogYXBwbGljYXRpb24sIHlvdSBjb3VsZCBwcm9iYWJseSBkbyBpdCBieSBkZWZpbmluZyBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCkBAIC0yOTIwLDcgKzI5ODEsNyBAQAogCiBUaGUgY29kZSB3b3JrcyBmaW5lIG9uIEFOU0kgQywgQysrLCBhbmQgcHJlLUFOU0kgQyBjb21waWxlcnMsIHVzaW5nIGFueSBvZgogdGhlIHBvcHVsYXIgc3lzdGVtIGluY2x1ZGUgZmlsZSBzZXR1cHMsIGFuZCBzb21lIG5vdC1zby1wb3B1bGFyIG9uZXMgdG9vLgotU2VlIGluc3RhbGwuZG9jIGZvciBjb25maWd1cmF0aW9uIHByb2NlZHVyZXMuCitTZWUgaW5zdGFsbC50eHQgZm9yIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlcy4KIAogVGhlIGNvZGUgaXMgbm90IGRlcGVuZGVudCBvbiB0aGUgZXhhY3Qgc2l6ZXMgb2YgdGhlIEMgZGF0YSB0eXBlcy4gIEFzCiBkaXN0cmlidXRlZCwgd2UgbWFrZSB0aGUgYXNzdW1wdGlvbnMgdGhhdApAQCAtMjk1OSw3ICszMDIwLDcgQEAKIGNoYXJhY3RlcnMuICBIb3dldmVyLCBnbG9iYWwgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIG1hZGUgdW5pcXVlIGluIHRoZQogZmlyc3QgNiBjaGFyYWN0ZXJzIGJ5IGRlZmluaW5nIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMuCiAKLU1vcmUgaW5mbyBhYm91dCBwb3J0aW5nIHRoZSBjb2RlIG1heSBiZSBnbGVhbmVkIGJ5IHJlYWRpbmcgamNvbmZpZy5kb2MsCitNb3JlIGluZm8gYWJvdXQgcG9ydGluZyB0aGUgY29kZSBtYXkgYmUgZ2xlYW5lZCBieSByZWFkaW5nIGpjb25maWcudHh0LAogam1vcmVjZmcuaCwgYW5kIGppbmNsdWRlLmguCiAKIApkaWZmIC0tZ2l0IGEvbHRjb25maWcgYi9sdGNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM0N2U2OS4uMDAwMDAwMAotLS0gYS9sdGNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE1MTIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIGx0Y29uZmlnIC0gQ3JlYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wuCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIEEgbG90IG9mIHRoaXMgc2NyaXB0IGlzIHRha2VuIGZyb20gYXV0b2NvbmYtMi4xMC4KLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIiR7Q0RQQVRIK3NldH0iID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLWVjaG89ZWNobwotaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuIDoKLWVsc2UKLSAgIyBUaGUgU29sYXJpcyBhbmQgQUlYIGRlZmF1bHQgZWNobyBwcm9ncmFtIHVucXVvdGVzIGJhY2tzbGFzaGVzLgotICAjIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZwotICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJwotICAjIFNvLCB3ZSBlbXVsYXRlIGVjaG8gd2l0aCBwcmludGYgJyVzXG4nCi0gIGVjaG89InByaW50ZiAlc1xcbiIKLSAgaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuIDoKLSAgZWxzZQotICAgICMgT29wcy4gIFdlIGhhdmUgbm8gd29ya2luZyBwcmludGYuICBUcnkgdG8gZmluZCBhIG5vdC1zby1idWdneSBlY2hvLgotICAgIGVjaG89ZWNobwotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9lY2hvICYmIHRlc3QgIlhgJGRpci9lY2hvICdcdCdgIiA9ICdYXHQnOyB0aGVuCi0gICAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICBmaQotZmkKLQotIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcwotIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLVhzZWQ9J3NlZCAtZSBzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJwotCi0jIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KLWRvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKLQotIyBUaGUgbmFtZSBvZiB0aGlzIHByb2dyYW0uCi1wcm9nbmFtZT1gJGVjaG8gIlgkMCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0jIENvbnN0YW50czoKLVBST0dSQU09bHRjb25maWcKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjIKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LmMgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LmMgJExJQlMgMT4mNScKLXJtPSJybSAtZiIKLQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1jYW5fYnVpbGRfc2hhcmVkPXllcwotZW5hYmxlX3NoYXJlZD15ZXMKLSMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcuCi1lbmFibGVfc3RhdGljPXllcwotbHRtYWluPQotc2lsZW50PQotc3JjZGlyPQotYWNfY29uZmlnX2d1ZXNzPQotYWNfY29uZmlnX3N1Yj0KLWhvc3Q9Ci1ub25vcHQ9Ci12ZXJpZnlfaG9zdD15ZXMKLXdpdGhfZ2NjPW5vCi13aXRoX2dudV9sZD1ubwotCi1vbGRfQVI9IiRBUiIKLW9sZF9DQz0iJENDIgotb2xkX0NGTEFHUz0iJENGTEFHUyIKLW9sZF9DUFBGTEFHUz0iJENQUEZMQUdTIgotb2xkX0xEPSIkTEQiCi1vbGRfTE5fUz0iJExOX1MiCi1vbGRfTk09IiROTSIKLW9sZF9SQU5MSUI9IiRSQU5MSUIiCi0KLSMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotYXJncz0KLXByZXY9Ci1mb3Igb3B0aW9uCi1kbwotICBjYXNlICIkb3B0aW9uIiBpbgotICAtKj0qKSBvcHRhcmc9YGVjaG8gIiRvcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGV2YWwgIiRwcmV2PVwkb3B0aW9uIgotICAgIHByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkb3B0aW9uIiBpbgotICAtLWhlbHApIGNhdCA8PEVPTQotVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiBMVE1BSU4gW0hPU1RdCi0KLUdlbmVyYXRlIGEgc3lzdGVtLXNwZWNpZmljIGxpYnRvb2wgc2NyaXB0LgotCi0gICAgLS1kaXNhYmxlLXNoYXJlZCAgICAgICBkbyBub3QgYnVpbGQgc2hhcmVkIGxpYnJhcmllcwotICAgIC0tZGlzYWJsZS1zdGF0aWMgICAgICAgZG8gbm90IGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMKLSAgICAtLWhlbHAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Ci0gICAgLS1uby12ZXJpZnkgICAgICAgICAgICBkbyBub3QgdmVyaWZ5IHRoYXQgSE9TVCBpcyBhIHZhbGlkIGhvc3QgdHlwZQotICAgIC0tcXVpZXQgICAgICAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgICAgICAgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXNyY2Rpcj1ESVIgICAgICAgICAgIGZpbmQgXGBjb25maWcuZ3Vlc3MnIGluIERJUgotICAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLXdpdGgtZ2NjICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHRoZSBHTlUgQyBjb21waWxlciB3aWxsIGJlIHVzZWQKLSAgICAtLXdpdGgtZ251LWxkICAgICAgICAgIGFzc3VtZSB0aGF0IHRoZSBDIGNvbXBpbGVyIHVzZXMgdGhlIEdOVSBsaW5rZXIKLQotTFRNQUlOIGlzIHRoZSBcYGx0bWFpbi5zaCcgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgcHJvdmlkZXMgYmFzaWMgbGlidG9vbAotZnVuY3Rpb25hbGl0eS4KLQotSE9TVCBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3lzdGVtIG5hbWUgW2RlZmF1bHQ9Z3Vlc3NlZF0uCi1FT00KLSAgZXhpdCAwCi0gIDs7Ci0KLSAgLS1kaXNhYmxlLXNoYXJlZCkgZW5hYmxlX3NoYXJlZD1ubyA7OwotCi0gIC0tZGlzYWJsZS1zdGF0aWMpIGVuYWJsZV9zdGF0aWM9bm8gOzsKLQotICAtLXF1aWV0IHwgLS1zaWxlbnQpIHNpbGVudD15ZXMgOzsKLQotICAtLXNyY2RpcikgcHJldj1zcmNkaXIgOzsKLSAgLS1zcmNkaXI9Kikgc3JjZGlyPSIkb3B0YXJnIiA7OwotCi0gIC0tbm8tdmVyaWZ5KSB2ZXJpZnlfaG9zdD1ubyA7OwotCi0gIC0tdmVyc2lvbikgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04iOyBleGl0IDAgOzsKLQotICAtLXdpdGgtZ2NjKSB3aXRoX2djYz15ZXMgOzsKLSAgLS13aXRoLWdudS1sZCkgd2l0aF9nbnVfbGQ9eWVzIDs7Ci0KLSAgLSopCi0gICAgZWNobyAiJHByb2duYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICAgICAgbHRtYWluPSIkb3B0aW9uIgotICAgIGVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0jIFRoaXMgZ2VuZXJhdGVzIGFuIHVubmVjZXNzYXJ5IHdhcm5pbmcgZm9yIHNwYXJjLXN1bi1zb2xhcmlzNC4xLjNfVTEKLSMgICAgICBpZiB0ZXN0IC1uICJgZWNobyAkb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotIyAgICAgICAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nIFxgJG9wdGlvbicgaXMgbm90IGEgdmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0jICAgICAgZmkKLSAgICAgIGhvc3Q9IiRvcHRpb24iCi0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiB0b28gbWFueSBhcmd1bWVudHMiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLXogIiRsdG1haW4iOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIExUTUFJTiBmaWxlIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4gOgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IFxgJGx0bWFpbicgZG9lcyBub3QgZXhpc3QiIDE+JjIKLSAgZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi0jIFF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1sdGNvbmZpZ19hcmdzPQotZm9yIGFyZwotZG8KLSAgY2FzZSAiJGFyZyIgaW4KLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJyRhcmcnIiA7OwotICAqKSBsdGNvbmZpZ19hcmdzPSIkbHRjb25maWdfYXJncyAkYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgQSByZWxldmFudCBzdWJzZXQgb2YgQUNfSU5JVC4KLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KLSMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCi0jIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICAjIEFzc3VtZSB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyB0aGUgc2FtZSBvbmUgYXMgdGhlIHBhdGggdG8gbHRtYWluLnNoLgotICBzcmNkaXI9YCRlY2hvICIkbHRtYWluIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gIHRlc3QgIiRzcmNkaXIiID0gIiRsdG1haW4iICYmIHNyY2Rpcj0uCi1maQotCi10cmFwICIkcm0gY29uZnRlc3QqOyBleGl0IDEiIDEgMiAxNQotaWYgdGVzdCAiJHZlcmlmeV9ob3N0IiA9IHllczsgdGhlbgotICAjIENoZWNrIGZvciBjb25maWcuZ3Vlc3MgYW5kIGNvbmZpZy5zdWIuCi0gIGFjX2F1eF9kaXI9Ci0gIGZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL2NvbmZpZy5ndWVzczsgdGhlbgotICAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgZmluZCBjb25maWcuZ3Vlc3MgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjIKLSAgICBlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotICBhY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi0gIGFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotCi0gICMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSAgaWYgJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLQotICBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLQotICBob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRob3N0X2FsaWFzIiBpbgotICAiIikKLSAgICBpZiBob3N0X2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZQotICAgICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMgotICAgICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpIDs7Ci0gIGVzYWMKLSAgaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi0gIGVjaG8gIiRhY190JGhvc3QiIDE+JjYKLQotICAjIE1ha2Ugc3VyZSB0aGUgaG9zdCB2ZXJpZmllZC4KLSAgdGVzdCAteiAiJGhvc3QiICYmIGV4aXQgMQotCi1lbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBob3N0IHR5cGUgaWYgeW91IHVzZSBcYC0tbm8tdmVyaWZ5JyIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWVsc2UKLSAgaG9zdF9hbGlhcz0kaG9zdAotZmkKLQotIyBUcmFuc2Zvcm0gbGludXgqIHRvICotKi1saW51eC1nbnUqLCB0byBzdXBwb3J0IG9sZCBjb25maWd1cmUgc2NyaXB0cy4KLWNhc2UgIiRob3N0X29zIiBpbgotbGludXgtZ251KikgOzsKLWxpbnV4KikgaG9zdD1gZWNobyAkaG9zdCB8IHNlZCAncy9eXCguKi0uKi1saW51eFwpXCguKlwpJC9cMS1nbnVcMi8nYAotZXNhYwotCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCi0gICMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotICAjIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi0gIGlmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgICBDT0xMRUNUX05BTUVTPQotICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLSMgRGV0ZXJtaW5lIGNvbW1hbmRzIHRvIGNyZWF0ZSBvbGQtc3R5bGUgc3RhdGljIGFyY2hpdmVzLgotb2xkX2FyY2hpdmVfY21kcz0nJEFSIGNydSAkb2xkbGliJG9sZG9ianMnCi1vbGRfcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNjQ0ICRvbGRsaWInCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPQotCi0jIFNldCBhIHNhbmUgZGVmYXVsdCBmb3IgYEFSJy4KLXRlc3QgLXogIiRBUiIgJiYgQVI9YXIKLQotIyBJZiBSQU5MSUIgaXMgbm90IHNldCwgdGhlbiBydW4gdGhlIHRlc3QuCi1pZiB0ZXN0ICIke1JBTkxJQitzZXR9IiAhPSAic2V0IjsgdGhlbgotICByZXN1bHQ9bm8KLQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmFubGliLi4uICRhY19jIiAxPiY2Ci0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvcmFubGliOyB0aGVuCi0gICAgICBSQU5MSUI9InJhbmxpYiIKLSAgICAgIHJlc3VsdD0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGVjaG8gIiRhY190JHJlc3VsdCIgMT4mNgotZmkKLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHM7XCRSQU5MSUIgXCRvbGRsaWIiCi0gIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiBcJG9sZGxpYjskb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgdXNpbmcgR0NDLgotaWYgdGVzdCAiJHdpdGhfZ2NjIiAhPSB5ZXMgfHwgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIElmIENDIGlzIG5vdCBzZXQsIHRoZW4gdHJ5IHRvIGZpbmQgR0NDIG9yIGEgdXNhYmxlIENDLgotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdjYy4uLiAkYWNfYyIgMT4mNgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9nY2M7IHRoZW4KLQlDQz0iZ2NjIgotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgIGZpCi0gIGZpCi0KLSAgIyBOb3QgImdjYyIsIHNvIHRyeSAiY2MiLCByZWplY3RpbmcgIi91c3IvdWNiL2NjIi4KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYy4uLiAkYWNfYyIgMT4mNgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgY2NfcmVqZWN0ZWQ9bm8KLSAgICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGRpci9jYzsgdGhlbgotCWlmIHRlc3QgIiRkaXIvY2MiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotCSAgY2NfcmVqZWN0ZWQ9eWVzCi0JICBjb250aW51ZQotCWZpCi0JQ0M9ImNjIgotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBpZiB0ZXN0ICRjY19yZWplY3RlZCA9IHllczsgdGhlbgotICAgICAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICAgICAgc2V0IGR1bW15ICRDQwotICAgICAgc2hpZnQKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLQkjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLQkjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLQkjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotCXNoaWZ0Ci0Jc2V0IGR1bW15ICIkZGlyL2NjIiAiJEAiCi0Jc2hpZnQKLQlDQz0iJEAiCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICBmaQotCi0gICAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGZpCi0KLSAgIyBOb3cgc2VlIGlmIHRoZSBjb21waWxlciBpcyByZWFsbHkgR0NDLgotICB3aXRoX2djYz1ubwotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQy4uLiAkYWNfYyIgMT4mNgotICBlY2hvICIkcHJvZ25hbWU6NDI0OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci0KLSAgJHJtIGNvbmZ0ZXN0LmMKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi0gIGlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo0MzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIHdpdGhfZ2NjPXllcwotICBmaQotICAkcm0gY29uZnRlc3QuYwotICBlY2hvICIkYWNfdCR3aXRoX2djYyIgMT4mNgotZmkKLQotIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KLXNldCBkdW1teSAkQ0MKLWNvbXBpbGVyPSIkMiIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJGFjX2MiIDE+JjYKLXBpY19mbGFnPQotc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzPQotd2w9Ci1saW5rX3N0YXRpY19mbGFnPQotbm9fYnVpbHRpbl9mbGFnPQotCi1pZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gIHdsPSctV2wsJwotICBsaW5rX3N0YXRpY19mbGFnPSctc3RhdGljJwotICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCi0KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCogfCBpcml4NSogfCBpcml4NiogfCBvc2YzKiB8IG9zZjQqKQotICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgIDs7Ci0gIG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLSAgYW1pZ2FvcyopCi0gICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgcGljX2ZsYWc9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICA7OwotICAqKQotICAgIHBpY19mbGFnPSctZlBJQycKLSAgICA7OwotICBlc2FjCi1lbHNlCi0gICMgUE9SVE1FIENoZWNrIGZvciBQSUMgZmxhZ3MgZm9yIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKiB8IGFpeDQqKQotICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICBsaW5rX3N0YXRpY19mbGFnPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgOzsKLQotICBocHV4OSogfCBocHV4MTAqKQotICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbGlua19zdGF0aWNfZmxhZyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/Ci0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0iJHt3bH0tYSAke3dsfWFyY2hpdmUiCi0gICAgcGljX2ZsYWc9JytaJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJwotICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KLSAgICA7OwotCi0gIG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLQotICBvc2YzKiB8IG9zZjQqKQotICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1ub25fc2hhcmVkJwotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIHBpY19mbGFnPSctS3BpYycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctZG4nCi0gICAgc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzPSctYmVsZicKLSAgICA7OwotCi0gIHNvbGFyaXMyKikKLSAgICBwaWNfZmxhZz0nLUtQSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1XbCwnCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIHBpY19mbGFnPSctUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctUW9wdGlvbiBsZCAnCi0gICAgOzsKLQotICBzeXN2NC4ydXcyKikKLSAgICBwaWNfZmxhZz0nLUtQSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1XbCwnCi0gICAgOzsKLQotICB1dHM0KikKLSAgICBwaWNfZmxhZz0nLXBpYycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICA7OwotCi0gICopCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KLSAgZWNobyAiJGFjX3QkcGljX2ZsYWciIDE+JjYKLQotICAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcGljX2ZsYWcgYWN0dWFsbHkgd29ya3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTICRwaWNfZmxhZyAtRFBJQyIKLSAgZWNobyAiJHByb2duYW1lOjU0NzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRwaWNfZmxhZyB3b3JrcyIgPiY1Ci0gIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NTQ4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KLSAgICAjIEFwcGVuZCBhbnkgd2FybmluZ3MgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0KLSAgICAjIE9uIEhQLVVYLCBib3RoIENDIGFuZCBHQ0Mgb25seSB3YXJuIHRoYXQgUElDIGlzIHN1cHBvcnRlZC4uLiB0aGVuIHRoZXkKLSAgICAjIGNyZWF0ZSBub24tUElDIG9iamVjdHMuICBTbywgaWYgdGhlcmUgd2VyZSBhbnkgd2FybmluZ3MsIHdlIGFzc3VtZSB0aGF0Ci0gICAgIyBQSUMgaXMgbm90IHN1cHBvcnRlZC4KLSAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgICAgcGljX2ZsYWc9Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgICAgIHBpY19mbGFnPSIgJHBpY19mbGFnIgotICAgIGZpCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICBwaWNfZmxhZz0KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi1lbHNlCi0gIGVjaG8gIiRhY190Im5vbmUgMT4mNgotZmkKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgY29tcGlsYXRpb24gZmxhZ3MuCi1pZiB0ZXN0IC1uICIkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHdhcm5pbmc6IFxgJENDJyByZXF1aXJlcyBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLSAgaWYgZWNobyAiJG9sZF9DQyAkb2xkX0NGTEFHUyAiIHwgZWdyZXAgLWUgIlsgCV0kc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzWyAJXSIgPi9kZXYvbnVsbDsgdGhlbiA6Ci0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGFkZCBcYCRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MnIHRvIHRoZSBDQyBvciBDRkxBR1MgZW52IHZhcmlhYmxlIGFuZCByZWNvbmZpZ3VyZSIgMT4mMgotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgZmkKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAnbWFpbigpe3JldHVybigwKTt9JyA+IGNvbmZ0ZXN0LmMKLXNhdmVfTERGTEFHUz0iJExERkxBR1MiCi1MREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKLWVjaG8gIiRwcm9nbmFtZTo1OTE6IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbGlua19zdGF0aWNfZmxhZyB3b3JrcyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjU5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIGVjaG8gIiRhY190JGxpbmtfc3RhdGljX2ZsYWciIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3Qibm9uZSAxPiY2Ci0gIGxpbmtfc3RhdGljX2ZsYWc9Ci1maQotTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKLSRybSBjb25mdGVzdCoKLQotaWYgdGVzdCAteiAiJExOX1MiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB1c2UgbG4gLXMsIG9yIHdlIG5lZWQgaGFyZCBsaW5rcy4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3RkYXRhCi0gIGlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgJHJtIGNvbmZ0ZXN0ZGF0YQotICAgIExOX1M9ImxuIC1zIgotICBlbHNlCi0gICAgTE5fUz1sbgotICBmaQotICBpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgZWxzZQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLWZpCi0KLSMgTWFrZSBzdXJlIExEIGlzIGFuIGFic29sdXRlIHBhdGguCi1pZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIGFjX3Byb2c9bGQKLSAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQy4uLiAkYWNfYyIgMT4mNgotICAgIGVjaG8gIiRwcm9nbmFtZTo2MjQ6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICAgIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06XFwqKQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAgICIiKQotICAgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZSBub3QgdXNpbmcgR0NDLgotICAgICAgYWNfcHJvZz1sZAotICAgICAgOzsKLSAgICAqKQotICAgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6NjQyOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLSAgZWxzZQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLSAgICBlY2hvICIkcHJvZ25hbWU6NjQ1OiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci0gIGZpCi0KLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotCUxEPSIkYWNfZGlyLyRhY19wcm9nIgotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLQkjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0JIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0JaWYgIiRMRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLQllbHNlCi0JICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotCWZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgZmkKLQotICBpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJGFjX3QkTEQiIDE+JjYKLSAgZWxzZQotICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gICAgZWNobyAiJHByb2duYW1lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpCi0KLSMgQ2hlY2sgdG8gc2VlIGlmIGl0IHJlYWxseSBpcyBvciBpcyBub3QgR05VIGxkLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQuLi4gJGFjX2MiIDE+JjYKLSMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLWVjaG8gIiRhY190JHdpdGhfZ251X2xkIiAxPiY2Ci0KLSMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2Ci0KLWFsbG93X3VuZGVmaW5lZF9mbGFnPQotbm9fdW5kZWZpbmVkX2ZsYWc9Ci1hcmNoaXZlX2NtZHM9Ci1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPQotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9Ci1oYXJkY29kZV9kaXJlY3Q9bm8KLWhhcmRjb2RlX21pbnVzX0w9bm8KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKLXJ1bnBhdGhfdmFyPQotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFtaWdhb3MqIHwgc3Vub3M0KikKLSAgIyBPbiB0aGVzZSBvcGVyYXRpbmcgc3lzdGVtcywgd2Ugc2hvdWxkIHRyZWF0IEdOVSBsZCBsaWtlIHRoZSBzeXN0ZW0gbGQuCi0gIGdudV9sZF9hY3RzX25hdGl2ZT15ZXMKLSAgOzsKLSopCi0gIGdudV9sZF9hY3RzX25hdGl2ZT1ubwotICA7OwotZXNhYwotCi1sZF9zaGxpYnM9eWVzCi1pZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzICYmIHRlc3QgIiRnbnVfbGRfYWN0c19uYXRpdmUiICE9IHllczsgdGhlbgotCi0gICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgotICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJGxpYm9ianMnCi0gICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKLSAgICBsZF9zaGxpYnM9eWVzCi0gIGVsc2UKLSAgICBsZF9zaGxpYnM9bm8KLSAgZmkKLQotICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IHllczsgdGhlbgotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCi0gIGZpCi1lbHNlCi0gICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqKQotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYXJjaGl2ZV9jbWRzPSckTk0kbGlib2JqcyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnID4gJGxpYi5leHA7JExEIC1vICRvYmpkaXIvJHNvbmFtZSRsaWJvYmpzIC1iRTokbGliLmV4cCAtVDUxMiAtSDUxMiAtYk06U1JFOyRBUiBjcnUgJGxpYiAkb2JqZGlyLyRzb25hbWUnCi0gICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotICAgICAgIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0gICAgICAjIGJyb2tlbiBjb2xsZWN0Mi4KLSAgICAgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgIGZpCi0gICAgOzsKLQotICBhaXg0KikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJE5NJGxpYm9ianMgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICdcJydzLy4qIC8vJ1wnJyA+ICRsaWIuZXhwOyRDQyAtbyAkb2JqZGlyLyRzb25hbWUkbGlib2JqcyAke3dsfS1iRTokbGliLmV4cCAke3dsfS1iTTpTUkUgJHt3bH0tYm5vZW50cnk7JEFSIGNydSAkbGliICRvYmpkaXIvJHNvbmFtZScKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICA7OwotCi0gIGFtaWdhb3MqKQotICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhOyRBUiBjcnUgJGxpYiRsaWJvYmpzOyRSQU5MSUIgJGxpYjsoY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIDs7Ci0KLSAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCi0gICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubwotICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKLSAgIyBleHRyYSBzcGFjZSkuCi0gIGZyZWVic2QyLjIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcyAvdXNyL2xpYi9jKytydDAubycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgotICBmcmVlYnNkMiopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAzLCBhdCBsYXN0LCB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCi0gIGZyZWVic2QzKikKLSAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgaHB1eDkqKQotICAgIGFyY2hpdmVfY21kcz0nJHJtICRvYmpkaXIvJHNvbmFtZTskTEQgLWIgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvYmpkaXIvJHNvbmFtZSRsaWJvYmpzO212ICRvYmpkaXIvJHNvbmFtZSAkbGliJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICA7OwotCi0gIGhwdXgxMCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArcyArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKLSAgICA7OwotCi0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgLXNvbmFtZSAkc29uYW1lIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIDs7Ci0KLSAgbmV0YnNkKikKLSAgICAjIFRlc3RlZCB3aXRoIE5ldEJTRCAxLjIgbGQKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBvcGVuYnNkKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBvczIqKQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgYXJjaGl2ZV9jbWRzPSckZWNobyAiTElCUkFSWSAkbGlibmFtZSBJTklUSU5TVEFOQ0UiID4gJG9iamRpci8kbGlibmFtZS5kZWY7JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7JGVjaG8gREFUQSA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyAiIFNJTkdMRSBOT05TSEFSRUQiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvIEVYUE9SVFMgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7ZW14ZXhwJGxpYm9ianMgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIkbGlib2JqcyAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSdlbXhpbXAgLW8gJG9iamRpci8kbGlibmFtZS5hICRvYmpkaXIvJGxpYm5hbWUuZGVmJwotICAgIDs7Ci0KLSAgb3NmMyogfCBvc2Y0KikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLW8gJGxpYiAtc29uYW1lICRzb25hbWUgLXNldF92ZXJzaW9uICR2ZXJzdHJpbmckbGlib2JqcyRkZXBsaWJzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIHNjbzMuMnY1KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliJGxpYm9ianMnCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIDs7Ci0KLSAgc29sYXJpczIqKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiRsaWJvYmpzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0KLSAgICAjIFNvbGFyaXMgMiBiZWZvcmUgMi41IGhhcmRjb2RlcyAtTCBwYXRocy4KLSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgICBzb2xhcmlzMi5bMC00XSopCi0gICAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiRsaWJvYmpzJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIkbGlib2JqcycKLSAgICBmaQotCi0gICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1leHBvcnQtZHluYW1pYycKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICB1dHM0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIkbGlib2JqcycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PW5vCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi1lY2hvICIkYWNfdCRsZF9zaGxpYnMiIDE+JjYKLQotaWYgdGVzdCAteiAiJE5NIjsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0uLi4gJGFjX2MiIDE+JjYKLSAgY2FzZSAiJE5NIiBpbgotICAvKiB8IFtBLVphLXpdOlxcKikgOzsgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICopCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgICBmb3IgYWNfZGlyIGluIC91c3IvdWNiIC91c3IvY2NzL2JpbiAkUEFUSCAvYmluOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgICBOTT0iJGFjX2Rpci9ubSAtQiIKLSAgICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgICBOTT0iJGFjX2Rpci9ubSAtcCIKLQllbHNlCi0gICAgICAgICAgTk09IiRhY19kaXIvbm0iCi0JZmkKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGFjX3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiROTSIgJiYgTk09bm0KLSAgICA7OwotICBlc2FjCi0gIGVjaG8gIiRhY190JE5NIiAxPiY2Ci1maQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0Li4uICRhY19jIiAxPiY2Ci0KLSMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotc3ltY29kZT0nW0JDREVHUlNUVV0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotc3lteGZybT0nXDEgXDEnCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tCQ0RUVV0nCi0gIDs7Ci1pcml4KikKLSAgIyBDYW5ub3QgdXNlIHVuZGVmaW5lZCBzeW1ib2xzIG9uIElSSVggYmVjYXVzZSBpbmxpbmVkIGZ1bmN0aW9ucyBtZXNzIHVzIHVwLgotICBzeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpczIqKQotICBzeW1jb2RlPSdbQkRUVV0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIHN5bWNvZGU9J1tBQkNER0lTVFVXXScKLWZpCi0KLSMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAkc3ltY29kZSAkc3ltcGF0JC8kc3lteGZybS9wJyIKLQotIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi1waXBlX3dvcmtzPW5vCi0kcm0gY29uZnRlc3QqCi1jYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQotRU9GCi0KLWVjaG8gIiRwcm9nbmFtZTo5NzE6IGNoZWNraW5nIGlmIGdsb2JhbF9zeW1ib2xfcGlwZSB3b3JrcyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjk3MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIG5saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgZWNobyAiJHByb2duYW1lOjk3NTogZXZhbCBcIiROTSBjb25mdGVzdC5vIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdFwiIiA+JjU7IGV2YWwgIiROTSBjb25mdGVzdC5vIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+ICRubGlzdCAyPiY1IjsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCi0KLSAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0gICAgICBtdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKLSAgICAgIHdjb3V0PWB3YyAiJG5saXN0IiAyPi9kZXYvbnVsbGAKLSAgICAgIGNvdW50PWAkZWNobyAiWCR3Y291dCIgfCAkWHNlZCAtZSAncy9eWyAJXSpcKFswLTldWzAtOV0qXCkuKiQvXDEvJ2AKLSAgICAgICh0ZXN0ICIkY291bnQiIC1nZSAwKSAyPi9kZXYvbnVsbCB8fCBjb3VudD0tMQotICAgIGVsc2UKLSAgICAgIHJtIC1mICIkbmxpc3QiVAotICAgICAgY291bnQ9LTEKLSAgICBmaQotCi0gICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQljYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotICAgICAgICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0gICAgICAgIHNlZCAncy9eLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQotCWNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBfX3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIF9fcHRyX3QgY2hhciAqCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGRsZF9wcmVsb2FkZWRfc3ltYm9scywgLTEgaWYgdW5zb3J0ZWQuICovCi1pbnQgZGxkX3ByZWxvYWRlZF9zeW1ib2xfY291bnQgPSAkY291bnQ7Ci0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgX19wdHJfdCBhZGRyZXNzOwotfQotZGxkX3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0gICAgICAgIHNlZCAncy9eXCguKlwpIFwoLipcKSQvICB7IlwxIiwgKF9fcHRyX3QpIFwmXDJ9LC8nIDwgIiRubGlzdCIgPj4gY29uZnRlc3QuYwotICAgICAgICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChfX3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotICAgICAgICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotICAgICAgICBtdiBjb25mdGVzdC5vIGNvbmZ0ZXN0bS5vCi0Jc2F2ZV9MSUJTPSIkTElCUyIKLQlzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgICAgICAgTElCUz0nY29uZnRlc3RtLm8nCi0JQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLSAgICAgICAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToxMDMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgICAgICAgICBwaXBlX3dvcmtzPXllcwotICAgICAgICBlbHNlCi0gICAgICAgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICAgICAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgICAgICAgZmkKLSAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKLSAgICAgIGVsc2UKLSAgICAgICAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNhbm5vdCBydW4gJGdsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gIGZpCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLSRybSBjb25mdGVzdCoKLQotIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotZWNobyAiJGFjX3QkcGlwZV93b3JrcyIgMT4mNgotdGVzdCAiJHBpcGVfd29ya3MiID0geWVzIHx8IGdsb2JhbF9zeW1ib2xfcGlwZT0KLQotIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRhY19jIiAxPiY2Ci1oYXJkY29kZV9hY3Rpb249Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm8gJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgIT0gbm87IHRoZW4KLQotICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCi0gICAgaGFyZGNvZGVfYWN0aW9uPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb249aW1tZWRpYXRlCi0gIGZpCi1lbGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHllcyAmJiBcCi0gICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgIT0geWVzOyB0aGVuCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLgotICBoYXJkY29kZV9hY3Rpb249dW5zdXBwb3J0ZWQKLWVsc2UKLSAgIyBXZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZyBkaXJlY3Rvcmllcy4KLSAgaGFyZGNvZGVfYWN0aW9uPXJlbGluawotZmkKLWVjaG8gIiRhY190JGhhcmRjb2RlX2FjdGlvbiIgMT4mNgotdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSB1bnN1cHBvcnRlZCAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLQotcmVsb2FkX2ZsYWc9Ci1yZWxvYWRfY21kcz0nJExEJHJlbG9hZF9mbGFnIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJExEIG9wdGlvbiB0byByZWxvYWQgb2JqZWN0IGZpbGVzLi4uICRhY19jIiAxPiY2Ci0jIFBPUlRNRSBTb21lIGxpbmtlciBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KLXJlbG9hZF9mbGFnPSctcicKLWVjaG8gIiRhY190JHJlbG9hZF9mbGFnIgotdGVzdCAtbiAiJHJlbG9hZF9mbGFnIiAmJiByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIKLQotIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcwotbGlicmFyeV9uYW1lc19zcGVjPQotbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKLXNvbmFtZV9zcGVjPQotcG9zdGluc3RhbGxfY21kcz0KLXBvc3R1bmluc3RhbGxfY21kcz0KLWZpbmlzaF9jbWRzPQotZmluaXNoX2V2YWw9Ci1zaGxpYnBhdGhfdmFyPQotdmVyc2lvbl90eXBlPW5vbmUKLWR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRhY19jIiAxPiY2Ci1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqIHwgYWl4NCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuYScKLSAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICi0KLSAgIyBBSVggaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKLSAgOzsKLQotYW1pZ2FvcyopCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCi0gICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCi0gIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIjsgKGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEpIHx8IGV4aXQgMTsgZG9uZScKLSAgOzsKLQotZnJlZWJzZDIqIHwgZnJlZWJzZDMqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvJwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXgnCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWhwdXg5KiB8IGhwdXgxMCopCi0gICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KLSAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCi0gIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbC4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNsLiRtYWpvciAkbGlibmFtZS5zbCcKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNsLiRtYWpvcicKLSAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCi0gIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJwotICA7OwotCi1pcml4NSogfCBpcml4NiopCi0gIHZlcnNpb25fdHlwZT1vc2YKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KLWxpbnV4LWdudW9sZGxkKiB8IGxpbnV4LWdudWFvdXQqIHwgbGludXgtZ251Y29mZiopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0KLSMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KLWxpbnV4LWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0KLSAgaWYgdGVzdCAtZiAvbGliL2xkLnNvLjE7IHRoZW4KLSAgICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICBlbHNlCi0gICAgIyBPbmx5IHRoZSBHTlUgbGQuc28gc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyBvbiBNa0xpbnV4LgotICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgICBwb3dlcnBjKikgZHluYW1pY19saW5rZXI9bm8gOzsKLSAgICAqKSBkeW5hbWljX2xpbmtlcj0nTGludXggbGQuc28nIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotCi1uZXRic2QqIHwgb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotb3MyKikKLSAgbGlibmFtZV9zcGVjPSckbmFtZScKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwgJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zbycKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotc2NvMy4ydjUqKQotICB2ZXJzaW9uX3R5cGU9b3NmCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXNvbGFyaXMyKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLXN1bm9zNCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotc3lzdjQuMnV3MiopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci1lc2FjCi1lY2hvICIkYWNfdCRkeW5hbWljX2xpbmtlciIKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMgUmVwb3J0IHRoZSBmaW5hbCBjb25zZXF1ZW5jZXMuCi1lY2hvICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGNhbl9idWlsZF9zaGFyZWQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2Ci10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzO1wkUkFOTElCIFwkbGliIgotICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKLSAgZmkKLSAgOzsKLWVzYWMKLQotZWNobyAiJGFjX3QkZW5hYmxlX3NoYXJlZCIgMT4mNgotCi0jIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcwotCi1lY2hvICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuLi4gJGVuYWJsZV9zdGF0aWMiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9iamRpci4uLiAkYWNfYyIgMT4mNgotcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIG9iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBvYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbAotZWNobyAiJGFjX3Qkb2JqZGlyIiAxPiY2Ci0KLSMgQ29weSBlY2hvIGFuZCBxdW90ZSB0aGUgY29weSwgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwsIGJlY2F1c2UgaXQgaXMKLSMgdXNlZCBsYXRlci4KLWx0ZWNobz0iJGVjaG8iCi0KLSMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMuCi1mb3IgdmFyIGluIGx0ZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBvbGRfQ1BQRkxBR1Mgb2xkX0xEIG9sZF9OTSBvbGRfUkFOTElCIFwKLSAgb2xkX0xOX1MgQVIgQ0MgTEQgTE5fUyBOTSByZWxvYWRfZmxhZyByZWxvYWRfY21kcyB3bCBwaWNfZmxhZyBcCi0gIGxpbmtfc3RhdGljX2ZsYWcgbm9fYnVpbHRpbl9mbGFnIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCi0gIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgUkFOTElCIFwKLSAgb2xkX2FyY2hpdmVfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIG9sZF9wb3N0aW5zdGFsbF9jbWRzIFwKLSAgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBhcmNoaXZlX2NtZHMgcG9zdGluc3RhbGxfY21kcyBwb3N0dW5pbnN0YWxsX2NtZHMgXAotICBhbGxvd191bmRlZmluZWRfZmxhZyBub191bmRlZmluZWRfZmxhZyBcCi0gIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIGdsb2JhbF9zeW1ib2xfcGlwZSBcCi0gIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcjsgZG8KLQotICBjYXNlICIkdmFyIiBpbgotICByZWxvYWRfY21kcyB8IG9sZF9hcmNoaXZlX2NtZHMgfCBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIHwgXAotICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBhcmNoaXZlX2NtZHMgfCBcCi0gIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBmaW5pc2hfY21kcykKLSAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCi0gICAgZXZhbCAiJHZhcj1cYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGAiCi0gICAgOzsKLSAgKikKLSAgICBldmFsICIkdmFyPVxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgIgotICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotb2ZpbGU9bGlidG9vbAotdHJhcCAiJHJtICRvZmlsZTsgZXhpdCAxIiAxIDIgMTUKLWVjaG8gY3JlYXRpbmcgJG9maWxlCi0kcm0gJG9maWxlCi1jYXQgPDxFT0YgPiAkb2ZpbGUKLSMhIC9iaW4vc2gKLQotIyBsaWJ0b29sIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OCi0jIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0Y29uZmlnIG9yIGx0bWFpbi5zaC4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgVGhpcyBwcm9ncmFtIHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyBDQz0iJG9sZF9DQyIgQ0ZMQUdTPSIkb2xkX0NGTEFHUyIgQ1BQRkxBR1M9IiRvbGRfQ1BQRkxBR1MiIFxcCi0jIExEPSIkb2xkX0xEIiBOTT0iJG9sZF9OTSIgUkFOTElCPSIkb2xkX1JBTkxJQiIgTE5fUz0iJG9sZF9MTl9TIiBcXAotIyAgICQwJGx0Y29uZmlnX2FyZ3MKLSMKLSMgQ29tcGlsZXIgYW5kIG90aGVyIHRlc3Qgb3V0cHV0IHByb2R1Y2VkIGJ5ICRwcm9nbmFtZSwgdXNlZnVsIGZvcgotIyBkZWJ1Z2dpbmcgJHByb2duYW1lLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi0jIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgotWHNlZD0ic2VkIC1lIHMvXlgvLyIKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIlwke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi0jIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KLWVjaG89IiRsdGVjaG8iCi0KLSMgVGhlIHZlcnNpb24gb2YgJHByb2duYW1lIHRoYXQgZ2VuZXJhdGVkIHRoaXMgc2NyaXB0LgotTFRDT05GSUdfVkVSU0lPTj0iJFZFUlNJT04iCi0KLSMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLSMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgbGlidG9vbCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBvbGQtc3R5bGUgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSIkaG9zdF9hbGlhcyIKLWhvc3Q9IiRob3N0IgotCi0jIFRoZSBhcmNoaXZlci4KLUFSPSIkQVIiCi0KLSMgVGhlIGRlZmF1bHQgQyBjb21waWxlci4KLUNDPSIkQ0MiCi0KLSMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KLUxEPSIkTEQiCi0KLSMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KLUxOX1M9IiRMTl9TIgotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSIkTk0iCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgotb2JqZGlyPSIkb2JqZGlyIgotCi0jIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCi1yZWxvYWRfZmxhZz0iJHJlbG9hZF9mbGFnIgotcmVsb2FkX2NtZHM9IiRyZWxvYWRfY21kcyIKLQotIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgotd2w9IiR3bCIKLQotIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCi1waWNfZmxhZz0iJHBpY19mbGFnIgotCi0jIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCi1saW5rX3N0YXRpY19mbGFnPSIkbGlua19zdGF0aWNfZmxhZyIKLQotIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgotbm9fYnVpbHRpbl9mbGFnPSIkbm9fYnVpbHRpbl9mbGFnIgotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9IiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWMiCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSIkbGlibmFtZV9zcGVjIgotCi0jIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCi0jIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCi1saWJyYXJ5X25hbWVzX3NwZWM9IiRsaWJyYXJ5X25hbWVzX3NwZWMiCi0KLSMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCi1zb25hbWVfc3BlYz0iJHNvbmFtZV9zcGVjIgotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9IiRSQU5MSUIiCi1vbGRfYXJjaGl2ZV9jbWRzPSIkb2xkX2FyY2hpdmVfY21kcyIKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSIkb2xkX3Bvc3R1bmluc3RhbGxfY21kcyIKLQotIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgotb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0iJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgotYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzIgotcG9zdGluc3RhbGxfY21kcz0iJHBvc3RpbnN0YWxsX2NtZHMiCi1wb3N0dW5pbnN0YWxsX2NtZHM9IiRwb3N0dW5pbnN0YWxsX2NtZHMiCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0iJGFsbG93X3VuZGVmaW5lZF9mbGFnIgotCi0jIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCi1ub191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgotCi0jIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KLWZpbmlzaF9jbWRzPSIkZmluaXNoX2NtZHMiCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSIkZmluaXNoX2V2YWwiCi0KLSMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KLWdsb2JhbF9zeW1ib2xfcGlwZT0iJGdsb2JhbF9zeW1ib2xfcGlwZSIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgotaGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb24KLQotIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCi0jIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCi1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9IiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIgotCi0jIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQotIyByZXN1bHRpbmcgYmluYXJ5LgotaGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bwotIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKLQotRU9GCi0KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4MyopCi0gIGNhdCA8PFxFT0YgPj4gJG9maWxlCi0jIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcwotIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgotaWYgdGVzdCAiJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IHNldDsgdGhlbgotICBDT0xMRUNUX05BTUVTPQotICBleHBvcnQgQ09MTEVDVF9OQU1FUwotZmkKLQotRU9GCi0gIDs7Ci1lc2FjCi0KLSMgQXBwZW5kIHRoZSBsdG1haW4uc2ggc2NyaXB0LgotY2F0ICIkbHRtYWluIiA+PiAkb2ZpbGUgfHwgKHJtIC1mICRvZmlsZTsgZXhpdCAxKQotCi1jaG1vZCAreCAkb2ZpbGUKLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9sdG1haW4uc2ggYi9sdG1haW4uc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBlOTM1MGIzLi5iMzZjNGFkCi0tLSBhL2x0bWFpbi5zaAorKysgYi9sdG1haW4uc2gKQEAgLTEsMjQwICsxLDEyNDAgQEAKLSMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGx0Y29uZmlnLgotIwotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIEdlbmVyYXRlZCBmcm9tIGx0bWFpbi5tNHNoLgorCisjIGx0bWFpbi5zaCAoR05VIGxpYnRvb2wpIDIuMi42CisjIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCisjIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgaWYgeW91IGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIG9yIGxpYnJhcnkgdGhhdAorIyBpcyBidWlsdCB1c2luZyBHTlUgTGlidG9vbCwgeW91IG1heSBpbmNsdWRlIHRoaXMgZmlsZSB1bmRlciB0aGUKKyMgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisjCisjIEdOVSBMaWJ0b29sIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICMKICMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMgYWxvbmcgd2l0aCBHTlUgTGlidG9vbDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIGEgY29weQorIyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbCwKKyMgb3Igb2J0YWluZWQgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworIyBVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KICMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIyBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMKKyMgICAgIC0tY29uZmlnICAgICAgICAgICAgIHNob3cgYWxsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzCisjICAgICAtLWRlYnVnICAgICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCisjIC1uLCAtLWRyeS1ydW4gICAgICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcworIyAgICAgLS1mZWF0dXJlcyAgICAgICAgICAgZGlzcGxheSBiYXNpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisjICAgICAtLW1vZGU9TU9ERSAgICAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERQorIyAgICAgLS1wcmVzZXJ2ZS1kdXAtZGVwcyAgZG9uJ3QgcmVtb3ZlIGR1cGxpY2F0ZSBkZXBlbmRlbmN5IGxpYnJhcmllcworIyAgICAgLS1xdWlldCwgLS1zaWxlbnQgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworIyAgICAgLS10YWc9VEFHICAgICAgICAgICAgdXNlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZyb20gdGFnIFRBRworIyAtdiwgLS12ZXJib3NlICAgICAgICAgICAgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAoZGVmYXVsdCkKKyMgICAgIC0tdmVyc2lvbiAgICAgICAgICAgIHByaW50IHZlcnNpb24gaW5mb3JtYXRpb24KKyMgLWgsIC0taGVscCAgICAgICAgICAgICAgIHByaW50IHNob3J0IG9yIGxvbmcgaGVscCBtZXNzYWdlCisjCisjIE1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyMKKyMgICAgICAgY2xlYW4gICAgICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKKyMgICAgICAgY29tcGlsZSAgICAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyMgICAgICAgZXhlY3V0ZSAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtCisjICAgICAgIGZpbmlzaCAgICAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisjICAgICAgIGluc3RhbGwgICAgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworIyAgICAgICBsaW5rICAgICAgICAgICAgICAgY3JlYXRlIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlCisjICAgICAgIHVuaW5zdGFsbCAgICAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorIworIyBNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuCisjIFRyeSBgJHByb2duYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLgorIworIyBXaGVuIHJlcG9ydGluZyBhIGJ1ZywgcGxlYXNlIGRlc2NyaWJlIGEgdGVzdCBjYXNlIHRvIHJlcHJvZHVjZSBpdCBhbmQKKyMgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgorIworIyAgICAgICBob3N0LXRyaXBsZXQ6CSRob3N0CisjICAgICAgIHNoZWxsOgkJJFNIRUxMCisjICAgICAgIGNvbXBpbGVyOgkJJExUQ0MKKyMgICAgICAgY29tcGlsZXIgZmxhZ3M6CQkkTFRDRkxBR1MKKyMgICAgICAgbGlua2VyOgkJJExEIChnbnU/ICR3aXRoX2dudV9sZCkKKyMgICAgICAgJHByb2duYW1lOgkJKEdOVSBsaWJ0b29sKSAyLjIuNgorIyAgICAgICBhdXRvbWFrZToJCSRhdXRvbWFrZV92ZXJzaW9uCisjICAgICAgIGF1dG9jb25mOgkJJGF1dG9jb25mX3ZlcnNpb24KKyMKKyMgUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LgogCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCi1tb2RlbmFtZT0iJHByb2duYW1lIgotCi0jIENvbnN0YW50cy4KIFBST0dSQU09bHRtYWluLnNoCiBQQUNLQUdFPWxpYnRvb2wKLVZFUlNJT049MS4yCitWRVJTSU9OPTIuMi42CitUSU1FU1RBTVA9IiIKK3BhY2thZ2VfcmV2aXNpb249MS4zMDEyCiAKLWRlZmF1bHRfbW9kZT0KLWhlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLW1hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKLW1rZGlyPSJta2RpciIKLW12PSJtdiAtZiIKLXJtPSJybSAtZiIKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCiAKLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcYFxcIiRcXFxcXVwpL1xcXDEvZycKLQotIyBOTFMgbnVpc2FuY2VzLgorIyBOTFMgbnVpc2FuY2VzOiBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KICMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCiAjIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAogIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLQotaWYgdGVzdCAiJExUQ09ORklHX1ZFUlNJT04iICE9ICIkVkVSU0lPTiI7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBsdGNvbmZpZyB2ZXJzaW9uIFxgJExUQ09ORklHX1ZFUlNJT04nIGRvZXMgbm90IG1hdGNoICRQUk9HUkFNIHZlcnNpb24gXGAkVkVSU0lPTiciIDE+JjIKLSAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KLSAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBHbG9iYWwgdmFyaWFibGVzLgotbW9kZT0kZGVmYXVsdF9tb2RlCi1ub25vcHQ9Ci1wcmV2PQotcHJldm9wdD0KLXJ1bj0KLXNob3c9IiRlY2hvIgotc2hvd19oZWxwPQotZXhlY3V0ZV9kbGZpbGVzPQotCi0jIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgotd2hpbGUgdGVzdCAkIyAtZ3QgMAorbHRfdXNlcl9sb2NhbGU9CitsdF9zYWZlX2xvY2FsZT0KK2ZvciBsdF92YXIgaW4gTEFORyBMQU5HVUFHRSBMQ19BTEwgTENfQ1RZUEUgTENfQ09MTEFURSBMQ19NRVNTQUdFUwogZG8KLSAgYXJnPSIkMSIKLSAgc2hpZnQKLQotICBjYXNlICIkYXJnIiBpbgotICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIG9wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICBjYXNlICIkcHJldiIgaW4KLSAgICBleGVjdXRlX2RsZmlsZXMpCi0gICAgICBldmFsICIkcHJldj1cIlwkJHByZXYgXCRhcmdcIiIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBwcmV2PQotICAgIHByZXZvcHQ9Ci0gICAgY29udGludWUKLSAgZmkKLQotICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/Ci0gIGNhc2UgIiRhcmciIGluCi0gIC0taGVscCkKLSAgICBzaG93X2hlbHA9eWVzCi0gICAgOzsKLQotICAtLXZlcnNpb24pCi0gICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04iCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWRyeS1ydW4gfCAtbikKLSAgICBydW49OgotICAgIDs7Ci0KLSAgLS1mZWF0dXJlcykKLSAgICBlY2hvICJob3N0OiAkaG9zdCIKLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCi0gICAgZWxzZQotICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGZpCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OwotCi0gIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKLSAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7Ci0KLSAgLS1xdWlldCB8IC0tc2lsZW50KQotICAgIHNob3c9OgotICAgIDs7Ci0KLSAgLWRsb3BlbikKLSAgICBwcmV2b3B0PSItZGxvcGVuIgotICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCi0gICAgOzsKLQotICAtKikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgbm9ub3B0PSIkYXJnIgotICAgIGJyZWFrCi0gICAgOzsKLSAgZXNhYworICBldmFsICJpZiB0ZXN0IFwiXCR7JGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICBzYXZlXyRsdF92YXI9XCQkbHRfdmFyCisgICAgICAgICAgJGx0X3Zhcj1DCisJICBleHBvcnQgJGx0X3ZhcgorCSAgbHRfdXNlcl9sb2NhbGU9XCIkbHRfdmFyPVxcXCRzYXZlX1wkbHRfdmFyOyBcJGx0X3VzZXJfbG9jYWxlXCIKKwkgIGx0X3NhZmVfbG9jYWxlPVwiJGx0X3Zhcj1DOyBcJGx0X3NhZmVfbG9jYWxlXCIKKwlmaSIKIGRvbmUKIAotaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCiskbHRfdW5zZXQgQ0RQQVRICisKKworCisKKworOiAke0NQPSJjcCAtZiJ9Cis6ICR7RUNITz0iZWNobyJ9Cis6ICR7RUdSRVA9Ii91c3IvYmluL2dyZXAgLUUifQorOiAke0ZHUkVQPSIvdXNyL2Jpbi9ncmVwIC1GIn0KKzogJHtHUkVQPSIvdXNyL2Jpbi9ncmVwIn0KKzogJHtMTl9TPSJsbiAtcyJ9Cis6ICR7TUFLRT0ibWFrZSJ9Cis6ICR7TUtESVI9Im1rZGlyIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9Cis6ICR7U0VEPSIvb3B0L2xvY2FsL2Jpbi9nc2VkIn0KKzogJHtTSEVMTD0iJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0ifQorOiAke1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyJ9CisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK0VYSVRfU1VDQ0VTUz0wCitFWElUX0ZBSUxVUkU9MQorRVhJVF9NSVNNQVRDSD02MyAgIyAkPyA9IDYzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmVyc2lvbiBtaXNtYXRjaCB0byBtaXNzaW5nLgorRVhJVF9TS0lQPTc3CSAgIyAkPyA9IDc3IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBza2lwcGVkIHRlc3QgdG8gYXV0b21ha2UuCisKK2V4aXRfc3RhdHVzPSRFWElUX1NVQ0NFU1MKKworIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKK2x0X25sPScKKycKK0lGUz0iIAkkbHRfbmwiCisKK2Rpcm5hbWU9InMsL1teL10qJCwsIgorYmFzZW5hbWU9InMsXi4qLywsIgorCisjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIHBlcmZvcm0gZnVuY19iYXNlbmFtZSBhbmQgZnVuY19kaXJuYW1lIGluIGEgc2luZ2xlIGZ1bmN0aW9uCisjIGNhbGw6CisjICAgZGlybmFtZTogIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LAorIyAgICAgICAgICAgICBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsIG90aGVyd2lzZSBzZXQgcmVzdWx0CisjICAgICAgICAgICAgIHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorIyAgIGJhc2VuYW1lOiBDb21wdXRlIGZpbGVuYW1lIG9mIEZJTEUuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVuZWQgaW4gIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyMgSW1wbGVtZW50YXRpb24gbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIGZ1bmNfZGlybmFtZQorIyBhbmQgZnVuY19iYXNlbmFtZS4gRm9yIGVmZmljaWVuY3ksIHdlIGRvIG5vdCBkZWxlZ2F0ZSB0bworIyB0aG9zZSBmdW5jdGlvbnMgYnV0IGluc3RlYWQgZHVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IGhlcmUuCitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpCit7CisgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGRpcm5hbWUiYAorICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCisgIGVsc2UKKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgIGZpCisgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCit9CisKKyMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlLgorCisjIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKKyMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCisjIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAorIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCisjIGZ1bmN0aW9uLgorcHJvZ3BhdGg9IiQwIgorCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKKyMgSW4gdGhlIHVubGlrZWx5IGV2ZW50ICRwcm9nbmFtZSBiZWdhbiB3aXRoIGEgJy0nLCBpdCB3b3VsZCBwbGF5IGhhdm9jIHdpdGgKKyMgZnVuY19lY2hvIChpbWFnaW5lIHByb2duYW1lPS1uKSwgc28gd2UgcHJlcGVuZCAuLyBpbiB0aGF0IGNhc2U6CitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkcHJvZ3BhdGgiCitwcm9nbmFtZT0kZnVuY19iYXNlbmFtZV9yZXN1bHQKK2Nhc2UgJHByb2duYW1lIGluCisgIC0qKSBwcm9nbmFtZT0uLyRwcm9nbmFtZSA7OworZXNhYworCisjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggZm9yIHJlZXhlY3V0aW9uOgorY2FzZSAkcHJvZ3BhdGggaW4KKyAgW1xcL10qfFtBLVphLXpdOlxcKikgOzsKKyAgKltcXC9dKikKKyAgICAgcHJvZ2Rpcj0kZnVuY19kaXJuYW1lX3Jlc3VsdAorICAgICBwcm9nZGlyPWBjZCAiJHByb2dkaXIiICYmIHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKKyAgKikKKyAgICAgc2F2ZV9JRlM9IiRJRlMiCisgICAgIElGUz06CisgICAgIGZvciBwcm9nZGlyIGluICRQQVRIOyBkbworICAgICAgIElGUz0iJHNhdmVfSUZTIgorICAgICAgIHRlc3QgLXggIiRwcm9nZGlyLyRwcm9nbmFtZSIgJiYgYnJlYWsKKyAgICAgZG9uZQorICAgICBJRlM9IiRzYXZlX0lGUyIKKyAgICAgdGVzdCAtbiAiJHByb2dkaXIiIHx8IHByb2dkaXI9YHB3ZGAKKyAgICAgcHJvZ3BhdGg9IiRwcm9nZGlyLyRwcm9nbmFtZSIKKyAgICAgOzsKK2VzYWMKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbYCIkXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFsiYFxcXVwpL1xcXDEvZycKKworIyBSZS1gXCcgcGFyYW1ldGVyIGV4cGFuc2lvbnMgaW4gb3V0cHV0IG9mIGRvdWJsZV9xdW90ZV9zdWJzdCB0aGF0IHdlcmUKKyMgYFwnLWVkIGluIGlucHV0IHRvIHRoZSBzYW1lLiAgSWYgYW4gb2RkIG51bWJlciBvZiBgXCcgcHJlY2VkZWQgYSAnJCcKKyMgaW4gaW5wdXQgdG8gZG91YmxlX3F1b3RlX3N1YnN0LCB0aGF0ICckJyB3YXMgcHJvdGVjdGVkIGZyb20gZXhwYW5zaW9uLgorIyBTaW5jZSBlYWNoIGlucHV0IGBcJyBpcyBub3cgdHdvIGBcJ3MsIGxvb2sgZm9yIGFueSBudW1iZXIgb2YgcnVucyBvZgorIyBmb3VyIGBcJ3MgZm9sbG93ZWQgYnkgdHdvIGBcJ3MgYW5kIHRoZW4gYSAnJCcuICBgXCcgdGhhdCAnJCcuCiticz0nXFwnCiticzI9J1xcXFwnCiticzQ9J1xcXFxcXFxcJworZG9sbGFyPSdcJCcKK3NlZF9kb3VibGVfYmFja3NsYXNoPSJcCisgIHMvJGJzNC8mXFwKKy9nCisgIHMvXiRiczIkZG9sbGFyLyRicyYvCisgIHMvXFwoW14kYnNdXFwpJGJzMiRkb2xsYXIvXFwxJGJzMiRicyRkb2xsYXIvZworICBzL1xuLy9nIgorCisjIFN0YW5kYXJkIG9wdGlvbnM6CitvcHRfZHJ5X3J1bj1mYWxzZQorb3B0X2hlbHA9ZmFsc2UKK29wdF9xdWlldD1mYWxzZQorb3B0X3ZlcmJvc2U9ZmFsc2UKK29wdF93YXJuaW5nPToKKworIyBmdW5jX2VjaG8gYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UsIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgbW9kZQorIyBuYW1lIGlmIGl0IGhhcyBiZWVuIHNldCB5ZXQuCitmdW5jX2VjaG8gKCkKK3sKKyAgICAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiAkKiIKK30KKworIyBmdW5jX3ZlcmJvc2UgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgaW4gdmVyYm9zZSBtb2RlIG9ubHkuCitmdW5jX3ZlcmJvc2UgKCkKK3sKKyAgICAkb3B0X3ZlcmJvc2UgJiYgZnVuY19lY2hvICR7MSsiJEAifQorCisgICAgIyBBIGJ1ZyBpbiBiYXNoIGhhbHRzIHRoZSBzY3JpcHQgaWYgdGhlIGxhc3QgbGluZSBvZiBhIGZ1bmN0aW9uCisgICAgIyBmYWlscyB3aGVuIHNldCAtZSBpcyBpbiBmb3JjZSwgc28gd2UgbmVlZCBhbm90aGVyIGNvbW1hbmQgdG8KKyAgICAjIHdvcmsgYXJvdW5kIHRoYXQ6CisgICAgOgorfQorCisjIGZ1bmNfZXJyb3IgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCitmdW5jX2Vycm9yICgpCit7CisgICAgJEVDSE8gIiRwcm9nbmFtZSR7bW9kZSs6IH0kbW9kZTogIiR7MSsiJEAifSAxPiYyCit9CisKKyMgZnVuY193YXJuaW5nIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IuCitmdW5jX3dhcm5pbmcgKCkKK3sKKyAgICAkb3B0X3dhcm5pbmcgJiYgJEVDSE8gIiRwcm9nbmFtZSR7bW9kZSs6IH0kbW9kZTogd2FybmluZzogIiR7MSsiJEAifSAxPiYyCisKKyAgICAjIGJhc2ggYnVnIGFnYWluOgorICAgIDoKK30KKworIyBmdW5jX2ZhdGFsX2Vycm9yIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBhbmQgZXhpdC4KK2Z1bmNfZmF0YWxfZXJyb3IgKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorfQorCisjIGZ1bmNfZmF0YWxfaGVscCBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKKyMgYSBoZWxwIGhpbnQsIGFuZCBleGl0LgorZnVuY19mYXRhbF9oZWxwICgpCit7CisgICAgZnVuY19lcnJvciAkezErIiRAIn0KKyAgICBmdW5jX2ZhdGFsX2Vycm9yICIkaGVscCIKK30KK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgICMjIGRlZmF1bHQKKworCisjIGZ1bmNfZ3JlcCBleHByZXNzaW9uIGZpbGVuYW1lCisjIENoZWNrIHdoZXRoZXIgRVhQUkVTU0lPTiBtYXRjaGVzIGFueSBsaW5lIG9mIEZJTEVOQU1FLCB3aXRob3V0IG91dHB1dC4KK2Z1bmNfZ3JlcCAoKQoreworICAgICRHUkVQICIkMSIgIiQyIiA+L2Rldi9udWxsIDI+JjEKK30KKworCisjIGZ1bmNfbWtkaXJfcCBkaXJlY3RvcnktcGF0aAorIyBNYWtlIHN1cmUgdGhlIGVudGlyZSBwYXRoIHRvIERJUkVDVE9SWS1QQVRIIGlzIGF2YWlsYWJsZS4KK2Z1bmNfbWtkaXJfcCAoKQoreworICAgIG15X2RpcmVjdG9yeV9wYXRoPSIkMSIKKyAgICBteV9kaXJfbGlzdD0KKworICAgIGlmIHRlc3QgLW4gIiRteV9kaXJlY3RvcnlfcGF0aCIgJiYgdGVzdCAiJG9wdF9kcnlfcnVuIiAhPSAiOiI7IHRoZW4KKworICAgICAgIyBQcm90ZWN0IGRpcmVjdG9yeSBuYW1lcyBzdGFydGluZyB3aXRoIGAtJworICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4KKyAgICAgICAgLSopIG15X2RpcmVjdG9yeV9wYXRoPSIuLyRteV9kaXJlY3RvcnlfcGF0aCIgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBXaGlsZSBzb21lIHBvcnRpb24gb2YgRElSIGRvZXMgbm90IHlldCBleGlzdC4uLgorICAgICAgd2hpbGUgdGVzdCAhIC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiOyBkbworICAgICAgICAjIC4uLm1ha2UgYSBsaXN0IGluIHRvcG1vc3QgZmlyc3Qgb3JkZXIuICBVc2UgYSBjb2xvbiBkZWxpbWl0ZWQKKwkjIGxpc3QgaW5jYXNlIHNvbWUgcG9ydGlvbiBvZiBwYXRoIGNvbnRhaW5zIHdoaXRlc3BhY2UuCisgICAgICAgIG15X2Rpcl9saXN0PSIkbXlfZGlyZWN0b3J5X3BhdGg6JG15X2Rpcl9saXN0IgorCisgICAgICAgICMgSWYgdGhlIGxhc3QgcG9ydGlvbiBhZGRlZCBoYXMgbm8gc2xhc2ggaW4gaXQsIHRoZSBsaXN0IGlzIGRvbmUKKyAgICAgICAgY2FzZSAkbXlfZGlyZWN0b3J5X3BhdGggaW4gKi8qKSA7OyAqKSBicmVhayA7OyBlc2FjCisKKyAgICAgICAgIyAuLi5vdGhlcndpc2UgdGhyb3cgYXdheSB0aGUgY2hpbGQgZGlyZWN0b3J5IGFuZCBsb29wCisgICAgICAgIG15X2RpcmVjdG9yeV9wYXRoPWAkRUNITyAiWCRteV9kaXJlY3RvcnlfcGF0aCIgfCAkWHNlZCAtZSAiJGRpcm5hbWUiYAorICAgICAgZG9uZQorICAgICAgbXlfZGlyX2xpc3Q9YCRFQ0hPICJYJG15X2Rpcl9saXN0IiB8ICRYc2VkIC1lICdzLDoqJCwsJ2AKKworICAgICAgc2F2ZV9ta2Rpcl9wX0lGUz0iJElGUyI7IElGUz0nOicKKyAgICAgIGZvciBteV9kaXIgaW4gJG15X2Rpcl9saXN0OyBkbworCUlGUz0iJHNhdmVfbWtkaXJfcF9JRlMiCisgICAgICAgICMgbWtkaXIgY2FuIGZhaWwgd2l0aCBhIGBGaWxlIGV4aXN0JyBlcnJvciBpZiB0d28gcHJvY2Vzc2VzCisgICAgICAgICMgdHJ5IHRvIGNyZWF0ZSBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIGNvbmN1cnJlbnRseS4gIERvbid0CisgICAgICAgICMgc3RvcCBpbiB0aGF0IGNhc2UhCisgICAgICAgICRNS0RJUiAiJG15X2RpciIgMj4vZGV2L251bGwgfHwgOgorICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9ta2Rpcl9wX0lGUyIKKworICAgICAgIyBCYWlsIG91dCBpZiB3ZSAob3Igc29tZSBvdGhlciBwcm9jZXNzKSBmYWlsZWQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgorICAgICAgdGVzdCAtZCAiJG15X2RpcmVjdG9yeV9wYXRoIiB8fCBcCisgICAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgIkZhaWxlZCB0byBjcmVhdGUgXGAkMSciCisgICAgZmkKK30KKworCisjIGZ1bmNfbWt0ZW1wZGlyIFtzdHJpbmddCisjIE1ha2UgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd29uJ3QgY2xhc2ggd2l0aCBvdGhlciBydW5uaW5nCisjIGxpYnRvb2wgcHJvY2Vzc2VzLCBhbmQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucyBpZiBwb3NzaWJsZS4gIElmCisjIGdpdmVuLCBTVFJJTkcgaXMgdGhlIGJhc2VuYW1lIGZvciB0aGF0IGRpcmVjdG9yeS4KK2Z1bmNfbWt0ZW1wZGlyICgpCit7CisgICAgbXlfdGVtcGxhdGU9IiR7VE1QRElSLS90bXB9LyR7MS0kcHJvZ25hbWV9IgorCisgICAgaWYgdGVzdCAiJG9wdF9kcnlfcnVuIiA9ICI6IjsgdGhlbgorICAgICAgIyBSZXR1cm4gYSBkaXJlY3RvcnkgbmFtZSwgYnV0IGRvbid0IGNyZWF0ZSBpdCBpbiBkcnktcnVuIG1vZGUKKyAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJCQiCisgICAgZWxzZQorCisgICAgICAjIElmIG1rdGVtcCB3b3JrcywgdXNlIHRoYXQgZmlyc3QgYW5kIGZvcmVtb3N0CisgICAgICBteV90bXBkaXI9YG1rdGVtcCAtZCAiJHtteV90ZW1wbGF0ZX0tWFhYWFhYWFgiIDI+L2Rldi9udWxsYAorCisgICAgICBpZiB0ZXN0ICEgLWQgIiRteV90bXBkaXIiOyB0aGVuCisgICAgICAgICMgRmFpbGluZyB0aGF0LCBhdCBsZWFzdCB0cnkgYW5kIHVzZSAkUkFORE9NIHRvIGF2b2lkIGEgcmFjZQorICAgICAgICBteV90bXBkaXI9IiR7bXlfdGVtcGxhdGV9LSR7UkFORE9NLTB9JCQiCisKKyAgICAgICAgc2F2ZV9ta3RlbXBkaXJfdW1hc2s9YHVtYXNrYAorICAgICAgICB1bWFzayAwMDc3CisgICAgICAgICRNS0RJUiAiJG15X3RtcGRpciIKKyAgICAgICAgdW1hc2sgJHNhdmVfbWt0ZW1wZGlyX3VtYXNrCisgICAgICBmaQorCisgICAgICAjIElmIHdlJ3JlIG5vdCBpbiBkcnktcnVuIG1vZGUsIGJvbWIgb3V0IG9uIGZhaWx1cmUKKyAgICAgIHRlc3QgLWQgIiRteV90bXBkaXIiIHx8IFwKKyAgICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IFxgJG15X3RtcGRpciciCisgICAgZmkKKworICAgICRFQ0hPICJYJG15X3RtcGRpciIgfCAkWHNlZAorfQorCisKKyMgZnVuY19xdW90ZV9mb3JfZXZhbCBhcmcKKyMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyLgorIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHdvIHZhbHVlczogRlVOQ19RVU9URV9GT1JfRVZBTF9SRVNVTFQKKyMgaXMgZG91YmxlLXF1b3RlZCwgc3VpdGFibGUgZm9yIGEgc3Vic2VxdWVudCBldmFsLCB3aGVyZWFzCisjIEZVTkNfUVVPVEVfRk9SX0VWQUxfVU5RVU9URURfUkVTVUxUIGhhcyBtZXJlbHkgYWxsIGNoYXJhY3RlcnMKKyMgd2hpY2ggYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlIHF1b3RlcyBiYWNrc2xhc2hpZmllZC4KK2Z1bmNfcXVvdGVfZm9yX2V2YWwgKCkKK3sKKyAgICBjYXNlICQxIGluCisgICAgICAqW1xcXGBcIlwkXSopCisJZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9YCRFQ0hPICJYJDEiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYCA7OworICAgICAgKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQ9IiQxIiA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IGluCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gZGVsYXkKKyAgICAgICMgd29yZCBzcGxpdHRpbmcsIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGFuZCBhbmQgdmFyaWFibGUKKyAgICAgICMgZXhwYW5zaW9uIGZvciBhIHN1YnNlcXVlbnQgZXZhbC4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisgICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0PSJcIiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdFwiIgorICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdCIKKyAgICBlc2FjCit9CisKKworIyBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgYXJnCisjIEFlc3RoZXRpY2FsbHkgcXVvdGUgQVJHIHRvIGJlIGV2YWxlZCBsYXRlcjsgc2FtZSBhcyBhYm92ZSwKKyMgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZnVuY19xdW90ZV9mb3JfZXhwYW5kICgpCit7CisgICAgY2FzZSAkMSBpbgorICAgICAgKltcXFxgXCJdKikKKwlteV9hcmc9YCRFQ0hPICJYJDEiIHwgJFhzZWQgXAorCSAgICAtZSAiJGRvdWJsZV9xdW90ZV9zdWJzdCIgLWUgIiRzZWRfZG91YmxlX2JhY2tzbGFzaCJgIDs7CisgICAgICAqKQorICAgICAgICBteV9hcmc9IiQxIiA7OworICAgIGVzYWMKKworICAgIGNhc2UgJG15X2FyZyBpbgorICAgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHRvIGRlbGF5CisgICAgICAjIHdvcmQgc3BsaXR0aW5nIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBmb3IgYSBzdWJzZXF1ZW50IGV2YWwuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgICBteV9hcmc9IlwiJG15X2FyZ1wiIgorICAgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQ9IiRteV9hcmciCit9CisKKworIyBmdW5jX3Nob3dfZXZhbCBjbWQgW2ZhaWxfZXhwXQorIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCisjIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAorIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4KK2Z1bmNfc2hvd19ldmFsICgpCit7CisgICAgbXlfY21kPSIkMSIKKyAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgorCisgICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7CisgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCisgICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisgICAgfQorCisgICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQorICAgICAgZXZhbCAiJG15X2NtZCIKKyAgICAgIG15X3N0YXR1cz0kPworICAgICAgaWYgdGVzdCAiJG15X3N0YXR1cyIgLWVxIDA7IHRoZW4gOjsgZWxzZQorCWV2YWwgIihleGl0ICRteV9zdGF0dXMpOyAkbXlfZmFpbF9leHAiCisgICAgICBmaQorICAgIGZpCit9CisKKworIyBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgY21kIFtmYWlsX2V4cF0KKyMgVW5sZXNzIG9wdF9zaWxlbnQgaXMgdHJ1ZSwgdGhlbiBvdXRwdXQgQ01ELiAgVGhlbiwgaWYgb3B0X2RyeXJ1biBpcworIyBub3QgdHJ1ZSwgZXZhbHVhdGUgQ01ELiAgSWYgdGhlIGV2YWx1YXRpb24gb2YgQ01EIGZhaWxzLCBhbmQgRkFJTF9FWFAKKyMgaXMgZ2l2ZW4sIHRoZW4gZXZhbHVhdGUgaXQuICBVc2UgdGhlIHNhdmVkIGxvY2FsZSBmb3IgZXZhbHVhdGlvbi4KK2Z1bmNfc2hvd19ldmFsX2xvY2FsZSAoKQoreworICAgIG15X2NtZD0iJDEiCisgICAgbXlfZmFpbF9leHA9IiR7Mi06fSIKKworICAgICR7b3B0X3NpbGVudC1mYWxzZX0gfHwgeworICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkbXlfY21kIgorICAgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorICAgIH0KKworICAgIGlmICR7b3B0X2RyeV9ydW4tZmFsc2V9OyB0aGVuIDo7IGVsc2UKKyAgICAgIGV2YWwgIiRsdF91c2VyX2xvY2FsZQorCSAgICAkbXlfY21kIgorICAgICAgbXlfc3RhdHVzPSQ/CisgICAgICBldmFsICIkbHRfc2FmZV9sb2NhbGUiCisgICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCisJZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKKyAgICAgIGZpCisgICAgZmkKK30KKworCisKKworCisjIGZ1bmNfdmVyc2lvbgorIyBFY2hvIHZlcnNpb24gbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCitmdW5jX3ZlcnNpb24gKCkKK3sKKyAgICAkU0VEIC1uICcvXiMgJyRQUk9HUkFNJyAoR05VIC8sLyMgd2FycmFudHk7IC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisgICAgICAgIHMvXCgoQylcKVsgMC05LC1dKlwoIFsxLTldWzAtOV0qXCkvXDFcMi8KKyAgICAgICAgcAorICAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgIGV4aXQgJD8KK30KKworIyBmdW5jX3VzYWdlCisjIEVjaG8gc2hvcnQgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfdXNhZ2UgKCkKK3sKKyAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvIyAtaC8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisJcy9cJHByb2duYW1lLyckcHJvZ25hbWUnLworCXAKKyAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgJEVDSE8KKyAgICAkRUNITyAicnVuIFxgJHByb2duYW1lIC0taGVscCB8IG1vcmUnIGZvciBmdWxsIHVzYWdlIgorICAgIGV4aXQgJD8KK30KKworIyBmdW5jX2hlbHAKKyMgRWNobyBsb25nIGhlbHAgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCitmdW5jX2hlbHAgKCkKK3sKKyAgICAkU0VEIC1uICcvXiMgVXNhZ2U6LywvIyBSZXBvcnQgYnVncyB0by8geworICAgICAgICBzL14jIC8vCisJcy9eIyAqJC8vCisJcypcJHByb2duYW1lKickcHJvZ25hbWUnKgorCXMqXCRob3N0KiciJGhvc3QiJyoKKwlzKlwkU0hFTEwqJyIkU0hFTEwiJyoKKwlzKlwkTFRDQyonIiRMVENDIicqCisJcypcJExUQ0ZMQUdTKiciJExUQ0ZMQUdTIicqCisJcypcJExEKiciJExEIicqCisJcy9cJHdpdGhfZ251X2xkLyciJHdpdGhfZ251X2xkIicvCisJcy9cJGF1dG9tYWtlX3ZlcnNpb24vJyJgKGF1dG9tYWtlIC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcy9cJGF1dG9jb25mX3ZlcnNpb24vJyJgKGF1dG9jb25mIC0tdmVyc2lvbikgMj4vZGV2L251bGwgfCRTRUQgMXFgIicvCisJcAorICAgICB9JyA8ICIkcHJvZ3BhdGgiCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfbWlzc2luZ19hcmcgYXJnbmFtZQorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yIGFuZCBzZXQgZ2xvYmFsCisjIGV4aXRfY21kLgorZnVuY19taXNzaW5nX2FyZyAoKQoreworICAgIGZ1bmNfZXJyb3IgIm1pc3NpbmcgYXJndW1lbnQgZm9yICQxIgorICAgIGV4aXRfY21kPWV4aXQKK30KKworZXhpdF9jbWQ9OgorCisKKworCisKKyMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkRUNITy4KK2lmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KKyAgIyBZaXBwZWUsICRFQ0hPIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJEVDSE8gd2lsbCB3b3JrLgorICBleGVjICRTSEVMTCAiJHByb2dwYXRoIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KIGZpCiAKLWlmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCitpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKKyQqCitFT0YKKyAgZXhpdCAkRVhJVF9TVUNDRVNTCitmaQogCi0gICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgotICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLSAgICBjYXNlICIkbm9ub3B0IiBpbgotICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyopCi0gICAgICBtb2RlPWxpbmsKLSAgICAgIGZvciBhcmcKLSAgICAgIGRvCi0gICAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAgIC1jKQotICAgICAgICAgICBtb2RlPWNvbXBpbGUKLSAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgZG9uZQorbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWFnaWNfZXhlPSIlJSVNQUdJQyBFWEUgdmFyaWFibGUlJSUiCisKKyMgR2xvYmFsIHZhcmlhYmxlcy4KKyMgJG1vZGUgaXMgdW5zZXQKK25vbm9wdD0KK2V4ZWN1dGVfZGxmaWxlcz0KK3ByZXNlcnZlX2FyZ3M9CitsbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCitvMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCitleHRyYWN0ZWRfYXJjaGl2ZXM9CitleHRyYWN0ZWRfc2VyaWFsPTAKKworb3B0X2RyeV9ydW49ZmFsc2UKK29wdF9kdXBsaWNhdGVfZGVwcz1mYWxzZQorb3B0X3NpbGVudD1mYWxzZQorb3B0X2RlYnVnPToKKworIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0CisjIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKKyMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KK2V4ZWNfY21kPQorCisjIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKKyMgYSBjb25maWd1cmF0aW9uIGZhaWx1cmUgaGludCwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGZ1bmNfZXJyb3IgIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgICAgZnVuY19mYXRhbF9lcnJvciAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4iCit9CisKKworIyBmdW5jX2NvbmZpZworIyBEaXNwbGF5IHRoZSBjb25maWd1cmF0aW9uIGZvciBhbGwgdGhlIHRhZ3MgaW4gdGhpcyBzY3JpcHQuCitmdW5jX2NvbmZpZyAoKQoreworICAgIHJlX2JlZ2luY2Y9J14jICMjIyBCRUdJTiBMSUJUT09MJworICAgIHJlX2VuZGNmPSdeIyAjIyMgRU5EIExJQlRPT0wnCisKKyAgICAjIERlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAkU0VEICIxLC8kcmVfYmVnaW5jZiBDT05GSUcvZDsvJHJlX2VuZGNmIENPTkZJRy8sXCRkIiA8ICIkcHJvZ3BhdGgiCisKKyAgICAjIE5vdyBwcmludCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0YWdzLgorICAgIGZvciB0YWduYW1lIGluICR0YWdsaXN0OyBkbworICAgICAgJFNFRCAtbiAiLyRyZV9iZWdpbmNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvLC8kcmVfZW5kY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC9wIiA8ICIkcHJvZ3BhdGgiCisgICAgZG9uZQorCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfZmVhdHVyZXMKKyMgRGlzcGxheSB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorZnVuY19mZWF0dXJlcyAoKQoreworICAgICRFQ0hPICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgJEVDSE8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgICRFQ0hPICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAkRUNITyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgJEVDSE8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfZW5hYmxlX3RhZyB0YWduYW1lCisjIFZlcmlmeSB0aGF0IFRBR05BTUUgaXMgdmFsaWQsIGFuZCBlaXRoZXIgZmxhZyBhbiBlcnJvciBhbmQgZXhpdCwgb3IKKyMgZW5hYmxlIHRoZSBUQUdOQU1FIHRhZy4gIFdlIGFsc28gYWRkIFRBR05BTUUgdG8gdGhlIGdsb2JhbCAkdGFnbGlzdAorIyB2YXJpYWJsZSBoZXJlLgorZnVuY19lbmFibGVfdGFnICgpCit7CisgICMgR2xvYmFsIHZhcmlhYmxlOgorICB0YWduYW1lPSIkMSIKKworICByZV9iZWdpbmNmPSJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgorICByZV9lbmRjZj0iXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHNlZF9leHRyYWN0Y2Y9Ii8kcmVfYmVnaW5jZi8sLyRyZV9lbmRjZi9wIgorCisgICMgVmFsaWRhdGUgdGFnbmFtZS4KKyAgY2FzZSAkdGFnbmFtZSBpbgorICAgICpbIS1fQS1aYS16MC05LC9dKikKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIgogICAgICAgOzsKLSAgICAqZGIgfCAqZGJ4KQotICAgICAgbW9kZT1leGVjdXRlCi0gICAgICA7OwotICAgICppbnN0YWxsKnxjcHxtdikKLSAgICAgIG1vZGU9aW5zdGFsbAotICAgICAgOzsKLSAgICAqcm0pCi0gICAgICBtb2RlPXVuaW5zdGFsbAotICAgICAgOzsKKyAgZXNhYworCisgICMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdyBpdCdzCisgICMgdGhlcmUgYnV0IG5vdCBzcGVjaWFsbHkgbWFya2VkLgorICBjYXNlICR0YWduYW1lIGluCisgICAgQ0MpIDs7CiAgICAgKikKLSAgICAgICMgSWYgd2UgaGF2ZSBubyBtb2RlLCBidXQgZGxmaWxlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBkbyBleGVjdXRlIG1vZGUuCi0gICAgICB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiBtb2RlPWV4ZWN1dGUKKyAgICAgIGlmICRHUkVQICIkcmVfYmVnaW5jZiIgIiRwcm9ncGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCiAKLSAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCi0gICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKLSAgICAgICAgZmkKKwkjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLiAgQmUgY2FyZWZ1bCB0byBxdW90ZSB0aGUgcGF0aAorCSMgYW5kIHRoZSBzZWQgc2NyaXB0LCB0byBhdm9pZCBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSwgYnV0CisJIyBhbHNvIGRvbid0IHVzZSBub24tcG9ydGFibGUgcXVvdGVzIHdpdGhpbiBiYWNrcXVvdGVzIHdpdGhpbgorCSMgcXVvdGVzIHdlIGhhdmUgdG8gZG8gaXQgaW4gMiBzdGVwczoKKwlleHRyYWN0ZWRjZj1gJFNFRCAtbiAtZSAiJHNlZF9leHRyYWN0Y2YiIDwgIiRwcm9ncGF0aCJgCisJZXZhbCAiJGV4dHJhY3RlZGNmIgorICAgICAgZWxzZQorCWZ1bmNfZXJyb3IgImlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIgogICAgICAgZmkKICAgICAgIDs7CisgIGVzYWMKK30KKworIyBQYXJzZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuICBUaGlzIGNvbWVzIGFzIHNvb24gYXMgcG9zc2libGUgaW4KKyMgdGhlIHNjcmlwdCB0byBtYWtlIHRoaW5ncyBsaWtlIGBsaWJ0b29sIC0tdmVyc2lvbicgaGFwcGVuIHF1aWNrbHkuCit7CisKKyAgIyBTaG9ydGhhbmQgZm9yIC0tbW9kZT1mb28sIG9ubHkgdmFsaWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50CisgIGNhc2UgJDEgaW4KKyAgY2xlYW58Y2xlYXxjbGV8Y2wpCisgICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY2xlYW4gJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIGNvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCisgICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY29tcGlsZSAkezErIiRAIn07IHNoaWZ0CisgICAgOzsKKyAgZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBleGVjdXRlICR7MSsiJEAifTsgc2hpZnQKKyAgICA7OworICBmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIGluc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCisgICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0CisgICAgOzsKKyAgbGlua3xsaW58bGl8bCkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBsaW5rICR7MSsiJEAifTsgc2hpZnQKKyAgICA7OworICB1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSB1bmluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIGVzYWMKKworICAjIFBhcnNlIG5vbi1tb2RlIHNwZWNpZmljIGFyZ3VtZW50czoKKyAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbworICAgIG9wdD0iJDEiCisgICAgc2hpZnQKKworICAgIGNhc2UgJG9wdCBpbgorICAgICAgLS1jb25maWcpCQlmdW5jX2NvbmZpZwkJCQkJOzsKKworICAgICAgLS1kZWJ1ZykJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQiCisJCQlmdW5jX2VjaG8gImVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCisJCQlvcHRfZGVidWc9J3NldCAteCcKKwkJCSRvcHRfZGVidWcKKwkJCTs7CisKKyAgICAgIC1kbG9wZW4pCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKKwkJCWV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkMSIKKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAtLWRyeS1ydW4gfCAtbikJb3B0X2RyeV9ydW49OgkJCQkJOzsKKyAgICAgIC0tZmVhdHVyZXMpICAgICAgIGZ1bmNfZmVhdHVyZXMJCQkJCTs7CisgICAgICAtLWZpbmlzaCkJCW1vZGU9ImZpbmlzaCIJCQkJCTs7CisKKyAgICAgIC0tbW9kZSkJCXRlc3QgIiQjIiAtZXEgMCAmJiBmdW5jX21pc3NpbmdfYXJnICIkb3B0IiAmJiBicmVhaworCQkJY2FzZSAkMSBpbgorCQkJICAjIFZhbGlkIG1vZGUgYXJndW1lbnRzOgorCQkJICBjbGVhbikJOzsKKwkJCSAgY29tcGlsZSkJOzsKKwkJCSAgZXhlY3V0ZSkJOzsKKwkJCSAgZmluaXNoKQk7OworCQkJICBpbnN0YWxsKQk7OworCQkJICBsaW5rKQkJOzsKKwkJCSAgcmVsaW5rKQk7OworCQkJICB1bmluc3RhbGwpCTs7CisKKwkJCSAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCisJCQkgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCisJCQkgICAgIGV4aXRfY21kPWV4aXQKKwkJCSAgICAgYnJlYWsKKwkJCSAgICAgOzsKKwkJICAgICAgICBlc2FjCisKKwkJCW1vZGU9IiQxIgorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMpCisJCQlvcHRfZHVwbGljYXRlX2RlcHM9OgkJCQk7OworCisgICAgICAtLXF1aWV0fC0tc2lsZW50KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgorCQkJb3B0X3NpbGVudD06CisJCQk7OworCisgICAgICAtLXZlcmJvc2V8IC12KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgorCQkJb3B0X3NpbGVudD1mYWxzZQorCQkJOzsKKworICAgICAgLS10YWcpCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKKwkJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQgJDEiCisJCQlmdW5jX2VuYWJsZV90YWcgIiQxIgkjIHRhZ25hbWUgaXMgc2V0IGhlcmUKKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG9wdGFyZ3MgdG8gbG9uZyBvcHRpb25zOgorICAgICAgLWRsb3Blbj0qfC0tbW9kZT0qfC0tdGFnPSopCisJCQlmdW5jX29wdF9zcGxpdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfb3B0X3NwbGl0X29wdCIgIiRmdW5jX29wdF9zcGxpdF9hcmciICR7MSsiJEAifQorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC1cP3wtaCkJCWZ1bmNfdXNhZ2UJCQkJCTs7CisgICAgICAtLWhlbHApCQlvcHRfaGVscD06CQkJCQk7OworICAgICAgLS12ZXJzaW9uKQlmdW5jX3ZlcnNpb24JCQkJCTs7CisKKyAgICAgIC0qKQkJZnVuY19mYXRhbF9oZWxwICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdCciCTs7CisKKyAgICAgICopCQlub25vcHQ9IiRvcHQiCisJCQlicmVhaworCQkJOzsKICAgICBlc2FjCisgIGRvbmUKKworCisgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiogfCAqY2VnY2MqKQorICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9OgorICAgICAgOzsKKyAgICAqKQorICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kb3B0X2R1cGxpY2F0ZV9kZXBzCisgICAgICA7OworICBlc2FjCisKKyAgIyBIYXZpbmcgd2FybmVkIGFib3V0IGFsbCBtaXMtc3BlY2lmaWVkIG9wdGlvbnMsIGJhaWwgb3V0IGlmCisgICMgYW55dGhpbmcgd2FzIHdyb25nLgorICAkZXhpdF9jbWQgJEVYSVRfRkFJTFVSRQorfQorCisjIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorIyBFbnN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgbTQgbWFjcm9zLCBhbmQgbGlidG9vbCBzY3JpcHQgZnJvbSB0aGUgc2FtZQorIyByZWxlYXNlIG9mIGxpYnRvb2wuCitmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2ggKCkKK3sKKyAgaWYgdGVzdCAiJHBhY2thZ2VfcmV2aXNpb24iICE9ICIkbWFjcm9fcmV2aXNpb24iOyB0aGVuCisgICAgaWYgdGVzdCAiJFZFUlNJT04iICE9ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRtYWNyb192ZXJzaW9uIjsgdGhlbgorICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQorJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIGFuIG9sZGVyIHJlbGVhc2UuCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBlbHNlCisgICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCiskcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gJFBBQ0tBR0UgJG1hY3JvX3ZlcnNpb24uCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbiwKKyRwcm9nbmFtZTogYnV0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIHJldmlzaW9uICRtYWNyb19yZXZpc2lvbi4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24KKyRwcm9nbmFtZTogb2YgJFBBQ0tBR0UgJFZFUlNJT04gYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICBmaQorCisgICAgZXhpdCAkRVhJVF9NSVNNQVRDSAogICBmaQorfQorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyAgICBNYWluLiAgICAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworJG9wdF9oZWxwIHx8IHsKKyAgIyBTYW5pdHkgY2hlY2tzIGZpcnN0OgorICBmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2gKKworICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIm5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiCisgIGZpCisKKyAgdGVzdCAteiAiJG1vZGUiICYmIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERS4iCisKKworICAjIERhcndpbiBzdWNrcworICBldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCiAKICAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KICAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KLSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciIDE+JjIKLSAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKKyAgICBmdW5jX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciCisgICAgJEVDSE8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCiAgIGZpCiAKICAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgogICBnZW5lcmljX2hlbHA9IiRoZWxwIgotICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorICBoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorfQogCi0gICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgotICBjYXNlICIkbW9kZSIgaW4KLSAgIyBsaWJ0b29sIGNvbXBpbGUgbW9kZQotICBjb21waWxlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGNvbXBpbGUiCisKKyMgZnVuY19sYWxpYl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgYC5sYScgbGlicmFyeSBvciBgLmxvJyBvYmplY3QgZmlsZS4KKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2xhbGliX3AgKCkKK3sKKyAgICB0ZXN0IC1mICIkMSIgJiYKKyAgICAgICRTRUQgLWUgNHEgIiQxIiAyPi9kZXYvbnVsbCBcCisgICAgICAgIHwgJEdSRVAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIiA+IC9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sYWxpYl91bnNhZmVfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2FtZSBjaGVjayBhcyBmdW5jX2xhbGliX3Agd2l0aG91dAorIyByZXNvcnRpbmcgdG8gZXh0ZXJuYWwgcHJvZ3JhbXMuICBUbyB0aGlzIGVuZCwgaXQgcmVkaXJlY3RzIHN0ZGluIGFuZAorIyBjbG9zZXMgaXQgYWZ0ZXJ3YXJkcywgd2l0aG91dCBzYXZpbmcgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvci4KKyMgQXMgYSBzYWZldHkgbWVhc3VyZSwgdXNlIGl0IG9ubHkgd2hlcmUgYSBuZWdhdGl2ZSByZXN1bHQgd291bGQgYmUKKyMgZmF0YWwgYW55d2F5LiAgV29ya3MgaWYgYGZpbGUnIGRvZXMgbm90IGV4aXN0LgorZnVuY19sYWxpYl91bnNhZmVfcCAoKQoreworICAgIGxhbGliX3A9bm8KKyAgICBpZiB0ZXN0IC1mICIkMSIgJiYgdGVzdCAtciAiJDEiICYmIGV4ZWMgNTwmMCA8IiQxIjsgdGhlbgorCWZvciBsYWxpYl9wX2wgaW4gMSAyIDMgNAorCWRvCisJICAgIHJlYWQgbGFsaWJfcF9saW5lCisJICAgIGNhc2UgIiRsYWxpYl9wX2xpbmUiIGluCisJCVwjXCBHZW5lcmF0ZWRcIGJ5XCAqJFBBQ0tBR0UqICkgbGFsaWJfcD15ZXM7IGJyZWFrOzsKKwkgICAgZXNhYworCWRvbmUKKwlleGVjIDA8JjUgNTwmLQorICAgIGZpCisgICAgdGVzdCAiJGxhbGliX3AiID0geWVzCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdAorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICgpCit7CisgICAgZnVuY19sYWxpYl9wICIkMSIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0KKyAgICBjYXNlICQxIGluCisgICAgKi5leGUpIDs7CisgICAgKikgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9LmV4ZSA7OworICAgIGVzYWMKKyAgICAkR1JFUCAiJG1hZ2ljX2V4ZSIgIiQxJGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4IiA+L2Rldi9udWxsIDI+JjEKK30KKworIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lIGZpbGUKKyMgQXNzdW1lcyBmaWxlIGlzIGFuIGx0d3JhcHBlcl9leGVjdXRhYmxlCisjIHVzZXMgJGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBmb3IgYQorIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdD0iIgorICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJDEiOyB0aGVuCisJZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgorCWZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCWZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKKyAgICBmaQorfQorCisjIGZ1bmNfbHR3cmFwcGVyX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvciB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiQxIiB8fCBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIgorfQorCisKKyMgZnVuY19leGVjdXRlX2NtZHMgY29tbWFuZHMgZmFpbF9jbWQKKyMgRXhlY3V0ZSB0aWxkZS1kZWxpbWl0ZWQgQ09NTUFORFMuCisjIElmIEZBSUxfQ01EIGlzIGdpdmVuLCBldmFsIHRoYXQgdXBvbiBmYWlsdXJlLgorIyBGQUlMX0NNRCBtYXkgcmVhZC1hY2Nlc3MgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB2YXJpYWJsZSBDTUQhCitmdW5jX2V4ZWN1dGVfY21kcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBzYXZlX2lmcz0kSUZTOyBJRlM9J34nCisgICAgZm9yIGNtZCBpbiAkMTsgZG8KKyAgICAgIElGUz0kc2F2ZV9pZnMKKyAgICAgIGV2YWwgY21kPVwiJGNtZFwiCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGNtZCIgIiR7Mi06fSIKKyAgICBkb25lCisgICAgSUZTPSRzYXZlX2lmcworfQorCisKKyMgZnVuY19zb3VyY2UgZmlsZQorIyBTb3VyY2UgRklMRSwgYWRkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgaWYgbmVjZXNzYXJ5LgorIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisjIEZJTEUgZXZlbiBpZiBib3RoIEZJTEUgYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKyMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorZnVuY19zb3VyY2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkMSBpbgorICAgICovKiB8ICpcXCopCS4gIiQxIiA7OworICAgICopCQkuICIuLyQxIiA7OworICAgIGVzYWMKK30KKworCisjIGZ1bmNfaW5mZXJfdGFnIGFyZworIyBJbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiB0byB1c2UgaWYgYW55IGFyZSBhdmFpbGFibGUgYW5kCisjIGlmIG9uZSB3YXNuJ3QgY2hvc2VuIHZpYSB0aGUgIi0tdGFnIiBjb21tYW5kIGxpbmUgb3B0aW9uLgorIyBPbmx5IGF0dGVtcHQgdGhpcyBpZiB0aGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZQorIyBjb21tYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgY29tcGlsZXIuCisjIGFyZyBpcyB1c3VhbGx5IG9mIHRoZSBmb3JtICdnY2MgLi4uJworZnVuY19pbmZlcl90YWcgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgaWYgdGVzdCAtbiAiJGF2YWlsYWJsZV90YWdzIiAmJiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKyAgICAgIENDX3F1b3RlZD0KKyAgICAgIGZvciBhcmcgaW4gJENDOyBkbworICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCUNDX3F1b3RlZD0iJENDX3F1b3RlZCAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBkb25lCisgICAgICBjYXNlICRAIGluCisgICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAorICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCisgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkRUNITyAkQ0NgICIqIHwgImAkRUNITyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRFQ0hPICRDQ19xdW90ZWRgICIqIHwgImAkRUNITyAkQ0NfcXVvdGVkYCAiKikgOzsKKyAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCisgICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCisgICAgICAqKQorCWZvciB6IGluICRhdmFpbGFibGVfdGFnczsgZG8KKwkgIGlmICRHUkVQICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkeiQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KKwkgICAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckeickLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckeickL3AnIDwgJHByb2dwYXRoYCIKKwkgICAgQ0NfcXVvdGVkPQorCSAgICBmb3IgYXJnIGluICRDQzsgZG8KKwkgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisJICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwkgICAgICBDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgICBkb25lCisJICAgIGNhc2UgIiRAICIgaW4KKwkgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkRUNITyAkQ0NgICIqIHwgImAkRUNITyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRFQ0hPICRDQ19xdW90ZWRgICIqIHwgImAkRUNITyAkQ0NfcXVvdGVkYCAiKikKKwkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcworCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCisJICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KKwkgICAgICB0YWduYW1lPSR6CisJICAgICAgYnJlYWsKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCWRvbmUKKwkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgorCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKKwkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KKwlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKwkgIGZ1bmNfZWNobyAidW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCSAgZnVuY19mYXRhbF9lcnJvciAic3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIgorIwllbHNlCisjCSAgZnVuY192ZXJib3NlICJ1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZmkKK30KKworCisKKyMgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCBvdXRwdXRfbmFtZSBwaWNfbmFtZSBub25waWNfbmFtZQorIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKKyMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCitmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICgpCit7CisgICAgd3JpdGVfbGlib2JqPSR7MX0KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfbG9iaj1cJyR7Mn1cJworICAgIGVsc2UKKyAgICAgIHdyaXRlX2xvYmo9bm9uZQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICB3cml0ZV9vbGRvYmo9XCckezN9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9vbGRvYmo9bm9uZQorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgY2F0ID4ke3dyaXRlX2xpYm9ian1UIDw8RU9GCisjICR3cml0ZV9saWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgorcGljX29iamVjdD0kd3JpdGVfbG9iagorCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Citub25fcGljX29iamVjdD0kd3JpdGVfb2xkb2JqCisKK0VPRgorICAgICAgJE1WICIke3dyaXRlX2xpYm9ian1UIiAiJHt3cml0ZV9saWJvYmp9IgorICAgIH0KK30KKworIyBmdW5jX21vZGVfY29tcGlsZSBhcmcuLi4KK2Z1bmNfbW9kZV9jb21waWxlICgpCit7CisgICAgJG9wdF9kZWJ1ZwogICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCiAgICAgYmFzZV9jb21waWxlPQotICAgIGxhc3Rhcmc9Ci0gICAgc3JjZmlsZT0iJG5vbm9wdCIKKyAgICBzcmNmaWxlPSIkbm9ub3B0IiAgIyAgYWx3YXlzIGtlZXAgYSBub24tZW1wdHkgdmFsdWUgaW4gInNyY2ZpbGUiCisgICAgc3VwcHJlc3Nfb3B0PXllcwogICAgIHN1cHByZXNzX291dHB1dD0KKyAgICBhcmdfbW9kZT1ub3JtYWwKKyAgICBsaWJvYmo9CisgICAgbGF0ZXI9CisgICAgcGllX2ZsYWc9CiAKICAgICBmb3IgYXJnCiAgICAgZG8KLSAgICAgICMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtbykKLQkkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlbmFtZSB3aXRoIFxgLW8nIiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCisgICAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgICAgYXJnICApCisJIyBkbyBub3QgImNvbnRpbnVlIi4gIEluc3RlYWQsIGFkZCB0aGlzIHRvIGJhc2VfY29tcGlsZQorCWxhc3Rhcmc9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJOzsKKworICAgICAgdGFyZ2V0ICkKKwlsaWJvYmo9IiRhcmciCisJYXJnX21vZGU9bm9ybWFsCisJY29udGludWUKKwk7OworCisgICAgICBub3JtYWwgKQorCSMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKwljYXNlICRhcmcgaW4KKwktbykKKwkgIHRlc3QgLW4gIiRsaWJvYmoiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAieW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIgorCSAgYXJnX21vZGU9dGFyZ2V0CisJICBjb250aW51ZQorCSAgOzsKKworCS1waWUgfCAtZnBpZSB8IC1mUElFKQorICAgICAgICAgIHBpZV9mbGFnPSIkcGllX2ZsYWcgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLXNoYXJlZCB8IC1zdGF0aWMgfCAtcHJlZmVyLXBpYyB8IC1wcmVmZXItbm9uLXBpYykKKwkgIGxhdGVyPSIkbGF0ZXIgJGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJLW5vLXN1cHByZXNzKQorCSAgc3VwcHJlc3Nfb3B0PW5vCisJICBjb250aW51ZQorCSAgOzsKKworCS1YY29tcGlsZXIpCisJICBhcmdfbW9kZT1hcmcgICMgIHRoZSBuZXh0IG9uZSBnb2VzIGludG8gdGhlICJiYXNlX2NvbXBpbGUiIGFyZyBsaXN0CisJICBjb250aW51ZSAgICAgICMgIFRoZSBjdXJyZW50ICJzcmNmaWxlIiB3aWxsIGVpdGhlciBiZSByZXRhaW5lZCBvcgorCSAgOzsgICAgICAgICAgICAjICByZXBsYWNlZCBsYXRlci4gIEkgd291bGQgZ3Vlc3MgdGhhdCB3b3VsZCBiZSBhIGJ1Zy4KKworCS1XYywqKQorCSAgZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCSAgYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBsYXN0YXJnPQorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JywnCisJICBmb3IgYXJnIGluICRhcmdzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwkgICAgbGFzdGFyZz0iJGxhc3RhcmcgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRsYXN0YXJnIgorCSAgbGFzdGFyZz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKwkgICMgQWRkIHRoZSBhcmd1bWVudHMgdG8gYmFzZV9jb21waWxlLgorCSAgYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorCSAgY29udGludWUKKwkgIDs7CisKKwkqKQorCSAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgorCSAgIyBUaGUgcHJldmlvdXMgInNyY2ZpbGUiIGJlY29tZXMgdGhlIGN1cnJlbnQgYXJndW1lbnQuCisJICAjCisJICBsYXN0YXJnPSIkc3JjZmlsZSIKKwkgIHNyY2ZpbGU9IiRhcmciCisJICA7OworCWVzYWMgICMgIGNhc2UgJGFyZworCTs7CisgICAgICBlc2FjICAgICMgIGNhc2UgJGFyZ19tb2RlCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgcHJldmlvdXMgYXJndW1lbnQuCisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbGFzdGFyZyIKKyAgICAgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgZG9uZSAjIGZvciBhcmcKKworICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgYXJnKQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgorICAgICAgOzsKKyAgICB0YXJnZXQpCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJ5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciCisgICAgICA7OworICAgICopCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiB7CisJZnVuY19iYXNlbmFtZSAiJHNyY2ZpbGUiCisJbGlib2JqPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICB9CisgICAgICA7OworICAgIGVzYWMKKworICAgICMgUmVjb2duaXplIHNldmVyYWwgZGlmZmVyZW50IGZpbGUgc3VmZml4ZXMuCisgICAgIyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgLW8gZmlsZS5vLCBpdCBpcyByZXBsYWNlZCB3aXRoIGZpbGUubG8KKyAgICBjYXNlICRsaWJvYmogaW4KKyAgICAqLltjQ0ZTaWZtc29dIHwgXAorICAgICouYWRhIHwgKi5hZGIgfCAqLmFkcyB8ICouYXNtIHwgXAorICAgICouYysrIHwgKi5jYyB8ICouaWkgfCAqLmNsYXNzIHwgKi5jcHAgfCAqLmN4eCB8IFwKKyAgICAqLltmRl1bMDldPyB8ICouZm9yIHwgKi5qYXZhIHwgKi5vYmogfCAqLnN4KQorICAgICAgZnVuY194Zm9ybSAiJGxpYm9iaiIKKyAgICAgIGxpYm9iaj0kZnVuY194Zm9ybV9yZXN1bHQKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5sbykgZnVuY19sbzJvICIkbGlib2JqIjsgb2JqPSRmdW5jX2xvMm9fcmVzdWx0IDs7CisgICAgKikKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciCisgICAgICA7OworICAgIGVzYWMKKworICAgIGZ1bmNfaW5mZXJfdGFnICRiYXNlX2NvbXBpbGUKKworICAgIGZvciBhcmcgaW4gJGxhdGVyOyBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtc2hhcmVkKQorCXRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiBcCisJICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gImNhbiBub3QgYnVpbGQgYSBzaGFyZWQgbGlicmFyeSIKKwlidWlsZF9vbGRfbGlicz1ubworCWNvbnRpbnVlCiAJOzsKIAogICAgICAgLXN0YXRpYykKQEAgLTI0MiwxODkwICsxMjQyLDQ1MiBAQAogCWJ1aWxkX29sZF9saWJzPXllcwogCWNvbnRpbnVlCiAJOzsKLSAgICAgIGVzYWMKIAotICAgICAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgotICAgICAgbGFzdGFyZz0iJHNyY2ZpbGUiCi0gICAgICBzcmNmaWxlPSIkYXJnIgorICAgICAgLXByZWZlci1waWMpCisJcGljX21vZGU9eWVzCisJY29udGludWUKKwk7OwogCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotCi0gICAgICAjIEJhY2tzbGFzaGlmeSBhbnkgYmFja3NsYXNoZXMsIGRvdWJsZSBxdW90ZXMsIGFuZCBkb2xsYXIgc2lnbnMuCi0gICAgICAjIFRoZXNlIGFyZSB0aGUgb25seSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIHNwZWNpYWxseQotICAgICAgIyBpbnRlcnByZXRlZCBpbnNpZGUgb2YgZG91YmxlLXF1b3RlZCBzY3JpbmdzLgotICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5IGluIHNjYW4KLSAgICAgICMgc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotICAgICAgY2FzZSAiJGxhc3RhcmciIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQlsYXN0YXJnPSJcIiRsYXN0YXJnXCIiCisgICAgICAtcHJlZmVyLW5vbi1waWMpCisJcGljX21vZGU9bm8KKwljb250aW51ZQogCTs7CiAgICAgICBlc2FjCi0KLSAgICAgICMgQWRkIHRoZSBwcmV2aW91cyBhcmd1bWVudCB0byBiYXNlX2NvbXBpbGUuCi0gICAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgotCWJhc2VfY29tcGlsZT0iJGxhc3RhcmciCi0gICAgICBlbHNlCi0JYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgotICAgICAgZmkKICAgICBkb25lCiAKLSAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCi0gICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxpYm9iaiIKKyAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiIFwKKyAgICAgICYmICRFQ0hPICJYJGxpYm9iaiIgfCAkR1JFUCAnW11+I14qe307PD4/IiciJyInCSAmKCl8YCRbXScgXAorICAgICAgJiYgZnVuY193YXJuaW5nICJsaWJvYmogbmFtZSBcYCRsaWJvYmonIG1heSBub3QgY29udGFpbiBzaGVsbCBzcGVjaWFsIGNoYXJhY3RlcnMuIgorICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRvYmoiICIvIiAiIgorICAgIG9iam5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICB4ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICBsb2JqPSR7eGRpcn0kb2JqZGlyLyRvYmpuYW1lCiAKLSAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgotICAgIHhmb3JtPSdbY0NGU2Ztc10nCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmFkYSkgeGZvcm09YWRhIDs7Ci0gICAgKi5hZGIpIHhmb3JtPWFkYiA7OwotICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKLSAgICAqLmFzbSkgeGZvcm09YXNtIDs7Ci0gICAgKi5jKyspIHhmb3JtPWMrKyA7OwotICAgICouY2MpIHhmb3JtPWNjIDs7Ci0gICAgKi5jcHApIHhmb3JtPWNwcCA7OwotICAgICouY3h4KSB4Zm9ybT1jeHggOzsKLSAgICAqLmY5MCkgeGZvcm09ZjkwIDs7Ci0gICAgKi5mb3IpIHhmb3JtPWZvciA7OwotICAgIGVzYWMKLQotICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKLQotICAgIGNhc2UgIiRsaWJvYmoiIGluCi0gICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvLm8vJ2AgOzsKLSAgICAqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkc3JjZmlsZSciIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKKyAgICB0ZXN0IC16ICIkYmFzZV9jb21waWxlIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIgogCiAgICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKLSAgICAgIHRyYXAgIiRydW4gJHJtICRvYmogJGxpYm9iajsgZXhpdCAxIiAxIDIgMTUKKyAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgogICAgIGVsc2UKLSAgICAgICRydW4gJHJtICRsaWJvYmoKLSAgICAgIHRyYXAgIiRydW4gJHJtICRsaWJvYmo7IGV4aXQgMSIgMSAyIDE1CisgICAgICByZW1vdmVsaXN0PSIkbG9iaiAkbGlib2JqICR7bGlib2JqfVQiCiAgICAgZmkKIAorICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisgICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICBmaQorCisgICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKKyAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKKyAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCisgICAgICBvdXRwdXRfb2JqPWAkRUNITyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQorICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCisgICAgZWxzZQorICAgICAgb3V0cHV0X29iaj0KKyAgICAgIG5lZWRfbG9ja3M9bm8KKyAgICAgIGxvY2tmaWxlPQorICAgIGZpCisKKyAgICAjIExvY2sgdGhpcyBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IGlzIG5lZWRlZAorICAgICMgV2UgdXNlIHRoaXMgc2NyaXB0IGZpbGUgdG8gbWFrZSB0aGUgbGluaywgaXQgYXZvaWRzIGNyZWF0aW5nIGEgbmV3IGZpbGUKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB5ZXM7IHRoZW4KKyAgICAgIHVudGlsICRvcHRfZHJ5X3J1biB8fCBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwlmdW5jX2VjaG8gIldhaXRpbmcgZm9yICRsb2NrZmlsZSB0byBiZSByZW1vdmVkIgorCXNsZWVwIDIKKyAgICAgIGRvbmUKKyAgICBlbGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm47IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRsb2NrZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgZXhpc3RzIGFuZCBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKyAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRvdXRwdXRfb2JqIgorICAgICAgJEVDSE8gIiRzcmNmaWxlIiA+ICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKyAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkbG9ja2ZpbGUiCisgICAgdHJhcCAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJyAxIDIgMTUKKworICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgorICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgorICAgIGZpCisgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJHNyY2ZpbGUiCisgICAgcXNyY2ZpbGU9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0CisKICAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgogICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KICAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQogCi0gICAgICAjIEFsbCBwbGF0Zm9ybXMgdXNlIC1EUElDLCB0byBub3RpZnkgcHJlcHJvY2Vzc2VkIGFzc2VtYmxlciBjb2RlLgotICAgICAgJHNob3cgIiRiYXNlX2NvbXBpbGUkcGljX2ZsYWcgLURQSUMgJHNyY2ZpbGUiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRiYXNlX2NvbXBpbGVcJHBpY19mbGFnIC1EUElDIFwkc3JjZmlsZSI7IHRoZW4gOgorICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKICAgICAgIGVsc2UKLSAgICAgICAgdGVzdCAtbiAiJG9iaiIgJiYgJHJ1biAkcm0gJG9iagotICAgICAgICBleGl0IDEKKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCiAgICAgICBmaQogCi0gICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KLSAgICAgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyI7IHRoZW4KLSAgICAgICAgJHNob3cgIiRMTl9TICRvYmogJGxpYm9iaiIKLSAgICAgICAgJHJ1biAkTE5fUyAkb2JqICRsaWJvYmoKLSAgICAgICAgZXhpdCAkPworICAgICAgZnVuY19ta2Rpcl9wICIkeGRpciRvYmpkaXIiCisKKyAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgorCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgorCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRsb2JqIgogICAgICAgZmkKIAotICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQotICAgICAgJHNob3cgIiRtdiAkb2JqICRsaWJvYmoiCi0gICAgICAkcnVuICRtdiAkb2JqICRsaWJvYmogfHwgZXhpdCAxCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIglcCisgICAgICAgICAgJ3Rlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJEVYSVRfRkFJTFVSRScKKworICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybiAmJgorCSB0ZXN0ICJYYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgIiAhPSAiWCRzcmNmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKK2BjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAorCitidXQgaXQgc2hvdWxkIGNvbnRhaW46Ciskc3JjZmlsZQorCitUaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCit0ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCit5b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91CityZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCithdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgorY29tcGlsZXIuIgorCisJJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgIyBKdXN0IG1vdmUgdGhlIG9iamVjdCBpZiBuZWVkZWQsIHRoZW4gZ28gb24gdG8gY29tcGlsZSB0aGUgbmV4dCBvbmUKKyAgICAgIGlmIHRlc3QgLW4gIiRvdXRwdXRfb2JqIiAmJiB0ZXN0ICJYJG91dHB1dF9vYmoiICE9ICJYJGxvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkbG9iaiInIFwKKwkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCisgICAgICBmaQogCiAgICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCi0gICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCisgICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgorCXN1cHByZXNzX291dHB1dD0nID4vZGV2L251bGwgMj4mMScKKyAgICAgIGZpCiAgICAgZmkKIAogICAgICMgT25seSBidWlsZCBhIHBvc2l0aW9uLWRlcGVuZGVudCBvYmplY3QgaWYgd2UgYnVpbGQgb2xkIGxpYnJhcmllcy4KICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkcGljX21vZGUiICE9IHllczsgdGhlbgorCSMgRG9uJ3QgYnVpbGQgUElDIGNvZGUKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSRwaWVfZmxhZyIKKyAgICAgIGVsc2UKKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSB5ZXM7IHRoZW4KKwljb21tYW5kPSIkY29tbWFuZCAtbyAkb2JqIgorICAgICAgZmkKKwogICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCi0gICAgICAkc2hvdyAiJGJhc2VfY29tcGlsZSAkc3JjZmlsZSRzdXBwcmVzc19vdXRwdXQiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRiYXNlX2NvbXBpbGUgXCRzcmNmaWxlJHN1cHByZXNzX291dHB1dCI7IHRoZW4gOgotICAgICAgZWxzZQotICAgICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKLSAgICAgICAgZXhpdCAxCisgICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCisgICAgICBmdW5jX3Nob3dfZXZhbF9sb2NhbGUgIiRjb21tYW5kIiBcCisgICAgICAgICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRvYmoiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgJyRNViAiJG91dHB1dF9vYmoiICIkb2JqIicgXAorCSAgJ2Vycm9yPSQ/OyAkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRlcnJvcicKICAgICAgIGZpCiAgICAgZmkKIAotICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvIG5vdAotICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0gICAgICAkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotICAgICAgJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+IFwkbGlib2JqIiB8fCBleGl0ICQ/Ci0gICAgZmkKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAiJGxpYm9iaiIgIiRvYmpkaXIvJG9iam5hbWUiICIkb2JqbmFtZSIKIAotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGxpbmsgbW9kZQotICBsaW5rKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCi0gICAgQ0M9IiRub25vcHQiCi0gICAgYWxsb3dfdW5kZWZpbmVkPXllcwotICAgIGNvbXBpbGVfY29tbWFuZD0iJENDIgotICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRDQyIKLQotICAgIGNvbXBpbGVfc2hsaWJwYXRoPQotICAgIGZpbmFsaXplX3NobGlicGF0aD0KLSAgICBkZXBsaWJzPQotICAgIGRsZmlsZXM9Ci0gICAgZGxwcmVmaWxlcz0KLSAgICBleHBvcnRfZHluYW1pYz1ubwotICAgIGhhcmRjb2RlX2xpYmRpcnM9Ci0gICAgbGlib2Jqcz0KLSAgICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPQotICAgIGx0bGlicz0KLSAgICBvYmpzPQotICAgIHByZXY9Ci0gICAgcHJldmFyZz0KLSAgICByZWxlYXNlPQotICAgIHJwYXRoPQotICAgIHBlcm1fcnBhdGg9Ci0gICAgdGVtcF9ycGF0aD0KLSAgICB2aW5mbz0KLQotICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCi0gICAgICAgIGlmIHRlc3QgIlgkYXJnIiA9ICJYLWFsbC1zdGF0aWMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIgMT4mMgotICAgICAgICBmaQotICAgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQlidWlsZF9vbGRfbGlicz15ZXMKLSAgICAgICAgYnJlYWsKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICAjIFNlZSBpZiBvdXIgc2hhcmVkIGFyY2hpdmVzIGRlcGVuZCBvbiBzdGF0aWMgYXJjaGl2ZXMuCi0gICAgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIGJ1aWxkX29sZF9saWJzPXllcwotCi0gICAgIyBHbyB0aHJvdWdoIHRoZSBhcmd1bWVudHMsIHRyYW5zZm9ybWluZyB0aGVtIG9uIHRoZSB3YXkuCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgICBjYXNlICIkcHJldiIgaW4KLSAgICAgICAgb3V0cHV0KQotICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAT1VUUFVUQCIKLSAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLSAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgY2FzZSAiJHByZXYiIGluCi0gICAgICAgIGRsZmlsZXN8ZGxwcmVmaWxlcykKLSAgICAgICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgICAgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCi0gICAgICAgICAgKikKLSAgICAgICAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCi0gICAgICAgICAgICB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0gICAgICAgICAgICBwcmV2PQotICAgICAgICAgICAgOzsKLSAgICAgICAgICBlc2FjCi0gICAgICAgICAgOzsKLQlyZWxlYXNlKQotCSAgcmVsZWFzZT0iLSRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0gICAgICAgIHJwYXRoKQotICAgICAgICAgIHJwYXRoPSIkcnBhdGggJGFyZyIKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLSAgICAgICAgKikKLSAgICAgICAgICBldmFsICIkcHJldj1cIlwkYXJnXCIiCi0gICAgICAgICAgcHJldj0KLSAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKKyAgICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorCXJlbW92ZWxpc3Q9JGxvY2tmaWxlCisgICAgICAgICRSTSAiJGxvY2tmaWxlIgogICAgICAgZmkKKyAgICB9CiAKLSAgICAgIHByZXZhcmc9IiRhcmciCi0KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtYWxsLXN0YXRpYykKLQlpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KLSAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLSAgICAgICAgZmkKLSAgICAgICAgY29udGludWUKLQk7OwotCi0gICAgICAtYWxsb3ctdW5kZWZpbmVkKQotCSMgRklYTUU6IHJlbW92ZSB0aGlzIGZsYWcgc29tZXRpbWUgaW4gdGhlIGZ1dHVyZS4KLQkkZWNobyAiJG1vZGVuYW1lOiBcYC1hbGxvdy11bmRlZmluZWQnIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgZGVmYXVsdCIgMT4mMgotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLSAgICAgICAgcHJldj1kbGZpbGVzCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0gICAgICAgIHByZXY9ZGxwcmVmaWxlcwotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0gICAgICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgIT0geWVzOyB0aGVuCi0gICAgICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBhcmc9Ci0JICBmaQotCi0gICAgICAgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KLQkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCBAU1lNRklMRUAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0KLSAgICAgIC1MKikKLSAgICAgICAgZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi1MXCguKlwpJCVcMSUnYAotICAgICAgICBjYXNlICIkZGlyIiBpbgotICAgICAgICAvKiB8IFtBLVphLXpdOlxcKikKLQkgICMgQWRkIHRoZSBjb3JyZXNwb25kaW5nIGhhcmRjb2RlX2xpYmRpcl9mbGFnLCBpZiBpdCBpcyBub3QgaWRlbnRpY2FsLgotICAgICAgICAgIDs7Ci0gICAgICAgICopCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAtTCRkaXInIGNhbm5vdCBzcGVjaWZ5IGEgcmVsYXRpdmUgZGlyZWN0b3J5IiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgOzsKLSAgICAgICAgZXNhYwotICAgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotICAgICAgICA7OwotCi0gICAgICAtbCopIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciIDs7Ci0KLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0gICAgICAgIHByZXY9cnBhdGgKLSAgICAgICAgY29udGludWUKLSAgICAgICAgOzsKLQotICAgICAgLXN0YXRpYykKLQkjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYy4KLQlpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotICAgICAgICBmaQotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXZlcnNpb24taW5mbykKLSAgICAgICAgcHJldj12aW5mbwotICAgICAgICBjb250aW51ZQotICAgICAgICA7OwotCi0gICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KLSAgICAgIC0qIHwgKyopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLSAgICAgICAgOzsKLQotICAgICAgKi5vIHwgKi5hKQotICAgICAgICAjIEEgc3RhbmRhcmQgb2JqZWN0LgotICAgICAgICBvYmpzPSIkb2JqcyAkYXJnIgotICAgICAgICA7OwotCi0gICAgICAqLmxvKQotICAgICAgICAjIEEgbGlicmFyeSBvYmplY3QuCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBlbHNlCi0JICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIHByZXY9ZGxwcmVmaWxlcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCi0JICBwcmV2PQotCWZpCi0JbGlib2Jqcz0iJGxpYm9ianMgJGFyZyIKLSAgICAgICAgOzsKLQotICAgICAgKi5sYSkKLSAgICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0gICAgICAgIGRsbmFtZT0KLSAgICAgICAgbGliZGlyPQotICAgICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgICBvbGRfbGlicmFyeT0KLQotICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotICAgICAgICBpZiAoc2VkIC1lICcycScgJGFyZyB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotCi0gICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotICAgICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgICAqLyogfCAqXFwqKSAuICRhcmcgOzsKLSAgICAgICAgKikgLiAuLyRhcmcgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBjb250YWlucyBubyAtcnBhdGggaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLQotICAgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCi0gICAgICAgIGxpbmtsaWI9Ci0gICAgICAgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KLSAgICAgICAgICBsaW5rbGliPSIkbCIKLSAgICAgICAgZG9uZQotCi0gICAgICAgIGlmIHRlc3QgLXogIiRsaW5rbGliIjsgdGhlbgotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0gICAgICAgIG5hbWU9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCi0gICAgICAgIGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICAgIGlmIHRlc3QgIlgkZGlyIiA9ICJYJGFyZyI7IHRoZW4KLSAgICAgICAgICBkaXI9IiRvYmpkaXIiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXI9IiRkaXIvJG9iamRpciIKLSAgICAgICAgZmkKLQotICAgICAgICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KLSAgICAgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotICAgICAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0gICAgICAgICAgaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KLSAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCB3ZSBuZWVkIHRvIHByZWxvYWQuCi0gICAgICAgICAgICBwcmV2PWRscHJlZmlsZXMKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAjIFdlIHNob3VsZCBub3QgY3JlYXRlIGEgZGVwZW5kZW5jeSBvbiB0aGlzIGxpYnJhcnksIGJ1dCB3ZQotCSAgICAjIG1heSBuZWVkIGFueSBsaWJyYXJpZXMgaXQgcmVxdWlyZXMuCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLSAgICAgICAgICAgIHByZXY9Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLSAgICAgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotICAgICAgICAgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scwotICAgICAgICAgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotICAgICAgICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KLSAgICAgICAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgZmkKLSAgICAgICAgICBwcmV2PQotICAgICAgICBmaQotCi0gICAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgdGhlbgotICAgICAgICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9IiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzICRhcmciCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCi0gICAgICAgICAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCi0gICAgICAgICAgICAqIiAkZGlyICIqKSA7OwotICAgICAgICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGggJGRpciIgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICBmaQotCi0JICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLSAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAgICAgICAgICAgIyBQdXQgdGhlIG1hZ2ljIGxpYmRpciB3aXRoIHRoZSBoYXJkY29kZSBmbGFnLgotICAgICAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0gICAgICAgICAgICAgICAgbGliZGlyPSJASEFSRENPREVfTElCRElSU0AiCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JCWNhc2UgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgaW4KLQkJKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQkgIDs7Ci0JCSopCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCSAgOzsKLQkJZXNhYwotICAgICAgICAgICAgICAgIGxpYmRpcj0KLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGZsYWciCi0gICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRmbGFnIgotICAgICAgICAgICAgZmkKLSAgICAgICAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgICAgICAgICMgRG8gdGhlIHNhbWUgZm9yIHRoZSBwZXJtYW5lbnQgcnVuIHBhdGguCi0gICAgICAgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCi0gICAgICAgICAgICAqIiAkbGliZGlyICIqKSA7OwotICAgICAgICAgICAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICBmaQotCi0KLSAgICAgICAgICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgotICAgICAgICAgIGltbWVkaWF0ZSkKLSAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKLSAgICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6IgotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICA7OwotCi0gICAgICAgICAgcmVsaW5rKQotICAgICAgICAgICAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCi0gICAgICAgICAgICBjYXNlICIkZGlyIiBpbgotICAgICAgICAgICAgLyogfCBbQS1aYS16XTpcXCopIDs7Ci0gICAgICAgICAgICAqKQotICAgICAgICAgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0gICAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRkaXInIiAxPiYyCi0gICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIGRpcj0iJGFic2RpciIKLSAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCi0gICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgotICAgICAgICAgICAgICBjb21waWxlX3NobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJGRpcjoiCi0gICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtbCRuYW1lIgotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIDs7Ci0KLSAgICAgICAgICAqKQotICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkaGFyZGNvZGVfYWN0aW9uJyBpcyBhbiB1bmtub3duIGhhcmRjb2RlIGFjdGlvbiIgMT4mMgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICA7OwotICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICMgRmluYWxpemUgY29tbWFuZCBmb3IgYm90aCBpcyBzaW1wbGU6IGp1c3QgaGFyZGNvZGUgaXQuCi0gICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRsaWJkaXIvJGxpbmtsaWIiCi0gICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciAtbCRuYW1lIgotICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCi0gICAgICAgICAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIKLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgIyBXZSBjYW5ub3Qgc2VlbSB0byBoYXJkY29kZSBpdCwgZ3Vlc3Mgd2UnbGwgZmFrZSBpdC4KLSAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1MJGxpYmRpciAtbCRuYW1lIgotICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAjIFRyYW5zZm9ybSBkaXJlY3RseSB0byBvbGQgYXJjaGl2ZXMgaWYgd2UgZG9uJ3QgYnVpbGQgbmV3IGxpYnJhcmllcy4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkcGljX2ZsYWciICYmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KLSAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIHN0YXRpYyBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0gICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICBmaQotCi0JICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgb25lIG9mIGhhcmRjb2RlX2RpcmVjdCBvciBoYXJkY29kZV9taW51c19MCi0JICAjIGlzIG5vdCB1bnN1cHBvcnRlZC4gIFRoaXMgaXMgdmFsaWQgb24gYWxsIGtub3duIHN0YXRpYyBhbmQKLQkgICMgc2hhcmVkIHBsYXRmb3Jtcy4KLQkgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHVuc3VwcG9ydGVkOyB0aGVuCi0JICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgbGlua2xpYj0iJG9sZF9saWJyYXJ5IgotCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgIGVsc2UKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKLQkgIGZpCi0gICAgICAgIGZpCi0KLQkjIEFkZCBpbiBhbnkgbGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWNvbnRpbnVlCi0gICAgICAgIDs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIFxgLXZlcnNpb24taW5mbycgYW5kIFxgLXJlbGVhc2UnIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBvbGRsaWI9Ci0gICAgb2xkb2Jqcz0KLSAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICIiKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0KLSAgICAqLyogfCAqXFwqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogb3V0cHV0IGZpbGUgXGAkb3V0cHV0JyBtdXN0IGhhdmUgbm8gZGlyZWN0b3J5IGNvbXBvbmVudHMiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLQotICAgICouYSkKLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBidWlsZF9vbGRfbGlicz15ZXMKLSAgICAgIG9sZGxpYj0iJG91dHB1dCIKLSAgICAgICRzaG93ICIkcm0gJG9sZGxpYiIKLSAgICAgICRydW4gJHJtICRvbGRsaWIKLSAgICAgIDs7Ci0KLSAgICAqLmxhKQotICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgdGhlIGZvcm0gYGxpYk5BTUUubGEnLgotICAgICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAgIGxpYiopIDs7Ci0gICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRhcmcnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLSAgICAgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCi0gICAgICAjIEFsbCB0aGUgbGlicmFyeS1zcGVjaWZpYyB2YXJpYWJsZXMgKGluc3RhbGxfbGliZGlyIGlzIHNldCBhYm92ZSkuCi0gICAgICBsaWJyYXJ5X25hbWVzPQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICBkbG5hbWU9Ci0gICAgICBjdXJyZW50PTAKLSAgICAgIHJldmlzaW9uPTAKLSAgICAgIGFnZT0wCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRvYmpzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzOiRvYmpzIiAyPiYxCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgIyBIb3cgdGhlIGhlY2sgYXJlIHdlIHN1cHBvc2VkIHRvIHdyaXRlIGEgd3JhcHBlciBmb3IgYSBzaGFyZWQgbGlicmFyeT8KLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkb3V0cHV0JyBtYXkgbm90IGRlcGVuZCBvbiB1bmluc3RhbGxlZCBsaWJyYXJpZXM6JGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLSAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJHJwYXRoIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgd2l0aCBcYC1ycGF0aCciIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBzZXQgZHVtbXkgJHJwYXRoCi0gICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogaWdub3JpbmcgbXVsdGlwbGUgXGAtcnBhdGgncyBmb3IgYSBsaWJ0b29sIGxpYnJhcnkiIDE+JjIKLSAgICAgIGZpCi0gICAgICBpbnN0YWxsX2xpYmRpcj0iJDIiCi0KLSAgICAgICMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotICAgICAgc2V0IGR1bW15ICR2aW5mbwotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICAgIGlmIHRlc3QgLW4gIiQ1IjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciIDE+JjIKLSAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgdGVzdCAtbiAiJDIiICYmIGN1cnJlbnQ9IiQyIgotICAgICAgdGVzdCAtbiAiJDMiICYmIHJldmlzaW9uPSIkMyIKLSAgICAgIHRlc3QgLW4gIiQ0IiAmJiBhZ2U9IiQ0IgotCi0gICAgICAjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgotICAgICAgY2FzZSAiJGN1cnJlbnQiIGluCi0gICAgICAwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLSAgICAgICopCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgIGNhc2UgIiRyZXZpc2lvbiIgaW4KLSAgICAgIDAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotICAgICAgKikKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogUkVWSVNJT04gXGAkcmV2aXNpb24nIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICBjYXNlICIkYWdlIiBpbgotICAgICAgMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0gICAgICAqKQotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSAgICAgIGVzYWMKLQotICAgICAgaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIENhbGN1bGF0ZSB0aGUgdmVyc2lvbiB2YXJpYWJsZXMuCi0gICAgICB2ZXJzaW9uX3ZhcnM9InZlcnNpb25fdHlwZSBjdXJyZW50IGFnZSByZXZpc2lvbiIKLSAgICAgIGNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0gICAgICBub25lKSA7OwotCi0gICAgICBsaW51eCkKLSAgICAgICAgdmVyc2lvbl92YXJzPSIkdmVyc2lvbl92YXJzIG1ham9yIHZlcnN1ZmZpeCIKLSAgICAgICAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotICAgICAgICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLSAgICAgICAgOzsKLQotICAgICAgb3NmKQotICAgICAgICB2ZXJzaW9uX3ZhcnM9IiR2ZXJzaW9uX3ZhcnMgdmVyc3VmZml4IHZlcnN0cmluZyIKLSAgICAgICAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlYAotICAgICAgICB2ZXJzdWZmaXg9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgotICAgICAgICB2ZXJzdHJpbmc9IiR2ZXJzdWZmaXgiCi0KLSAgICAgICAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KLSAgICAgICAgbG9vcD0kYWdlCi0gICAgICAgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLSAgICAgICAgICBpZmFjZT1gZXhwciAkY3VycmVudCAtICRsb29wYAotICAgICAgICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotICAgICAgICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotICAgICAgICBkb25lCi0KLSAgICAgICAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgotICAgICAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotICAgICAgICA7OwotCi0gICAgICBzdW5vcykKLSAgICAgICAgdmVyc2lvbl92YXJzPSIkdmVyc2lvbl92YXJzIG1ham9yIHZlcnN1ZmZpeCIKLSAgICAgICAgbWFqb3I9IiRjdXJyZW50IgotICAgICAgICB2ZXJzdWZmaXg9IiRjdXJyZW50LiRyZXZpc2lvbiIKLSAgICAgICAgOzsKLQotICAgICAgKikKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0gICAgICAgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICAjIENyZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgb3IgcmVtb3ZlIG91ciBvdXRwdXRzIGlmIHdlIG5lZWQgdG8uCi0gICAgICBpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4KLSAgICAgICAgJHNob3cgIiRybSAkb2JqZGlyLyRvdXRwdXQgJG9iamRpci8kbGlibmFtZS4qICRvYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKLSAgICAgICAgJHJ1biAkcm0gJG9iamRpci8kb3V0cHV0ICRvYmpkaXIvJGxpYm5hbWUuKiAkb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKLSAgICAgIGVsc2UKLSAgICAgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotICAgICAgICAkcnVuICRta2RpciAkb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1lcSAwIHx8IHRlc3QgLWQgJG9iamRpcjsgdGhlbiA6Ci0JZWxzZQotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KLSAgICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgICAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQkgIGJ1aWxkX29sZF9saWJzPXllcwotICAgICAgICBmaQotICAgICAgZWxzZQotICAgICAgICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgotICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgotICAgICAgZmkKLQotICAgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBzeXN0ZW1zLgotICAgICAgZGVwZW5kZW5jeV9saWJzPSIkZGVwbGlicyIKLSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCi0gICAgICAgIGV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotICAgICAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLSAgICAgICAgcmVhbG5hbWU9IiQyIgotICAgICAgICBzaGlmdDsgc2hpZnQKLQotICAgICAgICBpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCi0gICAgICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgotICAgICAgICBlbHNlCi0gICAgICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCi0gICAgICAgIGZpCi0KLSAgICAgICAgbGliPSIkb2JqZGlyLyRyZWFsbmFtZSIKLQlmb3IgbGluawotCWRvCi0JICBsaW5rbmFtZXM9IiRsaW5rbmFtZXMgJGxpbmsiCi0JZG9uZQotCi0gICAgICAgICMgVXNlIHN0YW5kYXJkIG9iamVjdHMgaWYgdGhleSBhcmUgUElDLgotICAgICAgICB0ZXN0IC16ICIkcGljX2ZsYWciICYmIGxpYm9ianM9YCRlY2hvICJYJGxpYm9ianMgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vZydgCi0KLSAgICAgICAgIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgotICAgICAgICBldmFsIGNtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKLSAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgICAgZG9uZQotICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgICAjIENyZWF0ZSBsaW5rcyB0byB0aGUgcmVhbCBsaWJyYXJ5LgotICAgICAgICBmb3IgbGlua25hbWUgaW4gJGxpbmtuYW1lczsgZG8KLSAgICAgICAgICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0gICAgICAgICAgJHJ1biBldmFsICcoY2QgJG9iamRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotICAgICAgICBkb25lCi0KLSAgICAgICAgIyBJZiAtZXhwb3J0LWR5bmFtaWMgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBkbG5hbWUuCi0gICAgICAgIGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KLSAgICAgICAgICBkbG5hbWU9IiRzb25hbWUiCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KLSAgICAgIG9sZGxpYj0iJG9iamRpci8kbGlibmFtZS5hIgotICAgICAgOzsKLQotICAgICoubG8gfCAqLm8pCi0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBsaW5rIGxpYnRvb2wgbGlicmFyaWVzIGludG8gcmVsb2FkYWJsZSBvYmplY3RzIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgotICAgICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0gICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgICAqLmxvKQotICAgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKLSAgICAgICAgbGlib2JqPSIkb3V0cHV0IgotICAgICAgICBvYmo9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAncy9cLmxvJC8uby8nYAotICAgICAgICA7OwotICAgICAgKikKLSAgICAgICAgbGlib2JqPQotICAgICAgICBvYmo9IiRvdXRwdXQiCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyJgJGVjaG8gIlgkbGlib2JqcyAiIHwgJFhzZWQgLWUgJ3MvW14gICAgICAgXSpcLmEgLy9nJyAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvL2cnYAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiBleGl0IDAKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0gICAgICAgICMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0Ci0gICAgICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0gICAgICAgICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0gICAgICAgICRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIiB8fCBleGl0ICQ/Ci0gICAgICAgIGV4aXQgMAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIjsgdGhlbgotICAgICAgICAjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotICAgICAgICByZWxvYWRfb2Jqcz0iJGxpYm9ianMiCi0gICAgICAgIG91dHB1dD0iJGxpYm9iaiIKLSAgICAgICAgZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKLSAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgICAgZG9uZQotICAgICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgIGVsc2UKLSAgICAgICAgIyBKdXN0IGNyZWF0ZSBhIHN5bWxpbmsuCi0gICAgICAgICRzaG93ICIkTE5fUyAkb2JqICRsaWJvYmoiCi0gICAgICAgICRydW4gJExOX1MgJG9iaiAkbGlib2JqIHx8IGV4aXQgMQotICAgICAgZmkKLQotICAgICAgZXhpdCAwCi0gICAgICA7OwotCi0gICAgKikKLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIHdoaWxlIGxpbmtpbmcgcHJvZ3JhbXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCi0JZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLSAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAgICAgICAgICAgIyBQdXQgdGhlIG1hZ2ljIGxpYmRpciB3aXRoIHRoZSBoYXJkY29kZSBmbGFnLgotICAgICAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0gICAgICAgICAgICAgICAgbGliZGlyPSJASEFSRENPREVfTElCRElSU0AiCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JCWNhc2UgIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgaW4KLQkJKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQkgIDs7Ci0JCSopCi0JCSAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCi0JCSAgOzsKLQkJZXNhYwotICAgICAgICAgICAgICAgIGxpYmRpcj0KLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiOyB0aGVuCi0gICAgICAgICAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGZsYWciCi0gICAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRmbGFnIgotICAgICAgICAgICAgZmkKLSAgICAgICAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLSAgICAgICAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KLSAgICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0gICAgICAgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OwotICAgICAgICAgICAgZXNhYwotICAgICAgICAgIGZpCi0JZG9uZQotICAgICAgZmkKLQotICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBjb21waWxlIGNvbW1hbmRzLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQEhBUkRDT0RFX0xJQkRJUlNAJSRoYXJkY29kZV9saWJkaXJzJWciYAotCWZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQEhBUkRDT0RFX0xJQkRJUlNAJSRoYXJkY29kZV9saWJkaXJzJWciYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGxpYm9ianMiICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy8nYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvLydgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzICYmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgICAgICAgZGxzeW1zPSIke291dHB1dH1TLmMiCi0gICAgICBlbHNlCi0gICAgICAgIGRsc3ltcz0KLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0gICAgICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBwcmVsb2FkZWQgbGlzdC4KLSAgICAgICAgZGxwcmVmaWxlcz1gJGVjaG8gIlgkb2JqcyRkbHByZWZpbGVzICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvLydgCi0KLQkjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgotICAgICAgICBubGlzdD0iJG9iamRpci8ke291dHB1dH0ubm0iCi0KLQlpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4KLQkgICRzaG93ICIkcm0gJG5saXN0ICR7bmxpc3R9VCIKLQkgICRydW4gJHJtICIkbmxpc3QiICIke25saXN0fVQiCi0JZWxzZQotCSAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotCSAgJHJ1biAkbWtkaXIgJG9iamRpcgotCSAgc3RhdHVzPSQ/Ci0JICBpZiB0ZXN0ICRzdGF0dXMgLWVxIDAgfHwgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKLQkgIGVsc2UKLQkgICAgZXhpdCAkc3RhdHVzCi0JICBmaQotCWZpCi0KLSAgICAgICAgZm9yIGFyZyBpbiAkZGxwcmVmaWxlczsgZG8KLQkgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0gICAgICAgIGRvbmUKLQotICAgICAgICAjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgotICAgICAgICAkc2hvdyAiY3JlYXRpbmcgJG9iamRpci8kZGxzeW1zIgotICAgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSAgIyBNYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSBhbiBlbXB0eSBmaWxlLgotCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JICAgIG12IC1mICIkbmxpc3QiVCAiJG5saXN0IgotCSAgICB3Y291dD1gd2MgIiRubGlzdCIgMj4vZGV2L251bGxgCi0JICAgIGNvdW50PWBlY2hvICJYJHdjb3V0IiB8ICRYc2VkIC1lICdzL15bIAldKlwoWzAtOV1bMC05XSpcKS4qJC9cMS8nYAotCSAgICAodGVzdCAiJGNvdW50IiAtZ2UgMCkgMj4vZGV2L251bGwgfHwgY291bnQ9LTEKLQkgIGVsc2UKLQkgICAgJHJtICIkbmxpc3QiVAotCSAgICBjb3VudD0tMQotCSAgZmkKLQotCSAgY2FzZSAiJGRsc3ltcyIgaW4KLQkgICIiKSA7OwotCSAgKi5jKQotCSAgICAkZWNobyA+ICIkb2JqZGlyLyRkbHN5bXMiICJcCi0vKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dCcgZGxzeW0gZW11bGF0aW9uLiAqLwotLyogR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIFwiQ1wiIHsKLSNlbmRpZgotCi0vKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLwotI2RlZmluZSBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudCBzb21lX290aGVyX3N5bWJvbAotI2RlZmluZSBkbGRfcHJlbG9hZGVkX3N5bWJvbHMgc29tZV9vdGhlcl9zeW1ib2wKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGNvbXBpbGVyLiAqL1wKLSIKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiOyB0aGVuCi0JICAgICAgc2VkIC1lICdzL14uKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy8nIDwgIiRubGlzdCIgPj4gIiRvYmpkaXIvJGRsc3ltcyIKLQkgICAgZWxzZQotCSAgICAgIGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKLQotI3VuZGVmIGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50Ci0jdW5kZWYgZGxkX3ByZWxvYWRlZF9zeW1ib2xzCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIF9fcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgX19wdHJfdCBjaGFyICoKLSNlbmRpZgotCi0vKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gZGxkX3ByZWxvYWRlZF9zeW1ib2xzLCAtMSBpZiB1bnNvcnRlZC4gKi8KLWludCBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudCA9ICRjb3VudDsKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1zdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICBfX3B0cl90IGFkZHJlc3M7CisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCiB9Ci1kbGRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgogCi0JICAgIGlmIHRlc3QgLWYgIiRubGlzdCI7IHRoZW4KLQkgICAgICBzZWQgJ3MvXlwoLipcKSBcKC4qXCkkLyAgeyJcMSIsIChfX3B0cl90KSBcJlwyfSwvJyA8ICIkbmxpc3QiID4+ICIkb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvYmpkaXIvJGRsc3ltcyIgIlwKLSAgezAsIChfX3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCiskb3B0X2hlbHAgfHwgewordGVzdCAiJG1vZGUiID0gY29tcGlsZSAmJiBmdW5jX21vZGVfY29tcGlsZSAkezErIiRAIn0KIH0KLSNlbmRpZlwKLSIKLQkgICAgOzsKIAotCSAgKikKLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBzdWZmaXggZm9yIFxgJGRsc3ltcyciIDE+JjIKLQkgICAgZXhpdCAxCi0JICAgIDs7Ci0JICBlc2FjCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBOb3cgY29tcGlsZSB0aGUgZHluYW1pYyBzeW1ib2wgZmlsZS4KLSAgICAgICAgJHNob3cgIihjZCAkb2JqZGlyICYmICRDQyAtYyRub19idWlsdGluX2ZsYWcgXCIkZGxzeW1zXCIpIgotICAgICAgICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRDQyAtYyRub19idWlsdGluX2ZsYWcgIiRkbHN5bXMiKScgfHwgZXhpdCAkPwotCi0gICAgICAgICMgVHJhbnNmb3JtIHRoZSBzeW1ib2wgZmlsZSBpbnRvIHRoZSBjb3JyZWN0IG5hbWUuCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMubyUiYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb2JqZGlyLyR7b3V0cHV0fVMubyUiYAotICAgICAgZWxpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiICE9IHllczsgdGhlbgotICAgICAgICB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiAmJiAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGFuZCBcYC1kbHByZW9wZW4nIGFyZSBpZ25vcmVkIHdpdGhvdXQgXGAtZXhwb3J0LWR5bmFtaWMnIiAxPiYyCi0gICAgICBlbHNlCi0gICAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCi0gICAgICAgICMgZGxkX3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCi0gICAgICAgICMgcmVhbGx5IHdhcyByZXF1aXJlZC4KLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCi0KLSAgICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KLSAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgotICAgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCi0gICAgICAgICMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgotICAgICAgICAkc2hvdyAiJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgICAgJHJ1biBldmFsICIkY29tcGlsZV9jb21tYW5kIgotICAgICAgICBleGl0ICQ/Ci0gICAgICBmaQotCi0gICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCi0gICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvYmpkaXIvJG91dHB1dCInJWcnYAotICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvYmpkaXIvJG91dHB1dCInVCVnJ2AKLQotICAgICAgIyBDcmVhdGUgdGhlIGJpbmFyeSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeSwgdGhlbiB3cmFwIGl0LgotICAgICAgaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKLSAgICAgIGVsc2UKLSAgICAgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotCSRydW4gJG1rZGlyICRvYmpkaXIKLQlzdGF0dXM9JD8KLQlpZiB0ZXN0ICRzdGF0dXMgLWVxIDAgfHwgdGVzdCAtZCAkb2JqZGlyOyB0aGVuIDoKLQllbHNlCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgotICAgICAgICBycGF0aD0KLSAgICAgICAgZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KLSAgICAgICAgICBjYXNlICIkZGlyIiBpbgotICAgICAgICAgIC8qIHwgW0EtWmEtel06XFwqKQotICAgICAgICAgICAgIyBBYnNvbHV0ZSBwYXRoLgotICAgICAgICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotICAgICAgICAgICAgOzsKLSAgICAgICAgICAqKQotICAgICAgICAgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotICAgICAgICAgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICAgZXNhYwotICAgICAgICBkb25lCi0gICAgICAgIHRlbXBfcnBhdGg9IiRycGF0aCIKLSAgICAgIGZpCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb3V0cHV0IGZpbGUuCi0gICAgICAkcnVuICRybSAkb3V0cHV0Ci0KLSAgICAgIGlmIHRlc3QgLW4gIiRjb21waWxlX3NobGlicGF0aCI7IHRoZW4KLSAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRjb21waWxlX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCi0gICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCi0gICAgICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0gICAgICAgIHJwYXRoPQotICAgICAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbwotICAgICAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLSAgICAgICAgZG9uZQotICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRydW5wYXRoX3Zhcj1cIiRycGF0aFwkJHJ1bnBhdGhfdmFyXCIgJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAkZmluYWxpemVfY29tbWFuZCIKLSAgICAgIGZpCi0KLSAgICAgIGNhc2UgIiRoYXJkY29kZV9hY3Rpb24iIGluCi0gICAgICByZWxpbmspCi0gICAgICAgICMgQUdIISBGbGFtZSB0aGUgQUlYIGFuZCBIUC1VWCBwZW9wbGUgZm9yIG1lLCB3aWxsIHlhPwotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1c2luZyBhIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKLSAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogcmVsaW5raW5nIHdpbGwgYmUgcmVxdWlyZWQgYmVmb3JlIFxgJG91dHB1dCcgY2FuIGJlIGluc3RhbGxlZCIgMT4mMgotICAgICAgICA7OwotICAgICAgZXNhYwotCi0gICAgICAkc2hvdyAiJGNvbXBpbGVfY29tbWFuZCIKLSAgICAgICRydW4gZXZhbCAiJGNvbXBpbGVfY29tbWFuZCIgfHwgZXhpdCAkPwotCi0gICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgotICAgICAgJHNob3cgImNyZWF0aW5nICRvdXRwdXQiCi0KLSAgICAgICMgUXVvdGUgdGhlIGZpbmFsaXplIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgotICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgotICAgICAgcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCi0gICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG91ciBydW4gY29tbWFuZCBpcyBub24tbnVsbC4KLSAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0gICAgICAgICRybSAkb3V0cHV0Ci0gICAgICAgIHRyYXAgIiRybSAkb3V0cHV0OyBleGl0IDEiIDEgMiAxNQotCi0gICAgICAgICRlY2hvID4gJG91dHB1dCAiXAotIyEgL2Jpbi9zaAotCi0jICRvdXRwdXQgLSB0ZW1wb3Jhcnkgd3JhcHBlciBzY3JpcHQgZm9yICRvYmpkaXIvJG91dHB1dAotIyBHZW5lcmF0ZWQgYnkgbHRtYWluLnNoIC0gR05VICRQQUNLQUdFICRWRVJTSU9OCi0jCi0jIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0jCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiBcYGBwd2RgJy4KLSMgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIHMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgXCJcJHtDRFBBVEgrc2V0fVwiID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLSMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBkZXRlcm1pbmVzIG91ciBvcGVyYXRpb24gbW9kZS4KLWlmIHRlc3QgXCJcJGxpYnRvb2xfaW5zdGFsbF9tYWdpY1wiID0gXCIkbWFnaWNcIjsgdGhlbgotICAjIGluc3RhbGwgbW9kZSBuZWVkcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKLSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0nJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMnCi0gIGZpbmFsaXplX2NvbW1hbmQ9XCIkZmluYWxpemVfY29tbWFuZFwiCi1lbHNlCi0gICMgV2hlbiB3ZSBhcmUgc291cmNlZCBpbiBleGVjdXRlIG1vZGUsIFwkZmlsZSBhbmQgXCRlY2hvIGFyZSBhbHJlYWR5IHNldC4KLSAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG89XCIkcWVjaG9cIgotICAgIGZpbGU9XCJcJDBcIgotICBmaVwKLSIKLSAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotCi0gICMgRmluZCB0aGUgZGlyZWN0b3J5IHRoYXQgdGhpcyBzY3JpcHQgbGl2ZXMgaW4uCi0gIHRoaXNkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qJCUlJ1xgCi0gIHRlc3QgXCJ4XCR0aGlzZGlyXCIgPSBcInhcJGZpbGVcIiAmJiB0aGlzZGlyPS4KLQotICAjIEZvbGxvdyBzeW1ib2xpYyBsaW5rcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHJlYWwgdGhpc2Rpci4KLSAgZmlsZT1cYGxzIC1sZCBcIlwkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIHdoaWxlIHRlc3QgLW4gXCJcJGZpbGVcIjsgZG8KLSAgICBkZXN0ZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKlwkJSUnXGAKLQotICAgICMgSWYgdGhlcmUgd2FzIGEgZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBjaGFuZ2UgdGhpc2Rpci4KLSAgICBpZiB0ZXN0IFwieFwkZGVzdGRpclwiICE9IFwieFwkZmlsZVwiOyB0aGVuCi0gICAgICBjYXNlIFwiXCRkZXN0ZGlyXCIgaW4KLSAgICAgIC8qIHwgW0EtWmEtel06XFwqKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKLSAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKLSAgICAgIGVzYWMKLSAgICBmaQotCi0gICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKLSAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgc2VkIC1uICdzLy4qLT4gLy9wJ1xgCi0gIGRvbmUKLQotICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgotICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCi0gIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCi0KLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSAgcHJvZ3JhbT0nJG91dHB1dCcKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0gICAgICAgICMgRXhwb3J0IG91ciBzaGxpYnBhdGhfdmFyIGlmIHdlIGhhdmUgb25lLgotICAgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCi0gICAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XGBcJGVjaG8gXCJYXCQkc2hsaWJwYXRoX3ZhclwiIHwgXCRYc2VkIC1lICdzLzoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0gICAgICAgIGZpCi0KLSAgICAgICAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICAgICMgUnVuIHRoZSBhY3R1YWwgcHJvZ3JhbSB3aXRoIG91ciBhcmd1bWVudHMuCi0KLSAgICAgICMgRXhwb3J0IHRoZSBwYXRoIHRvIHRoZSBwcm9ncmFtLgotICAgICAgUEFUSD1cIlwkcHJvZ2RpcjpcJFBBVEhcIgotICAgICAgZXhwb3J0IFBBVEgKLQotICAgICAgZXhlYyBcJHByb2dyYW0gXCR7MStcIlwkQFwifQotCi0gICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0gIGVsc2UKLSAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCi0gICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXCRwcm9nZGlyL1wkcHJvZ3JhbSBkb2VzIG5vdCBleGlzdFwiIDE+JjIKLSAgICBcJGVjaG8gXCJUaGlzIHNjcmlwdCBpcyBqdXN0IGEgd3JhcHBlciBmb3IgXCRwcm9ncmFtLlwiIDE+JjIKLSAgICBlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpXAotIgotICAgICAgICBjaG1vZCAreCAkb3V0cHV0Ci0gICAgICBmaQotICAgICAgZXhpdCAwCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgU2VlIGlmIHdlIG5lZWQgdG8gYnVpbGQgYW4gb2xkLWZhc2hpb25lZCBhcmNoaXZlLgotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSAieWVzIjsgdGhlbgotICAgICAgIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotICAgICAgb2xkb2Jqcz0iJG9ianMiYCRlY2hvICJYJGxpYm9ianMgIiB8ICRYc2VkIC1lICdzL1teICAgXSpcLmEgLy9nJyAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvL2cnYAotCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXCIKLSAgICAgIGVsc2UKLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfY21kc1wiCi0gICAgICBmaQotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBmaQotCi0gICAgIyBOb3cgY3JlYXRlIHRoZSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAqLmxhKQotICAgICAgb2xkX2xpYnJhcnk9Ci0gICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzICYmIG9sZF9saWJyYXJ5PSIkbGlibmFtZS5hIgotCi0gICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgICAkZWNobyA+ICRvdXRwdXQgIlwKLSMgJG91dHB1dCAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKLSMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTgotCi0jIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KLWRsbmFtZT0nJGRsbmFtZScKLQotIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCi1saWJyYXJ5X25hbWVzPSckbGlicmFyeV9uYW1lcycKLQotIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCi1vbGRfbGlicmFyeT0nJG9sZF9saWJyYXJ5JwotCi0jIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLWRlcGVuZGVuY3lfbGlicz0nJGRlcGVuZGVuY3lfbGlicycKLQotIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciAkbGlibmFtZS4KLWN1cnJlbnQ9JGN1cnJlbnQKLWFnZT0kYWdlCi1yZXZpc2lvbj0kcmV2aXNpb24KLQotIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgotbGliZGlyPSckaW5zdGFsbF9saWJkaXInXAotIgotICAgICAgZmkKLQotICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgotICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KLSAgICAgICRzaG93ICIoY2QgJG9iamRpciAmJiAkTE5fUyAuLi8kb3V0cHV0ICRvdXRwdXQpIgotICAgICAgJHJ1biBldmFsICIoY2QgJG9iamRpciAmJiAkTE5fUyAuLi8kb3V0cHV0ICRvdXRwdXQpIiB8fCBleGl0IDEKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQotICBpbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCi0KLSAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCAvYmluL3NoIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiOyB0aGVuCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgICBhcmc9YCRlY2hvICJYJG5vbm9wdCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKLSAgICAgIGFyZz0iJDEiCi0gICAgICBzaGlmdAotICAgIGVsc2UKLSAgICAgIGluc3RhbGxfcHJvZz0KLSAgICAgIGFyZz0iJG5vbm9wdCIKLSAgICBmaQotCi0gICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgotICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KLSAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgY2FzZSAiJGFyZyIgaW4KLSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLSAgICAgIGFyZz0iXCIkYXJnXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2ckYXJnIgotCi0gICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgotICAgIGRlc3Q9Ci0gICAgZmlsZXM9Ci0gICAgb3B0cz0KLSAgICBwcmV2PQotICAgIGluc3RhbGxfdHlwZT0KLSAgICBpc2Rpcj0KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0gICAgICAgIGZpbGVzPSIkZmlsZXMgJGRlc3QiCi0gICAgICAgIGRlc3Q9IiRhcmciCi0gICAgICAgIGNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpIHByZXY9Ii1mIiA7OwotICAgICAgLWcpIHByZXY9Ii1nIiA7OwotICAgICAgLW0pIHByZXY9Ii1tIiA7OwotICAgICAgLW8pIHByZXY9Ii1vIiA7OwotICAgICAgLXMpCi0gICAgICAgIHN0cmlwbWU9IiAtcyIKLSAgICAgICAgY29udGludWUKLSAgICAgICAgOzsKLSAgICAgIC0qKSA7OwotCi0gICAgICAqKQotICAgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCi0gICAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgICAgICAgIHByZXY9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkZXN0PSIkYXJnIgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZpCi0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCi0gICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JYXJnPSJcIiRhcmdcIiIKLQk7OwotICAgICAgZXNhYwotICAgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nICRhcmciCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAteiAiJGluc3RhbGxfcHJvZyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gaW5zdGFsbCBwcm9ncmFtIiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXogIiRmaWxlcyI7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogIiRkZXN0IjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24iIDE+JjIKLSAgICAgIGZpCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIFN0cmlwIGFueSB0cmFpbGluZyBzbGFzaCBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLSAgICBkZXN0PWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS8kJSUnYAotCi0gICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnkuCi0gICAgdGVzdCAtZCAiJGRlc3QiICYmIGlzZGlyPXllcwotICAgIGlmIHRlc3QgLW4gIiRpc2RpciI7IHRoZW4KLSAgICAgIGRlc3RkaXI9IiRkZXN0IgotICAgICAgZGVzdG5hbWU9Ci0gICAgZWxzZQotICAgICAgZGVzdGRpcj1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGRlc3QiICYmIGRlc3RkaXI9LgotICAgICAgZGVzdG5hbWU9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgotICAgICAgc2V0IGR1bW15ICRmaWxlcwotICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgotICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKLSAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgZmkKLSAgICBmaQotICAgIGNhc2UgIiRkZXN0ZGlyIiBpbgotICAgIC8qIHwgW0EtWmEtel06XFwqKSA7OwotICAgICopCi0gICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgICAqLmxvKSA7OwotICAgICAgICAqKQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKLSAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmEpCi0gICAgICAgICMgRG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbGF0ZXIuCi0gICAgICAgIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgorZnVuY19tb2RlX2hlbHAgKCkKK3sKKyAgICAjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KKyAgICBjYXNlICRtb2RlIGluCisgICAgICAiIikKKyAgICAgICAgIyBHZW5lcmljIGhlbHAgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVzYWdlIGNvbW1lbnRzCisgICAgICAgICMgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZmlsZS4KKyAgICAgICAgZnVuY19oZWxwCiAgICAgICAgIDs7CiAKLSAgICAgICoubGEpCi0gICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCi0gICAgICAgIGlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLSAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgZmkKKyAgICAgIGNsZWFuKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgogCi0gICAgICAgIGxpYnJhcnlfbmFtZXM9Ci0gICAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLSAgICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLSAgICAgICAgKikgLiAuLyRmaWxlIDs7Ci0gICAgICAgIGVzYWMKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCiAKLSAgICAgICAgIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotICAgICAgICBpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgotICAgICAgICAgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgotICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7Ci0gICAgICAgICAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7Ci0gICAgICAgICAgZXNhYwotICAgICAgICBlbHNlCi0gICAgICAgICAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgotICAgICAgICAgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCi0gICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKLSAgICAgICAgICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7Ci0gICAgICAgICAgZXNhYwotICAgICAgICBmaQorUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KIAotICAgICAgICBkaXI9ImAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgLyIKLSAgICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KLSAgICAgICAgZGlyPSIkZGlyJG9iamRpciIKLQotICAgICAgICAjIFNlZSB0aGUgbmFtZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLSAgICAgICAgaWYgdGVzdCAtbiAiJDIiOyB0aGVuCi0gICAgICAgICAgcmVhbG5hbWU9IiQyIgotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgc2hpZnQKLQotICAgICAgICAgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KLSAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCi0gICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPwotICAgICAgICAgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJHJlYWxuYW1lIiAmJiBkbG5hbWU9Ci0KLSAgICAgICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgICAgICAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLgotICAgICAgICAgICAgcm1jbWQ9IiRybSIKLSAgICAgICAgICAgIGZvciBsaW5rbmFtZQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgcm1jbWQ9IiRybWNtZCAkZGVzdGRpci8kbGlua25hbWUiCi0gICAgICAgICAgICBkb25lCi0gICAgICAgICAgICAkc2hvdyAiJHJtY21kIgotICAgICAgICAgICAgJHJ1biAkcm1jbWQKLQotICAgICAgICAgICAgIyAuLi4gYW5kIGNyZWF0ZSBuZXcgb25lcy4KLSAgICAgICAgICAgIGZvciBsaW5rbmFtZQotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgdGVzdCAiWCRkbG5hbWUiID0gIlgkbGlua25hbWUiICYmIGRsbmFtZT0KLSAgICAgICAgICAgICAgJHNob3cgIihjZCAkZGVzdGRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLSAgICAgICAgICAgICAgJHJ1biBldmFsICIoY2QgJGRlc3RkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0gICAgICAgICAgICBkb25lCi0gICAgICAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCi0gICAgICAgICAgICAjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5LWxvYWRhYmxlIGxpYnJhcnkuCi0gICAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIKLSAgICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIgfHwgZXhpdCAkPwotICAgICAgICAgIGZpCi0KLSAgICAgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICAgICAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCi0gICAgICAgICAgZXZhbCBjbWRzPVwiJHBvc3RpbnN0YWxsX2NtZHNcIgotICAgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCi0gICAgICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLSAgICAgICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAgICAgJHNob3cgIiRjbWQiCi0gICAgICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgICAgICBkb25lCi0gICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICAgIGZpCi0KLSAgICAgICAgIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCi0gICAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RkaXIvJG5hbWUiCi0gICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPwotCi0gICAgICAgICMgTWF5YmUgaW5zdGFsbCB0aGUgc3RhdGljIGxpYnJhcnksIHRvby4KLSAgICAgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKICAgICAgICAgOzsKIAotICAgICAgKi5sbykKLSAgICAgICAgIyBJbnN0YWxsIChpLmUuIGNvcHkpIGEgbGlidG9vbCBvYmplY3QuCisgICAgICBjb21waWxlKQorICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKIAotICAgICAgICAjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0gICAgICAgIGlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLSAgICAgICAgICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgotICAgICAgICBlbHNlCi0gICAgICAgICAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICAgICAgICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgotICAgICAgICBmaQorQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgogCi0gICAgICAgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0gICAgICAgIGNhc2UgIiRkZXN0ZmlsZSIgaW4KLSAgICAgICAgKi5sbykKLSAgICAgICAgICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKLSAgICAgICAgICA7OwotICAgICAgICAqLm8pCi0gICAgICAgICAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgotICAgICAgICAgIGRlc3RmaWxlPQotICAgICAgICAgIDs7Ci0gICAgICAgICopCi0gICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKLSAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgICAgICBleGl0IDEKLSAgICAgICAgICA7OwotICAgICAgICBlc2FjCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKIAotICAgICAgICAjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KLSAgICAgICAgaWYgdGVzdCAtbiAiJGRlc3RmaWxlIjsgdGhlbgotICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKLSAgICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0gICAgICAgIGZpCisgIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQorICAtbm8tc3VwcHJlc3MgICAgICBkbyBub3Qgc3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGZvciBtdWx0aXBsZSBwYXNzZXMKKyAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKKyAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1zaGFyZWQgICAgICAgICAgIGRvIG5vdCBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisgIC1zdGF0aWMgICAgICAgICAgIG9ubHkgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZwogCi0gICAgICAgICMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgotICAgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICAgICAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLSAgICAgICAgICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCitDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQorZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KIAotICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRzdGF0aWNvYmogJHN0YXRpY2Rlc3QiCi0gICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPwotICAgICAgICBmaQotICAgICAgICBleGl0IDAKK1RoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQorU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCitsaWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCisgICAgICAgIDs7CisKKyAgICAgIGV4ZWN1dGUpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCisKK0F1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAorCitUaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCitmbGFncy4KKworSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAoraW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5CitkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KKworVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCisgICAgICAgIDs7CisKKyAgICAgIGZpbmlzaCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgorCitDb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgorCitFYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgorCitUaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKK3RoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgorICAgICAgICA7OworCisgICAgICBpbnN0YWxsKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KKworSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCisKK0lOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQorZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBJTlNUQUxMLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1pbnN0LXByZWZpeCBQUkVGSVgtRElSICBVc2UgUFJFRklYLURJUiBhcyBhIHN0YWdpbmcgYXJlYSBmb3IgaW5zdGFsbGF0aW9uCisKK1RoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5CitCU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKKyAgICAgICAgOzsKKworICAgICAgbGluaykKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCisKK0xpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KK2NyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCisKK0xJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQorYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCisKK1RoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgorCisgIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAorICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKKyAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCisgIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCisgIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCisgIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCisgICAgICAgICAgICAgICAgICAgIHRyeSB0byBleHBvcnQgb25seSB0aGUgc3ltYm9scyBsaXN0ZWQgaW4gU1lNRklMRQorICAtZXhwb3J0LXN5bWJvbHMtcmVnZXggUkVHRVgKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCisgIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCisgIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCisgIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKKyAgLXNoYXJlZCAgICAgICAgICAgb25seSBkbyBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXNocmV4dCBTVUZGSVggICAgb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIHNoYXJlZCBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uCisgIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzCisgIC1zdGF0aWMtbGlidG9vbC1saWJzCisgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKyAgLXdlYWsgTElCTkFNRSAgICAgZGVjbGFyZSB0aGF0IHRoZSB0YXJnZXQgcHJvdmlkZXMgdGhlIExJQk5BTUUgaW50ZXJmYWNlCisKK0FsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCisKK0V2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCit0cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQorb2JqZWN0IGZpbGVzLgorCitJZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKK29ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKK3JlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAordXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCisKK0lmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCitpcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgorICAgICAgICA7OworCisgICAgICB1bmluc3RhbGwpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCitPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCiAgICAgICAgIDs7CiAKICAgICAgICopCi0gICAgICAgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLSAgICAgICAgaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLSAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPQotCi0gICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0gICAgICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAgICAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotICAgICAgICAgICopIC4gLi8kZmlsZSA7OwotICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgotICAgICAgICAgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiB8fCB0ZXN0IC16ICIkZmluYWxpemVfY29tbWFuZCI7IHRoZW4KLSAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgotICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgZmkKLQotICAgICAgICAgIGZpbmFsaXplPXllcwotICAgICAgICAgIGZvciBsaWIgaW4gJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM7IGRvCi0gICAgICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCi0gICAgICAgICAgICBsaWJkaXI9Ci0gICAgICAgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgotICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLSAgICAgICAgICAgICAgY2FzZSAiJGxpYiIgaW4KLSAgICAgICAgICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7Ci0gICAgICAgICAgICAgICopIC4gLi8kbGliIDs7Ci0gICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBsaWJmaWxlPSIkbGliZGlyL2AkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgIgotICAgICAgICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KLSAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBjb250YWlucyBubyAtcnBhdGggaW5mb3JtYXRpb24iIDE+JjIKLSAgICAgICAgICAgIGVsaWYgdGVzdCAtZiAiJGxpYmZpbGUiOyB0aGVuIDoKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKLSAgICAgICAgICAgICAgZmluYWxpemU9bm8KLSAgICAgICAgICAgIGZpCi0gICAgICAgICAgZG9uZQotCi0gICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLSAgICAgICAgICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVsaW5raW5nIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKLSAgICAgICAgICAgICAgJHNob3cgIiRmaW5hbGl6ZV9jb21tYW5kIgotICAgICAgICAgICAgICBpZiAkcnVuIGV2YWwgIiRmaW5hbGl6ZV9jb21tYW5kIjsgdGhlbiA6Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICBmaWxlPSIkb2JqZGlyLyRmaWxlIlQKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCi0gICAgICAgICAgICBmaQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KLQkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKLSAgICAgICAgICBmaQotICAgICAgICBmaQotCi0gICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3QiCi0gICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0IiB8fCBleGl0ICQ/CisgICAgICAgIGZ1bmNfZmF0YWxfaGVscCAiaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIKICAgICAgICAgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCisgICAgZXNhYwogCi0gICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgJEVDSE8KKyAgICAkRUNITyAiVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgogCi0gICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCi0gICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorICAgIGV4aXQgJD8KK30KIAotICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKLSAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KKyAgIyBOb3cgdGhhdCB3ZSd2ZSBjb2xsZWN0ZWQgYSBwb3NzaWJsZSAtLW1vZGUgYXJnLCBzaG93IGhlbHAgaWYgbmVjZXNzYXJ5CisgICRvcHRfaGVscCAmJiBmdW5jX21vZGVfaGVscAogCi0gICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0gICAgICBldmFsIGNtZHM9XCIkb2xkX3Bvc3RpbnN0YWxsX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0gICAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBkb25lCiAKLSAgICBpZiB0ZXN0IC1uICIkZnV0dXJlX2xpYmRpcnMiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIiAxPiYyCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRjdXJyZW50X2xpYmRpcnMiOyB0aGVuCi0gICAgICAjIE1heWJlIGp1c3QgZG8gYSBkcnkgcnVuLgotICAgICAgdGVzdCAtbiAiJHJ1biIgJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgotICAgICAgZXhlYyAkU0hFTEwgJDAgLS1maW5pc2gkY3VycmVudF9saWJkaXJzCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZmluaXNoIG1vZGUKLSAgZmluaXNoKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGZpbmlzaCIKLSAgICBsaWJkaXJzPSIkbm9ub3B0IgotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0gICAgICAgIGxpYmRpcnM9IiRsaWJkaXJzICRkaXIiCi0gICAgICBkb25lCi0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzIjsgdGhlbgotCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGZpbmlzaCBjb21tYW5kcy4KLQkgIGV2YWwgY21kcz1cIiRmaW5pc2hfY21kc1wiCi0gICAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLSAgICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotICAgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgICAgICAgICAkc2hvdyAiJGNtZCIKLSAgICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIKLSAgICAgICAgICBkb25lCi0gICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCi0JICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCi0JICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgotCSAgJHJ1biBldmFsICIkY21kcyIKLQlmaQotICAgICAgZG9uZQotICAgIGZpCi0KLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgotICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCi0gICAgICBlY2hvICIgICAkbGliZGlyIgotICAgIGRvbmUKLSAgICBlY2hvCi0gICAgZWNobyAiVG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwiCi0gICAgZWNobyAieW91IG11c3QgdXNlIHRoZSBcYC1MTElCRElSJyBmbGFnIGR1cmluZyBsaW5raW5nLiIKLSAgICBlY2hvCi0gICAgZWNobyAiIFlvdSB3aWxsIGFsc28gbmVlZCB0byBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBsaWJkaXI9TElCRElSCi0gICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLSAgICAgIGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKLSAgICBmaQotICAgIGVjaG8KLSAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCi0gIGV4ZWN1dGUpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKLQorIyBmdW5jX21vZGVfZXhlY3V0ZSBhcmcuLi4KK2Z1bmNfbW9kZV9leGVjdXRlICgpCit7CisgICAgJG9wdF9kZWJ1ZwogICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCiAgICAgY21kPSIkbm9ub3B0IgotICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIgotICAgICAgZXhpdCAxCi0gICAgZmkKKyAgICB0ZXN0IC16ICIkY21kIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIgogCiAgICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KICAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQorICAgICAgdGVzdCAtZiAiJGZpbGUiIFwKKwl8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiCiAKICAgICAgIGRpcj0KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgY2FzZSAkZmlsZSBpbgogICAgICAgKi5sYSkKLSAgICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLSAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLSAgICAgICAgZWxzZQotICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIiAxPiYyCi0gICAgICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAorCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIKIAogCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgogCWRsbmFtZT0KIAlsaWJyYXJ5X25hbWVzPQotCi0gICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRmaWxlIiBpbgotCSovKiB8ICpcXCopIC4gJGZpbGUgOzsKLSAgICAgICAgKikgLiAuLyRmaWxlIDs7Ci0JZXNhYworCWZ1bmNfc291cmNlICIkZmlsZSIKIAogCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgogCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCiAJICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCisJICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgXAorCSAgICBmdW5jX3dhcm5pbmcgIlxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgogCSAgY29udGludWUKIAlmaQogCi0JZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgogCiAJaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCiAJICBkaXI9IiRkaXIvJG9iamRpciIKIAllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCi0JICBleGl0IDEKKwkgIGlmIHRlc3QgISAtZiAiJGRpci8kZGxuYW1lIjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIgorCSAgZmkKIAlmaQogCTs7CiAKICAgICAgICoubG8pCiAJIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisJZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisJZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKIAk7OwogCiAgICAgICAqKQotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmcgXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBub24tbGlidG9vbCBsaWJyYXJpZXMgYW5kIG9iamVjdHMiIDE+JjIKLSAgICAgICAgY29udGludWUKKwlmdW5jX3dhcm5pbmcgIlxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIgorCWNvbnRpbnVlCiAJOzsKICAgICAgIGVzYWMKIApAQCAtMjE0OSwzMDUgKzE3MTEsNjY5NiBAQAogICAgIGFyZ3M9CiAgICAgZm9yIGZpbGUKICAgICBkbwotICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICBjYXNlICRmaWxlIGluCiAgICAgICAtKikgOzsKICAgICAgICopCi0gICAgICAgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KLSAgICAgICAgaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJaWYgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiRmaWxlIjsgdGhlbgorCSAgZnVuY19zb3VyY2UgIiRmaWxlIgorCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWVsaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgZnVuY19zb3VyY2UgIiRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKIAkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCiAJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKIAlmaQotICAgICAgICA7OworCTs7CiAgICAgICBlc2FjCiAgICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgotICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0gICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCisgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkZmlsZSIKKyAgICAgIGFyZ3M9IiRhcmdzICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKICAgICBkb25lCiAKLSAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotICAgICAgIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCi0gICAgICBldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgaWYgdGVzdCAiWCRvcHRfZHJ5X3J1biIgPSBYZmFsc2U7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCSMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgorCWV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCiAKLSAgICAgICMgTm93IGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBldmFsICJleGVjIFwkY21kJGFyZ3MiCisgICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICBmb3IgbHRfdmFyIGluIExBTkcgTEFOR1VBR0UgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKKyAgICAgIGRvCisJZXZhbCAiaWYgdGVzdCBcIlwke3NhdmVfJGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICAgICAgICAkbHRfdmFyPVwkc2F2ZV8kbHRfdmFyOyBleHBvcnQgJGx0X3ZhcgorCSAgICAgIGVsc2UKKwkJJGx0X3Vuc2V0ICRsdF92YXIKKwkgICAgICBmaSIKKyAgICAgIGRvbmUKIAotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGV4ZWMgXCRjbWQkYXJncyIKLSAgICAgIGV4aXQgMQorICAgICAgIyBOb3cgcHJlcGFyZSB0byBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgorICAgICAgZXhlY19jbWQ9IlwkY21kJGFyZ3MiCiAgICAgZWxzZQogICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KLSAgICAgIGV2YWwgIlwkZWNobyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCi0gICAgICAkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgotICAgICAgJGVjaG8gIiRjbWQkYXJncyIKLSAgICAgIGV4aXQgMAorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZXZhbCAiXCRFQ0hPIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKwkkRUNITyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKyAgICAgICRFQ0hPICIkY21kJGFyZ3MiCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorfQorCit0ZXN0ICIkbW9kZSIgPSBleGVjdXRlICYmIGZ1bmNfbW9kZV9leGVjdXRlICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2ZpbmlzaCBhcmcuLi4KK2Z1bmNfbW9kZV9maW5pc2ggKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbGliZGlycz0iJG5vbm9wdCIKKyAgICBhZG1pbmNtZHM9CisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGRpcgorICAgICAgZG8KKwlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgorICAgICAgZG9uZQorCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJGZpbmlzaF9jbWRzIiAnYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisnIiRjbWQiJyInCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluaXNoX2V2YWwiOyB0aGVuCisJICAjIERvIHRoZSBzaW5nbGUgZmluaXNoX2V2YWwuCisJICBldmFsIGNtZHM9XCIkZmluaXNoX2V2YWxcIgorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWRzIiB8fCBhZG1pbmNtZHM9IiRhZG1pbmNtZHMKKyAgICAgICAkY21kcyIKKwlmaQorICAgICAgZG9uZQorICAgIGZpCisKKyAgICAjIEV4aXQgaGVyZSBpZiB0aGV5IHdhbnRlZCBzaWxlbnQgbW9kZS4KKyAgICAkb3B0X3NpbGVudCAmJiBleGl0ICRFWElUX1NVQ0NFU1MKKworICAgICRFQ0hPICJYLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgfCAkWHNlZAorICAgICRFQ0hPICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKyAgICAgICRFQ0hPICIgICAkbGliZGlyIgorICAgIGRvbmUKKyAgICAkRUNITworICAgICRFQ0hPICJJZiB5b3UgZXZlciBoYXBwZW4gdG8gd2FudCB0byBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyIKKyAgICAkRUNITyAiaW4gYSBnaXZlbiBkaXJlY3RvcnksIExJQkRJUiwgeW91IG11c3QgZWl0aGVyIHVzZSBsaWJ0b29sLCBhbmQiCisgICAgJEVDSE8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSB0aGUgXGAtTExJQkRJUiciCisgICAgJEVDSE8gImZsYWcgZHVyaW5nIGxpbmtpbmcgYW5kIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICRFQ0hPICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgorICAgICAgJEVDSE8gIiAgICAgZHVyaW5nIGV4ZWN1dGlvbiIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKyAgICAgICRFQ0hPICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgICRFQ0hPICIgICAgIGR1cmluZyBsaW5raW5nIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisgICAgICBsaWJkaXI9TElCRElSCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgICRFQ0hPICIgICAtIHVzZSB0aGUgXGAkZmxhZycgbGlua2VyIGZsYWciCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkYWRtaW5jbWRzIjsgdGhlbgorICAgICAgJEVDSE8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHJ1biB0aGVzZSBjb21tYW5kczokYWRtaW5jbWRzIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICAgICRFQ0hPICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKKyAgICBmaQorICAgICRFQ0hPCisKKyAgICAkRUNITyAiU2VlIGFueSBvcGVyYXRpbmcgc3lzdGVtIGRvY3VtZW50YXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyBmb3IiCisgICAgY2FzZSAkaG9zdCBpbgorICAgICAgc29sYXJpczIuWzY3ODldfHNvbGFyaXMyLjFbMC05XSkKKyAgICAgICAgJEVDSE8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpLCBjcmxlKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwiCisJJEVDSE8gInBhZ2VzLiIKKwk7OworICAgICAgKikKKyAgICAgICAgJEVDSE8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorICAgICAgICA7OworICAgIGVzYWMKKyAgICAkRUNITyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKwordGVzdCAiJG1vZGUiID0gZmluaXNoICYmIGZ1bmNfbW9kZV9maW5pc2ggJHsxKyIkQCJ9CisKKworIyBmdW5jX21vZGVfaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV9pbnN0YWxsICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KKyAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaCB8fAorICAgICAgICMgQWxsb3cgdGhlIHVzZSBvZiBHTlUgc2h0b29sJ3MgaW5zdGFsbCBjb21tYW5kLgorICAgICAgICRFQ0hPICJYJG5vbm9wdCIgfCAkR1JFUCBzaHRvb2wgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJG5vbm9wdCIKKyAgICAgIGluc3RhbGxfcHJvZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0ICIKKyAgICAgIGFyZz0kMQorICAgICAgc2hpZnQKKyAgICBlbHNlCisgICAgICBpbnN0YWxsX3Byb2c9CisgICAgICBhcmc9JG5vbm9wdAorICAgIGZpCisKKyAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCisgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCisgICAgIyBXZSBuZWVkIHRvIGFjY2VwdCBhdCBsZWFzdCBhbGwgdGhlIEJTRCBpbnN0YWxsIGZsYWdzLgorICAgIGRlc3Q9CisgICAgZmlsZXM9CisgICAgb3B0cz0KKyAgICBwcmV2PQorICAgIGluc3RhbGxfdHlwZT0KKyAgICBpc2Rpcj1ubworICAgIHN0cmlwbWU9CisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KKwlmaWxlcz0iJGZpbGVzICRkZXN0IgorCWRlc3Q9JGFyZworCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1kKSBpc2Rpcj15ZXMgOzsKKyAgICAgIC1mKQorCWNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKwkqW1xcXCAvXWNwXCAqKSA7OworCSopIHByZXY9JGFyZyA7OworCWVzYWMKKwk7OworICAgICAgLWcgfCAtbSB8IC1vKQorCXByZXY9JGFyZworCTs7CisgICAgICAtcykKKwlzdHJpcG1lPSIgLXMiCisJY29udGludWUKKwk7OworICAgICAgLSopCisJOzsKKyAgICAgICopCisJIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRlZCBhbiBhcmd1bWVudCwgdGhlbiBza2lwIGl0LgorCWlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCSAgcHJldj0KKwllbHNlCisJICBkZXN0PSRhcmcKKwkgIGNvbnRpbnVlCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKyAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJGluc3RhbGxfcHJvZyIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIKKworICAgIHRlc3QgLW4gIiRwcmV2IiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInRoZSBcYCRwcmV2JyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwlmdW5jX2ZhdGFsX2hlbHAgIm5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIgorICAgICAgZWxzZQorCWZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIgorICAgICAgZmkKKyAgICBmaQorCisgICAgIyBTdHJpcCBhbnkgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGVzdGluYXRpb24uCisgICAgZnVuY19zdHJpcG5hbWUgJycgJy8nICIkZGVzdCIKKyAgICBkZXN0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKworICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LgorICAgIHRlc3QgLWQgIiRkZXN0IiAmJiBpc2Rpcj15ZXMKKyAgICBpZiB0ZXN0ICIkaXNkaXIiID0geWVzOyB0aGVuCisgICAgICBkZXN0ZGlyPSIkZGVzdCIKKyAgICAgIGRlc3RuYW1lPQorICAgIGVsc2UKKyAgICAgIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRkZXN0IiAiIiAiLiIKKyAgICAgIGRlc3RkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgZGVzdG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKworICAgICAgIyBOb3QgYSBkaXJlY3RvcnksIHNvIGNoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZpbGUgc3BlY2lmaWVkLgorICAgICAgc2V0IGR1bW15ICRmaWxlczsgc2hpZnQKKyAgICAgIHRlc3QgIiQjIiAtZ3QgMSAmJiBcCisJZnVuY19mYXRhbF9oZWxwICJcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgIGZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIHN0YXRpY2xpYnM9CisgICAgZnV0dXJlX2xpYmRpcnM9CisgICAgY3VycmVudF9saWJkaXJzPQorICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKworICAgICAgIyBEbyBlYWNoIGluc3RhbGxhdGlvbi4KKyAgICAgIGNhc2UgJGZpbGUgaW4KKyAgICAgICouJGxpYmV4dCkKKwkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgorCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgorCTs7CisKKyAgICAgICoubGEpCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlmdW5jX2xhbGliX3Vuc2FmZV9wICIkZmlsZSIgXAorCSAgfHwgZnVuY19mYXRhbF9oZWxwICJcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCXJlbGlua19jb21tYW5kPQorCWZ1bmNfc291cmNlICIkZmlsZSIKKworCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KKwlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWZ1bmNfZGlybmFtZSAiJGZpbGUiICIvIiAiIgorCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJZGlyPSIkZGlyJG9iamRpciIKKworCWlmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICMgRGV0ZXJtaW5lIHRoZSBwcmVmaXggdGhlIHVzZXIgaGFzIGFwcGxpZWQgdG8gb3VyIGZ1dHVyZSBkaXIuCisJICBpbnN0X3ByZWZpeF9kaXI9YCRFQ0hPICJYJGRlc3RkaXIiIHwgJFhzZWQgLWUgInMlJGxpYmRpclwkJSUiYAorCisJICAjIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIHBsYWNlIHVzIG91dHNpZGUgb2Ygb3VyIGV4cGVjdGVkCisJICAjIGxvY2F0aW9uIGIvYyB0aGlzIHByZXZlbnRzIGZpbmRpbmcgZGVwZW5kZW50IGxpYnJhcmllcyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgdG8gdGhlIHNhbWUgcHJlZml4LgorCSAgIyBBdCBwcmVzZW50LCB0aGlzIGNoZWNrIGRvZXNuJ3QgYWZmZWN0IHdpbmRvd3MgLmRsbCdzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCBpbnRvICRsaWJkaXIvLi4vYmluIChjdXJyZW50bHksIHRoYXQgd29ya3MgZmluZSkKKwkgICMgYnV0IGl0J3Mgc29tZXRoaW5nIHRvIGtlZXAgYW4gZXllIG9uLgorCSAgdGVzdCAiJGluc3RfcHJlZml4X2RpciIgPSAiJGRlc3RkaXIiICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIKKworCSAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkgICAgIyBTdGljayB0aGUgaW5zdF9wcmVmaXhfZGlyIGRhdGEgaW50byB0aGUgbGluayBjb21tYW5kLgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQGluc3RfcHJlZml4X2RpckAlLWluc3QtcHJlZml4LWRpciAkaW5zdF9wcmVmaXhfZGlyJSJgCisJICBlbHNlCisJICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKKwkgIGZpCisKKwkgIGZ1bmNfd2FybmluZyAicmVsaW5raW5nIFxgJGZpbGUnIgorCSAgZnVuY19zaG93X2V2YWwgIiRyZWxpbmtfY29tbWFuZCIgXAorCSAgICAnZnVuY19mYXRhbF9lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJ1wnJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IicKKwlmaQorCisJIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXM7IHNoaWZ0CisJaWYgdGVzdCAtbiAiJDEiOyB0aGVuCisJICByZWFsbmFtZT0iJDEiCisJICBzaGlmdAorCisJICBzcmNuYW1lPSIkcmVhbG5hbWUiCisJICB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiICYmIHNyY25hbWU9IiRyZWFsbmFtZSJUCisKKwkgICMgSW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcnkgYW5kIGJ1aWxkIHRoZSBzeW1saW5rcy4KKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJHNyY25hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiBcCisJICAgICAgJ2V4aXQgJD8nCisJICB0c3RyaXBtZT0iJHN0cmlwbWUiCisJICBjYXNlICRob3N0X29zIGluCisJICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisJICAgIGNhc2UgJHJlYWxuYW1lIGluCisJICAgICouZGxsLmEpCisJICAgICAgdHN0cmlwbWU9IiIKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0IC1uICIkdHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkgICAgZnVuY19zaG93X2V2YWwgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiICdleGl0ICQ/JworCSAgZmkKKworCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KKwkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCisJICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIiBcCisJCSYmIGZ1bmNfc2hvd19ldmFsICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJFJNICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKwkgICAgZG9uZQorCSAgZmkKKworCSAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorCSAgbGliPSIkZGVzdGRpci8kcmVhbG5hbWUiCisJICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JworCWZpCisKKwkjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKwlmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKwluYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJaW5zdG5hbWU9IiRkaXIvJG5hbWUiaQorCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgJ2V4aXQgJD8nCisKKwkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCisJdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKKwk7OworCisgICAgICAqLmxvKQorCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgorCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJICBkZXN0ZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwljYXNlICRkZXN0ZmlsZSBpbgorCSoubG8pCisJICBmdW5jX2xvMm8gIiRkZXN0ZmlsZSIKKwkgIHN0YXRpY2Rlc3Q9JGZ1bmNfbG8yb19yZXN1bHQKKwkgIDs7CisJKi4kb2JqZXh0KQorCSAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgorCSAgZGVzdGZpbGU9CisJICA7OworCSopCisJICBmdW5jX2ZhdGFsX2hlbHAgImNhbm5vdCBjb3B5IGEgbGlidG9vbCBvYmplY3QgdG8gXGAkZGVzdGZpbGUnIgorCSAgOzsKKwllc2FjCisKKwkjIEluc3RhbGwgdGhlIGxpYnRvb2wgb2JqZWN0IGlmIHJlcXVlc3RlZC4KKwl0ZXN0IC1uICIkZGVzdGZpbGUiICYmIFwKKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgJ2V4aXQgJD8nCisKKwkjIEluc3RhbGwgdGhlIG9sZCBvYmplY3QgaWYgZW5hYmxlZC4KKwlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICAjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCSAgZnVuY19sbzJvICIkZmlsZSIKKwkgIHN0YXRpY29iaj0kZnVuY19sbzJvX3Jlc3VsdAorCSAgZnVuY19zaG93X2V2YWwgIiRpbnN0YWxsX3Byb2cgXCRzdGF0aWNvYmogXCRzdGF0aWNkZXN0IiAnZXhpdCAkPycKKwlmaQorCWV4aXQgJEVYSVRfU1VDQ0VTUworCTs7CisKKyAgICAgICopCisJIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgorCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCisJZWxzZQorCSAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJICBkZXN0ZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCBhbmQgdGhlcmUgaXMgYSAuZXhlIG9uIHRoZSBlbmQsIHN0cmlwIGl0CisJIyBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IGEgbGlidG9vbCBzY3JpcHQgd2UgYWN0dWFsbHkgd2FudCB0bworCSMgaW5zdGFsbAorCXN0cmlwcGVkX2V4dD0iIgorCWNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZpbGUiCisJICAgICAgZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgc3RyaXBwZWRfZXh0PSIuZXhlIgorCSAgICBmaQorCSAgICA7OworCWVzYWMKKworCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwljYXNlICRob3N0IGluCisJKmN5Z3dpbiogfCAqbWluZ3cqKQorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHdyYXBwZXI9JGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgIGVsc2UKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICAgIHdyYXBwZXI9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICBmaQorCSAgICA7OworCSopCisJICAgIHdyYXBwZXI9JGZpbGUKKwkgICAgOzsKKwllc2FjCisJaWYgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiR3cmFwcGVyIjsgdGhlbgorCSAgbm90aW5zdF9kZXBsaWJzPQorCSAgcmVsaW5rX2NvbW1hbmQ9CisKKwkgIGZ1bmNfc291cmNlICIkd3JhcHBlciIKKworCSAgIyBDaGVjayB0aGUgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBzZXQuCisJICB0ZXN0IC16ICIkZ2VuZXJhdGVkX2J5X2xpYnRvb2xfdmVyc2lvbiIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJpbnZhbGlkIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgXGAkd3JhcHBlciciCisKKwkgIGZpbmFsaXplPXllcworCSAgZm9yIGxpYiBpbiAkbm90aW5zdF9kZXBsaWJzOyBkbworCSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCisJICAgIGxpYmRpcj0KKwkgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkgICAgICBmdW5jX3NvdXJjZSAiJGxpYiIKKwkgICAgZmkKKwkgICAgbGliZmlsZT0iJGxpYmRpci8iYCRFQ0hPICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSVnJ2AgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisJICAgIGlmIHRlc3QgLW4gIiRsaWJkaXIiICYmIHRlc3QgISAtZiAiJGxpYmZpbGUiOyB0aGVuCisJICAgICAgZnVuY193YXJuaW5nICJcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIKKwkgICAgICBmaW5hbGl6ZT1ubworCSAgICBmaQorCSAgZG9uZQorCisJICByZWxpbmtfY29tbWFuZD0KKwkgIGZ1bmNfc291cmNlICIkd3JhcHBlciIKKworCSAgb3V0cHV0bmFtZT0KKwkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0gbm8gJiYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KKwkgICAgICAgIHRtcGRpcj1gZnVuY19ta3RlbXBkaXJgCisJCWZ1bmNfYmFzZW5hbWUgIiRmaWxlJHN0cmlwcGVkX2V4dCIKKwkJZmlsZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKKwkgICAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwkgICAgICAgIHJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCisKKwkgICAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kICIkcmVsaW5rX2NvbW1hbmQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgICAgfQorCSAgICAgICAgaWYgZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICAgICAgICAgIGVsc2UKKwkJICBmdW5jX2Vycm9yICJlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiCisJCSAgJG9wdF9kcnlfcnVuIHx8ICR7Uk19ciAiJHRtcGRpciIKKwkJICBjb250aW51ZQorCSAgICAgICAgZmkKKwkgICAgICAgIGZpbGU9IiRvdXRwdXRuYW1lIgorCSAgICAgIGVsc2UKKwkgICAgICAgIGZ1bmNfd2FybmluZyAiY2Fubm90IHJlbGluayBcYCRmaWxlJyIKKwkgICAgICBmaQorCSAgICB9CisJICBlbHNlCisJICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJEVDSE8gIlgkZmlsZSRzdHJpcHBlZF9leHQiIHwgJFhzZWQgLWUgInMlXChbXi9dKlwpJCUkb2JqZGlyL1wxJSJgCisJICBmaQorCWZpCisKKwkjIHJlbW92ZSAuZXhlIHNpbmNlIGN5Z3dpbiAvdXNyL2Jpbi9pbnN0YWxsIHdpbGwgYXBwZW5kIGFub3RoZXIKKwkjIG9uZSBhbnl3YXkKKwljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KKwkqL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCisJICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgorCSAgKi5leGU6Ki5leGUpCisJICAgICMgdGhpcyBpcyBvaworCSAgICA7OworCSAgKi5leGU6KikKKwkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQorCSAgICA7OworCSAgKjoqLmV4ZSkKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZGVzdGZpbGUiCisJICAgIGRlc3RmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCWZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiAnZXhpdCAkPycKKwkkb3B0X2RyeV9ydW4gfHwgaWYgdGVzdCAtbiAiJG91dHB1dG5hbWUiOyB0aGVuCisJICAke1JNfXIgIiR0bXBkaXIiCisJZmkKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIGZvciBmaWxlIGluICRzdGF0aWNsaWJzOyBkbworICAgICAgZnVuY19iYXNlbmFtZSAiJGZpbGUiCisgICAgICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkZmlsZSBcJG9sZGxpYiIgJ2V4aXQgJD8nCisKKyAgICAgIGlmIHRlc3QgLW4gIiRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkb2xkX3N0cmlwbGliIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICIkb2xkX3N0cmlwbGliICRvbGRsaWIiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdGluc3RhbGxfY21kcyIgJ2V4aXQgJD8nCisgICAgZG9uZQorCisgICAgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIiAmJiBcCisgICAgICBmdW5jX3dhcm5pbmcgInJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgICRvcHRfZHJ5X3J1biAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjX2NtZD0nJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMnCisgICAgZWxzZQorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG1vZGUiID0gaW5zdGFsbCAmJiBmdW5jX21vZGVfaW5zdGFsbCAkezErIiRAIn0KKworCisjIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zIG91dHB1dG5hbWUgb3JpZ2luYXRvciBwaWNfcAorIyBFeHRyYWN0IHN5bWJvbHMgZnJvbSBkbHByZWZpbGVzIGFuZCBjcmVhdGUgJHtvdXRwdXRuYW1lfVMubyB3aXRoCisjIGEgZGxwcmVvcGVuIHN5bWJvbCB0YWJsZS4KK2Z1bmNfZ2VuZXJhdGVfZGxzeW1zICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIG15X291dHB1dG5hbWU9IiQxIgorICAgIG15X29yaWdpbmF0b3I9IiQyIgorICAgIG15X3BpY19wPSIkezMtbm99IgorICAgIG15X3ByZWZpeD1gJEVDSE8gIiRteV9vcmlnaW5hdG9yIiB8IHNlZCAncyVbXmEtekEtWjAtOV0lXyVnJ2AKKyAgICBteV9kbHN5bXM9CisKKyAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJE5NIiAmJiB0ZXN0IC1uICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCW15X2Rsc3ltcz0iJHtteV9vdXRwdXRuYW1lfVMuYyIKKyAgICAgIGVsc2UKKwlmdW5jX2Vycm9yICJub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiCisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkbXlfZGxzeW1zIjsgdGhlbgorICAgICAgY2FzZSAkbXlfZGxzeW1zIGluCisgICAgICAiIikgOzsKKyAgICAgICouYykKKwkjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgorCW5saXN0PSIkb3V0cHV0X29iamRpci8ke215X291dHB1dG5hbWV9Lm5tIgorCisJZnVuY19zaG93X2V2YWwgIiRSTSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKKworCSMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCisJZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCisJJG9wdF9kcnlfcnVuIHx8ICRFQ0hPID4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisvKiAkbXlfZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG15X291dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gXCJDXCIgeworI2VuZGlmCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwlpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgorCisJICAkb3B0X2RyeV9ydW4gfHwgZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwkgIHByb2dmaWxlcz1gJEVDSE8gIlgkb2JqcyRvbGRfZGVwbGlicyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCSAgZm9yIHByb2dmaWxlIGluICRwcm9nZmlsZXM7IGRvCisJICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkcHJvZ2ZpbGUnIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJE5NICRwcm9nZmlsZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgICAgZXZhbCAnJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgfQorCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgJyRFR1JFUCAtZSAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IiAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICBldmFsICckTVYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICB9CisJICBmaQorCisJICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCSAgaWYgdGVzdCAteiAiJGV4cG9ydF9zeW1ib2xzIjsgdGhlbgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgICBldmFsICIke1NFRH0gLW4gLWUgJy9eOiBAUFJPR1JBTUAgJC9kJyAtZSAncy9eLiogXCguKlwpJC9cMS9wJyAiJzwgIiRubGlzdCIgPiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisgICAgICAgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZWxzZQorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgIiR7U0VEfSAtZSAncy9cKFtdLlsqXiRdXCkvXFxcXFwxL2cnIC1lICdzL14vIC8nIC1lICdzLyQvJC8nIicgPCAiJGV4cG9ydF9zeW1ib2xzIiA+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiJworCSAgICAgIGV2YWwgJyRHUkVQIC1mICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5leHAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICAqY3lnd2luIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgICAgICAgICBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICBldmFsICdjYXQgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisJICAgICAgICAgIDs7CisJICAgICAgZXNhYworCSAgICB9CisJICBmaQorCWZpCisKKwlmb3IgZGxwcmVmaWxlIGluICRkbHByZWZpbGVzOyBkbworCSAgZnVuY192ZXJib3NlICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRkbHByZWZpbGUnIgorCSAgZnVuY19iYXNlbmFtZSAiJGRscHJlZmlsZSIKKwkgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICRvcHRfZHJ5X3J1biB8fCB7CisJICAgIGV2YWwgJyRFQ0hPICI6ICRuYW1lICIgPj4gIiRubGlzdCInCisJICAgIGV2YWwgIiROTSAkZGxwcmVmaWxlIDI+L2Rldi9udWxsIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKKwkgIH0KKwlkb25lCisKKwkkb3B0X2RyeV9ydW4gfHwgeworCSAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBhbiBlbXB0eSBmaWxlLgorCSAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgJEVHUkVQIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKKwkgICAgJE1WICIkbmxpc3QiVCAiJG5saXN0IgorCSAgZmkKKworCSAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKwkgIGlmICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgfAorCSAgICAgIGlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzb3J0IC1rIDMKKwkgICAgICBlbHNlCisJCXNvcnQgKzIKKwkgICAgICBmaSB8CisJICAgICAgdW5pcSA+ICIkbmxpc3QiUzsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgICRHUkVQIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgIGZpCisKKwkgIGlmIHRlc3QgLWYgIiRubGlzdCJTOyB0aGVuCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiJworCSAgZWxzZQorCSAgICAkRUNITyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICBmaQorCisJICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworICB2b2lkICphZGRyZXNzOworfSBsdF9kbHN5bWxpc3Q7CisiCisJICBjYXNlICRob3N0IGluCisJICAqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgJEVDSE8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNvbid0IGJlIGNvbnN0LCBiZWNhdXNlCisgICBydW50aW1lIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbgorICAgb24gcHNldWRvLXJlbG9jcy4gICovIgorCSAgICBsdF9kbHN5bV9jb25zdD0gOzsKKwkgICpvc2Y1KikKKwkgICAgZWNobyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKy8qIFRoaXMgc3lzdGVtIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHJlbG9jYXRpb25zIGluIGNvbnN0IGRhdGEgKi8iCisJICAgIGx0X2Rsc3ltX2NvbnN0PSA7OworCSAgKikKKwkgICAgbHRfZGxzeW1fY29uc3Q9Y29uc3QgOzsKKwkgIGVzYWMKKworCSAgJEVDSE8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCitleHRlcm4gJGx0X2Rsc3ltX2NvbnN0IGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdOworJGx0X2Rsc3ltX2NvbnN0IGx0X2Rsc3ltbGlzdAorbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3tcCisgIHsgXCIkbXlfb3JpZ2luYXRvclwiLCAodm9pZCAqKSAwIH0sIgorCisJICBjYXNlICRuZWVkX2xpYl9wcmVmaXggaW4KKwkgIG5vKQorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyIgPCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKwkgICAgOzsKKwkgICopCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzX2xpYl9wcmVmaXgiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICAgIDs7CisJICBlc2FjCisJICAkRUNITyA+PiAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIlwKKyAgezAsICh2b2lkICopIDB9Cit9OworCisvKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KKyNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKK3N0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7CisgIHJldHVybiBsdF8ke215X3ByZWZpeH1fTFRYX3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCX0gIyAhJG9wdF9kcnlfcnVuCisKKwlwaWNfZmxhZ19mb3Jfc3ltdGFibGU9CisJY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJKiIgLXN0YXRpYyAiKikgOzsKKwkqKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCisJICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKKwkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKKwkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgorCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KKwkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKKwkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIC1ERlJFRUJTRF9XT1JLQVJPVU5EIiA7OworCSAgKi0qLWhwdXgqKQorCSAgICBwaWNfZmxhZ19mb3Jfc3ltdGFibGU9IiAkcGljX2ZsYWciICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiWCRteV9waWNfcCIgIT0gWG5vOyB0aGVuCisJICAgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisJc3ltdGFiX2NmbGFncz0KKwlmb3IgYXJnIGluICRMVENGTEFHUzsgZG8KKwkgIGNhc2UgJGFyZyBpbgorCSAgLXBpZSB8IC1mcGllIHwgLWZQSUUpIDs7CisJICAqKSBzeW10YWJfY2ZsYWdzPSIkc3ltdGFiX2NmbGFncyAkYXJnIiA7OworCSAgZXNhYworCWRvbmUKKworCSMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJZnVuY19zaG93X2V2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyRzeW10YWJfY2ZsYWdzIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRteV9kbHN5bXMiKScgJ2V4aXQgJD8nCisKKwkjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJZnVuY19zaG93X2V2YWwgJyRSTSAiJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCInCisKKwkjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgorCXN5bWZpbGVvYmo9IiRvdXRwdXRfb2JqZGlyLyR7bXlfb3V0cHV0bmFtZX1TLiRvYmpleHQiCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorCSAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmIjsgdGhlbgorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJG91dHB1dF9vYmpkaXIvJG15X291dHB1dG5hbWUuZGVmICRzeW1maWxlb2JqJSJgCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgZWxzZQorCSAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpCisJICA7OworCSopCisJICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyVAU1lNRklMRUAlJHN5bWZpbGVvYmolImAKKwkgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICA7OworCWVzYWMKKwk7OworICAgICAgKikKKwlmdW5jX2ZhdGFsX2Vycm9yICJ1bmtub3duIHN1ZmZpeCBmb3IgXGAkbXlfZGxzeW1zJyIKKwk7OworICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgICMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCisgICAgICAjIGx0X3ByZWxvYWRlZF9zeW1ib2xzLiAgVGhlIGxpbmtlciB3aWxsIGZhaWwgaWYgZ2xvYmFsX3N5bWJvbF9waXBlCisgICAgICAjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKyAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICBjb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgIGZpCit9CisKKyMgZnVuY193aW4zMl9saWJpZCBhcmcKKyMgcmV0dXJuIHRoZSBsaWJyYXJ5IHR5cGUgb2YgZmlsZSAnYXJnJworIworIyBOZWVkIGEgbG90IG9mIGdvbyB0byBoYW5kbGUgKmJvdGgqIERMTHMgYW5kIGltcG9ydCBsaWJzCisjIEhhcyB0byBiZSBhIHNoZWxsIGZ1bmN0aW9uIGluIG9yZGVyIHRvICdlYXQnIHRoZSBhcmd1bWVudAorIyB0aGF0IGlzIHN1cHBsaWVkIHdoZW4gJGZpbGVfbWFnaWNfY29tbWFuZCBpcyBjYWxsZWQuCitmdW5jX3dpbjMyX2xpYmlkICgpCit7CisgICRvcHRfZGVidWcKKyAgd2luMzJfbGliaWRfdHlwZT0idW5rbm93biIKKyAgd2luMzJfZmlsZXJlcz1gZmlsZSAtTCAkMSAyPi9kZXYvbnVsbGAKKyAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAqYXJcIGFyY2hpdmVcIGltcG9ydFwgbGlicmFyeSopICMgZGVmaW5pdGVseSBpbXBvcnQKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiCisgICAgOzsKKyAgKmFyXCBhcmNoaXZlKikgIyBjb3VsZCBiZSBhbiBpbXBvcnQsIG9yIHN0YXRpYworICAgIGlmIGV2YWwgJE9CSkRVTVAgLWYgJDEgfCAkU0VEIC1lICcxMHEnIDI+L2Rldi9udWxsIHwKKyAgICAgICAkRUdSRVAgJ2ZpbGUgZm9ybWF0IHBlLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAgIHdpbjMyX25tcmVzPWBldmFsICROTSAtZiBwb3NpeCAtQSAkMSB8CisJJFNFRCAtbiAtZSAnCisJICAgIDEsMTAweworCQkvIEkgL3sKKwkJICAgIHMsLiosaW1wb3J0LAorCQkgICAgcAorCQkgICAgcQorCQl9CisJICAgIH0nYAorICAgICAgY2FzZSAkd2luMzJfbm1yZXMgaW4KKyAgICAgIGltcG9ydCopICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBpbXBvcnQiOzsKKyAgICAgICopICAgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgYXJjaGl2ZSBzdGF0aWMiOzsKKyAgICAgIGVzYWMKICAgICBmaQogICAgIDs7CisgICpETEwqKQorICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgOzsKKyAgKmV4ZWN1dGFibGUqKSAjIGJ1dCBzaGVsbCBzY3JpcHRzIGFyZSAiZXhlY3V0YWJsZSIgdG9vLi4uCisgICAgY2FzZSAkd2luMzJfZmlsZXJlcyBpbgorICAgICpNU1wgV2luZG93c1wgUEVcIEludGVsKikKKyAgICAgIHdpbjMyX2xpYmlkX3R5cGU9Ing4NiBETEwiCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgICRFQ0hPICIkd2luMzJfbGliaWRfdHlwZSIKK30KIAotICAjIGxpYnRvb2wgdW5pbnN0YWxsIG1vZGUKLSAgdW5pbnN0YWxsKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IHVuaW5zdGFsbCIKLSAgICBybT0iJG5vbm9wdCIKKworCisjIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKK2Z1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0CisgICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgorICAgIGZ1bmNfc2hvd19ldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcIlwkZl9leF9hbl9hcl9vbGRsaWJcIikiICdleGl0ICQ/JworICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgIDoKKyAgICBlbHNlCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJvYmplY3QgbmFtZSBjb25mbGljdHMgaW4gYXJjaGl2ZTogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIKKyAgICBmaQorfQorCisKKyMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCitmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0CisgICAgbXlfb2xkbGlicz0kezErIiRAIn0KKyAgICBteV9vbGRvYmpzPSIiCisgICAgbXlfeGxpYj0iIgorICAgIG15X3hhYnM9IiIKKyAgICBteV94ZGlyPSIiCisKKyAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KKyAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKyAgICAgIGNhc2UgJG15X3hsaWIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OworCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OworICAgICAgZXNhYworICAgICAgZnVuY19iYXNlbmFtZSAiJG15X3hsaWIiCisgICAgICBteV94bGliPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICBteV94bGliX3U9JG15X3hsaWIKKyAgICAgIHdoaWxlIDo7IGRvCisgICAgICAgIGNhc2UgIiAkZXh0cmFjdGVkX2FyY2hpdmVzICIgaW4KKwkqIiAkbXlfeGxpYl91ICIqKQorCSAgZnVuY19hcml0aCAkZXh0cmFjdGVkX3NlcmlhbCArIDEKKwkgIGV4dHJhY3RlZF9zZXJpYWw9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICBteV94bGliX3U9bHQkZXh0cmFjdGVkX3NlcmlhbC0kbXlfeGxpYiA7OworCSopIGJyZWFrIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZXh0cmFjdGVkX2FyY2hpdmVzPSIkZXh0cmFjdGVkX2FyY2hpdmVzICRteV94bGliX3UiCisgICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliX3UiCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJG15X3hkaXIiCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotZGFyd2luKikKKwlmdW5jX3ZlcmJvc2UgIkV4dHJhY3RpbmcgJG15X3hhYnMiCisJIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCisJJG9wdF9kcnlfcnVuIHx8IHsKKwkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAorCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPworCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKKwkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKKwkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YGJhc2VuYW1lICIkZGFyd2luX2FyY2hpdmUiYAorCSAgZGFyd2luX2FyY2hlcz1gJExJUE8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsIHx8IHRydWVgCisJICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4KKwkgICAgZGFyd2luX2FyY2hlcz1gJEVDSE8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAorCSAgICBkYXJ3aW5fYXJjaD0KKwkgICAgZnVuY192ZXJib3NlICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKKwkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCisJICAgICAgZnVuY19ta2Rpcl9wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgICRMSVBPIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKKwkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKKwkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKKwkgICAgICAkUk0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKKwkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCisgICAgICAgICAgICAjIyBPa2F5IG5vdyB3ZSd2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKKwkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJFNFRCAtZSAiJGJhc2VuYW1lIiB8IHNvcnQgLXVgCisJICAgIGRhcndpbl9maWxlPQorCSAgICBkYXJ3aW5fZmlsZXM9CisJICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbworCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgJE5MMlNQYAorCSAgICAgICRMSVBPIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCisJICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0CisJICAgICRSTSAtcmYgdW5mYXQtJCQKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisJICBlbHNlCisJICAgIGNkICRkYXJ3aW5fb3JpZ19kaXIKKwkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJICBmaSAjICRkYXJ3aW5fYXJjaGVzCisJfSAjICEkb3B0X2RyeV9ydW4KKwk7OworICAgICAgKikKKyAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCisgICAgZG9uZQorCisgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdD0iJG15X29sZG9ianMiCit9CisKKworCisjIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxIFthcmc9bm9dCisjCisjIEVtaXQgdGhlIGZpcnN0IHBhcnQgb2YgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoCisjIGZ1bmNfZW1pdF93cmFwcGVyKCksIGJlbG93LgorZnVuY19lbWl0X3dyYXBwZXJfcGFydDEgKCkKK3sKKwlmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MV9hcmcxPW5vCisJaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgorCSAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDFfYXJnMT0kMQorCWZpCisKKwkkRUNITyAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPScke1NFRH0gLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorICBnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uPSckbWFjcm9fdmVyc2lvbicKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkRUNITyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBFQ0hPPVwiJHFlY2hvXCIKKyAgICBmaWxlPVwiXCQwXCIKKyAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgorICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICAgICAgc2hpZnQKKyAgICBlbGlmIHRlc3QgXCJYXGB7IFwkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCisgICAgICAjIFlpcHBlZSwgXCRFQ0hPIHdvcmtzIQorICAgICAgOgorICAgIGVsc2UKKyAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRFQ0hPIHdpbGwgd29yay4KKyAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQorICAgIGZpCisgIGZpXAorIgorCSRFQ0hPICJcCisKKyAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KKyAgdGhpc2Rpcj1cYFwkRUNITyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSokJSUnXGAKKyAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgorCisgICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgorICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKKyAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbworICAgIGRlc3RkaXI9XGBcJEVDSE8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qXCQlJSdcYAorCisgICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgorICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KKyAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgorICAgICAgW1xcXFwvXSogfCBbQS1aYS16XTpbXFxcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7CisgICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7CisgICAgICBlc2FjCisgICAgZmkKKworICAgIGZpbGU9XGBcJEVDSE8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCisgICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAorICBkb25lCisiCit9CisjIGVuZDogZnVuY19lbWl0X3dyYXBwZXJfcGFydDEKKworIyBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MiBbYXJnPW5vXQorIworIyBFbWl0IHRoZSBzZWNvbmQgcGFydCBvZiBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb24gc3Rkb3V0LgorIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyMgZnVuY19lbWl0X3dyYXBwZXIoKSwgYmVsb3cuCitmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MiAoKQoreworCWZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyX2FyZzE9bm8KKwlpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCisJICBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0Ml9hcmcxPSQxCisJZmkKKworCSRFQ0hPICJcCisKKyAgIyBVc3VhbGx5ICdubycsIGV4Y2VwdCBvbiBjeWd3aW4vbWluZ3cgd2hlbiBlbWJlZGRlZCBpbnRvCisgICMgdGhlIGN3cmFwcGVyLgorICBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUj0kZnVuY19lbWl0X3dyYXBwZXJfcGFydDJfYXJnMQorICBpZiB0ZXN0IFwiXCRXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUlwiID0gXCJ5ZXNcIjsgdGhlbgorICAgICMgc3BlY2lhbCBjYXNlIGZvciAnLicKKyAgICBpZiB0ZXN0IFwiXCR0aGlzZGlyXCIgPSBcIi5cIjsgdGhlbgorICAgICAgdGhpc2Rpcj1cYHB3ZFxgCisgICAgZmkKKyAgICAjIHJlbW92ZSAubGlicyBmcm9tIHRoaXNkaXIKKyAgICBjYXNlIFwiXCR0aGlzZGlyXCIgaW4KKyAgICAqW1xcXFwvXSRvYmpkaXIgKSB0aGlzZGlyPVxgXCRFQ0hPIFwiWFwkdGhpc2RpclwiIHwgXCRYc2VkIC1lICdzJVtcXFxcL11bXlxcXFwvXSokJSUnXGAgOzsKKyAgICAkb2JqZGlyICkgICB0aGlzZGlyPS4gOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KKyAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAorICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgorIgorCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgICRFQ0hPICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRNS0RJUiBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgICRFQ0hPICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRFQ0hPIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgZmkKKworICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJFJNIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgICRFQ0hPICJcCisgIHByb2dyYW09JyRvdXRwdXRuYW1lJworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorIgorCWZpCisKKwkkRUNITyAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkRUNITyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICisgICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKKyIKKwlmaQorCisJJEVDSE8gIlwKKyAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgorIgorCWNhc2UgJGhvc3QgaW4KKwkjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKwkqLSotbWluZ3cgfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgJEVDSE8gIlwKKyAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQorIgorCSAgOzsKKworCSopCisJICAkRUNITyAiXAorICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCWVzYWMKKwkkRUNITyAiXAorICAgICAgXCRFQ0hPIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCQqXCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJEVDSE8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCisgICAgXCRFQ0hPIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCisgICAgJEVDSE8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCit9CisjIGVuZDogZnVuY19lbWl0X3dyYXBwZXJfcGFydDIKKworCisjIGZ1bmNfZW1pdF93cmFwcGVyIFthcmc9bm9dCisjCisjIEVtaXQgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndworIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCisjIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZXMKKyMgc2V0IHRoZXJlaW4uCisjCisjIEFSRyBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVIKKyMgdmFyaWFibGUgd2lsbCB0YWtlLiAgSWYgJ3llcycsIHRoZW4gdGhlIGVtaXR0ZWQgc2NyaXB0CisjIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBpcyBzdG9yZWQgaXMKKyMgdGhlICRvYmpkaXIgZGlyZWN0b3J5LiAgVGhpcyBpcyBhIGN5Z3dpbi9taW5ndy1zcGVjaWZpYworIyBiZWhhdmlvci4KK2Z1bmNfZW1pdF93cmFwcGVyICgpCit7CisJZnVuY19lbWl0X3dyYXBwZXJfYXJnMT1ubworCWlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKwkgIGZ1bmNfZW1pdF93cmFwcGVyX2FyZzE9JDEKKwlmaQorCisJIyBzcGxpdCB0aGlzIHVwIHNvIHRoYXQgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworCSMgY2FuIGNhbGwgZWFjaCBwYXJ0IGluZGVwZW5kZW50bHkuCisJZnVuY19lbWl0X3dyYXBwZXJfcGFydDEgIiR7ZnVuY19lbWl0X3dyYXBwZXJfYXJnMX0iCisJZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgIiR7ZnVuY19lbWl0X3dyYXBwZXJfYXJnMX0iCit9CisKKworIyBmdW5jX3RvX2hvc3RfcGF0aCBhcmcKKyMKKyMgQ29udmVydCBwYXRocyB0byBob3N0IGZvcm1hdCB3aGVuIHVzZWQgd2l0aCBidWlsZCB0b29scy4KKyMgSW50ZW5kZWQgZm9yIHVzZSB3aXRoICJuYXRpdmUiIG1pbmd3ICh3aGVyZSBsaWJ0b29sIGl0c2VsZgorIyBpcyBydW5uaW5nIHVuZGVyIHRoZSBtc3lzIHNoZWxsKSwgb3IgaW4gdGhlIGZvbGxvd2luZyBjcm9zcy0KKyMgYnVpbGQgZW52aXJvbm1lbnRzOgorIyAgICAkYnVpbGQgICAgICAgICAgJGhvc3QKKyMgICAgbWluZ3cgKG1zeXMpICAgIG1pbmd3ICBbZS5nLiBuYXRpdmVdCisjICAgIGN5Z3dpbiAgICAgICAgICBtaW5ndworIyAgICAqbml4ICsgd2luZSAgICAgbWluZ3cKKyMgd2hlcmUgd2luZSBpcyBlcXVpcHBlZCB3aXRoIHRoZSBgd2luZXBhdGgnIGV4ZWN1dGFibGUuCisjIEluIHRoZSBuYXRpdmUgbWluZ3cgY2FzZSwgdGhlIChtc3lzKSBzaGVsbCBhdXRvbWF0aWNhbGx5CisjIGNvbnZlcnRzIHBhdGhzIGZvciBhbnkgbm9uLW1zeXMgYXBwbGljYXRpb25zIGl0IGxhdW5jaGVzLAorIyBidXQgdGhhdCBmYWNpbGl0eSBpc24ndCBhdmFpbGFibGUgZnJvbSBpbnNpZGUgdGhlIGN3cmFwcGVyLgorIyBTaW1pbGFyIGFjY29tbW9kYXRpb25zIGFyZSBuZWNlc3NhcnkgZm9yICRob3N0IG1pbmd3IGFuZAorIyAkYnVpbGQgY3lnd2luLiAgQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm8gaGFybSBmb3Igb3RoZXIKKyMgJGhvc3QvJGJ1aWxkIGNvbWJpbmF0aW9ucyBub3QgbGlzdGVkIGFib3ZlLgorIworIyBBUkcgaXMgdGhlIHBhdGggKG9uICRidWlsZCkgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvCisjIHRoZSBwcm9wZXIgcmVwcmVzZW50YXRpb24gZm9yICRob3N0LiBUaGUgcmVzdWx0IGlzIHN0b3JlZAorIyBpbiAkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGggKCkKK3sKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgorICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICptaW5ndyogKQorICAgICAgICBsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5PSdzfFxcXFwqfFxcfGc7c3wvfFxcfGc7c3xcXHxcXFxcfGcnCisgICAgICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAgICAgKm1pbmd3KiApICMgYWN0dWFsbHksIG1zeXMKKyAgICAgICAgICAgICMgYXdrd2FyZDogY21kIGFwcGVuZHMgc3BhY2VzIHRvIHJlc3VsdAorICAgICAgICAgICAgbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcz0icy9bIF0qXCQvLyIKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9YCggY21kIC8vYyBlY2hvICIkMSIgfFwKKyAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9zdHJpcF90cmFpbGluZ19zcGFjZXMiICkgMj4vZGV2L251bGwgfHwgZWNobyAiImAKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiIHxcCisgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKmN5Z3dpbiogKQorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT1gY3lncGF0aCAtdyAiJDEiYAorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgfFwKKyAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAorICAgICAgICAgICAgOzsKKyAgICAgICAgICAqICkKKyAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lcyBub3QgZXhpdCB3aXRoIGEgbm9uLXplcm8KKyAgICAgICAgICAgICMgZXJyb3IgY29kZSwgc28gd2UgYXJlIGZvcmNlZCB0byBjaGVjayB0aGUgY29udGVudHMgb2YKKyAgICAgICAgICAgICMgc3Rkb3V0LiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGNvbW1hbmQgaXMgbm90CisgICAgICAgICAgICAjIGZvdW5kLCB0aGUgc2hlbGwgd2lsbCBzZXQgYW4gZXhpdCBjb2RlIG9mIDEyNyBhbmQgcHJpbnQKKyAgICAgICAgICAgICMgKmFuIGVycm9yIG1lc3NhZ2UqIHRvIHN0ZG91dC4gU28gd2UgbXVzdCBjaGVjayBmb3IgYm90aAorICAgICAgICAgICAgIyBlcnJvciBjb2RlIG9mIHplcm8gQU5EIG5vbi1lbXB0eSBzdGRvdXQsIHdoaWNoIGV4cGxhaW5zCisgICAgICAgICAgICAjIHRoZSBvZGQgY29uc3RydWN0aW9uOgorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT1gd2luZXBhdGggLXcgIiQxIiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgIGlmIHRlc3QgIiQ/IiAtZXEgMCAmJiB0ZXN0IC1uICIke2Z1bmNfdG9faG9zdF9wYXRoX3RtcDF9IjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiB8XAorICAgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBBbGxvdyB3YXJuaW5nIGJlbG93LgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiIDsgdGhlbgorICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvdWxkIG5vdCBkZXRlcm1pbmUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgICAgICAgZnVuY19lcnJvciAiICAnJDEnIgorICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICAgICAgICMgRmFsbGJhY2s6CisgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgIGZpCit9CisjIGVuZDogZnVuY190b19ob3N0X3BhdGgKKworIyBmdW5jX3RvX2hvc3RfcGF0aGxpc3QgYXJnCisjCisjIENvbnZlcnQgcGF0aGxpc3RzIHRvIGhvc3QgZm9ybWF0IHdoZW4gdXNlZCB3aXRoIGJ1aWxkIHRvb2xzLgorIyBTZWUgZnVuY190b19ob3N0X3BhdGgoKSwgYWJvdmUuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgdGhlCisjIGZvbGxvd2luZyAkYnVpbGQvJGhvc3QgY29tYmluYXRpb25zIChidXQgZG9lcyBubyBoYXJtIGZvcgorIyBjb21iaW5hdGlvbnMgbm90IGxpc3RlZCBoZXJlKToKKyMgICAgJGJ1aWxkICAgICAgICAgICRob3N0CisjICAgIG1pbmd3IChtc3lzKSAgICBtaW5ndyAgW2UuZy4gbmF0aXZlXQorIyAgICBjeWd3aW4gICAgICAgICAgbWluZ3cKKyMgICAgKm5peCArIHdpbmUgICAgIG1pbmd3CisjCisjIFBhdGggc2VwYXJhdG9ycyBhcmUgYWxzbyBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgZm9ybWF0IHRvCisjICRob3N0IGZvcm1hdC4gSWYgQVJHIGJlZ2lucyBvciBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvcgorIyBjaGFyYWN0ZXIsIGl0IGlzIHByZXNlcnZlZCAoYnV0IGNvbnZlcnRlZCB0byAkaG9zdCBmb3JtYXQpCisjIG9uIG91dHB1dC4KKyMKKyMgQVJHIGlzIGEgcGF0aGxpc3QgKG9uICRidWlsZCkgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvCisjIHRoZSBwcm9wZXIgcmVwcmVzZW50YXRpb24gb24gJGhvc3QuIFRoZSByZXN1bHQgaXMgc3RvcmVkCisjIGluICRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGhsaXN0ICgpCit7CisgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCisgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKm1pbmd3KiApCisgICAgICAgIGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnk9J3N8XFxcXCp8XFx8ZztzfC98XFx8ZztzfFxcfFxcXFx8ZycKKyAgICAgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tCisgICAgICAgICMgQVJHLiBtc3lzIGJlaGF2aW9yIGlzIGluY29uc2lzdGVudCBoZXJlLCBjeWdwYXRoIHR1cm5zIHRoZW0KKyAgICAgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KKyAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDI9IiQxIgorICAgICAgICAjIE9uY2Ugc2V0IGZvciB0aGlzIGNhbGwsIHRoaXMgdmFyaWFibGUgc2hvdWxkIG5vdCBiZQorICAgICAgICAjIHJlYXNzaWduZWQuIEl0IGlzIHVzZWQgaW4gdGhhIGZhbGxiYWNrIGNhc2UuCisgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxPWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDIiIHxcCisgICAgICAgICAgJFNFRCAtZSAnc3xeOip8fCcgLWUgJ3N8OiokfHwnYAorICAgICAgICBjYXNlICRidWlsZCBpbgorICAgICAgICAgICptaW5ndyogKSAjIEFjdHVhbGx5LCBtc3lzLgorICAgICAgICAgICAgIyBBd2t3YXJkOiBjbWQgYXBwZW5kcyBzcGFjZXMgdG8gcmVzdWx0LgorICAgICAgICAgICAgbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcz0icy9bIF0qXCQvLyIKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyPWAoIGNtZCAvL2MgZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcyIgKSAyPi9kZXYvbnVsbCB8fCBlY2hvICIiYAorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgICAgICAgICA7OworICAgICAgICAgICpjeWd3aW4qICkKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyPWBjeWdwYXRoIC13IC1wICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDEiYAorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgICAgICAgICA7OworICAgICAgICAgICogKQorICAgICAgICAgICAgIyB1bmZvcnR1bmF0ZWx5LCB3aW5lcGF0aCBkb2Vzbid0IGNvbnZlcnQgcGF0aGxpc3RzCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIiCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTPSRJRlMKKyAgICAgICAgICAgIElGUz06CisgICAgICAgICAgICBmb3IgZnVuY190b19ob3N0X3BhdGhsaXN0X2YgaW4gJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIDsgZG8KKyAgICAgICAgICAgICAgSUZTPSRmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTCisgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIgOyB0aGVuCisgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ7JGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgSUZTPToKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIElGUz0kZnVuY190b19ob3N0X3BhdGhsaXN0X29sZElGUworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCIgOyB0aGVuCisgICAgICAgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSB0aGUgaG9zdCBwYXRoKHMpIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgICAgICAgZnVuY19lcnJvciAiICAnJDEnIgorICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICAgICAgICMgRmFsbGJhY2suIFRoaXMgbWF5IGJyZWFrIGlmICQxIGNvbnRhaW5zIERPUy1zdHlsZSBkcml2ZQorICAgICAgICAgICMgc3BlY2lmaWNhdGlvbnMuIFRoZSBmaXggaXMgbm90IHRvIGNvbXBsaWNhdGUgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgICAjIGJlbG93LCBidXQgZm9yIHRoZSB1c2VyIHRvIHByb3ZpZGUgYSB3b3JraW5nIHdpbmUgaW5zdGFsbGF0aW9uCisgICAgICAgICAgIyB3aXRoIHdpbmVwYXRoIHNvIHRoYXQgcGF0aCB0cmFuc2xhdGlvbiBpbiB0aGUgY3Jvc3MtdG8tbWluZ3cKKyAgICAgICAgICAjIGNhc2Ugd29ya3MgcHJvcGVybHkuCisgICAgICAgICAgbHRfcmVwbGFjZV9wYXRoc2VwX25peF90b19kb3M9InN8Onw7fGciCisgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIiB8XAorICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3JlcGxhY2VfcGF0aHNlcF9uaXhfdG9fZG9zImAKKyAgICAgICAgZmkKKyAgICAgICAgIyBOb3csIGFkZCB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzIGJhY2sKKyAgICAgICAgY2FzZSAiJDEiIGluCisgICAgICAgICAgOiogKSBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSI7JGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGNhc2UgIiQxIiBpbgorICAgICAgICAgICo6ICkgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ7IgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworICAgIGVzYWMKKyAgZmkKK30KKyMgZW5kOiBmdW5jX3RvX2hvc3RfcGF0aGxpc3QKKworIyBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisjIGVtaXQgdGhlIHNvdXJjZSBjb2RlIGZvciBhIHdyYXBwZXIgZXhlY3V0YWJsZSBvbiBzdGRvdXQKKyMgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBmdW5jX21vZGVfbGluayBiZWNhdXNlCisjIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGUgc2V0IHRoZXJlaW4uCitmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjICgpCit7CisJY2F0IDw8RU9GCisKKy8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKworICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisgICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisKKyAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworICAgQ3VycmVudGx5LCBpdCBzaW1wbHkgZXhlY3MgdGhlIHdyYXBwZXIgKnNjcmlwdCogIiRTSEVMTCAkb3V0cHV0IiwKKyAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKKyAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KKyovCitFT0YKKwkgICAgY2F0IDw8IkVPRiIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxwcm9jZXNzLmg+CisjIGluY2x1ZGUgPGlvLmg+CisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGlmZGVmIF9fQ1lHV0lOX18KKyMgIGluY2x1ZGUgPGlvLmg+CisjICBkZWZpbmUgSEFWRV9TRVRFTlYKKyMgIGlmZGVmIF9fU1RSSUNUX0FOU0lfXworY2hhciAqcmVhbHBhdGggKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKK2ludCBwdXRlbnYgKGNoYXIgKik7CitpbnQgc2V0ZW52IChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWYgZGVmaW5lZChQQVRIX01BWCkKKyMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKKyMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgorI2Vsc2UKKyMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAorI2VuZGlmCisKKyNpZm5kZWYgU19JWE9USAorIyBkZWZpbmUgU19JWE9USCAwCisjZW5kaWYKKyNpZm5kZWYgU19JWEdSUAorIyBkZWZpbmUgU19JWEdSUCAwCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCisjIGRlZmluZSBzdGF0IF9zdGF0CisjIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorIyAgZGVmaW5lIGludHB0cl90IGludAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUgorIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCisgIGRlZmluZWQgKF9fT1MyX18pCisjIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKKyMgZW5kaWYKKyMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQorI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCisJKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCisjZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SKQorI2Vsc2UgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCisjZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworCisjaWZkZWYgX19DWUdXSU5fXworIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorI2VuZGlmCisKKyNpZm5kZWYgRk9QRU5fV0IKKyMgZGVmaW5lIEZPUEVOX1dCICJ3IgorI2VuZGlmCisjaWZuZGVmIF9PX0JJTkFSWQorIyBkZWZpbmUgX09fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCisjZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKKyAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKK30gd2hpbGUgKDApCisKKyN1bmRlZiBMVFdSQVBQRVJfREVCVUdQUklOVEYKKyNpZiBkZWZpbmVkIERFQlVHV1JBUFBFUgorIyBkZWZpbmUgTFRXUkFQUEVSX0RFQlVHUFJJTlRGKGFyZ3MpIGx0d3JhcHBlcl9kZWJ1Z3ByaW50ZiBhcmdzCitzdGF0aWMgdm9pZAorbHR3cmFwcGVyX2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgKHZvaWQpIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgdmFfZW5kIChhcmdzKTsKK30KKyNlbHNlCisjIGRlZmluZSBMVFdSQVBQRVJfREVCVUdQUklOVEYoYXJncykKKyNlbmRpZgorCitjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSBOVUxMOworCit2b2lkICp4bWFsbG9jIChzaXplX3QgbnVtKTsKK2NoYXIgKnhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZyk7Citjb25zdCBjaGFyICpiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpOworY2hhciAqZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKTsKK2NoYXIgKmNoYXNlX3N5bWxpbmtzIChjb25zdCBjaGFyICpwYXRoc3BlYyk7CitpbnQgbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKK2ludCBjaGVja19leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKK2NoYXIgKnN0cmVuZHphcCAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpOwordm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKK3ZvaWQgbHRfc2V0ZW52IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CitjaGFyICpsdF9leHRlbmRfc3RyIChjb25zdCBjaGFyICpvcmlnX3ZhbHVlLCBjb25zdCBjaGFyICphZGQsIGludCB0b19lbmQpOwordm9pZCBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChjb25zdCBjaGFyICphcmcpOwordm9pZCBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoY29uc3QgY2hhciAqYXJnKTsKK3ZvaWQgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAoY29uc3QgY2hhciAqYXJnKTsKK2ludCBsdF9zcGxpdF9uYW1lX3ZhbHVlIChjb25zdCBjaGFyICphcmcsIGNoYXIqKiBuYW1lLCBjaGFyKiogdmFsdWUpOwordm9pZCBsdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK3ZvaWQgbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzY3JpcHRfdGV4dF9wYXJ0MSA9CitFT0YKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MSB5ZXMgfAorCSAgICAgICAgJFNFRCAtZSAncy9cKFtcXCJdXCkvXFxcMS9nJyBcCisJICAgICAgICAgICAgIC1lICdzL14vICAiLycgLWUgJ3MvJC9cXG4iLycKKwkgICAgZWNobyAiOyIKKwkgICAgY2F0IDw8RU9GCisKK3N0YXRpYyBjb25zdCBjaGFyICpzY3JpcHRfdGV4dF9wYXJ0MiA9CitFT0YKKwkgICAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgeWVzIHwKKwkgICAgICAgICRTRUQgLWUgJ3MvXChbXFwiXVwpL1xcXDEvZycgXAorCSAgICAgICAgICAgICAtZSAncy9eLyAgIi8nIC1lICdzLyQvXFxuIi8nCisJICAgIGVjaG8gIjsiCisKKwkgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogTUFHSUNfRVhFID0gIiRtYWdpY19leGUiOworY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBUk5BTUUgPSAiJHNobGlicGF0aF92YXIiOworRU9GCisKKwkgICAgaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3QgIiR0ZW1wX3JwYXRoIgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiOworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDwiRU9GIgorY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiIjsKK0VPRgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3QgIiRkbGxzZWFyY2hwYXRoOiIKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQVJOQU1FID0gIlBBVEgiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiOworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDwiRU9GIgorY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIFRBUkdFVF9QUk9HUkFNX05BTUUgPSAibHQtJG91dHB1dG5hbWUiOyAvKiBob3BlZnVsbHksIG5vIC5leGUgKi8KK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICIkb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGZpCisKKworCSAgICBjYXQgPDwiRU9GIgorCisjZGVmaW5lIExUV1JBUFBFUl9PUFRJT05fUFJFRklYICAgICAgICAgIi0tbHQtIgorI2RlZmluZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEggIDUKKworc3RhdGljIGNvbnN0IHNpemVfdCBvcHRfcHJlZml4X2xlbiAgICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIOworc3RhdGljIGNvbnN0IGNoYXIgKmx0d3JhcHBlcl9vcHRpb25fcHJlZml4ID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVg7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkdW1wc2NyaXB0X29wdCAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkdW1wLXNjcmlwdCI7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgZW52X3NldF9vcHRfbGVuICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSCArIDc7CitzdGF0aWMgY29uc3QgY2hhciAqZW52X3NldF9vcHQgICAgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZW52LXNldCI7CisgIC8qIGFyZ3VtZW50IGlzIHB1dGVudi1zdHlsZSAiZm9vPWJhciIsIHZhbHVlIG9mIGZvbyBpcyBzZXQgdG8gYmFyICovCisKK3N0YXRpYyBjb25zdCBzaXplX3QgZW52X3ByZXBlbmRfb3B0X2xlbiA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSCArIDExOworc3RhdGljIGNvbnN0IGNoYXIgKmVudl9wcmVwZW5kX29wdCAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImVudi1wcmVwZW5kIjsKKyAgLyogYXJndW1lbnQgaXMgcHV0ZW52LXN0eWxlICJmb289YmFyIiwgbmV3IHZhbHVlIG9mIGZvbyBpcyBiYXIke2Zvb30gKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBlbnZfYXBwZW5kX29wdF9sZW4gID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIICsgMTA7CitzdGF0aWMgY29uc3QgY2hhciAqZW52X2FwcGVuZF9vcHQgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZW52LWFwcGVuZCI7CisgIC8qIGFyZ3VtZW50IGlzIHB1dGVudi1zdHlsZSAiZm9vPWJhciIsIG5ldyB2YWx1ZSBvZiBmb28gaXMgJHtmb299YmFyICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCAgbmV3YXJnYzsKKyAgY2hhciAqdG1wX3BhdGhzcGVjOworICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX25hbWU7CisgIGNoYXIgKnRhcmdldF9uYW1lOworICBjaGFyICpsdF9hcmd2X3plcm87CisgIGludHB0cl90IHJ2YWwgPSAxMjc7CisKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgYXJndlswXSAgICAgIDogJXNcbiIsIGFyZ3ZbMF0pKTsKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBwcm9ncmFtX25hbWUgOiAlc1xuIiwgcHJvZ3JhbV9uYW1lKSk7CisKKyAgLyogdmVyeSBzaW1wbGUgYXJnIHBhcnNpbmc7IGRvbid0IHdhbnQgdG8gcmVseSBvbiBnZXRvcHQgKi8KKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkdW1wc2NyaXB0X29wdCkgPT0gMCkKKwl7CitFT0YKKwkgICAgY2FzZSAiJGhvc3QiIGluCisJICAgICAgKm1pbmd3KiB8ICpjeWd3aW4qICkKKwkJIyBtYWtlIHN0ZG91dCB1c2UgInVuaXgiIGxpbmUgZW5kaW5ncworCQllY2hvICIgICAgICAgICAgc2V0bW9kZSgxLF9PX0JJTkFSWSk7IgorCQk7OworCSAgICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorCSAgcHJpbnRmICgiJXMiLCBzY3JpcHRfdGV4dF9wYXJ0MSk7CisJICBwcmludGYgKCIlcyIsIHNjcmlwdF90ZXh0X3BhcnQyKTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgbmV3YXJneiA9IFhNQUxMT0MgKGNoYXIgKiwgYXJnYyArIDEpOworICB0bXBfcGF0aHNwZWMgPSBmaW5kX2V4ZWN1dGFibGUgKGFyZ3ZbMF0pOworICBpZiAodG1wX3BhdGhzcGVjID09IE5VTEwpCisgICAgbHRfZmF0YWwgKCJDb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZm91bmQgZXhlIChiZWZvcmUgc3ltbGluayBjaGFzZSkgYXQgOiAlc1xuIiwKKwkJCSAgdG1wX3BhdGhzcGVjKSk7CisKKyAgYWN0dWFsX2N3cmFwcGVyX3BhdGggPSBjaGFzZV9zeW1saW5rcyAodG1wX3BhdGhzcGVjKTsKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBmb3VuZCBleGUgKGFmdGVyIHN5bWxpbmsgY2hhc2UpIGF0IDogJXNcbiIsCisJCQkgIGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0geHN0cmR1cCggYmFzZV9uYW1lIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9wYXRoLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogd3JhcHBlciBuYW1lIHRyYW5zZm9ybXMgKi8KKyAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAoYWN0dWFsX2N3cmFwcGVyX25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIC8qIHRhcmdldF9uYW1lIHRyYW5zZm9ybXMgLS0gdXNlIGFjdHVhbCB0YXJnZXQgcHJvZ3JhbSBuYW1lOyBtaWdodCBoYXZlIGx0LSBwcmVmaXggKi8KKyAgdGFyZ2V0X25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKFRBUkdFVF9QUk9HUkFNX05BTUUpKTsKKyAgc3RyZW5kemFwICh0YXJnZXRfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAodGFyZ2V0X25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIHRhcmdldF9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgbGlidG9vbCB0YXJnZXQgbmFtZTogJXNcbiIsCisJCQkgIHRhcmdldF9uYW1lKSk7CitFT0YKKworCSAgICBjYXQgPDxFT0YKKyAgbmV3YXJnelswXSA9CisgICAgWE1BTExPQyAoY2hhciwgKHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpICsKKwkJICAgIHN0cmxlbiAoIiRvYmpkaXIiKSArIDEgKyBzdHJsZW4gKGFjdHVhbF9jd3JhcHBlcl9uYW1lKSArIDEpKTsKKyAgc3RyY3B5IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIHN0cmNhdCAobmV3YXJnelswXSwgIiRvYmpkaXIiKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiLyIpOworRU9GCisKKwkgICAgY2F0IDw8IkVPRiIKKyAgLyogc3RvcCBoZXJlLCBhbmQgY29weSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMgdHdpY2UgKi8KKyAgdG1wX3BhdGhzcGVjID0geHN0cmR1cCAobmV3YXJnelswXSk7CisKKyAgLyogZG8gTk9UIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSwgc28gdXNlIGFjdHVhbF9jd3JhcHBlcl9uYW1lICovCisgIHN0cmNhdCAobmV3YXJnelswXSwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIC8qIERPIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSBpZiBpdCBleGlzdHMsIHNvIHVzZSB0YXJnZXRfbmFtZSAqLworICBsdF9hcmd2X3plcm8gPSBsdF9leHRlbmRfc3RyICh0bXBfcGF0aHNwZWMsIHRhcmdldF9uYW1lLCAxKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisgIHRtcF9wYXRoc3BlYyA9IE5VTEw7CitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCSAgICBjYXQgPDwiRU9GIgorICB7CisgICAgY2hhciogcDsKKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIgKG5ld2FyZ3pbMF0sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICAgIHdoaWxlICgocCA9IHN0cmNociAobHRfYXJndl96ZXJvLCAnXFwnKSkgIT0gTlVMTCkKKyAgICAgIHsKKwkqcCA9ICcvJzsKKyAgICAgIH0KKyAgfQorRU9GCisJICAgIDs7CisJICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorICBYRlJFRSAodGFyZ2V0X25hbWUpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIGx0X3NldGVudiAoIkJJTl9TSCIsICJ4cGc0Iik7IC8qIGZvciBUcnU2NCAqLworICBsdF9zZXRlbnYgKCJEVUFMQ0FTRSIsICIxIik7ICAvKiBmb3IgTVNLIHNoICovCisgIGx0X3VwZGF0ZV9saWJfcGF0aCAoTElCX1BBVEhfVkFSTkFNRSwgTElCX1BBVEhfVkFMVUUpOworICBsdF91cGRhdGVfZXhlX3BhdGggKEVYRV9QQVRIX1ZBUk5BTUUsIEVYRV9QQVRIX1ZBTFVFKTsKKworICBuZXdhcmdjPTA7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKGFyZ3ZbaV0sIGVudl9zZXRfb3B0LCBlbnZfc2V0X29wdF9sZW4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYXJndltpXVtlbnZfc2V0X29wdF9sZW5dID09ICc9JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IGFyZ3ZbaV0gKyBlbnZfc2V0X29wdF9sZW4gKyAxOworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhcmd2W2ldW2Vudl9zZXRfb3B0X2xlbl0gPT0gJ1wwJyAmJiBpICsgMSA8IGFyZ2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9zZXQgKGFyZ3ZbKytpXSk7IC8qIGRvbid0IGNvcHkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBsdF9mYXRhbCAoIiVzIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQiLCBlbnZfc2V0X29wdCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfcHJlcGVuZF9vcHQsIGVudl9wcmVwZW5kX29wdF9sZW4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYXJndltpXVtlbnZfcHJlcGVuZF9vcHRfbGVuXSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X3ByZXBlbmRfb3B0X2xlbiArIDE7CisgICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9wcmVwZW5kIChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhcmd2W2ldW2Vudl9wcmVwZW5kX29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoYXJndlsrK2ldKTsgLyogZG9uJ3QgY29weSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGx0X2ZhdGFsICgiJXMgbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCIsIGVudl9wcmVwZW5kX29wdCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfYXBwZW5kX29wdCwgZW52X2FwcGVuZF9vcHRfbGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFyZ3ZbaV1bZW52X2FwcGVuZF9vcHRfbGVuXSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X2FwcGVuZF9vcHRfbGVuICsgMTsKKyAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAocCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYXJndltpXVtlbnZfYXBwZW5kX29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfYXBwZW5kIChhcmd2WysraV0pOyAvKiBkb24ndCBjb3B5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbHRfZmF0YWwgKCIlcyBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IiwgZW52X2FwcGVuZF9vcHQpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBpZiAoc3RybmNtcCAoYXJndltpXSwgbHR3cmFwcGVyX29wdGlvbl9wcmVmaXgsIG9wdF9wcmVmaXhfbGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogaG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZSwgYnV0IGl0IGlzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2Uga25vdyBhYm91dCBhbmQKKyAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCwgYWJvdmUgKGlubHVkaW5nIGR1bXAtc2NyaXB0KSwgdGhlbgorICAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvci4gT3RoZXJ3aXNlLCB0YXJnZXRzIG1pZ2h0IGJlZ2luIHRvIGJlbGlldmUKKyAgICAgICAgICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIHVzZSBvcHRpb25zIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGZpcnN0IHRpbWUgYW55IHVzZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHdlJ2xsCisgICAgICAgICAgICAgbmVlZCB0byBtYWtlIExUV1JBUFBFUl9PUFRJT05fUFJFRklYIGEgY29uZmlndXJlLXRpbWUgb3B0aW9uCisgICAgICAgICAgICAgb3IgYSBjb25maWd1cmUuYWMtc2V0dGFibGUgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgbHRfZmF0YWwgKCJVbnJlY29nbml6ZWQgb3B0aW9uIGluICVzIG5hbWVzcGFjZTogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlIC4uLiAqLworICAgICAgbmV3YXJnelsrK25ld2FyZ2NdID0geHN0cmR1cCAoYXJndltpXSk7CisgICAgfQorICBuZXdhcmd6WysrbmV3YXJnY10gPSBOVUxMOworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAgICAgKCgiKG1haW4pIGx0X2FyZ3ZfemVybyA6ICVzXG4iLCAobHRfYXJndl96ZXJvID8gbHRfYXJndl96ZXJvIDogIjxOVUxMPiIpKSk7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdhcmdjOyBpKyspCisgICAgeworICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBuZXdhcmd6WyVkXSAgIDogJXNcbiIsIGksIChuZXdhcmd6W2ldID8gbmV3YXJneltpXSA6ICI8TlVMTD4iKSkpOworICAgIH0KKworRU9GCisKKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIG1pbmd3KikKKwkJY2F0IDw8IkVPRiIKKyAgLyogZXhlY3YgZG9lc24ndCBhY3R1YWxseSB3b3JrIG9uIG1pbmd3IGFzIGV4cGVjdGVkIG9uIHVuaXggKi8KKyAgcnZhbCA9IF9zcGF3bnYgKF9QX1dBSVQsIGx0X2FyZ3ZfemVybywgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBuZXdhcmd6KTsKKyAgaWYgKHJ2YWwgPT0gLTEpCisgICAgeworICAgICAgLyogZmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgKi8KKyAgICAgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQgXCIlc1wiOiBlcnJubyA9ICVkXG4iLCBsdF9hcmd2X3plcm8sIGVycm5vKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKyAgcmV0dXJuIHJ2YWw7CitFT0YKKwkJOzsKKwkgICAgICAqKQorCQljYXQgPDwiRU9GIgorICBleGVjdiAobHRfYXJndl96ZXJvLCBuZXdhcmd6KTsKKyAgcmV0dXJuIHJ2YWw7IC8qID0xMjcsIGJ1dCBhdm9pZHMgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcgKi8KK0VPRgorCQk7OworCSAgICBlc2FjCisKKwkgICAgY2F0IDw8IkVPRiIKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3QgbnVtKQoreworICB2b2lkICpwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOworICBpZiAoIXApCisgICAgbHRfZmF0YWwgKCJNZW1vcnkgZXhoYXVzdGVkIik7CisKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgoreHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwKKwkJCSAgc3RyaW5nKSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKgorYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpiYXNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIoY2hlY2tfZXhlY3V0YWJsZSkgIDogJXNcbiIsCisJCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICAgICYmIChzdC5zdF9tb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQoreworICBpbnQgcnZhbCA9IDA7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFrZV9leGVjdXRhYmxlKSAgIDogJXNcbiIsCisJCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhdCAocGF0aCwgJnN0KSA+PSAwKQorICAgIHsKKyAgICAgIHJ2YWwgPSBjaG1vZCAocGF0aCwgc3Quc3RfbW9kZSB8IFNfSVhPVEggfCBTX0lYR1JQIHwgU19JWFVTUik7CisgICAgfQorICByZXR1cm4gcnZhbDsKK30KKworLyogU2VhcmNoZXMgZm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIHdyYXBwZXIuICBSZXR1cm5zCisgICBuZXdseSBhbGxvY2F0ZWQgZnVsbCBwYXRoIG5hbWUgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgICBEb2VzIG5vdCBjaGFzZSBzeW1saW5rcywgZXZlbiBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoZW0uCisqLworY2hhciAqCitmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpCit7CisgIGludCBoYXNfc2xhc2ggPSAwOworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpwX25leHQ7CisgIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLworICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07CisgIGludCB0bXBfbGVuOworICBjaGFyICpjb25jYXRfbmFtZTsKKworICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGZpbmRfZXhlY3V0YWJsZSkgICA6ICVzXG4iLAorCQkJICB3cmFwcGVyID8gKCp3cmFwcGVyID8gd3JhcHBlciA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKKworICBpZiAoKHdyYXBwZXIgPT0gTlVMTCkgfHwgKCp3cmFwcGVyID09ICdcMCcpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFic29sdXRlIHBhdGg/ICovCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCisgICAgeworICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICh3cmFwcGVyWzBdKSkKKwl7CisJICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworCSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwl9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgICAgfQorI2VuZGlmCisKKyAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKKyAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgeworCWhhc19zbGFzaCA9IDE7CisJYnJlYWs7CisgICAgICB9CisgIGlmICghaGFzX3NsYXNoKQorICAgIHsKKyAgICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOworICAgICAgaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHBfbmV4dCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnE7CisJICAgICAgc2l6ZV90IHBfbGVuOworCSAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisJCWlmIChJU19QQVRIX1NFUEFSQVRPUiAoKnEpKQorCQkgIGJyZWFrOworCSAgICAgIHBfbGVuID0gcSAtIHA7CisJICAgICAgcF9uZXh0ID0gKCpxID09ICdcMCcgPyBxIDogcSArIDEpOworCSAgICAgIGlmIChwX2xlbiA9PSAwKQorCQl7CisJCSAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisJCSAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKKwkJICB0bXBfbGVuID0gc3RybGVuICh0bXApOworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisJCSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKKwkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisJCSAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkJcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJICAgIH0KKwl9CisgICAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLworICAgIH0KKyAgLyogUmVsYXRpdmUgcGF0aCB8IG5vdCBmb3VuZCBpbiBwYXRoOiBwcmVwZW5kIGN3ZCAqLworICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7CisgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisgIGNvbmNhdF9uYW1lID0gWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCisgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICBYRlJFRSAoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpCit7CisjaWZuZGVmIFNfSVNMTksKKyAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyNlbHNlCisgIGNoYXIgYnVmW0xUX1BBVEhNQVhdOworICBzdHJ1Y3Qgc3RhdCBzOworICBjaGFyICp0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChwYXRoc3BlYyk7CisgIGNoYXIgKnA7CisgIGludCBoYXNfc3ltbGlua3MgPSAwOworICB3aGlsZSAoc3RybGVuICh0bXBfcGF0aHNwZWMpICYmICFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoImNoZWNraW5nIHBhdGggY29tcG9uZW50IGZvciBzeW1saW5rczogJXNcbiIsCisJCQkgICAgICB0bXBfcGF0aHNwZWMpKTsKKyAgICAgIGlmIChsc3RhdCAodG1wX3BhdGhzcGVjLCAmcykgPT0gMCkKKwl7CisJICBpZiAoU19JU0xOSyAocy5zdF9tb2RlKSAhPSAwKQorCSAgICB7CisJICAgICAgaGFzX3N5bWxpbmtzID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBzZWFyY2ggYmFja3dhcmRzIGZvciBsYXN0IERJUl9TRVBBUkFUT1IgKi8KKwkgIHAgPSB0bXBfcGF0aHNwZWMgKyBzdHJsZW4gKHRtcF9wYXRoc3BlYykgLSAxOworCSAgd2hpbGUgKChwID4gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCisJICAgIHAtLTsKKwkgIGlmICgocCA9PSB0bXBfcGF0aHNwZWMpICYmICghSVNfRElSX1NFUEFSQVRPUiAoKnApKSkKKwkgICAgeworCSAgICAgIC8qIG5vIG1vcmUgRElSX1NFUEFSQVRPUlMgbGVmdCAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAqcCA9ICdcMCc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNoYXIgKmVycnN0ciA9IHN0cmVycm9yIChlcnJubyk7CisJICBsdF9mYXRhbCAoIkVycm9yIGFjY2Vzc2luZyBmaWxlICVzICglcykiLCB0bXBfcGF0aHNwZWMsIGVycnN0cik7CisJfQorICAgIH0KKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgaWYgKCFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyAgICB9CisKKyAgdG1wX3BhdGhzcGVjID0gcmVhbHBhdGggKHBhdGhzcGVjLCBidWYpOworICBpZiAodG1wX3BhdGhzcGVjID09IDApCisgICAgeworICAgICAgbHRfZmF0YWwgKCJDb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKKyAgICB9CisgIHJldHVybiB4c3RyZHVwICh0bXBfcGF0aHNwZWMpOworI2VuZGlmCit9CisKK2NoYXIgKgorc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgc2l6ZV90IGxlbiwgcGF0bGVuOworCisgIGFzc2VydCAoc3RyICE9IE5VTEwpOworICBhc3NlcnQgKHBhdCAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIHBhdGxlbiA9IHN0cmxlbiAocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgICB7CisgICAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOworICAgICAgaWYgKHN0cmNtcCAoc3RyLCBwYXQpID09IDApCisJKnN0ciA9ICdcMCc7CisgICAgfQorICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZAorbHRfZXJyb3JfY29yZSAoaW50IGV4aXRfc3RhdHVzLCBjb25zdCBjaGFyICptb2RlLAorCSAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICIsIHByb2dyYW1fbmFtZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKK3ZvaWQKK2x0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfc2V0ZW52KSBzZXR0aW5nICclcycgdG8gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgPyBuYW1lIDogIjxOVUxMPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyB2YWx1ZSA6ICI8TlVMTD4iKSkpOworICB7CisjaWZkZWYgSEFWRV9TRVRFTlYKKyAgICAvKiBhbHdheXMgbWFrZSBhIGNvcHksIGZvciBjb25zaXN0ZW5jeSB3aXRoICFIQVZFX1NFVEVOViAqLworICAgIGNoYXIgKnN0ciA9IHhzdHJkdXAgKHZhbHVlKTsKKyAgICBzZXRlbnYgKG5hbWUsIHN0ciwgMSk7CisjZWxzZQorICAgIGludCBsZW4gPSBzdHJsZW4gKG5hbWUpICsgMSArIHN0cmxlbiAodmFsdWUpICsgMTsKKyAgICBjaGFyICpzdHIgPSBYTUFMTE9DIChjaGFyLCBsZW4pOworICAgIHNwcmludGYgKHN0ciwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOworICAgIGlmIChwdXRlbnYgKHN0cikgIT0gRVhJVF9TVUNDRVNTKQorICAgICAgeworICAgICAgICBYRlJFRSAoc3RyKTsKKyAgICAgIH0KKyNlbmRpZgorICB9Cit9CisKK2NoYXIgKgorbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKQoreworICBjaGFyICpuZXdfdmFsdWU7CisgIGlmIChvcmlnX3ZhbHVlICYmICpvcmlnX3ZhbHVlKQorICAgIHsKKyAgICAgIGludCBvcmlnX3ZhbHVlX2xlbiA9IHN0cmxlbiAob3JpZ192YWx1ZSk7CisgICAgICBpbnQgYWRkX2xlbiA9IHN0cmxlbiAoYWRkKTsKKyAgICAgIG5ld192YWx1ZSA9IFhNQUxMT0MgKGNoYXIsIGFkZF9sZW4gKyBvcmlnX3ZhbHVlX2xlbiArIDEpOworICAgICAgaWYgKHRvX2VuZCkKKyAgICAgICAgeworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlLCBvcmlnX3ZhbHVlKTsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIG9yaWdfdmFsdWVfbGVuLCBhZGQpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgYWRkKTsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIGFkZF9sZW4sIG9yaWdfdmFsdWUpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmV3X3ZhbHVlID0geHN0cmR1cCAoYWRkKTsKKyAgICB9CisgIHJldHVybiBuZXdfdmFsdWU7Cit9CisKK2ludAorbHRfc3BsaXRfbmFtZV92YWx1ZSAoY29uc3QgY2hhciAqYXJnLCBjaGFyKiogbmFtZSwgY2hhcioqIHZhbHVlKQoreworICBjb25zdCBjaGFyICpwOworICBpbnQgbGVuOworICBpZiAoIWFyZyB8fCAhKmFyZykKKyAgICByZXR1cm4gMTsKKworICBwID0gc3RyY2hyIChhcmcsIChpbnQpJz0nKTsKKworICBpZiAoIXApCisgICAgcmV0dXJuIDE7CisKKyAgKnZhbHVlID0geHN0cmR1cCAoKytwKTsKKworICBsZW4gPSBzdHJsZW4gKGFyZykgLSBzdHJsZW4gKCp2YWx1ZSk7CisgICpuYW1lID0gWE1BTExPQyAoY2hhciwgbGVuKTsKKyAgc3RybmNweSAoKm5hbWUsIGFyZywgbGVuLTEpOworICAoKm5hbWUpW2xlbiAtIDFdID0gJ1wwJzsKKworICByZXR1cm4gMDsKK30KKwordm9pZAorbHRfb3B0X3Byb2Nlc3NfZW52X3NldCAoY29uc3QgY2hhciAqYXJnKQoreworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworCisgIGlmIChsdF9zcGxpdF9uYW1lX3ZhbHVlIChhcmcsICZuYW1lLCAmdmFsdWUpICE9IDApCisgICAgeworICAgICAgWEZSRUUgKG5hbWUpOworICAgICAgWEZSRUUgKHZhbHVlKTsKKyAgICAgIGx0X2ZhdGFsICgiYmFkIGFyZ3VtZW50IGZvciAlczogJyVzJyIsIGVudl9zZXRfb3B0LCBhcmcpOworICAgIH0KKworICBsdF9zZXRlbnYgKG5hbWUsIHZhbHVlKTsKKyAgWEZSRUUgKG5hbWUpOworICBYRlJFRSAodmFsdWUpOworfQorCit2b2lkCitsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoY29uc3QgY2hhciAqYXJnKQoreworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworICBjaGFyICpuZXdfdmFsdWUgPSBOVUxMOworCisgIGlmIChsdF9zcGxpdF9uYW1lX3ZhbHVlIChhcmcsICZuYW1lLCAmdmFsdWUpICE9IDApCisgICAgeworICAgICAgWEZSRUUgKG5hbWUpOworICAgICAgWEZSRUUgKHZhbHVlKTsKKyAgICAgIGx0X2ZhdGFsICgiYmFkIGFyZ3VtZW50IGZvciAlczogJyVzJyIsIGVudl9wcmVwZW5kX29wdCwgYXJnKTsKKyAgICB9CisKKyAgbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgIFhGUkVFIChuZXdfdmFsdWUpOworICBYRlJFRSAobmFtZSk7CisgIFhGUkVFICh2YWx1ZSk7Cit9CisKK3ZvaWQKK2x0X29wdF9wcm9jZXNzX2Vudl9hcHBlbmQgKGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgY2hhciAqbmFtZSA9IE5VTEw7CisgIGNoYXIgKnZhbHVlID0gTlVMTDsKKyAgY2hhciAqbmV3X3ZhbHVlID0gTlVMTDsKKworICBpZiAobHRfc3BsaXRfbmFtZV92YWx1ZSAoYXJnLCAmbmFtZSwgJnZhbHVlKSAhPSAwKQorICAgIHsKKyAgICAgIFhGUkVFIChuYW1lKTsKKyAgICAgIFhGUkVFICh2YWx1ZSk7CisgICAgICBsdF9mYXRhbCAoImJhZCBhcmd1bWVudCBmb3IgJXM6ICclcyciLCBlbnZfYXBwZW5kX29wdCwgYXJnKTsKKyAgICB9CisKKyAgbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDEpOworICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgIFhGUkVFIChuZXdfdmFsdWUpOworICBYRlJFRSAobmFtZSk7CisgIFhGUkVFICh2YWx1ZSk7Cit9CisKK3ZvaWQKK2x0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfdXBkYXRlX2V4ZV9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lID8gbmFtZSA6ICI8TlVMTD4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gdmFsdWUgOiAiPE5VTEw+IikpKTsKKworICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCisgICAgeworICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICAgICAgLyogc29tZSBzeXN0ZW1zIGNhbid0IGNvcGUgd2l0aCBhICc6Jy10ZXJtaW5hdGVkIHBhdGggIycgKi8KKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSk7CisgICAgICB3aGlsZSAoKChsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSkpID4gMCkgJiYgSVNfUEFUSF9TRVBBUkFUT1IgKG5ld192YWx1ZVtsZW4tMV0pKQorICAgICAgICB7CisgICAgICAgICAgbmV3X3ZhbHVlW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKwordm9pZAorbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihsdF91cGRhdGVfbGliX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgPyBuYW1lIDogIjxOVUxMPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyB2YWx1ZSA6ICI8TlVMTD4iKSkpOworCisgIGlmIChuYW1lICYmICpuYW1lICYmIHZhbHVlICYmICp2YWx1ZSkKKyAgICB7CisgICAgICBjaGFyICpuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKKworRU9GCit9CisjIGVuZDogZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworCisjIGZ1bmNfbW9kZV9saW5rIGFyZy4uLgorZnVuY19tb2RlX2xpbmsgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisgICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCisgICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0CisgICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCisgICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KKyAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCisKKyAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZworICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKKyAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5CisgICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KKyAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgICopCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICBsaWJ0b29sX2FyZ3M9JG5vbm9wdAorICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKKyAgICBjb21waWxlX2NvbW1hbmQ9JG5vbm9wdAorICAgIGZpbmFsaXplX2NvbW1hbmQ9JG5vbm9wdAorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisgICAgaW5zdF9wcmVmaXhfZGlyPQorICAgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGRsZmlsZXM9CisgICAgZGxwcmVmaWxlcz0KKyAgICBkbHNlbGY9bm8KKyAgICBleHBvcnRfZHluYW1pYz1ubworICAgIGV4cG9ydF9zeW1ib2xzPQorICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQorICAgIGdlbmVyYXRlZD0KKyAgICBsaWJvYmpzPQorICAgIGx0bGlicz0KKyAgICBtb2R1bGU9bm8KKyAgICBub19pbnN0YWxsPW5vCisgICAgb2Jqcz0KKyAgICBub25fcGljX29iamVjdHM9CisgICAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9CisgICAgcHJlZmVyX3N0YXRpY19saWJzPW5vCisgICAgcHJlbG9hZD1ubworICAgIHByZXY9CisgICAgcHJldmFyZz0KKyAgICByZWxlYXNlPQorICAgIHJwYXRoPQorICAgIHhycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdGhyZWFkX3NhZmU9bm8KKyAgICB2aW5mbz0KKyAgICB2aW5mb19udW1iZXI9bm8KKyAgICB3ZWFrX2xpYnM9CisgICAgc2luZ2xlX21vZHVsZT0iJHt3bH0tc2luZ2xlX21vZHVsZSIKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zaGFyZWQpCisJdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgorCWJ1aWxkX29sZF9saWJzPW5vCisJYnJlYWsKKwk7OworICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJY2FzZSAkYXJnIGluCisJLWFsbC1zdGF0aWMpCisJICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwkgIDs7CisJLXN0YXRpYykKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9YnVpbHQKKwkgIDs7CisJLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCSAgOzsKKwllc2FjCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KKyAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCisKKyAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KKyAgICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBxYXJnPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdAorICAgICAgZnVuY19hcHBlbmQgbGlidG9vbF9hcmdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCisgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCWNhc2UgJHByZXYgaW4KKwlvdXRwdXQpCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcHJldiBpbgorCWRsZmlsZXN8ZGxwcmVmaWxlcykKKwkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgcHJlbG9hZD15ZXMKKwkgIGZpCisJICBjYXNlICRhcmcgaW4KKwkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCisJICBmb3JjZSkKKwkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbHNlCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWV4cHN5bXMpCisJICBleHBvcnRfc3ltYm9scz0iJGFyZyIKKwkgIHRlc3QgLWYgIiRhcmciIFwKKwkgICAgfHwgZnVuY19mYXRhbF9lcnJvciAic3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlleHBzeW1zX3JlZ2V4KQorCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZnJhbWV3b3JrKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgICAqLSotZGFyd2luKikKKwkgICAgICBjYXNlICIkZGVwbGlicyAiIGluCisJCSoiICRxYXJnLmx0ZnJhbWV3b3JrICIqKSA7OworCQkqKSBkZXBsaWJzPSIkZGVwbGlicyAkcWFyZy5sdGZyYW1ld29yayIgIyB0aGlzIGlzIGZpeGVkIGxhdGVyCisJCSAgIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICBlc2FjCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJaW5zdF9wcmVmaXgpCisJICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJb2JqZWN0bGlzdCkKKwkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCisJICAgIHNhdmVfYXJnPSRhcmcKKwkgICAgbW9yZWFyZ3M9CisJICAgIGZvciBmaWwgaW4gYGNhdCAiJHNhdmVfYXJnImAKKwkgICAgZG8KKyMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgorCSAgICAgIGFyZz0kZmlsCisJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJICAgICAgaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkJcGljX29iamVjdD0KKwkJbm9uX3BpY19vYmplY3Q9CisKKwkJIyBSZWFkIHRoZSAubG8gZmlsZQorCQlmdW5jX3NvdXJjZSAiJGFyZyIKKworCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmCisJCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJCWZpCisKKwkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCisKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQkgICAgICBwcmV2PQorCQkgICAgICBjb250aW51ZQorCQkgICAgZWxzZQorCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQkgICAgICBwcmV2PWRscHJlZmlsZXMKKwkJICAgIGZpCisJCSAgZmkKKworCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCisJCSAgICBwcmV2PQorCQkgIGZpCisKKwkJICAjIEEgUElDIG9iamVjdC4KKwkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJCSAgYXJnPSIkcGljX29iamVjdCIKKwkJZmkKKworCQkjIE5vbi1QSUMgb2JqZWN0LgorCQlpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKKworCQkgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KKwkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCQkgIGZpCisJCWVsc2UKKwkJICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJCSAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZWxzZQorCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KKwkJaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJICBmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgorCQkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJCSAgZnVuY19sbzJvICIkYXJnIgorCQkgIHBpY19vYmplY3Q9JHhkaXIkb2JqZGlyLyRmdW5jX2xvMm9fcmVzdWx0CisJCSAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCQkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgICAgICBlbHNlCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkJZmkKKwkgICAgICBmaQorCSAgICBkb25lCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImxpbmsgaW5wdXQgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgZmkKKwkgIGFyZz0kc2F2ZV9hcmcKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlwcmVjaW91c19yZWdleCkKKwkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlycGF0aCB8IHhycGF0aCkKKwkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAgY2FzZSAkYXJnIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCisJICAgIGNhc2UgIiRycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZWxzZQorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJc2hyZXh0KQorCSAgc2hyZXh0X2NtZHM9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJd2VhaykKKwkgIHdlYWtfbGlicz0iJHdlYWtfbGlicyAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhjY2xpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4Y29tcGlsZXIpCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGxpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAjIFNlZSBjb21tZW50IGZvciAtc3RhdGljIGZsYWcgYmVsb3csIGZvciBtb3JlIGRldGFpbHMuCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJZnVuY19mYXRhbF9lcnJvciAiXGAtYWxsb3ctdW5kZWZpbmVkJyBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAibW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmspCisJcHJldj1mcmFtZXdvcmsKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRhcmciCisJZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlpZiB0ZXN0IC16ICIkZGlyIjsgdGhlbgorCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInJlcXVpcmUgbm8gc3BhY2UgYmV0d2VlbiBcYC1MJyBhbmQgXGAkMSciCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm5lZWQgcGF0aCBmb3IgXGAtTCcgb3B0aW9uIgorCSAgZmkKKwlmaQorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgdGVzdCAteiAiJGFic2RpciIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCisJICBkaXI9IiRhYnNkaXIiCisJICA7OworCWVzYWMKKwljYXNlICIkZGVwbGlicyAiIGluCisJKiIgLUwkZGlyICIqKSA7OworCSopCisJICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCisJICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKKwkgIDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJEVDSE8gIlgkZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRkaXI7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiR0ZXN0YmluZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1sKikKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vczIqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBkZXBsaWJzPSIkZGVwbGlicyBTeXN0ZW0ubHRmcmFtZXdvcmsiCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCisJICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwllbGlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjX3IiOyB0aGVuCisJIGNhc2UgJGhvc3QgaW4KKwkgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjX3IgZGlyZWN0bHksIHVzZSAtcHRocmVhZCBmbGFnLgorCSAgIGNvbnRpbnVlCisJICAgOzsKKwkgZXNhYworCWZpCisJZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJbW9kdWxlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKworICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgIyBEYXJ3aW4gdXNlcyB0aGUgLWFyY2ggZmxhZyB0byBkZXRlcm1pbmUgb3V0cHV0IGFyY2hpdGVjdHVyZS4KKyAgICAgIC1tb2RlbHwtYXJjaHwtaXN5c3Jvb3QpCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmV8LXRocmVhZHMpCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGFyZyIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbXVsdGlfbW9kdWxlKQorCXNpbmdsZV9tb2R1bGU9IiR7d2x9LW11bHRpX21vZHVsZSIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotZGFyd2luKiB8ICotY2VnY2MqKQorCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCisJICAjIGFuZCBEYXJ3aW4gaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgIGZ1bmNfd2FybmluZyAiXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiCisJICBmdW5jX3dhcm5pbmcgImFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtb2JqZWN0bGlzdCkKKwlwcmV2PW9iamVjdGxpc3QKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCisJcHJldj1wcmVjaW91c19yZWdleAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkYXJnIgorCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNoYXJlZCkKKwkjIFRoZSBlZmZlY3RzIG9mIC1zaGFyZWQgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNocmV4dCkKKwlwcmV2PXNocmV4dAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLW51bWJlcikKKwlwcmV2PXZpbmZvCisJdmluZm9fbnVtYmVyPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXdlYWspCisgICAgICAgIHByZXY9d2VhaworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgYXJnPSIkYXJnICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtV2wsKikKKwlmdW5jX3N0cmlwbmFtZSAnLVdsLCcgJycgIiRhcmciCisJYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCisJICBhcmc9IiRhcmcgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YQ0NsaW5rZXIpCisJcHJldj14Y2NsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgLW1zZ18qIGZvciBvc2YgY2MKKyAgICAgIC1tc2dfKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICMgLTY0LCAtbWlwc1swLTldIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC1yWzAtOV1bMC05XSogc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igb24gdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFN1biBjb21waWxlcgorICAgICAgIyArREEqLCArREQqIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgSFAgY29tcGlsZXIKKyAgICAgICMgLXEqIHBhc3MgdGhyb3VnaCBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCisgICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKKyAgICAgICMgY29tcGlsZXIgYXJncyBmb3IgR0NDCisgICAgICAjIC1GL3BhdGggZ2l2ZXMgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCisgICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qIHBhc3MgdGhyb3VnaCBwcm9maWxpbmcgZmxhZyBmb3IgR0NDCisgICAgICAjIEBmaWxlIEdDQyByZXNwb25zZSBmaWxlcworICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCisgICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCopCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworCisgICAgICAqLiRvYmpleHQpCisJIyBBIHN0YW5kYXJkIG9iamVjdC4KKwlvYmpzPSIkb2JqcyAkYXJnIgorCTs7CisKKyAgICAgICoubG8pCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgIiRhcmciCisKKwkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQlwcmV2PQorCQljb250aW51ZQorCSAgICAgIGVsc2UKKwkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkJcHJldj1kbHByZWZpbGVzCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgorCSAgICAgIHByZXY9CisJICAgIGZpCisKKwkgICAgIyBBIFBJQyBvYmplY3QuCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWVsc2UKKwkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICAgIGZ1bmNfbG8ybyAiJGFyZyIKKwkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBwcmV2PQorCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICBwcmV2PQorCWVsc2UKKwkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKyAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAorICAgIGVsc2UKKyAgICAgIHNobGliX3NlYXJjaF9wYXRoPQorICAgIGZpCisgICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCisgICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgorCisgICAgZnVuY19kaXJuYW1lICIkb3V0cHV0IiAiLyIgIiIKKyAgICBvdXRwdXRfb2JqZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCRvYmpkaXIiCisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgZnVuY19ta2Rpcl9wICIkb3V0cHV0X29iamRpciIKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIgorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9kZXBzIDsgdGhlbgorCWNhc2UgIiRsaWJzICIgaW4KKwkqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCisKKyAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCisgICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCisgICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwczsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCisJZG9uZQorICAgICAgZmkKKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgZmkKKworICAgIGRlcGxpYnM9CisgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKyAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfcGF0aD0gIyBwYXRocyB0aGF0IGNvbnRhaW4gbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBsaWIpCisJcGFzc2VzPSJjb252IGRscHJlb3BlbiBsaW5rIgorCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbworCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5sYSkgOzsKKwkgICopCisJICAgIGZ1bmNfZmF0YWxfaGVscCAibGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgIHByb2cpCisJY29tcGlsZV9kZXBsaWJzPQorCWZpbmFsaXplX2RlcGxpYnM9CisJYWxsZGVwbGlicz1ubworCW5ld2RsZmlsZXM9CisJbmV3ZGxwcmVmaWxlcz0KKwlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCisJOzsKKyAgICAqKSAgcGFzc2VzPSJjb252IgorCTs7CisgICAgZXNhYworCisgICAgZm9yIHBhc3MgaW4gJHBhc3NlczsgZG8KKyAgICAgICMgVGhlIHByZW9wZW4gcGFzcyBpbiBsaWIgbW9kZSByZXZlcnNlcyAkZGVwbGliczsgcHV0IGl0IGJhY2sgaGVyZQorICAgICAgIyBzbyB0aGF0IC1MIGNvbWVzIGJlZm9yZSBsaWJzIHRoYXQgbmVlZCBpdCBmb3IgaW5zdGFuY2UuLi4KKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiOyB0aGVuCisJIyMgRklYTUU6IEZpbmQgdGhlIHBsYWNlIHdoZXJlIHRoZSBsaXN0IGlzIHJlYnVpbHQgaW4gdGhlIHdyb25nCisJIyMgICAgICAgIG9yZGVyLCBhbmQgZml4IGl0IHRoZXJlIHByb3Blcmx5CisgICAgICAgIHRtcF9kZXBsaWJzPQorCWZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICB0bXBfZGVwbGlicz0iJGRlcGxpYiAkdG1wX2RlcGxpYnMiCisJZG9uZQorCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIjsgdGhlbgorCWxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwljYXNlICRwYXNzIGluCisJZGxvcGVuKSBsaWJzPSIkZGxmaWxlcyIgOzsKKwlkbHByZW9wZW4pIGxpYnM9IiRkbHByZWZpbGVzIiA7OworCWxpbmspIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSAkZGVwZW5kZW5jeV9saWJzIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixkbHByZW9wZW4iOyB0aGVuCisJIyBDb2xsZWN0IGFuZCBmb3J3YXJkIGRlcGxpYnMgb2YgcHJlb3BlbmVkIGxpYnRvb2wgbGlicworCWZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCisJICAjIElnbm9yZSBub24tbGlidG9vbC1saWJzCisJICBkZXBlbmRlbmN5X2xpYnM9CisJICBjYXNlICRsaWIgaW4KKwkgICoubGEpCWZ1bmNfc291cmNlICIkbGliIiA7OworCSAgZXNhYworCisJICAjIENvbGxlY3QgcHJlb3BlbmVkIGxpYnRvb2wgZGVwbGlicywgZXhjZXB0IGFueSB0aGlzIGxpYnJhcnkKKwkgICMgaGFzIGRlY2xhcmVkIGFzIHdlYWsgbGlicworCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworICAgICAgICAgICAgZGVwbGliX2Jhc2U9YCRFQ0hPICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKwkgICAgY2FzZSAiICR3ZWFrX2xpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliX2Jhc2UgIiopIDs7CisJICAgICopIGRlcGxpYnM9IiRkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlkb25lCisJbGlicz0iJGRscHJlZmlsZXMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisKKyAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCisJbGliPQorCWZvdW5kPW5vCisJY2FzZSAkZGVwbGliIGluCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZGVwbGliIgorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgorCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkJICAgICogKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGZ1bmNfc3RyaXBuYW1lICctbCcgJycgIiRkZXBsaWIiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZWxzZQorCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZmkKKwkgIGZvciBzZWFyY2hkaXIgaW4gJHNlYXJjaGRpcnM7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmIGZ1bmNfbGFsaWJfcCAiJGxpYiI7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGZ1bmNfc291cmNlICIkbGliIgorCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCQkgICAgbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKKwkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkJICAgIGVsc2UKKwkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkJICAgIGZpCisJCSAgICBjb250aW51ZQorCQkgIGZpCisJCWZpCisJCTs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCSoubHRmcmFtZXdvcmspCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCisJCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJCSAgICAqIiAkZGVwbGliICIqKSA7OworCQkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgOzsKKwkgICopCisJICAgIGZ1bmNfd2FybmluZyAiXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgY29udGludWUKKwkgIDs7ICMgLUwKKwktUiopCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRkZXBsaWIiCisJICAgIGRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgICMgTGlua2luZyBjb252ZW5pZW5jZSBtb2R1bGVzIGludG8gc2hhcmVkIGxpYnJhcmllcyBpcyBhbGxvd2VkLAorCSAgICAjIGJ1dCBsaW5raW5nIG90aGVyIHN0YXRpYyBsaWJyYXJpZXMgaXMgbm9uLXBvcnRhYmxlLgorCSAgICBjYXNlICIgJGRscHJlY29udmVuaWVuY2VsaWJzICIgaW4KKwkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgKikKKwkgICAgICB2YWxpZF9hX2xpYj1ubworCSAgICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJCW1hdGNoX3BhdHRlcm4qKQorCQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCQkgIGlmIGV2YWwgIlwkRUNITyBcIlgkZGVwbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgIHZhbGlkX2FfbGliPXllcworCQkgIGZpCisJCTs7CisJCXBhc3NfYWxsKQorCQkgIHZhbGlkX2FfbGliPXllcworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgorCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCQkkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSRFQ0hPICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKKwkJJEVDSE8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2UgaGVyZS4iCisJICAgICAgZWxzZQorCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCisJCSRFQ0hPICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCQlkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjb250aW51ZQorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgOzsgIyAqLiRsaWJleHQKKwkqLmxvIHwgKi4kb2JqZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAorCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRkZXBsaWIiCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJJURFUExJQlMlKQorCSAgYWxsZGVwbGlicz15ZXMKKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMgIyBjYXNlICRkZXBsaWIKKworCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGxpYiIgXAorCSAgfHwgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCWxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9CisJIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKKwkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlcyBpbnN0YWxsZWQsIG9yIHNob3VsZG5vdGxpbmsKKwlpbnN0YWxsZWQ9eWVzCisJc2hvdWxkbm90bGluaz1ubworCWF2b2lkdGVtcHJwYXRoPQorCisKKwkjIFJlYWQgdGhlIC5sYSBmaWxlCisJZnVuY19zb3VyY2UgIiRsaWIiCisKKwkjIENvbnZlcnQgIi1mcmFtZXdvcmsgZm9vIiB0byAiZm9vLmx0ZnJhbWV3b3JrIgorCWlmIHRlc3QgLW4gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIjsgdGhlbgorCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICJYJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAorCSAgZm9yIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgaW4gJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzOyBkbworCSAgICBjYXNlICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgICAqIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyAiKikgOzsKKwkgICAgICAqKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIjs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIlggJGRlcGVuZGVuY3lfbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAorCSAgIHsgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB9OyB0aGVuCisJICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkZGxvcGVuIgorCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRscHJlb3BlbiIKKwlmaQorCisJaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgIyBPbmx5IGNoZWNrIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCisJICBmaQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICBkb25lCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBjb252CisKKworCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KKwlsaW5rbGliPQorCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkgIGxpbmtsaWI9IiRsIgorCWRvbmUKKwlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gZGxvcGVuCisKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRsYWRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7CisJKikKKwkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxhZGlyJyIKKwkgICAgZnVuY193YXJuaW5nICJwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIgorCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKKwkgIGZpCisJICA7OworCWVzYWMKKwlmdW5jX2Jhc2VuYW1lICIkbGliIgorCWxhbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgorCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbGliZGlyIgorCSAgZmkKKwkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkbGFuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIiAmJiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGxpYnJhcmllcyBtYXkgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCisJICBmaQorCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KKwkgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQlkbHByZWNvbnZlbmllbmNlbGlicz0iJGRscHJlY29udmVuaWVuY2VsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgorCSAgZWxzZQorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgorCSAgZmkKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcworCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkKKworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCisJICBsaW5rYWxsZGVwbGlicz1ubworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKKwkgIGZpCisKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICAgICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCQkgOzsKKwkgICAgZXNhYworCSAgICAjIE5lZWQgdG8gbGluayBhZ2FpbnN0IGFsbCBkZXBlbmRlbmN5X2xpYnM/CisJICAgIGlmIHRlc3QgIiRsaW5rYWxsZGVwbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgIyBOZWVkIHRvIGhhcmRjb2RlIHNoYXJlZCBsaWJyYXJ5IHBhdGhzCisJICAgICAgIyBvci9hbmQgbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUgIyBmb3IgZGVwbGliCisJICBjb250aW51ZQorCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICAgIHsgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8CisJICAgICAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCx5ZXMiOyB9IHx8CisJICAgICAgIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKKwkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCisJICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoOiIgaW4KKwkgICAgICAqIiRhYnNkaXI6IiopIDs7CisJICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGgkYWJzZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisKKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgIHVzZV9zdGF0aWNfbGlicz1ubworCWZpCisJaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgeyB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgIyBObyBwb2ludCBpbiByZWxpbmtpbmcgRExMcyBiZWNhdXNlIHBhdGhzIGFyZSBub3QgZW5jb2RlZAorCSAgICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPW5vCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgICAgbm90aW5zdF9kZXBsaWJzPSIkbm90aW5zdF9kZXBsaWJzICRsaWIiCisJICAgICAgbmVlZF9yZWxpbms9eWVzCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQorCisJICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24gc29tZQorCSAgIyBzeXN0ZW1zIChkYXJ3aW4pLiAgRG9uJ3QgYmxlYXQgYWJvdXQgZGxvcGVuZWQgbW9kdWxlcyB0aG91Z2ghCisJICBkbG9wZW5tb2R1bGU9IiIKKwkgIGZvciBkbHByZW1vZHVsZXRlc3QgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgIGlmIHRlc3QgIlgkZGxwcmVtb2R1bGV0ZXN0IiA9ICJYJGxpYiI7IHRoZW4KKwkgICAgICBkbG9wZW5tb2R1bGU9IiRkbHByZW1vZHVsZXRlc3QiCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgIGRvbmUKKwkgIGlmIHRlc3QgLXogIiRkbG9wZW5tb2R1bGUiICYmIHRlc3QgIiRzaG91bGRub3RsaW5rIiA9IHllcyAmJiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgICRFQ0hPCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgorCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQorCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwkgICAgc2hpZnQKKwkgICAgcmVhbG5hbWU9IiQxIgorCSAgICBzaGlmdAorCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/CisJICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgc29uYW1lPSIkZGxuYW1lIgorCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgICAgICAjIGJsZWggd2luZG93cworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAqY3lnd2luKiB8IG1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCQltYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJdmVyc3VmZml4PSItJG1ham9yIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJICAgIGVsc2UKKwkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKwkgICAgZmkKKworCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQorCSAgICBzb3Jvb3Q9IiRzb25hbWUiCisJICAgIGZ1bmNfYmFzZW5hbWUgIiRzb3Jvb3QiCisJICAgIHNvbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmRsbCcgIiRzb25hbWUiCisJICAgIG5ld2xpYj1saWJpbXAtJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdC5hCisKKwkgICAgIyBJZiB0aGUgbGlicmFyeSBoYXMgbm8gZXhwb3J0IGxpc3QsIHRoZW4gY3JlYXRlIG9uZSBub3cKKwkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYiOyB0aGVuIDoKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgJ2V4aXQgJD8nCisJICAgIGZpCisKKwkgICAgIyBDcmVhdGUgJG5ld2xpYgorCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCisJICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIGltcG9ydCBsaWJyYXJ5IGZvciBcYCRzb25hbWUnIgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiICdleGl0ICQ/JworCSAgICBmaQorCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQorCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKKwkgICAgbGlua2xpYj0kbmV3bGliCisJICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkJY2FzZSAkaG9zdCBpbgorCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCisJCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1kYXJ3aW4qICkKKwkJICAgICMgaWYgdGhlIGxpYiBpcyBhIChub24tZGxvcGVuZWQpIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QKKwkJICAgICMgbGluayBhZ2FpbnN0IGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBlYXJsaWVyIHdhcm5pbmdzCisJCSAgICBpZiAvdXNyL2Jpbi9maWxlIC1MICRhZGQgMj4gL2Rldi9udWxsIHwKKwkJCSAkR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCisJCSAgICAgIGlmIHRlc3QgIlgkZGxvcGVubW9kdWxlIiAhPSAiWCRsaWIiOyB0aGVuCisJCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCisJCQlpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgorCQkJICAkRUNITworCQkJICAkRUNITyAiKioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCQkgICRFQ0hPICIqKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKKwkJCWVsc2UKKwkJCSAgYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJCWZpCisJCSAgICAgIGVsaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCQkJYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJICAgICAgZmkKKwkJICAgIGZpCisJCWVzYWMKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKKwkJZXNhYworCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIHJlbGluaykKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICAgIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQkgIGNhc2UgJGxpYmRpciBpbgorCQkgICAgW1xcL10qKQorCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCisJICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OworCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWRkX3NobGlicGF0aDoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgorCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgorCQlhZGQ9IiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkJYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJY2FzZSAkbGliZGlyIGluCisJCSAgW1xcL10qKQorCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICAkRUNITworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCisJICAgICRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKKwkgICAgICAkRUNITyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgJEVDSE8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKKwkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCQkkRUNITworCQkkRUNITyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCSRFQ0hPICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCQkkRUNITyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCQkkRUNITyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGxpYmRpciIKKwkgICAgICAgICAgIHRlbXBfeHJwYXRoPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgorCSAgZmkKKworCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzZWFyY2ggcGF0aHMgb2YgYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzCisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAtTCopIHBhdGg9IiRkZXBsaWIiIDs7CisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfZGlybmFtZSAiJGRlcGxpYiIgIiIgIi4iCisJCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCQljYXNlICRkaXIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNkaXI9IiRkaXIiIDs7CisJCSopCisJCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKKwkJICAgIGFic2Rpcj0iJGRpciIKKwkJICBmaQorCQkgIDs7CisJCWVzYWMKKwkJaWYgJEdSRVAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotZGFyd2luKikKKwkJICBkZXBkZXBsPQorCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCisJCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KKwkJICAgICAgZGVwZGVwbD0kdG1wCisJCSAgICBkb25lCisJCSAgICBpZiB0ZXN0IC1mICIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiIDsgdGhlbgorCQkgICAgICBkZXBkZXBsPSIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiCisJCSAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0x9IC1MICRkZXBkZXBsIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRkYXJ3aW5faW5zdGFsbF9uYW1lIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWAke09UT09MNjR9IC1MICRkZXBkZXBsICB8IGF3ayAne2lmIChOUiA9PSAyKSB7cHJpbnQgJDE7ZXhpdH19J2AKKyAgICAgICAgICAgICAgICAgICAgICBmaQorCQkgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWR5bGliX2ZpbGUgJHt3bH0ke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAtZHlsaWJfZmlsZSAke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIHBhdGg9CisJCSAgICBmaQorCQkgIGZpCisJCSAgOzsKKwkJKikKKwkJICBwYXRoPSItTCRhYnNkaXIvJG9iamRpciIKKwkJICA7OworCQllc2FjCisJCWVsc2UKKwkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQkgIHRlc3QgIiRhYnNkaXIiICE9ICIkbGliZGlyIiAmJiBcCisJCSAgICBmdW5jX3dhcm5pbmcgIlxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiCisKKwkJICBwYXRoPSItTCRhYnNkaXIiCisJCWZpCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJHBhdGggIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KKwlmaSAjIGxpbmttb2RlID0gbGliCisgICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicworICAgICAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSAicHJvZyI7IHRoZW4KKwkgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRjb21waWxlX2RlcGxpYnMiCisJICBmaW5hbGl6ZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGZpbmFsaXplX2RlcGxpYnMiCisJZWxzZQorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAiYCRFQ0hPICJYICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlmaQorICAgICAgZmkKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCisJaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KKwkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgIGxpYl9zZWFyY2hfcGF0aD0KKwkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KKwkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBuZXdsaWJfc2VhcmNoX3BhdGg9CisJZmkKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KKwkgIHZhcnM9ImRlcGxpYnMiCisJZWxzZQorCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCisJZmkKKwlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKKwkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgorCSAgbmV3X2xpYnM9CisJICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KKwkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KKwkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKKwkgICAgIyAgICAgICAgYnJva2VuOgorCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgorCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KKwkgICAgIyBwcmFjdGljZToKKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAtUiopIDs7CisJICAgICopCisJICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKKwkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKKwkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQorCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCisJICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcworCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQorCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKKwkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAorCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKKwkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKKwkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5CisJICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQorCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0CisJICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCisJICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAgICopCisJCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSA7OworCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikKKwkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgorCWRvbmUgIyBmb3IgdmFyCisgICAgICBmaQorICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKyAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQorICAgICAgdG1wX2xpYnM9CisgICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KKwljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgorCSoiICRpICIqKQorCSAgaT0iIgorCSAgOzsKKwllc2FjCisJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKKwlmaQorICAgICAgZG9uZQorICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicworICAgIGRvbmUgIyBmb3IgcGFzcworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisgICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorICAgIGZpCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIG9sZGxpYikKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorICAgICAgZmkKKworICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgorICAgICAgKlwgLWwqIHwgKlwgLUwqKQorCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgb2xkbGlicz0iJG91dHB1dCIKKyAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRvdXRwdXRuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJOzsKKyAgICAgICopCisJdGVzdCAiJG1vZHVsZSIgPSBubyAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgImxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciCisKKwlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgorCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJZWxzZQorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbGlibmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIKKwllbHNlCisJICAkRUNITworCSAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgorCSAgJEVDSE8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCisJICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKKwlmaQorICAgICAgZmkKKworICAgICAgdGVzdCAiJGRsc2VsZiIgIT0gbm8gJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIgorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBzaGlmdAorICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKKwlmdW5jX3dhcm5pbmcgImlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IgorCisgICAgICBpbnN0YWxsX2xpYmRpcj0iJDEiCisKKyAgICAgIG9sZGxpYnM9CisgICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCisJICAjIFNvbWUgY29tcGlsZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBhIGAuYWwnIGV4dGVuc2lvbiBzbworCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZXh0ZW5zaW9uIGFuCisJICAjIGFyY2hpdmUgbm9ybWFsbHkgd291bGQuCisJICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCisJICBidWlsZF9vbGRfbGlicz15ZXMKKwlmaQorCisJdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKworCXRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKyAgICAgIGVsc2UKKworCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCisJc2V0IGR1bW15ICR2aW5mbyAwIDAgMAorCXNoaWZ0CisJSUZTPSIkc2F2ZV9pZnMiCisKKwl0ZXN0IC1uICIkNyIgJiYgXAorCSAgZnVuY19mYXRhbF9oZWxwICJ0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciCisKKwkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcworCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCisJIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKKworCWNhc2UgJHZpbmZvX251bWJlciBpbgorCXllcykKKwkgIG51bWJlcl9tYWpvcj0iJDEiCisJICBudW1iZXJfbWlub3I9IiQyIgorCSAgbnVtYmVyX3JldmlzaW9uPSIkMyIKKwkgICMKKwkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0CisJICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgorCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKKwkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKKwkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCisJICAjCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93c3xub25lKQorCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCisJICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCisJICAgIDs7CisJICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCisJICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBhZ2U9IjAiCisJICAgIDs7CisJICBpcml4fG5vbnN0b3B1eCkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBsdF9pcml4X2luY3JlbWVudD1ubworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQxIgorCSAgcmV2aXNpb249IiQyIgorCSAgYWdlPSIkMyIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCisJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKKwkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgZWxzZQorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKKwkgIGZpCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICA7OworCisJb3NmKQorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JGFnZQorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGxvb3AKKwkgICAgaWZhY2U9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXJpdGggJGxvb3AgLSAxCisJICAgIGxvb3A9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXFueCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlzdW5vcykKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJd2luZG93cykKKwkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKKwkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJICA7OworCisJKikKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAidW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgOzsKKwllc2FjCisKKwkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgorCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICBtYWpvcj0KKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2luKQorCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKKwkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQorCSAgICB2ZXJzdHJpbmc9CisJICAgIDs7CisJICAqKQorCSAgICB2ZXJzdHJpbmc9IjAuMCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgICAgdmVyc3VmZml4PQorCSAgZWxzZQorCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCisJICBmaQorCWZpCisKKwkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKKwlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdWZmaXg9CisJICB2ZXJzdHJpbmc9IiIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJ1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIgorCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICBmaQorCWVsc2UKKwkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgorCWZpCisKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkbGlibmFtZSIgIiRsaWJuYW1lIiAieWVzIgorICAgICAgbGlib2Jqcz0iJGxpYm9ianMgJHN5bWZpbGVvYmoiCisgICAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCisgICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKKwkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KKwlyZW1vdmVsaXN0PQorCXRlbXByZW1vdmVsaXN0PWAkRUNITyAiJG91dHB1dF9vYmpkaXIvKiJgCisJZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbworCSAgY2FzZSAkcCBpbgorCSAgICAqLiRvYmpleHQgfCAqLmdjbm8pCisJICAgICAgIDs7CisJICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCisJICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgorCQkgaWYgJEVDSE8gIiRwIiB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKKwkJIHRoZW4KKwkJICAgY29udGludWUKKwkJIGZpCisJICAgICAgIGZpCisJICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgorCSAgICAgICA7OworCSAgICAqKSA7OworCSAgZXNhYworCWRvbmUKKwl0ZXN0IC1uICIkcmVtb3ZlbGlzdCIgJiYgXAorCSAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciBcJHJlbW92ZWxpc3QiCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRFQ0hPICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgICNmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworICAgICAgIwlsaWJfc2VhcmNoX3BhdGg9YCRFQ0hPICJYJGxpYl9zZWFyY2hfcGF0aCAiIHwgJFhzZWQgLWUgInMlICRwYXRoICUgJWciYAorICAgICAgIwlkZXBsaWJzPWAkRUNITyAiWCRkZXBsaWJzICIgfCAkWHNlZCAtZSAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICMJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiWCRkZXBlbmRlbmN5X2xpYnMgIiB8ICRYc2VkIC1lICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgI2RvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJdGVtcF94cnBhdGg9CisJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbworCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAorICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgorICAgICAgZGxmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbworCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbGZpbGVzPSIkZGxmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcworICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbworCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyopCisJICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZGVwbGlicz0iJGRlcGxpYnMgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICA7OworCSAgKi0qLW5ldGJzZCopCisJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICA7OworCSAgKikKKwkgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zIGlmIG5lY2Vzc2FyeS4KKwkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbmVlZF9sYyIgPSAieWVzIjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCisJIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgorCW5hbWVfc2F2ZT0kbmFtZQorCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQorCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQorCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKKwltYWpvcl9zYXZlPSRtYWpvcgorCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCisJIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCisJIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/CisJcmVsZWFzZT0iIgorCXZlcnN1ZmZpeD0iIgorCW1ham9yPSIiCisJbmV3ZGVwbGlicz0KKwlkcm9wcGVkZGVwcz1ubworCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJcGFzc19hbGwpCisJICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KKwkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKwkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KKwkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAorCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3IuCisJICBuZXdkZXBsaWJzPSRkZXBsaWJzCisJICA7OworCXRlc3RfY29tcGlsZSkKKwkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCisJICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAorCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKKwkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdC5jCisJICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisJICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAorCSAgaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnM7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQlpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCSAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgKiIgJGkgIiopCisJCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkJICAgIGk9IiIKKwkJICAgIDs7CisJCSAgZXNhYworCQlmaQorCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAorCQkgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgZGVwbGliX21hdGNoPSQxCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICAkRUNITworCQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICAkRUNITyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgorCQkgICAgJEVDSE8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICBmaQorCQlmaQorCQk7OworCSAgICAgICopCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKKwkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQkkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0CisJCWlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKKwkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgICBkZXBsaWJfbWF0Y2g9JDEKKwkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICBlbHNlCisJCSAgICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgICAkRUNITworCQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICAgICRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJICAgICAgJEVDSE8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgorCQkgICAgICAkRUNITyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgICAgZmkKKwkJICBmaQorCQllbHNlCisJCSAgZHJvcHBlZGRlcHM9eWVzCisJCSAgJEVDSE8KKwkJICAkRUNITyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgICRFQ0hPICIqKiogbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgJEVDSE8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCisJCSAgJEVDSE8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCisJCWZpCisJCTs7CisJICAgICAgKikKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaQorCSAgOzsKKwlmaWxlX21hZ2ljKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIGNhc2UgJGFfZGVwbGliIGluCisJICAgIC1sKikKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgorCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgfAorCQkJICRHUkVQICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCisJCQljb250aW51ZQorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCisJCQljYXNlICRwb3RsaWJsaW5rIGluCisJCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKKwkJCSopIHBvdGxpYj1gJEVDSE8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKKwkJCWVzYWMKKwkJICAgICAgZG9uZQorCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgfAorCQkJICRTRUQgLWUgMTBxIHwKKwkJCSAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCSRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJJEVDSE8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCisJCWVsc2UKKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkRUNITyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW1hdGNoX3BhdHRlcm4qKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgY2FzZSAkYV9kZXBsaWIgaW4KKwkgICAgLWwqKQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCisJICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAorCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiWCRwb3RlbnRfbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIHwgXAorCQkgICAgICAgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgICAgICBhX2RlcGxpYj0iIgorCQkgICAgICBicmVhayAyCisJCSAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCSRFQ0hPCisJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQkkRUNITyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKKwkJZWxzZQorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRFQ0hPICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgdG1wX2RlcGxpYnM9YCRFQ0hPICJYICRkZXBsaWJzIiB8ICRYc2VkIFwKKwkgICAgICAtZSAncy8gLWxjJC8vJyAtZSAncy8gLVtMUl1bXiBdKi8vZydgCisJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCisJICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJworCSAgICAgIHRtcF9kZXBsaWJzPWAkRUNITyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgInMsJGksLCJgCisJICAgIGRvbmUKKwkgIGZpCisJICBpZiAkRUNITyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvWwkgXS8vZycgfAorCSAgICAgJEdSRVAgLiA+L2Rldi9udWxsOyB0aGVuCisJICAgICRFQ0hPCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgIGZpCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSB3aXRoIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICBuZXdkZXBsaWJzPWAkRUNITyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICAkRUNITworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgJEVDSE8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICAkRUNITyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgICAgICRFQ0hPCisJICAgICAgJEVDSE8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgICRFQ0hPICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCSAgICAgICRFQ0hPICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgJEVDSE8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICAkRUNITyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgJEVDSE8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgorCSAgICAgICRFQ0hPCisJICAgICAgJEVDSE8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCisJICAgICAgJEVDSE8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgICRFQ0hPICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgJEVDSE8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKwlmaQorCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorCWRlcGxpYnM9JG5ld2RlcGxpYnMKKyAgICAgIGZpCisgICAgICAjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisgICAgICBjYXNlICRob3N0IGluCisJKi0qLWRhcndpbiopCisJICBuZXdkZXBsaWJzPWAkRUNITyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPWAkRUNITyAiWCAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBkZXBsaWJzPWAkRUNITyAiWCAkZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGRlcGxpYnM9IiRuZXdfbGlicyIKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCQllbHNlCisJCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQkgICAgOzsKKwkJICAqKQorCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgorCSAgICAgIGZpCisJICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgorCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRcIgorCSAgICBlbHNlCisJICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIGZpCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgICAgcnBhdGg9CisJICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgICBkb25lCisJICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgorCSAgZmkKKwkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCisJZmkKKworCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKKwl0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXNoaWZ0CisJcmVhbG5hbWU9IiQxIgorCXNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJEVDSE8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKwlkZWxmaWxlcz0KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKKwkgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzIgorCWZpCisKKwlvcmlnX2V4cG9ydF9zeW1ib2xzPQorCWNhc2UgJGhvc3Rfb3MgaW4KKwljeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICMgZXhwb3J0aW5nIHVzaW5nIHVzZXIgc3VwcGxpZWQgc3ltZmlsZQorCSAgICBpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgIT0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAjIGFuZCBpdCdzIE5PVCBhbHJlYWR5IGEgLmRlZiBmaWxlLiBNdXN0IGZpZ3VyZSBvdXQKKwkgICAgICAjIHdoaWNoIG9mIHRoZSBnaXZlbiBzeW1ib2xzIGFyZSBkYXRhIHN5bWJvbHMgYW5kIHRhZworCSAgICAgICMgdGhlbSBhcyBzdWNoLiBTbywgdHJpZ2dlciB1c2Ugb2YgZXhwb3J0X3N5bWJvbHNfY21kcy4KKwkgICAgICAjIGV4cG9ydF9zeW1ib2xzIGdldHMgcmVhc3NpZ25lZCBpbnNpZGUgdGhlICJwcmVwYXJlCisJICAgICAgIyB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzIiBpZiBzdGF0ZW1lbnQsIHNvIHRoZQorCSAgICAgICMgaW5jbHVkZV9leHBzeW1zIGxvZ2ljIHN0aWxsIHdvcmtzLgorCSAgICAgIG9yaWdfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0KKwkgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJICAgIGZpCisJICBmaQorCSAgOzsKKwllc2FjCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICBldmFsIGNtZD1cIiRjbWRcIgorCSAgICAgIGZ1bmNfbGVuICIgJGNtZCIKKwkgICAgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCQlmdW5jX3Nob3dfZXZhbCAiJGNtZCIgJ2V4aXQgJD8nCisJCXNraXBwZWRfZXhwb3J0PWZhbHNlCisJICAgICAgZWxzZQorCQkjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KKwkJZnVuY192ZXJib3NlICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKKwkJc2tpcHBlZF9leHBvcnQ9OgorCQkjIEJyZWFrIG91dCBlYXJseSwgb3RoZXJ3aXNlIHNraXBwZWRfZXhwb3J0IG1heSBiZQorCQkjIHNldCB0byBmYWxzZSBieSBhIGxhdGVyIGJ1dCBzaG9ydGVyIGNtZC4KKwkJYnJlYWsKKwkgICAgICBmaQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgIHRtcF9leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgorCSAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRYc2VkIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICMgVGhlIGdpdmVuIGV4cG9ydHNfc3ltYm9scyBmaWxlIGhhcyB0byBiZSBmaWx0ZXJlZCwgc28gZmlsdGVyIGl0LgorCSAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgIyAncycgY29tbWFuZHMgd2hpY2ggbm90IGFsbCBzZWRzIGNhbiBoYW5kbGUuIEdOVSBzZWQgc2hvdWxkIGJlIGZpbmUKKwkgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICMgaXNuJ3QgYSBibGVzc2VkIHRvb2wuCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgorCSAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwlmaQorCisJdG1wX2RlcGxpYnM9CisJZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCisJICAqIiAkdGVzdF9kZXBsaWIgIiopIDs7CisJICAqKQorCSAgICB0bXBfZGVwbGlicz0iJHRtcF9kZXBsaWJzICR0ZXN0X2RlcGxpYiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorCisJaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiAmJgorCSAgICB0ZXN0ICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiA9IHllcyAmJgorCSAgICB0ZXN0IC16ICIkbGlib2JqcyI7IHRoZW4KKwkgICAgIyBleHRyYWN0IHRoZSBhcmNoaXZlcywgc28gd2UgaGF2ZSBvYmplY3RzIHRvIGxpc3QuCisJICAgICMgVE9ETzogY291bGQgb3B0aW1pemUgdGhpcyB0byBqdXN0IGV4dHJhY3Qgb25lIGFyY2hpdmUuCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZWxzZQorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKKwlmaQorCisJIyBNYWtlIGEgYmFja3VwIG9mIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IHdoZW4gcmVsaW5raW5nCisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVUgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/CisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgIGVsc2UKKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgZmkKKwllbHNlCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKKwkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYKKwkgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiICYmCisJICAgbGVuPSRmdW5jX2xlbl9yZXN1bHQgJiYKKwkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIDoKKwllbHNlCisJICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UKKwkgICMgb3IsIGlmIHVzaW5nIEdOVSBsZCBhbmQgc2tpcHBlZF9leHBvcnQgaXMgbm90IDosIHVzZSBhIGxpbmtlcgorCSAgIyBzY3JpcHQuCisKKwkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCisJICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKKwkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKKwkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0CisJICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgorCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQorCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZworCSAgIyB0aGUgc3BlYy4KKwkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgIGZpCisJICBzYXZlX291dHB1dD0kb3V0cHV0CisJICBvdXRwdXRfbGE9YCRFQ0hPICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKworCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKKwkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KKwkgIHRlc3RfY21kcz0KKwkgIGNvbmNhdF9jbWRzPQorCSAgb2JqbGlzdD0KKwkgIGxhc3Rfcm9iaj0KKwkgIGs9MQorCisJICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9Lmxua3NjcmlwdAorCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIEdOVSBsZCBzY3JpcHQ6ICRvdXRwdXQiCisJICAgICRFQ0hPICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgIGRvCisJICAgICAgJEVDSE8gIiRvYmoiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICAkRUNITyAnKScgPj4gJG91dHB1dAorCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCisJICBlbGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiWCRmaWxlX2xpc3Rfc3BlYyIgIT0gWDsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rCisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgbGlua2VyIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkgICAgOiA+ICRvdXRwdXQKKwkgICAgc2V0IHggJHNhdmVfbGlib2JqcworCSAgICBzaGlmdAorCSAgICBmaXJzdG9iaj0KKwkgICAgaWYgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgICBmaXJzdG9iaj0iJDEgIgorCSAgICAgIHNoaWZ0CisJICAgIGZpCisJICAgIGZvciBvYmoKKwkgICAgZG8KKwkgICAgICAkRUNITyAiJG9iaiIgPj4gJG91dHB1dAorCSAgICBkb25lCisJICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dCIKKwkgICAgb3V0cHV0PSRmaXJzdG9ialwiJGZpbGVfbGlzdF9zcGVjJG91dHB1dFwiCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiOyB0aGVuCisJICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4uLiIKKwkgICAgICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkgICAgICBldmFsIHRlc3RfY21kcz1cIiRyZWxvYWRfY21kc1wiCisJICAgICAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIgorCSAgICAgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgICAgIGxlbj0kbGVuMAorCisJICAgICAgIyBMb29wIG92ZXIgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBiZSBsaW5rZWQuCisJICAgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgICAgZG8KKwkJZnVuY19sZW4gIiAkb2JqIgorCQlmdW5jX2FyaXRoICRsZW4gKyAkZnVuY19sZW5fcmVzdWx0CisJCWxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJaWYgdGVzdCAiWCRvYmpsaXN0IiA9IFggfHwKKwkJICAgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iOyB0aGVuCisJCSAgZnVuY19hcHBlbmQgb2JqbGlzdCAiICRvYmoiCisJCWVsc2UKKwkJICAjIFRoZSBjb21tYW5kICR0ZXN0X2NtZHMgaXMgYWxtb3N0IHRvbyBsb25nLCBhZGQgYQorCQkgICMgY29tbWFuZCB0byB0aGUgcXVldWUuCisJCSAgaWYgdGVzdCAiJGsiIC1lcSAxIDsgdGhlbgorCQkgICAgIyBUaGUgZmlyc3QgZmlsZSBkb2Vzbid0IGhhdmUgYSBwcmV2aW91cyBjb21tYW5kIHRvIGFkZC4KKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCIkcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisJCSAgZWxzZQorCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ian5cJFJNICRsYXN0X3JvYmpcIgorCQkgIGZpCisJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJCSAgZnVuY19hcml0aCAkayArIDEKKwkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIG9iamxpc3Q9JG9iagorCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKKwkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgorCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCisJICAgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9flwkUk0gJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCisKKwkgICAgZWxzZQorCSAgICAgIG91dHB1dD0KKwkgICAgZmkKKworCSAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCisJICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRleHBvcnRfc3ltYm9scworCSAgICAgIGxpYm9ianM9JG91dHB1dAorCSAgICAgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZXhwb3J0IGZpbGUuCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHMkZXhwb3J0X3N5bWJvbHNfY21kc1wiCisJICAgICAgaWYgdGVzdCAtbiAiJGxhc3Rfcm9iaiI7IHRoZW4KKwkJZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+XCRSTSAkbGFzdF9yb2JqXCIKKwkgICAgICBmaQorCSAgICBmaQorCisJICAgIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmCisJICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBhIHRlbXBvcmFyeSByZWxvYWRhYmxlIG9iamVjdCBmaWxlOiAkb3V0cHV0IgorCisJICAgICMgTG9vcCB0aHJvdWdoIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYWJvdmUgYW5kIGV4ZWN1dGUgdGhlbS4KKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQgaW4gJGNvbmNhdF9jbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkJICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRjbWQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgIH0KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgeworCQlsdF9leGl0PSQ/CisKKwkJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCQkgICggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiBcCisJCSAgICAkUk0gIiR7cmVhbG5hbWV9VCIgJiYgXAorCQkgICAgJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkJZmkKKworCQlleGl0ICRsdF9leGl0CisJICAgICAgfQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisKKyAgICAgICAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICAgICAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkWHNlZCB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgICAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICAgICAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAgICAgIyBGSVhNRTogJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIHBvdGVudGlhbGx5IGNvbnRhaW5zIGxvdHMgb2YKKwkgICAgICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgICAgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgICAgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5CisJICAgICAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgICAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCisJICAgICAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwkgICAgZmkKKwkgIGZpCisKKwkgIGxpYm9ianM9JG91dHB1dAorCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCisJICBvdXRwdXQ9JHNhdmVfb3V0cHV0CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQorCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCisKKwkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgICAgZWxzZQorCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICAgIGZpCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kYXJjaGl2ZV9jbWRzCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZGVsZmlsZXMiOyB0aGVuCisJICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIHRvICRjbWRzLgorCSAgZXZhbCBjbWRzPVwiXCRjbWRzflwkUk0gJGRlbGZpbGVzXCIKKwlmaQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBsaWJvYmpzPSIkbGlib2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJZmkKKworCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGV2YWwgY21kPVwiJGNtZFwiCisJICAkb3B0X3NpbGVudCB8fCB7CisJICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKKwkgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgfQorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkgICAgbHRfZXhpdD0kPworCisJICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAorCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKKwkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVQgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJE1WICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCSAgICBmaQorCSAgZmkKKworCSAgZXhpdCAkRVhJVF9TVUNDRVNTCisJZmkKKworCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCisJZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisJICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCisJICAgIGZ1bmNfc2hvd19ldmFsICcoY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRsaW5rbmFtZSIgJiYgJExOX1MgIiRyZWFsbmFtZSIgIiRsaW5rbmFtZSIpJyAnZXhpdCAkPycKKwkgIGZpCisJZG9uZQorCisJIyBJZiAtbW9kdWxlIG9yIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyB8fCB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCisJICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KKwkgIGRsbmFtZT0iJHNvbmFtZSIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvYmopCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorICAgICAgZmkKKworICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgorICAgICAgKlwgLWwqIHwgKlwgLUwqKQorCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiA7OworICAgICAgZXNhYworCisgICAgICB0ZXN0IC1uICIkcnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkeHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIGNhc2UgJG91dHB1dCBpbgorICAgICAgKi5sbykKKwl0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyIgJiYgXAorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIgorCisJbGlib2JqPSRvdXRwdXQKKwlmdW5jX2xvMm8gIiRsaWJvYmoiCisJb2JqPSRmdW5jX2xvMm9fcmVzdWx0CisJOzsKKyAgICAgICopCisJbGlib2JqPQorCW9iaj0iJG91dHB1dCIKKwk7OworICAgICAgZXNhYworCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvYmogJGxpYm9iagorCisgICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKKyAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCisgICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQorICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KKyAgICAgIHJlbG9hZF9jb252X29ianM9CisgICAgICBnZW50b3A9CisgICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgorICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBhbmQgaG9wZSB3ZSBjYW4gZ2V0IGJ5IHdpdGgKKyAgICAgICMgdHVybmluZyBjb21tYSBpbnRvIHNwYWNlLi4KKyAgICAgIHdsPQorCisgICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCB0bXBfd2hvbGVfYXJjaGl2ZV9mbGFncz1cIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICByZWxvYWRfY29udl9vYmpzPSRyZWxvYWRfb2Jqc1wgYCRFQ0hPICJYJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRYc2VkIC1lICdzfCx8IHxnJ2AKKwllbHNlCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b2JqfXgiCisJICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICByZWxvYWRfY29udl9vYmpzPSIkcmVsb2FkX29ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJEVDSE8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSQnL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRvcHRfZHJ5X3J1biB8fCBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICAgb3V0cHV0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuZXhlOzsKKyAgICAgIGVzYWMKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgorCisgICAgICB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgXAorICAgICAgICAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biBcCisJJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93biAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgTFRfSU5JVChbZGxvcGVuXSknIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIlggJGNvbXBpbGVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLWRhcndpbiopCisJIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycworCSMgQnV0IGlzIHN1cHBvc2VkbHkgZml4ZWQgb24gMTAuNCBvciBsYXRlciAoeWF5ISkuCisJaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorCSAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSBpbgorCSAgICAxMC5bMDEyM10pCisJICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKKwkgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgIDs7CisJICBlc2FjCisJZmkKKwkjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisJY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCTs7CisgICAgICBlc2FjCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCisJICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JHRlc3RiaW5kaXI7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgorCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRvdXRwdXRuYW1lIiAiQFBST0dSQU1AIiAibm8iCisKKyAgICAgICMgdGVtcGxhdGUgcHJlbGlua2luZyBzdGVwCisgICAgICBpZiB0ZXN0IC1uICIkcHJlbGlua19jbWRzIjsgdGhlbgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcHJlbGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPXllcworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICpjZWdjYykKKyAgICAgICAgIyBEaXNhYmxlIHdyYXBwZXJzIGZvciBjZWdjYywgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyBhbnl3YXkuCisgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgIiR3cmFwcGVyc19yZXF1aXJlZCIgPSBubzsgdGhlbgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCWV4aXRfc3RhdHVzPTAKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JworCisJIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iJworCWZpCisKKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY29tcGlsZV92YXI9CisgICAgICBmaW5hbGl6ZV92YXI9CisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgorCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJbGlua19jb21tYW5kPWAkRUNITyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKKwkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwlmdW5jX3dhcm5pbmcgInRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIgorCWZ1bmNfd2FybmluZyAiXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKKworICAgICAgZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0ICQ/JworCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBmaQorCWRvbmUKKwlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgorCXJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIFF1b3RlICRFQ0hPIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgIlgkRUNITyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorCWNhc2UgJHByb2dwYXRoIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwllc2FjCisJcWVjaG89YCRFQ0hPICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGVsc2UKKwlxZWNobz1gJEVDSE8gIlgkRUNITyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgorCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgorCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCisJICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisJICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKwkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKwkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQorCisJICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCisJICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQorCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCisJICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKKwkgICAgfQorCisJICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6CisJICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCisJICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCisJICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KKwkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgICBlbHNlCisJCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZmkKKwkgICAgfQorCSAgOzsKKwkgICogKQorCSAgICAkUk0gJG91dHB1dAorCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKKwkgICAgY2htb2QgK3ggJG91dHB1dAorCSAgOzsKKwllc2FjCisgICAgICB9CisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCisJICAgIG9sZG9ianM9IiRvbGRvYmpzICRzeW1maWxlb2JqIgorCSAgZmkKKwlmaQorCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KKwlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKyAgICAgIGZpCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworICAgICAgZWxzZQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorCisJIyBQT1NJWCBkZW1hbmRzIG5vIHBhdGhzIHRvIGJlIGVuY29kZWQgaW4gYXJjaGl2ZXMuICBXZSBoYXZlCisJIyB0byBhdm9pZCBjcmVhdGluZyBhcmNoaXZlcyB3aXRoIGR1cGxpY2F0ZSBiYXNlbmFtZXMgaWYgd2UKKwkjIG1pZ2h0IGhhdmUgdG8gZXh0cmFjdCB0aGVtIGFmdGVyd2FyZHMsIGUuZy4sIHdoZW4gY3JlYXRpbmcgYQorCSMgc3RhdGljIGFyY2hpdmUgb3V0IG9mIGEgY29udmVuaWVuY2UgbGlicmFyeSwgb3Igd2hlbiBsaW5raW5nCisJIyB0aGUgZW50aXJldHkgb2YgYSBsaWJ0b29sIGFyY2hpdmUgaW50byBhbm90aGVyIChjdXJyZW50bHkKKwkjIG5vdCBzdXBwb3J0ZWQgYnkgbGlidG9vbCkuCisJaWYgKGZvciBvYmogaW4gJG9sZG9ianMKKwkgICAgZG8KKwkgICAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgorCSAgICAgICRFQ0hPICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICRFQ0hPICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisJICBmdW5jX21rZGlyX3AgIiRnZW50b3AiCisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICBjb3VudGVyPTEKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgb2JqYmFzZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgorCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OworCSAgICAqW1wgL10iJG9iamJhc2UgIiopCisJICAgICAgd2hpbGUgOjsgZG8KKwkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KKwkJIyBvdmVybGFwcy4KKwkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKKwkJZnVuY19hcml0aCAkY291bnRlciArIDEKKwkJY291bnRlcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJY2FzZSAiICRvbGRvYmpzICIgaW4KKwkJKltcIC9dIiRuZXdvYmogIiopIDs7CisJCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKKwkJZXNhYworCSAgICAgIGRvbmUKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgb2xkb2Jqcz0iJG9sZG9ianMgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKworCWZ1bmNfbGVuICIgJGNtZHMiCisJbGVuPSRmdW5jX2xlbl9yZXN1bHQKKwlpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbHNlCisJICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cworCSAgZnVuY192ZXJib3NlICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgorCSAgUkFOTElCPToKKwkgIG9iamxpc3Q9CisJICBjb25jYXRfY21kcz0KKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PworCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBsYXN0X29sZG9iaj0kb2JqCisJICBkb25lCisJICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgbGVuPSRsZW4wCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfbGVuICIgJG9iaiIKKwkgICAgZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCSAgICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCSAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCisJICAgICAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCisJCVJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgICAgICBmaQorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCisJICAgICAgb2JqbGlzdD0KKwkgICAgICBsZW49JGxlbjAKKwkgICAgZmkKKwkgIGRvbmUKKwkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgIG9sZG9ianM9JG9iamxpc3QKKwkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgorCSAgZWxzZQorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmaQorCWZpCisgICAgICBmaQorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRjbWRzIiAnZXhpdCAkPycKKyAgICBkb25lCisKKyAgICB0ZXN0IC1uICIkZ2VuZXJhdGVkIiAmJiBcCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yJGdlbmVyYXRlZCIKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKyAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwllbHNlCisJICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWZpCisgICAgICBkb25lCisgICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgorICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgorCXJlbGlua19jb21tYW5kPQorICAgICAgZmkKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbworCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQorCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgICoubGEpCisJCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQluZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJCSMgT25seSBwYXNzIHByZW9wZW5lZCBmaWxlcyB0byB0aGUgcHNldWRvLWFyY2hpdmUgKGZvcgorCQkjIGV2ZW50dWFsIGxpbmtpbmcgd2l0aCB0aGUgYXBwLiB0aGF0IGxpbmtzIGl0KSBpZiB3ZQorCQkjIGRpZG4ndCBhbHJlYWR5IGxpbmsgdGhlIHByZW9wZW5lZCBvYmplY3RzIGRpcmVjdGx5IGludG8KKwkJIyB0aGUgbGlicmFyeToKKwkJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJCW5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZmkKKwkgICRSTSAkb3V0cHV0CisJICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCB8ICpjZWdjYyosKmxhaSx5ZXMsbm8sKi5kbGwpIHRkbG5hbWU9Li4vYmluLyRkbG5hbWUgOzsKKwkgIGVzYWMKKwkgICRFQ0hPID4gJG91dHB1dCAiXAorIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JyR0ZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSckbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIE5hbWVzIG9mIGFkZGl0aW9uYWwgd2VhayBsaWJyYXJpZXMgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5Cit3ZWFrX2xpYnJhcnlfbmFtZXM9JyR3ZWFrX2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9JG1vZHVsZQorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KKwkgICAgJEVDSE8gPj4gJG91dHB1dCAiXAorcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKKwkgIGZpCisJZG9uZQorICAgICAgfQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgZnVuY19zaG93X2V2YWwgJyggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRvdXRwdXRuYW1lIiAmJiAkTE5fUyAiLi4vJG91dHB1dG5hbWUiICIkb3V0cHV0bmFtZSIgKScgJ2V4aXQgJD8nCisgICAgICA7OworICAgIGVzYWMKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworeyB0ZXN0ICIkbW9kZSIgPSBsaW5rIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgfSAmJgorICAgIGZ1bmNfbW9kZV9saW5rICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX3VuaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV91bmluc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgUk09IiRub25vcHQiCiAgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKIAogICAgIGZvciBhcmcKICAgICBkbwotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC0qKSBybT0iJHJtICRhcmciIDs7CisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1mKSBSTT0iJFJNICRhcmciOyBybWZvcmNlPXllcyA7OworICAgICAgLSopIFJNPSIkUk0gJGFyZyIgOzsKICAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKICAgICAgIGVzYWMKICAgICBkb25lCiAKLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKKyAgICB0ZXN0IC16ICIkUk0iICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIgogCisgICAgcm1kaXJzPQorCisgICAgb3JpZ29iamRpcj0iJG9iamRpciIKICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCi0gICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgICBmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKyAgICAgIGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisgICAgICBpZiB0ZXN0ICJYJGRpciIgPSBYLjsgdGhlbgorCW9iamRpcj0iJG9yaWdvYmpkaXIiCisgICAgICBlbHNlCisJb2JqZGlyPSIkZGlyLyRvcmlnb2JqZGlyIgorICAgICAgZmkKKyAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKKworICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcworICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2JqZGlyICIqKSA7OworCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7CisJZXNhYworICAgICAgZmkKKworICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KKyAgICAgIGlmIHsgdGVzdCAtTCAiJGZpbGUiOyB9ID4vZGV2L251bGwgMj4mMSB8fAorCSB7IHRlc3QgLWggIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJOgorICAgICAgZWxpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KKwlleGl0X3N0YXR1cz0xCisJY29udGludWUKKyAgICAgIGVsaWYgdGVzdCAiJHJtZm9yY2UiID0geWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGZpCiAKICAgICAgIHJtZmlsZXM9IiRmaWxlIgogCi0gICAgICBjYXNlICIkbmFtZSIgaW4KKyAgICAgIGNhc2UgJG5hbWUgaW4KICAgICAgICoubGEpCi0gICAgICAgICMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KLSAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgICAgICAgLiAkZGlyLyRuYW1lCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgorCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCisJICBmdW5jX3NvdXJjZSAkZGlyLyRuYW1lCiAKLSAgICAgICAgICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgotICAgICAgICAgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbwotICAgICAgICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbiIKLSAgICAgICAgICAgIHRlc3QgIlgkbiIgPSAiWCRkbG5hbWUiICYmIGRsbmFtZT0KLSAgICAgICAgICBkb25lCi0gICAgICAgICAgdGVzdCAtbiAiJGRsbmFtZSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kZGxuYW1lIgotICAgICAgICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgorCSAgZm9yIG4gaW4gJGxpYnJhcnlfbmFtZXM7IGRvCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG4iCisJICBkb25lCisJICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG9sZF9saWJyYXJ5IgogCi0JICAkc2hvdyAiJHJtICRybWZpbGVzIgotCSAgJHJ1biAkcm0gJHJtZmlsZXMKKwkgIGNhc2UgIiRtb2RlIiBpbgorCSAgY2xlYW4pCisJICAgIGNhc2UgIiAgJGxpYnJhcnlfbmFtZXMgIiBpbgorCSAgICAjICIgICIgaW4gdGhlIGJlZ2lubmluZyBjYXRjaGVzIGVtcHR5ICRkbG5hbWUKKwkgICAgKiIgJGRsbmFtZSAiKikgOzsKKwkgICAgKikgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kZGxuYW1lIiA7OworCSAgICBlc2FjCisJICAgIHRlc3QgLW4gIiRsaWJkaXIiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKKwkgICAgOzsKKwkgIHVuaW5zdGFsbCkKKwkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0dW5pbnN0YWxsX2NtZHMiICd0ZXN0ICIkcm1mb3JjZSIgPSB5ZXMgfHwgZXhpdF9zdGF0dXM9MScKKwkgICAgZmkKIAotCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCi0JICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0gICAgICAgICAgIyBGSVhNRTogc2hvdWxkIHJlaW5zdGFsbCB0aGUgYmVzdCByZW1haW5pbmcgc2hhcmVkIGxpYnJhcnkuCi0gICAgICAgIGZpCi0gICAgICAgIDs7CisJICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCisJICAgIGZpCisJICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgorCSAgICA7OworCSAgZXNhYworCWZpCisJOzsKIAogICAgICAgKi5sbykKLSAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgICAgIG9sZG9iaj1gJGVjaG8gIlgkbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKLSAgICAgICAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRvYmoiCi0gICAgICAgIGZpCi0JJHNob3cgIiRybSAkcm1maWxlcyIKLQkkcnVuICRybSAkcm1maWxlcwotICAgICAgICA7OworCSMgUG9zc2libHkgYSBsaWJ0b29sIG9iamVjdCwgc28gdmVyaWZ5IGl0LgorCWlmIGZ1bmNfbGFsaWJfcCAiJGZpbGUiOyB0aGVuCisKKwkgICMgUmVhZCB0aGUgLmxvIGZpbGUKKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBBZGQgUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkcGljX29iamVjdCIgJiYKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCisJICBmaQorCisJICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiICYmCisJICAgICB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbm9uX3BpY19vYmplY3QiCisJICBmaQorCWZpCisJOzsKIAogICAgICAgKikKLSAgICAgIAkkc2hvdyAiJHJtICRybWZpbGVzIgotCSRydW4gJHJtICRybWZpbGVzCisJaWYgdGVzdCAiJG1vZGUiID0gY2xlYW4gOyB0aGVuCisJICBub2V4ZW5hbWU9JG5hbWUKKwkgIGNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICBmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkbmFtZSIKKwkgICAgbm9leGVuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAorCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmIGZ1bmNfbHR3cmFwcGVyX3AgIiRmaWxlIjsgdGhlbgorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKKwkgICAgZWxzZQorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRkaXIvJG5vZXhlbmFtZQorCSAgICBmaQorCisJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CisJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0ke25vZXhlbmFtZX0uYyIKKwkgICAgZmkKKwkgIGZpCisJZmkKIAk7OwogICAgICAgZXNhYworICAgICAgZnVuY19zaG93X2V2YWwgIiRSTSAkcm1maWxlcyIgJ2V4aXRfc3RhdHVzPTEnCiAgICAgZG9uZQotICAgIGV4aXQgMAotICAgIDs7CisgICAgb2JqZGlyPSIkb3JpZ29iamRpciIKIAotICAiIikKLSAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERSIgMT4mMgotICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLSAgZXNhYworICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcworICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisJZnVuY19zaG93X2V2YWwgInJtZGlyICRkaXIgPi9kZXYvbnVsbCAyPiYxIgorICAgICAgZmkKKyAgICBkb25lCiAKLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICBleGl0IDEKLWZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKKyAgICBleGl0ICRleGl0X3N0YXR1cworfQogCi0jIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KLWNhc2UgIiRtb2RlIiBpbgotIiIpICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KK3sgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsIHx8IHRlc3QgIiRtb2RlIiA9IGNsZWFuOyB9ICYmCisgICAgZnVuY19tb2RlX3VuaW5zdGFsbCAkezErIiRAIn0KIAotUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCit0ZXN0IC16ICIkbW9kZSIgJiYgeworICBoZWxwPSIkZ2VuZXJpY19oZWxwIgorICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgorfQogCi0tbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKLSAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCi0gICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCit0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKKyAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIgogCi1NT0RFIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CitpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCisgIGV2YWwgZXhlYyAiJGV4ZWNfY21kIgorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCiAKLSAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0Ci0gICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KLSAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKLSAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKLSAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorZXhpdCAkZXhpdF9zdGF0dXMKIAotTU9ERS1BUkdTIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBNT0RFLiAgVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9TU9ERScgZm9yCi1hIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgTU9ERS4iCi0gIGV4aXQgMAotICA7OwogCi1jb21waWxlKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQorIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KKyMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCisjIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAorIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKKyMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CisjIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0CisjIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKKyMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KKyMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKKyMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgogCi1Db21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCitidWlsZF9saWJ0b29sX2xpYnM9bm8KK2J1aWxkX29sZF9saWJzPXllcworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKIAotQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKLWZyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCi0KLVRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQotU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCi1saWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCi0gIDs7Ci0KLWV4ZWN1dGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCi0KLUF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAotCi1UaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCi1mbGFncy4KLQotSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAotaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5Ci1kaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KLQotVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCi0gIDs7Ci0KLWZpbmlzaCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgotCi1Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgotCi1FYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgotCi1UaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKLXRoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgotICA7OwotCi1pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KLQotSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCi0KLUlOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQotZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCi0KLVRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5Ci1CU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKLSAgOzsKLQotbGluaykKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCi0KLUxpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KLWNyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi0KLUxJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQotYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAotICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKLSAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gZGxkX3ByZWxvYWRlZF9zeW1ib2xzCi0gIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCi0gIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKLSAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKLSAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCi0gIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgotICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCi0gIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCi0gICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KLQotQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KLQotRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKLXRyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5Ci1vYmplY3QgZmlsZXMuCi0KLUlmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLCBvbmx5Ci1saWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcyByZXF1aXJlZC4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZCB1c2luZyBcYGFyJwotYW5kIFxgcmFubGliJy4KLQotSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAubycsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGlzCi1jcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICA7OwotCi11bmluc3RhbGwpCi0gICRlY2hvCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgotT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi0qKQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLSAgOzsKLWVzYWMKLQotZWNobwotJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLQotZXhpdCAwCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCitidWlsZF9vbGRfbGlicz1gY2FzZSAkYnVpbGRfbGlidG9vbF9saWJzIGluIHllcykgZWNobyBubzs7ICopIGVjaG8geWVzOzsgZXNhY2AKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc3RhdGljCiAKICMgTG9jYWwgVmFyaWFibGVzOgogIyBtb2RlOnNoZWxsLXNjcmlwdAogIyBzaC1pbmRlbnRhdGlvbjoyCiAjIEVuZDoKKyMgdmk6c3c9MgorCmRpZmYgLS1naXQgYS9tYWtjanBlZy5zdCBiL21ha2NqcGVnLnN0CmluZGV4IGZjNzJjODkuLjYyOGY1MzMgMTAwNjQ0Ci0tLSBhL21ha2NqcGVnLnN0CisrKyBiL21ha2NqcGVnLnN0CkBAIC0xLDkgKzEsNyBAQAogOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQogOwogOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUsIEIuIFNldHplcGZhbmR0LCBhbmQgR3VpZG8gVm9sbGJlZGluZy4KIDsKIDsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGNqcGVnLnByai4KIDsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgpAQCAtMjMsMTQgKzIxLDE0IEBACiA9CiA7ICogKiAqICogTGlzdCBvZiBtb2R1bGVzICogKiAqICogCiBwY3N0YXJ0Lm8KLWNqcGVnLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCxqdmVyc2lvbi5oKQorY2pwZWcuYwkJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCxqdmVyc2lvbi5oKQogY2RqcGVnLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKIHJkc3dpdGNoLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXJkcHBtLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXJkZ2lmLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3JkcHBtLmMJCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZGdpZi5jCQkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQogcmR0YXJnYS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZGJtcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCi1yZHJsZS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZGJtcC5jCQkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRybGUuYwkJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKIGxpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCiBwY2ZsdGxpYi5saWIgICAgICAgOyBmbG9hdGluZyBwb2ludCBsaWJyYXJ5CiA7IHRoZSBmbG9hdCBsaWJyYXJ5IGNhbiBiZSBvbWl0dGVkIGlmIHlvdSd2ZSB0dXJuZWQgb2ZmIERDVF9GTE9BVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL21ha2RqcGVnLnN0IGIvbWFrZGpwZWcuc3QKaW5kZXggMzIyNjcyNi4uNGI2MTQwNCAxMDA2NDQKLS0tIGEvbWFrZGpwZWcuc3QKKysrIGIvbWFrZGpwZWcuc3QKQEAgLTEsOSArMSw3IEBACiA7IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCiA7CiA7IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KLTsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKLTsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCi07IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KKzsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSwgQi4gU2V0emVwZmFuZHQsIGFuZCBHdWlkbyBWb2xsYmVkaW5nLgogOwogOyBUbyB1c2UgdGhpcyBmaWxlLCByZW5hbWUgaXQgdG8gZGpwZWcucHJqLgogOyBJZiB5b3UgYXJlIHVzaW5nIFR1cmJvIEMsIGNoYW5nZSBmaWxlbmFtZXMgYmVnaW5uaW5nIHdpdGggInBjLi4uIiB0byAidGMuLi4iCkBAIC0yMywxNCArMjEsMTQgQEAKID0KIDsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKIHBjc3RhcnQubwotZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLGp2ZXJzaW9uLmgpCitkanBlZy5jCQkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLGp2ZXJzaW9uLmgpCiBjZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQogcmRjb2xtYXAuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotd3JwcG0uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQotd3JnaWYuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQord3JwcG0uYwkJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3dyZ2lmLmMJCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCiB3cnRhcmdhLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXdyYm1wLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKLXdycmxlLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3dyYm1wLmMJCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cnJsZS5jCQkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQogbGlianBlZy5saWIgICAgICAgIDsgYnVpbHQgYnkgbGlianBlZy5wcmoKIHBjZmx0bGliLmxpYiAgICAgICA7IGZsb2F0aW5nIHBvaW50IGxpYnJhcnkKIDsgdGhlIGZsb2F0IGxpYnJhcnkgY2FuIGJlIG9taXR0ZWQgaWYgeW91J3ZlIHR1cm5lZCBvZmYgRENUX0ZMT0FUX1NVUFBPUlRFRApkaWZmIC0tZ2l0IGEvbWFrZWFkc3cudmM2IGIvbWFrZWFkc3cudmM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDU5YzUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlYWRzdy52YzYKQEAgLTAsMCArMSw3NyBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgV0FSTlVORzogRElFU0UgQVJCRUlUU0JFUkVJQ0hTREFURUkgREFSRiBOSUNIVCBCRUFSQkVJVEVUIE9ERVIgR0VMmVNDSFQgV0VSREVOIQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJjanBlZyI9Ii5cY2pwZWcuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAiZGpwZWciPSIuXGRqcGVnLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogImpwZWd0cmFuIj0iLlxqcGVndHJhbi5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KKworUGFja2FnZT08NT4KK3t7eworfX19CisKK1BhY2thZ2U9PDQ+Cit7e3sKK319fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1Byb2plY3Q6ICJyZGpwZ2NvbSI9Ii5ccmRqcGdjb20uZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQcm9qZWN0OiAid3JqcGdjb20iPSIuXHdyanBnY29tLmRzcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08ND4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworR2xvYmFsOgorCitQYWNrYWdlPTw1Pgore3t7Cit9fX0KKworUGFja2FnZT08Mz4KK3t7eworfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvbWFrZWFwcHMuZHMgYi9tYWtlYXBwcy5kcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDAzOC4uMDAwMDAwMAotLS0gYS9tYWtlYXBwcy5kcworKysgL2Rldi9udWxsCkBAIC0xLDgyOCArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjIwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi0hSUYgIiQoQ0ZHKSIgPT0gIiIKLUNGRz1janBlZyAtIFdpbjMyCi0hTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8gY2pwZWcgLSBXaW4zMi4KLSFFTkRJRiAKLQotIUlGICIkKENGRykiICE9ICJjanBlZyAtIFdpbjMyIiAmJiAiJChDRkcpIiAhPSAiZGpwZWcgLSBXaW4zMiIgJiZcCi0gIiQoQ0ZHKSIgIT0gImpwZWd0cmFuIC0gV2luMzIiICYmICIkKENGRykiICE9ICJyZGpwZ2NvbSAtIFdpbjMyIiAmJlwKLSAiJChDRkcpIiAhPSAid3JqcGdjb20gLSBXaW4zMiIKLSFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImFwcHMubWFrIiBDRkc9ImNqcGVnIC0gV2luMzIiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiY2pwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJkanBlZyAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImpwZWd0cmFuIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAicmRqcGdjb20gLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJ3cmpwZ2NvbSAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0hRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KLSFFTkRJRiAKLQotIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCi1OVUxMPQotIUVMU0UgCi1OVUxMPW51bAotIUVORElGIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgImNqcGVnIC0gV2luMzIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImNqcGVnIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJjanBlZ1xSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiY2pwZWdcUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgImNqcGVnIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgImNqcGVnXFJlbGVhc2UiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiY2pwZWdcUmVsZWFzZSIKLSMgUFJPUCBUYXJnZXRfRGlyICJjanBlZyIKLU9VVERJUj0uXGNqcGVnXFJlbGVhc2UKLUlOVERJUj0uXGNqcGVnXFJlbGVhc2UKLQotQUxMIDogIiQoT1VURElSKVxjanBlZy5leGUiCi0KLUNMRUFOIDogCi0JLUBlcmFzZSAiJChJTlRESVIpXGNqcGVnLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRwcG0ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZGdpZi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkdGFyZ2Eub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZHJsZS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkYm1wLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilccmRzd2l0Y2gub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxjanBlZy5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL2NqcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5cY2pwZWdcUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvY2pwZWcuYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS9janBlZy5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2NqcGVnLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcY2pwZWcub2JqIiBcCi0JIiQoSU5URElSKVxyZHBwbS5vYmoiIFwKLQkiJChJTlRESVIpXHJkZ2lmLm9iaiIgXAotCSIkKElOVERJUilccmR0YXJnYS5vYmoiIFwKLQkiJChJTlRESVIpXHJkcmxlLm9iaiIgXAotCSIkKElOVERJUilccmRibXAub2JqIiBcCi0JIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIFwKLQkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKLQotCi0iJChPVVRESVIpXGNqcGVnLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZGpwZWcgLSBXaW4zMiIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImRqcGVnXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJkanBlZ1xSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiZGpwZWciCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiZGpwZWdcUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJkanBlZ1xSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgImRqcGVnIgotT1VURElSPS5cZGpwZWdcUmVsZWFzZQotSU5URElSPS5cZGpwZWdcUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXGRqcGVnLmV4ZSIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcZGpwZWcub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx3cnBwbS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHdyZ2lmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcd3J0YXJnYS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHdycmxlLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcd3JibXAub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCi0JLUBlcmFzZSAiJChPVVRESVIpXGRqcGVnLmV4ZSIKLQotIiQoT1VURElSKSIgOgotICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCi0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAotIC9GcCIkKElOVERJUikvZGpwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9LlxkanBlZ1xSZWxlYXNlLwotQ1BQX1NCUlM9LlwuCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1CU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9kanBlZy5ic2MiIAotQlNDMzJfU0JSUz0gXAotCQotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci1MSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAotIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKLSBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCi0gL3BkYjoiJChPVVRESVIpL2RqcGVnLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvZGpwZWcuZXhlIiAKLUxJTkszMl9PQkpTPSBcCi0JIiQoSU5URElSKVxkanBlZy5vYmoiIFwKLQkiJChJTlRESVIpXHdycHBtLm9iaiIgXAotCSIkKElOVERJUilcd3JnaWYub2JqIiBcCi0JIiQoSU5URElSKVx3cnRhcmdhLm9iaiIgXAotCSIkKElOVERJUilcd3JybGUub2JqIiBcCi0JIiQoSU5URElSKVx3cmJtcC5vYmoiIFwKLQkiJChJTlRESVIpXHJkY29sbWFwLm9iaiIgXAotCSIkKElOVERJUilcY2RqcGVnLm9iaiIgXAotCi0KLSIkKE9VVERJUilcZGpwZWcuZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCi0gICAgJChMSU5LMzIpIEA8PAotICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKLTw8Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJqcGVndHJhbiAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAianBlZ3RyYW5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICJqcGVndHJhbiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJqcGVndHJhblxSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAianBlZ3RyYW4iCi1PVVRESVI9LlxqcGVndHJhblxSZWxlYXNlCi1JTlRESVI9LlxqcGVndHJhblxSZWxlYXNlCi0KLUFMTCA6ICIkKE9VVERJUilcanBlZ3RyYW4uZXhlIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVxqcGVndHJhbi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcY2RqcGVnLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcdHJhbnN1cHAub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxqcGVndHJhbi5leGUiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLUNQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKLSAvRnAiJChJTlRESVIpL2pwZWd0cmFuLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5canBlZ3RyYW5cUmVsZWFzZS8KLUNQUF9TQlJTPS5cLgotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvanBlZ3RyYW4uYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKLSBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCi0gb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAotIC9wZGI6IiQoT1VURElSKS9qcGVndHJhbi5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2pwZWd0cmFuLmV4ZSIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcanBlZ3RyYW4ub2JqIiBcCi0JIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIFwKLQkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKLQkiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIgXAotCi0KLSIkKE9VVERJUilcanBlZ3RyYW4uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCi0gICAgJChMSU5LMzIpIEA8PAotICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKLTw8Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJyZGpwZ2NvbSAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAicmRqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInJkanBnY29tXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICJyZGpwZ2NvbSIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInJkanBnY29tXFJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAicmRqcGdjb20iCi1PVVRESVI9LlxyZGpwZ2NvbVxSZWxlYXNlCi1JTlRESVI9LlxyZGpwZ2NvbVxSZWxlYXNlCi0KLUFMTCA6ICIkKE9VVERJUilccmRqcGdjb20uZXhlIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiCi0JLUBlcmFzZSAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKLQotIiQoT1VURElSKSIgOgotICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCi0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAotIC9GcCIkKElOVERJUikvcmRqcGdjb20ucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9LlxyZGpwZ2NvbVxSZWxlYXNlLwotQ1BQX1NCUlM9LlwuCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1CU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9yZGpwZ2NvbS5ic2MiIAotQlNDMzJfU0JSUz0gXAotCQotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci1MSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAotIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKLSBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCi0gL3BkYjoiJChPVVRESVIpL3JkanBnY29tLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvcmRqcGdjb20uZXhlIiAKLUxJTkszMl9PQkpTPSBcCi0JIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiCi0KLSIkKE9VVERJUilccmRqcGdjb20uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCi0gICAgJChMSU5LMzIpIEA8PAotICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKLTw8Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJ3cmpwZ2NvbSAtIFdpbjMyIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAid3JqcGdjb21cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIndyanBnY29tXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICJ3cmpwZ2NvbSIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIndyanBnY29tXFJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAid3JqcGdjb20iCi1PVVRESVI9Llx3cmpwZ2NvbVxSZWxlYXNlCi1JTlRESVI9Llx3cmpwZ2NvbVxSZWxlYXNlCi0KLUFMTCA6ICIkKE9VVERJUilcd3JqcGdjb20uZXhlIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVx3cmpwZ2NvbS5vYmoiCi0JLUBlcmFzZSAiJChPVVRESVIpXHdyanBnY29tLmV4ZSIKLQotIiQoT1VURElSKSIgOgotICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCi0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAotIC9GcCIkKElOVERJUikvd3JqcGdjb20ucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9Llx3cmpwZ2NvbVxSZWxlYXNlLwotQ1BQX1NCUlM9LlwuCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1CU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS93cmpwZ2NvbS5ic2MiIAotQlNDMzJfU0JSUz0gXAotCQotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci1MSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAotIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKLSBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCi0gL3BkYjoiJChPVVRESVIpL3dyanBnY29tLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvd3JqcGdjb20uZXhlIiAKLUxJTkszMl9PQkpTPSBcCi0JIiQoSU5URElSKVx3cmpwZ2NvbS5vYmoiCi0KLSIkKE9VVERJUilcd3JqcGdjb20uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCi0gICAgJChMSU5LMzIpIEA8PAotICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKLTw8Ci0KLSFFTkRJRiAKLQotLmN7JChDUFBfT0JKUyl9Lm9iajoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jcHB7JChDUFBfT0JKUyl9Lm9iajoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jeHh7JChDUFBfT0JKUyl9Lm9iajoKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCi0KLS5jeyQoQ1BQX1NCUlMpfS5zYnI6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3BweyQoQ1BQX1NCUlMpfS5zYnI6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3h4eyQoQ1BQX1NCUlMpfS5zYnI6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJjanBlZyAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iY2pwZWcuYyIKLURFUF9DUFBfQ0pQRUc9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCSJqdmVyc2lvbi5oIlwKLQkKLQotIiQoSU5URElSKVxjanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DSlBFRykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJjZGpwZWcuYyIKLURFUF9DUFBfQ0RKUEU9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DREpQRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZHN3aXRjaC5jIgotREVQX0NQUF9SRFNXST1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRzd2l0Y2gub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRTV0kpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRwcG0uYyIKLURFUF9DUFBfUkRQUE09XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkcHBtLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEUFBNKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkZ2lmLmMiCi1ERVBfQ1BQX1JER0lGPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZGdpZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SREdJRikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZHRhcmdhLmMiCi1ERVBfQ1BQX1JEVEFSPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZHRhcmdhLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEVEFSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkYm1wLmMiCi1ERVBfQ1BQX1JEQk1QPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxyZGJtcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SREJNUCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZHJsZS5jIgotREVQX0NQUF9SRFJMRT1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRybGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRSTEUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiZGpwZWcgLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAiZGpwZWcgLSBXaW4zMiIKLQotIUVORElGIAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImRqcGVnLmMiCi1ERVBfQ1BQX0RKUEVHPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkianZlcnNpb24uaCJcCi0JCi0KLSIkKElOVERJUilcZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfREpQRUcpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iY2RqcGVnLmMiCi1ERVBfQ1BQX0NESlBFPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0icmRjb2xtYXAuYyIKLURFUF9DUFBfUkRDT0w9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHJkY29sbWFwLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEQ09MKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndycHBtLmMiCi1ERVBfQ1BQX1dSUFBNPVwKLQkiY2RqcGVnLmgiXAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImplcnJvci5oIlwKLQkiY2RlcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVx3cnBwbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlBQTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cmdpZi5jIgotREVQX0NQUF9XUkdJRj1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcd3JnaWYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JHSUYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3J0YXJnYS5jIgotREVQX0NQUF9XUlRBUj1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcd3J0YXJnYS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlRBUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJ3cmJtcC5jIgotREVQX0NQUF9XUkJNUD1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcd3JibXAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JCTVApICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0id3JybGUuYyIKLURFUF9DUFBfV1JSTEU9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXHdycmxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSUkxFKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImpwZWd0cmFuIC0gV2luMzIiCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImpwZWd0cmFuIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqcGVndHJhbi5jIgotREVQX0NQUF9KUEVHVD1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JInRyYW5zdXBwLmgiXAotCSJqdmVyc2lvbi5oIlwKLQkKLQotIiQoSU5URElSKVxqcGVndHJhbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUEVHVCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJjZGpwZWcuYyIKLURFUF9DUFBfQ0RKUEU9XAotCSJjZGpwZWcuaCJcCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkiamVycm9yLmgiXAotCSJjZGVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DREpQRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJyZHN3aXRjaC5jIgotREVQX0NQUF9SRFNXST1cCi0JImNkanBlZy5oIlwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JImNkZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilccmRzd2l0Y2gub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRTV0kpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0idHJhbnN1cHAuYyIKLURFUF9DUFBfVFJBTlM9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkidHJhbnN1cHAuaCJcCi0JCi0KLSIkKElOVERJUilcdHJhbnN1cHAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfVFJBTlMpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAicmRqcGdjb20gLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiIKLQotIUVORElGIAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9InJkanBnY29tLmMiCi1ERVBfQ1BQX1JESlBHPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JCi0KLSIkKElOVERJUilccmRqcGdjb20ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRKUEcpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAid3JqcGdjb20gLSBXaW4zMiIKLQotIUlGICAiJChDRkcpIiA9PSAid3JqcGdjb20gLSBXaW4zMiIKLQotIUVORElGIAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9IndyanBnY29tLmMiCi1ERVBfQ1BQX1dSSlBHPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JCi0KLSIkKElOVERJUilcd3JqcGdjb20ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JKUEcpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQpkaWZmIC0tZ2l0IGEvbWFrZWFzbG4udmM5IGIvbWFrZWFzbG4udmM5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGJhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlYXNsbi52YzkKQEAgLTAsMCArMSwzMyBAQAori6+oCitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMAorIyBWaXN1YWwgQysrIEV4cHJlc3MgMjAwOAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJjanBlZyIsICJjanBlZy52Y3Byb2oiLCAie0I0RjYxNzc4LUM0NUQtNDVDNi05RTg3LTA2RjAzRjUwNTE5Rn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImRqcGVnIiwgImRqcGVnLnZjcHJvaiIsICJ7OUI3RTU3QUUtMzFDRC00MDVFLTgwNzAtMjZBODMwM0I5REM5fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAianBlZ3RyYW4iLCAianBlZ3RyYW4udmNwcm9qIiwgIns4MTNDMzNBRi05MDMxLTQ5RDItQkExOS05M0Q2MDBDREQ0MDR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJyZGpwZ2NvbSIsICJyZGpwZ2NvbS52Y3Byb2oiLCAie0VCMTA3Rjg2LUE4Q0MtNDUwNy04MTE1LTg4RDMxRERFNENERn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIndyanBnY29tIiwgIndyanBnY29tLnZjcHJvaiIsICJ7MTc4NjcwRDctRkE3Ri00NEE4LTk2QzctMTFCMUNBMTQyNjlDfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtCNEY2MTc3OC1DNDVELTQ1QzYtOUU4Ny0wNkYwM0Y1MDUxOUZ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7QjRGNjE3NzgtQzQ1RC00NUM2LTlFODctMDZGMDNGNTA1MTlGfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXs5QjdFNTdBRS0zMUNELTQwNUUtODA3MC0yNkE4MzAzQjlEQzl9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7OUI3RTU3QUUtMzFDRC00MDVFLTgwNzAtMjZBODMwM0I5REM5fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXs4MTNDMzNBRi05MDMxLTQ5RDItQkExOS05M0Q2MDBDREQ0MDR9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7ODEzQzMzQUYtOTAzMS00OUQyLUJBMTktOTNENjAwQ0RENDA0fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXtFQjEwN0Y4Ni1BOENDLTQ1MDctODExNS04OEQzMURERTRDREZ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7RUIxMDdGODYtQThDQy00NTA3LTgxMTUtODhEMzFEREU0Q0RGfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXsxNzg2NzBENy1GQTdGLTQ0QTgtOTZDNy0xMUIxQ0ExNDI2OUN9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MTc4NjcwRDctRkE3Ri00NEE4LTk2QzctMTFCMUNBMTQyNjlDfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbWFrZWNkZXAudmM2IGIvbWFrZWNkZXAudmM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGZmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlY2RlcC52YzYKQEAgLTAsMCArMSw4MiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBlcnN0ZWxsdGUgQWJohG5naWdrZWl0c2RhdGVpLCBlaW5iZXpvZ2VuIHZvbiBjanBlZy5tYWsKKworLlxjZGpwZWcuYyA6IFwKKwkiLlxjZGVycm9yLmgiXAorCSIuXGNkanBlZy5oIlwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGNqcGVnLmMgOiBcCisJIi5cY2RlcnJvci5oIlwKKwkiLlxjZGpwZWcuaCJcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkiLlxqdmVyc2lvbi5oIlwKKwkKKworLlxyZGJtcC5jIDogXAorCSIuXGNkZXJyb3IuaCJcCisJIi5cY2RqcGVnLmgiXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5ccmRnaWYuYyA6IFwKKwkiLlxjZGVycm9yLmgiXAorCSIuXGNkanBlZy5oIlwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXHJkcHBtLmMgOiBcCisJIi5cY2RlcnJvci5oIlwKKwkiLlxjZGpwZWcuaCJcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxyZHJsZS5jIDogXAorCSIuXGNkZXJyb3IuaCJcCisJIi5cY2RqcGVnLmgiXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5ccmRzd2l0Y2guYyA6IFwKKwkiLlxjZGVycm9yLmgiXAorCSIuXGNkanBlZy5oIlwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXHJkdGFyZ2EuYyA6IFwKKwkiLlxjZGVycm9yLmgiXAorCSIuXGNkanBlZy5oIlwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQpkaWZmIC0tZ2l0IGEvbWFrZWNkc3AudmM2IGIvbWFrZWNkc3AudmM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjU5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlY2RzcC52YzYKQEAgLTAsMCArMSwxMzAgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iY2pwZWciIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogTklDSFQgQkVBUkJFSVRFTiAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKKworQ0ZHPWNqcGVnIC0gV2luMzIKKyFNRVNTQUdFIERpZXMgaXN0IGtlaW4gZ4FsdGlnZXMgTWFrZWZpbGUuIFp1bSBFcnN0ZWxsZW4gZGllc2VzIFByb2pla3RzIG1pdCBOTUFLRQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGaBaHJlbiBTaWUgZGVuIEJlZmVobAorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiY2pwZWcubWFrIi4KKyFNRVNTQUdFIAorIU1FU1NBR0UgU2llIGv3bm5lbiBiZWltIEF1c2aBaHJlbiB2b24gTk1BS0UgZWluZSBLb25maWd1cmF0aW9uIGFuZ2ViZW4KKyFNRVNTQUdFIGR1cmNoIERlZmluaWVyZW4gZGVzIE1ha3JvcyBDRkcgaW4gZGVyIEJlZmVobHN6ZWlsZS4gWnVtIEJlaXNwaWVsOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiY2pwZWcubWFrIiBDRkc9ImNqcGVnIC0gV2luMzIiCishTUVTU0FHRSAKKyFNRVNTQUdFIEaBciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6CishTUVTU0FHRSAKKyFNRVNTQUdFICJjanBlZyAtIFdpbjMyIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxjanBlZ1xSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxjanBlZ1xSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiLlxjanBlZyIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICIuXGNqcGVnXFJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxjanBlZ1xSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIuXGNqcGVnIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9jCisjIEFERCBDUFAgL25vbG9nbyAvRzYgL01UIC9XMyAvR1ggL094IC9PYSAvT2IyIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBSZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiY2pwZWcgLSBXaW4zMiIKKyMgQmVnaW4gR3JvdXAgIlF1ZWxsY29kZWRhdGVpZW4iCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdDtmb3I7ZjkwIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxjZGpwZWcuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cY2pwZWcuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccmRibXAuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccmRnaWYuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccmRwcG0uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccmRybGUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccmRzd2l0Y2guYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5ccmR0YXJnYS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIkhlYWRlci1EYXRlaWVuIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGNkZXJyb3IuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cY2RqcGVnLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpjb25maWcuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camVycm9yLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGppbmNsdWRlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGptb3JlY2ZnLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpwZWdsaWIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5canZlcnNpb24uaAorIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJSZXNzb3VyY2VuZGF0ZWllbiIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgorIyBFbmQgR3JvdXAKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbWFrZWNtYWsudmM2IGIvbWFrZWNtYWsudmM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTAzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlY21hay52YzYKQEAgLTAsMCArMSwxNTkgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIE5NQUtFIEZpbGUsIEJhc2VkIG9uIGNqcGVnLmRzcAorIUlGICIkKENGRykiID09ICIiCitDRkc9Y2pwZWcgLSBXaW4zMgorIU1FU1NBR0UgS2VpbmUgS29uZmlndXJhdGlvbiBhbmdlZ2ViZW4uIGNqcGVnIC0gV2luMzIgd2lyZCBhbHMgU3RhbmRhcmQgdmVyd2VuZGV0LgorIUVORElGIAorCishSUYgIiQoQ0ZHKSIgIT0gImNqcGVnIC0gV2luMzIiCishTUVTU0FHRSBVbmf8bHRpZ2UgS29uZmlndXJhdGlvbiAiJChDRkcpIiBhbmdlZ2ViZW4uCishTUVTU0FHRSBTaWUga/ZubmVuIGJlaW0gQXVzZvxocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbgorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJjanBlZy5tYWsiIENGRz0iY2pwZWcgLSBXaW4zMiIKKyFNRVNTQUdFIAorIU1FU1NBR0UgRvxyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgImNqcGVnIC0gV2luMzIiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKyFFUlJPUiBFaW5lIHVuZ/xsdGlnZSBLb25maWd1cmF0aW9uIHd1cmRlIGFuZ2VnZWJlbi4KKyFFTkRJRiAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorIUVMU0UgCitOVUxMPW51bAorIUVORElGIAorCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCitPVVRESVI9LlxjanBlZ1xSZWxlYXNlCitJTlRESVI9LlxjanBlZ1xSZWxlYXNlCisjIEJlZ2luIEN1c3RvbSBNYWNyb3MKK091dERpcj0uXGNqcGVnXFJlbGVhc2UKKyMgRW5kIEN1c3RvbSBNYWNyb3MKKworQUxMIDogIiQoT1VURElSKVxjanBlZy5leGUiCisKKworQ0xFQU4gOgorCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxjanBlZy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkYm1wLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRnaWYub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZHBwbS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkcmxlLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRzd2l0Y2gub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZHRhcmdhLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcdmM2MC5pZGIiCisJLUBlcmFzZSAiJChPVVRESVIpXGNqcGVnLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKK0JTQzMyPWJzY21ha2UuZXhlCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKVxjanBlZy5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm8gL3BkYjoiJChPVVRESVIpXGNqcGVnLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUilcY2pwZWcuZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVxjZGpwZWcub2JqIiBcCisJIiQoSU5URElSKVxjanBlZy5vYmoiIFwKKwkiJChJTlRESVIpXHJkYm1wLm9iaiIgXAorCSIkKElOVERJUilccmRnaWYub2JqIiBcCisJIiQoSU5URElSKVxyZHBwbS5vYmoiIFwKKwkiJChJTlRESVIpXHJkcmxlLm9iaiIgXAorCSIkKElOVERJUilccmRzd2l0Y2gub2JqIiBcCisJIiQoSU5URElSKVxyZHRhcmdhLm9iaiIKKworIiQoT1VURElSKVxjanBlZy5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKKyAgICAkKExJTkszMikgQDw8CisgICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQorPDwKKworQ1BQX1BST0o9L25vbG9nbyAvRzYgL01UIC9XMyAvR1ggL094IC9PYSAvT2IyIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRnAiJChJTlRESVIpXGNqcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUilcXCIgL0ZkIiQoSU5URElSKVxcIiAvRkQgL2MgCisKKy5jeyQoSU5URElSKX0ub2JqOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmNwcHskKElOVERJUil9Lm9iajo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jeHh7JChJTlRESVIpfS5vYmo6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3skKElOVERJUil9LnNicjo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jcHB7JChJTlRESVIpfS5zYnI6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3h4eyQoSU5URElSKX0uc2JyOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworCishSUYgIiQoTk9fRVhURVJOQUxfREVQUykiICE9ICIxIgorIUlGIEVYSVNUUygiY2pwZWcuZGVwIikKKyFJTkNMVURFICJjanBlZy5kZXAiCishRUxTRSAKKyFNRVNTQUdFIFdhcm5pbmc6IGNhbm5vdCBmaW5kICJjanBlZy5kZXAiCishRU5ESUYgCishRU5ESUYgCisKKworIUlGICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIgorU09VUkNFPS5cY2RqcGVnLmMKKworIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGNqcGVnLmMKKworIiQoSU5URElSKVxjanBlZy5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5ccmRibXAuYworCisiJChJTlRESVIpXHJkYm1wLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxyZGdpZi5jCisKKyIkKElOVERJUilccmRnaWYub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXHJkcHBtLmMKKworIiQoSU5URElSKVxyZHBwbS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5ccmRybGUuYworCisiJChJTlRESVIpXHJkcmxlLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxyZHN3aXRjaC5jCisKKyIkKElOVERJUilccmRzd2l0Y2gub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXHJkdGFyZ2EuYworCisiJChJTlRESVIpXHJkdGFyZ2Eub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKKworIUVORElGIAorCmRpZmYgLS1naXQgYS9tYWtlY3ZjcC52YzkgYi9tYWtlY3ZjcC52YzkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4ZTZhMQotLS0gL2Rldi9udWxsCisrKyBiL21ha2VjdmNwLnZjOQpAQCAtMCwwICsxLDE4NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjksMDAiCisJTmFtZT0iY2pwZWciCisJUHJvamVjdEdVSUQ9IntCNEY2MTc3OC1DNDVELTQ1QzYtOUU4Ny0wNkYwM0Y1MDUxOUZ9IgorCVJvb3ROYW1lc3BhY2U9ImNqcGVnIgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxOTY2MTMiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMCIKKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMyIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9ImZhbHNlIgorCQkJCUVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM9InRydWUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkJRGlzYWJsZVNwZWNpZmljV2FybmluZ3M9IjQ5OTYiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iUmVsZWFzZVxqcGVnLmxpYiIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUXVlbGxkYXRlaWVuIgorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY2RqcGVnLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY2pwZWcuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxyZGJtcC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHJkZ2lmLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccmRwcG0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxyZHJsZS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHJkc3dpdGNoLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccmR0YXJnYS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlcmRhdGVpZW4iCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY2RlcnJvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGNkanBlZy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjb25maWcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZXJyb3IuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqaW5jbHVkZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGptb3JlY2ZnLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5canBlZ2xpYi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGp2ZXJzaW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUmVzc291cmNlbmRhdGVpZW4iCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXYiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYWtlZGRlcC52YzYgYi9tYWtlZGRlcC52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxMWViYQotLS0gL2Rldi9udWxsCisrKyBiL21ha2VkZGVwLnZjNgpAQCAtMCwwICsxLDgyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGVyc3RlbGx0ZSBBYmiEbmdpZ2tlaXRzZGF0ZWksIGVpbmJlem9nZW4gdm9uIGRqcGVnLm1haworCisuXGNkanBlZy5jIDogXAorCSIuXGNkZXJyb3IuaCJcCisJIi5cY2RqcGVnLmgiXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5cZGpwZWcuYyA6IFwKKwkiLlxjZGVycm9yLmgiXAorCSIuXGNkanBlZy5oIlwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCSIuXGp2ZXJzaW9uLmgiXAorCQorCisuXHJkY29sbWFwLmMgOiBcCisJIi5cY2RlcnJvci5oIlwKKwkiLlxjZGpwZWcuaCJcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlx3cmJtcC5jIDogXAorCSIuXGNkZXJyb3IuaCJcCisJIi5cY2RqcGVnLmgiXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5cd3JnaWYuYyA6IFwKKwkiLlxjZGVycm9yLmgiXAorCSIuXGNkanBlZy5oIlwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXHdycHBtLmMgOiBcCisJIi5cY2RlcnJvci5oIlwKKwkiLlxjZGpwZWcuaCJcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlx3cnJsZS5jIDogXAorCSIuXGNkZXJyb3IuaCJcCisJIi5cY2RqcGVnLmgiXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5cd3J0YXJnYS5jIDogXAorCSIuXGNkZXJyb3IuaCJcCisJIi5cY2RqcGVnLmgiXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCmRpZmYgLS1naXQgYS9tYWtlZGRzcC52YzYgYi9tYWtlZGRzcC52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4M2EwZgotLS0gL2Rldi9udWxsCisrKyBiL21ha2VkZHNwLnZjNgpAQCAtMCwwICsxLDEzMCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJkanBlZyIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCitDRkc9ZGpwZWcgLSBXaW4zMgorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBngWx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZoFocmVuIFNpZSBkZW4gQmVmZWhsCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJkanBlZy5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBTaWUga/dubmVuIGJlaW0gQXVzZoFocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbgorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJkanBlZy5tYWsiIENGRz0iZGpwZWcgLSBXaW4zMiIKKyFNRVNTQUdFIAorIU1FU1NBR0UgRoFyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgImRqcGVnIC0gV2luMzIiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXGRqcGVnXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXGRqcGVnXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIuXGRqcGVnIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi5cZGpwZWdcUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXGRqcGVnXFJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIi5cZGpwZWciCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9HNiAvTVQgL1czIC9HWCAvT3ggL09hIC9PYjIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJkanBlZyAtIFdpbjMyIgorIyBCZWdpbiBHcm91cCAiUXVlbGxjb2RlZGF0ZWllbiIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0O2ZvcjtmOTAiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGNkanBlZy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxkanBlZy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxyZGNvbG1hcC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx3cmJtcC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx3cmdpZi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx3cnBwbS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx3cnJsZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx3cnRhcmdhLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyLURhdGVpZW4iCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cY2RlcnJvci5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxjZGpwZWcuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNvbmZpZy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZXJyb3IuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camluY2x1ZGUuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cam1vcmVjZmcuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5canBlZ2xpYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqdmVyc2lvbi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIlJlc3NvdXJjZW5kYXRlaWVuIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tYWtlZG1hay52YzYgYi9tYWtlZG1hay52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NDg3ZgotLS0gL2Rldi9udWxsCisrKyBiL21ha2VkbWFrLnZjNgpAQCAtMCwwICsxLDE1OSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgQmFzZWQgb24gZGpwZWcuZHNwCishSUYgIiQoQ0ZHKSIgPT0gIiIKK0NGRz1kanBlZyAtIFdpbjMyCishTUVTU0FHRSBLZWluZSBLb25maWd1cmF0aW9uIGFuZ2VnZWJlbi4gZGpwZWcgLSBXaW4zMiB3aXJkIGFscyBTdGFuZGFyZCB2ZXJ3ZW5kZXQuCishRU5ESUYgCisKKyFJRiAiJChDRkcpIiAhPSAiZGpwZWcgLSBXaW4zMiIKKyFNRVNTQUdFIFVuZ/xsdGlnZSBLb25maWd1cmF0aW9uICIkKENGRykiIGFuZ2VnZWJlbi4KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuCishTUVTU0FHRSBkdXJjaCBEZWZpbmllcmVuIGRlcyBNYWtyb3MgQ0ZHIGluIGRlciBCZWZlaGxzemVpbGUuIFp1bSBCZWlzcGllbDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImRqcGVnLm1hayIgQ0ZHPSJkanBlZyAtIFdpbjMyIgorIU1FU1NBR0UgCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOgorIU1FU1NBR0UgCishTUVTU0FHRSAiZGpwZWcgLSBXaW4zMiIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorIUVSUk9SIEVpbmUgdW5n/Gx0aWdlIEtvbmZpZ3VyYXRpb24gd3VyZGUgYW5nZWdlYmVuLgorIUVORElGIAorCishSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKK05VTEw9CishRUxTRSAKK05VTEw9bnVsCishRU5ESUYgCisKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKK09VVERJUj0uXGRqcGVnXFJlbGVhc2UKK0lOVERJUj0uXGRqcGVnXFJlbGVhc2UKKyMgQmVnaW4gQ3VzdG9tIE1hY3JvcworT3V0RGlyPS5cZGpwZWdcUmVsZWFzZQorIyBFbmQgQ3VzdG9tIE1hY3JvcworCitBTEwgOiAiJChPVVRESVIpXGRqcGVnLmV4ZSIKKworCitDTEVBTiA6CisJLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGRqcGVnLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRjb2xtYXAub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx2YzYwLmlkYiIKKwktQGVyYXNlICIkKElOVERJUilcd3JibXAub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx3cmdpZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHdycHBtLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcd3JybGUub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx3cnRhcmdhLm9iaiIKKwktQGVyYXNlICIkKE9VVERJUilcZGpwZWcuZXhlIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworQlNDMzI9YnNjbWFrZS5leGUKK0JTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpXGRqcGVnLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSU5LMzI9bGluay5leGUKK0xJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpubyAvcGRiOiIkKE9VVERJUilcZGpwZWcucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKVxkanBlZy5leGUiIAorTElOSzMyX09CSlM9IFwKKwkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKKwkiJChJTlRESVIpXGRqcGVnLm9iaiIgXAorCSIkKElOVERJUilccmRjb2xtYXAub2JqIiBcCisJIiQoSU5URElSKVx3cmJtcC5vYmoiIFwKKwkiJChJTlRESVIpXHdyZ2lmLm9iaiIgXAorCSIkKElOVERJUilcd3JwcG0ub2JqIiBcCisJIiQoSU5URElSKVx3cnJsZS5vYmoiIFwKKwkiJChJTlRESVIpXHdydGFyZ2Eub2JqIgorCisiJChPVVRESVIpXGRqcGVnLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCitDUFBfUFJPSj0vbm9sb2dvIC9HNiAvTVQgL1czIC9HWCAvT3ggL09hIC9PYjIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9GcCIkKElOVERJUilcZGpwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKVxcIiAvRmQiJChJTlRESVIpXFwiIC9GRCAvYyAKKworLmN7JChJTlRESVIpfS5vYmo6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3BweyQoSU5URElSKX0ub2JqOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmN4eHskKElOVERJUil9Lm9iajo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jeyQoSU5URElSKX0uc2JyOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmNwcHskKElOVERJUil9LnNicjo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jeHh7JChJTlRESVIpfS5zYnI6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisKKyFJRiAiJChOT19FWFRFUk5BTF9ERVBTKSIgIT0gIjEiCishSUYgRVhJU1RTKCJkanBlZy5kZXAiKQorIUlOQ0xVREUgImRqcGVnLmRlcCIKKyFFTFNFIAorIU1FU1NBR0UgV2FybmluZzogY2Fubm90IGZpbmQgImRqcGVnLmRlcCIKKyFFTkRJRiAKKyFFTkRJRiAKKworCishSUYgIiQoQ0ZHKSIgPT0gImRqcGVnIC0gV2luMzIiCitTT1VSQ0U9LlxjZGpwZWcuYworCisiJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5cZGpwZWcuYworCisiJChJTlRESVIpXGRqcGVnLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxyZGNvbG1hcC5jCisKKyIkKElOVERJUilccmRjb2xtYXAub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXHdyYm1wLmMKKworIiQoSU5URElSKVx3cmJtcC5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5cd3JnaWYuYworCisiJChJTlRESVIpXHdyZ2lmLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9Llx3cnBwbS5jCisKKyIkKElOVERJUilcd3JwcG0ub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXHdycmxlLmMKKworIiQoSU5URElSKVx3cnJsZS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5cd3J0YXJnYS5jCisKKyIkKElOVERJUilcd3J0YXJnYS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworCishRU5ESUYgCisKZGlmZiAtLWdpdCBhL21ha2VkdmNwLnZjOSBiL21ha2VkdmNwLnZjOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjViYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZWR2Y3AudmM5CkBAIC0wLDAgKzEsMTg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOSwwMCIKKwlOYW1lPSJkanBlZyIKKwlQcm9qZWN0R1VJRD0iezlCN0U1N0FFLTMxQ0QtNDA1RS04MDcwLTI2QTgzMDNCOURDOX0iCisJUm9vdE5hbWVzcGFjZT0iZGpwZWciCisJS2V5d29yZD0iV2luMzJQcm9qIgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjE5NjYxMyIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJQ2hhcmFjdGVyU2V0PSIwIgorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0iZmFsc2UiCisJCQkJRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz0idHJ1ZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCQlEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz0iNDk5NiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJSZWxlYXNlXGpwZWcubGliIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJRdWVsbGRhdGVpZW4iCisJCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214IgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxjZGpwZWcuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkanBlZy5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHJkY29sbWFwLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cd3JibXAuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlx3cmdpZi5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHdycHBtLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cd3JybGUuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlx3cnRhcmdhLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSGVhZGVyZGF0ZWllbiIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxjZGVycm9yLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY2RqcGVnLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camNvbmZpZy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGplcnJvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGppbmNsdWRlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cam1vcmVjZmcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqcGVnbGliLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5canZlcnNpb24uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNzb3VyY2VuZGF0ZWllbiIKKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdiIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9IgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL21ha2VmaWxlLmFuc2kgYi9tYWtlZmlsZS5hbnNpCmluZGV4IDgyOTE5MTMuLjMwZTQxYzkgMTAwNjQ0Ci0tLSBhL21ha2VmaWxlLmFuc2kKKysrIGIvbWFrZWZpbGUuYW5zaQpAQCAtMzgsMTMgKzM4LDEzIEBACiAKIAogIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorTElCU09VUkNFUz0gamFyaWNvbS5jIGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2FyaXRoLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgXAorICAgICAgICBqY2RjdG1nci5jIGpjaHVmZi5jIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIFwKKyAgICAgICAgamNvbWFwaS5jIGpjcGFyYW0uYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgXAorICAgICAgICBqZGFwaXN0ZC5jIGpkYXJpdGguYyBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgXAorICAgICAgICBqZGRjdG1nci5jIGpkaHVmZi5jIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBcCisgICAgICAgIGpkbWVyZ2UuYyBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgXAorICAgICAgICBqZmRjdGZzdC5jIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMganF1YW50MS5jIFwKICAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwogIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKIFNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKQEAgLTU0LDM4ICs1NCw0NCBAQAogICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKIFNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCiAjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCitJTkNMVURFUz0gamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmgganBlZ2ludC5oIFwKKyAgICAgICAganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKICMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0CitET0NTPSBSRUFETUUgaW5zdGFsbC50eHQgdXNhZ2UudHh0IGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC50eHQgZXhhbXBsZS5jIGxpYmpwZWcudHh0IHN0cnVjdHVyZS50eHQgXAorICAgICAgICBjb2RlcnVsZXMudHh0IGZpbGVsaXN0LnR4dCBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgTWFrZWZpbGUuaW4gbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWpkc3cudmM2IFwKKyAgICAgICAgbWFrZWFkc3cudmM2IG1ha2VqZGVwLnZjNiBtYWtlamRzcC52YzYgbWFrZWptYWsudmM2IG1ha2VjZGVwLnZjNiBcCisgICAgICAgIG1ha2VjZHNwLnZjNiBtYWtlY21hay52YzYgbWFrZWRkZXAudmM2IG1ha2VkZHNwLnZjNiBtYWtlZG1hay52YzYgXAorICAgICAgICBtYWtldGRlcC52YzYgbWFrZXRkc3AudmM2IG1ha2V0bWFrLnZjNiBtYWtlcmRlcC52YzYgbWFrZXJkc3AudmM2IFwKKyAgICAgICAgbWFrZXJtYWsudmM2IG1ha2V3ZGVwLnZjNiBtYWtld2RzcC52YzYgbWFrZXdtYWsudmM2IG1ha2Vqc2xuLnZjOSBcCisgICAgICAgIG1ha2Vhc2xuLnZjOSBtYWtlanZjcC52YzkgbWFrZWN2Y3AudmM5IG1ha2VkdmNwLnZjOSBtYWtldHZjcC52YzkgXAorICAgICAgICBtYWtlcnZjcC52YzkgbWFrZXd2Y3AudmM5IG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBcCisgICAgICAgIG1ha2xqcGVnLnN0IG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBcCisgICAgICAgIG1ha2VmaWxlLnZtcyBtYWt2bXMub3B0CiBDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCiAgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAogICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0bWFpbi5zaCBkZXBjb21wIG1pc3NpbmcKK09USEVSRklMRVM9IGpjb25maWcudHh0IGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbSBcCisgICAgICAgIGxpYmpwZWcubWFwCiBURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAogICAgICAgICB0ZXN0aW1ncC5qcGcKIERJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAogICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQogIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCitDT01PQkpFQ1RTPSBqYXJpY29tLm8gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKICMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY2FyaXRoLm8gamN0cmFucy5vIGpjcGFyYW0ubyBcCisgICAgICAgIGpkYXRhZHN0Lm8gamNpbml0Lm8gamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBcCisgICAgICAgIGpjY29lZmN0Lm8gamNjb2xvci5vIGpjc2FtcGxlLm8gamNodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIFwKKyAgICAgICAgamZkY3RmbHQubyBqZmRjdGludC5vCiAjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCi0gICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkYXJpdGgubyBqZHRyYW5zLm8gamRhdGFzcmMubyBcCisgICAgICAgIGpkbWFzdGVyLm8gamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRtYWluY3QubyBcCisgICAgICAgIGpkY29lZmN0Lm8gamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBcCisgICAgICAgIGppZGN0aW50Lm8gamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KICMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQogTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQogIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQpAQCAtMTE4LDkgKzEyNCw5IEBACiB3cmpwZ2NvbTogd3JqcGdjb20ubwogCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKIAotamNvbmZpZy5oOiBqY29uZmlnLmRvYworamNvbmZpZy5oOiBqY29uZmlnLnR4dAogCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC50eHQuCiAJZXhpdCAxCiAKIGNsZWFuOgpAQCAtMTQzLDM2ICsxNDksMzcgQEAKIAljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwogCiAKK2phcmljb20ubzogamFyaWNvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FyaXRoLm86IGpjYXJpdGguYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAogamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcml0aC5vOiBqZGFyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKIGpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCkBAIC0xODMsNyArMTkwLDYgQEAKIGppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoganF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLmJjYyBiL21ha2VmaWxlLmJjYwppbmRleCBhMWNmY2RlLi5jOWUyMzExIDEwMDY0NAotLS0gYS9tYWtlZmlsZS5iY2MKKysrIGIvbWFrZWZpbGUuYmNjCkBAIC02NSwxMyArNjUsMTMgQEAKIAogCiAjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCitMSUJTT1VSQ0VTPSBqYXJpY29tLmMgamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjYXJpdGguYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBcCisgICAgICAgIGpjZGN0bWdyLmMgamNodWZmLmMgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgXAorICAgICAgICBqY29tYXBpLmMgamNwYXJhbS5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBcCisgICAgICAgIGpkYXBpc3RkLmMgamRhcml0aC5jIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBcCisgICAgICAgIGpkZGN0bWdyLmMgamRodWZmLmMgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIFwKKyAgICAgICAgamRtZXJnZS5jIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBcCisgICAgICAgIGpmZGN0ZnN0LmMgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqcXVhbnQxLmMgXAogICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCiAjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQogU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwpAQCAtODEsMzkgKzgxLDQ1IEBACiAgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwogU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKICMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKK0lOQ0xVREVTPSBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBqcGVnaW50LmggXAorICAgICAgICBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAogIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCi0gICAgICAgIG1ha3Ztcy5vcHQKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLnR4dCB1c2FnZS50eHQgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLnR4dCBleGFtcGxlLmMgbGlianBlZy50eHQgc3RydWN0dXJlLnR4dCBcCisgICAgICAgIGNvZGVydWxlcy50eHQgZmlsZWxpc3QudHh0IGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBNYWtlZmlsZS5pbiBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlamRzdy52YzYgXAorICAgICAgICBtYWtlYWRzdy52YzYgbWFrZWpkZXAudmM2IG1ha2VqZHNwLnZjNiBtYWtlam1hay52YzYgbWFrZWNkZXAudmM2IFwKKyAgICAgICAgbWFrZWNkc3AudmM2IG1ha2VjbWFrLnZjNiBtYWtlZGRlcC52YzYgbWFrZWRkc3AudmM2IG1ha2VkbWFrLnZjNiBcCisgICAgICAgIG1ha2V0ZGVwLnZjNiBtYWtldGRzcC52YzYgbWFrZXRtYWsudmM2IG1ha2VyZGVwLnZjNiBtYWtlcmRzcC52YzYgXAorICAgICAgICBtYWtlcm1hay52YzYgbWFrZXdkZXAudmM2IG1ha2V3ZHNwLnZjNiBtYWtld21hay52YzYgbWFrZWpzbG4udmM5IFwKKyAgICAgICAgbWFrZWFzbG4udmM5IG1ha2VqdmNwLnZjOSBtYWtlY3ZjcC52YzkgbWFrZWR2Y3AudmM5IG1ha2V0dmNwLnZjOSBcCisgICAgICAgIG1ha2VydmNwLnZjOSBtYWtld3ZjcC52YzkgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IFwKKyAgICAgICAgbWFrbGpwZWcuc3QgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIFwKKyAgICAgICAgbWFrZWZpbGUudm1zIG1ha3Ztcy5vcHQKIENPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKICAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCiAgICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRtYWluLnNoIGRlcGNvbXAgbWlzc2luZworT1RIRVJGSUxFUz0gamNvbmZpZy50eHQgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtIFwKKyAgICAgICAgbGlianBlZy5tYXAKIFRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCiAgICAgICAgIHRlc3RpbWdwLmpwZwogRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCiAgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCiAjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorQ09NT0JKRUNUUz0gamFyaWNvbS5vYmogamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQogIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKLSAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAotICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAorQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamNhcml0aC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogXAorICAgICAgICBqZGF0YWRzdC5vYmogamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBcCisgICAgICAgIGpjcHJlcGN0Lm9iaiBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogXAogICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKICMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKLSAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKLSAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCi0gICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCi0gICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCitETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZGFyaXRoLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAorICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRtYWluY3Qub2JqIFwKKyAgICAgICAgamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIGppZGN0Zmx0Lm9iaiBcCisgICAgICAgIGppZGN0aW50Lm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmoganF1YW50MS5vYmoganF1YW50Mi5vYmogXAorICAgICAgICBqZG1lcmdlLm9iagogIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKIExJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKICMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKQEAgLTEyOSwxNSArMTM1LDE1IEBACiBsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQogCS0gZGVsIGxpYmpwZWcubGliCiAJdGxpYiBsaWJqcGVnLmxpYiAvRSAvQyBAJiZ8Ci0ramNhcGltaW4ub2JqICtqY2FwaXN0ZC5vYmogK2pjdHJhbnMub2JqICtqY3BhcmFtLm9iaiAramRhdGFkc3Qub2JqICYKLStqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogJgotK2pjY29lZmN0Lm9iaiAramNjb2xvci5vYmogK2pjc2FtcGxlLm9iaiAramNodWZmLm9iaiAramNwaHVmZi5vYmogJgorK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY2FyaXRoLm9iaiAramN0cmFucy5vYmogK2pjcGFyYW0ub2JqICYKKytqZGF0YWRzdC5vYmogK2pjaW5pdC5vYmogK2pjbWFzdGVyLm9iaiAramNtYXJrZXIub2JqICtqY21haW5jdC5vYmogJgorK2pjcHJlcGN0Lm9iaiAramNjb2VmY3Qub2JqICtqY2NvbG9yLm9iaiAramNzYW1wbGUub2JqICtqY2h1ZmYub2JqICYKICtqY2RjdG1nci5vYmogK2pmZGN0ZnN0Lm9iaiAramZkY3RmbHQub2JqICtqZmRjdGludC5vYmogK2pkYXBpbWluLm9iaiAmCi0ramRhcGlzdGQub2JqICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICtqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICYKLStqZG1hcmtlci5vYmogK2pkaHVmZi5vYmogK2pkcGh1ZmYub2JqICtqZG1haW5jdC5vYmogK2pkY29lZmN0Lm9iaiAmCisramRhcGlzdGQub2JqICtqZGFyaXRoLm9iaiAramR0cmFucy5vYmogK2pkYXRhc3JjLm9iaiAramRtYXN0ZXIub2JqICYKKytqZGlucHV0Lm9iaiAramRtYXJrZXIub2JqICtqZGh1ZmYub2JqICtqZG1haW5jdC5vYmogK2pkY29lZmN0Lm9iaiAmCiAramRwb3N0Y3Qub2JqICtqZGRjdG1nci5vYmogK2ppZGN0ZnN0Lm9iaiAramlkY3RmbHQub2JqICtqaWRjdGludC5vYmogJgotK2ppZGN0cmVkLm9iaiAramRzYW1wbGUub2JqICtqZGNvbG9yLm9iaiAranF1YW50MS5vYmogK2pxdWFudDIub2JqICYKLStqZG1lcmdlLm9iaiAramNvbWFwaS5vYmogK2p1dGlscy5vYmogK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYKKytqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAranF1YW50Mi5vYmogK2pkbWVyZ2Uub2JqICYKKytqYXJpY29tLm9iaiAramNvbWFwaS5vYmogK2p1dGlscy5vYmogK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYKICQoU1lTREVQTUVNTElCKQogfAogCkBAIC0xNzAsOSArMTc2LDkgQEAKIC5jLm9iajoKIAkkKENDKSAkKENGTEFHUykgLWN7ICQ8fQogCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCitqY29uZmlnLmg6IGpjb25maWcudHh0CiAJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLnR4dC4KIAlleGl0IDEKIAogY2xlYW46CkBAIC0yMTIsMzYgKzIxOCwzNyBAQAogIWVuZGlmCiAKIAoramFyaWNvbS5vYmo6IGphcmljb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXJpdGgub2JqOiBqY2FyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKIGpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFyaXRoLm9iajogamRhcml0aC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKIGpkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKIGpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCkBAIC0yNTIsNyArMjU5LDYgQEAKIGppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoganF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGp1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUuY2ZnIGIvbWFrZWZpbGUuY2ZnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTY4MzE5Li4wMDAwMDAwCi0tLSBhL21ha2VmaWxlLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKLQotIyBtYWtlZmlsZS5jZmcgaXMgZWRpdGVkIGJ5IGNvbmZpZ3VyZSB0byBwcm9kdWNlIGEgY3VzdG9tIE1ha2VmaWxlLgotCi0jIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQotCi0jIEZvciBjb21waWxpbmcgd2l0aCBzb3VyY2UgYW5kIG9iamVjdCBmaWxlcyBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuCi1zcmNkaXIgPSBAc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi0jIFdoZXJlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBtYW4gcGFnZXMuCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi1iaW5kaXIgPSAkKGV4ZWNfcHJlZml4KS9iaW4KLWxpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgotaW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCi1iaW5wcmVmaXggPQotbWFucHJlZml4ID0KLW1hbmV4dCA9IDEKLW1hbmRpciA9ICQocHJlZml4KS9tYW4vbWFuJChtYW5leHQpCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgotQ0M9IEBDQ0AKLQotIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6Ci1DRkxBR1M9IEBDRkxBR1NAIEBDUFBGTEFHU0AgQElOQ0xVREVGTEFHU0AKLSMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCi0jIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KLSMgSG93ZXZlciwgYW55IHNwZWNpYWwgZGVmaW5lcyBmb3IgYW5zaTJrbnIuYyBtYXkgYmUgaW5jbHVkZWQgaGVyZToKLUFOU0kyS05SRkxBR1M9IEBBTlNJMktOUkZMQUdTQAotCi0jIExpbmstdGltZSBjYyBvcHRpb25zOgotTERGTEFHUz0gQExERkxBR1NACi0KLSMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCi1MRExJQlM9IEBMSUJTQAotCi0jIElmIHVzaW5nIEdOVSBsaWJ0b29sLCBMSUJUT09MIHJlZmVyZW5jZXMgaXQ7IGlmIG5vdCwgTElCVE9PTCBpcyBlbXB0eS4KLUxJQlRPT0wgPSBATElCVE9PTEAKLSMgJChPKSBleHBhbmRzIHRvICJsbyIgaWYgdXNpbmcgbGlidG9vbCwgcGxhaW4gIm8iIGlmIG5vdC4KLSMgU2ltaWxhcmx5LCAkKEEpIGV4cGFuZHMgdG8gImxhIiBvciAiYSIuCi1PID0gQE9ACi1BID0gQEFACi0KLSMgTGlicmFyeSB2ZXJzaW9uIElEOyBsaWJ0b29sIHVzZXMgdGhpcyBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyLgotIyBOb3RlOiB3ZSBzdWdnZXN0IHRoaXMgbWF0Y2ggdGhlIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgaW4ganBlZ2xpYi5oLgotSlBFR19MSUJfVkVSU0lPTiA9IEBKUEVHX0xJQl9WRVJTSU9OQAotCi0jIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQotIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAotIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KLVNZU0RFUE1FTT0gQE1FTU9SWU1HUkAKLQotIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgotU0hFTEw9IC9iaW4vc2gKLSMgbGlua2VyCi1MTj0gQExOQAotIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKLVJNPSBybSAtZgotIyBkaXJlY3RvcnkgY3JlYXRpb24gY29tbWFuZAotTUtESVI9IG1rZGlyCi0jIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKLUFSPSBhciByYwotIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKLUFSMj0gQFJBTkxJQkAKLSMgaW5zdGFsbGF0aW9uIHByb2dyYW0KLUlOU1RBTEw9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9MSUI9IEBJTlNUQUxMX0xJQkAKLUlOU1RBTExfREFUQT0gQElOU1RBTExfREFUQUAKLQotIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCi0KLQotIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAotICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jIGphcmljb20uYyBqY2FyaXRoLmMgamRhcml0aC5jCi0jIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQotU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwotIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQotQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKLSAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCi0gICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwotU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKLSMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKLSMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0Ci1DT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCi0gICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAotICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KLVRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCi0gICAgICAgIHRlc3RpbWdwLmpwZwotRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCi0gICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCi0jIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS4kKE8pIGp1dGlscy4kKE8pIGplcnJvci4kKE8pIGptZW1tZ3IuJChPKSBqYXJpY29tLiQoTykgJChTWVNERVBNRU0pCi0jIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4uJChPKSBqY2FwaXN0ZC4kKE8pIGpjdHJhbnMuJChPKSBqY3BhcmFtLiQoTykgXAotICAgICAgICBqZGF0YWRzdC4kKE8pIGpjaW5pdC4kKE8pIGpjbWFzdGVyLiQoTykgamNtYXJrZXIuJChPKSBqY21haW5jdC4kKE8pIFwKLSAgICAgICAgamNwcmVwY3QuJChPKSBqY2NvZWZjdC4kKE8pIGpjY29sb3IuJChPKSBqY3NhbXBsZS4kKE8pIGpjaHVmZi4kKE8pIFwKLSAgICAgICAgamNwaHVmZi4kKE8pIGpjZGN0bWdyLiQoTykgamZkY3Rmc3QuJChPKSBqZmRjdGZsdC4kKE8pIFwKLSAgICAgICAgamZkY3RpbnQuJChPKSBqY2FyaXRoLiQoTykKLSMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLiQoTykgamRhcGlzdGQuJChPKSBqZHRyYW5zLiQoTykgamRhdGFzcmMuJChPKSBcCi0gICAgICAgIGpkbWFzdGVyLiQoTykgamRpbnB1dC4kKE8pIGpkbWFya2VyLiQoTykgamRodWZmLiQoTykgamRwaHVmZi4kKE8pIFwKLSAgICAgICAgamRtYWluY3QuJChPKSBqZGNvZWZjdC4kKE8pIGpkcG9zdGN0LiQoTykgamRkY3RtZ3IuJChPKSBcCi0gICAgICAgIGppZGN0ZnN0LiQoTykgamlkY3RmbHQuJChPKSBqaWRjdGludC4kKE8pIGppZGN0cmVkLiQoTykgXAotICAgICAgICBqZHNhbXBsZS4kKE8pIGpkY29sb3IuJChPKSBqcXVhbnQxLiQoTykganF1YW50Mi4kKE8pIGpkbWVyZ2UuJChPKSBqZGFyaXRoLiQoTykKLSMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQotTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQotIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQotQ09CSkVDVFM9IGNqcGVnLiQoTykgcmRwcG0uJChPKSByZGdpZi4kKE8pIHJkdGFyZ2EuJChPKSByZHJsZS4kKE8pIFwKLSAgICAgICAgcmRibXAuJChPKSByZHN3aXRjaC4kKE8pIGNkanBlZy4kKE8pCi1ET0JKRUNUUz0gZGpwZWcuJChPKSB3cnBwbS4kKE8pIHdyZ2lmLiQoTykgd3J0YXJnYS4kKE8pIHdycmxlLiQoTykgXAotICAgICAgICB3cmJtcC4kKE8pIHJkY29sbWFwLiQoTykgY2RqcGVnLiQoTykKLVRST0JKRUNUUz0ganBlZ3RyYW4uJChPKSByZHN3aXRjaC4kKE8pIGNkanBlZy4kKE8pIHRyYW5zdXBwLiQoTykKLQotCi1hbGw6IEBBMktfREVQU0AgbGlianBlZy4kKEEpIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCi0KLSMgU3BlY2lhbCBjb21waWxhdGlvbiBydWxlcyB0byBzdXBwb3J0IGFuc2kya25yIGFuZCBsaWJ0b29sLgotLlNVRkZJWEVTOiAubG8gLmxhCi0KLSMgSG93IHRvIGNvbXBpbGUgd2l0aCBsaWJ0b29sLgotQENPTV9MVEAuYy5sbzoKLUBDT01fTFRACSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChDRkxBR1MpIC1jICQoc3JjZGlyKS8kKi5jCi0KLSMgSG93IHRvIHVzZSBhbnNpMmtuciwgd2hlbiBub3QgdXNpbmcgbGlidG9vbC4KLUBDT01fQTJLQC5jLm86Ci1AQ09NX0EyS0AJLi9hbnNpMmtuciAkKHNyY2RpcikvJCouYyBrbnIvJCouYwotQENPTV9BMktACSQoQ0MpICQoQ0ZMQUdTKSAtYyBrbnIvJCouYwotQENPTV9BMktACSQoUk0pIGtuci8kKi5jCi0KLSMgSG93IHRvIHVzZSBhbnNpMmtuciBBTkQgbGlidG9vbC4KLUBDT01fQTJLQC5jLmxvOgotQENPTV9BMktACS4vYW5zaTJrbnIgJChzcmNkaXIpLyQqLmMga25yLyQqLmMKLUBDT01fQTJLQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoQ0ZMQUdTKSAtYyBrbnIvJCouYwotQENPTV9BMktACSQoUk0pIGtuci8kKi5jCi0KLWFuc2kya25yOiBhbnNpMmtuci5jCi0JJChDQykgJChDRkxBR1MpICQoQU5TSTJLTlJGTEFHUykgLW8gYW5zaTJrbnIgJChzcmNkaXIpL2Fuc2kya25yLmMKLQkkKE1LRElSKSBrbnIKLQotIyB0aGUgbGlicmFyeToKLQotIyB3aXRob3V0IGxpYnRvb2w6Ci1saWJqcGVnLmE6IEBBMktfREVQU0AgJChMSUJPQkpFQ1RTKQotCSQoUk0pIGxpYmpwZWcuYQotCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQotCSQoQVIyKSBsaWJqcGVnLmEKLQotIyB3aXRoIGxpYnRvb2w6Ci1saWJqcGVnLmxhOiBAQTJLX0RFUFNAICQoTElCT0JKRUNUUykKLQkkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpIC1vIGxpYmpwZWcubGEgJChMSUJPQkpFQ1RTKSBcCi0JCS1ycGF0aCAkKGxpYmRpcikgLXZlcnNpb24taW5mbyAkKEpQRUdfTElCX1ZFUlNJT04pCi0KLSMgc2FtcGxlIHByb2dyYW1zOgotCi1janBlZzogJChDT0JKRUNUUykgbGlianBlZy4kKEEpCi0JJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCi0KLWRqcGVnOiAkKERPQkpFQ1RTKSBsaWJqcGVnLiQoQSkKLQkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcuJChBKSAkKExETElCUykKLQotanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLiQoQSkKLQkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCi0KLXJkanBnY29tOiByZGpwZ2NvbS4kKE8pCi0JJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS4kKE8pICQoTERMSUJTKQotCi13cmpwZ2NvbTogd3JqcGdjb20uJChPKQotCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20uJChPKSAkKExETElCUykKLQotIyBJbnN0YWxsYXRpb24gcnVsZXM6Ci0KLWluc3RhbGw6IGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tIEBGT1JDRV9JTlNUQUxMX0xJQkAKLQkkKElOU1RBTExfUFJPR1JBTSkgY2pwZWcgJChiaW5kaXIpLyQoYmlucHJlZml4KWNqcGVnCi0JJChJTlNUQUxMX1BST0dSQU0pIGRqcGVnICQoYmluZGlyKS8kKGJpbnByZWZpeClkanBlZwotCSQoSU5TVEFMTF9QUk9HUkFNKSBqcGVndHJhbiAkKGJpbmRpcikvJChiaW5wcmVmaXgpanBlZ3RyYW4KLQkkKElOU1RBTExfUFJPR1JBTSkgcmRqcGdjb20gJChiaW5kaXIpLyQoYmlucHJlZml4KXJkanBnY29tCi0JJChJTlNUQUxMX1BST0dSQU0pIHdyanBnY29tICQoYmluZGlyKS8kKGJpbnByZWZpeCl3cmpwZ2NvbQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvY2pwZWcuMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpY2pwZWcuJChtYW5leHQpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9kanBlZy4xICQobWFuZGlyKS8kKG1hbnByZWZpeClkanBlZy4kKG1hbmV4dCkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWd0cmFuLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWpwZWd0cmFuLiQobWFuZXh0KQotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcmRqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpcmRqcGdjb20uJChtYW5leHQpCi0JJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS93cmpwZ2NvbS4xICQobWFuZGlyKS8kKG1hbnByZWZpeCl3cmpwZ2NvbS4kKG1hbmV4dCkKLQotaW5zdGFsbC1saWI6IGxpYmpwZWcuJChBKSBpbnN0YWxsLWhlYWRlcnMKLQkkKElOU1RBTExfTElCKSBsaWJqcGVnLiQoQSkgJChsaWJkaXIpLyQoYmlucHJlZml4KWxpYmpwZWcuJChBKQotCi1pbnN0YWxsLWhlYWRlcnM6IGpjb25maWcuaAotCSQoSU5TVEFMTF9EQVRBKSBqY29uZmlnLmggJChpbmNsdWRlZGlyKS9qY29uZmlnLmgKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWdsaWIuaCAkKGluY2x1ZGVkaXIpL2pwZWdsaWIuaAotCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2Rpcikvam1vcmVjZmcuaCAkKGluY2x1ZGVkaXIpL2ptb3JlY2ZnLmgKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2plcnJvci5oICQoaW5jbHVkZWRpcikvamVycm9yLmgKLQotY2xlYW46Ci0JJChSTSkgKi5vICoubG8gbGlianBlZy5hIGxpYmpwZWcubGEKLQkkKFJNKSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQotCSQoUk0pIGFuc2kya25yIGNvcmUgdGVzdG91dCogY29uZmlnLmxvZyBjb25maWcuc3RhdHVzCi0JJChSTSkgLXIga25yIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbjogY2xlYW4KLQkkKFJNKSBNYWtlZmlsZSBqY29uZmlnLmggbGlidG9vbCBjb25maWcuY2FjaGUKLQotdGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KLQkkKFJNKSB0ZXN0b3V0KgotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZwotCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgICQoc3JjZGlyKS90ZXN0aW1nLnBwbQotCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gJChzcmNkaXIpL3Rlc3Rwcm9nLmpwZwotCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnICQoc3JjZGlyKS90ZXN0aW1nLnBwbQotCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKLQljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXQucHBtCi0JY21wICQoc3JjZGlyKS90ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAotCWNtcCAkKHNyY2RpcikvdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKLQljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQotCWNtcCAkKHNyY2RpcikvdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZwotCWNtcCAkKHNyY2RpcikvdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwotCi1jaGVjazogdGVzdAotCi0jIE1pc3Rha2UgY2F0Y2hlcjoKLQotamNvbmZpZy5oOiBqY29uZmlnLmRvYwotCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCi0JZXhpdCAxCi0KLSMgR05VIE1ha2UgbGlrZXMgdG8ga25vdyB3aGljaCB0YXJnZXQgbmFtZXMgYXJlIG5vdCByZWFsbHkgZmlsZXMgdG8gYmUgbWFkZToKLS5QSE9OWTogYWxsIGluc3RhbGwgaW5zdGFsbC1saWIgaW5zdGFsbC1oZWFkZXJzIGNsZWFuIGRpc3RjbGVhbiB0ZXN0IGNoZWNrCi0KLQotamNhcGltaW4uJChPKTogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjYXBpc3RkLiQoTyk6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2NvZWZjdC4kKE8pOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNjb2xvci4kKE8pOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY2RjdG1nci4kKE8pOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi4kKE8pOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjaW5pdC4kKE8pOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjbWFpbmN0LiQoTyk6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY21hcmtlci4kKE8pOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNtYXN0ZXIuJChPKTogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjb21hcGkuJChPKTogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwYXJhbS4kKE8pOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLiQoTyk6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKLWpjcHJlcGN0LiQoTyk6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3NhbXBsZS4kKE8pOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamN0cmFucy4kKE8pOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFwaW1pbi4kKE8pOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRhcGlzdGQuJChPKTogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkYXRhZHN0LiQoTyk6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkYXRhc3JjLiQoTyk6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKLWpkY29lZmN0LiQoTyk6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGNvbG9yLiQoTyk6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkZGN0bWdyLiQoTyk6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLiQoTyk6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRpbnB1dC4kKE8pOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1haW5jdC4kKE8pOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRtYXJrZXIuJChPKTogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkbWFzdGVyLiQoTyk6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZG1lcmdlLiQoTyk6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYuJChPKTogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAotamRwb3N0Y3QuJChPKTogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkc2FtcGxlLiQoTyk6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHRyYW5zLiQoTyk6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWplcnJvci4kKE8pOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCi1qZmRjdGZsdC4kKE8pOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpmZGN0ZnN0LiQoTyk6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamZkY3RpbnQuJChPKTogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdGZsdC4kKE8pOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0ZnN0LiQoTyk6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RpbnQuJChPKTogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC4kKE8pOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpxdWFudDEuJChPKToganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotanF1YW50Mi4kKE8pOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qdXRpbHMuJChPKToganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qbWVtbWdyLiQoTyk6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtYW5zaS4kKE8pOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKLWptZW1uYW1lLiQoTyk6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAotam1lbW5vYnMuJChPKTogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtZG9zLiQoTyk6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1qbWVtbWFjLiQoTyk6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCi1janBlZy4kKE8pOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1kanBlZy4kKE8pOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCi1qcGVndHJhbi4kKE8pOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKLXJkanBnY29tLiQoTyk6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLXdyanBnY29tLiQoTyk6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKLWNkanBlZy4kKE8pOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkY29sbWFwLiQoTyk6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZHN3aXRjaC4kKE8pOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotdHJhbnN1cHAuJChPKTogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAotcmRwcG0uJChPKTogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXdycHBtLiQoTyk6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGdpZi4kKE8pOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JnaWYuJChPKTogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkdGFyZ2EuJChPKTogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3J0YXJnYS4kKE8pOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi1yZGJtcC4kKE8pOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotd3JibXAuJChPKTogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKLXJkcmxlLiQoTyk6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCi13cnJsZS4kKE8pOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAotamNhcml0aC4kKE8pOiBqY2FyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZGFyaXRoLiQoTyk6IGpkYXJpdGguYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWphcmljb20uJChPKTogamFyaWNvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUuZGogYi9tYWtlZmlsZS5kagppbmRleCBmNzY2ZDI1Li4xNGQwZWU2IDEwMDY0NAotLS0gYS9tYWtlZmlsZS5kagorKysgYi9tYWtlZmlsZS5kagpAQCAtMzgsMTMgKzM4LDEzIEBACiAKIAogIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorTElCU09VUkNFUz0gamFyaWNvbS5jIGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2FyaXRoLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgXAorICAgICAgICBqY2RjdG1nci5jIGpjaHVmZi5jIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIFwKKyAgICAgICAgamNvbWFwaS5jIGpjcGFyYW0uYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgXAorICAgICAgICBqZGFwaXN0ZC5jIGpkYXJpdGguYyBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgXAorICAgICAgICBqZGRjdG1nci5jIGpkaHVmZi5jIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBcCisgICAgICAgIGpkbWVyZ2UuYyBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgXAorICAgICAgICBqZmRjdGZzdC5jIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMganF1YW50MS5jIFwKICAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwogIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKIFNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKQEAgLTU0LDM4ICs1NCw0NCBAQAogICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKIFNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCiAjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCitJTkNMVURFUz0gamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmgganBlZ2ludC5oIFwKKyAgICAgICAganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKICMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0CitET0NTPSBSRUFETUUgaW5zdGFsbC50eHQgdXNhZ2UudHh0IGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC50eHQgZXhhbXBsZS5jIGxpYmpwZWcudHh0IHN0cnVjdHVyZS50eHQgXAorICAgICAgICBjb2RlcnVsZXMudHh0IGZpbGVsaXN0LnR4dCBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgTWFrZWZpbGUuaW4gbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWpkc3cudmM2IFwKKyAgICAgICAgbWFrZWFkc3cudmM2IG1ha2VqZGVwLnZjNiBtYWtlamRzcC52YzYgbWFrZWptYWsudmM2IG1ha2VjZGVwLnZjNiBcCisgICAgICAgIG1ha2VjZHNwLnZjNiBtYWtlY21hay52YzYgbWFrZWRkZXAudmM2IG1ha2VkZHNwLnZjNiBtYWtlZG1hay52YzYgXAorICAgICAgICBtYWtldGRlcC52YzYgbWFrZXRkc3AudmM2IG1ha2V0bWFrLnZjNiBtYWtlcmRlcC52YzYgbWFrZXJkc3AudmM2IFwKKyAgICAgICAgbWFrZXJtYWsudmM2IG1ha2V3ZGVwLnZjNiBtYWtld2RzcC52YzYgbWFrZXdtYWsudmM2IG1ha2Vqc2xuLnZjOSBcCisgICAgICAgIG1ha2Vhc2xuLnZjOSBtYWtlanZjcC52YzkgbWFrZWN2Y3AudmM5IG1ha2VkdmNwLnZjOSBtYWtldHZjcC52YzkgXAorICAgICAgICBtYWtlcnZjcC52YzkgbWFrZXd2Y3AudmM5IG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBcCisgICAgICAgIG1ha2xqcGVnLnN0IG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBcCisgICAgICAgIG1ha2VmaWxlLnZtcyBtYWt2bXMub3B0CiBDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCiAgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAogICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0bWFpbi5zaCBkZXBjb21wIG1pc3NpbmcKK09USEVSRklMRVM9IGpjb25maWcudHh0IGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbSBcCisgICAgICAgIGxpYmpwZWcubWFwCiBURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAogICAgICAgICB0ZXN0aW1ncC5qcGcKIERJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAogICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQogIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCitDT01PQkpFQ1RTPSBqYXJpY29tLm8gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKICMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY2FyaXRoLm8gamN0cmFucy5vIGpjcGFyYW0ubyBcCisgICAgICAgIGpkYXRhZHN0Lm8gamNpbml0Lm8gamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBcCisgICAgICAgIGpjY29lZmN0Lm8gamNjb2xvci5vIGpjc2FtcGxlLm8gamNodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIFwKKyAgICAgICAgamZkY3RmbHQubyBqZmRjdGludC5vCiAjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCi0gICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkYXJpdGgubyBqZHRyYW5zLm8gamRhdGFzcmMubyBcCisgICAgICAgIGpkbWFzdGVyLm8gamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRtYWluY3QubyBcCisgICAgICAgIGpkY29lZmN0Lm8gamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBcCisgICAgICAgIGppZGN0aW50Lm8gamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KICMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQogTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQogIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQpAQCAtMTE4LDkgKzEyNCw5IEBACiB3cmpwZ2NvbS5leGU6IHdyanBnY29tLm8KIAkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tLmV4ZSB3cmpwZ2NvbS5vICQoTERMSUJTKQogCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCitqY29uZmlnLmg6IGpjb25maWcudHh0CiAJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLnR4dC4KIAlleGl0IDEKIAogY2xlYW46CkBAIC0xNDksMzYgKzE1NSwzNyBAQAogCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKIAogCitqYXJpY29tLm86IGphcmljb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcml0aC5vOiBqY2FyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKIGpjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXJpdGgubzogamRhcml0aC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCiBqZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaApAQCAtMTg5LDcgKzE5Niw2IEBACiBqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGpxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoganF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5tYW54IGIvbWFrZWZpbGUubWFueAppbmRleCA0Y2I0MmQxLi5kMWFmNTdjIDEwMDY0NAotLS0gYS9tYWtlZmlsZS5tYW54CisrKyBiL21ha2VmaWxlLm1hbngKQEAgLTM5LDEzICszOSwxMyBAQAogCiAKICMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKK0xJQlNPVVJDRVM9IGphcmljb20uYyBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNhcml0aC5jIGpjY29lZmN0LmMgamNjb2xvci5jIFwKKyAgICAgICAgamNkY3RtZ3IuYyBqY2h1ZmYuYyBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBcCisgICAgICAgIGpjb21hcGkuYyBqY3BhcmFtLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIFwKKyAgICAgICAgamRhcGlzdGQuYyBqZGFyaXRoLmMgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIFwKKyAgICAgICAgamRkY3RtZ3IuYyBqZGh1ZmYuYyBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgXAorICAgICAgICBqZG1lcmdlLmMgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIFwKKyAgICAgICAgamZkY3Rmc3QuYyBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGpxdWFudDEuYyBcCiAgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKICMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CiBTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCkBAIC01NSwzOCArNTUsNDQgQEAKICAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCiBTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQogIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorSU5DTFVERVM9IGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBcCisgICAgICAgIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCiAjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAorRE9DUz0gUkVBRE1FIGluc3RhbGwudHh0IHVzYWdlLnR4dCBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQudHh0IGV4YW1wbGUuYyBsaWJqcGVnLnR4dCBzdHJ1Y3R1cmUudHh0IFwKKyAgICAgICAgY29kZXJ1bGVzLnR4dCBmaWxlbGlzdC50eHQgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIE1ha2VmaWxlLmluIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VqZHN3LnZjNiBcCisgICAgICAgIG1ha2VhZHN3LnZjNiBtYWtlamRlcC52YzYgbWFrZWpkc3AudmM2IG1ha2VqbWFrLnZjNiBtYWtlY2RlcC52YzYgXAorICAgICAgICBtYWtlY2RzcC52YzYgbWFrZWNtYWsudmM2IG1ha2VkZGVwLnZjNiBtYWtlZGRzcC52YzYgbWFrZWRtYWsudmM2IFwKKyAgICAgICAgbWFrZXRkZXAudmM2IG1ha2V0ZHNwLnZjNiBtYWtldG1hay52YzYgbWFrZXJkZXAudmM2IG1ha2VyZHNwLnZjNiBcCisgICAgICAgIG1ha2VybWFrLnZjNiBtYWtld2RlcC52YzYgbWFrZXdkc3AudmM2IG1ha2V3bWFrLnZjNiBtYWtlanNsbi52YzkgXAorICAgICAgICBtYWtlYXNsbi52YzkgbWFrZWp2Y3AudmM5IG1ha2VjdmNwLnZjOSBtYWtlZHZjcC52YzkgbWFrZXR2Y3AudmM5IFwKKyAgICAgICAgbWFrZXJ2Y3AudmM5IG1ha2V3dmNwLnZjOSBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgXAorICAgICAgICBtYWtsanBlZy5zdCBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgXAorICAgICAgICBtYWtlZmlsZS52bXMgbWFrdm1zLm9wdAogQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAogICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKICAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdG1haW4uc2ggZGVwY29tcCBtaXNzaW5nCitPVEhFUkZJTEVTPSBqY29uZmlnLnR4dCBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20gXAorICAgICAgICBsaWJqcGVnLm1hcAogVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKICAgICAgICAgdGVzdGltZ3AuanBnCiBESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKICAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKICMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorQ09NT0JKRUNUUz0gamFyaWNvbS5vIGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCiAjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCi0gICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAotICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCi0gICAgICAgIGpmZGN0aW50Lm8KK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamNhcml0aC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gXAorICAgICAgICBqZGF0YWRzdC5vIGpjaW5pdC5vIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gXAorICAgICAgICBqY2NvZWZjdC5vIGpjY29sb3IubyBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBcCisgICAgICAgIGpmZGN0Zmx0Lm8gamZkY3RpbnQubwogIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAotICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKLSAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAotICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubworRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZGFyaXRoLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gXAorICAgICAgICBqZG1hc3Rlci5vIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkbWFpbmN0Lm8gXAorICAgICAgICBqZGNvZWZjdC5vIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gXAorICAgICAgICBqaWRjdGludC5vIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCiAjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgogTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQogIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQpAQCAtMTE4LDkgKzEyNCw5IEBACiB3cmpwZ2NvbTogd3JqcGdjb20ubwogCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKIAotamNvbmZpZy5oOiBqY29uZmlnLmRvYworamNvbmZpZy5oOiBqY29uZmlnLnR4dAogCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC50eHQuCiAJZXhpdCAxCiAKIGNsZWFuOgpAQCAtMTQzLDM2ICsxNDksMzcgQEAKIAljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwogCiAKK2phcmljb20ubzogamFyaWNvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FyaXRoLm86IGpjYXJpdGguYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAogamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcml0aC5vOiBqZGFyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKIGpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCkBAIC0xODMsNyArMTkwLDYgQEAKIGppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoganF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLm1jNiBiL21ha2VmaWxlLm1jNgppbmRleCA2YWZmMDU0Li4yZTBjNzQ3IDEwMDY0NAotLS0gYS9tYWtlZmlsZS5tYzYKKysrIGIvbWFrZWZpbGUubWM2CkBAIC0yNyw3ICsyNyw3IEBACiAKICMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CiAjIG1hbmFnZXIgZmlsZS4gIEZvciBET1MsIHdlIHJlY29tbWVuZCBqbWVtZG9zLmMgYW5kIGptZW1kb3NhLmFzbS4KLSMgKEJ1dCBub3QgZm9yIFdpbmRvd3M7IHNlZSBpbnN0YWxsLmRvYyBpZiB5b3UgdXNlIHRoaXMgbWFrZWZpbGUgZm9yIFdpbmRvd3MuKQorIyAoQnV0IG5vdCBmb3IgV2luZG93czsgc2VlIGluc3RhbGwudHh0IGlmIHlvdSB1c2UgdGhpcyBtYWtlZmlsZSBmb3IgV2luZG93cy4pCiBTWVNERVBNRU09IGptZW1kb3Mub2JqIGptZW1kb3NhLm9iagogIyBTWVNERVBNRU1MSUIgbXVzdCBsaXN0IHRoZSBzYW1lIGZpbGVzIHdpdGggIisiIHNpZ25zIGZvciB0aGUgbGlicmFyaWFuLgogU1lTREVQTUVNTElCPSAram1lbWRvcy5vYmogK2ptZW1kb3NhLm9iagpAQCAtMzYsMTMgKzM2LDEzIEBACiAKIAogIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorTElCU09VUkNFUz0gamFyaWNvbS5jIGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2FyaXRoLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgXAorICAgICAgICBqY2RjdG1nci5jIGpjaHVmZi5jIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIFwKKyAgICAgICAgamNvbWFwaS5jIGpjcGFyYW0uYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgXAorICAgICAgICBqZGFwaXN0ZC5jIGpkYXJpdGguYyBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgXAorICAgICAgICBqZGRjdG1nci5jIGpkaHVmZi5jIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBcCisgICAgICAgIGpkbWVyZ2UuYyBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgXAorICAgICAgICBqZmRjdGZzdC5jIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMganF1YW50MS5jIFwKICAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwogIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKIFNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKQEAgLTUyLDM5ICs1Miw0NSBAQAogICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKIFNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCiAjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCitJTkNMVURFUz0gamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmgganBlZ2ludC5oIFwKKyAgICAgICAganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKICMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0CitET0NTPSBSRUFETUUgaW5zdGFsbC50eHQgdXNhZ2UudHh0IGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC50eHQgZXhhbXBsZS5jIGxpYmpwZWcudHh0IHN0cnVjdHVyZS50eHQgXAorICAgICAgICBjb2RlcnVsZXMudHh0IGZpbGVsaXN0LnR4dCBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgTWFrZWZpbGUuaW4gbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWpkc3cudmM2IFwKKyAgICAgICAgbWFrZWFkc3cudmM2IG1ha2VqZGVwLnZjNiBtYWtlamRzcC52YzYgbWFrZWptYWsudmM2IG1ha2VjZGVwLnZjNiBcCisgICAgICAgIG1ha2VjZHNwLnZjNiBtYWtlY21hay52YzYgbWFrZWRkZXAudmM2IG1ha2VkZHNwLnZjNiBtYWtlZG1hay52YzYgXAorICAgICAgICBtYWtldGRlcC52YzYgbWFrZXRkc3AudmM2IG1ha2V0bWFrLnZjNiBtYWtlcmRlcC52YzYgbWFrZXJkc3AudmM2IFwKKyAgICAgICAgbWFrZXJtYWsudmM2IG1ha2V3ZGVwLnZjNiBtYWtld2RzcC52YzYgbWFrZXdtYWsudmM2IG1ha2Vqc2xuLnZjOSBcCisgICAgICAgIG1ha2Vhc2xuLnZjOSBtYWtlanZjcC52YzkgbWFrZWN2Y3AudmM5IG1ha2VkdmNwLnZjOSBtYWtldHZjcC52YzkgXAorICAgICAgICBtYWtlcnZjcC52YzkgbWFrZXd2Y3AudmM5IG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBcCisgICAgICAgIG1ha2xqcGVnLnN0IG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBcCisgICAgICAgIG1ha2VmaWxlLnZtcyBtYWt2bXMub3B0CiBDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCiAgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAogICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0bWFpbi5zaCBkZXBjb21wIG1pc3NpbmcKK09USEVSRklMRVM9IGpjb25maWcudHh0IGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbSBcCisgICAgICAgIGxpYmpwZWcubWFwCiBURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAogICAgICAgICB0ZXN0aW1ncC5qcGcKIERJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAogICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQogIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKK0NPTU9CSkVDVFM9IGphcmljb20ub2JqIGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKICMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCi0gICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKLSAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjYXJpdGgub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIFwKKyAgICAgICAgamRhdGFkc3Qub2JqIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogXAorICAgICAgICBqY3ByZXBjdC5vYmogamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIFwKICAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCiAjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCi0gICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCi0gICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAotICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAotICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagorRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamRhcml0aC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkbWFpbmN0Lm9iaiBcCisgICAgICAgIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBqaWRjdGZsdC5vYmogXAorICAgICAgICBqaWRjdGludC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIGpxdWFudDEub2JqIGpxdWFudDIub2JqIFwKKyAgICAgICAgamRtZXJnZS5vYmoKICMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCiBMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCiAjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCkBAIC0xMTAsMTkgKzExNiwxOSBAQAogCWVjaG8gbGlianBlZy5saWIgPiQoUkZJTEUpCiAjIHNpbGx5IHdhbnQtdG8tY3JlYXRlLWl0IHByb21wdDoKIAllY2hvIHkgPj4kKFJGSUxFKQotCWVjaG8gK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY3RyYW5zLm9iaiAramNwYXJhbS5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramRhdGFkc3Qub2JqICtqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqY21haW5jdC5vYmogK2pjcHJlcGN0Lm9iaiAramNjb2VmY3Qub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pjY29sb3Iub2JqICtqY3NhbXBsZS5vYmogK2pjaHVmZi5vYmogK2pjcGh1ZmYub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY2FyaXRoLm9iaiAramN0cmFucy5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramNwYXJhbS5vYmogK2pkYXRhZHN0Lm9iaiAramNpbml0Lm9iaiAramNtYXN0ZXIub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pjbWFya2VyLm9iaiAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramNjb2VmY3Qub2JqICtqY2NvbG9yLm9iaiAramNzYW1wbGUub2JqICtqY2h1ZmYub2JqICYgPj4kKFJGSUxFKQogCWVjaG8gK2pjZGN0bWdyLm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogJiA+PiQoUkZJTEUpCiAJZWNobyAramZkY3RpbnQub2JqICtqZGFwaW1pbi5vYmogK2pkYXBpc3RkLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICtqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2pkbWFya2VyLm9iaiAramRodWZmLm9iaiAramRwaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqZGFyaXRoLm9iaiAramR0cmFucy5vYmogK2pkYXRhc3JjLm9iaiAramRtYXN0ZXIub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pkaW5wdXQub2JqICtqZG1hcmtlci5vYmogK2pkaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAmID4+JChSRklMRSkKIAllY2hvICtqZGNvZWZjdC5vYmogK2pkcG9zdGN0Lm9iaiAramRkY3RtZ3Iub2JqICYgPj4kKFJGSUxFKQogCWVjaG8gK2ppZGN0ZnN0Lm9iaiAramlkY3RmbHQub2JqICtqaWRjdGludC5vYmogJiA+PiQoUkZJTEUpCi0JZWNobyAramlkY3RyZWQub2JqICtqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAmID4+JChSRklMRSkKLQllY2hvICtqcXVhbnQyLm9iaiAramRtZXJnZS5vYmogK2pjb21hcGkub2JqICtqdXRpbHMub2JqICYgPj4kKFJGSUxFKQotCWVjaG8gK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pkc2FtcGxlLm9iaiAramRjb2xvci5vYmogK2pxdWFudDEub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pxdWFudDIub2JqICtqZG1lcmdlLm9iaiAramFyaWNvbS5vYmogK2pjb21hcGkub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2p1dGlscy5vYmogK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYgPj4kKFJGSUxFKQogCWVjaG8gJChTWVNERVBNRU1MSUIpIDsgPj4kKFJGSUxFKQogCiBjanBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCkBAIC0xNDUsOSArMTUxLDkgQEAKIHdyanBnY29tLmV4ZTogd3JqcGdjb20uYwogCSQoQ0MpIC1BTCAtTyAtVzMgd3JqcGdjb20uYwogCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCitqY29uZmlnLmg6IGpjb25maWcudHh0CiAJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLnR4dC4KIAlleGl0IDEKIAogY2xlYW46CkBAIC0xNzYsMzYgKzE4MiwzNyBAQAogCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKIAogCitqYXJpY29tLm9iajogamFyaWNvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcml0aC5vYmo6IGpjYXJpdGguYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjY29lZmN0Lm9iajogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjY29sb3Iub2JqOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2RjdG1nci5vYmo6IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAogamNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXJpdGgub2JqOiBqZGFyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGF0YWRzdC5vYmo6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKIGpkYXRhc3JjLm9iajogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRjb2VmY3Qub2JqOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRjb2xvci5vYmo6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkZGN0bWdyLm9iajogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAogamRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKQEAgLTIxNiw3ICsyMjMsNiBAQAogamlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGpxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoganV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5tbXMgYi9tYWtlZmlsZS5tbXMKaW5kZXggY2YxMzBlNS4uOTkyYzI1ZiAxMDA2NDQKLS0tIGEvbWFrZWZpbGUubW1zCisrKyBiL21ha2VmaWxlLm1tcwpAQCAtMjUsMTMgKzI1LDEzIEBACiAKIAogIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorTElCU09VUkNFUz0gamFyaWNvbS5jIGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2FyaXRoLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgXAorICAgICAgICBqY2RjdG1nci5jIGpjaHVmZi5jIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIFwKKyAgICAgICAgamNvbWFwaS5jIGpjcGFyYW0uYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgXAorICAgICAgICBqZGFwaXN0ZC5jIGpkYXJpdGguYyBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgXAorICAgICAgICBqZGRjdG1nci5jIGpkaHVmZi5jIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBcCisgICAgICAgIGpkbWVyZ2UuYyBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgXAorICAgICAgICBqZmRjdGZzdC5jIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMganF1YW50MS5jIFwKICAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwogIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKIFNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKQEAgLTQxLDM5ICs0MSw0NSBAQAogICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKIFNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCiAjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCitJTkNMVURFUz0gamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmgganBlZ2ludC5oIFwKKyAgICAgICAganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKICMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0CitET0NTPSBSRUFETUUgaW5zdGFsbC50eHQgdXNhZ2UudHh0IGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC50eHQgZXhhbXBsZS5jIGxpYmpwZWcudHh0IHN0cnVjdHVyZS50eHQgXAorICAgICAgICBjb2RlcnVsZXMudHh0IGZpbGVsaXN0LnR4dCBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgTWFrZWZpbGUuaW4gbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWpkc3cudmM2IFwKKyAgICAgICAgbWFrZWFkc3cudmM2IG1ha2VqZGVwLnZjNiBtYWtlamRzcC52YzYgbWFrZWptYWsudmM2IG1ha2VjZGVwLnZjNiBcCisgICAgICAgIG1ha2VjZHNwLnZjNiBtYWtlY21hay52YzYgbWFrZWRkZXAudmM2IG1ha2VkZHNwLnZjNiBtYWtlZG1hay52YzYgXAorICAgICAgICBtYWtldGRlcC52YzYgbWFrZXRkc3AudmM2IG1ha2V0bWFrLnZjNiBtYWtlcmRlcC52YzYgbWFrZXJkc3AudmM2IFwKKyAgICAgICAgbWFrZXJtYWsudmM2IG1ha2V3ZGVwLnZjNiBtYWtld2RzcC52YzYgbWFrZXdtYWsudmM2IG1ha2Vqc2xuLnZjOSBcCisgICAgICAgIG1ha2Vhc2xuLnZjOSBtYWtlanZjcC52YzkgbWFrZWN2Y3AudmM5IG1ha2VkdmNwLnZjOSBtYWtldHZjcC52YzkgXAorICAgICAgICBtYWtlcnZjcC52YzkgbWFrZXd2Y3AudmM5IG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBcCisgICAgICAgIG1ha2xqcGVnLnN0IG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBcCisgICAgICAgIG1ha2VmaWxlLnZtcyBtYWt2bXMub3B0CiBDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCiAgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAogICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0bWFpbi5zaCBkZXBjb21wIG1pc3NpbmcKK09USEVSRklMRVM9IGpjb25maWcudHh0IGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbSBcCisgICAgICAgIGxpYmpwZWcubWFwCiBURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAogICAgICAgICB0ZXN0aW1ncC5qcGcKIERJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAogICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQogIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKK0NPTU9CSkVDVFM9IGphcmljb20ub2JqIGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKICMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCi0gICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKLSAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjYXJpdGgub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIFwKKyAgICAgICAgamRhdGFkc3Qub2JqIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogXAorICAgICAgICBqY3ByZXBjdC5vYmogamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIFwKICAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCiAjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCi0gICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCi0gICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAotICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAotICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagorRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamRhcml0aC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkbWFpbmN0Lm9iaiBcCisgICAgICAgIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBqaWRjdGZsdC5vYmogXAorICAgICAgICBqaWRjdGludC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIGpxdWFudDEub2JqIGpxdWFudDIub2JqIFwKKyAgICAgICAgamRtZXJnZS5vYmoKICMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcub2xiCiBMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCiAjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCkBAIC04OCwxNCArOTQsMTQgQEAKIERPQkpMSVNUPSBkanBlZy5vYmosd3JwcG0ub2JqLHdyZ2lmLm9iaix3cnRhcmdhLm9iaix3cnJsZS5vYmosd3JibXAub2JqLFwKICAgICAgICAgICByZGNvbG1hcC5vYmosY2RqcGVnLm9iagogVFJPQkpMSVNUPSBqcGVndHJhbi5vYmoscmRzd2l0Y2gub2JqLGNkanBlZy5vYmosdHJhbnN1cHAub2JqCi1MSUJPQkpMSVNUPSBqY2FwaW1pbi5vYmosamNhcGlzdGQub2JqLGpjdHJhbnMub2JqLGpjcGFyYW0ub2JqLGpkYXRhZHN0Lm9iaixcCi0gICAgICAgICAgamNpbml0Lm9iaixqY21hc3Rlci5vYmosamNtYXJrZXIub2JqLGpjbWFpbmN0Lm9iaixqY3ByZXBjdC5vYmosXAotICAgICAgICAgIGpjY29lZmN0Lm9iaixqY2NvbG9yLm9iaixqY3NhbXBsZS5vYmosamNodWZmLm9iaixqY3BodWZmLm9iaixcCi0gICAgICAgICAgamNkY3RtZ3Iub2JqLGpmZGN0ZnN0Lm9iaixqZmRjdGZsdC5vYmosamZkY3RpbnQub2JqLGpkYXBpbWluLm9iaixcCi0gICAgICAgICAgamRhcGlzdGQub2JqLGpkdHJhbnMub2JqLGpkYXRhc3JjLm9iaixqZG1hc3Rlci5vYmosamRpbnB1dC5vYmosXAotICAgICAgICAgIGpkbWFya2VyLm9iaixqZGh1ZmYub2JqLGpkcGh1ZmYub2JqLGpkbWFpbmN0Lm9iaixqZGNvZWZjdC5vYmosXAotICAgICAgICAgIGpkcG9zdGN0Lm9iaixqZGRjdG1nci5vYmosamlkY3Rmc3Qub2JqLGppZGN0Zmx0Lm9iaixqaWRjdGludC5vYmosXAotICAgICAgICAgIGppZGN0cmVkLm9iaixqZHNhbXBsZS5vYmosamRjb2xvci5vYmosanF1YW50MS5vYmosanF1YW50Mi5vYmosXAorTElCT0JKTElTVD0gamFyaWNvbS5vYmosamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY2FyaXRoLm9iaixqY3RyYW5zLm9iaixcCisgICAgICAgICAgamNwYXJhbS5vYmosamRhdGFkc3Qub2JqLGpjaW5pdC5vYmosamNtYXN0ZXIub2JqLGpjbWFya2VyLm9iaixcCisgICAgICAgICAgamNtYWluY3Qub2JqLGpjcHJlcGN0Lm9iaixqY2NvZWZjdC5vYmosamNjb2xvci5vYmosamNzYW1wbGUub2JqLFwKKyAgICAgICAgICBqY2h1ZmYub2JqLGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLGpmZGN0aW50Lm9iaixcCisgICAgICAgICAgamRhcGltaW4ub2JqLGpkYXBpc3RkLm9iaixqZGFyaXRoLm9iaixqZHRyYW5zLm9iaixqZGF0YXNyYy5vYmosXAorICAgICAgICAgIGpkbWFzdGVyLm9iaixqZGlucHV0Lm9iaixqZG1hcmtlci5vYmosamRodWZmLm9iaixqZG1haW5jdC5vYmosXAorICAgICAgICAgIGpkY29lZmN0Lm9iaixqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaixqaWRjdGZsdC5vYmosXAorICAgICAgICAgIGppZGN0aW50Lm9iaixqZHNhbXBsZS5vYmosamRjb2xvci5vYmosanF1YW50MS5vYmosanF1YW50Mi5vYmosXAogICAgICAgICAgIGpkbWVyZ2Uub2JqLGpjb21hcGkub2JqLGp1dGlscy5vYmosamVycm9yLm9iaixqbWVtbWdyLm9iaiwkKFNZU0RFUE1FTSkKIAogCkBAIC0xNDcsMzYgKzE1MywzNyBAQAogCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKIAogCitqYXJpY29tLm9iaiA6IGphcmljb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpbWluLm9iaiA6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2FwaXN0ZC5vYmogOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcml0aC5vYmogOiBqY2FyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvZWZjdC5vYmogOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNjb2xvci5vYmogOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2RjdG1nci5vYmogOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmogOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaHVmZi5vYmogOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjaW5pdC5vYmogOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFpbmN0Lm9iaiA6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hcmtlci5vYmogOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYXN0ZXIub2JqIDogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjb21hcGkub2JqIDogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNwYXJhbS5vYmogOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qY3BodWZmLm9iaiA6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKIGpjcHJlcGN0Lm9iaiA6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3NhbXBsZS5vYmogOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamN0cmFucy5vYmogOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaW1pbi5vYmogOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhcGlzdGQub2JqIDogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXJpdGgub2JqIDogamRhcml0aC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhdGFkc3Qub2JqIDogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRhdGFzcmMub2JqIDogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRjb2VmY3Qub2JqIDogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkY29sb3Iub2JqIDogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRkY3RtZ3Iub2JqIDogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qZGh1ZmYub2JqIDogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGh1ZmYub2JqIDogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGlucHV0Lm9iaiA6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFpbmN0Lm9iaiA6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hcmtlci5vYmogOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYXN0ZXIub2JqIDogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWVyZ2Uub2JqIDogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmogOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCiBqZHBvc3RjdC5vYmogOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRzYW1wbGUub2JqIDogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkdHJhbnMub2JqIDogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaApAQCAtMTg3LDcgKzE5NCw2IEBACiBqaWRjdGZsdC5vYmogOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGppZGN0ZnN0Lm9iaiA6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3RpbnQub2JqIDogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vYmogOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGpxdWFudDEub2JqIDoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoganF1YW50Mi5vYmogOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqdXRpbHMub2JqIDoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5zYXMgYi9tYWtlZmlsZS5zYXMKaW5kZXggZjI5NmZhZi4uYzdhMDMwYyAxMDA2NDQKLS0tIGEvbWFrZWZpbGUuc2FzCisrKyBiL21ha2VmaWxlLnNhcwpAQCAtNDcsMTMgKzQ3LDEzIEBACiAKIAogIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorTElCU09VUkNFUz0gamFyaWNvbS5jIGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2FyaXRoLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgXAorICAgICAgICBqY2RjdG1nci5jIGpjaHVmZi5jIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIFwKKyAgICAgICAgamNvbWFwaS5jIGpjcGFyYW0uYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgXAorICAgICAgICBqZGFwaXN0ZC5jIGpkYXJpdGguYyBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgXAorICAgICAgICBqZGRjdG1nci5jIGpkaHVmZi5jIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBcCisgICAgICAgIGpkbWVyZ2UuYyBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgXAorICAgICAgICBqZmRjdGZzdC5jIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMganF1YW50MS5jIFwKICAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwogIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKIFNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKQEAgLTYzLDM4ICs2Myw0NCBAQAogICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKIFNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCiAjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCitJTkNMVURFUz0gamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmgganBlZ2ludC5oIFwKKyAgICAgICAganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKICMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0CitET0NTPSBSRUFETUUgaW5zdGFsbC50eHQgdXNhZ2UudHh0IGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC50eHQgZXhhbXBsZS5jIGxpYmpwZWcudHh0IHN0cnVjdHVyZS50eHQgXAorICAgICAgICBjb2RlcnVsZXMudHh0IGZpbGVsaXN0LnR4dCBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgTWFrZWZpbGUuaW4gbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWpkc3cudmM2IFwKKyAgICAgICAgbWFrZWFkc3cudmM2IG1ha2VqZGVwLnZjNiBtYWtlamRzcC52YzYgbWFrZWptYWsudmM2IG1ha2VjZGVwLnZjNiBcCisgICAgICAgIG1ha2VjZHNwLnZjNiBtYWtlY21hay52YzYgbWFrZWRkZXAudmM2IG1ha2VkZHNwLnZjNiBtYWtlZG1hay52YzYgXAorICAgICAgICBtYWtldGRlcC52YzYgbWFrZXRkc3AudmM2IG1ha2V0bWFrLnZjNiBtYWtlcmRlcC52YzYgbWFrZXJkc3AudmM2IFwKKyAgICAgICAgbWFrZXJtYWsudmM2IG1ha2V3ZGVwLnZjNiBtYWtld2RzcC52YzYgbWFrZXdtYWsudmM2IG1ha2Vqc2xuLnZjOSBcCisgICAgICAgIG1ha2Vhc2xuLnZjOSBtYWtlanZjcC52YzkgbWFrZWN2Y3AudmM5IG1ha2VkdmNwLnZjOSBtYWtldHZjcC52YzkgXAorICAgICAgICBtYWtlcnZjcC52YzkgbWFrZXd2Y3AudmM5IG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBcCisgICAgICAgIG1ha2xqcGVnLnN0IG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBcCisgICAgICAgIG1ha2VmaWxlLnZtcyBtYWt2bXMub3B0CiBDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCiAgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAogICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0bWFpbi5zaCBkZXBjb21wIG1pc3NpbmcKK09USEVSRklMRVM9IGpjb25maWcudHh0IGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbSBcCisgICAgICAgIGxpYmpwZWcubWFwCiBURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAogICAgICAgICB0ZXN0aW1ncC5qcGcKIERJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAogICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQogIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCitDT01PQkpFQ1RTPSBqYXJpY29tLm8gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKICMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY2FyaXRoLm8gamN0cmFucy5vIGpjcGFyYW0ubyBcCisgICAgICAgIGpkYXRhZHN0Lm8gamNpbml0Lm8gamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBcCisgICAgICAgIGpjY29lZmN0Lm8gamNjb2xvci5vIGpjc2FtcGxlLm8gamNodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIFwKKyAgICAgICAgamZkY3RmbHQubyBqZmRjdGludC5vCiAjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCi0gICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkYXJpdGgubyBqZHRyYW5zLm8gamRhdGFzcmMubyBcCisgICAgICAgIGpkbWFzdGVyLm8gamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRtYWluY3QubyBcCisgICAgICAgIGpkY29lZmN0Lm8gamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBcCisgICAgICAgIGppZGN0aW50Lm8gamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KICMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCiBMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCiAjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCkBAIC0xNTUsOSArMTYxLDkgQEAKIExJQiAkKExETElCUykKIDwKIAotamNvbmZpZy5oOiBqY29uZmlnLmRvYworamNvbmZpZy5oOiBqY29uZmlnLnR4dAogCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC50eHQuCiAJZXhpdCAxCiAKIGNsZWFuOgpAQCAtMTgxLDM2ICsxODcsMzcgQEAKIAljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwogCiAKK2phcmljb20ubzogamFyaWNvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FyaXRoLm86IGpjYXJpdGguYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAogamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcml0aC5vOiBqZGFyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKIGpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCkBAIC0yMjEsNyArMjI4LDYgQEAKIGppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoganF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLnVuaXggYi9tYWtlZmlsZS51bml4CmluZGV4IDAwNDU1YWIuLjkwMzMyZTMgMTAwNjQ0Ci0tLSBhL21ha2VmaWxlLnVuaXgKKysrIGIvbWFrZWZpbGUudW5peApAQCAtNDIsMTMgKzQyLDEzIEBACiAKIAogIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKLUxJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKLSAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCi0gICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCi0gICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKLSAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAotICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCi0gICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorTElCU09VUkNFUz0gamFyaWNvbS5jIGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2FyaXRoLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgXAorICAgICAgICBqY2RjdG1nci5jIGpjaHVmZi5jIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIFwKKyAgICAgICAgamNvbWFwaS5jIGpjcGFyYW0uYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgXAorICAgICAgICBqZGFwaXN0ZC5jIGpkYXJpdGguYyBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgXAorICAgICAgICBqZGRjdG1nci5jIGpkaHVmZi5jIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBcCisgICAgICAgIGpkbWVyZ2UuYyBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgXAorICAgICAgICBqZmRjdGZzdC5jIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMganF1YW50MS5jIFwKICAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYwogIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKIFNZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKQEAgLTU4LDM4ICs1OCw0NCBAQAogICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKIFNPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCiAjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcwotSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKLSAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCitJTkNMVURFUz0gamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmgganBlZ2ludC5oIFwKKyAgICAgICAganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKICMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKLURPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCi0gICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCi0gICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKLU1LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCi0gICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCi0gICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCi0gICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAotICAgICAgICBtYWt2bXMub3B0CitET0NTPSBSRUFETUUgaW5zdGFsbC50eHQgdXNhZ2UudHh0IGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC50eHQgZXhhbXBsZS5jIGxpYmpwZWcudHh0IHN0cnVjdHVyZS50eHQgXAorICAgICAgICBjb2RlcnVsZXMudHh0IGZpbGVsaXN0LnR4dCBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgTWFrZWZpbGUuaW4gbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWpkc3cudmM2IFwKKyAgICAgICAgbWFrZWFkc3cudmM2IG1ha2VqZGVwLnZjNiBtYWtlamRzcC52YzYgbWFrZWptYWsudmM2IG1ha2VjZGVwLnZjNiBcCisgICAgICAgIG1ha2VjZHNwLnZjNiBtYWtlY21hay52YzYgbWFrZWRkZXAudmM2IG1ha2VkZHNwLnZjNiBtYWtlZG1hay52YzYgXAorICAgICAgICBtYWtldGRlcC52YzYgbWFrZXRkc3AudmM2IG1ha2V0bWFrLnZjNiBtYWtlcmRlcC52YzYgbWFrZXJkc3AudmM2IFwKKyAgICAgICAgbWFrZXJtYWsudmM2IG1ha2V3ZGVwLnZjNiBtYWtld2RzcC52YzYgbWFrZXdtYWsudmM2IG1ha2Vqc2xuLnZjOSBcCisgICAgICAgIG1ha2Vhc2xuLnZjOSBtYWtlanZjcC52YzkgbWFrZWN2Y3AudmM5IG1ha2VkdmNwLnZjOSBtYWtldHZjcC52YzkgXAorICAgICAgICBtYWtlcnZjcC52YzkgbWFrZXd2Y3AudmM5IG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBcCisgICAgICAgIG1ha2xqcGVnLnN0IG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBcCisgICAgICAgIG1ha2VmaWxlLnZtcyBtYWt2bXMub3B0CiBDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCiAgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAogICAgICAgICBqY29uZmlnLnZtcwotQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCi1PVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0bWFpbi5zaCBkZXBjb21wIG1pc3NpbmcKK09USEVSRklMRVM9IGpjb25maWcudHh0IGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbSBcCisgICAgICAgIGxpYmpwZWcubWFwCiBURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAogICAgICAgICB0ZXN0aW1ncC5qcGcKIERJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAogICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQogIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KLUNPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCitDT01PQkpFQ1RTPSBqYXJpY29tLm8gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKICMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLUNMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKLSAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCi0gICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKLSAgICAgICAgamZkY3RpbnQubworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY2FyaXRoLm8gamN0cmFucy5vIGpjcGFyYW0ubyBcCisgICAgICAgIGpkYXRhZHN0Lm8gamNpbml0Lm8gamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBcCisgICAgICAgIGpjY29lZmN0Lm8gamNjb2xvci5vIGpjc2FtcGxlLm8gamNodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIFwKKyAgICAgICAgamZkY3RmbHQubyBqZmRjdGludC5vCiAjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKLURMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCi0gICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAotICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCi0gICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkYXJpdGgubyBqZHRyYW5zLm8gamRhdGFzcmMubyBcCisgICAgICAgIGpkbWFzdGVyLm8gamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRtYWluY3QubyBcCisgICAgICAgIGpkY29lZmN0Lm8gamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBcCisgICAgICAgIGppZGN0aW50Lm8gamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KICMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQogTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQogIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQpAQCAtMTMyLDkgKzEzOCw5IEBACiB3cmpwZ2NvbTogd3JqcGdjb20ubwogCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20ubyAkKExETElCUykKIAotamNvbmZpZy5oOiBqY29uZmlnLmRvYworamNvbmZpZy5oOiBqY29uZmlnLnR4dAogCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCi0JZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC50eHQuCiAJZXhpdCAxCiAKIGNsZWFuOgpAQCAtMTU3LDM2ICsxNjMsMzcgQEAKIAljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZwogCiAKK2phcmljb20ubzogamFyaWNvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FyaXRoLm86IGpjYXJpdGguYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAogamNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcml0aC5vOiBqZGFyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCi1qZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKIGpkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCkBAIC0xOTcsNyArMjA0LDYgQEAKIGppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoganF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGp1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VmaWxlLnZjIGIvbWFrZWZpbGUudmMKaW5kZXggMmFjZjA2OS4uNDFiOTk4ZiAxMDA2NDQKLS0tIGEvbWFrZWZpbGUudmMKKysrIGIvbWFrZWZpbGUudmMKQEAgLTM1LDEzICszNSwxMyBAQAogCiAKICMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCi1MSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCi0gICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAotICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAotICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCi0gICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKLSAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAotICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKK0xJQlNPVVJDRVM9IGphcmljb20uYyBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNhcml0aC5jIGpjY29lZmN0LmMgamNjb2xvci5jIFwKKyAgICAgICAgamNkY3RtZ3IuYyBqY2h1ZmYuYyBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBcCisgICAgICAgIGpjb21hcGkuYyBqY3BhcmFtLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIFwKKyAgICAgICAgamRhcGlzdGQuYyBqZGFyaXRoLmMgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIFwKKyAgICAgICAgamRkY3RtZ3IuYyBqZGh1ZmYuYyBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgXAorICAgICAgICBqZG1lcmdlLmMgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIFwKKyAgICAgICAgamZkY3Rmc3QuYyBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGpxdWFudDEuYyBcCiAgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKICMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CiBTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCkBAIC01MSwzOSArNTEsNDUgQEAKICAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCiBTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQogIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKLUlOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCi0gICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorSU5DTFVERVM9IGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBcCisgICAgICAgIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCiAjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCi1ET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAotICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAotICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCi1NS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAotICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAotICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAotICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKLSAgICAgICAgbWFrdm1zLm9wdAorRE9DUz0gUkVBRE1FIGluc3RhbGwudHh0IHVzYWdlLnR4dCBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQudHh0IGV4YW1wbGUuYyBsaWJqcGVnLnR4dCBzdHJ1Y3R1cmUudHh0IFwKKyAgICAgICAgY29kZXJ1bGVzLnR4dCBmaWxlbGlzdC50eHQgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIE1ha2VmaWxlLmluIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VqZHN3LnZjNiBcCisgICAgICAgIG1ha2VhZHN3LnZjNiBtYWtlamRlcC52YzYgbWFrZWpkc3AudmM2IG1ha2VqbWFrLnZjNiBtYWtlY2RlcC52YzYgXAorICAgICAgICBtYWtlY2RzcC52YzYgbWFrZWNtYWsudmM2IG1ha2VkZGVwLnZjNiBtYWtlZGRzcC52YzYgbWFrZWRtYWsudmM2IFwKKyAgICAgICAgbWFrZXRkZXAudmM2IG1ha2V0ZHNwLnZjNiBtYWtldG1hay52YzYgbWFrZXJkZXAudmM2IG1ha2VyZHNwLnZjNiBcCisgICAgICAgIG1ha2VybWFrLnZjNiBtYWtld2RlcC52YzYgbWFrZXdkc3AudmM2IG1ha2V3bWFrLnZjNiBtYWtlanNsbi52YzkgXAorICAgICAgICBtYWtlYXNsbi52YzkgbWFrZWp2Y3AudmM5IG1ha2VjdmNwLnZjOSBtYWtlZHZjcC52YzkgbWFrZXR2Y3AudmM5IFwKKyAgICAgICAgbWFrZXJ2Y3AudmM5IG1ha2V3dmNwLnZjOSBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgXAorICAgICAgICBtYWtsanBlZy5zdCBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgXAorICAgICAgICBtYWtlZmlsZS52bXMgbWFrdm1zLm9wdAogQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAogICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKICAgICAgICAgamNvbmZpZy52bXMKLUNPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAotT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdG1haW4uc2ggZGVwY29tcCBtaXNzaW5nCitPVEhFUkZJTEVTPSBqY29uZmlnLnR4dCBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20gXAorICAgICAgICBsaWJqcGVnLm1hcAogVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKICAgICAgICAgdGVzdGltZ3AuanBnCiBESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKICAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKICMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi1DT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCitDT01PQkpFQ1RTPSBqYXJpY29tLm9iaiBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCiAjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1DTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAotICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCi0gICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCitDTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY2FyaXRoLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBcCisgICAgICAgIGpkYXRhZHN0Lm9iaiBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIFwKKyAgICAgICAgamNwcmVwY3Qub2JqIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBcCiAgICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagogIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCi1ETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAotICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAotICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKLSAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKLSAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkYXJpdGgub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCisgICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZG1haW5jdC5vYmogXAorICAgICAgICBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogamlkY3RmbHQub2JqIFwKKyAgICAgICAgamlkY3RpbnQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBcCisgICAgICAgIGpkbWVyZ2Uub2JqCiAjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgogTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQogIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQpAQCAtMTQwLDM2ICsxNDYsMzcgQEAKIAlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCiAKIAoramFyaWNvbS5vYmo6IGphcmljb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpbWluLm9iajogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjYXBpc3RkLm9iajogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXJpdGgub2JqOiBqY2FyaXRoLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNodWZmLm9iajogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2luaXQub2JqOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFpbmN0Lm9iajogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFya2VyLm9iajogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjbWFzdGVyLm9iajogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjb21hcGkub2JqOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3BhcmFtLm9iajogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamNwaHVmZi5vYmo6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKIGpjcHJlcGN0Lm9iajogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjc2FtcGxlLm9iajogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjdHJhbnMub2JqOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaW1pbi5vYmo6IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGFwaXN0ZC5vYmo6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFyaXRoLm9iajogamRhcml0aC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKIGpkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAotamRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGh1ZmYub2JqOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkaW5wdXQub2JqOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1haW5jdC5vYmo6IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hcmtlci5vYmo6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1hc3Rlci5vYmo6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZG1lcmdlLm9iajogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAotamRwaHVmZi5vYmo6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKIGpkcG9zdGN0Lm9iajogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkc2FtcGxlLm9iajogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkdHJhbnMub2JqOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCkBAIC0xODAsNyArMTg3LDYgQEAKIGppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCiBqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoganF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGp1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUudm1zIGIvbWFrZWZpbGUudm1zCmluZGV4IGE0MjM1OGQuLmEwN2QwNzAgMTAwNjQ0Ci0tLSBhL21ha2VmaWxlLnZtcworKysgYi9tYWtlZmlsZS52bXMKQEAgLTI2LDggKzI2LDEwIEBACiAkIAogJCBEb0NvbXBpbGUgOj0gQ0MgL05vRGVidWcgL09wdGltaXplIC9Ob0xpc3QKICQhCiskIERvQ29tcGlsZSBqYXJpY29tLmMKICQgRG9Db21waWxlIGpjYXBpbWluLmMKICQgRG9Db21waWxlIGpjYXBpc3RkLmMKKyQgRG9Db21waWxlIGpjYXJpdGguYwogJCBEb0NvbXBpbGUgamN0cmFucy5jCiAkIERvQ29tcGlsZSBqY3BhcmFtLmMKICQgRG9Db21waWxlIGpkYXRhZHN0LmMKQEAgLTQwLDIwICs0MiwxOSBAQAogJCBEb0NvbXBpbGUgamNjb2xvci5jCiAkIERvQ29tcGlsZSBqY3NhbXBsZS5jCiAkIERvQ29tcGlsZSBqY2h1ZmYuYwotJCBEb0NvbXBpbGUgamNwaHVmZi5jCiAkIERvQ29tcGlsZSBqY2RjdG1nci5jCiAkIERvQ29tcGlsZSBqZmRjdGZzdC5jCiAkIERvQ29tcGlsZSBqZmRjdGZsdC5jCiAkIERvQ29tcGlsZSBqZmRjdGludC5jCiAkIERvQ29tcGlsZSBqZGFwaW1pbi5jCiAkIERvQ29tcGlsZSBqZGFwaXN0ZC5jCiskIERvQ29tcGlsZSBqZGFyaXRoLmMKICQgRG9Db21waWxlIGpkdHJhbnMuYwogJCBEb0NvbXBpbGUgamRhdGFzcmMuYwogJCBEb0NvbXBpbGUgamRtYXN0ZXIuYwogJCBEb0NvbXBpbGUgamRpbnB1dC5jCiAkIERvQ29tcGlsZSBqZG1hcmtlci5jCiAkIERvQ29tcGlsZSBqZGh1ZmYuYwotJCBEb0NvbXBpbGUgamRwaHVmZi5jCiAkIERvQ29tcGlsZSBqZG1haW5jdC5jCiAkIERvQ29tcGlsZSBqZGNvZWZjdC5jCiAkIERvQ29tcGlsZSBqZHBvc3RjdC5jCkBAIC02MSw3ICs2Miw2IEBACiAkIERvQ29tcGlsZSBqaWRjdGZzdC5jCiAkIERvQ29tcGlsZSBqaWRjdGZsdC5jCiAkIERvQ29tcGlsZSBqaWRjdGludC5jCi0kIERvQ29tcGlsZSBqaWRjdHJlZC5jCiAkIERvQ29tcGlsZSBqZHNhbXBsZS5jCiAkIERvQ29tcGlsZSBqZGNvbG9yLmMKICQgRG9Db21waWxlIGpxdWFudDEuYwpAQCAtNzMsMTQgKzczLDE0IEBACiAkIERvQ29tcGlsZSBqbWVtbWdyLmMKICQgRG9Db21waWxlIGptZW1ub2JzLmMKICQhCi0kIExpYnJhcnkgL0NyZWF0ZSBsaWJqcGVnLm9sYiAgamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY3RyYW5zLm9iaiwgLQotICAgICAgICAgIGpjcGFyYW0ub2JqLGpkYXRhZHN0Lm9iaixqY2luaXQub2JqLGpjbWFzdGVyLm9iaixqY21hcmtlci5vYmosIC0KLSAgICAgICAgICBqY21haW5jdC5vYmosamNwcmVwY3Qub2JqLGpjY29lZmN0Lm9iaixqY2NvbG9yLm9iaixqY3NhbXBsZS5vYmosIC0KLSAgICAgICAgICBqY2h1ZmYub2JqLGpjcGh1ZmYub2JqLGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLCAtCi0gICAgICAgICAgamZkY3RpbnQub2JqLGpkYXBpbWluLm9iaixqZGFwaXN0ZC5vYmosamR0cmFucy5vYmosamRhdGFzcmMub2JqLCAtCi0gICAgICAgICAgamRtYXN0ZXIub2JqLGpkaW5wdXQub2JqLGpkbWFya2VyLm9iaixqZGh1ZmYub2JqLGpkcGh1ZmYub2JqLCAtCi0gICAgICAgICAgamRtYWluY3Qub2JqLGpkY29lZmN0Lm9iaixqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaiwgLQotICAgICAgICAgIGppZGN0Zmx0Lm9iaixqaWRjdGludC5vYmosamlkY3RyZWQub2JqLGpkc2FtcGxlLm9iaixqZGNvbG9yLm9iaiwgLQorJCBMaWJyYXJ5IC9DcmVhdGUgbGlianBlZy5vbGIgIGphcmljb20ub2JqLGpjYXBpbWluLm9iaixqY2FwaXN0ZC5vYmosIC0KKyAgICAgICAgICBqY2FyaXRoLm9iaixqY3RyYW5zLm9iaixqY3BhcmFtLm9iaixqZGF0YWRzdC5vYmosamNpbml0Lm9iaiwgLQorICAgICAgICAgIGpjbWFzdGVyLm9iaixqY21hcmtlci5vYmosamNtYWluY3Qub2JqLGpjcHJlcGN0Lm9iaixqY2NvZWZjdC5vYmosIC0KKyAgICAgICAgICBqY2NvbG9yLm9iaixqY3NhbXBsZS5vYmosamNodWZmLm9iaixqY2RjdG1nci5vYmosamZkY3Rmc3Qub2JqLCAtCisgICAgICAgICAgamZkY3RmbHQub2JqLGpmZGN0aW50Lm9iaixqZGFwaW1pbi5vYmosamRhcGlzdGQub2JqLGpkYXJpdGgub2JqLCAtCisgICAgICAgICAgamR0cmFucy5vYmosamRhdGFzcmMub2JqLGpkbWFzdGVyLm9iaixqZGlucHV0Lm9iaixqZG1hcmtlci5vYmosIC0KKyAgICAgICAgICBqZGh1ZmYub2JqLGpkbWFpbmN0Lm9iaixqZGNvZWZjdC5vYmosamRwb3N0Y3Qub2JqLGpkZGN0bWdyLm9iaiwgLQorICAgICAgICAgIGppZGN0ZnN0Lm9iaixqaWRjdGZsdC5vYmosamlkY3RpbnQub2JqLGpkc2FtcGxlLm9iaixqZGNvbG9yLm9iaiwgLQogICAgICAgICAgIGpxdWFudDEub2JqLGpxdWFudDIub2JqLGpkbWVyZ2Uub2JqLGpjb21hcGkub2JqLGp1dGlscy5vYmosIC0KICAgICAgICAgICBqZXJyb3Iub2JqLGptZW1tZ3Iub2JqLGptZW1ub2JzLm9iagogJCEKZGlmZiAtLWdpdCBhL21ha2VmaWxlLndhdCBiL21ha2VmaWxlLndhdAppbmRleCBkOTUzZTQ2Li5mN2VmNmU2IDEwMDY0NAotLS0gYS9tYWtlZmlsZS53YXQKKysrIGIvbWFrZWZpbGUud2F0CkBAIC0zNywxMyArMzcsMTMgQEAKIAogCiAjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgotTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgJgotICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jICYKLSAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jICYKLSAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgJgotICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyAmCi0gICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jICYKLSAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyAmCitMSUJTT1VSQ0VTPSBqYXJpY29tLmMgamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjYXJpdGguYyBqY2NvZWZjdC5jIGpjY29sb3IuYyAmCisgICAgICAgIGpjZGN0bWdyLmMgamNodWZmLmMgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgJgorICAgICAgICBqY29tYXBpLmMgamNwYXJhbS5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyAmCisgICAgICAgIGpkYXBpc3RkLmMgamRhcml0aC5jIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyAmCisgICAgICAgIGpkZGN0bWdyLmMgamRodWZmLmMgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jICYKKyAgICAgICAgamRtZXJnZS5jIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyAmCisgICAgICAgIGpmZGN0ZnN0LmMgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqcXVhbnQxLmMgJgogICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCiAjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQogU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYwpAQCAtNTMsMzkgKzUzLDQ1IEBACiAgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYwogU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKICMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCi1JTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggJgotICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKK0lOQ0xVREVTPSBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBqcGVnaW50LmggJgorICAgICAgICBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAogIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcwotRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xICYKLSAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jICYKLSAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZwotTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjICYKLSAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzICYKLSAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0ICYKLSAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyAmCi0gICAgICAgIG1ha3Ztcy5vcHQKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLnR4dCB1c2FnZS50eHQgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSAmCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLnR4dCBleGFtcGxlLmMgbGlianBlZy50eHQgc3RydWN0dXJlLnR4dCAmCisgICAgICAgIGNvZGVydWxlcy50eHQgZmlsZWxpc3QudHh0IGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBNYWtlZmlsZS5pbiBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjICYKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlamRzdy52YzYgJgorICAgICAgICBtYWtlYWRzdy52YzYgbWFrZWpkZXAudmM2IG1ha2VqZHNwLnZjNiBtYWtlam1hay52YzYgbWFrZWNkZXAudmM2ICYKKyAgICAgICAgbWFrZWNkc3AudmM2IG1ha2VjbWFrLnZjNiBtYWtlZGRlcC52YzYgbWFrZWRkc3AudmM2IG1ha2VkbWFrLnZjNiAmCisgICAgICAgIG1ha2V0ZGVwLnZjNiBtYWtldGRzcC52YzYgbWFrZXRtYWsudmM2IG1ha2VyZGVwLnZjNiBtYWtlcmRzcC52YzYgJgorICAgICAgICBtYWtlcm1hay52YzYgbWFrZXdkZXAudmM2IG1ha2V3ZHNwLnZjNiBtYWtld21hay52YzYgbWFrZWpzbG4udmM5ICYKKyAgICAgICAgbWFrZWFzbG4udmM5IG1ha2VqdmNwLnZjOSBtYWtlY3ZjcC52YzkgbWFrZWR2Y3AudmM5IG1ha2V0dmNwLnZjOSAmCisgICAgICAgIG1ha2VydmNwLnZjOSBtYWtld3ZjcC52YzkgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0ICYKKyAgICAgICAgbWFrbGpwZWcuc3QgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zICYKKyAgICAgICAgbWFrZWZpbGUudm1zIG1ha3Ztcy5vcHQKIENPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0ICYKICAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyAmCiAgICAgICAgIGpjb25maWcudm1zCi1DT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKLU9USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRtYWluLnNoIGRlcGNvbXAgbWlzc2luZworT1RIRVJGSUxFUz0gamNvbmZpZy50eHQgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtICYKKyAgICAgICAgbGlianBlZy5tYXAKIFRFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyAmCiAgICAgICAgIHRlc3RpbWdwLmpwZwogRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSAmCiAgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCiAjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgotQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorQ09NT0JKRUNUUz0gamFyaWNvbS5vYmogamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQogIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqICYKLSAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogJgotICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogJgorQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamNhcml0aC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogJgorICAgICAgICBqZGF0YWRzdC5vYmogamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiAmCisgICAgICAgIGpjcHJlcGN0Lm9iaiBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogJgogICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKICMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcwotRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqICYKLSAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqICYKLSAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiAmCi0gICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiAmCi0gICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCitETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZGFyaXRoLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogJgorICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRtYWluY3Qub2JqICYKKyAgICAgICAgamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIGppZGN0Zmx0Lm9iaiAmCisgICAgICAgIGppZGN0aW50Lm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmoganF1YW50MS5vYmoganF1YW50Mi5vYmogJgorICAgICAgICBqZG1lcmdlLm9iagogIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKIExJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKICMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKQEAgLTEyMCw5ICsxMjYsOSBAQAogLmMub2JqOgogCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAogCi1qY29uZmlnLmg6IGpjb25maWcuZG9jCitqY29uZmlnLmg6IGpjb25maWcudHh0CiAJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KLQllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLnR4dC4KIAlleGl0IDEKIAogY2xlYW46IC5TWU1CT0xJQwpAQCAtMTYyLDM2ICsxNjgsMzcgQEAKICFlbmRpZgogCiAKK2phcmljb20ub2JqOiBqYXJpY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FyaXRoLm9iajogamNhcml0aC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCiBqY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcml0aC5vYmo6IGpkYXJpdGguYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAogamRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCiBqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKLWpkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAogamRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKLWpkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCiBqZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaApAQCAtMjAyLDcgKzIwOSw2IEBACiBqaWRjdGZsdC5vYmo6IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAogamlkY3Rmc3Qub2JqOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKIGppZGN0aW50Lm9iajogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCi1qaWRjdHJlZC5vYmo6IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoganF1YW50MS5vYmo6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKIGpxdWFudDIub2JqOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCiBqdXRpbHMub2JqOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKZGlmZiAtLWdpdCBhL21ha2VqZGVwLnZjNiBiL21ha2VqZGVwLnZjNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDY1YjIxCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZWpkZXAudmM2CkBAIC0wLDAgKzEsNDIzIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGVyc3RlbGx0ZSBBYmiEbmdpZ2tlaXRzZGF0ZWksIGVpbmJlem9nZW4gdm9uIGpwZWcubWFrCisKKy5camFyaWNvbS5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqY2FwaW1pbi5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqY2FwaXN0ZC5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqY2FyaXRoLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpjY29lZmN0LmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpjY29sb3IuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camNkY3RtZ3IuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGpkY3QuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqY2h1ZmYuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camNpbml0LmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpjbWFpbmN0LmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpjbWFya2VyLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpjbWFzdGVyLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpjb21hcGkuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camNwYXJhbS5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqY3ByZXBjdC5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqY3NhbXBsZS5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqY3RyYW5zLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpkYXBpbWluLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpkYXBpc3RkLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpkYXJpdGguYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camRhdGFkc3QuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpkYXRhc3JjLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqZGNvZWZjdC5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqZGNvbG9yLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpkZGN0bWdyLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZGN0LmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camRodWZmLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpkaW5wdXQuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camRtYWluY3QuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camRtYXJrZXIuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camRtYXN0ZXIuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camRtZXJnZS5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqZHBvc3RjdC5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqZHNhbXBsZS5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqZHRyYW5zLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGplcnJvci5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJIi5canZlcnNpb24uaCJcCisJCisKKy5camZkY3RmbHQuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGpkY3QuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqZmRjdGZzdC5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camRjdC5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpmZGN0aW50LmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZGN0LmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5camlkY3RmbHQuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGpkY3QuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqaWRjdGZzdC5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camRjdC5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGppZGN0aW50LmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZGN0LmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5cam1lbW1nci5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptZW1zeXMuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGptZW1ub2JzLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1lbXN5cy5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5canF1YW50MS5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKKworLlxqcXVhbnQyLmMgOiBcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2ludC5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGp1dGlscy5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdpbnQuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkKZGlmZiAtLWdpdCBhL21ha2VqZHNwLnZjNiBiL21ha2VqZHNwLnZjNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzhmMWFiCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZWpkc3AudmM2CkBAIC0wLDAgKzEsMjg1IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImpwZWciIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogTklDSFQgQkVBUkJFSVRFTiAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0CisKK0NGRz1qcGVnIC0gV2luMzIKKyFNRVNTQUdFIERpZXMgaXN0IGtlaW4gZ4FsdGlnZXMgTWFrZWZpbGUuIFp1bSBFcnN0ZWxsZW4gZGllc2VzIFByb2pla3RzIG1pdCBOTUFLRQorIU1FU1NBR0UgdmVyd2VuZGVuIFNpZSBkZW4gQmVmZWhsICJNYWtlZmlsZSBleHBvcnRpZXJlbiIgdW5kIGaBaHJlbiBTaWUgZGVuIEJlZmVobAorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAianBlZy5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBTaWUga/dubmVuIGJlaW0gQXVzZoFocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbgorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVnLm1hayIgQ0ZHPSJqcGVnIC0gV2luMzIiCishTUVTU0FHRSAKKyFNRVNTQUdFIEaBciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6CishTUVTU0FHRSAKKyFNRVNTQUdFICJqcGVnIC0gV2luMzIiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgCisKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKKyMgUFJPUCBTY2NfUHJvak5hbWUgIiIKKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi5cUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCisjIEFERCBDUFAgL25vbG9nbyAvRzYgL01UIC9XMyAvR1ggL094IC9PYSAvT2IyIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwNworIyBBREQgUlNDIC9sIDB4NDA3CitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAianBlZyAtIFdpbjMyIgorIyBCZWdpbiBHcm91cCAiUXVlbGxjb2RlZGF0ZWllbiIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0O2ZvcjtmOTAiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGphcmljb20uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNhcGltaW4uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNhcGlzdGQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNhcml0aC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqY2NvZWZjdC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqY2NvbG9yLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpjZGN0bWdyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpjaHVmZi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqY2luaXQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNtYWluY3QuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNtYXJrZXIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNtYXN0ZXIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNvbWFwaS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqY3BhcmFtLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpjcHJlcGN0LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpjc2FtcGxlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpjdHJhbnMuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camRhcGltaW4uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camRhcGlzdGQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camRhcml0aC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZGF0YWRzdC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZGF0YXNyYy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZGNvZWZjdC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZGNvbG9yLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpkZGN0bWdyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpkaHVmZi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZGlucHV0LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpkbWFpbmN0LmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpkbWFya2VyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpkbWFzdGVyLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpkbWVyZ2UuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camRwb3N0Y3QuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camRzYW1wbGUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camR0cmFucy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZXJyb3IuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camZkY3RmbHQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camZkY3Rmc3QuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camZkY3RpbnQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camlkY3RmbHQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camlkY3Rmc3QuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camlkY3RpbnQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cam1lbW1nci5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqbWVtbm9icy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqcXVhbnQxLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpxdWFudDIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5canV0aWxzLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyLURhdGVpZW4iCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNvbmZpZy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqZGN0LmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGplcnJvci5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqaW5jbHVkZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqbWVtc3lzLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGptb3JlY2ZnLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpwZWdpbnQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5canBlZ2xpYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqdmVyc2lvbi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIlJlc3NvdXJjZW5kYXRlaWVuIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tYWtlamRzdy52YzYgYi9tYWtlamRzdy52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZmFiMQotLS0gL2Rldi9udWxsCisrKyBiL21ha2VqZHN3LnZjNgpAQCAtMCwwICsxLDI5IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyBXQVJOVU5HOiBESUVTRSBBUkJFSVRTQkVSRUlDSFNEQVRFSSBEQVJGIE5JQ0hUIEJFQVJCRUlURVQgT0RFUiBHRUyZU0NIVCBXRVJERU4hCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogImpwZWciPSIuXGpwZWcuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitHbG9iYWw6CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTwzPgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCmRpZmYgLS1naXQgYS9tYWtlam1hay52YzYgYi9tYWtlam1hay52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNzMzNgotLS0gL2Rldi9udWxsCisrKyBiL21ha2VqbWFrLnZjNgpAQCAtMCwwICsxLDQyNSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgQmFzZWQgb24ganBlZy5kc3AKKyFJRiAiJChDRkcpIiA9PSAiIgorQ0ZHPWpwZWcgLSBXaW4zMgorIU1FU1NBR0UgS2VpbmUgS29uZmlndXJhdGlvbiBhbmdlZ2ViZW4uIGpwZWcgLSBXaW4zMiB3aXJkIGFscyBTdGFuZGFyZCB2ZXJ3ZW5kZXQuCishRU5ESUYgCisKKyFJRiAiJChDRkcpIiAhPSAianBlZyAtIFdpbjMyIgorIU1FU1NBR0UgVW5n/Gx0aWdlIEtvbmZpZ3VyYXRpb24gIiQoQ0ZHKSIgYW5nZWdlYmVuLgorIU1FU1NBR0UgU2llIGv2bm5lbiBiZWltIEF1c2b8aHJlbiB2b24gTk1BS0UgZWluZSBLb25maWd1cmF0aW9uIGFuZ2ViZW4KKyFNRVNTQUdFIGR1cmNoIERlZmluaWVyZW4gZGVzIE1ha3JvcyBDRkcgaW4gZGVyIEJlZmVobHN6ZWlsZS4gWnVtIEJlaXNwaWVsOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAianBlZy5tYWsiIENGRz0ianBlZyAtIFdpbjMyIgorIU1FU1NBR0UgCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOgorIU1FU1NBR0UgCishTUVTU0FHRSAianBlZyAtIFdpbjMyIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFIAorIUVSUk9SIEVpbmUgdW5n/Gx0aWdlIEtvbmZpZ3VyYXRpb24gd3VyZGUgYW5nZWdlYmVuLgorIUVORElGIAorCishSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKK05VTEw9CishRUxTRSAKK05VTEw9bnVsCishRU5ESUYgCisKK09VVERJUj0uXFJlbGVhc2UKK0lOVERJUj0uXFJlbGVhc2UKKyMgQmVnaW4gQ3VzdG9tIE1hY3JvcworT3V0RGlyPS5cUmVsZWFzZQorIyBFbmQgQ3VzdG9tIE1hY3JvcworCitBTEwgOiAiJChPVVRESVIpXGpwZWcubGliIgorCisKK0NMRUFOIDoKKwktQGVyYXNlICIkKElOVERJUilcamFyaWNvbS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjYXBpbWluLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNhcGlzdGQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2FyaXRoLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNjb2VmY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2NvbG9yLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNkY3RtZ3Iub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2h1ZmYub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2luaXQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY21haW5jdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjbWFya2VyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNtYXN0ZXIub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY29tYXBpLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNwYXJhbS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjcHJlcGN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNzYW1wbGUub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY3RyYW5zLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRhcGltaW4ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkYXJpdGgub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGF0YWRzdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkYXRhc3JjLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRjb2VmY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGNvbG9yLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRkY3RtZ3Iub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGh1ZmYub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGlucHV0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRtYWluY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZG1hcmtlci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRtZXJnZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRzYW1wbGUub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZHRyYW5zLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamVycm9yLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamZkY3RmbHQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGZzdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0aW50Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamlkY3RmbHQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGppZGN0aW50Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcam1lbW1nci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGptZW1ub2JzLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcanF1YW50MS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpxdWFudDIub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqdXRpbHMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx2YzYwLmlkYiIKKwktQGVyYXNlICIkKE9VVERJUilcanBlZy5saWIiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCitDUFA9Y2wuZXhlCitDUFBfUFJPSj0vbm9sb2dvIC9HNiAvTVQgL1czIC9HWCAvT3ggL09hIC9PYjIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9GcCIkKElOVERJUilcanBlZy5wY2giIC9ZWCAvRm8iJChJTlRESVIpXFwiIC9GZCIkKElOVERJUilcXCIgL0ZEIC9jIAorCisuY3skKElOVERJUil9Lm9iajo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jcHB7JChJTlRESVIpfS5vYmo6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3h4eyQoSU5URElSKX0ub2JqOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmN7JChJTlRESVIpfS5zYnI6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3BweyQoSU5URElSKX0uc2JyOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmN4eHskKElOVERJUil9LnNicjo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKK1JTQz1yYy5leGUKK0JTQzMyPWJzY21ha2UuZXhlCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKVxqcGVnLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSUIzMj1saW5rLmV4ZSAtbGliCitMSUIzMl9GTEFHUz0vbm9sb2dvIC9vdXQ6IiQoT1VURElSKVxqcGVnLmxpYiIgCitMSUIzMl9PQkpTPSBcCisJIiQoSU5URElSKVxqYXJpY29tLm9iaiIgXAorCSIkKElOVERJUilcamNhcGltaW4ub2JqIiBcCisJIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIFwKKwkiJChJTlRESVIpXGpjYXJpdGgub2JqIiBcCisJIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIFwKKwkiJChJTlRESVIpXGpjY29sb3Iub2JqIiBcCisJIiQoSU5URElSKVxqY2RjdG1nci5vYmoiIFwKKwkiJChJTlRESVIpXGpjaHVmZi5vYmoiIFwKKwkiJChJTlRESVIpXGpjaW5pdC5vYmoiIFwKKwkiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgXAorCSIkKElOVERJUilcamNtYXJrZXIub2JqIiBcCisJIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIFwKKwkiJChJTlRESVIpXGpjb21hcGkub2JqIiBcCisJIiQoSU5URElSKVxqY3BhcmFtLm9iaiIgXAorCSIkKElOVERJUilcamNwcmVwY3Qub2JqIiBcCisJIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIFwKKwkiJChJTlRESVIpXGpjdHJhbnMub2JqIiBcCisJIiQoSU5URElSKVxqZGFwaW1pbi5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXBpc3RkLm9iaiIgXAorCSIkKElOVERJUilcamRhcml0aC5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgXAorCSIkKElOVERJUilcamRhdGFzcmMub2JqIiBcCisJIiQoSU5URElSKVxqZGNvZWZjdC5vYmoiIFwKKwkiJChJTlRESVIpXGpkY29sb3Iub2JqIiBcCisJIiQoSU5URElSKVxqZGRjdG1nci5vYmoiIFwKKwkiJChJTlRESVIpXGpkaHVmZi5vYmoiIFwKKwkiJChJTlRESVIpXGpkaW5wdXQub2JqIiBcCisJIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIFwKKwkiJChJTlRESVIpXGpkbWFya2VyLm9iaiIgXAorCSIkKElOVERJUilcamRtYXN0ZXIub2JqIiBcCisJIiQoSU5URElSKVxqZG1lcmdlLm9iaiIgXAorCSIkKElOVERJUilcamRwb3N0Y3Qub2JqIiBcCisJIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiIFwKKwkiJChJTlRESVIpXGpkdHJhbnMub2JqIiBcCisJIiQoSU5URElSKVxqZXJyb3Iub2JqIiBcCisJIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiIFwKKwkiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgXAorCSIkKElOVERJUilcamZkY3RpbnQub2JqIiBcCisJIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIFwKKwkiJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgXAorCSIkKElOVERJUilcamlkY3RpbnQub2JqIiBcCisJIiQoSU5URElSKVxqbWVtbWdyLm9iaiIgXAorCSIkKElOVERJUilcam1lbW5vYnMub2JqIiBcCisJIiQoSU5URElSKVxqcXVhbnQxLm9iaiIgXAorCSIkKElOVERJUilcanF1YW50Mi5vYmoiIFwKKwkiJChJTlRESVIpXGp1dGlscy5vYmoiCisKKyIkKE9VVERJUilcanBlZy5saWIiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSUIzMl9PQkpTKQorICAgICQoTElCMzIpIEA8PAorICAkKExJQjMyX0ZMQUdTKSAkKERFRl9GTEFHUykgJChMSUIzMl9PQkpTKQorPDwKKworCishSUYgIiQoTk9fRVhURVJOQUxfREVQUykiICE9ICIxIgorIUlGIEVYSVNUUygianBlZy5kZXAiKQorIUlOQ0xVREUgImpwZWcuZGVwIgorIUVMU0UgCishTUVTU0FHRSBXYXJuaW5nOiBjYW5ub3QgZmluZCAianBlZy5kZXAiCishRU5ESUYgCishRU5ESUYgCisKKworIUlGICIkKENGRykiID09ICJqcGVnIC0gV2luMzIiCitTT1VSQ0U9LlxqYXJpY29tLmMKKworIiQoSU5URElSKVxqYXJpY29tLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqY2FwaW1pbi5jCisKKyIkKElOVERJUilcamNhcGltaW4ub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpjYXBpc3RkLmMKKworIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camNhcml0aC5jCisKKyIkKElOVERJUilcamNhcml0aC5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camNjb2VmY3QuYworCisiJChJTlRESVIpXGpjY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqY2NvbG9yLmMKKworIiQoSU5URElSKVxqY2NvbG9yLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqY2RjdG1nci5jCisKKyIkKElOVERJUilcamNkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpjaHVmZi5jCisKKyIkKElOVERJUilcamNodWZmLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqY2luaXQuYworCisiJChJTlRESVIpXGpjaW5pdC5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camNtYWluY3QuYworCisiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqY21hcmtlci5jCisKKyIkKElOVERJUilcamNtYXJrZXIub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpjbWFzdGVyLmMKKworIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camNvbWFwaS5jCisKKyIkKElOVERJUilcamNvbWFwaS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camNwYXJhbS5jCisKKyIkKElOVERJUilcamNwYXJhbS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camNwcmVwY3QuYworCisiJChJTlRESVIpXGpjcHJlcGN0Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqY3NhbXBsZS5jCisKKyIkKElOVERJUilcamNzYW1wbGUub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpjdHJhbnMuYworCisiJChJTlRESVIpXGpjdHJhbnMub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpkYXBpbWluLmMKKworIiQoSU5URElSKVxqZGFwaW1pbi5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camRhcGlzdGQuYworCisiJChJTlRESVIpXGpkYXBpc3RkLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZGFyaXRoLmMKKworIiQoSU5URElSKVxqZGFyaXRoLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZGF0YWRzdC5jCisKKyIkKElOVERJUilcamRhdGFkc3Qub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpkYXRhc3JjLmMKKworIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camRjb2VmY3QuYworCisiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZGNvbG9yLmMKKworIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZGRjdG1nci5jCisKKyIkKElOVERJUilcamRkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpkaHVmZi5jCisKKyIkKElOVERJUilcamRodWZmLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZGlucHV0LmMKKworIiQoSU5URElSKVxqZGlucHV0Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZG1haW5jdC5jCisKKyIkKElOVERJUilcamRtYWluY3Qub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpkbWFya2VyLmMKKworIiQoSU5URElSKVxqZG1hcmtlci5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camRtYXN0ZXIuYworCisiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZG1lcmdlLmMKKworIiQoSU5URElSKVxqZG1lcmdlLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZHBvc3RjdC5jCisKKyIkKElOVERJUilcamRwb3N0Y3Qub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpkc2FtcGxlLmMKKworIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camR0cmFucy5jCisKKyIkKElOVERJUilcamR0cmFucy5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camVycm9yLmMKKworIiQoSU5URElSKVxqZXJyb3Iub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpmZGN0Zmx0LmMKKworIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camZkY3Rmc3QuYworCisiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqZmRjdGludC5jCisKKyIkKElOVERJUilcamZkY3RpbnQub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGppZGN0Zmx0LmMKKworIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5camlkY3Rmc3QuYworCisiJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9LlxqaWRjdGludC5jCisKKyIkKElOVERJUilcamlkY3RpbnQub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGptZW1tZ3IuYworCisiJChJTlRESVIpXGptZW1tZ3Iub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGptZW1ub2JzLmMKKworIiQoSU5URElSKVxqbWVtbm9icy5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5canF1YW50MS5jCisKKyIkKElOVERJUilcanF1YW50MS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5canF1YW50Mi5jCisKKyIkKElOVERJUilcanF1YW50Mi5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5canV0aWxzLmMKKworIiQoSU5URElSKVxqdXRpbHMub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKKworIUVORElGIAorCmRpZmYgLS1naXQgYS9tYWtlanNsbi52YzkgYi9tYWtlanNsbi52YzkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiNmEzMAotLS0gL2Rldi9udWxsCisrKyBiL21ha2Vqc2xuLnZjOQpAQCAtMCwwICsxLDE3IEBACiuLr6gKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwCisjIFZpc3VhbCBDKysgRXhwcmVzcyAyMDA4CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImpwZWciLCAianBlZy52Y3Byb2oiLCAie0U2MTU5MkUxLTI4RjQtNEFGQy05RUUxLTlCRTgzM0EwNjFDMX0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7RTYxNTkyRTEtMjhGNC00QUZDLTlFRTEtOUJFODMzQTA2MUMxfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0U2MTU5MkUxLTI4RjQtNEFGQy05RUUxLTlCRTgzM0EwNjFDMX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL21ha2VqdmNwLnZjOSBiL21ha2VqdmNwLnZjOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDg4MDliCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZWp2Y3AudmM5CkBAIC0wLDAgKzEsMzI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOSwwMCIKKwlOYW1lPSJqcGVnIgorCVByb2plY3RHVUlEPSJ7RTYxNTkyRTEtMjhGNC00QUZDLTlFRTEtOUJFODMzQTA2MUMxfSIKKwlSb290TmFtZXNwYWNlPSJqcGVnIgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxOTY2MTMiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJQ2hhcmFjdGVyU2V0PSIwIgorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0iZmFsc2UiCisJCQkJRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz0idHJ1ZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJRdWVsbGRhdGVpZW4iCisJCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214IgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqYXJpY29tLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camNhcGltaW4uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqY2FwaXN0ZC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjYXJpdGguYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqY2NvZWZjdC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjY29sb3IuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqY2RjdG1nci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjaHVmZi5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjaW5pdC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjbWFpbmN0LmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camNtYXJrZXIuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqY21hc3Rlci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjb21hcGkuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqY3BhcmFtLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camNwcmVwY3QuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqY3NhbXBsZS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjdHJhbnMuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZGFwaW1pbi5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkYXBpc3RkLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camRhcml0aC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkYXRhZHN0LmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camRhdGFzcmMuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZGNvZWZjdC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkY29sb3IuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZGRjdG1nci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkaHVmZi5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkaW5wdXQuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZG1haW5jdC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkbWFya2VyLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camRtYXN0ZXIuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZG1lcmdlLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camRwb3N0Y3QuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZHNhbXBsZS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkdHJhbnMuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZXJyb3IuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZmRjdGZsdC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpmZGN0ZnN0LmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camZkY3RpbnQuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqaWRjdGZsdC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGppZGN0ZnN0LmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camlkY3RpbnQuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqbWVtbWdyLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cam1lbW5vYnMuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqcXVhbnQxLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5canF1YW50Mi5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGp1dGlscy5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlcmRhdGVpZW4iCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camNvbmZpZy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpkY3QuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqZXJyb3IuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqaW5jbHVkZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGptZW1zeXMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqbW9yZWNmZy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpwZWdpbnQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqcGVnbGliLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5canZlcnNpb24uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNzb3VyY2VuZGF0ZWllbiIKKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdiIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9IgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL21ha2VsaWIuZHMgYi9tYWtlbGliLmRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2FkMzZkLi4wMDAwMDAwCi0tLSBhL21ha2VsaWIuZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ2ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIE5NQUtFIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDQuMjAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiIDB4MDEwNAotCi0hSUYgIiQoQ0ZHKSIgPT0gIiIKLUNGRz1qcGVnIC0gV2luMzIKLSFNRVNTQUdFIE5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLiAgRGVmYXVsdGluZyB0byBqcGVnIC0gV2luMzIuCi0hRU5ESUYgCi0KLSFJRiAiJChDRkcpIiAhPSAianBlZyAtIFdpbjMyIgotIU1FU1NBR0UgSW52YWxpZCBjb25maWd1cmF0aW9uICIkKENGRykiIHNwZWNpZmllZC4KLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFIG9uIHRoaXMgbWFrZWZpbGUKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAianBlZy5tYWsiIENGRz0ianBlZyAtIFdpbjMyIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgImpwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAKLSFFUlJPUiBBbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLgotIUVORElGIAotCi0hSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKLU5VTEw9Ci0hRUxTRSAKLU5VTEw9bnVsCi0hRU5ESUYgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgVGFyZ2V0X0xhc3RfU2Nhbm5lZCAianBlZyAtIFdpbjMyIgotQ1BQPWNsLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJqcGVnIC0gV2luMzIiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotT1VURElSPS5cUmVsZWFzZQotSU5URElSPS5cUmVsZWFzZQotCi1BTEwgOiAiJChPVVRESVIpXGpwZWcubGliIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVxqY2FwaW1pbi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjYXBpc3RkLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamN0cmFucy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjcGFyYW0ub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGF0YWRzdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjaW5pdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjbWFzdGVyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNtYXJrZXIub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY21haW5jdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjcHJlcGN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNjb2VmY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2NvbG9yLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNzYW1wbGUub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY2h1ZmYub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqY3BodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamNkY3RtZ3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGZzdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0Zmx0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamZkY3RpbnQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGFwaW1pbi5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkYXBpc3RkLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamR0cmFucy5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkYXRhc3JjLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtYXN0ZXIub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGlucHV0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtYXJrZXIub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGh1ZmYub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZHBodWZmLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtYWluY3Qub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZGNvZWZjdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRkY3RtZ3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGppZGN0Zmx0Lm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamlkY3RpbnQub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdHJlZC5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpkc2FtcGxlLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRjb2xvci5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpxdWFudDEub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqcXVhbnQyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcamRtZXJnZS5vYmoiCi0JLUBlcmFzZSAiJChJTlRESVIpXGpjb21hcGkub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqdXRpbHMub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqZXJyb3Iub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVxqbWVtbWdyLm9iaiIKLQktQGVyYXNlICIkKElOVERJUilcam1lbW5vYnMub2JqIgotCS1AZXJhc2UgIiQoT1VURElSKVxqcGVnLmxpYiIKLQotIiQoT1VURElSKSIgOgotICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCi0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiXAotIC9GcCIkKElOVERJUikvanBlZy5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCi1DUFBfT0JKUz0uXFJlbGVhc2UvCi1DUFBfU0JSUz0uXC4KLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpL2pwZWcuYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJQjMyPWxpbmsuZXhlIC1saWIKLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbwotIyBBREQgTElCMzIgL25vbG9nbwotTElCMzJfRkxBR1M9L25vbG9nbyAvb3V0OiIkKE9VVERJUikvanBlZy5saWIiIAotTElCMzJfT0JKUz0gXAotCSIkKElOVERJUilcamNhcGltaW4ub2JqIiBcCi0JIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIFwKLQkiJChJTlRESVIpXGpjdHJhbnMub2JqIiBcCi0JIiQoSU5URElSKVxqY3BhcmFtLm9iaiIgXAotCSIkKElOVERJUilcamRhdGFkc3Qub2JqIiBcCi0JIiQoSU5URElSKVxqY2luaXQub2JqIiBcCi0JIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIFwKLQkiJChJTlRESVIpXGpjbWFya2VyLm9iaiIgXAotCSIkKElOVERJUilcamNtYWluY3Qub2JqIiBcCi0JIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiIFwKLQkiJChJTlRESVIpXGpjY29lZmN0Lm9iaiIgXAotCSIkKElOVERJUilcamNjb2xvci5vYmoiIFwKLQkiJChJTlRESVIpXGpjc2FtcGxlLm9iaiIgXAotCSIkKElOVERJUilcamNodWZmLm9iaiIgXAotCSIkKElOVERJUilcamNwaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIgXAotCSIkKElOVERJUilcamZkY3Rmc3Qub2JqIiBcCi0JIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiIFwKLQkiJChJTlRESVIpXGpmZGN0aW50Lm9iaiIgXAotCSIkKElOVERJUilcamRhcGltaW4ub2JqIiBcCi0JIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiIFwKLQkiJChJTlRESVIpXGpkdHJhbnMub2JqIiBcCi0JIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIgXAotCSIkKElOVERJUilcamRpbnB1dC5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWFya2VyLm9iaiIgXAotCSIkKElOVERJUilcamRodWZmLm9iaiIgXAotCSIkKElOVERJUilcamRwaHVmZi5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIgXAotCSIkKElOVERJUilcamRjb2VmY3Qub2JqIiBcCi0JIiQoSU5URElSKVxqZHBvc3RjdC5vYmoiIFwKLQkiJChJTlRESVIpXGpkZGN0bWdyLm9iaiIgXAotCSIkKElOVERJUilcamlkY3Rmc3Qub2JqIiBcCi0JIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIFwKLQkiJChJTlRESVIpXGppZGN0aW50Lm9iaiIgXAotCSIkKElOVERJUilcamlkY3RyZWQub2JqIiBcCi0JIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiIFwKLQkiJChJTlRESVIpXGpkY29sb3Iub2JqIiBcCi0JIiQoSU5URElSKVxqcXVhbnQxLm9iaiIgXAotCSIkKElOVERJUilcanF1YW50Mi5vYmoiIFwKLQkiJChJTlRESVIpXGpkbWVyZ2Uub2JqIiBcCi0JIiQoSU5URElSKVxqY29tYXBpLm9iaiIgXAotCSIkKElOVERJUilcanV0aWxzLm9iaiIgXAotCSIkKElOVERJUilcamVycm9yLm9iaiIgXAotCSIkKElOVERJUilcam1lbW1nci5vYmoiIFwKLQkiJChJTlRESVIpXGptZW1ub2JzLm9iaiIKLQotIiQoT1VURElSKVxqcGVnLmxpYiIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJQjMyX09CSlMpCi0gICAgJChMSUIzMikgQDw8Ci0gICQoTElCMzJfRkxBR1MpICQoREVGX0ZMQUdTKSAkKExJQjMyX09CSlMpCi08PAotCi0hRU5ESUYgCi0KLS5jeyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3BweyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3h4eyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3skKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAianBlZyAtIFdpbjMyIgotCi0hSUYgICIkKENGRykiID09ICJqcGVnIC0gV2luMzIiCi0KLSFFTkRJRiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2FwaW1pbi5jIgotREVQX0NQUF9KQ0FQST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjYXBpbWluLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQVBJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjYXBpc3RkLmMiCi1ERVBfQ1BQX0pDQVBJUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjYXBpc3RkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQVBJUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY2NvZWZjdC5jIgotREVQX0NQUF9KQ0NPRT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQ09FKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjY29sb3IuYyIKLURFUF9DUFBfSkNDT0w9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY2NvbG9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDQ09MKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjZGN0bWdyLmMiCi1ERVBfQ1BQX0pDRENUPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamNkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNEQ1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNodWZmLmMiCi1ERVBfQ1BQX0pDSFVGPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpjaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqY2h1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNIVUYpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNpbml0LmMiCi1ERVBfQ1BQX0pDSU5JPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNpbml0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDSU5JKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjbWFpbmN0LmMiCi1ERVBfQ1BQX0pDTUFJPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamNtYWluY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNNQUkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNtYXJrZXIuYyIKLURFUF9DUFBfSkNNQVI9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY21hcmtlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ01BUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY21hc3Rlci5jIgotREVQX0NQUF9KQ01BUz1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjbWFzdGVyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDTUFTKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Impjb21hcGkuYyIKLURFUF9DUFBfSkNPTUE9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY29tYXBpLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDT01BKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjcGFyYW0uYyIKLURFUF9DUFBfSkNQQVI9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3BhcmFtLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDUEFSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjcGh1ZmYuYyIKLURFUF9DUFBfSkNQSFU9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamNodWZmLmgiXAotCQotCi0iJChJTlRESVIpXGpjcGh1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNQSFUpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamNwcmVwY3QuYyIKLURFUF9DUFBfSkNQUkU9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1BSRSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqY3NhbXBsZS5jIgotREVQX0NQUF9KQ1NBTT1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpjc2FtcGxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDU0FNKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpjdHJhbnMuYyIKLURFUF9DUFBfSkNUUkE9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqY3RyYW5zLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDVFJBKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXBpbWluLmMiCi1ERVBfQ1BQX0pEQVBJPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhcGltaW4ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBUEkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRhcGlzdGQuYyIKLURFUF9DUFBfSkRBUElTPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhcGlzdGQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBUElTKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkYXRhZHN0LmMiCi1ERVBfQ1BQX0pEQVRBPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhdGFkc3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBVEEpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRhdGFzcmMuYyIKLURFUF9DUFBfSkRBVEFTPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRhdGFzcmMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRBVEFTKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkY29lZmN0LmMiCi1ERVBfQ1BQX0pEQ09FPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRjb2VmY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRDT0UpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRjb2xvci5jIgotREVQX0NQUF9KRENPTD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkY29sb3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRDT0wpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRkY3RtZ3IuYyIKLURFUF9DUFBfSkREQ1Q9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqZGRjdG1nci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRERDVCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGh1ZmYuYyIKLURFUF9DUFBfSkRIVUY9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRodWZmLmgiXAotCQotCi0iJChJTlRESVIpXGpkaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KREhVRikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZGlucHV0LmMiCi1ERVBfQ1BQX0pESU5QPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRpbnB1dC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRElOUCkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZG1haW5jdC5jIgotREVQX0NQUF9KRE1BST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCQotCi0iJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUFJKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkbWFya2VyLmMiCi1ERVBfQ1BQX0pETUFSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRtYXJrZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNQVIpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRtYXN0ZXIuYyIKLURFUF9DUFBfSkRNQVM9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZG1hc3Rlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1BUykgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZG1lcmdlLmMiCi1ERVBfQ1BQX0pETUVSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRtZXJnZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1FUikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZHBodWZmLmMiCi1ERVBfQ1BQX0pEUEhVPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkaHVmZi5oIlwKLQkKLQotIiQoSU5URElSKVxqZHBodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEUEhVKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpkcG9zdGN0LmMiCi1ERVBfQ1BQX0pEUE9TPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamRwb3N0Y3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRQT1MpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamRzYW1wbGUuYyIKLURFUF9DUFBfSkRTQU09XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFNBTSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZHRyYW5zLmMiCi1ERVBfQ1BQX0pEVFJBPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamR0cmFucy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFRSQSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqZXJyb3IuYyIKLURFUF9DUFBfSkVSUk89XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImp2ZXJzaW9uLmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcamVycm9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pFUlJPKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpmZGN0Zmx0LmMiCi1ERVBfQ1BQX0pGRENUPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamZkY3RmbHQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkZEQ1QpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamZkY3Rmc3QuYyIKLURFUF9DUFBfSkZEQ1RGPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamZkY3Rmc3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkZEQ1RGKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpmZGN0aW50LmMiCi1ERVBfQ1BQX0pGRENUST1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGpmZGN0aW50Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENUSSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqaWRjdGZsdC5jIgotREVQX0NQUF9KSURDVD1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGppZGN0Zmx0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENUKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImppZGN0ZnN0LmMiCi1ERVBfQ1BQX0pJRENURj1cCi0JImppbmNsdWRlLmgiXAotCSJqY29uZmlnLmgiXAotCSJqcGVnbGliLmgiXAotCSJqbW9yZWNmZy5oIlwKLQkianBlZ2ludC5oIlwKLQkiamVycm9yLmgiXAotCSJqZGN0LmgiXAotCQotCi0iJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENURikgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPSJqaWRjdGludC5jIgotREVQX0NQUF9KSURDVEk9XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiamRjdC5oIlwKLQkKLQotIiQoSU5URElSKVxqaWRjdGludC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVEkpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iamlkY3RyZWQuYyIKLURFUF9DUFBfSklEQ1RSPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImpkY3QuaCJcCi0JCi0KLSIkKElOVERJUilcamlkY3RyZWQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1RSKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpxdWFudDEuYyIKLURFUF9DUFBfSlFVQU49XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkKLQotIiQoSU5URElSKVxqcXVhbnQxLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pRVUFOKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImpxdWFudDIuYyIKLURFUF9DUFBfSlFVQU5UPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcanF1YW50Mi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUVVBTlQpICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0ianV0aWxzLmMiCi1ERVBfQ1BQX0pVVElMPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JCi0KLSIkKElOVERJUilcanV0aWxzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pVVElMKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImptZW1tZ3IuYyIKLURFUF9DUFBfSk1FTU09XAotCSJqaW5jbHVkZS5oIlwKLQkiamNvbmZpZy5oIlwKLQkianBlZ2xpYi5oIlwKLQkiam1vcmVjZmcuaCJcCi0JImpwZWdpbnQuaCJcCi0JImplcnJvci5oIlwKLQkiam1lbXN5cy5oIlwKLQkKLQotIiQoSU5URElSKVxqbWVtbWdyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pNRU1NKSAiJChJTlRESVIpIgotICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQotCi0KLSMgRW5kIFNvdXJjZSBGaWxlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9ImptZW1ub2JzLmMiCi1ERVBfQ1BQX0pNRU1OPVwKLQkiamluY2x1ZGUuaCJcCi0JImpjb25maWcuaCJcCi0JImpwZWdsaWIuaCJcCi0JImptb3JlY2ZnLmgiXAotCSJqcGVnaW50LmgiXAotCSJqZXJyb3IuaCJcCi0JImptZW1zeXMuaCJcCi0JCi0KLSIkKElOVERJUilcam1lbW5vYnMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSk1FTU4pICIkKElOVERJUikiCi0gICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCi0KLQotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQpkaWZmIC0tZ2l0IGEvbWFrZXByb2oubWFjIGIvbWFrZXByb2oubWFjCmluZGV4IGVkMjc3YzguLmU1YjUxMDIgMTAwNjQ0Ci0tLSBhL21ha2Vwcm9qLm1hYworKysgYi9tYWtlcHJvai5tYWMKQEAgLTUzLDggKzUzLDEwIEBACiAJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9CiAJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQogCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImphcmljb20uYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjYXBpbWluLmMiIFRvIFNlZ21lbnQgMQogCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2FwaXN0ZC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNhcml0aC5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamN0cmFucy5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwYXJhbS5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhdGFkc3QuYyIgVG8gU2VnbWVudCAxCkBAIC02NywyMCArNjksMTkgQEAKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNjb2xvci5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNzYW1wbGUuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjaHVmZi5jIiBUbyBTZWdtZW50IDEKLQkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNwaHVmZi5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNkY3RtZ3IuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpmZGN0ZnN0LmMiIFRvIFNlZ21lbnQgMQogCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZmRjdGZsdC5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamZkY3RpbnQuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkYXBpbWluLmMiIFRvIFNlZ21lbnQgMQogCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGFwaXN0ZC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhcml0aC5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamR0cmFucy5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhdGFzcmMuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkbWFzdGVyLmMiIFRvIFNlZ21lbnQgMQogCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGlucHV0LmMiIFRvIFNlZ21lbnQgMQogCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZG1hcmtlci5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRodWZmLmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHBodWZmLmMiIFRvIFNlZ21lbnQgMQogCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZG1haW5jdC5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRjb2VmY3QuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkcG9zdGN0LmMiIFRvIFNlZ21lbnQgMQpAQCAtODgsNyArODksNiBAQAogCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdGZzdC5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamlkY3RmbHQuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0aW50LmMiIFRvIFNlZ21lbnQgMQotCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdHJlZC5jIiBUbyBTZWdtZW50IDEKIAkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRzYW1wbGUuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkY29sb3IuYyIgVG8gU2VnbWVudCAxCiAJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpxdWFudDEuYyIgVG8gU2VnbWVudCAxCmRpZmYgLS1naXQgYS9tYWtlcmRlcC52YzYgYi9tYWtlcmRlcC52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3NDhkMAotLS0gL2Rldi9udWxsCisrKyBiL21ha2VyZGVwLnZjNgpAQCAtMCwwICsxLDYgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZXJzdGVsbHRlIEFiaIRuZ2lna2VpdHNkYXRlaSwgZWluYmV6b2dlbiB2b24gcmRqcGdjb20ubWFrCisKKy5ccmRqcGdjb20uYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCQpkaWZmIC0tZ2l0IGEvbWFrZXJkc3AudmM2IGIvbWFrZXJkc3AudmM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGUwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlcmRzcC52YzYKQEAgLTAsMCArMSw3OCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJyZGpwZ2NvbSIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCitDRkc9cmRqcGdjb20gLSBXaW4zMgorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBngWx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZoFocmVuIFNpZSBkZW4gQmVmZWhsCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJyZGpwZ2NvbS5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBTaWUga/dubmVuIGJlaW0gQXVzZoFocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbgorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJyZGpwZ2NvbS5tYWsiIENGRz0icmRqcGdjb20gLSBXaW4zMiIKKyFNRVNTQUdFIAorIU1FU1NBR0UgRoFyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgInJkanBnY29tIC0gV2luMzIiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXHJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXHJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIuXHJkanBnY29tIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi5ccmRqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXHJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIi5ccmRqcGdjb20iCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9HNiAvTVQgL1czIC9HWCAvT3ggL09hIC9PYjIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJyZGpwZ2NvbSAtIFdpbjMyIgorIyBCZWdpbiBHcm91cCAiUXVlbGxjb2RlZGF0ZWllbiIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0O2ZvcjtmOTAiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHJkanBnY29tLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyLURhdGVpZW4iCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camNvbmZpZy5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqaW5jbHVkZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIlJlc3NvdXJjZW5kYXRlaWVuIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tYWtlcm1hay52YzYgYi9tYWtlcm1hay52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyZDRjNwotLS0gL2Rldi9udWxsCisrKyBiL21ha2VybWFrLnZjNgpAQCAtMCwwICsxLDExMCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgQmFzZWQgb24gcmRqcGdjb20uZHNwCishSUYgIiQoQ0ZHKSIgPT0gIiIKK0NGRz1yZGpwZ2NvbSAtIFdpbjMyCishTUVTU0FHRSBLZWluZSBLb25maWd1cmF0aW9uIGFuZ2VnZWJlbi4gcmRqcGdjb20gLSBXaW4zMiB3aXJkIGFscyBTdGFuZGFyZCB2ZXJ3ZW5kZXQuCishRU5ESUYgCisKKyFJRiAiJChDRkcpIiAhPSAicmRqcGdjb20gLSBXaW4zMiIKKyFNRVNTQUdFIFVuZ/xsdGlnZSBLb25maWd1cmF0aW9uICIkKENGRykiIGFuZ2VnZWJlbi4KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuCishTUVTU0FHRSBkdXJjaCBEZWZpbmllcmVuIGRlcyBNYWtyb3MgQ0ZHIGluIGRlciBCZWZlaGxzemVpbGUuIFp1bSBCZWlzcGllbDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInJkanBnY29tLm1hayIgQ0ZHPSJyZGpwZ2NvbSAtIFdpbjMyIgorIU1FU1NBR0UgCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOgorIU1FU1NBR0UgCishTUVTU0FHRSAicmRqcGdjb20gLSBXaW4zMiIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorIUVSUk9SIEVpbmUgdW5n/Gx0aWdlIEtvbmZpZ3VyYXRpb24gd3VyZGUgYW5nZWdlYmVuLgorIUVORElGIAorCishSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKK05VTEw9CishRUxTRSAKK05VTEw9bnVsCishRU5ESUYgCisKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKK09VVERJUj0uXHJkanBnY29tXFJlbGVhc2UKK0lOVERJUj0uXHJkanBnY29tXFJlbGVhc2UKKyMgQmVnaW4gQ3VzdG9tIE1hY3JvcworT3V0RGlyPS5ccmRqcGdjb21cUmVsZWFzZQorIyBFbmQgQ3VzdG9tIE1hY3JvcworCitBTEwgOiAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKKworCitDTEVBTiA6CisJLUBlcmFzZSAiJChJTlRESVIpXHJkanBnY29tLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcdmM2MC5pZGIiCisJLUBlcmFzZSAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKK0JTQzMyPWJzY21ha2UuZXhlCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKVxyZGpwZ2NvbS5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm8gL3BkYjoiJChPVVRESVIpXHJkanBnY29tLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUilccmRqcGdjb20uZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiCisKKyIkKE9VVERJUilccmRqcGdjb20uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKK0NQUF9QUk9KPS9ub2xvZ28gL0c2IC9NVCAvVzMgL0dYIC9PeCAvT2EgL09iMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0ZwIiQoSU5URElSKVxyZGpwZ2NvbS5wY2giIC9ZWCAvRm8iJChJTlRESVIpXFwiIC9GZCIkKElOVERJUilcXCIgL0ZEIC9jIAorCisuY3skKElOVERJUil9Lm9iajo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jcHB7JChJTlRESVIpfS5vYmo6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3h4eyQoSU5URElSKX0ub2JqOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmN7JChJTlRESVIpfS5zYnI6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3BweyQoSU5URElSKX0uc2JyOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmN4eHskKElOVERJUil9LnNicjo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKworIUlGICIkKE5PX0VYVEVSTkFMX0RFUFMpIiAhPSAiMSIKKyFJRiBFWElTVFMoInJkanBnY29tLmRlcCIpCishSU5DTFVERSAicmRqcGdjb20uZGVwIgorIUVMU0UgCishTUVTU0FHRSBXYXJuaW5nOiBjYW5ub3QgZmluZCAicmRqcGdjb20uZGVwIgorIUVORElGIAorIUVORElGIAorCisKKyFJRiAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiIKK1NPVVJDRT0uXHJkanBnY29tLmMKKworIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworCishRU5ESUYgCisKZGlmZiAtLWdpdCBhL21ha2VydmNwLnZjOSBiL21ha2VydmNwLnZjOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjczZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZXJ2Y3AudmM5CkBAIC0wLDAgKzEsMTMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOSwwMCIKKwlOYW1lPSJyZGpwZ2NvbSIKKwlQcm9qZWN0R1VJRD0ie0VCMTA3Rjg2LUE4Q0MtNDUwNy04MTE1LTg4RDMxRERFNENERn0iCisJUm9vdE5hbWVzcGFjZT0icmRqcGdjb20iCisJS2V5d29yZD0iV2luMzJQcm9qIgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjE5NjYxMyIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJQ2hhcmFjdGVyU2V0PSIwIgorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0iZmFsc2UiCisJCQkJRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz0idHJ1ZSIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCQlEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz0iNDk5NiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUXVlbGxkYXRlaWVuIgorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5ccmRqcGdjb20uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXJkYXRlaWVuIgorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGpjb25maWcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqaW5jbHVkZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc3NvdXJjZW5kYXRlaWVuIgorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeDt0aWZmO3RpZjtwbmc7d2F2IgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX0iCisJCQk+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWFrZXRkZXAudmM2IGIvbWFrZXRkZXAudmM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzdlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtldGRlcC52YzYKQEAgLTAsMCArMSw0MyBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBlcnN0ZWxsdGUgQWJohG5naWdrZWl0c2RhdGVpLCBlaW5iZXpvZ2VuIHZvbiBqcGVndHJhbi5tYWsKKworLlxjZGpwZWcuYyA6IFwKKwkiLlxjZGVycm9yLmgiXAorCSIuXGNkanBlZy5oIlwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnbGliLmgiXAorCQorCisuXGpwZWd0cmFuLmMgOiBcCisJIi5cY2RlcnJvci5oIlwKKwkiLlxjZGpwZWcuaCJcCisJIi5camNvbmZpZy5oIlwKKwkiLlxqZXJyb3IuaCJcCisJIi5camluY2x1ZGUuaCJcCisJIi5cam1vcmVjZmcuaCJcCisJIi5canBlZ2xpYi5oIlwKKwkiLlxqdmVyc2lvbi5oIlwKKwkiLlx0cmFuc3VwcC5oIlwKKwkKKworLlxyZHN3aXRjaC5jIDogXAorCSIuXGNkZXJyb3IuaCJcCisJIi5cY2RqcGVnLmgiXAorCSIuXGpjb25maWcuaCJcCisJIi5camVycm9yLmgiXAorCSIuXGppbmNsdWRlLmgiXAorCSIuXGptb3JlY2ZnLmgiXAorCSIuXGpwZWdsaWIuaCJcCisJCisKKy5cdHJhbnN1cHAuYyA6IFwKKwkiLlxqY29uZmlnLmgiXAorCSIuXGplcnJvci5oIlwKKwkiLlxqaW5jbHVkZS5oIlwKKwkiLlxqbW9yZWNmZy5oIlwKKwkiLlxqcGVnaW50LmgiXAorCSIuXGpwZWdsaWIuaCJcCisJIi5cdHJhbnN1cHAuaCJcCisJCmRpZmYgLS1naXQgYS9tYWtldGRzcC52YzYgYi9tYWtldGRzcC52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxYWU5YQotLS0gL2Rldi9udWxsCisrKyBiL21ha2V0ZHNwLnZjNgpAQCAtMCwwICsxLDEyMiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJqcGVndHJhbiIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyAqKiBOSUNIVCBCRUFSQkVJVEVOICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCitDRkc9anBlZ3RyYW4gLSBXaW4zMgorIU1FU1NBR0UgRGllcyBpc3Qga2VpbiBngWx0aWdlcyBNYWtlZmlsZS4gWnVtIEVyc3RlbGxlbiBkaWVzZXMgUHJvamVrdHMgbWl0IE5NQUtFCishTUVTU0FHRSB2ZXJ3ZW5kZW4gU2llIGRlbiBCZWZlaGwgIk1ha2VmaWxlIGV4cG9ydGllcmVuIiB1bmQgZoFocmVuIFNpZSBkZW4gQmVmZWhsCishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVndHJhbi5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBTaWUga/dubmVuIGJlaW0gQXVzZoFocmVuIHZvbiBOTUFLRSBlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWJlbgorIU1FU1NBR0UgZHVyY2ggRGVmaW5pZXJlbiBkZXMgTWFrcm9zIENGRyBpbiBkZXIgQmVmZWhsc3plaWxlLiBadW0gQmVpc3BpZWw6CishTUVTU0FHRSAKKyFNRVNTQUdFIE5NQUtFIC9mICJqcGVndHJhbi5tYWsiIENGRz0ianBlZ3RyYW4gLSBXaW4zMiIKKyFNRVNTQUdFIAorIU1FU1NBR0UgRoFyIGRpZSBLb25maWd1cmF0aW9uIHN0ZWhlbiB6dXIgQXVzd2FobDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgImpwZWd0cmFuIC0gV2luMzIiIChiYXNpZXJlbmQgYXVmICAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXGpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXGpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIuXGpwZWd0cmFuIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIi5canBlZ3RyYW5cUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXGpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAorIyBQUk9QIFRhcmdldF9EaXIgIi5canBlZ3RyYW4iCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9HNiAvTVQgL1czIC9HWCAvT3ggL09hIC9PYjIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJqcGVndHJhbiAtIFdpbjMyIgorIyBCZWdpbiBHcm91cCAiUXVlbGxjb2RlZGF0ZWllbiIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0O2ZvcjtmOTAiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGNkanBlZy5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqcGVndHJhbi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxyZHN3aXRjaC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx0cmFuc3VwcC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIkhlYWRlci1EYXRlaWVuIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGNkZXJyb3IuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cY2RqcGVnLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpjb25maWcuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5camVycm9yLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGppbmNsdWRlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGptb3JlY2ZnLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGpwZWdpbnQuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5canBlZ2xpYi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqdmVyc2lvbi5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx0cmFuc3VwcC5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBFbmQgR3JvdXAKKyMgQmVnaW4gR3JvdXAgIlJlc3NvdXJjZW5kYXRlaWVuIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tYWtldG1hay52YzYgYi9tYWtldG1hay52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkZTM4YwotLS0gL2Rldi9udWxsCisrKyBiL21ha2V0bWFrLnZjNgpAQCAtMCwwICsxLDEzMSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgTk1BS0UgRmlsZSwgQmFzZWQgb24ganBlZ3RyYW4uZHNwCishSUYgIiQoQ0ZHKSIgPT0gIiIKK0NGRz1qcGVndHJhbiAtIFdpbjMyCishTUVTU0FHRSBLZWluZSBLb25maWd1cmF0aW9uIGFuZ2VnZWJlbi4ganBlZ3RyYW4gLSBXaW4zMiB3aXJkIGFscyBTdGFuZGFyZCB2ZXJ3ZW5kZXQuCishRU5ESUYgCisKKyFJRiAiJChDRkcpIiAhPSAianBlZ3RyYW4gLSBXaW4zMiIKKyFNRVNTQUdFIFVuZ/xsdGlnZSBLb25maWd1cmF0aW9uICIkKENGRykiIGFuZ2VnZWJlbi4KKyFNRVNTQUdFIFNpZSBr9m5uZW4gYmVpbSBBdXNm/GhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuCishTUVTU0FHRSBkdXJjaCBEZWZpbmllcmVuIGRlcyBNYWtyb3MgQ0ZHIGluIGRlciBCZWZlaGxzemVpbGUuIFp1bSBCZWlzcGllbDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImpwZWd0cmFuLm1hayIgQ0ZHPSJqcGVndHJhbiAtIFdpbjMyIgorIU1FU1NBR0UgCishTUVTU0FHRSBG/HIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOgorIU1FU1NBR0UgCishTUVTU0FHRSAianBlZ3RyYW4gLSBXaW4zMiIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorIUVSUk9SIEVpbmUgdW5n/Gx0aWdlIEtvbmZpZ3VyYXRpb24gd3VyZGUgYW5nZWdlYmVuLgorIUVORElGIAorCishSUYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKK05VTEw9CishRUxTRSAKK05VTEw9bnVsCishRU5ESUYgCisKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKK09VVERJUj0uXGpwZWd0cmFuXFJlbGVhc2UKK0lOVERJUj0uXGpwZWd0cmFuXFJlbGVhc2UKKyMgQmVnaW4gQ3VzdG9tIE1hY3JvcworT3V0RGlyPS5canBlZ3RyYW5cUmVsZWFzZQorIyBFbmQgQ3VzdG9tIE1hY3JvcworCitBTEwgOiAiJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIKKworCitDTEVBTiA6CisJLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpwZWd0cmFuLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRzd2l0Y2gub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx0cmFuc3VwcC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHZjNjAuaWRiIgorCS1AZXJhc2UgIiQoT1VURElSKVxqcGVndHJhbi5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCitCU0MzMj1ic2NtYWtlLmV4ZQorQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUilcanBlZ3RyYW4uYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vIC9wZGI6IiQoT1VURElSKVxqcGVndHJhbi5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpXGpwZWd0cmFuLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcY2RqcGVnLm9iaiIgXAorCSIkKElOVERJUilcanBlZ3RyYW4ub2JqIiBcCisJIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIFwKKwkiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIKKworIiQoT1VURElSKVxqcGVndHJhbi5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKKyAgICAkKExJTkszMikgQDw8CisgICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQorPDwKKworQ1BQX1BST0o9L25vbG9nbyAvRzYgL01UIC9XMyAvR1ggL094IC9PYSAvT2IyIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRnAiJChJTlRESVIpXGpwZWd0cmFuLnBjaCIgL1lYIC9GbyIkKElOVERJUilcXCIgL0ZkIiQoSU5URElSKVxcIiAvRkQgL2MgCisKKy5jeyQoSU5URElSKX0ub2JqOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmNwcHskKElOVERJUil9Lm9iajo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jeHh7JChJTlRESVIpfS5vYmo6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3skKElOVERJUil9LnNicjo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jcHB7JChJTlRESVIpfS5zYnI6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3h4eyQoSU5URElSKX0uc2JyOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworCishSUYgIiQoTk9fRVhURVJOQUxfREVQUykiICE9ICIxIgorIUlGIEVYSVNUUygianBlZ3RyYW4uZGVwIikKKyFJTkNMVURFICJqcGVndHJhbi5kZXAiCishRUxTRSAKKyFNRVNTQUdFIFdhcm5pbmc6IGNhbm5vdCBmaW5kICJqcGVndHJhbi5kZXAiCishRU5ESUYgCishRU5ESUYgCisKKworIUlGICIkKENGRykiID09ICJqcGVndHJhbiAtIFdpbjMyIgorU09VUkNFPS5cY2RqcGVnLmMKKworIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKK1NPVVJDRT0uXGpwZWd0cmFuLmMKKworIiQoSU5URElSKVxqcGVndHJhbi5vYmoiIDogJChTT1VSQ0UpICIkKElOVERJUikiCisKKworU09VUkNFPS5ccmRzd2l0Y2guYworCisiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCitTT1VSQ0U9Llx0cmFuc3VwcC5jCisKKyIkKElOVERJUilcdHJhbnN1cHAub2JqIiA6ICQoU09VUkNFKSAiJChJTlRESVIpIgorCisKKworIUVORElGIAorCmRpZmYgLS1naXQgYS9tYWtldHZjcC52YzkgYi9tYWtldHZjcC52YzkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwMzQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL21ha2V0dmNwLnZjOQpAQCAtMCwwICsxLDE3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjksMDAiCisJTmFtZT0ianBlZ3RyYW4iCisJUHJvamVjdEdVSUQ9Ins4MTNDMzNBRi05MDMxLTQ5RDItQkExOS05M0Q2MDBDREQ0MDR9IgorCVJvb3ROYW1lc3BhY2U9ImpwZWd0cmFuIgorCUtleXdvcmQ9IldpbjMyUHJvaiIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxOTY2MTMiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFByb2plY3ROYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUNoYXJhY3RlclNldD0iMCIKKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMyIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9ImZhbHNlIgorCQkJCUVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM9InRydWUiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkJRGlzYWJsZVNwZWNpZmljV2FybmluZ3M9IjQ5OTYiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iUmVsZWFzZVxqcGVnLmxpYiIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUXVlbGxkYXRlaWVuIgorCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY2RqcGVnLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5canBlZ3RyYW4uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxyZHN3aXRjaC5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHRyYW5zdXBwLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSGVhZGVyZGF0ZWllbiIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxjZGVycm9yLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cY2RqcGVnLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camNvbmZpZy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGplcnJvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGppbmNsdWRlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cam1vcmVjZmcuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxqcGVnaW50LmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5canBlZ2xpYi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGp2ZXJzaW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cdHJhbnN1cHAuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNzb3VyY2VuZGF0ZWllbiIKKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdiIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9IgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL21ha2V3ZGVwLnZjNiBiL21ha2V3ZGVwLnZjNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTkyOWJmCi0tLSAvZGV2L251bGwKKysrIGIvbWFrZXdkZXAudmM2CkBAIC0wLDAgKzEsNiBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBlcnN0ZWxsdGUgQWJohG5naWdrZWl0c2RhdGVpLCBlaW5iZXpvZ2VuIHZvbiB3cmpwZ2NvbS5tYWsKKworLlx3cmpwZ2NvbS5jIDogXAorCSIuXGpjb25maWcuaCJcCisJIi5camluY2x1ZGUuaCJcCisJCmRpZmYgLS1naXQgYS9tYWtld2RzcC52YzYgYi9tYWtld2RzcC52YzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2M2IxYQotLS0gL2Rldi9udWxsCisrKyBiL21ha2V3ZHNwLnZjNgpAQCAtMCwwICsxLDc4IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IndyanBnY29tIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCisjICoqIE5JQ0hUIEJFQVJCRUlURU4gKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCisKK0NGRz13cmpwZ2NvbSAtIFdpbjMyCishTUVTU0FHRSBEaWVzIGlzdCBrZWluIGeBbHRpZ2VzIE1ha2VmaWxlLiBadW0gRXJzdGVsbGVuIGRpZXNlcyBQcm9qZWt0cyBtaXQgTk1BS0UKKyFNRVNTQUdFIHZlcndlbmRlbiBTaWUgZGVuIEJlZmVobCAiTWFrZWZpbGUgZXhwb3J0aWVyZW4iIHVuZCBmgWhyZW4gU2llIGRlbiBCZWZlaGwKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgIndyanBnY29tLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFNpZSBr925uZW4gYmVpbSBBdXNmgWhyZW4gdm9uIE5NQUtFIGVpbmUgS29uZmlndXJhdGlvbiBhbmdlYmVuCishTUVTU0FHRSBkdXJjaCBEZWZpbmllcmVuIGRlcyBNYWtyb3MgQ0ZHIGluIGRlciBCZWZlaGxzemVpbGUuIFp1bSBCZWlzcGllbDoKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgIndyanBnY29tLm1hayIgQ0ZHPSJ3cmpwZ2NvbSAtIFdpbjMyIgorIU1FU1NBR0UgCishTUVTU0FHRSBGgXIgZGllIEtvbmZpZ3VyYXRpb24gc3RlaGVuIHp1ciBBdXN3YWhsOgorIU1FU1NBR0UgCishTUVTU0FHRSAid3JqcGdjb20gLSBXaW4zMiIgKGJhc2llcmVuZCBhdWYgICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cd3JqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cd3JqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIi5cd3JqcGdjb20iCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiLlx3cmpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cd3JqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiLlx3cmpwZ2NvbSIKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL0c2IC9NVCAvVzMgL0dYIC9PeCAvT2EgL09iMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL1lYIC9GRCAvYworIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgIndyanBnY29tIC0gV2luMzIiCisjIEJlZ2luIEdyb3VwICJRdWVsbGNvZGVkYXRlaWVuIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQ7Zm9yO2Y5MCIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cd3JqcGdjb20uYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJIZWFkZXItRGF0ZWllbiIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxqY29uZmlnLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGppbmNsdWRlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiUmVzc291cmNlbmRhdGVpZW4iCisKKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKKyMgRW5kIEdyb3VwCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21ha2V3bWFrLnZjNiBiL21ha2V3bWFrLnZjNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmI5MDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbWFrZXdtYWsudmM2CkBAIC0wLDAgKzEsMTEwIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBCYXNlZCBvbiB3cmpwZ2NvbS5kc3AKKyFJRiAiJChDRkcpIiA9PSAiIgorQ0ZHPXdyanBnY29tIC0gV2luMzIKKyFNRVNTQUdFIEtlaW5lIEtvbmZpZ3VyYXRpb24gYW5nZWdlYmVuLiB3cmpwZ2NvbSAtIFdpbjMyIHdpcmQgYWxzIFN0YW5kYXJkIHZlcndlbmRldC4KKyFFTkRJRiAKKworIUlGICIkKENGRykiICE9ICJ3cmpwZ2NvbSAtIFdpbjMyIgorIU1FU1NBR0UgVW5n/Gx0aWdlIEtvbmZpZ3VyYXRpb24gIiQoQ0ZHKSIgYW5nZWdlYmVuLgorIU1FU1NBR0UgU2llIGv2bm5lbiBiZWltIEF1c2b8aHJlbiB2b24gTk1BS0UgZWluZSBLb25maWd1cmF0aW9uIGFuZ2ViZW4KKyFNRVNTQUdFIGR1cmNoIERlZmluaWVyZW4gZGVzIE1ha3JvcyBDRkcgaW4gZGVyIEJlZmVobHN6ZWlsZS4gWnVtIEJlaXNwaWVsOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAid3JqcGdjb20ubWFrIiBDRkc9IndyanBnY29tIC0gV2luMzIiCishTUVTU0FHRSAKKyFNRVNTQUdFIEb8ciBkaWUgS29uZmlndXJhdGlvbiBzdGVoZW4genVyIEF1c3dhaGw6CishTUVTU0FHRSAKKyFNRVNTQUdFICJ3cmpwZ2NvbSAtIFdpbjMyIiAoYmFzaWVyZW5kIGF1ZiAgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCishRVJST1IgRWluZSB1bmf8bHRpZ2UgS29uZmlndXJhdGlvbiB3dXJkZSBhbmdlZ2ViZW4uCishRU5ESUYgCisKKyFJRiAiJChPUykiID09ICJXaW5kb3dzX05UIgorTlVMTD0KKyFFTFNFIAorTlVMTD1udWwKKyFFTkRJRiAKKworQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorT1VURElSPS5cd3JqcGdjb21cUmVsZWFzZQorSU5URElSPS5cd3JqcGdjb21cUmVsZWFzZQorIyBCZWdpbiBDdXN0b20gTWFjcm9zCitPdXREaXI9Llx3cmpwZ2NvbVxSZWxlYXNlCisjIEVuZCBDdXN0b20gTWFjcm9zCisKK0FMTCA6ICIkKE9VVERJUilcd3JqcGdjb20uZXhlIgorCisKK0NMRUFOIDoKKwktQGVyYXNlICIkKElOVERJUilcdmM2MC5pZGIiCisJLUBlcmFzZSAiJChJTlRESVIpXHdyanBnY29tLm9iaiIKKwktQGVyYXNlICIkKE9VVERJUilcd3JqcGdjb20uZXhlIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworQlNDMzI9YnNjbWFrZS5leGUKK0JTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpXHdyanBnY29tLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSU5LMzI9bGluay5leGUKK0xJTkszMl9GTEFHUz1SZWxlYXNlXGpwZWcubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9pbmNyZW1lbnRhbDpubyAvcGRiOiIkKE9VVERJUilcd3JqcGdjb20ucGRiIiAvbWFjaGluZTpJMzg2IC9vdXQ6IiQoT1VURElSKVx3cmpwZ2NvbS5leGUiIAorTElOSzMyX09CSlM9IFwKKwkiJChJTlRESVIpXHdyanBnY29tLm9iaiIKKworIiQoT1VURElSKVx3cmpwZ2NvbS5leGUiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSU5LMzJfT0JKUykKKyAgICAkKExJTkszMikgQDw8CisgICQoTElOSzMyX0ZMQUdTKSAkKExJTkszMl9PQkpTKQorPDwKKworQ1BQX1BST0o9L25vbG9nbyAvRzYgL01UIC9XMyAvR1ggL094IC9PYSAvT2IyIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRnAiJChJTlRESVIpXHdyanBnY29tLnBjaCIgL1lYIC9GbyIkKElOVERJUilcXCIgL0ZkIiQoSU5URElSKVxcIiAvRkQgL2MgCisKKy5jeyQoSU5URElSKX0ub2JqOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworLmNwcHskKElOVERJUil9Lm9iajo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jeHh7JChJTlRESVIpfS5vYmo6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3skKElOVERJUil9LnNicjo6CisgICAkKENQUCkgQDw8CisgICAkKENQUF9QUk9KKSAkPCAKKzw8CisKKy5jcHB7JChJTlRESVIpfS5zYnI6OgorICAgJChDUFApIEA8PAorICAgJChDUFBfUFJPSikgJDwgCis8PAorCisuY3h4eyQoSU5URElSKX0uc2JyOjoKKyAgICQoQ1BQKSBAPDwKKyAgICQoQ1BQX1BST0opICQ8IAorPDwKKworCishSUYgIiQoTk9fRVhURVJOQUxfREVQUykiICE9ICIxIgorIUlGIEVYSVNUUygid3JqcGdjb20uZGVwIikKKyFJTkNMVURFICJ3cmpwZ2NvbS5kZXAiCishRUxTRSAKKyFNRVNTQUdFIFdhcm5pbmc6IGNhbm5vdCBmaW5kICJ3cmpwZ2NvbS5kZXAiCishRU5ESUYgCishRU5ESUYgCisKKworIUlGICIkKENGRykiID09ICJ3cmpwZ2NvbSAtIFdpbjMyIgorU09VUkNFPS5cd3JqcGdjb20uYworCisiJChJTlRESVIpXHdyanBnY29tLm9iaiIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKworCisKKyFFTkRJRiAKKwpkaWZmIC0tZ2l0IGEvbWFrZXd2Y3AudmM5IGIvbWFrZXd2Y3AudmM5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmRlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtld3ZjcC52YzkKQEAgLTAsMCArMSwxMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LDAwIgorCU5hbWU9IndyanBnY29tIgorCVByb2plY3RHVUlEPSJ7MTc4NjcwRDctRkE3Ri00NEE4LTk2QzctMTFCMUNBMTQyNjlDfSIKKwlSb290TmFtZXNwYWNlPSJ3cmpwZ2NvbSIKKwlLZXl3b3JkPSJXaW4zMlByb2oiCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTk2NjEzIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQcm9qZWN0TmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUHJvamVjdE5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlDaGFyYWN0ZXJTZXQ9IjAiCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjMiCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJmYWxzZSIKKwkJCQlFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPSJ0cnVlIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEU7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJCURpc2FibGVTcGVjaWZpY1dhcm5pbmdzPSI0OTk2IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJRdWVsbGRhdGVpZW4iCisJCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214IgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlx3cmpwZ2NvbS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlcmRhdGVpZW4iCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5camNvbmZpZy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGppbmNsdWRlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUmVzc291cmNlbmRhdGVpZW4iCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXYiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYWtsanBlZy5zdCBiL21ha2xqcGVnLnN0CmluZGV4IDgxMzQ5M2UuLmNjMWJhMDEgMTAwNjQ0Ci0tLSBhL21ha2xqcGVnLnN0CisrKyBiL21ha2xqcGVnLnN0CkBAIC0xLDkgKzEsNyBAQAogOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQogOwogOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUsIEIuIFNldHplcGZhbmR0LCBhbmQgR3VpZG8gVm9sbGJlZGluZy4KIDsKIDsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGxpYmpwZWcucHJqLgogOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQpAQCAtMjIsMzYgKzIwLDM3IEBACiAuTFstSl0gICAgICAgIDsgbGluayBuZXcgT2JqLWZvcm1hdCAoc28gd2UgZ2V0IGEgbGlicmFyeSkKID0KIDsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK2phcmljb20uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQogamNhcGltaW4uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQogamNhcGlzdGQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNhcml0aC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY2NvZWZjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY2NvbG9yLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKIGpjZGN0bWdyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qY2h1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpjaHVmZi5oKQoramNodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKIGpjaW5pdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY21haW5jdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY21hcmtlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY21hc3Rlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY29tYXBpLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKIGpjcGFyYW0uYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQotamNwaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamNodWZmLmgpCiBqY3ByZXBjdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY3NhbXBsZS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqY3RyYW5zLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKIGpkYXBpbWluLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKIGpkYXBpc3RkLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkYXJpdGguYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQogamRhdGFkc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgpCiBqZGF0YXNyYy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCkKIGpkY29lZmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKIGpkY29sb3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQogamRkY3RtZ3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKLWpkaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRodWZmLmgpCitqZGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQogamRpbnB1dC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqZG1haW5jdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqZG1hcmtlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqZG1hc3Rlci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqZG1lcmdlLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKLWpkcGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkaHVmZi5oKQogamRwb3N0Y3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQogamRzYW1wbGUuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQogamR0cmFucy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCkBAIC02Miw3ICs2MSw2IEBACiBqaWRjdGZsdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQogamlkY3Rmc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKIGppZGN0aW50LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCi1qaWRjdHJlZC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoganF1YW50MS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCiBqcXVhbnQyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKIGp1dGlscy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCmRpZmYgLS1naXQgYS9tYWt0anBlZy5zdCBiL21ha3RqcGVnLnN0CmluZGV4IDMxZjRkMTYuLjQzZjA3OGEgMTAwNjQ0Ci0tLSBhL21ha3RqcGVnLnN0CisrKyBiL21ha3RqcGVnLnN0CkBAIC0xLDkgKzEsNyBAQAogOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQogOwogOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCi07IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCi07IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAotOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUsIEIuIFNldHplcGZhbmR0LCBhbmQgR3VpZG8gVm9sbGJlZGluZy4KIDsKIDsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGpwZWd0cmFuLnByai4KIDsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgpkaWZmIC0tZ2l0IGEvbWlzc2luZyBiL21pc3NpbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjgwNTVkMgotLS0gL2Rldi9udWxsCisrKyBiL21pc3NpbmcKQEAgLTAsMCArMSwzNzYgQEAKKyMhIC9iaW4vc2gKKyMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCisKK3NjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisjIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICBleGl0IDEKK2ZpCisKK3J1bj06CitzZWRfb3V0cHV0PSdzLy4qIC0tb3V0cHV0WyA9XVwoW14gXSpcKS4qL1wxL3AnCitzZWRfbWludXNvPSdzLy4qIC1vIFwoW14gXSpcKS4qL1wxL3AnCisKKyMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKKyMgc3JjZGlyIGFscmVhZHkuCitpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCitlbHNlCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KK2ZpCisKK21zZz0ibWlzc2luZyBvbiB5b3VyIHN5c3RlbSIKKworY2FzZSAkMSBpbgorLS1ydW4pCisgICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KKyAgcnVuPQorICBzaGlmdAorICAiJEAiICYmIGV4aXQgMAorICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCisgICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KKyAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQorICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCisgICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgorICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KKyAgICBydW49OgorICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKKyAgZmkKKyAgOzsKKworICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisgICAgZWNobyAiXAorJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCisKK0hhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KK2Vycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKKworU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgorICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCisgIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJworICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJworICBhdXRvbTR0ZSAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlLCBvciBjcmVhdGUgYSBzdHViIG9uZQorICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCisgIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKyAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCisgIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKworVmVyc2lvbiBzdWZmaXhlcyB0byBQUk9HUkFNIGFzIHdlbGwgYXMgdGhlIHByZWZpeGVzIFxgZ251LScsIFxgZ251JywgYW5kCitcYGcnIGFyZSBpZ25vcmVkIHdoZW4gY2hlY2tpbmcgdGhlIG5hbWUuCisKK1NlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQorICAgIGVjaG8gIm1pc3NpbmcgJHNjcmlwdHZlcnNpb24gKEdOVSBBdXRvbWFrZSkiCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLSopCisgICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCisgICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICAgIGV4aXQgMQorICAgIDs7CisKK2VzYWMKKworIyBub3JtYWxpemUgcHJvZ3JhbSBuYW1lIHRvIGNoZWNrIGZvci4KK3Byb2dyYW09YGVjaG8gIiQxIiB8IHNlZCAnCisgIHMvXmdudS0vLzsgdAorICBzL15nbnUvLzsgdAorICBzL15nLy87IHQnYAorCisjIE5vdyBleGl0IGlmIHdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuICBBbHNvIGV4aXQgbm93IGlmIHdlCisjIGRvbid0IGhhdmUgaXQgYW5kIC0tdmVyc2lvbiB3YXMgcGFzc2VkIChtb3N0IGxpa2VseSB0byBkZXRlY3QKKyMgdGhlIHByb2dyYW0pLiAgVGhpcyBpcyBhYm91dCBub24tR05VIHByb2dyYW1zLCBzbyB1c2UgJDEgbm90CisjICRwcm9ncmFtLgorY2FzZSAkMSBpbgorICBsZXgqfHlhY2MqKQorICAgICMgTm90IEdOVSBwcm9ncmFtcywgdGhleSBkb24ndCBoYXZlIC0tdmVyc2lvbi4KKyAgICA7OworCisgIHRhciopCisgICAgaWYgdGVzdCAtbiAiJHJ1biI7IHRoZW4KKyAgICAgICBlY2hvIDE+JjIgIkVSUk9SOiBcYHRhcicgcmVxdWlyZXMgLS1ydW4iCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgorICAgICAgIGV4aXQgMQorICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCisgICAgICAgIyBDb3VsZCBub3QgcnVuIC0tdmVyc2lvbiBvciAtLWhlbHAuICBUaGlzIGlzIHByb2JhYmx5IHNvbWVvbmUKKyAgICAgICAjIHJ1bm5pbmcgYCRUT09MIC0tdmVyc2lvbicgb3IgYCRUT09MIC0taGVscCcgdG8gY2hlY2sgd2hldGhlcgorICAgICAgICMgJFRPT0wgZXhpc3RzIGFuZCBub3Qga25vd2luZyAkVE9PTCB1c2VzIG1pc3NpbmcuCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICA7OworZXNhYworCisjIElmIGl0IGRvZXMgbm90IGV4aXN0LCBvciBmYWlscyB0byBydW4gKHBvc3NpYmx5IGFuIG91dGRhdGVkIHZlcnNpb24pLAorIyB0cnkgdG8gZW11bGF0ZSBpdC4KK2Nhc2UgJHByb2dyYW0gaW4KKyAgYWNsb2NhbCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZiopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQorICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisgICAgdG91Y2ggY29uZmlndXJlCisgICAgOzsKKworICBhdXRvaGVhZGVyKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KKyAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyAke2NvbmZpZ3VyZV9hY31gCisgICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCisgICAgdG91Y2hfZmlsZXM9CisgICAgZm9yIGYgaW4gJGZpbGVzOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCisgICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KKyAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAorCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8CisJICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCisgICAgOzsKKworICBhdXRvbTR0ZSopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGJ1dCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgorICAgICAgICAgWW91IGNhbiBnZXQgXGAkMScgYXMgcGFydCBvZiBcYEF1dG9jb25mJyBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiIyEgL2Jpbi9zaCIKKwllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKKwllY2hvICIjICAkICRAIgorCWVjaG8gImV4aXQgMCIKKwljaG1vZCAreCAkZmlsZQorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBiaXNvbip8eWFjYyopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKKyAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKKyAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAorICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAkTEFTVEFSRyBpbgorCSoueSkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgorCWVjaG8gPnkudGFiLmgKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleCp8ZmxleCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiBsZXgueXkuYworICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAkTEFTVEFSRyBpbgorCSoubCkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYworCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgbGV4Lnl5LmM7IHRoZW4KKwllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCisgICAgZmkKKyAgICA7OworCisgIGhlbHAybWFuKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCisJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQorCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgorCWV4aXQgJD8KKyAgICBmaQorICAgIDs7CisKKyAgbWFrZWluZm8qKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQorICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCisgICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAorICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCisgICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgICMgVGhlIGZpbGUgdG8gdG91Y2ggaXMgdGhhdCBzcGVjaWZpZWQgd2l0aCAtbyAuLi4KKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCisgICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KKyAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAorICAgICAgZmlsZT1gc2VkIC1uICcKKwkvXkBzZXRmaWxlbmFtZS97CisJICBzLy4qIFwoW14gXSpcKSAqJC9cMS8KKwkgIHAKKwkgIHEKKwl9JyAkaW5maWxlYAorICAgICAgIyAuLi4gb3IgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgbmFtZSAoZGlyL2YudGV4aSBiZWNvbWVzIGYuaW5mbykKKyAgICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkaW5maWxlIiB8IHNlZCAncywuKi8sLDtzLC5bXi5dKiQsLCdgLmluZm8KKyAgICBmaQorICAgICMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSB1c2VyIHJlYWxseSBuZWVkcyBtYWtlaW5mbzsKKyAgICAjIGxldCdzIGZhaWwgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KKyAgICB0ZXN0IC1mICRmaWxlIHx8IGV4aXQgMQorICAgIHRvdWNoICRmaWxlCisgICAgOzsKKworICB0YXIqKQorICAgIHNoaWZ0CisKKyAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KKyAgICAjIExvb2sgZm9yIGdudXRhci9ndGFyIGJlZm9yZSBpbnZvY2F0aW9uIHRvIGF2b2lkIHVnbHkgZXJyb3IKKyAgICAjIG1lc3NhZ2VzLgorICAgIGlmIChnbnV0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgICAgZ251dGFyICIkQCIgJiYgZXhpdCAwCisgICAgZmkKKyAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBndGFyICIkQCIgJiYgZXhpdCAwCisgICAgZmkKKyAgICBmaXJzdGFyZz0iJDEiCisgICAgaWYgc2hpZnQ7IHRoZW4KKwljYXNlICRmaXJzdGFyZyBpbgorCSpvKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKwljYXNlICRmaXJzdGFyZyBpbgorCSpoKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKyAgICBmaQorCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCisgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAorICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZworICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKKyAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKKyAgICBleGl0IDEKKyAgICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvcmRqcGdjb20uMSBiL3JkanBnY29tLjEKaW5kZXggMmJiYTA0ZS4uOTc2MTFkZiAxMDA2NDQKLS0tIGEvcmRqcGdjb20uMQorKysgYi9yZGpwZ2NvbS4xCkBAIC0xLDkgKzEsMTIgQEAKLS5USCBSREpQR0NPTSAxICIxMSBPY3RvYmVyIDE5OTciCisuVEggUkRKUEdDT00gMSAiMDIgQXByaWwgMjAwOSIKIC5TSCBOQU1FCiByZGpwZ2NvbSBcLSBkaXNwbGF5IHRleHQgY29tbWVudHMgZnJvbSBhIEpQRUcgZmlsZQogLlNIIFNZTk9QU0lTCiAuQiByZGpwZ2NvbQogWworLkIgXC1yYXcKK10KK1sKIC5CIFwtdmVyYm9zZQogXQogWwpAQCAtMjUsNiArMjgsMTIgQEAKIHRoZW0gYXMgeW91IGxpa2UgaW4gb25lIEpQRUcgZmlsZS4KIC5TSCBPUFRJT05TCiAuVFAKKy5CIFwtcmF3CitOb3JtYWxseQorLkIgcmRqcGdjb20KK2VzY2FwZXMgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGluIGNvbW1lbnRzLCBmb3Igc2VjdXJpdHkgcmVhc29ucy4KK1RoaXMgb3B0aW9uIGF2b2lkcyB0aGF0LgorLlBQCiAuQiBcLXZlcmJvc2UKIENhdXNlcwogLkIgcmRqcGdjb20KZGlmZiAtLWdpdCBhL3JkanBnY29tLmMgYi9yZGpwZ2NvbS5jCmluZGV4IGZmZTZmYzYuLjM3MTkxNTQgMTAwNjQ0Ci0tLSBhL3JkanBnY29tLmMKKysrIGIvcmRqcGdjb20uYwpAQCAtMiw2ICsyLDcgQEAKICAqIHJkanBnY29tLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDA5IGJ5IEJpbGwgQWxsb21iZXJ0LCBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC0xNCw2ICsxNSw5IEBACiAjZGVmaW5lIEpQRUdfQ0pQRUdfREpQRUcJLyogdG8gZ2V0IHRoZSBjb21tYW5kLWxpbmUgY29uZmlnIHN5bWJvbHMgKi8KICNpbmNsdWRlICJqaW5jbHVkZS5oIgkJLyogZ2V0IGF1dG8tY29uZmlnIHN5bWJvbHMsIDxzdGRpby5oPiAqLwogCisjaWZkZWYgSEFWRV9MT0NBTEVfSAorI2luY2x1ZGUgPGxvY2FsZS5oPgkJLyogQmlsbCBBbGxvbWJlcnQ6IHVzZSBsb2NhbGUgZm9yIGlzcHJpbnQgKi8KKyNlbmRpZgogI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzdXBwZXIoKSwgdG9sb3dlcigpICovCiAjaWZkZWYgVVNFX1NFVE1PREUKICNpbmNsdWRlIDxmY250bC5oPgkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkncyBwYXJhbWV0ZXIgbWFjcm9zICovCkBAIC0yMTgsMTIgKzIyMiwxNyBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1wcm9jZXNzX0NPTSAodm9pZCkKK3Byb2Nlc3NfQ09NIChpbnQgcmF3KQogewogICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwogICBpbnQgY2g7CiAgIGludCBsYXN0Y2ggPSAwOwogCisgIC8qIEJpbGwgQWxsb21iZXJ0OiBzZXQgbG9jYWxlIHByb3Blcmx5IGZvciBpc3ByaW50ICovCisjaWZkZWYgSEFWRV9MT0NBTEVfSAorICBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKKyNlbmRpZgorCiAgIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KICAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CiAgIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLwpAQCAtMjMzLDEyICsyNDIsMTQgQEAKIAogICB3aGlsZSAobGVuZ3RoID4gMCkgewogICAgIGNoID0gcmVhZF8xX2J5dGUoKTsKKyAgICBpZiAocmF3KSB7CisgICAgICBwdXRjKGNoLCBzdGRvdXQpOwogICAgIC8qIEVtaXQgdGhlIGNoYXJhY3RlciBpbiBhIHJlYWRhYmxlIGZvcm0uCiAgICAgICogTm9ucHJpbnRhYmxlcyBhcmUgY29udmVydGVkIHRvIFxubm4gZm9ybSwKICAgICAgKiB3aGlsZSBcIGlzIGNvbnZlcnRlZCB0byBcXC4KICAgICAgKiBOZXdsaW5lcyBpbiBDUiwgQ1IvTEYsIG9yIExGIGZvcm0gd2lsbCBiZSBwcmludGVkIGFzIG9uZSBuZXdsaW5lLgogICAgICAqLwotICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CiAgICAgICBwcmludGYoIlxuIik7CiAgICAgfSBlbHNlIGlmIChjaCA9PSAnXG4nKSB7CiAgICAgICBpZiAobGFzdGNoICE9ICdccicpCkBAIC0yNTQsNiArMjY1LDExIEBACiAgICAgbGVuZ3RoLS07CiAgIH0KICAgcHJpbnRmKCJcbiIpOworCisgIC8qIEJpbGwgQWxsb21iZXJ0OiByZXZlcnQgdG8gQyBsb2NhbGUgKi8KKyNpZmRlZiBIQVZFX0xPQ0FMRV9ICisgIHNldGxvY2FsZShMQ19DVFlQRSwgIkMiKTsKKyNlbmRpZgogfQogCiAKQEAgLTMyMSw3ICszMzcsNyBAQAogICovCiAKIHN0YXRpYyBpbnQKLXNjYW5fSlBFR19oZWFkZXIgKGludCB2ZXJib3NlKQorc2Nhbl9KUEVHX2hlYWRlciAoaW50IHZlcmJvc2UsIGludCByYXcpCiB7CiAgIGludCBtYXJrZXI7CiAKQEAgLTM2Miw3ICszNzgsNyBAQAogICAgICAgcmV0dXJuIG1hcmtlcjsKIAogICAgIGNhc2UgTV9DT006Ci0gICAgICBwcm9jZXNzX0NPTSgpOworICAgICAgcHJvY2Vzc19DT00ocmF3KTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBNX0FQUDEyOgpAQCAtMzcxLDcgKzM4Nyw3IEBACiAgICAgICAgKi8KICAgICAgIGlmICh2ZXJib3NlKSB7CiAJcHJpbnRmKCJBUFAxMiBjb250YWluczpcbiIpOwotCXByb2Nlc3NfQ09NKCk7CisJcHJvY2Vzc19DT00ocmF3KTsKICAgICAgIH0gZWxzZQogCXNraXBfdmFyaWFibGUoKTsKICAgICAgIGJyZWFrOwpAQCAtMzk4LDYgKzQxNCw3IEBACiAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtzd2l0Y2hlc10gW2lucHV0ZmlsZV1cbiIsIHByb2duYW1lKTsKIAogICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcmF3ICAgICAgICBEaXNwbGF5IG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBpbiBjb21tZW50cyAodW5zYWZlKVxuIik7CiAgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgICBBbHNvIGRpc3BsYXkgZGltZW5zaW9ucyBvZiBKUEVHIGltYWdlXG4iKTsKIAogICBleGl0KEVYSVRfRkFJTFVSRSk7CkBAIC00MzgsNyArNDU1LDcgQEAKIHsKICAgaW50IGFyZ247CiAgIGNoYXIgKiBhcmc7Ci0gIGludCB2ZXJib3NlID0gMDsKKyAgaW50IHZlcmJvc2UgPSAwLCByYXcgPSAwOwogCiAgIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCiAjaWZkZWYgVVNFX0NDT01NQU5ECkBAIC00NTcsNiArNDc0LDggQEAKICAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIG92ZXIgJy0nICovCiAgICAgaWYgKGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgewogICAgICAgdmVyYm9zZSsrOworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmF3IiwgMSkpIHsKKyAgICAgIHJhdyA9IDE7CiAgICAgfSBlbHNlCiAgICAgICB1c2FnZSgpOwogICB9CkBAIC00ODgsNyArNTA3LDcgQEAKICAgfQogCiAgIC8qIFNjYW4gdGhlIEpQRUcgaGVhZGVycy4gKi8KLSAgKHZvaWQpIHNjYW5fSlBFR19oZWFkZXIodmVyYm9zZSk7CisgICh2b2lkKSBzY2FuX0pQRUdfaGVhZGVyKHZlcmJvc2UsIHJhdyk7CiAKICAgLyogQWxsIGRvbmUuICovCiAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKZGlmZiAtLWdpdCBhL3JkcHBtLmMgYi9yZHBwbS5jCmluZGV4IDFkZjM1YzEuLmE3NTcwMjIgMTAwNjQ0Ci0tLSBhL3JkcHBtLmMKKysrIGIvcmRwcG0uYwpAQCAtMiw2ICsyLDcgQEAKICAqIHJkcHBtLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDA5IGJ5IEJpbGwgQWxsb21iZXJ0LCBHdWlkbyBWb2xsYmVkaW5nLgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KICAqCkBAIC0yNTAsOCArMjUxLDggQEAKICAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKICAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CiAgICAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKLSAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7CisgICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OworICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKyk7CiAgICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKICAgfQogICByZXR1cm4gMTsKQEAgLTI3NCwxNCArMjc1LDE0IEBACiAgIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7CiAgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgewogICAgIHJlZ2lzdGVyIGludCB0ZW1wOwotICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7Ci0gICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OworICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKKyAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspOwogICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07Ci0gICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKLSAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7CisgICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OworICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKyk7CiAgICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKLSAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOwotICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKKyAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7CisgICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKTsKICAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOwogICB9CiAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvcmRzd2l0Y2guYyBiL3Jkc3dpdGNoLmMKaW5kZXggNGY0YmI0Zi4uN2E4MzlhZiAxMDA2NDQKLS0tIGEvcmRzd2l0Y2guYworKysgYi9yZHN3aXRjaC5jCkBAIC05LDYgKzksNyBAQAogICogY29tbWFuZC1saW5lIHN3aXRjaGVzLiAgU3dpdGNoZXMgcHJvY2Vzc2VkIGhlcmUgYXJlOgogICoJLXF0YWJsZXMgZmlsZQkJUmVhZCBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGV4dCBmaWxlCiAgKgktc2NhbnMgZmlsZQkJUmVhZCBzY2FuIHNjcmlwdCBmcm9tIHRleHQgZmlsZQorICoJLXF1YWxpdHkgTlssTiwuLi5dCVNldCBxdWFsaXR5IHJhdGluZ3MKICAqCS1xc2xvdHMgTlssTiwuLi5dCVNldCBjb21wb25lbnQgcXVhbnRpemF0aW9uIHRhYmxlIHNlbGVjdG9ycwogICoJLXNhbXBsZSBIeFZbLEh4ViwuLi5dCVNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9ycwogICovCkBAIC03MCw4ICs3MSw3IEBACiAKIAogR0xPQkFMKGJvb2xlYW4pCi1yZWFkX3F1YW50X3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKLQkJICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKK3JlYWRfcXVhbnRfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQogLyogUmVhZCBhIHNldCBvZiBxdWFudGl6YXRpb24gdGFibGVzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLgogICogVGhlIGZpbGUgaXMgcGxhaW4gQVNDSUkgdGV4dDogZGVjaW1hbCBudW1iZXJzIHdpdGggd2hpdGVzcGFjZSBiZXR3ZWVuLgogICogQ29tbWVudHMgcHJlY2VkZWQgYnkgJyMnIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsZS4KQEAgLTEwOCw3ICsxMDgsOCBAQAogICAgICAgfQogICAgICAgdGFibGVbaV0gPSAodW5zaWduZWQgaW50KSB2YWw7CiAgICAgfQotICAgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCB0YmxubywgdGFibGUsIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworICAgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCB0YmxubywgdGFibGUsIGNpbmZvLT5xX3NjYWxlX2ZhY3Rvclt0Ymxub10sCisJCQkgZm9yY2VfYmFzZWxpbmUpOwogICAgIHRibG5vKys7CiAgIH0KIApAQCAtMjYzLDYgKzI2NCwzOCBAQAogCiAKIEdMT0JBTChib29sZWFuKQorc2V0X3F1YWxpdHlfcmF0aW5ncyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZywgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKKy8qIFByb2Nlc3MgYSBxdWFsaXR5LXJhdGluZ3MgcGFyYW1ldGVyIHN0cmluZywgb2YgdGhlIGZvcm0KKyAqICAgICBOWyxOLC4uLl0KKyAqIElmIHRoZXJlIGFyZSBtb3JlIHEtdGFibGUgc2xvdHMgdGhhbiBwYXJhbWV0ZXJzLCB0aGUgbGFzdCB2YWx1ZSBpcyByZXBsaWNhdGVkLgorICovCit7CisgIGludCB2YWwgPSA3NTsJCQkvKiBkZWZhdWx0IHZhbHVlICovCisgIGludCB0YmxubzsKKyAgY2hhciBjaDsKKworICBmb3IgKHRibG5vID0gMDsgdGJsbm8gPCBOVU1fUVVBTlRfVEJMUzsgdGJsbm8rKykgeworICAgIGlmICgqYXJnKSB7CisgICAgICBjaCA9ICcsJzsJCQkvKiBpZiBub3Qgc2V0IGJ5IHNzY2FuZiwgd2lsbCBiZSAnLCcgKi8KKyAgICAgIGlmIChzc2NhbmYoYXJnLCAiJWQlYyIsICZ2YWwsICZjaCkgPCAxKQorCXJldHVybiBGQUxTRTsKKyAgICAgIGlmIChjaCAhPSAnLCcpCQkvKiBzeW50YXggY2hlY2sgKi8KKwlyZXR1cm4gRkFMU0U7CisgICAgICAvKiBDb252ZXJ0IHVzZXIgMC0xMDAgcmF0aW5nIHRvIHBlcmNlbnRhZ2Ugc2NhbGluZyAqLworICAgICAgY2luZm8tPnFfc2NhbGVfZmFjdG9yW3RibG5vXSA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHZhbCk7CisgICAgICB3aGlsZSAoKmFyZyAmJiAqYXJnKysgIT0gJywnKSAvKiBhZHZhbmNlIHRvIG5leHQgc2VnbWVudCBvZiBhcmcgc3RyaW5nICovCisJOworICAgIH0gZWxzZSB7CisgICAgICAvKiByZWFjaGVkIGVuZCBvZiBwYXJhbWV0ZXIsIHNldCByZW1haW5pbmcgZmFjdG9ycyB0byBsYXN0IHZhbHVlICovCisgICAgICBjaW5mby0+cV9zY2FsZV9mYWN0b3JbdGJsbm9dID0ganBlZ19xdWFsaXR5X3NjYWxpbmcodmFsKTsKKyAgICB9CisgIH0KKyAganBlZ19kZWZhdWx0X3F0YWJsZXMoY2luZm8sIGZvcmNlX2Jhc2VsaW5lKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworR0xPQkFMKGJvb2xlYW4pCiBzZXRfcXVhbnRfc2xvdHMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpCiAvKiBQcm9jZXNzIGEgcXVhbnRpemF0aW9uLXRhYmxlLXNlbGVjdG9ycyBwYXJhbWV0ZXIgc3RyaW5nLCBvZiB0aGUgZm9ybQogICogICAgIE5bLE4sLi4uXQpkaWZmIC0tZ2l0IGEvc3RydWN0dXJlLmRvYyBiL3N0cnVjdHVyZS50eHQKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gc3RydWN0dXJlLmRvYwpyZW5hbWUgdG8gc3RydWN0dXJlLnR4dAppbmRleCA1MWM5ZGVmLi5mZTg4NzAxIDEwMDY0NAotLS0gYS9zdHJ1Y3R1cmUuZG9jCisrKyBiL3N0cnVjdHVyZS50eHQKQEAgLTEsNiArMSw2IEBACiBJSkcgSlBFRyBMSUJSQVJZOiAgU1lTVEVNIEFSQ0hJVEVDVFVSRQogCi1Db3B5cmlnaHQgKEMpIDE5OTEtMTk5NSwgVGhvbWFzIEcuIExhbmUuCitDb3B5cmlnaHQgKEMpIDE5OTEtMjAwOSwgVGhvbWFzIEcuIExhbmUsIEd1aWRvIFZvbGxiZWRpbmcuCiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogCkBAIC0xMiw5ICsxMiw5IEBACiAKIFdlIGFzc3VtZSB0aGF0IHRoZSByZWFkZXIgaXMgYWxyZWFkeSBzb21ld2hhdCBmYW1pbGlhciB3aXRoIHRoZSBKUEVHIHN0YW5kYXJkLgogVGhlIFJFQURNRSBmaWxlIGluY2x1ZGVzIHJlZmVyZW5jZXMgZm9yIGxlYXJuaW5nIGFib3V0IEpQRUcuICBUaGUgZmlsZQotbGlianBlZy5kb2MgZGVzY3JpYmVzIHRoZSBsaWJyYXJ5IGZyb20gdGhlIHZpZXdwb2ludCBvZiBhbiBhcHBsaWNhdGlvbgorbGlianBlZy50eHQgZGVzY3JpYmVzIHRoZSBsaWJyYXJ5IGZyb20gdGhlIHZpZXdwb2ludCBvZiBhbiBhcHBsaWNhdGlvbgogcHJvZ3JhbW1lciB1c2luZyB0aGUgbGlicmFyeTsgaXQncyBiZXN0IHRvIHJlYWQgdGhhdCBmaWxlIGJlZm9yZSB0aGlzIG9uZS4KLUFsc28sIHRoZSBmaWxlIGNvZGVydWxlcy5kb2MgZGVzY3JpYmVzIHRoZSBjb2Rpbmcgc3R5bGUgY29udmVudGlvbnMgd2UgdXNlLgorQWxzbywgdGhlIGZpbGUgY29kZXJ1bGVzLnR4dCBkZXNjcmliZXMgdGhlIGNvZGluZyBzdHlsZSBjb252ZW50aW9ucyB3ZSB1c2UuCiAKIEluIHRoaXMgZG9jdW1lbnQsIEpQRUctc3BlY2lmaWMgdGVybWlub2xvZ3kgZm9sbG93cyB0aGUgSlBFRyBzdGFuZGFyZDoKICAgQSAiY29tcG9uZW50IiBtZWFucyBhIGNvbG9yIGNoYW5uZWwsIGUuZy4sIFJlZCBvciBMdW1pbmFuY2UuCkBAIC02MCw5ICs2MCw2IEBACiBydW4tdGltZSBvcHRpb24sIGJlY2F1c2UgbW9zdCBtYWNoaW5lcyBjYW4gc3RvcmUgOC1iaXQgcGl4ZWxzIG11Y2ggbW9yZQogY29tcGFjdGx5IHRoYW4gMTItYml0LgogCi1Gb3IgbGVnYWwgcmVhc29ucywgSlBFRyBhcml0aG1ldGljIGNvZGluZyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgYnV0Ci1leHRlbmRpbmcgdGhlIGxpYnJhcnkgdG8gaW5jbHVkZSBpdCB3b3VsZCBiZSBzdHJhaWdodGZvcndhcmQuCi0KIEJ5IGl0c2VsZiwgdGhlIGxpYnJhcnkgaGFuZGxlcyBvbmx5IGludGVyY2hhbmdlIEpQRUcgZGF0YXN0cmVhbXMgLS0tIGluCiBwYXJ0aWN1bGFyIHRoZSB3aWRlbHkgdXNlZCBKRklGIGZpbGUgZm9ybWF0LiAgVGhlIGxpYnJhcnkgY2FuIGJlIHVzZWQgYnkKIHN1cnJvdW5kaW5nIGNvZGUgdG8gcHJvY2VzcyBpbnRlcmNoYW5nZSBvciBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zIHRoYXQKQEAgLTQ1Nyw4ICs0NTQsOCBAQAogICBidWZmZXJlZCBieSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBoYXZlIE5PVCBiZWVuIGRlcXVhbnRpemVkOyB3ZQogICBtZXJnZSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1QgaW50byBhIHNpbmdsZSBzdGVwIGZvciBzcGVlZCByZWFzb25zLgogICBXaGVuIHNjYWxlZC1kb3duIG91dHB1dCBpcyBhc2tlZCBmb3IsIHNpbXBsaWZpZWQgRENUIGFsZ29yaXRobXMgbWF5IGJlIHVzZWQKLSAgdGhhdCBlbWl0IG9ubHkgMXgxLCAyeDIsIG9yIDR4NCBzYW1wbGVzIHBlciBEQ1QgYmxvY2ssIG5vdCB0aGUgZnVsbCA4eDguCi0gIFdvcmtzIG9uIG9uZSBEQ1QgYmxvY2sgYXQgYSB0aW1lLgorICB0aGF0IG5lZWQgZmV3ZXIgY29lZmZpY2llbnRzIGFuZCBlbWl0IGZld2VyIHNhbXBsZXMgcGVyIERDVCBibG9jaywgbm90IHRoZQorICBmdWxsIDh4OC4gIFdvcmtzIG9uIG9uZSBEQ1QgYmxvY2sgYXQgYSB0aW1lLgogCiAqIFBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgY29sb3IgcXVhbnRpemF0aW9uCiAgIGlucHV0IGJ1ZmZlciwgd2hlbiBxdWFudGl6YXRpb24gaXMgaW4gdXNlLiAgKFdpdGhvdXQgcXVhbnRpemF0aW9uLCB0aGlzCkBAIC01NDEsNyArNTM4LDcgQEAKIGV4dHJhIGRpc3BsYXkgcGFzc2VzIHdoZW4gZGF0YSBpcyBhcnJpdmluZyBmYXN0ZXIgdGhhbiB0aGUgZGlzcGxheSBwYXNzCiBjYW4gcnVuLiAgRnVydGhlcm1vcmUsIGl0IGlzIHBvc3NpYmxlIHRvIGFib3J0IGFuIG91dHB1dCBwYXNzIHdpdGhvdXQKIGxvc2luZyBhbnl0aGluZywgc2luY2UgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyByZWFkLW9ubHkgYXMgZmFyIGFzIHRoZQotb3V0cHV0IHNlY3Rpb24gaXMgY29uY2VybmVkLiAgU2VlIGxpYmpwZWcuZG9jIGZvciBtb3JlIGRldGFpbC4KK291dHB1dCBzZWN0aW9uIGlzIGNvbmNlcm5lZC4gIFNlZSBsaWJqcGVnLnR4dCBmb3IgbW9yZSBkZXRhaWwuCiAKIEEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBhcnJheSBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIEpQRUcgZmlsZSBoYXMgbXVsdGlwbGUKIHNjYW5zIChvciBpZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGJ1ZmZlcmVkLWltYWdlIG1vZGUgYW55d2F5KS4gIFdoZW4KQEAgLTU4OSw4ICs1ODYsNyBAQAogV2l0aCB0aGVzZSBjb252ZW50aW9ucywgSlNBTVBMRSB2YWx1ZXMgY2FuIGJlIGFzc3VtZWQgdG8gYmUgPj0gMC4gIFRoaXMgaGVscHMKIHNpbXBsaWZ5IGNvcnJlY3Qgcm91bmRpbmcgZHVyaW5nIGRvd25zYW1wbGluZywgZXRjLiAgVGhlIEpQRUcgc3RhbmRhcmQncwogc3BlY2lmaWNhdGlvbiB0aGF0IHNhbXBsZSB2YWx1ZXMgcnVuIGZyb20gLTEyOC4uMTI3IGlzIGFjY29tbW9kYXRlZCBieQotc3VidHJhY3RpbmcgMTI4IGp1c3QgYXMgdGhlIHNhbXBsZSB2YWx1ZSBpcyBjb3BpZWQgaW50byB0aGUgc291cmNlIGFycmF5IGZvcgotdGhlIERDVCBzdGVwICh0aGlzIHdpbGwgYmUgYW4gYXJyYXkgb2Ygc2lnbmVkIGludHMpLiAgU2ltaWxhcmx5LCBkdXJpbmcKK3N1YnRyYWN0aW5nIDEyOCBmcm9tIHRoZSBzYW1wbGUgdmFsdWUgaW4gdGhlIERDVCBzdGVwLiAgU2ltaWxhcmx5LCBkdXJpbmcKIGRlY29tcHJlc3Npb24gdGhlIG91dHB1dCBvZiB0aGUgSURDVCBzdGVwIHdpbGwgYmUgaW1tZWRpYXRlbHkgc2hpZnRlZCBiYWNrIHRvCiAwLi4yNTUuICAoTkI6IGRpZmZlcmVudCB2YWx1ZXMgYXJlIHJlcXVpcmVkIHdoZW4gMTItYml0IHNhbXBsZXMgYXJlIGluIHVzZS4KIFRoZSBjb2RlIGlzIHdyaXR0ZW4gaW4gdGVybXMgb2YgTUFYSlNBTVBMRSBhbmQgQ0VOVEVSSlNBTVBMRSwgd2hpY2ggd2lsbCBiZQpAQCAtNjg1LDcgKzY4MSw3IEBACiAKIFRoaXMgc2NlbmFyaW8gaXMgc3VwcG9ydGVkIGZvciBzaW1wbGUgY2FzZXMuICAoRm9yIGFueXRoaW5nIG1vcmUgY29tcGxleCwgd2UKIHJlY29tbWVuZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiAiYml0ZSB0aGUgYnVsbGV0IiBhbmQgZGV2ZWxvcCByZWFsIG11bHRpdGFza2luZwotY2FwYWJpbGl0eS4pICBUaGUgbGlianBlZy5kb2MgZmlsZSBnb2VzIGludG8gbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHVzYWdlIGFuZAorY2FwYWJpbGl0eS4pICBUaGUgbGlianBlZy50eHQgZmlsZSBnb2VzIGludG8gbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHVzYWdlIGFuZAogbGltaXRhdGlvbnMgb2YgdGhpcyBjYXBhYmlsaXR5OyBoZXJlIHdlIGFkZHJlc3MgdGhlIGltcGxpY2F0aW9ucyBmb3IgbGlicmFyeQogc3RydWN0dXJlLgogCkBAIC03MzMsMTMgKzcyOSwxNCBAQAogd2l0aG91dCBjYXVzaW5nIHByb2JsZW1zOyBvdGhlcndpc2UgYSA2NEsgYnVmZmVyIHdvdWxkIGJlIG5lZWRlZCBpbiB0aGUgd29yc3QKIGNhc2UuKQogCi1UaGUgSlBFRyBtYXJrZXIgd3JpdGVyIGN1cnJlbnRseSBkb2VzICpub3QqIGNvcGUgd2l0aCBzdXNwZW5zaW9uLiAgSSBmZWVsIHRoYXQKLXRoaXMgaXMgbm90IG5lY2Vzc2FyeTsgaXQgaXMgbXVjaCBlYXNpZXIgc2ltcGx5IHRvIHJlcXVpcmUgdGhlIGFwcGxpY2F0aW9uIHRvCi1lbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciBzcGFjZSBiZWZvcmUgc3RhcnRpbmcuICAoQW4gZW1wdHkgMksgYnVmZmVyIGlzCi1tb3JlIHRoYW4gc3VmZmljaWVudCBmb3IgdGhlIGhlYWRlciBtYXJrZXJzOyBhbmQgZW5zdXJpbmcgdGhlcmUgYXJlIGEgZG96ZW4gb3IKLXR3byBieXRlcyBhdmFpbGFibGUgYmVmb3JlIGNhbGxpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKSB3aWxsIHN1ZmZpY2UgZm9yIHRoZQotdHJhaWxlci4pICBUaGlzIHdvdWxkIG5vdCB3b3JrIGZvciB3cml0aW5nIG11bHRpLXNjYW4gSlBFRyBmaWxlcywgYnV0Ci13ZSBzaW1wbHkgZG8gbm90IGludGVuZCB0byBzdXBwb3J0IHRoYXQgY2FwYWJpbGl0eSB3aXRoIHN1c3BlbnNpb24uCitUaGUgSlBFRyBtYXJrZXIgd3JpdGVyIGN1cnJlbnRseSBkb2VzICpub3QqIGNvcGUgd2l0aCBzdXNwZW5zaW9uLgorV2UgZmVlbCB0aGF0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeTsgaXQgaXMgbXVjaCBlYXNpZXIgc2ltcGx5IHRvIHJlcXVpcmUKK3RoZSBhcHBsaWNhdGlvbiB0byBlbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciBzcGFjZSBiZWZvcmUgc3RhcnRpbmcuICAoQW4KK2VtcHR5IDJLIGJ1ZmZlciBpcyBtb3JlIHRoYW4gc3VmZmljaWVudCBmb3IgdGhlIGhlYWRlciBtYXJrZXJzOyBhbmQgZW5zdXJpbmcKK3RoZXJlIGFyZSBhIGRvemVuIG9yIHR3byBieXRlcyBhdmFpbGFibGUgYmVmb3JlIGNhbGxpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKQord2lsbCBzdWZmaWNlIGZvciB0aGUgdHJhaWxlci4pICBUaGlzIHdvdWxkIG5vdCB3b3JrIGZvciB3cml0aW5nIG11bHRpLXNjYW4KK0pQRUcgZmlsZXMsIGJ1dCB3ZSBzaW1wbHkgZG8gbm90IGludGVuZCB0byBzdXBwb3J0IHRoYXQgY2FwYWJpbGl0eSB3aXRoCitzdXNwZW5zaW9uLgogCiAKICoqKiBNZW1vcnkgbWFuYWdlciBzZXJ2aWNlcyAqKioKZGlmZiAtLWdpdCBhL3Rlc3RpbWcuYm1wIGIvdGVzdGltZy5ibXAKaW5kZXggODYwM2QxNS4uMDEyMjIzZSAxMDA2NDQKLS0tIGEvdGVzdGltZy5ibXAKKysrIGIvdGVzdGltZy5ibXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGltZy5qcGcgYi90ZXN0aW1nLmpwZwppbmRleCBiMzRjYTVkLi5hMDI2ZTQ4IDEwMDY0NAotLS0gYS90ZXN0aW1nLmpwZworKysgYi90ZXN0aW1nLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW1nLnBwbSBiL3Rlc3RpbWcucHBtCmluZGV4IDlkODFjZTIuLmJkNzhlZjggMTAwNjQ0Ci0tLSBhL3Rlc3RpbWcucHBtCisrKyBiL3Rlc3RpbWcucHBtCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbWdwLmpwZyBiL3Rlc3RpbWdwLmpwZwppbmRleCA4Y2JiNjU4Li5jYTZhY2FkIDEwMDY0NAotLS0gYS90ZXN0aW1ncC5qcGcKKysrIGIvdGVzdGltZ3AuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RyYW5zdXBwLmMgYi90cmFuc3VwcC5jCmluZGV4IGU1ZWM1NjQuLmI4OWJjOWUgMTAwNjQ0Ci0tLSBhL3RyYW5zdXBwLmMKKysrIGIvdHJhbnN1cHAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiB0cmFuc3VwcC5jCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDA5LCBUaG9tYXMgRy4gTGFuZSwgR3VpZG8gVm9sbGJlZGluZy4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImppbmNsdWRlLmgiCiAjaW5jbHVkZSAianBlZ2xpYi5oIgogI2luY2x1ZGUgInRyYW5zdXBwLmgiCQkvKiBNeSBvd24gZXh0ZXJuYWwgaW50ZXJmYWNlICovCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXNkaWdpdCgpICovCiAKIAogI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECkBAIC0yOCw3ICsyOSw4IEBACiAgKiBMb3NzbGVzcyBpbWFnZSB0cmFuc2Zvcm1hdGlvbiByb3V0aW5lcy4gIFRoZXNlIHJvdXRpbmVzIHdvcmsgb24gRENUCiAgKiBjb2VmZmljaWVudCBhcnJheXMgYW5kIHRodXMgZG8gbm90IHJlcXVpcmUgYW55IGxvc3N5IGRlY29tcHJlc3Npb24KICAqIG9yIHJlY29tcHJlc3Npb24gb2YgdGhlIGltYWdlLgotICogVGhhbmtzIHRvIEd1aWRvIFZvbGxiZWRpbmcgZm9yIHRoZSBpbml0aWFsIGRlc2lnbiBhbmQgY29kZSBvZiB0aGlzIGZlYXR1cmUuCisgKiBUaGFua3MgdG8gR3VpZG8gVm9sbGJlZGluZyBmb3IgdGhlIGluaXRpYWwgZGVzaWduIGFuZCBjb2RlIG9mIHRoaXMgZmVhdHVyZSwKKyAqIGFuZCB0byBCZW4gSmFja3NvbiBmb3IgaW50cm9kdWNpbmcgdGhlIGNyb3BwaW5nIGZlYXR1cmUuCiAgKgogICogSG9yaXpvbnRhbCBmbGlwcGluZyBpcyBkb25lIGluLXBsYWNlLCB1c2luZyBhIHNpbmdsZSB0b3AtdG8tYm90dG9tCiAgKiBwYXNzIHRocm91Z2ggdGhlIHZpcnR1YWwgc291cmNlIGFycmF5LiAgSXQgd2lsbCB0aHVzIGJlIG11Y2ggdGhlCkBAIC00Miw2ICs0NCwxMyBAQAogICogYXJyYXlzIGZvciBtb3N0IG9mIHRoZSB0cmFuc2Zvcm1zLiAgVGhhdCBjb3VsZCByZXN1bHQgaW4gbXVjaCB0aHJhc2hpbmcKICAqIGlmIHRoZSBpbWFnZSBpcyBsYXJnZXIgdGhhbiBtYWluIG1lbW9yeS4KICAqCisgKiBJZiBjcm9wcGluZyBvciB0cmltbWluZyBpcyBpbnZvbHZlZCwgdGhlIGRlc3RpbmF0aW9uIGFycmF5cyBtYXkgYmUgc21hbGxlcgorICogdGhhbiB0aGUgc291cmNlIGFycmF5cy4gIE5vdGUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIGhvcml6b250YWwgZmxpcAorICogaW4tcGxhY2Ugd2hlbiBhIG5vbnplcm8gWSBjcm9wIG9mZnNldCBpcyBzcGVjaWZpZWQsIHNpbmNlIHdlJ2QgaGF2ZSB0byBtb3ZlCisgKiBkYXRhIGZyb20gb25lIGJsb2NrIHJvdyB0byBhbm90aGVyIGJ1dCB0aGUgdmlydHVhbCBhcnJheSBtYW5hZ2VyIGRvZXNuJ3QKKyAqIGd1YXJhbnRlZSB3ZSBjYW4gdG91Y2ggbW9yZSB0aGFuIG9uZSByb3cgYXQgYSB0aW1lLiAgU28gaW4gdGhhdCBjYXNlLAorICogd2UgaGF2ZSB0byB1c2UgYSBzZXBhcmF0ZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAqCiAgKiBTb21lIG5vdGVzIGFib3V0IHRoZSBvcGVyYXRpbmcgZW52aXJvbm1lbnQgb2YgdGhlIGluZGl2aWR1YWwgdHJhbnNmb3JtCiAgKiByb3V0aW5lczoKICAqIDEuIEJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdmlydHVhbCBhcnJheXMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZQpAQCAtNTQsMjAgKzYzLDY1IEBACiAgKiAgICBhbmQgd2UgbWF5IGFzIHdlbGwgdGFrZSB0aGF0IGFzIHRoZSBlZmZlY3RpdmUgaU1DVSBzaXplLgogICogNC4gV2hlbiAidHJpbSIgaXMgaW4gZWZmZWN0LCB0aGUgZGVzdGluYXRpb24ncyBkaW1lbnNpb25zIHdpbGwgYmUgdGhlCiAgKiAgICB0cmltbWVkIHZhbHVlcyBidXQgdGhlIHNvdXJjZSdzIHdpbGwgYmUgdW50cmltbWVkLgotICogNS4gQWxsIHRoZSByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXJzIGFyZQorICogNS4gV2hlbiAiY3JvcCIgaXMgaW4gZWZmZWN0LCB0aGUgZGVzdGluYXRpb24ncyBkaW1lbnNpb25zIHdpbGwgYmUgdGhlCisgKiAgICBjcm9wcGVkIHZhbHVlcyBidXQgdGhlIHNvdXJjZSdzIHdpbGwgYmUgdW5jcm9wcGVkLiAgRWFjaCB0cmFuc2Zvcm0KKyAqICAgIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHBpY2tpbmcgdXAgc291cmNlIGRhdGEgc3RhcnRpbmcgYXQgdGhlCisgKiAgICBjb3JyZWN0IFggYW5kIFkgb2Zmc2V0IGZvciB0aGUgY3JvcCByZWdpb24uICAoVGhlIFggYW5kIFkgb2Zmc2V0cworICogICAgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm0gcm91dGluZXMgYXJlIG1lYXN1cmVkIGluIGlNQ1UgYmxvY2tzIG9mIHRoZQorICogICAgZGVzdGluYXRpb24uKQorICogNi4gQWxsIHRoZSByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXJzIGFyZQogICogICAgcGFkZGVkIG91dCB0byBhIGZ1bGwgaU1DVSBib3VuZGFyeS4gIFRoaXMgaXMgdHJ1ZSwgYWx0aG91Z2ggZm9yIHRoZQogICogICAgc291cmNlIGJ1ZmZlciBpdCBpcyBhbiB1bmRvY3VtZW50ZWQgcHJvcGVydHkgb2YgamRjb2VmY3QuYy4KLSAqIE5vdGVzIDIsMyw0IGJvaWwgZG93biB0byB0aGlzOiBnZW5lcmFsbHkgd2Ugc2hvdWxkIHVzZSB0aGUgZGVzdGluYXRpb24ncwotICogZGltZW5zaW9ucyBhbmQgaWdub3JlIHRoZSBzb3VyY2Uncy4KICAqLwogCiAKIExPQ0FMKHZvaWQpCi1kb19mbGlwX2ggKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMpCi0vKiBIb3Jpem9udGFsIGZsaXA7IGRvbmUgaW4tcGxhY2UsIHNvIG5vIHNlcGFyYXRlIGRlc3QgYXJyYXkgaXMgcmVxdWlyZWQgKi8KK2RvX2Nyb3AgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgSkRJTUVOU0lPTiB4X2Nyb3Bfb2Zmc2V0LCBKRElNRU5TSU9OIHlfY3JvcF9vZmZzZXQsCisJIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogQ3JvcC4gIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gbm8gcm90YXRlL2ZsaXAgaXMgcmVxdWVzdGVkIHdpdGggdGhlIGNyb3AuICovCiB7Ci0gIEpESU1FTlNJT04gTUNVX2NvbHMsIGNvbXBfd2lkdGgsIGJsa194LCBibGtfeTsKKyAgSkRJTUVOU0lPTiBkc3RfYmxrX3ksIHhfY3JvcF9ibG9ja3MsIHlfY3JvcF9ibG9ja3M7CisgIGludCBjaSwgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogV2Ugc2ltcGx5IGhhdmUgdG8gY29weSB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEgKHRoZSBkZXN0aW5hdGlvbidzCisgICAqIGltYWdlIHNpemUpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBYIGFuZCBZIG9mZnNldHMgaW4gdGhlIHNvdXJjZS4KKyAgICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIHhfY3JvcF9ibG9ja3MgPSB4X2Nyb3Bfb2Zmc2V0ICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICB5X2Nyb3BfYmxvY2tzID0geV9jcm9wX29mZnNldCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCisJIGRzdF9ibGtfeSArIHlfY3JvcF9ibG9ja3MsCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJamNvcHlfYmxvY2tfcm93KHNyY19idWZmZXJbb2Zmc2V0X3ldICsgeF9jcm9wX2Jsb2NrcywKKwkJCWRzdF9idWZmZXJbb2Zmc2V0X3ldLAorCQkJY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fZmxpcF9oX25vX2Nyb3AgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkJICAgSkRJTUVOU0lPTiB4X2Nyb3Bfb2Zmc2V0LAorCQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMpCisvKiBIb3Jpem9udGFsIGZsaXA7IGRvbmUgaW4tcGxhY2UsIHNvIG5vIHNlcGFyYXRlIGRlc3QgYXJyYXkgaXMgcmVxdWlyZWQuCisgKiBOQjogdGhpcyBvbmx5IHdvcmtzIHdoZW4geV9jcm9wX29mZnNldCBpcyB6ZXJvLgorICovCit7CisgIEpESU1FTlNJT04gTUNVX2NvbHMsIGNvbXBfd2lkdGgsIGJsa194LCBibGtfeSwgeF9jcm9wX2Jsb2NrczsKICAgaW50IGNpLCBrLCBvZmZzZXRfeTsKICAgSkJMT0NLQVJSQVkgYnVmZmVyOwogICBKQ09FRlBUUiBwdHIxLCBwdHIyOwpAQCAtNzksMTcgKzEzMywxOSBAQAogICAgKiBtaXJyb3JpbmcgYnkgY2hhbmdpbmcgdGhlIHNpZ25zIG9mIG9kZC1udW1iZXJlZCBjb2x1bW5zLgogICAgKiBQYXJ0aWFsIGlNQ1VzIGF0IHRoZSByaWdodCBlZGdlIGFyZSBsZWZ0IHVudG91Y2hlZC4KICAgICovCi0gIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgTUNVX2NvbHMgPSBzcmNpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwogCiAgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CiAgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwogICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgeF9jcm9wX2Jsb2NrcyA9IHhfY3JvcF9vZmZzZXQgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwogICAgIGZvciAoYmxrX3kgPSAwOyBibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CiAJIGJsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKICAgICAgIGJ1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCiAJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGJsa195LAogCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CiAgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJLyogRG8gdGhlIG1pcnJvcmluZyAqLwogCWZvciAoYmxrX3ggPSAwOyBibGtfeCAqIDIgPCBjb21wX3dpZHRoOyBibGtfeCsrKSB7CiAJICBwdHIxID0gYnVmZmVyW29mZnNldF95XVtibGtfeF07CiAJICBwdHIyID0gYnVmZmVyW29mZnNldF95XVtjb21wX3dpZHRoIC0gYmxrX3ggLSAxXTsKQEAgLTEwNSw2ICsxNjEsNzkgQEAKIAkgICAgKnB0cjIrKyA9IC10ZW1wMTsKIAkgIH0KIAl9CisJaWYgKHhfY3JvcF9ibG9ja3MgPiAwKSB7CisJICAvKiBOb3cgbGVmdC1qdXN0aWZ5IHRoZSBwb3J0aW9uIG9mIHRoZSBkYXRhIHRvIGJlIGtlcHQuCisJICAgKiBXZSBjYW4ndCB1c2UgYSBzaW5nbGUgamNvcHlfYmxvY2tfcm93KCkgY2FsbCBiZWNhdXNlIHRoYXQgcm91dGluZQorCSAgICogZGVwZW5kcyBvbiBtZW1jcHkoKSwgd2hvc2UgYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQgZm9yIG92ZXJsYXBwaW5nCisJICAgKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZWFzLiAgU2lnaC4KKwkgICAqLworCSAgZm9yIChibGtfeCA9IDA7IGJsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBibGtfeCsrKSB7CisJICAgIGpjb3B5X2Jsb2NrX3JvdyhidWZmZXJbb2Zmc2V0X3ldICsgYmxrX3ggKyB4X2Nyb3BfYmxvY2tzLAorCQkJICAgIGJ1ZmZlcltvZmZzZXRfeV0gKyBibGtfeCwKKwkJCSAgICAoSkRJTUVOU0lPTikgMSk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19mbGlwX2ggKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICBKRElNRU5TSU9OIHhfY3JvcF9vZmZzZXQsIEpESU1FTlNJT04geV9jcm9wX29mZnNldCwKKwkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogSG9yaXpvbnRhbCBmbGlwIGluIGdlbmVyYWwgY3JvcHBpbmcgY2FzZSAqLworeworICBKRElNRU5TSU9OIE1DVV9jb2xzLCBjb21wX3dpZHRoLCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgSkRJTUVOU0lPTiB4X2Nyb3BfYmxvY2tzLCB5X2Nyb3BfYmxvY2tzOworICBpbnQgY2ksIGssIG9mZnNldF95OworICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOworICBKQkxPQ0tST1cgc3JjX3Jvd19wdHIsIGRzdF9yb3dfcHRyOworICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIEhlcmUgd2UgbXVzdCBvdXRwdXQgaW50byBhIHNlcGFyYXRlIGFycmF5IGJlY2F1c2Ugd2UgY2FuJ3QgdG91Y2gKKyAgICogZGlmZmVyZW50IHJvd3Mgb2YgYSBzaW5nbGUgdmlydHVhbCBhcnJheSBzaW11bHRhbmVvdXNseS4gIE90aGVyd2lzZSwKKyAgICogdGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgcm91dGluZSBhYm92ZS4KKyAgICovCisgIE1DVV9jb2xzID0gc3JjaW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIHhfY3JvcF9ibG9ja3MgPSB4X2Nyb3Bfb2Zmc2V0ICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICB5X2Nyb3BfYmxvY2tzID0geV9jcm9wX29mZnNldCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCisJIGRzdF9ibGtfeSArIHlfY3JvcF9ibG9ja3MsCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKKwlzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3ldOworCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBkc3RfYmxrX3grKykgeworCSAgaWYgKHhfY3JvcF9ibG9ja3MgKyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CisJICAgIC8qIERvIHRoZSBtaXJyb3JhYmxlIGJsb2NrcyAqLworCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2NvbXBfd2lkdGggLSB4X2Nyb3BfYmxvY2tzIC0gZHN0X2Jsa194IC0gMV07CisJICAgIC8qIHRoaXMgdW5yb2xsZWQgbG9vcCBkb2Vzbid0IG5lZWQgdG8ga25vdyB3aGljaCByb3cgaXQncyBvbi4uLiAqLworCSAgICBmb3IgKGsgPSAwOyBrIDwgRENUU0laRTI7IGsgKz0gMikgeworCSAgICAgICpkc3RfcHRyKysgPSAqc3JjX3B0cisrOwkgLyogY29weSBldmVuIGNvbHVtbiAqLworCSAgICAgICpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7IC8qIGNvcHkgb2RkIGNvbHVtbiB3aXRoIHNpZ24gY2hhbmdlICovCisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIC8qIENvcHkgbGFzdCBwYXJ0aWFsIGJsb2NrKHMpIHZlcmJhdGltICovCisJICAgIGpjb3B5X2Jsb2NrX3JvdyhzcmNfcm93X3B0ciArIGRzdF9ibGtfeCArIHhfY3JvcF9ibG9ja3MsCisJCQkgICAgZHN0X3Jvd19wdHIgKyBkc3RfYmxrX3gsCisJCQkgICAgKEpESU1FTlNJT04pIDEpOworCSAgfQorCX0KICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTExMywxMSArMjQyLDEzIEBACiAKIExPQ0FMKHZvaWQpCiBkb19mbGlwX3YgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICBKRElNRU5TSU9OIHhfY3JvcF9vZmZzZXQsIEpESU1FTlNJT04geV9jcm9wX29mZnNldCwKIAkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCiAJICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQogLyogVmVydGljYWwgZmxpcCAqLwogewogICBKRElNRU5TSU9OIE1DVV9yb3dzLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIEpESU1FTlNJT04geF9jcm9wX2Jsb2NrcywgeV9jcm9wX2Jsb2NrczsKICAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeTsKICAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKICAgSkJMT0NLUk9XIHNyY19yb3dfcHRyLCBkc3Rfcm93X3B0cjsKQEAgLTEzMSwzMyArMjYyLDM4IEBACiAgICAqIG9mIG9kZC1udW1iZXJlZCByb3dzLgogICAgKiBQYXJ0aWFsIGlNQ1VzIGF0IHRoZSBib3R0b20gZWRnZSBhcmUgY29waWVkIHZlcmJhdGltLgogICAgKi8KLSAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgTUNVX3Jvd3MgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKIAogICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewogICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKICAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICB4X2Nyb3BfYmxvY2tzID0geF9jcm9wX29mZnNldCAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgeV9jcm9wX2Jsb2NrcyA9IHlfY3JvcF9vZmZzZXQgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwogICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKIAkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKICAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQogCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCiAJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworICAgICAgaWYgKHlfY3JvcF9ibG9ja3MgKyBkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewogCS8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KIAlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKIAkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAotCSAgIGNvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJICAgY29tcF9oZWlnaHQgLSB5X2Nyb3BfYmxvY2tzIC0gZHN0X2Jsa195IC0KKwkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKIAkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwogICAgICAgfSBlbHNlIHsKIAkvKiBCb3R0b20tZWRnZSBibG9ja3Mgd2lsbCBiZSBjb3BpZWQgdmVyYmF0aW0uICovCiAJc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCisJICAgZHN0X2Jsa195ICsgeV9jcm9wX2Jsb2NrcywKIAkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwogICAgICAgfQogICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewotCWlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworCWlmICh5X2Nyb3BfYmxvY2tzICsgZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKIAkgIC8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KIAkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07CiAJICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAtIG9mZnNldF95IC0gMV07CisJICBzcmNfcm93X3B0ciArPSB4X2Nyb3BfYmxvY2tzOwogCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CiAJICAgICAgIGRzdF9ibGtfeCsrKSB7CiAJICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwpAQCAtMTczLDcgKzMwOSw4IEBACiAJICB9CiAJfSBlbHNlIHsKIAkgIC8qIEp1c3QgY29weSByb3cgdmVyYmF0aW0uICovCi0JICBqY29weV9ibG9ja19yb3coc3JjX2J1ZmZlcltvZmZzZXRfeV0sIGRzdF9idWZmZXJbb2Zmc2V0X3ldLAorCSAgamNvcHlfYmxvY2tfcm93KHNyY19idWZmZXJbb2Zmc2V0X3ldICsgeF9jcm9wX2Jsb2NrcywKKwkJCSAgZHN0X2J1ZmZlcltvZmZzZXRfeV0sCiAJCQkgIGNvbXBwdHItPndpZHRoX2luX2Jsb2Nrcyk7CiAJfQogICAgICAgfQpAQCAtMTg0LDExICszMjEsMTIgQEAKIAogTE9DQUwodm9pZCkKIGRvX3RyYW5zcG9zZSAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICAgIEpESU1FTlNJT04geF9jcm9wX29mZnNldCwgSkRJTUVOU0lPTiB5X2Nyb3Bfb2Zmc2V0LAogCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKIAkgICAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCiAvKiBUcmFuc3Bvc2Ugc291cmNlIGludG8gZGVzdGluYXRpb24gKi8KIHsKLSAgSkRJTUVOU0lPTiBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgSkRJTUVOU0lPTiBkc3RfYmxrX3gsIGRzdF9ibGtfeSwgeF9jcm9wX2Jsb2NrcywgeV9jcm9wX2Jsb2NrczsKICAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7CiAgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CiAgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CkBAIC0yMDEsNiArMzM5LDggQEAKICAgICovCiAgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CiAgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIHhfY3JvcF9ibG9ja3MgPSB4X2Nyb3Bfb2Zmc2V0ICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICB5X2Nyb3BfYmxvY2tzID0geV9jcm9wX29mZnNldCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CiAgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwogCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewogICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCkBAIC0yMTAsMTEgKzM1MCwxMiBAQAogCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwogCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKIAkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAorCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwKKwkgICAgIGRzdF9ibGtfeCArIHhfY3JvcF9ibG9ja3MsCiAJICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOwogCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgewotCSAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOwogCSAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOworCSAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3kgKyB5X2Nyb3BfYmxvY2tzXTsKIAkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKIAkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQogCQlkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwpAQCAtMjI4LDYgKzM2OSw3IEBACiAKIExPQ0FMKHZvaWQpCiBkb19yb3RfOTAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICBKRElNRU5TSU9OIHhfY3JvcF9vZmZzZXQsIEpESU1FTlNJT04geV9jcm9wX29mZnNldCwKIAkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCiAJICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQogLyogOTAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KQEAgLTIzNyw2ICszNzksNyBAQAogICovCiB7CiAgIEpESU1FTlNJT04gTUNVX2NvbHMsIGNvbXBfd2lkdGgsIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBKRElNRU5TSU9OIHhfY3JvcF9ibG9ja3MsIHlfY3JvcF9ibG9ja3M7CiAgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3gsIG9mZnNldF95OwogICBKQkxPQ0tBUlJBWSBzcmNfYnVmZmVyLCBkc3RfYnVmZmVyOwogICBKQ09FRlBUUiBzcmNfcHRyLCBkc3RfcHRyOwpAQCAtMjQ2LDExICszODksMTMgQEAKICAgICogYXQgdGhlIChvdXRwdXQpIHJpZ2h0IGVkZ2UgcHJvcGVybHkuICBUaGV5IGp1c3QgZ2V0IHRyYW5zcG9zZWQgYW5kCiAgICAqIG5vdCBtaXJyb3JlZC4KICAgICovCi0gIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgTUNVX2NvbHMgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKIAogICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewogICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKICAgICBjb21wX3dpZHRoID0gTUNVX2NvbHMgKiBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIHhfY3JvcF9ibG9ja3MgPSB4X2Nyb3Bfb2Zmc2V0ICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICB5X2Nyb3BfYmxvY2tzID0geV9jcm9wX29mZnNldCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CiAgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwogCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewogICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCkBAIC0yNTksMTUgKzQwNCwyNiBAQAogICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgewogCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwogCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKLQkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAotCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKwkgIGlmICh4X2Nyb3BfYmxvY2tzICsgZHN0X2Jsa194IDwgY29tcF93aWR0aCkgeworCSAgICAvKiBCbG9jayBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KKwkgICAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCisJICAgICAgIGNvbXBfd2lkdGggLSB4X2Nyb3BfYmxvY2tzIC0gZHN0X2Jsa194IC0KKwkgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7CisJICB9IGVsc2UgeworCSAgICAvKiBFZGdlIGJsb2NrcyBhcmUgdHJhbnNwb3NlZCBidXQgbm90IG1pcnJvcmVkLiAqLworCSAgICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwKKwkgICAgICAgZHN0X2Jsa194ICsgeF9jcm9wX2Jsb2NrcywKKwkgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKwkgIH0KIAkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKLQkgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKLQkgICAgaWYgKGRzdF9ibGtfeCA8IGNvbXBfd2lkdGgpIHsKKwkgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkgICAgaWYgKHhfY3JvcF9ibG9ja3MgKyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CiAJICAgICAgLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCi0JICAgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldCi0JCVtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKKwkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltjb21wcHRyLT5oX3NhbXBfZmFjdG9yIC0gb2Zmc2V0X3ggLSAxXQorCQlbZHN0X2Jsa195ICsgb2Zmc2V0X3kgKyB5X2Nyb3BfYmxvY2tzXTsKIAkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCiAJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKQEAgLTI3Nyw3ICs0MzMsOCBAQAogCSAgICAgIH0KIAkgICAgfSBlbHNlIHsKIAkgICAgICAvKiBFZGdlIGJsb2NrcyBhcmUgdHJhbnNwb3NlZCBidXQgbm90IG1pcnJvcmVkLiAqLwotCSAgICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07CisJICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdCisJCVtkc3RfYmxrX3kgKyBvZmZzZXRfeSArIHlfY3JvcF9ibG9ja3NdOwogCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCiAJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKQEAgLTI5Miw2ICs0NDksNyBAQAogCiBMT0NBTCh2b2lkKQogZG9fcm90XzI3MCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICBKRElNRU5TSU9OIHhfY3JvcF9vZmZzZXQsIEpESU1FTlNJT04geV9jcm9wX29mZnNldCwKIAkgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAogCSAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCiAvKiAyNzAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KQEAgLTMwMSw2ICs0NTksNyBAQAogICovCiB7CiAgIEpESU1FTlNJT04gTUNVX3Jvd3MsIGNvbXBfaGVpZ2h0LCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgSkRJTUVOU0lPTiB4X2Nyb3BfYmxvY2tzLCB5X2Nyb3BfYmxvY2tzOwogICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKICAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKICAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKQEAgLTMxMCwxMSArNDY5LDEzIEBACiAgICAqIGF0IHRoZSAob3V0cHV0KSBib3R0b20gZWRnZSBwcm9wZXJseS4gIFRoZXkganVzdCBnZXQgdHJhbnNwb3NlZCBhbmQKICAgICogbm90IG1pcnJvcmVkLgogICAgKi8KLSAgTUNVX3Jvd3MgPSBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgLyAoZHN0aW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgTUNVX3Jvd3MgPSBzcmNpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwogCiAgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CiAgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOwogICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIHhfY3JvcF9ibG9ja3MgPSB4X2Nyb3Bfb2Zmc2V0ICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICB5X2Nyb3BfYmxvY2tzID0geV9jcm9wX29mZnNldCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CiAgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwogCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgewogICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCkBAIC0zMjQsMTQgKzQ4NSwxNSBAQAogCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwogCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKIAkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAorCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwKKwkgICAgIGRzdF9ibGtfeCArIHhfY3JvcF9ibG9ja3MsCiAJICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOwogCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgewogCSAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOwotCSAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkgICAgaWYgKHlfY3JvcF9ibG9ja3MgKyBkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewogCSAgICAgIC8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLwogCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XQotCQlbY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSBvZmZzZXRfeSAtIDFdOworCQlbY29tcF9oZWlnaHQgLSB5X2Nyb3BfYmxvY2tzIC0gZHN0X2Jsa195IC0gb2Zmc2V0X3kgLSAxXTsKIAkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKIAkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwpAQCAtMzQxLDcgKzUwMyw4IEBACiAJICAgICAgfQogCSAgICB9IGVsc2UgewogCSAgICAgIC8qIEVkZ2UgYmxvY2tzIGFyZSB0cmFuc3Bvc2VkIGJ1dCBub3QgbWlycm9yZWQuICovCi0JICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKKwkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF0KKwkJW2RzdF9ibGtfeSArIG9mZnNldF95ICsgeV9jcm9wX2Jsb2Nrc107CiAJICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKIAkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKIAkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwpAQCAtMzU2LDYgKzUxOSw3IEBACiAKIExPQ0FMKHZvaWQpCiBkb19yb3RfMTgwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgIEpESU1FTlNJT04geF9jcm9wX29mZnNldCwgSkRJTUVOU0lPTiB5X2Nyb3Bfb2Zmc2V0LAogCSAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCiAJICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKIC8qIDE4MCBkZWdyZWUgcm90YXRpb24gaXMgZXF1aXZhbGVudCB0bwpAQCAtMzY1LDg5ICs1MjksOTMgQEAKICAqLwogewogICBKRElNRU5TSU9OIE1DVV9jb2xzLCBNQ1Vfcm93cywgY29tcF93aWR0aCwgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBKRElNRU5TSU9OIHhfY3JvcF9ibG9ja3MsIHlfY3JvcF9ibG9ja3M7CiAgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3k7CiAgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CiAgIEpCTE9DS1JPVyBzcmNfcm93X3B0ciwgZHN0X3Jvd19wdHI7CiAgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CiAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CiAKLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICBNQ1VfY29scyA9IHNyY2luZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIE1DVV9yb3dzID0gc3JjaW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CiAKICAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKICAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CiAgICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKICAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICB4X2Nyb3BfYmxvY2tzID0geF9jcm9wX29mZnNldCAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgeV9jcm9wX2Jsb2NrcyA9IHlfY3JvcF9vZmZzZXQgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwogICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKIAkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKICAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQogCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCiAJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworICAgICAgaWYgKHlfY3JvcF9ibG9ja3MgKyBkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewogCS8qIFJvdyBpcyB3aXRoaW4gdGhlIHZlcnRpY2FsbHkgbWlycm9yYWJsZSBhcmVhLiAqLwogCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQogCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCi0JICAgY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkgICBjb21wX2hlaWdodCAtIHlfY3JvcF9ibG9ja3MgLSBkc3RfYmxrX3kgLQorCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAogCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CiAgICAgICB9IGVsc2UgewogCS8qIEJvdHRvbS1lZGdlIHJvd3MgYXJlIG9ubHkgbWlycm9yZWQgaG9yaXpvbnRhbGx5LiAqLwogCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAorCSAgIGRzdF9ibGtfeSArIHlfY3JvcF9ibG9ja3MsCiAJICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKICAgICAgIH0KICAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKLQlpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwlkc3Rfcm93X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldOworCWlmICh5X2Nyb3BfYmxvY2tzICsgZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKIAkgIC8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KLQkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07CiAJICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAtIG9mZnNldF95IC0gMV07Ci0JICAvKiBQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBjYW4gYmUgbWlycm9yZWQgYm90aCB3YXlzLiAqLwotCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoOyBkc3RfYmxrX3grKykgeworCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7CiAJICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIDFdOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSArPSAyKSB7Ci0JICAgICAgLyogRm9yIGV2ZW4gcm93LCBuZWdhdGUgZXZlcnkgb2RkIGNvbHVtbi4gKi8KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaiArPSAyKSB7Ci0JCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOwotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOworCSAgICBpZiAoeF9jcm9wX2Jsb2NrcyArIGRzdF9ibGtfeCA8IGNvbXBfd2lkdGgpIHsKKwkgICAgICAvKiBQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBjYW4gYmUgbWlycm9yZWQgYm90aCB3YXlzLiAqLworCSAgICAgIHNyY19wdHIgPSBzcmNfcm93X3B0cltjb21wX3dpZHRoIC0geF9jcm9wX2Jsb2NrcyAtIGRzdF9ibGtfeCAtIDFdOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKKwkJLyogRm9yIGV2ZW4gcm93LCBuZWdhdGUgZXZlcnkgb2RkIGNvbHVtbi4gKi8KKwkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGogKz0gMikgeworCQkgICpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCQkgICpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CisJCX0KKwkJLyogRm9yIG9kZCByb3csIG5lZ2F0ZSBldmVyeSBldmVuIGNvbHVtbi4gKi8KKwkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGogKz0gMikgeworCQkgICpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CisJCSAgKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7CisJCX0KIAkgICAgICB9Ci0JICAgICAgLyogRm9yIG9kZCByb3csIG5lZ2F0ZSBldmVyeSBldmVuIGNvbHVtbi4gKi8KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaiArPSAyKSB7Ci0JCSpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7Ci0JCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCSAgICB9IGVsc2UgeworCSAgICAgIC8qIEFueSByZW1haW5pbmcgcmlnaHQtZWRnZSBibG9ja3MgYXJlIG9ubHkgbWlycm9yZWQgdmVydGljYWxseS4gKi8KKwkgICAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbeF9jcm9wX2Jsb2NrcyArIGRzdF9ibGtfeF07CisJICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkgKz0gMikgeworCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgICpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgICpkc3RfcHRyKysgPSAtICpzcmNfcHRyKys7CiAJICAgICAgfQogCSAgICB9CiAJICB9Ci0JICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IG1pcnJvcmVkIHZlcnRpY2FsbHkuICovCi0JICBmb3IgKDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQotCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOwotCSAgICB9Ci0JICB9CiAJfSBlbHNlIHsKIAkgIC8qIFJlbWFpbmluZyByb3dzIGFyZSBqdXN0IG1pcnJvcmVkIGhvcml6b250YWxseS4gKi8KLQkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07CiAJICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3ldOwotCSAgLyogUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgY2FuIGJlIG1pcnJvcmVkLiAqLwotCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoOyBkc3RfYmxrX3grKykgewotCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSAxXTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDIpIHsKLQkgICAgICAqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKLQkgICAgICAqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOworCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7CisJICAgIGlmICh4X2Nyb3BfYmxvY2tzICsgZHN0X2Jsa194IDwgY29tcF93aWR0aCkgeworCSAgICAgIC8qIFByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGNhbiBiZSBtaXJyb3JlZC4gKi8KKwkgICAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbY29tcF93aWR0aCAtIHhfY3JvcF9ibG9ja3MgLSBkc3RfYmxrX3ggLSAxXTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkgKz0gMikgeworCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKKwkJKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKKwkgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgLyogQW55IHJlbWFpbmluZyByaWdodC1lZGdlIGJsb2NrcyBhcmUgb25seSBjb3BpZWQuICovCisJICAgICAgamNvcHlfYmxvY2tfcm93KHNyY19yb3dfcHRyICsgZHN0X2Jsa194ICsgeF9jcm9wX2Jsb2NrcywKKwkJCSAgICAgIGRzdF9yb3dfcHRyICsgZHN0X2Jsa194LAorCQkJICAgICAgKEpESU1FTlNJT04pIDEpOwogCSAgICB9CiAJICB9Ci0JICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IGNvcGllZC4gKi8KLQkgIGZvciAoOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7Ci0JICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOwotCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKLQkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCi0JICAgICAgKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7Ci0JICB9CiAJfQogICAgICAgfQogICAgIH0KQEAgLTQ1Nyw2ICs2MjUsNyBAQAogCiBMT0NBTCh2b2lkKQogZG9fdHJhbnN2ZXJzZSAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICAgICBKRElNRU5TSU9OIHhfY3JvcF9vZmZzZXQsIEpESU1FTlNJT04geV9jcm9wX29mZnNldCwKIAkgICAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAogCSAgICAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCiAvKiBUcmFuc3ZlcnNlIHRyYW5zcG9zZSBpcyBlcXVpdmFsZW50IHRvCkBAIC00NzAsMTggKzYzOSwyMSBAQAogICovCiB7CiAgIEpESU1FTlNJT04gTUNVX2NvbHMsIE1DVV9yb3dzLCBjb21wX3dpZHRoLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIEpESU1FTlNJT04geF9jcm9wX2Jsb2NrcywgeV9jcm9wX2Jsb2NrczsKICAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7CiAgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CiAgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CiAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CiAKLSAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOwotICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICBNQ1VfY29scyA9IHNyY2luZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICBNQ1Vfcm93cyA9IHNyY2luZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CiAKICAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKICAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CiAgICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKICAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICB4X2Nyb3BfYmxvY2tzID0geF9jcm9wX29mZnNldCAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgeV9jcm9wX2Jsb2NrcyA9IHlfY3JvcF9vZmZzZXQgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwogICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKIAkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKICAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQpAQCAtNDkwLDE3ICs2NjIsMjYgQEAKICAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKIAlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKIAkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7Ci0JICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLQkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKLQkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7CisJICBpZiAoeF9jcm9wX2Jsb2NrcyArIGRzdF9ibGtfeCA8IGNvbXBfd2lkdGgpIHsKKwkgICAgLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCisJICAgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAorCSAgICAgICBjb21wX3dpZHRoIC0geF9jcm9wX2Jsb2NrcyAtIGRzdF9ibGtfeCAtCisJICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOworCSAgfSBlbHNlIHsKKwkgICAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sCisJICAgICAgIGRzdF9ibGtfeCArIHhfY3JvcF9ibG9ja3MsCisJICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7CisJICB9CiAJICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7Ci0JICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgewotCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XQotCQlbY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSBvZmZzZXRfeSAtIDFdOwotCSAgICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CisJICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07CisJICAgIGlmICh5X2Nyb3BfYmxvY2tzICsgZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkgICAgICBpZiAoeF9jcm9wX2Jsb2NrcyArIGRzdF9ibGtfeCA8IGNvbXBfd2lkdGgpIHsKIAkJLyogQmxvY2sgaXMgd2l0aGluIHRoZSBtaXJyb3JhYmxlIGFyZWEuICovCi0JCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQotCQkgIFtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKKwkJc3JjX3B0ciA9IHNyY19idWZmZXJbY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAtIG9mZnNldF94IC0gMV0KKwkJICBbY29tcF9oZWlnaHQgLSB5X2Nyb3BfYmxvY2tzIC0gZHN0X2Jsa195IC0gb2Zmc2V0X3kgLSAxXTsKIAkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewogCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKIAkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CkBAIC01MTYsNyArNjk3LDggQEAKIAkJfQogCSAgICAgIH0gZWxzZSB7CiAJCS8qIFJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBtaXJyb3JlZCBpbiB5IG9ubHkgKi8KLQkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkJc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdCisJCSAgW2NvbXBfaGVpZ2h0IC0geV9jcm9wX2Jsb2NrcyAtIGRzdF9ibGtfeSAtIG9mZnNldF95IC0gMV07CiAJCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKIAkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKSB7CiAJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwpAQCAtNTI2LDExICs3MDgsMTAgQEAKIAkJfQogCSAgICAgIH0KIAkgICAgfSBlbHNlIHsKLQkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOwotCSAgICAgIGlmIChkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CisJICAgICAgaWYgKHhfY3JvcF9ibG9ja3MgKyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoKSB7CiAJCS8qIEJvdHRvbS1lZGdlIGJsb2NrcyBhcmUgbWlycm9yZWQgaW4geCBvbmx5ICovCi0JCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQotCQkgIFtjb21wX3dpZHRoIC0gZHN0X2Jsa194IC0gb2Zmc2V0X3ggLSAxXTsKKwkJc3JjX3B0ciA9IHNyY19idWZmZXJbY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAtIG9mZnNldF94IC0gMV0KKwkJICBbZHN0X2Jsa195ICsgb2Zmc2V0X3kgKyB5X2Nyb3BfYmxvY2tzXTsKIAkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgewogCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCiAJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOwpAQCAtNTQwLDcgKzcyMSw4IEBACiAJCX0KIAkgICAgICB9IGVsc2UgewogCQkvKiBBdCBsb3dlciByaWdodCBjb3JuZXIsIGp1c3QgdHJhbnNwb3NlLCBubyBtaXJyb3JpbmcgKi8KLQkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkJc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdCisJCSAgW2RzdF9ibGtfeSArIG9mZnNldF95ICsgeV9jcm9wX2Jsb2Nrc107CiAJCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCiAJCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKIAkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CkBAIC01NTQsOCArNzM2LDExNiBAQAogfQogCiAKKy8qIFBhcnNlIGFuIHVuc2lnbmVkIGludGVnZXI6IHN1YnJvdXRpbmUgZm9yIGp0cmFuc2Zvcm1fcGFyc2VfY3JvcF9zcGVjLgorICogUmV0dXJucyBUUlVFIGlmIHZhbGlkIGludGVnZXIgZm91bmQsIEZBTFNFIGlmIG5vdC4KKyAqICpzdHJwdHIgaXMgYWR2YW5jZWQgb3ZlciB0aGUgZGlnaXQgc3RyaW5nLCBhbmQgKnJlc3VsdCBpcyBzZXQgdG8gaXRzIHZhbHVlLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCitqdF9yZWFkX2ludGVnZXIgKGNvbnN0IGNoYXIgKiogc3RycHRyLCBKRElNRU5TSU9OICogcmVzdWx0KQoreworICBjb25zdCBjaGFyICogcHRyID0gKnN0cnB0cjsKKyAgSkRJTUVOU0lPTiB2YWwgPSAwOworCisgIGZvciAoOyBpc2RpZ2l0KCpwdHIpOyBwdHIrKykgeworICAgIHZhbCA9IHZhbCAqIDEwICsgKEpESU1FTlNJT04pICgqcHRyIC0gJzAnKTsKKyAgfQorICAqcmVzdWx0ID0gdmFsOworICBpZiAocHRyID09ICpzdHJwdHIpCisgICAgcmV0dXJuIEZBTFNFOwkJLyogb29wcywgbm8gZGlnaXRzICovCisgICpzdHJwdHIgPSBwdHI7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qIFBhcnNlIGEgY3JvcCBzcGVjaWZpY2F0aW9uICh3cml0dGVuIGluIFgxMSBnZW9tZXRyeSBzdHlsZSkuCisgKiBUaGUgcm91dGluZSByZXR1cm5zIFRSVUUgaWYgdGhlIHNwZWMgc3RyaW5nIGlzIHZhbGlkLCBGQUxTRSBpZiBub3QuCisgKgorICogVGhlIGNyb3Agc3BlYyBzdHJpbmcgc2hvdWxkIGhhdmUgdGhlIGZvcm1hdAorICoJPHdpZHRoPng8aGVpZ2h0PnsrLX08eG9mZnNldD57Ky19PHlvZmZzZXQ+CisgKiB3aGVyZSB3aWR0aCwgaGVpZ2h0LCB4b2Zmc2V0LCBhbmQgeW9mZnNldCBhcmUgdW5zaWduZWQgaW50ZWdlcnMuCisgKiBFYWNoIG9mIHRoZSBlbGVtZW50cyBjYW4gYmUgb21pdHRlZCB0byBpbmRpY2F0ZSBhIGRlZmF1bHQgdmFsdWUuCisgKiAoQSB3ZWFrbmVzcyBvZiB0aGlzIHN0eWxlIGlzIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIG9taXQgeG9mZnNldAorICogd2hpbGUgc3BlY2lmeWluZyB5b2Zmc2V0LCBzaW5jZSB0aGV5IGxvb2sgYWxpa2UuKQorICoKKyAqIFRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIFhQYXJzZUdlb21ldHJ5IGZyb20gdGhlIFgxMSBkaXN0cmlidXRpb24uCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqdHJhbnNmb3JtX3BhcnNlX2Nyb3Bfc3BlYyAoanBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbywgY29uc3QgY2hhciAqc3BlYykKK3sKKyAgaW5mby0+Y3JvcCA9IEZBTFNFOworICBpbmZvLT5jcm9wX3dpZHRoX3NldCA9IEpDUk9QX1VOU0VUOworICBpbmZvLT5jcm9wX2hlaWdodF9zZXQgPSBKQ1JPUF9VTlNFVDsKKyAgaW5mby0+Y3JvcF94b2Zmc2V0X3NldCA9IEpDUk9QX1VOU0VUOworICBpbmZvLT5jcm9wX3lvZmZzZXRfc2V0ID0gSkNST1BfVU5TRVQ7CisKKyAgaWYgKGlzZGlnaXQoKnNwZWMpKSB7CisgICAgLyogZmV0Y2ggd2lkdGggKi8KKyAgICBpZiAoISBqdF9yZWFkX2ludGVnZXIoJnNwZWMsICZpbmZvLT5jcm9wX3dpZHRoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpbmZvLT5jcm9wX3dpZHRoX3NldCA9IEpDUk9QX1BPUzsKKyAgfQorICBpZiAoKnNwZWMgPT0gJ3gnIHx8ICpzcGVjID09ICdYJykgewkKKyAgICAvKiBmZXRjaCBoZWlnaHQgKi8KKyAgICBzcGVjKys7CisgICAgaWYgKCEganRfcmVhZF9pbnRlZ2VyKCZzcGVjLCAmaW5mby0+Y3JvcF9oZWlnaHQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGluZm8tPmNyb3BfaGVpZ2h0X3NldCA9IEpDUk9QX1BPUzsKKyAgfQorICBpZiAoKnNwZWMgPT0gJysnIHx8ICpzcGVjID09ICctJykgeworICAgIC8qIGZldGNoIHhvZmZzZXQgKi8KKyAgICBpbmZvLT5jcm9wX3hvZmZzZXRfc2V0ID0gKCpzcGVjID09ICctJykgPyBKQ1JPUF9ORUcgOiBKQ1JPUF9QT1M7CisgICAgc3BlYysrOworICAgIGlmICghIGp0X3JlYWRfaW50ZWdlcigmc3BlYywgJmluZm8tPmNyb3BfeG9mZnNldCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCpzcGVjID09ICcrJyB8fCAqc3BlYyA9PSAnLScpIHsKKyAgICAvKiBmZXRjaCB5b2Zmc2V0ICovCisgICAgaW5mby0+Y3JvcF95b2Zmc2V0X3NldCA9ICgqc3BlYyA9PSAnLScpID8gSkNST1BfTkVHIDogSkNST1BfUE9TOworICAgIHNwZWMrKzsKKyAgICBpZiAoISBqdF9yZWFkX2ludGVnZXIoJnNwZWMsICZpbmZvLT5jcm9wX3lvZmZzZXQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8qIFdlIGhhZCBiZXR0ZXIgaGF2ZSBnb3R0ZW4gdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworICBpZiAoKnNwZWMgIT0gJ1wwJykKKyAgICByZXR1cm4gRkFMU0U7CisgIGluZm8tPmNyb3AgPSBUUlVFOworICByZXR1cm4gVFJVRTsKK30KKworCisvKiBUcmltIG9mZiBhbnkgcGFydGlhbCBpTUNVcyBvbiB0aGUgaW5kaWNhdGVkIGRlc3RpbmF0aW9uIGVkZ2UgKi8KKworTE9DQUwodm9pZCkKK3RyaW1fcmlnaHRfZWRnZSAoanBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbywgSkRJTUVOU0lPTiBmdWxsX3dpZHRoKQoreworICBKRElNRU5TSU9OIE1DVV9jb2xzOworCisgIE1DVV9jb2xzID0gaW5mby0+b3V0cHV0X3dpZHRoIC8gKGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIGlmIChNQ1VfY29scyA+IDAgJiYgaW5mby0+eF9jcm9wX29mZnNldCArIE1DVV9jb2xzID09CisgICAgICBmdWxsX3dpZHRoIC8gKGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpCisgICAgaW5mby0+b3V0cHV0X3dpZHRoID0gTUNVX2NvbHMgKiAoaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKK30KKworTE9DQUwodm9pZCkKK3RyaW1fYm90dG9tX2VkZ2UgKGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8sIEpESU1FTlNJT04gZnVsbF9oZWlnaHQpCit7CisgIEpESU1FTlNJT04gTUNVX3Jvd3M7CisKKyAgTUNVX3Jvd3MgPSBpbmZvLT5vdXRwdXRfaGVpZ2h0IC8gKGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIGlmIChNQ1Vfcm93cyA+IDAgJiYgaW5mby0+eV9jcm9wX29mZnNldCArIE1DVV9yb3dzID09CisgICAgICBmdWxsX2hlaWdodCAvIChpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKQorICAgIGluZm8tPm91dHB1dF9oZWlnaHQgPSBNQ1Vfcm93cyAqIChpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworfQorCisKIC8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZS4KICAqCisgKiBUaGlzIHJvdXRpbmUgZmlndXJlcyBvdXQgdGhlIHNpemUgdGhhdCB0aGUgb3V0cHV0IGltYWdlIHdpbGwgYmUKKyAqICh3aGljaCBpbXBsaWVzIHRoYXQgYWxsIHRoZSB0cmFuc2Zvcm0gcGFyYW1ldGVycyBtdXN0IGJlIHNldCBiZWZvcmUKKyAqIGl0IGlzIGNhbGxlZCkuCisgKgogICogV2UgYWxsb2NhdGUgdGhlIHdvcmtzcGFjZSB2aXJ0dWFsIGFycmF5cyBmcm9tIHRoZSBzb3VyY2UgZGVjb21wcmVzc2lvbgogICogb2JqZWN0LCBzbyB0aGF0IGFsbCB0aGUgYXJyYXlzIChib3RoIHRoZSBvcmlnaW5hbCBkYXRhIGFuZCB0aGUgd29ya3NwYWNlKQogICogd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hpbGUgbWFraW5nIG1lbW9yeSBtYW5hZ2VtZW50IGRlY2lzaW9ucy4KQEAgLTU2OSw5ICs4NTksMTMgQEAKIAkJCSAgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pCiB7CiAgIGp2aXJ0X2JhcnJheV9wdHIgKmNvZWZfYXJyYXlzID0gTlVMTDsKKyAgYm9vbGVhbiBuZWVkX3dvcmtzcGFjZSwgdHJhbnNwb3NlX2l0OwogICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBpbnQgY2k7CisgIEpESU1FTlNJT04geG9mZnNldCwgeW9mZnNldCwgd2lkdGhfaW5faU1DVXMsIGhlaWdodF9pbl9pTUNVczsKKyAgSkRJTUVOU0lPTiB3aWR0aF9pbl9ibG9ja3MsIGhlaWdodF9pbl9ibG9ja3M7CisgIGludCBjaSwgaF9zYW1wX2ZhY3Rvciwgdl9zYW1wX2ZhY3RvcjsKIAorICAvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gb3V0cHV0IGltYWdlICovCiAgIGlmIChpbmZvLT5mb3JjZV9ncmF5c2NhbGUgJiYKICAgICAgIHNyY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyICYmCiAgICAgICBzcmNpbmZvLT5udW1fY29tcG9uZW50cyA9PSAzKSB7CkBAIC01ODEsNTUgKzg3NSwxODEgQEAKICAgICAvKiBQcm9jZXNzIGFsbCB0aGUgY29tcG9uZW50cyAqLwogICAgIGluZm8tPm51bV9jb21wb25lbnRzID0gc3JjaW5mby0+bnVtX2NvbXBvbmVudHM7CiAgIH0KKyAgLyogSWYgdGhlcmUgaXMgb25seSBvbmUgb3V0cHV0IGNvbXBvbmVudCwgZm9yY2UgdGhlIGlNQ1Ugc2l6ZSB0byBiZSAxOworICAgKiBlbHNlIHVzZSB0aGUgc291cmNlIGlNQ1Ugc2l6ZS4gIChUaGlzIGFsbG93cyB1cyB0byBkbyB0aGUgcmlnaHQgdGhpbmcKKyAgICogd2hlbiByZWR1Y2luZyBjb2xvciB0byBncmF5c2NhbGUsIGFuZCBhbHNvIHByb3ZpZGVzIGEgaGFuZHkgd2F5IG9mCisgICAqIGNsZWFuaW5nIHVwICJmdW5ueSIgZ3JheXNjYWxlIGltYWdlcyB3aG9zZSBzYW1wbGluZyBmYWN0b3JzIGFyZSBub3QgMXgxLikKKyAgICovCiAKICAgc3dpdGNoIChpbmZvLT50cmFuc2Zvcm0pIHsKLSAgY2FzZSBKWEZPUk1fTk9ORToKLSAgY2FzZSBKWEZPUk1fRkxJUF9IOgotICAgIC8qIERvbid0IG5lZWQgYSB3b3Jrc3BhY2UgYXJyYXkgKi8KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9WOgotICBjYXNlIEpYRk9STV9ST1RfMTgwOgotICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgc2FtZSBkaW1lbnNpb25zIGFzIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgYXJyYXlzIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSwKLSAgICAgKiBzbyB0aGF0IHRyYW5zZm9ybSByb3V0aW5lcyBuZWVkIG5vdCB3b3JyeSBhYm91dCBtaXNzaW5nIGVkZ2UgYmxvY2tzLgotICAgICAqLwotICAgIGNvZWZfYXJyYXlzID0gKGp2aXJ0X2JhcnJheV9wdHIgKikKLSAgICAgICgqc3JjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLAotCVNJWkVPRihqdmlydF9iYXJyYXlfcHRyKSAqIGluZm8tPm51bV9jb21wb25lbnRzKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgY29tcHB0ciA9IHNyY2luZm8tPmNvbXBfaW5mbyArIGNpOwotICAgICAgY29lZl9hcnJheXNbY2ldID0gKCpzcmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gICAgYnJlYWs7CiAgIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKICAgY2FzZSBKWEZPUk1fVFJBTlNWRVJTRToKICAgY2FzZSBKWEZPUk1fUk9UXzkwOgogICBjYXNlIEpYRk9STV9ST1RfMjcwOgotICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgdHJhbnNwb3NlZCBkaW1lbnNpb25zLgotICAgICAqIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBhcnJheXMgcGFkZGVkIG91dCB0byB0aGUgbmV4dCBpTUNVIGJvdW5kYXJ5LAotICAgICAqIHNvIHRoYXQgdHJhbnNmb3JtIHJvdXRpbmVzIG5lZWQgbm90IHdvcnJ5IGFib3V0IG1pc3NpbmcgZWRnZSBibG9ja3MuCi0gICAgICovCi0gICAgY29lZl9hcnJheXMgPSAoanZpcnRfYmFycmF5X3B0ciAqKQotICAgICAgKCpzcmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsCi0JU0laRU9GKGp2aXJ0X2JhcnJheV9wdHIpICogaW5mby0+bnVtX2NvbXBvbmVudHMpOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBjb21wcHRyID0gc3JjaW5mby0+Y29tcF9pbmZvICsgY2k7Ci0gICAgICBjb2VmX2FycmF5c1tjaV0gPSAoKnNyY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOworICAgIGluZm8tPm91dHB1dF93aWR0aCA9IHNyY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICBpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gc3JjaW5mby0+aW1hZ2Vfd2lkdGg7CisgICAgaWYgKGluZm8tPm51bV9jb21wb25lbnRzID09IDEpIHsKKyAgICAgIGluZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gMTsKKyAgICAgIGluZm8tPm1heF92X3NhbXBfZmFjdG9yID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBzcmNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICAgIGluZm8tPm1heF92X3NhbXBfZmFjdG9yID0gc3JjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3I7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGluZm8tPm91dHB1dF93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOworICAgIGluZm8tPm91dHB1dF9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgaWYgKGluZm8tPm51bV9jb21wb25lbnRzID09IDEpIHsKKyAgICAgIGluZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gMTsKKyAgICAgIGluZm8tPm1heF92X3NhbXBfZmFjdG9yID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBzcmNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcjsKKyAgICAgIGluZm8tPm1heF92X3NhbXBfZmFjdG9yID0gc3JjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CiAgICAgfQogICAgIGJyZWFrOwogICB9CisKKyAgLyogSWYgY3JvcHBpbmcgaGFzIGJlZW4gcmVxdWVzdGVkLCBjb21wdXRlIHRoZSBjcm9wIGFyZWEncyBwb3NpdGlvbiBhbmQKKyAgICogZGltZW5zaW9ucywgZW5zdXJpbmcgdGhhdCBpdHMgdXBwZXIgbGVmdCBjb3JuZXIgZmFsbHMgYXQgYW4gaU1DVSBib3VuZGFyeS4KKyAgICovCisgIGlmIChpbmZvLT5jcm9wKSB7CisgICAgLyogSW5zZXJ0IGRlZmF1bHQgdmFsdWVzIGZvciB1bnNldCBjcm9wIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoaW5mby0+Y3JvcF94b2Zmc2V0X3NldCA9PSBKQ1JPUF9VTlNFVCkKKyAgICAgIGluZm8tPmNyb3BfeG9mZnNldCA9IDA7CS8qIGRlZmF1bHQgdG8gKzAgKi8KKyAgICBpZiAoaW5mby0+Y3JvcF95b2Zmc2V0X3NldCA9PSBKQ1JPUF9VTlNFVCkKKyAgICAgIGluZm8tPmNyb3BfeW9mZnNldCA9IDA7CS8qIGRlZmF1bHQgdG8gKzAgKi8KKyAgICBpZiAoaW5mby0+Y3JvcF94b2Zmc2V0ID49IGluZm8tPm91dHB1dF93aWR0aCB8fAorCWluZm8tPmNyb3BfeW9mZnNldCA+PSBpbmZvLT5vdXRwdXRfaGVpZ2h0KQorICAgICAgRVJSRVhJVChzcmNpbmZvLCBKRVJSX0JBRF9DUk9QX1NQRUMpOworICAgIGlmIChpbmZvLT5jcm9wX3dpZHRoX3NldCA9PSBKQ1JPUF9VTlNFVCkKKyAgICAgIGluZm8tPmNyb3Bfd2lkdGggPSBpbmZvLT5vdXRwdXRfd2lkdGggLSBpbmZvLT5jcm9wX3hvZmZzZXQ7CisgICAgaWYgKGluZm8tPmNyb3BfaGVpZ2h0X3NldCA9PSBKQ1JPUF9VTlNFVCkKKyAgICAgIGluZm8tPmNyb3BfaGVpZ2h0ID0gaW5mby0+b3V0cHV0X2hlaWdodCAtIGluZm8tPmNyb3BfeW9mZnNldDsKKyAgICAvKiBFbnN1cmUgcGFyYW1ldGVycyBhcmUgdmFsaWQgKi8KKyAgICBpZiAoaW5mby0+Y3JvcF93aWR0aCA8PSAwIHx8IGluZm8tPmNyb3Bfd2lkdGggPiBpbmZvLT5vdXRwdXRfd2lkdGggfHwKKwlpbmZvLT5jcm9wX2hlaWdodCA8PSAwIHx8IGluZm8tPmNyb3BfaGVpZ2h0ID4gaW5mby0+b3V0cHV0X2hlaWdodCB8fAorCWluZm8tPmNyb3BfeG9mZnNldCA+IGluZm8tPm91dHB1dF93aWR0aCAtIGluZm8tPmNyb3Bfd2lkdGggfHwKKwlpbmZvLT5jcm9wX3lvZmZzZXQgPiBpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gaW5mby0+Y3JvcF9oZWlnaHQpCisgICAgICBFUlJFWElUKHNyY2luZm8sIEpFUlJfQkFEX0NST1BfU1BFQyk7CisgICAgLyogQ29udmVydCBuZWdhdGl2ZSBjcm9wIG9mZnNldHMgaW50byByZWd1bGFyIG9mZnNldHMgKi8KKyAgICBpZiAoaW5mby0+Y3JvcF94b2Zmc2V0X3NldCA9PSBKQ1JPUF9ORUcpCisgICAgICB4b2Zmc2V0ID0gaW5mby0+b3V0cHV0X3dpZHRoIC0gaW5mby0+Y3JvcF93aWR0aCAtIGluZm8tPmNyb3BfeG9mZnNldDsKKyAgICBlbHNlCisgICAgICB4b2Zmc2V0ID0gaW5mby0+Y3JvcF94b2Zmc2V0OworICAgIGlmIChpbmZvLT5jcm9wX3lvZmZzZXRfc2V0ID09IEpDUk9QX05FRykKKyAgICAgIHlvZmZzZXQgPSBpbmZvLT5vdXRwdXRfaGVpZ2h0IC0gaW5mby0+Y3JvcF9oZWlnaHQgLSBpbmZvLT5jcm9wX3lvZmZzZXQ7CisgICAgZWxzZQorICAgICAgeW9mZnNldCA9IGluZm8tPmNyb3BfeW9mZnNldDsKKyAgICAvKiBOb3cgYWRqdXN0IHNvIHRoYXQgdXBwZXIgbGVmdCBjb3JuZXIgZmFsbHMgYXQgYW4gaU1DVSBib3VuZGFyeSAqLworICAgIGluZm8tPm91dHB1dF93aWR0aCA9CisgICAgICBpbmZvLT5jcm9wX3dpZHRoICsgKHhvZmZzZXQgJSAoaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgaW5mby0+b3V0cHV0X2hlaWdodCA9CisgICAgICBpbmZvLT5jcm9wX2hlaWdodCArICh5b2Zmc2V0ICUgKGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIC8qIFNhdmUgeC95IG9mZnNldHMgbWVhc3VyZWQgaW4gaU1DVXMgKi8KKyAgICBpbmZvLT54X2Nyb3Bfb2Zmc2V0ID0geG9mZnNldCAvIChpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICAgIGluZm8tPnlfY3JvcF9vZmZzZXQgPSB5b2Zmc2V0IC8gKGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIH0gZWxzZSB7CisgICAgaW5mby0+eF9jcm9wX29mZnNldCA9IDA7CisgICAgaW5mby0+eV9jcm9wX29mZnNldCA9IDA7CisgIH0KKworICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgd2UgbmVlZCB3b3Jrc3BhY2UgYXJyYXlzLAorICAgKiBhbmQgaWYgc28gd2hldGhlciB0aGV5IGFyZSB0cmFuc3Bvc2VkIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UuCisgICAqLworICBuZWVkX3dvcmtzcGFjZSA9IEZBTFNFOworICB0cmFuc3Bvc2VfaXQgPSBGQUxTRTsKKyAgc3dpdGNoIChpbmZvLT50cmFuc2Zvcm0pIHsKKyAgY2FzZSBKWEZPUk1fTk9ORToKKyAgICBpZiAoaW5mby0+eF9jcm9wX29mZnNldCAhPSAwIHx8IGluZm8tPnlfY3JvcF9vZmZzZXQgIT0gMCkKKyAgICAgIG5lZWRfd29ya3NwYWNlID0gVFJVRTsKKyAgICAvKiBObyB3b3Jrc3BhY2UgbmVlZGVkIGlmIG5laXRoZXIgY3JvcHBpbmcgbm9yIHRyYW5zZm9ybWluZyAqLworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9GTElQX0g6CisgICAgaWYgKGluZm8tPnRyaW0pCisgICAgICB0cmltX3JpZ2h0X2VkZ2UoaW5mbywgc3JjaW5mby0+aW1hZ2Vfd2lkdGgpOworICAgIGlmIChpbmZvLT55X2Nyb3Bfb2Zmc2V0ICE9IDApCisgICAgICBuZWVkX3dvcmtzcGFjZSA9IFRSVUU7CisgICAgLyogZG9fZmxpcF9oX25vX2Nyb3AgZG9lc24ndCBuZWVkIGEgd29ya3NwYWNlIGFycmF5ICovCisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX0ZMSVBfVjoKKyAgICBpZiAoaW5mby0+dHJpbSkKKyAgICAgIHRyaW1fYm90dG9tX2VkZ2UoaW5mbywgc3JjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKKyAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHNhbWUgZGltZW5zaW9ucyBhcyBzb3VyY2UgaW1hZ2UuICovCisgICAgbmVlZF93b3Jrc3BhY2UgPSBUUlVFOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6CisgICAgLyogdHJhbnNwb3NlIGRvZXMgTk9UIGhhdmUgdG8gdHJpbSBhbnl0aGluZyAqLworICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgdHJhbnNwb3NlZCBkaW1lbnNpb25zLiAqLworICAgIG5lZWRfd29ya3NwYWNlID0gVFJVRTsKKyAgICB0cmFuc3Bvc2VfaXQgPSBUUlVFOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgorICAgIGlmIChpbmZvLT50cmltKSB7CisgICAgICB0cmltX3JpZ2h0X2VkZ2UoaW5mbywgc3JjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKKyAgICAgIHRyaW1fYm90dG9tX2VkZ2UoaW5mbywgc3JjaW5mby0+aW1hZ2Vfd2lkdGgpOworICAgIH0KKyAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHRyYW5zcG9zZWQgZGltZW5zaW9ucy4gKi8KKyAgICBuZWVkX3dvcmtzcGFjZSA9IFRSVUU7CisgICAgdHJhbnNwb3NlX2l0ID0gVFJVRTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fUk9UXzkwOgorICAgIGlmIChpbmZvLT50cmltKQorICAgICAgdHJpbV9yaWdodF9lZGdlKGluZm8sIHNyY2luZm8tPmltYWdlX2hlaWdodCk7CisgICAgLyogTmVlZCB3b3Jrc3BhY2UgYXJyYXlzIGhhdmluZyB0cmFuc3Bvc2VkIGRpbWVuc2lvbnMuICovCisgICAgbmVlZF93b3Jrc3BhY2UgPSBUUlVFOworICAgIHRyYW5zcG9zZV9pdCA9IFRSVUU7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF8xODA6CisgICAgaWYgKGluZm8tPnRyaW0pIHsKKyAgICAgIHRyaW1fcmlnaHRfZWRnZShpbmZvLCBzcmNpbmZvLT5pbWFnZV93aWR0aCk7CisgICAgICB0cmltX2JvdHRvbV9lZGdlKGluZm8sIHNyY2luZm8tPmltYWdlX2hlaWdodCk7CisgICAgfQorICAgIC8qIE5lZWQgd29ya3NwYWNlIGFycmF5cyBoYXZpbmcgc2FtZSBkaW1lbnNpb25zIGFzIHNvdXJjZSBpbWFnZS4gKi8KKyAgICBuZWVkX3dvcmtzcGFjZSA9IFRSVUU7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1JPVF8yNzA6CisgICAgaWYgKGluZm8tPnRyaW0pCisgICAgICB0cmltX2JvdHRvbV9lZGdlKGluZm8sIHNyY2luZm8tPmltYWdlX3dpZHRoKTsKKyAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHRyYW5zcG9zZWQgZGltZW5zaW9ucy4gKi8KKyAgICBuZWVkX3dvcmtzcGFjZSA9IFRSVUU7CisgICAgdHJhbnNwb3NlX2l0ID0gVFJVRTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIEFsbG9jYXRlIHdvcmtzcGFjZSBpZiBuZWVkZWQuCisgICAqIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBhcnJheXMgcGFkZGVkIG91dCB0byB0aGUgbmV4dCBpTUNVIGJvdW5kYXJ5LAorICAgKiBzbyB0aGF0IHRyYW5zZm9ybSByb3V0aW5lcyBuZWVkIG5vdCB3b3JyeSBhYm91dCBtaXNzaW5nIGVkZ2UgYmxvY2tzLgorICAgKi8KKyAgaWYgKG5lZWRfd29ya3NwYWNlKSB7CisgICAgY29lZl9hcnJheXMgPSAoanZpcnRfYmFycmF5X3B0ciAqKQorICAgICAgKCpzcmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgSlBPT0xfSU1BR0UsCisJCVNJWkVPRihqdmlydF9iYXJyYXlfcHRyKSAqIGluZm8tPm51bV9jb21wb25lbnRzKTsKKyAgICB3aWR0aF9pbl9pTUNVcyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgaW5mby0+b3V0cHV0X3dpZHRoLAorCQkgICAgKGxvbmcpIChpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICBoZWlnaHRfaW5faU1DVXMgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGluZm8tPm91dHB1dF9oZWlnaHQsCisJCSAgICAobG9uZykgKGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gc3JjaW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgICBpZiAoaW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMSkgeworCS8qIHdlJ3JlIGdvaW5nIHRvIGZvcmNlIHNhbXAgZmFjdG9ycyB0byAxeDEgaW4gdGhpcyBjYXNlICovCisJaF9zYW1wX2ZhY3RvciA9IHZfc2FtcF9mYWN0b3IgPSAxOworICAgICAgfSBlbHNlIGlmICh0cmFuc3Bvc2VfaXQpIHsKKwloX3NhbXBfZmFjdG9yID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwl2X3NhbXBfZmFjdG9yID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAgIH0gZWxzZSB7CisJaF9zYW1wX2ZhY3RvciA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisJdl9zYW1wX2ZhY3RvciA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgICB9CisgICAgICB3aWR0aF9pbl9ibG9ja3MgPSB3aWR0aF9pbl9pTUNVcyAqIGhfc2FtcF9mYWN0b3I7CisgICAgICBoZWlnaHRfaW5fYmxvY2tzID0gaGVpZ2h0X2luX2lNQ1VzICogdl9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvZWZfYXJyYXlzW2NpXSA9ICgqc3JjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisJIHdpZHRoX2luX2Jsb2NrcywgaGVpZ2h0X2luX2Jsb2NrcywgKEpESU1FTlNJT04pIHZfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgfQorCiAgIGluZm8tPndvcmtzcGFjZV9jb2VmX2FycmF5cyA9IGNvZWZfYXJyYXlzOwogfQogCkBAIC02NDIsMTQgKzEwNjIsOCBAQAogICBpbnQgdGJsbm8sIGksIGosIGNpLCBpdGVtcDsKICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKICAgSlFVQU5UX1RCTCAqcXRibHB0cjsKLSAgSkRJTUVOU0lPTiBkdGVtcDsKICAgVUlOVDE2IHF0ZW1wOwogCi0gIC8qIFRyYW5zcG9zZSBiYXNpYyBpbWFnZSBkaW1lbnNpb25zICovCi0gIGR0ZW1wID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGg7Ci0gIGRzdGluZm8tPmltYWdlX3dpZHRoID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0OwotICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBkdGVtcDsKLQogICAvKiBUcmFuc3Bvc2Ugc2FtcGxpbmcgZmFjdG9ycyAqLwogICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewogICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKQEAgLTY3NCw0NiArMTA4OCwxNTkgQEAKIH0KIAogCi0vKiBUcmltIG9mZiBhbnkgcGFydGlhbCBpTUNVcyBvbiB0aGUgaW5kaWNhdGVkIGRlc3RpbmF0aW9uIGVkZ2UgKi8KKy8qIEFkanVzdCBFeGlmIGltYWdlIHBhcmFtZXRlcnMuCisgKgorICogV2UgdHJ5IHRvIGFkanVzdCB0aGUgVGFncyBFeGlmSW1hZ2VXaWR0aCBhbmQgRXhpZkltYWdlSGVpZ2h0IGlmIHBvc3NpYmxlLgorICovCiAKIExPQ0FMKHZvaWQpCi10cmltX3JpZ2h0X2VkZ2UgKGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCithZGp1c3RfZXhpZl9wYXJhbWV0ZXJzIChKT0NURVQgRkFSICogZGF0YSwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCUpESU1FTlNJT04gbmV3X3dpZHRoLCBKRElNRU5TSU9OIG5ld19oZWlnaHQpCiB7Ci0gIGludCBjaSwgbWF4X2hfc2FtcF9mYWN0b3I7Ci0gIEpESU1FTlNJT04gTUNVX2NvbHM7CisgIGJvb2xlYW4gaXNfbW90b3JvbGE7IC8qIEZsYWcgZm9yIGJ5dGUgb3JkZXIgKi8KKyAgdW5zaWduZWQgaW50IG51bWJlcl9vZl90YWdzLCB0YWdudW07CisgIHVuc2lnbmVkIGludCBmaXJzdG9mZnNldCwgb2Zmc2V0OworICBKRElNRU5TSU9OIG5ld192YWx1ZTsKIAotICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgbWF4X2hfc2FtcF9mYWN0b3Igb3Vyc2VsdmVzLAotICAgKiBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHNldCB5ZXQgaW4gdGhlIGRlc3RpbmF0aW9uCi0gICAqIChhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHNvdXJjZSdzIHZhbHVlKS4KLSAgICovCi0gIG1heF9oX3NhbXBfZmFjdG9yID0gMTsKLSAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICBpbnQgaF9zYW1wX2ZhY3RvciA9IGRzdGluZm8tPmNvbXBfaW5mb1tjaV0uaF9zYW1wX2ZhY3RvcjsKLSAgICBtYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChtYXhfaF9zYW1wX2ZhY3RvciwgaF9zYW1wX2ZhY3Rvcik7CisgIGlmIChsZW5ndGggPCAxMikgcmV0dXJuOyAvKiBMZW5ndGggb2YgYW4gSUZEIGVudHJ5ICovCisKKyAgLyogRGlzY292ZXIgYnl0ZSBvcmRlciAqLworICBpZiAoR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NDkgJiYgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NDkpCisgICAgaXNfbW90b3JvbGEgPSBGQUxTRTsKKyAgZWxzZSBpZiAoR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NEQgJiYgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NEQpCisgICAgaXNfbW90b3JvbGEgPSBUUlVFOworICBlbHNlCisgICAgcmV0dXJuOworCisgIC8qIENoZWNrIFRhZyBNYXJrICovCisgIGlmIChpc19tb3Rvcm9sYSkgeworICAgIGlmIChHRVRKT0NURVQoZGF0YVsyXSkgIT0gMCkgcmV0dXJuOworICAgIGlmIChHRVRKT0NURVQoZGF0YVszXSkgIT0gMHgyQSkgcmV0dXJuOworICB9IGVsc2UgeworICAgIGlmIChHRVRKT0NURVQoZGF0YVszXSkgIT0gMCkgcmV0dXJuOworICAgIGlmIChHRVRKT0NURVQoZGF0YVsyXSkgIT0gMHgyQSkgcmV0dXJuOwogICB9Ci0gIE1DVV9jb2xzID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGggLyAobWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKLSAgaWYgKE1DVV9jb2xzID4gMCkJCS8qIGNhbid0IHRyaW0gdG8gMCBwaXhlbHMgKi8KLSAgICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IE1DVV9jb2xzICogKG1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci19CiAKLUxPQ0FMKHZvaWQpCi10cmltX2JvdHRvbV9lZGdlIChqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQotewotICBpbnQgY2ksIG1heF92X3NhbXBfZmFjdG9yOwotICBKRElNRU5TSU9OIE1DVV9yb3dzOwotCi0gIC8qIFdlIGhhdmUgdG8gY29tcHV0ZSBtYXhfdl9zYW1wX2ZhY3RvciBvdXJzZWx2ZXMsCi0gICAqIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gc2V0IHlldCBpbiB0aGUgZGVzdGluYXRpb24KLSAgICogKGFuZCB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgc291cmNlJ3MgdmFsdWUpLgotICAgKi8KLSAgbWF4X3Zfc2FtcF9mYWN0b3IgPSAxOwotICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgIGludCB2X3NhbXBfZmFjdG9yID0gZHN0aW5mby0+Y29tcF9pbmZvW2NpXS52X3NhbXBfZmFjdG9yOwotICAgIG1heF92X3NhbXBfZmFjdG9yID0gTUFYKG1heF92X3NhbXBfZmFjdG9yLCB2X3NhbXBfZmFjdG9yKTsKKyAgLyogR2V0IGZpcnN0IElGRCBvZmZzZXQgKG9mZnNldCB0byBJRkQwKSAqLworICBpZiAoaXNfbW90b3JvbGEpIHsKKyAgICBpZiAoR0VUSk9DVEVUKGRhdGFbNF0pICE9IDApIHJldHVybjsKKyAgICBpZiAoR0VUSk9DVEVUKGRhdGFbNV0pICE9IDApIHJldHVybjsKKyAgICBmaXJzdG9mZnNldCA9IEdFVEpPQ1RFVChkYXRhWzZdKTsKKyAgICBmaXJzdG9mZnNldCA8PD0gODsKKyAgICBmaXJzdG9mZnNldCArPSBHRVRKT0NURVQoZGF0YVs3XSk7CisgIH0gZWxzZSB7CisgICAgaWYgKEdFVEpPQ1RFVChkYXRhWzddKSAhPSAwKSByZXR1cm47CisgICAgaWYgKEdFVEpPQ1RFVChkYXRhWzZdKSAhPSAwKSByZXR1cm47CisgICAgZmlyc3RvZmZzZXQgPSBHRVRKT0NURVQoZGF0YVs1XSk7CisgICAgZmlyc3RvZmZzZXQgPDw9IDg7CisgICAgZmlyc3RvZmZzZXQgKz0gR0VUSk9DVEVUKGRhdGFbNF0pOwogICB9Ci0gIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKG1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7Ci0gIGlmIChNQ1Vfcm93cyA+IDApCQkvKiBjYW4ndCB0cmltIHRvIDAgcGl4ZWxzICovCi0gICAgZHN0aW5mby0+aW1hZ2VfaGVpZ2h0ID0gTUNVX3Jvd3MgKiAobWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKKyAgaWYgKGZpcnN0b2Zmc2V0ID4gbGVuZ3RoIC0gMikgcmV0dXJuOyAvKiBjaGVjayBlbmQgb2YgZGF0YSBzZWdtZW50ICovCisKKyAgLyogR2V0IHRoZSBudW1iZXIgb2YgZGlyZWN0b3J5IGVudHJpZXMgY29udGFpbmVkIGluIHRoaXMgSUZEICovCisgIGlmIChpc19tb3Rvcm9sYSkgeworICAgIG51bWJlcl9vZl90YWdzID0gR0VUSk9DVEVUKGRhdGFbZmlyc3RvZmZzZXRdKTsKKyAgICBudW1iZXJfb2ZfdGFncyA8PD0gODsKKyAgICBudW1iZXJfb2ZfdGFncyArPSBHRVRKT0NURVQoZGF0YVtmaXJzdG9mZnNldCsxXSk7CisgIH0gZWxzZSB7CisgICAgbnVtYmVyX29mX3RhZ3MgPSBHRVRKT0NURVQoZGF0YVtmaXJzdG9mZnNldCsxXSk7CisgICAgbnVtYmVyX29mX3RhZ3MgPDw9IDg7CisgICAgbnVtYmVyX29mX3RhZ3MgKz0gR0VUSk9DVEVUKGRhdGFbZmlyc3RvZmZzZXRdKTsKKyAgfQorICBpZiAobnVtYmVyX29mX3RhZ3MgPT0gMCkgcmV0dXJuOworICBmaXJzdG9mZnNldCArPSAyOworCisgIC8qIFNlYXJjaCBmb3IgRXhpZlN1YklGRCBvZmZzZXQgVGFnIGluIElGRDAgKi8KKyAgZm9yICg7OykgeworICAgIGlmIChmaXJzdG9mZnNldCA+IGxlbmd0aCAtIDEyKSByZXR1cm47IC8qIGNoZWNrIGVuZCBvZiBkYXRhIHNlZ21lbnQgKi8KKyAgICAvKiBHZXQgVGFnIG51bWJlciAqLworICAgIGlmIChpc19tb3Rvcm9sYSkgeworICAgICAgdGFnbnVtID0gR0VUSk9DVEVUKGRhdGFbZmlyc3RvZmZzZXRdKTsKKyAgICAgIHRhZ251bSA8PD0gODsKKyAgICAgIHRhZ251bSArPSBHRVRKT0NURVQoZGF0YVtmaXJzdG9mZnNldCsxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhZ251bSA9IEdFVEpPQ1RFVChkYXRhW2ZpcnN0b2Zmc2V0KzFdKTsKKyAgICAgIHRhZ251bSA8PD0gODsKKyAgICAgIHRhZ251bSArPSBHRVRKT0NURVQoZGF0YVtmaXJzdG9mZnNldF0pOworICAgIH0KKyAgICBpZiAodGFnbnVtID09IDB4ODc2OSkgYnJlYWs7IC8qIGZvdW5kIEV4aWZTdWJJRkQgb2Zmc2V0IFRhZyAqLworICAgIGlmICgtLW51bWJlcl9vZl90YWdzID09IDApIHJldHVybjsKKyAgICBmaXJzdG9mZnNldCArPSAxMjsKKyAgfQorCisgIC8qIEdldCB0aGUgRXhpZlN1YklGRCBvZmZzZXQgKi8KKyAgaWYgKGlzX21vdG9yb2xhKSB7CisgICAgaWYgKEdFVEpPQ1RFVChkYXRhW2ZpcnN0b2Zmc2V0KzhdKSAhPSAwKSByZXR1cm47CisgICAgaWYgKEdFVEpPQ1RFVChkYXRhW2ZpcnN0b2Zmc2V0KzldKSAhPSAwKSByZXR1cm47CisgICAgb2Zmc2V0ID0gR0VUSk9DVEVUKGRhdGFbZmlyc3RvZmZzZXQrMTBdKTsKKyAgICBvZmZzZXQgPDw9IDg7CisgICAgb2Zmc2V0ICs9IEdFVEpPQ1RFVChkYXRhW2ZpcnN0b2Zmc2V0KzExXSk7CisgIH0gZWxzZSB7CisgICAgaWYgKEdFVEpPQ1RFVChkYXRhW2ZpcnN0b2Zmc2V0KzExXSkgIT0gMCkgcmV0dXJuOworICAgIGlmIChHRVRKT0NURVQoZGF0YVtmaXJzdG9mZnNldCsxMF0pICE9IDApIHJldHVybjsKKyAgICBvZmZzZXQgPSBHRVRKT0NURVQoZGF0YVtmaXJzdG9mZnNldCs5XSk7CisgICAgb2Zmc2V0IDw8PSA4OworICAgIG9mZnNldCArPSBHRVRKT0NURVQoZGF0YVtmaXJzdG9mZnNldCs4XSk7CisgIH0KKyAgaWYgKG9mZnNldCA+IGxlbmd0aCAtIDIpIHJldHVybjsgLyogY2hlY2sgZW5kIG9mIGRhdGEgc2VnbWVudCAqLworCisgIC8qIEdldCB0aGUgbnVtYmVyIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGNvbnRhaW5lZCBpbiB0aGlzIFN1YklGRCAqLworICBpZiAoaXNfbW90b3JvbGEpIHsKKyAgICBudW1iZXJfb2ZfdGFncyA9IEdFVEpPQ1RFVChkYXRhW29mZnNldF0pOworICAgIG51bWJlcl9vZl90YWdzIDw8PSA4OworICAgIG51bWJlcl9vZl90YWdzICs9IEdFVEpPQ1RFVChkYXRhW29mZnNldCsxXSk7CisgIH0gZWxzZSB7CisgICAgbnVtYmVyX29mX3RhZ3MgPSBHRVRKT0NURVQoZGF0YVtvZmZzZXQrMV0pOworICAgIG51bWJlcl9vZl90YWdzIDw8PSA4OworICAgIG51bWJlcl9vZl90YWdzICs9IEdFVEpPQ1RFVChkYXRhW29mZnNldF0pOworICB9CisgIGlmIChudW1iZXJfb2ZfdGFncyA8IDIpIHJldHVybjsKKyAgb2Zmc2V0ICs9IDI7CisKKyAgLyogU2VhcmNoIGZvciBFeGlmSW1hZ2VXaWR0aCBhbmQgRXhpZkltYWdlSGVpZ2h0IFRhZ3MgaW4gdGhpcyBTdWJJRkQgKi8KKyAgZG8geworICAgIGlmIChvZmZzZXQgPiBsZW5ndGggLSAxMikgcmV0dXJuOyAvKiBjaGVjayBlbmQgb2YgZGF0YSBzZWdtZW50ICovCisgICAgLyogR2V0IFRhZyBudW1iZXIgKi8KKyAgICBpZiAoaXNfbW90b3JvbGEpIHsKKyAgICAgIHRhZ251bSA9IEdFVEpPQ1RFVChkYXRhW29mZnNldF0pOworICAgICAgdGFnbnVtIDw8PSA4OworICAgICAgdGFnbnVtICs9IEdFVEpPQ1RFVChkYXRhW29mZnNldCsxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhZ251bSA9IEdFVEpPQ1RFVChkYXRhW29mZnNldCsxXSk7CisgICAgICB0YWdudW0gPDw9IDg7CisgICAgICB0YWdudW0gKz0gR0VUSk9DVEVUKGRhdGFbb2Zmc2V0XSk7CisgICAgfQorICAgIGlmICh0YWdudW0gPT0gMHhBMDAyIHx8IHRhZ251bSA9PSAweEEwMDMpIHsKKyAgICAgIGlmICh0YWdudW0gPT0gMHhBMDAyKQorCW5ld192YWx1ZSA9IG5ld193aWR0aDsgLyogRXhpZkltYWdlV2lkdGggVGFnICovCisgICAgICBlbHNlCisJbmV3X3ZhbHVlID0gbmV3X2hlaWdodDsgLyogRXhpZkltYWdlSGVpZ2h0IFRhZyAqLworICAgICAgaWYgKGlzX21vdG9yb2xhKSB7CisJZGF0YVtvZmZzZXQrMl0gPSAwOyAvKiBGb3JtYXQgPSB1bnNpZ25lZCBsb25nICg0IG9jdGV0cykgKi8KKwlkYXRhW29mZnNldCszXSA9IDQ7CisJZGF0YVtvZmZzZXQrNF0gPSAwOyAvKiBOdW1iZXIgT2YgQ29tcG9uZW50cyA9IDEgKi8KKwlkYXRhW29mZnNldCs1XSA9IDA7CisJZGF0YVtvZmZzZXQrNl0gPSAwOworCWRhdGFbb2Zmc2V0KzddID0gMTsKKwlkYXRhW29mZnNldCs4XSA9IDA7CisJZGF0YVtvZmZzZXQrOV0gPSAwOworCWRhdGFbb2Zmc2V0KzEwXSA9IChKT0NURVQpKChuZXdfdmFsdWUgPj4gOCkgJiAweEZGKTsKKwlkYXRhW29mZnNldCsxMV0gPSAoSk9DVEVUKShuZXdfdmFsdWUgJiAweEZGKTsKKyAgICAgIH0gZWxzZSB7CisJZGF0YVtvZmZzZXQrMl0gPSA0OyAvKiBGb3JtYXQgPSB1bnNpZ25lZCBsb25nICg0IG9jdGV0cykgKi8KKwlkYXRhW29mZnNldCszXSA9IDA7CisJZGF0YVtvZmZzZXQrNF0gPSAxOyAvKiBOdW1iZXIgT2YgQ29tcG9uZW50cyA9IDEgKi8KKwlkYXRhW29mZnNldCs1XSA9IDA7CisJZGF0YVtvZmZzZXQrNl0gPSAwOworCWRhdGFbb2Zmc2V0KzddID0gMDsKKwlkYXRhW29mZnNldCs4XSA9IChKT0NURVQpKG5ld192YWx1ZSAmIDB4RkYpOworCWRhdGFbb2Zmc2V0KzldID0gKEpPQ1RFVCkoKG5ld192YWx1ZSA+PiA4KSAmIDB4RkYpOworCWRhdGFbb2Zmc2V0KzEwXSA9IDA7CisJZGF0YVtvZmZzZXQrMTFdID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgb2Zmc2V0ICs9IDEyOworICB9IHdoaWxlICgtLW51bWJlcl9vZl90YWdzKTsKIH0KIAogCkBAIC03MzYsMTggKzEyNjMsMjIgQEAKIHsKICAgLyogSWYgZm9yY2UtdG8tZ3JheXNjYWxlIGlzIHJlcXVlc3RlZCwgYWRqdXN0IGRlc3RpbmF0aW9uIHBhcmFtZXRlcnMgKi8KICAgaWYgKGluZm8tPmZvcmNlX2dyYXlzY2FsZSkgewotICAgIC8qIFdlIHVzZSBqcGVnX3NldF9jb2xvcnNwYWNlIHRvIG1ha2Ugc3VyZSBzdWJzaWRpYXJ5IHNldHRpbmdzIGdldCBmaXhlZAotICAgICAqIHByb3Blcmx5LiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgdGFyZ2V0IGhfc2FtcF9mYWN0b3IgJiB2X3NhbXBfZmFjdG9yCi0gICAgICogd2lsbCBnZXQgc2V0IHRvIDEsIHdoaWNoIHR5cGljYWxseSB3b24ndCBtYXRjaCB0aGUgc291cmNlLgotICAgICAqIEluIGZhY3Qgd2UgZG8gdGhpcyBldmVuIGlmIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSBncmF5c2NhbGU7IHRoYXQKLSAgICAgKiBwcm92aWRlcyBhbiBlYXN5IHdheSBvZiBjb2VyY2luZyBhIGdyYXlzY2FsZSBKUEVHIHdpdGggZnVubnkgc2FtcGxpbmcKLSAgICAgKiBmYWN0b3JzIHRvIHRoZSBjdXN0b21hcnkgMSwxLiAgKFNvbWUgZGVjb2RlcnMgZmFpbCBvbiBvdGhlciBmYWN0b3JzLikKKyAgICAvKiBGaXJzdCwgZW5zdXJlIHdlIGhhdmUgWUNiQ3Igb3IgZ3JheXNjYWxlIGRhdGEsIGFuZCB0aGF0IHRoZSBzb3VyY2UncworICAgICAqIFkgY2hhbm5lbCBpcyBmdWxsIHJlc29sdXRpb24uICAoTm8gcmVhc29uYWJsZSBwZXJzb24gd291bGQgbWFrZSBZCisgICAgICogYmUgbGVzcyB0aGFuIGZ1bGwgcmVzb2x1dGlvbiwgc28gYWN0dWFsbHkgY29waW5nIHdpdGggdGhhdCBjYXNlCisgICAgICogaXNuJ3Qgd29ydGggZXh0cmEgY29kZSBzcGFjZS4gIEJ1dCB3ZSBjaGVjayBpdCB0byBhdm9pZCBjcmFzaGluZy4pCiAgICAgICovCi0gICAgaWYgKChkc3RpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDciAmJgotCSBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9PSAzKSB8fAotCShkc3RpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUgJiYKLQkgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMSkpIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gcHJlc2VydmUgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZSBudW1iZXIuICovCisgICAgaWYgKCgoZHN0aW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgJiYKKwkgIGRzdGluZm8tPm51bV9jb21wb25lbnRzID09IDMpIHx8CisJIChkc3RpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUgJiYKKwkgIGRzdGluZm8tPm51bV9jb21wb25lbnRzID09IDEpKSAmJgorCXNyY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID09IHNyY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCisJc3JjaW5mby0+Y29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPT0gc3JjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAgIC8qIFdlIHVzZSBqcGVnX3NldF9jb2xvcnNwYWNlIHRvIG1ha2Ugc3VyZSBzdWJzaWRpYXJ5IHNldHRpbmdzIGdldCBmaXhlZAorICAgICAgICogcHJvcGVybHkuICBBbW9uZyBvdGhlciB0aGluZ3MsIGl0IHNldHMgdGhlIHRhcmdldCBoX3NhbXBfZmFjdG9yICYKKyAgICAgICAqIHZfc2FtcF9mYWN0b3IgdG8gMSwgd2hpY2ggdHlwaWNhbGx5IHdvbid0IG1hdGNoIHRoZSBzb3VyY2UuCisgICAgICAgKiBXZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBzb3VyY2UncyBxdWFudGl6YXRpb24gdGFibGUgbnVtYmVyLCBob3dldmVyLgorICAgICAgICovCiAgICAgICBpbnQgc3ZfcXVhbnRfdGJsX25vID0gZHN0aW5mby0+Y29tcF9pbmZvWzBdLnF1YW50X3RibF9ubzsKICAgICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoZHN0aW5mbywgSkNTX0dSQVlTQ0FMRSk7CiAgICAgICBkc3RpbmZvLT5jb21wX2luZm9bMF0ucXVhbnRfdGJsX25vID0gc3ZfcXVhbnRfdGJsX25vOwpAQCAtNzU1LDQ4ICsxMjg2LDUyIEBACiAgICAgICAvKiBTb3JyeSwgY2FuJ3QgZG8gaXQgKi8KICAgICAgIEVSUkVYSVQoZHN0aW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwogICAgIH0KKyAgfSBlbHNlIGlmIChpbmZvLT5udW1fY29tcG9uZW50cyA9PSAxKSB7CisgICAgLyogRm9yIGEgc2luZ2xlLWNvbXBvbmVudCBzb3VyY2UsIHdlIGZvcmNlIHRoZSBkZXN0aW5hdGlvbiBzYW1wbGluZyBmYWN0b3JzCisgICAgICogdG8gMXgxLCB3aXRoIG9yIHdpdGhvdXQgZm9yY2VfZ3JheXNjYWxlLiAgVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBzb21lCisgICAgICogZGVjb2RlcnMgY2hva2Ugb24gZ3JheXNjYWxlIGltYWdlcyB3aXRoIG90aGVyIHNhbXBsaW5nIGZhY3RvcnMuCisgICAgICovCisgICAgZHN0aW5mby0+Y29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGRzdGluZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMTsKICAgfQogCi0gIC8qIENvcnJlY3QgdGhlIGRlc3RpbmF0aW9uJ3MgaW1hZ2UgZGltZW5zaW9ucyBldGMgaWYgbmVjZXNzYXJ5ICovCisgIC8qIENvcnJlY3QgdGhlIGRlc3RpbmF0aW9uJ3MgaW1hZ2UgZGltZW5zaW9ucyBhcyBuZWNlc3NhcnkKKyAgICogZm9yIGNyb3AgYW5kIHJvdGF0ZS9mbGlwIG9wZXJhdGlvbnMuCisgICAqLworICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IGluZm8tPm91dHB1dF93aWR0aDsKKyAgZHN0aW5mby0+aW1hZ2VfaGVpZ2h0ID0gaW5mby0+b3V0cHV0X2hlaWdodDsKKworICAvKiBUcmFuc3Bvc2UgZGVzdGluYXRpb24gaW1hZ2UgcGFyYW1ldGVycyAqLwogICBzd2l0Y2ggKGluZm8tPnRyYW5zZm9ybSkgewotICBjYXNlIEpYRk9STV9OT05FOgotICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICBicmVhazsKLSAgY2FzZSBKWEZPUk1fRkxJUF9IOgotICAgIGlmIChpbmZvLT50cmltKQotICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9GTElQX1Y6Ci0gICAgaWYgKGluZm8tPnRyaW0pCi0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwogICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6Ci0gICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7Ci0gICAgLyogdHJhbnNwb3NlIGRvZXMgTk9UIGhhdmUgdG8gdHJpbSBhbnl0aGluZyAqLwotICAgIGJyZWFrOwogICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgotICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOwotICAgIGlmIChpbmZvLT50cmltKSB7Ci0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIH0KLSAgICBicmVhazsKICAgY2FzZSBKWEZPUk1fUk9UXzkwOgotICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOwotICAgIGlmIChpbmZvLT50cmltKQotICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOwotICAgIGJyZWFrOwotICBjYXNlIEpYRk9STV9ST1RfMTgwOgotICAgIGlmIChpbmZvLT50cmltKSB7Ci0gICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7Ci0gICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOwotICAgIH0KLSAgICBicmVhazsKICAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKICAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKLSAgICBpZiAoaW5mby0+dHJpbSkKLSAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7CiAgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvKiBBZGp1c3QgRXhpZiBwcm9wZXJ0aWVzICovCisgIGlmIChzcmNpbmZvLT5tYXJrZXJfbGlzdCAhPSBOVUxMICYmCisgICAgICBzcmNpbmZvLT5tYXJrZXJfbGlzdC0+bWFya2VyID09IEpQRUdfQVBQMCsxICYmCisgICAgICBzcmNpbmZvLT5tYXJrZXJfbGlzdC0+ZGF0YV9sZW5ndGggPj0gNiAmJgorICAgICAgR0VUSk9DVEVUKHNyY2luZm8tPm1hcmtlcl9saXN0LT5kYXRhWzBdKSA9PSAweDQ1ICYmCisgICAgICBHRVRKT0NURVQoc3JjaW5mby0+bWFya2VyX2xpc3QtPmRhdGFbMV0pID09IDB4NzggJiYKKyAgICAgIEdFVEpPQ1RFVChzcmNpbmZvLT5tYXJrZXJfbGlzdC0+ZGF0YVsyXSkgPT0gMHg2OSAmJgorICAgICAgR0VUSk9DVEVUKHNyY2luZm8tPm1hcmtlcl9saXN0LT5kYXRhWzNdKSA9PSAweDY2ICYmCisgICAgICBHRVRKT0NURVQoc3JjaW5mby0+bWFya2VyX2xpc3QtPmRhdGFbNF0pID09IDAgJiYKKyAgICAgIEdFVEpPQ1RFVChzcmNpbmZvLT5tYXJrZXJfbGlzdC0+ZGF0YVs1XSkgPT0gMCkgeworICAgIC8qIFN1cHByZXNzIG91dHB1dCBvZiBKRklGIG1hcmtlciAqLworICAgIGRzdGluZm8tPndyaXRlX0pGSUZfaGVhZGVyID0gRkFMU0U7CisgICAgLyogQWRqdXN0IEV4aWYgaW1hZ2UgcGFyYW1ldGVycyAqLworICAgIGlmIChkc3RpbmZvLT5pbWFnZV93aWR0aCAhPSBzcmNpbmZvLT5pbWFnZV93aWR0aCB8fAorCWRzdGluZm8tPmltYWdlX2hlaWdodCAhPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQpCisgICAgICAvKiBBbGlnbiBkYXRhIHNlZ21lbnQgdG8gc3RhcnQgb2YgVElGRiBzdHJ1Y3R1cmUgZm9yIHBhcnNpbmcgKi8KKyAgICAgIGFkanVzdF9leGlmX3BhcmFtZXRlcnMoc3JjaW5mby0+bWFya2VyX2xpc3QtPmRhdGEgKyA2LAorCXNyY2luZm8tPm1hcmtlcl9saXN0LT5kYXRhX2xlbmd0aCAtIDYsCisJZHN0aW5mby0+aW1hZ2Vfd2lkdGgsIGRzdGluZm8tPmltYWdlX2hlaWdodCk7CiAgIH0KIAogICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBkYXRhIHNldCAqLwpAQCAtODE2LDQwICsxMzUxLDExMCBAQAogICovCiAKIEdMT0JBTCh2b2lkKQotanRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkJICAgal9jb21wcmVzc19wdHIgZHN0aW5mbywKLQkJCQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JCQkJICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykKK2p0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm0gKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKKwkJCSAgICAgIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJCQkgICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJCQkgICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQogewogICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMgPSBpbmZvLT53b3Jrc3BhY2VfY29lZl9hcnJheXM7CiAKKyAgLyogTm90ZTogY29uZGl0aW9ucyB0ZXN0ZWQgaGVyZSBzaG91bGQgbWF0Y2ggdGhvc2UgaW4gc3dpdGNoIHN0YXRlbWVudAorICAgKiBpbiBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlKCkKKyAgICovCiAgIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7CiAgIGNhc2UgSlhGT1JNX05PTkU6CisgICAgaWYgKGluZm8tPnhfY3JvcF9vZmZzZXQgIT0gMCB8fCBpbmZvLT55X2Nyb3Bfb2Zmc2V0ICE9IDApCisgICAgICBkb19jcm9wKHNyY2luZm8sIGRzdGluZm8sIGluZm8tPnhfY3JvcF9vZmZzZXQsIGluZm8tPnlfY3JvcF9vZmZzZXQsCisJICAgICAgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwogICAgIGJyZWFrOwogICBjYXNlIEpYRk9STV9GTElQX0g6Ci0gICAgZG9fZmxpcF9oKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cyk7CisgICAgaWYgKGluZm8tPnlfY3JvcF9vZmZzZXQgIT0gMCkKKyAgICAgIGRvX2ZsaXBfaChzcmNpbmZvLCBkc3RpbmZvLCBpbmZvLT54X2Nyb3Bfb2Zmc2V0LCBpbmZvLT55X2Nyb3Bfb2Zmc2V0LAorCQlzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgZWxzZQorICAgICAgZG9fZmxpcF9oX25vX2Nyb3Aoc3JjaW5mbywgZHN0aW5mbywgaW5mby0+eF9jcm9wX29mZnNldCwKKwkJCXNyY19jb2VmX2FycmF5cyk7CiAgICAgYnJlYWs7CiAgIGNhc2UgSlhGT1JNX0ZMSVBfVjoKLSAgICBkb19mbGlwX3Yoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGRvX2ZsaXBfdihzcmNpbmZvLCBkc3RpbmZvLCBpbmZvLT54X2Nyb3Bfb2Zmc2V0LCBpbmZvLT55X2Nyb3Bfb2Zmc2V0LAorCSAgICAgIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKICAgICBicmVhazsKICAgY2FzZSBKWEZPUk1fVFJBTlNQT1NFOgotICAgIGRvX3RyYW5zcG9zZShzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgZG9fdHJhbnNwb3NlKHNyY2luZm8sIGRzdGluZm8sIGluZm8tPnhfY3JvcF9vZmZzZXQsIGluZm8tPnlfY3JvcF9vZmZzZXQsCisJCSBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CiAgICAgYnJlYWs7CiAgIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6Ci0gICAgZG9fdHJhbnN2ZXJzZShzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgZG9fdHJhbnN2ZXJzZShzcmNpbmZvLCBkc3RpbmZvLCBpbmZvLT54X2Nyb3Bfb2Zmc2V0LCBpbmZvLT55X2Nyb3Bfb2Zmc2V0LAorCQkgIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKICAgICBicmVhazsKICAgY2FzZSBKWEZPUk1fUk9UXzkwOgotICAgIGRvX3JvdF85MChzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgZG9fcm90XzkwKHNyY2luZm8sIGRzdGluZm8sIGluZm8tPnhfY3JvcF9vZmZzZXQsIGluZm8tPnlfY3JvcF9vZmZzZXQsCisJICAgICAgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwogICAgIGJyZWFrOwogICBjYXNlIEpYRk9STV9ST1RfMTgwOgotICAgIGRvX3JvdF8xODAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGRvX3JvdF8xODAoc3JjaW5mbywgZHN0aW5mbywgaW5mby0+eF9jcm9wX29mZnNldCwgaW5mby0+eV9jcm9wX29mZnNldCwKKwkgICAgICAgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwogICAgIGJyZWFrOwogICBjYXNlIEpYRk9STV9ST1RfMjcwOgotICAgIGRvX3JvdF8yNzAoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGRvX3JvdF8yNzAoc3JjaW5mbywgZHN0aW5mbywgaW5mby0+eF9jcm9wX29mZnNldCwgaW5mby0+eV9jcm9wX29mZnNldCwKKwkgICAgICAgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOwogICAgIGJyZWFrOwogICB9CiB9CiAKKy8qIGp0cmFuc2Zvcm1fcGVyZmVjdF90cmFuc2Zvcm0KKyAqCisgKiBEZXRlcm1pbmUgd2hldGhlciBsb3NzbGVzcyB0cmFuc2Zvcm1hdGlvbiBpcyBwZXJmZWN0bHkKKyAqIHBvc3NpYmxlIGZvciBhIHNwZWNpZmllZCBpbWFnZSBhbmQgdHJhbnNmb3JtYXRpb24uCisgKgorICogSW5wdXRzOgorICogICBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0OiBzb3VyY2UgaW1hZ2UgZGltZW5zaW9ucy4KKyAqICAgTUNVX3dpZHRoLCBNQ1VfaGVpZ2h0OiBwaXhlbCBkaW1lbnNpb25zIG9mIE1DVS4KKyAqICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1hdGlvbiBpZGVudGlmaWVyLgorICogUGFyYW1ldGVyIHNvdXJjZXMgZnJvbSBpbml0aWFsaXplZCBqcGVnX3N0cnVjdAorICogKGFmdGVyIHJlYWRpbmcgc291cmNlIGhlYWRlcik6CisgKiAgIGltYWdlX3dpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGgKKyAqICAgaW1hZ2VfaGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0CisgKiAgIE1DVV93aWR0aCA9IGNpbmZvLm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRQorICogICBNQ1VfaGVpZ2h0ID0gY2luZm8ubWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFCisgKiBSZXN1bHQ6CisgKiAgIFRSVUUgPSBwZXJmZWN0IHRyYW5zZm9ybWF0aW9uIHBvc3NpYmxlCisgKiAgIEZBTFNFID0gcGVyZmVjdCB0cmFuc2Zvcm1hdGlvbiBub3QgcG9zc2libGUKKyAqICAgICAgICAgICAobWF5IHVzZSBjdXN0b20gYWN0aW9uIHRoZW4pCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqdHJhbnNmb3JtX3BlcmZlY3RfdHJhbnNmb3JtKEpESU1FTlNJT04gaW1hZ2Vfd2lkdGgsIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0LAorCQkJICAgICBpbnQgTUNVX3dpZHRoLCBpbnQgTUNVX2hlaWdodCwKKwkJCSAgICAgSlhGT1JNX0NPREUgdHJhbnNmb3JtKQoreworICBib29sZWFuIHJlc3VsdCA9IFRSVUU7IC8qIGluaXRpYWxpemUgVFJVRSAqLworCisgIHN3aXRjaCAodHJhbnNmb3JtKSB7CisgIGNhc2UgSlhGT1JNX0ZMSVBfSDoKKyAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKKyAgICBpZiAoaW1hZ2Vfd2lkdGggJSAoSkRJTUVOU0lPTikgTUNVX3dpZHRoKQorICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX0ZMSVBfVjoKKyAgY2FzZSBKWEZPUk1fUk9UXzkwOgorICAgIGlmIChpbWFnZV9oZWlnaHQgJSAoSkRJTUVOU0lPTikgTUNVX2hlaWdodCkKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgorICBjYXNlIEpYRk9STV9ST1RfMTgwOgorICAgIGlmIChpbWFnZV93aWR0aCAlIChKRElNRU5TSU9OKSBNQ1Vfd2lkdGgpCisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICBpZiAoaW1hZ2VfaGVpZ2h0ICUgKEpESU1FTlNJT04pIE1DVV9oZWlnaHQpCisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKICNlbmRpZiAvKiBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLwogCiAKZGlmZiAtLWdpdCBhL3RyYW5zdXBwLmggYi90cmFuc3VwcC5oCmluZGV4IDVjMmQzMmEuLjk4MWIxY2UgMTAwNjQ0Ci0tLSBhL3RyYW5zdXBwLmgKKysrIGIvdHJhbnN1cHAuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiB0cmFuc3VwcC5oCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxLCBUaG9tYXMgRy4gTGFuZS4KICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCiAgKgpAQCAtMjIsMzIgKzIyLDYgQEAKICNkZWZpbmUgVFJBTlNGT1JNU19TVVBQT1JURUQgMQkJLyogMCBkaXNhYmxlcyB0cmFuc2Zvcm0gY29kZSAqLwogI2VuZGlmCiAKLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCQlqVHJSZXF1ZXN0Ci0jZGVmaW5lIGp0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMJCWpUckFkanVzdAotI2RlZmluZSBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24JalRyRXhlYwotI2RlZmluZSBqY29weV9tYXJrZXJzX3NldHVwCQkJakNNcmtTZXR1cAotI2RlZmluZSBqY29weV9tYXJrZXJzX2V4ZWN1dGUJCQlqQ01ya0V4ZWMKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyoKLSAqIENvZGVzIGZvciBzdXBwb3J0ZWQgdHlwZXMgb2YgaW1hZ2UgdHJhbnNmb3JtYXRpb25zLgotICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSlhGT1JNX05PTkUsCQkvKiBubyB0cmFuc2Zvcm1hdGlvbiAqLwotCUpYRk9STV9GTElQX0gsCQkvKiBob3Jpem9udGFsIGZsaXAgKi8KLQlKWEZPUk1fRkxJUF9WLAkJLyogdmVydGljYWwgZmxpcCAqLwotCUpYRk9STV9UUkFOU1BPU0UsCS8qIHRyYW5zcG9zZSBhY3Jvc3MgVUwtdG8tTFIgYXhpcyAqLwotCUpYRk9STV9UUkFOU1ZFUlNFLAkvKiB0cmFuc3Bvc2UgYWNyb3NzIFVSLXRvLUxMIGF4aXMgKi8KLQlKWEZPUk1fUk9UXzkwLAkJLyogOTAtZGVncmVlIGNsb2Nrd2lzZSByb3RhdGlvbiAqLwotCUpYRk9STV9ST1RfMTgwLAkJLyogMTgwLWRlZ3JlZSByb3RhdGlvbiAqLwotCUpYRk9STV9ST1RfMjcwCQkvKiAyNzAtZGVncmVlIGNsb2Nrd2lzZSAob3IgOTAgY2N3KSAqLwotfSBKWEZPUk1fQ09ERTsKLQogLyoKICAqIEFsdGhvdWdoIHJvdGF0aW5nIGFuZCBmbGlwcGluZyBkYXRhIGV4cHJlc3NlZCBhcyBEQ1QgY29lZmZpY2llbnRzIGlzIG5vdAogICogaGFyZCwgdGhlcmUgaXMgYW4gYXN5bW1ldHJ5IGluIHRoZSBKUEVHIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciBpbWFnZXMKQEAgLTc1LDYgKzQ5LDE5IEBACiAgKiAoRm9yIGV4YW1wbGUsIC1yb3QgMjcwIC10cmltIHRyaW1zIG9ubHkgdGhlIGJvdHRvbSBlZGdlLCBidXQgLXJvdCA5MCAtdHJpbQogICogZm9sbG93ZWQgYnkgLXJvdCAxODAgLXRyaW0gdHJpbXMgYm90aCBlZGdlcy4pCiAgKgorICogV2UgYWxzbyBvZmZlciBhIGxvc3NsZXNzLWNyb3Agb3B0aW9uLCB3aGljaCBkaXNjYXJkcyBkYXRhIG91dHNpZGUgYSBnaXZlbgorICogaW1hZ2UgcmVnaW9uIGJ1dCBsb3NzbGVzc2x5IHByZXNlcnZlcyB3aGF0IGlzIGluc2lkZS4gIExpa2UgdGhlIHJvdGF0ZSBhbmQKKyAqIGZsaXAgdHJhbnNmb3JtcywgbG9zc2xlc3MgY3JvcCBpcyByZXN0cmljdGVkIGJ5IHRoZSBKUEVHIGZvcm1hdDogdGhlIHVwcGVyCisgKiBsZWZ0IGNvcm5lciBvZiB0aGUgc2VsZWN0ZWQgcmVnaW9uIG11c3QgZmFsbCBvbiBhbiBpTUNVIGJvdW5kYXJ5LiAgSWYgdGhpcworICogZG9lcyBub3QgaG9sZCBmb3IgdGhlIGdpdmVuIGNyb3AgcGFyYW1ldGVycywgd2Ugc2lsZW50bHkgbW92ZSB0aGUgdXBwZXIgbGVmdAorICogY29ybmVyIHVwIGFuZC9vciBsZWZ0IHRvIG1ha2UgaXQgc28sIHNpbXVsdGFuZW91c2x5IGluY3JlYXNpbmcgdGhlIHJlZ2lvbgorICogZGltZW5zaW9ucyB0byBrZWVwIHRoZSBsb3dlciByaWdodCBjcm9wIGNvcm5lciB1bmNoYW5nZWQuICAoVGh1cywgdGhlCisgKiBvdXRwdXQgaW1hZ2UgY292ZXJzIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgcmVnaW9uLCBidXQgbWF5IGNvdmVyIG1vcmUuKQorICoKKyAqIElmIGJvdGggY3JvcCBhbmQgYSByb3RhdGUvZmxpcCB0cmFuc2Zvcm0gYXJlIHJlcXVlc3RlZCwgdGhlIGNyb3AgaXMgYXBwbGllZAorICogbGFzdCAtLS0gdGhhdCBpcywgdGhlIGNyb3AgcmVnaW9uIGlzIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiB0aGUgZGVzdGluYXRpb24KKyAqIGltYWdlLgorICoKICAqIFdlIGFsc28gb2ZmZXIgYSAiZm9yY2UgdG8gZ3JheXNjYWxlIiBvcHRpb24sIHdoaWNoIHNpbXBseSBkaXNjYXJkcyB0aGUKICAqIGNocm9taW5hbmNlIGNoYW5uZWxzIG9mIGEgWUNiQ3IgaW1hZ2UuICBUaGlzIGlzIGxvc3NsZXNzIGluIHRoZSBzZW5zZSB0aGF0CiAgKiB0aGUgbHVtaW5hbmNlIGNoYW5uZWwgaXMgcHJlc2VydmVkIGV4YWN0bHkuICBJdCdzIG5vdCB0aGUgc2FtZSBraW5kIG9mCkBAIC04MywyMCArNzAsODkgQEAKICAqIGJlIGF3YXJlIG9mIHRoZSBvcHRpb24gdG8ga25vdyBob3cgbWFueSBjb21wb25lbnRzIHRvIHdvcmsgb24uCiAgKi8KIAorCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganRyYW5zZm9ybV9wYXJzZV9jcm9wX3NwZWMJalRyUGFyQ3JvcAorI2RlZmluZSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlCWpUclJlcXVlc3QKKyNkZWZpbmUganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycwlqVHJBZGp1c3QKKyNkZWZpbmUganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybQlqVHJFeGVjCisjZGVmaW5lIGp0cmFuc2Zvcm1fcGVyZmVjdF90cmFuc2Zvcm0JalRyUGVyZmVjdAorI2RlZmluZSBqY29weV9tYXJrZXJzX3NldHVwCQlqQ01ya1NldHVwCisjZGVmaW5lIGpjb3B5X21hcmtlcnNfZXhlY3V0ZQkJakNNcmtFeGVjCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisKKy8qCisgKiBDb2RlcyBmb3Igc3VwcG9ydGVkIHR5cGVzIG9mIGltYWdlIHRyYW5zZm9ybWF0aW9ucy4KKyAqLworCit0eXBlZGVmIGVudW0geworCUpYRk9STV9OT05FLAkJLyogbm8gdHJhbnNmb3JtYXRpb24gKi8KKwlKWEZPUk1fRkxJUF9ILAkJLyogaG9yaXpvbnRhbCBmbGlwICovCisJSlhGT1JNX0ZMSVBfViwJCS8qIHZlcnRpY2FsIGZsaXAgKi8KKwlKWEZPUk1fVFJBTlNQT1NFLAkvKiB0cmFuc3Bvc2UgYWNyb3NzIFVMLXRvLUxSIGF4aXMgKi8KKwlKWEZPUk1fVFJBTlNWRVJTRSwJLyogdHJhbnNwb3NlIGFjcm9zcyBVUi10by1MTCBheGlzICovCisJSlhGT1JNX1JPVF85MCwJCS8qIDkwLWRlZ3JlZSBjbG9ja3dpc2Ugcm90YXRpb24gKi8KKwlKWEZPUk1fUk9UXzE4MCwJCS8qIDE4MC1kZWdyZWUgcm90YXRpb24gKi8KKwlKWEZPUk1fUk9UXzI3MAkJLyogMjcwLWRlZ3JlZSBjbG9ja3dpc2UgKG9yIDkwIGNjdykgKi8KK30gSlhGT1JNX0NPREU7CisKKy8qCisgKiBDb2RlcyBmb3IgY3JvcCBwYXJhbWV0ZXJzLCB3aGljaCBjYW4gaW5kaXZpZHVhbGx5IGJlIHVuc3BlY2lmaWVkLAorICogcG9zaXRpdmUsIG9yIG5lZ2F0aXZlLiAgKE5lZ2F0aXZlIHdpZHRoIG9yIGhlaWdodCBtYWtlcyBubyBzZW5zZSwgdGhvdWdoLikKKyAqLworCit0eXBlZGVmIGVudW0geworCUpDUk9QX1VOU0VULAorCUpDUk9QX1BPUywKKwlKQ1JPUF9ORUcKK30gSkNST1BfQ09ERTsKKworLyoKKyAqIFRyYW5zZm9ybSBwYXJhbWV0ZXJzIHN0cnVjdC4KKyAqIE5COiBhcHBsaWNhdGlvbiBtdXN0IG5vdCBjaGFuZ2UgYW55IGVsZW1lbnRzIG9mIHRoaXMgc3RydWN0IGFmdGVyCisgKiBjYWxsaW5nIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UuCisgKi8KKwogdHlwZWRlZiBzdHJ1Y3QgewogICAvKiBPcHRpb25zOiBzZXQgYnkgY2FsbGVyICovCiAgIEpYRk9STV9DT0RFIHRyYW5zZm9ybTsJLyogaW1hZ2UgdHJhbnNmb3JtIG9wZXJhdG9yICovCisgIGJvb2xlYW4gcGVyZmVjdDsJCS8qIGlmIFRSVUUsIGZhaWwgaWYgcGFydGlhbCBNQ1VzIGFyZSByZXF1ZXN0ZWQgKi8KICAgYm9vbGVhbiB0cmltOwkJCS8qIGlmIFRSVUUsIHRyaW0gcGFydGlhbCBNQ1VzIGFzIG5lZWRlZCAqLwogICBib29sZWFuIGZvcmNlX2dyYXlzY2FsZTsJLyogaWYgVFJVRSwgY29udmVydCBjb2xvciBpbWFnZSB0byBncmF5c2NhbGUgKi8KKyAgYm9vbGVhbiBjcm9wOwkJCS8qIGlmIFRSVUUsIGNyb3Agc291cmNlIGltYWdlICovCisKKyAgLyogQ3JvcCBwYXJhbWV0ZXJzOiBhcHBsaWNhdGlvbiBuZWVkIG5vdCBzZXQgdGhlc2UgdW5sZXNzIGNyb3AgaXMgVFJVRS4KKyAgICogVGhlc2UgY2FuIGJlIGZpbGxlZCBpbiBieSBqdHJhbnNmb3JtX3BhcnNlX2Nyb3Bfc3BlYygpLgorICAgKi8KKyAgSkRJTUVOU0lPTiBjcm9wX3dpZHRoOwkvKiBXaWR0aCBvZiBzZWxlY3RlZCByZWdpb24gKi8KKyAgSkNST1BfQ09ERSBjcm9wX3dpZHRoX3NldDsKKyAgSkRJTUVOU0lPTiBjcm9wX2hlaWdodDsJLyogSGVpZ2h0IG9mIHNlbGVjdGVkIHJlZ2lvbiAqLworICBKQ1JPUF9DT0RFIGNyb3BfaGVpZ2h0X3NldDsKKyAgSkRJTUVOU0lPTiBjcm9wX3hvZmZzZXQ7CS8qIFggb2Zmc2V0IG9mIHNlbGVjdGVkIHJlZ2lvbiAqLworICBKQ1JPUF9DT0RFIGNyb3BfeG9mZnNldF9zZXQ7CS8qIChuZWdhdGl2ZSBtZWFzdXJlcyBmcm9tIHJpZ2h0IGVkZ2UpICovCisgIEpESU1FTlNJT04gY3JvcF95b2Zmc2V0OwkvKiBZIG9mZnNldCBvZiBzZWxlY3RlZCByZWdpb24gKi8KKyAgSkNST1BfQ09ERSBjcm9wX3lvZmZzZXRfc2V0OwkvKiAobmVnYXRpdmUgbWVhc3VyZXMgZnJvbSBib3R0b20gZWRnZSkgKi8KIAogICAvKiBJbnRlcm5hbCB3b3Jrc3BhY2U6IGNhbGxlciBzaG91bGQgbm90IHRvdWNoIHRoZXNlICovCiAgIGludCBudW1fY29tcG9uZW50czsJCS8qICMgb2YgY29tcG9uZW50cyBpbiB3b3Jrc3BhY2UgKi8KICAganZpcnRfYmFycmF5X3B0ciAqIHdvcmtzcGFjZV9jb2VmX2FycmF5czsgLyogd29ya3NwYWNlIGZvciB0cmFuc2Zvcm1hdGlvbnMgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGg7CS8qIGNyb3BwZWQgZGVzdGluYXRpb24gZGltZW5zaW9ucyAqLworICBKRElNRU5TSU9OIG91dHB1dF9oZWlnaHQ7CisgIEpESU1FTlNJT04geF9jcm9wX29mZnNldDsJLyogZGVzdGluYXRpb24gY3JvcCBvZmZzZXRzIG1lYXN1cmVkIGluIGlNQ1VzICovCisgIEpESU1FTlNJT04geV9jcm9wX29mZnNldDsKKyAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBkZXN0aW5hdGlvbiBpTUNVIHNpemUgKi8KKyAgaW50IG1heF92X3NhbXBfZmFjdG9yOwogfSBqcGVnX3RyYW5zZm9ybV9pbmZvOwogCiAKICNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAogCisvKiBQYXJzZSBhIGNyb3Agc3BlY2lmaWNhdGlvbiAod3JpdHRlbiBpbiBYMTEgZ2VvbWV0cnkgc3R5bGUpICovCitFWFRFUk4oYm9vbGVhbikganRyYW5zZm9ybV9wYXJzZV9jcm9wX3NwZWMKKwlKUFAoKGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnNwZWMpKTsKIC8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZSAqLwogRVhURVJOKHZvaWQpIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UKIAlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOwpAQCAtMTA2LDEwICsxNjIsMjQgQEAKIAkgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKIAkgICAgIGpwZWdfdHJhbnNmb3JtX2luZm8gKmluZm8pKTsKIC8qIEV4ZWN1dGUgdGhlIGFjdHVhbCB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55ICovCi1FWFRFUk4odm9pZCkganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uCitFWFRFUk4odm9pZCkganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybQogCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAogCSAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAogCSAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOworLyogRGV0ZXJtaW5lIHdoZXRoZXIgbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gaXMgcGVyZmVjdGx5CisgKiBwb3NzaWJsZSBmb3IgYSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHRyYW5zZm9ybWF0aW9uLgorICovCitFWFRFUk4oYm9vbGVhbikganRyYW5zZm9ybV9wZXJmZWN0X3RyYW5zZm9ybQorCUpQUCgoSkRJTUVOU0lPTiBpbWFnZV93aWR0aCwgSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQsCisJICAgICBpbnQgTUNVX3dpZHRoLCBpbnQgTUNVX2hlaWdodCwKKwkgICAgIEpYRk9STV9DT0RFIHRyYW5zZm9ybSkpOworCisvKiBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtIHVzZWQgdG8gYmUgY2FsbGVkCisgKiBqdHJhbnNmb3JtX2V4ZWN1dGVfdHJhbnNmb3JtYXRpb24sIGJ1dCBzb21lIGNvbXBpbGVycyBjb21wbGFpbiBhYm91dAorICogcm91dGluZSBuYW1lcyB0aGF0IGxvbmcuICBUaGlzIG1hY3JvIGlzIGhlcmUgdG8gYXZvaWQgYnJlYWtpbmcgYW55CisgKiBvbGQgc291cmNlIGNvZGUgdGhhdCB1c2VzIHRoZSBvcmlnaW5hbCBuYW1lLi4uCisgKi8KKyNkZWZpbmUganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uCWp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm0KIAogI2VuZGlmIC8qIFRSQU5TRk9STVNfU1VQUE9SVEVEICovCiAKZGlmZiAtLWdpdCBhL3VzYWdlLmRvYyBiL3VzYWdlLnR4dApzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSB1c2FnZS5kb2MKcmVuYW1lIHRvIHVzYWdlLnR4dAppbmRleCA4YzQ5NzBhLi5lNzhiMjZjIDEwMDY0NAotLS0gYS91c2FnZS5kb2MKKysrIGIvdXNhZ2UudHh0CkBAIC0xMiwxOSArMTIsOSBAQAogCiBJTlRST0RVQ1RJT04KIAotVGhlc2UgcHJvZ3JhbXMgaW1wbGVtZW50IEpQRUcgaW1hZ2UgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uICBKUEVHCi0ocHJvbm91bmNlZCAiamF5LXBlZyIpIGlzIGEgc3RhbmRhcmRpemVkIGNvbXByZXNzaW9uIG1ldGhvZCBmb3IgZnVsbC1jb2xvcgotYW5kIGdyYXktc2NhbGUgaW1hZ2VzLiAgSlBFRyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgInJlYWwtd29ybGQiIHNjZW5lcywKLWZvciBleGFtcGxlIHNjYW5uZWQgcGhvdG9ncmFwaHMuICBDYXJ0b29ucywgbGluZSBkcmF3aW5ncywgYW5kIG90aGVyCi1ub24tcmVhbGlzdGljIGltYWdlcyBhcmUgbm90IEpQRUcncyBzdHJvbmcgc3VpdDsgb24gdGhhdCBzb3J0IG9mIG1hdGVyaWFsCi15b3UgbWF5IGdldCBwb29yIGltYWdlIHF1YWxpdHkgYW5kL29yIGxpdHRsZSBjb21wcmVzc2lvbi4KLQotSlBFRyBpcyBsb3NzeSwgbWVhbmluZyB0aGF0IHRoZSBvdXRwdXQgaW1hZ2UgaXMgbm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCB0bwotdGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IHNob3VsZCBub3QgdXNlIEpQRUcgaWYgeW91IGhhdmUgdG8gaGF2ZSBpZGVudGljYWwKLW91dHB1dCBiaXRzLiAgSG93ZXZlciwgb24gdHlwaWNhbCByZWFsLXdvcmxkIGltYWdlcywgdmVyeSBnb29kIGNvbXByZXNzaW9uCi1sZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZCBhbWF6aW5nbHkgaGlnaCBjb21wcmVzc2lvbgotaXMgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhIGxvdy1xdWFsaXR5IGltYWdlLiAgWW91IGNhbiB0cmFkZSBvZmYgaW1hZ2UKLXF1YWxpdHkgYWdhaW5zdCBmaWxlIHNpemUgYnkgYWRqdXN0aW5nIHRoZSBjb21wcmVzc29yJ3MgInF1YWxpdHkiIHNldHRpbmcuCitUaGVzZSBwcm9ncmFtcyBpbXBsZW1lbnQgSlBFRyBpbWFnZSBlbmNvZGluZywgZGVjb2RpbmcsIGFuZCB0cmFuc2NvZGluZy4KK0pQRUcgKHByb25vdW5jZWQgImpheS1wZWciKSBpcyBhIHN0YW5kYXJkaXplZCBjb21wcmVzc2lvbiBtZXRob2QgZm9yCitmdWxsLWNvbG9yIGFuZCBncmF5LXNjYWxlIGltYWdlcy4KIAogCiBHRU5FUkFMIFVTQUdFCkBAIC00OCw3ICszOCw3IEBACiBpLmUuLCBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIGFyZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhpcwogc3R5bGUgaXMgYSBsaXR0bGUgbW9yZSBmb29scHJvb2YsIGFuZCBpdCBsb3NlcyBubyBmdW5jdGlvbmFsaXR5IGlmIHlvdSBkb24ndAogaGF2ZSBwaXBlcy4gIChZb3UgY2FuIGdldCB0aGlzIHN0eWxlIG9uIFVuaXggdG9vLCBpZiB5b3UgcHJlZmVyLCBieSBkZWZpbmluZwotVFdPX0ZJTEVfQ09NTUFORExJTkUgd2hlbiB5b3UgY29tcGlsZSB0aGUgcHJvZ3JhbXM7IHNlZSBpbnN0YWxsLmRvYy4pCitUV09fRklMRV9DT01NQU5ETElORSB3aGVuIHlvdSBjb21waWxlIHRoZSBwcm9ncmFtczsgc2VlIGluc3RhbGwudHh0LikKIAogWW91IGNhbiBhbHNvIHNheToKIAljanBlZyBbc3dpdGNoZXNdIC1vdXRmaWxlIGpwZWdmaWxlICBpbWFnZWZpbGUKQEAgLTc2LDcgKzY2LDcgQEAKIAogVGhlIGJhc2ljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyBmb3IgY2pwZWcgYXJlOgogCi0JLXF1YWxpdHkgTglTY2FsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGFkanVzdCBpbWFnZSBxdWFsaXR5LgorCS1xdWFsaXR5IE5bLC4uLl0gIFNjYWxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYWRqdXN0IGltYWdlIHF1YWxpdHkuCiAJCQlRdWFsaXR5IGlzIDAgKHdvcnN0KSB0byAxMDAgKGJlc3QpOyBkZWZhdWx0IGlzIDc1LgogCQkJKFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKIApAQCAtOTYsNiArODYsMTAgQEAKIAogCS1wcm9ncmVzc2l2ZQlDcmVhdGUgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlIChzZWUgYmVsb3cpLgogCisJLXNjYWxlIE0vTglTY2FsZSB0aGUgb3V0cHV0IGltYWdlIGJ5IGEgZmFjdG9yIE0vTi4gIEN1cnJlbnRseQorCQkJc3VwcG9ydGVkIHNjYWxlIGZhY3RvcnMgYXJlIDgvTiB3aXRoIGFsbCBOIGZyb20gMSB0bworCQkJMTYuCisKIAktdGFyZ2EJCUlucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAgVGFyZ2EgZmlsZXMgdGhhdCBjb250YWluCiAJCQlhbiAiaWRlbnRpZmljYXRpb24iIGZpZWxkIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkKIAkJCXJlY29nbml6ZWQgYnkgY2pwZWc7IGZvciBzdWNoIGZpbGVzIHlvdSBtdXN0IHNwZWNpZnkKQEAgLTEyOCwxNSArMTIyLDMxIEBACiBvdGhlciBKUEVHIHByb2dyYW1zIG1heSBiZSB1bmFibGUgdG8gZGVjb2RlIHRoZSByZXN1bHRpbmcgZmlsZS4gIFVzZSAtYmFzZWxpbmUKIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IGF0IGxvdyBxdWFsaXR5IHZhbHVlcy4pCiAKK1RoZSAtcXVhbGl0eSBvcHRpb24gaGFzIGJlZW4gZXh0ZW5kZWQgaW4gSUpHIHZlcnNpb24gNyBmb3Igc3VwcG9ydCBvZiBzZXBhcmF0ZQorcXVhbGl0eSBzZXR0aW5ncyBmb3IgbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSAob3IgaW4gZ2VuZXJhbCwgZm9yIGV2ZXJ5Citwcm92aWRlZCBxdWFudGl6YXRpb24gdGFibGUgc2xvdCkuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBoaWdoLXF1YWxpdHkKK2FwcGxpY2F0aW9ucyB3aGljaCBjYW5ub3QgYWNjZXB0IHRoZSBkYW1hZ2Ugb2YgY29sb3IgZGF0YSBieSBjb2Fyc2UKK3N1YnNhbXBsaW5nIHNldHRpbmdzLiAgWW91IGNhbiBub3cgZWFzaWx5IHJlZHVjZSB0aGUgY29sb3IgZGF0YSBhbW91bnQgbW9yZQorc21vb3RobHkgd2l0aCBmaW5lciBjb250cm9sIHdpdGhvdXQgc2VwYXJhdGUgc3Vic2FtcGxpbmcuICBUaGUgcmVzdWx0aW5nIGZpbGUKK2lzIGZ1bGx5IGNvbXBsaWFudCB3aXRoIHN0YW5kYXJkIEpQRUcgZGVjb2RlcnMuCitOb3RlIHRoYXQgdGhlIC1xdWFsaXR5IHJhdGluZ3MgcmVmZXIgdG8gdGhlIHF1YW50aXphdGlvbiB0YWJsZSBzbG90cywgYW5kIHRoYXQKK3RoZSBsYXN0IHZhbHVlIGlzIHJlcGxpY2F0ZWQgaWYgdGhlcmUgYXJlIG1vcmUgcS10YWJsZSBzbG90cyB0aGFuIHBhcmFtZXRlcnMuCitUaGUgZGVmYXVsdCBxLXRhYmxlIHNsb3RzIGFyZSAwIGZvciBsdW1pbmFuY2UgYW5kIDEgZm9yIGNocm9taW5hbmNlIHdpdGgKK2RlZmF1bHQgdGFibGVzIGFzIGdpdmVuIGluIHRoZSBKUEVHIHN0YW5kYXJkLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9sZAorYmVoYXZpb3VyIGluIGNhc2UgdGhhdCBvbmx5IG9uZSBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIHdoaWNoIGlzIHRoZW4gdXNlZCBmb3IKK2JvdGggbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSAoc2xvdHMgMCBhbmQgMSkuICBNb3JlIG9yIGN1c3RvbSBxdWFudGl6YXRpb24KK3RhYmxlcyBjYW4gYmUgc2V0IHdpdGggLXF0YWJsZXMgYW5kIGFzc2lnbmVkIHRvIGNvbXBvbmVudHMgd2l0aCAtcXNsb3RzCitwYXJhbWV0ZXIgKHNlZSB0aGUgIndpemFyZCIgc3dpdGNoZXMgYmVsb3cpLgorQ0FVVElPTjogWW91IG11c3QgZXhwbGljaXRlbHkgYWRkIC1zYW1wbGUgMXgxIGZvciBlZmZpY2llbnQgc2VwYXJhdGUgY29sb3IKK3F1YWxpdHkgc2VsZWN0aW9uLCBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSB1c2VkIGJ5IGxpYnJhcnkgaXMgMngyIQorCiBUaGUgLXByb2dyZXNzaXZlIHN3aXRjaCBjcmVhdGVzIGEgInByb2dyZXNzaXZlIEpQRUciIGZpbGUuICBJbiB0aGlzIHR5cGUgb2YKIEpQRUcgZmlsZSwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIG11bHRpcGxlIHNjYW5zIG9mIGluY3JlYXNpbmcgcXVhbGl0eS4gIElmIHRoZQogZmlsZSBpcyBiZWluZyB0cmFuc21pdHRlZCBvdmVyIGEgc2xvdyBjb21tdW5pY2F0aW9ucyBsaW5rLCB0aGUgZGVjb2RlciBjYW4gdXNlCiB0aGUgZmlyc3Qgc2NhbiB0byBkaXNwbGF5IGEgbG93LXF1YWxpdHkgaW1hZ2UgdmVyeSBxdWlja2x5LCBhbmQgY2FuIHRoZW4KIGltcHJvdmUgdGhlIGRpc3BsYXkgd2l0aCBlYWNoIHN1YnNlcXVlbnQgc2Nhbi4gIFRoZSBmaW5hbCBpbWFnZSBpcyBleGFjdGx5CiBlcXVpdmFsZW50IHRvIGEgc3RhbmRhcmQgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkgc2V0dGluZywgYW5kIHRoZSB0b3RhbAotZmlsZSBzaXplIGlzIGFib3V0IHRoZSBzYW1lIC0tLSBvZnRlbiBhIGxpdHRsZSBzbWFsbGVyLiAgQ0FVVElPTjogcHJvZ3Jlc3NpdmUKLUpQRUcgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHNvIG1hbnkgZGVjb2RlcnMgd2lsbCBiZSB1bmFibGUgdG8gdmlldyBhCi1wcm9ncmVzc2l2ZSBKUEVHIGZpbGUgYXQgYWxsLgorZmlsZSBzaXplIGlzIGFib3V0IHRoZSBzYW1lIC0tLSBvZnRlbiBhIGxpdHRsZSBzbWFsbGVyLgogCiBTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6CiAKQEAgLTE1MSw2ICsxNjEsOCBAQAogCQkJdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLiAgVGhlIGZhc3QgaW50ZWdlciBtZXRob2QKIAkJCWlzIG11Y2ggbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBvdGhlciB0d28uCiAKKwktbm9zbW9vdGgJRG9uJ3QgdXNlIGhpZ2gtcXVhbGl0eSBkb3duc2FtcGxpbmcuCisKIAktcmVzdGFydCBOCUVtaXQgYSBKUEVHIHJlc3RhcnQgbWFya2VyIGV2ZXJ5IE4gTUNVIHJvd3MsIG9yIGV2ZXJ5CiAJCQlOIE1DVSBibG9ja3MgaWYgIkIiIGlzIGF0dGFjaGVkIHRvIHRoZSBudW1iZXIuCiAJCQktcmVzdGFydCAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gcmVzdGFydCBtYXJrZXJzLgpAQCAtMTg0LDYgKzE5NiwxMSBAQAogCiBTd2l0Y2hlcyBmb3Igd2l6YXJkczoKIAorCS1hcml0aG1ldGljCVVzZSBhcml0aG1ldGljIGNvZGluZy4gIENBVVRJT046IGFyaXRobWV0aWMgY29kZWQgSlBFRworCQkJaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHNvIG1hbnkgZGVjb2RlcnMgd2lsbAorCQkJYmUgdW5hYmxlIHRvIHZpZXcgYW4gYXJpdGhtZXRpYyBjb2RlZCBKUEVHIGZpbGUgYXQKKwkJCWFsbC4KKwogCS1iYXNlbGluZQlGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYmUKIAkJCWdlbmVyYXRlZC4gIFRoaXMgY2xhbXBzIHF1YW50aXphdGlvbiB2YWx1ZXMgdG8gOCBiaXRzCiAJCQlldmVuIGF0IGxvdyBxdWFsaXR5IHNldHRpbmdzLiAgKFRoaXMgc3dpdGNoIGlzIHBvb3JseQpAQCAtMjAzLDcgKzIyMCw3IEBACiAKIFRoZSAid2l6YXJkIiBzd2l0Y2hlcyBhcmUgaW50ZW5kZWQgZm9yIGV4cGVyaW1lbnRhdGlvbiB3aXRoIEpQRUcuICBJZiB5b3UKIGRvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBET04nVCBVU0UgVEhFTS4gIFRoZXNlIHN3aXRjaGVzIGFyZSBkb2N1bWVudGVkCi1mdXJ0aGVyIGluIHRoZSBmaWxlIHdpemFyZC5kb2MuCitmdXJ0aGVyIGluIHRoZSBmaWxlIHdpemFyZC50eHQuCiAKIAogREpQRUcgREVUQUlMUwpAQCAtMjI4LDcgKzI0NSwxMSBAQAogCQkJZGpwZWcgcnVucyBub3RpY2VhYmx5IGZhc3RlciBpbiB0aGlzIG1vZGUuCiAKIAktc2NhbGUgTS9OCVNjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5Ci0JCQl0aGUgc2NhbGUgZmFjdG9yIG11c3QgYmUgMS8xLCAxLzIsIDEvNCwgb3IgMS84LgorCQkJc3VwcG9ydGVkIHNjYWxlIGZhY3RvcnMgYXJlIE0vOCB3aXRoIGFsbCBNIGZyb20gMSB0bworCQkJMTYuICBJZiB0aGUgL04gcGFydCBpcyBvbWl0dGVkLCB0aGVuIE0gc3BlY2lmaWVzIHRoZQorCQkJRENUIHNjYWxlZCBzaXplIHRvIGJlIGFwcGxpZWQgb24gdGhlIGdpdmVuIGlucHV0LAorCQkJd2hpY2ggaXMgY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gTS84IHNjYWxpbmcsIHNpbmNlCisJCQl0aGUgc291cmNlIERDVCBzaXplIGlzIGN1cnJlbnRseSBhbHdheXMgOC4KIAkJCVNjYWxpbmcgaXMgaGFuZHkgaWYgdGhlIGltYWdlIGlzIGxhcmdlciB0aGFuIHlvdXIKIAkJCXNjcmVlbjsgYWxzbywgZGpwZWcgcnVucyBtdWNoIGZhc3RlciB3aGVuIHNjYWxpbmcKIAkJCWRvd24gdGhlIG91dHB1dC4KQEAgLTI5Miw3ICszMTMsNyBAQAogCQkJb3IgUFBNIGZpbGUuICBUaGlzIG9wdGlvbiBvdmVycmlkZXMgLWNvbG9ycyBhbmQKIAkJCS1vbmVwYXNzLgogCi0JLW5vc21vb3RoCVVzZSBhIGZhc3RlciwgbG93ZXItcXVhbGl0eSB1cHNhbXBsaW5nIHJvdXRpbmUuCisJLW5vc21vb3RoCURvbid0IHVzZSBoaWdoLXF1YWxpdHkgdXBzYW1wbGluZy4KIAogCS1vbmVwYXNzCVVzZSBvbmUtcGFzcyBpbnN0ZWFkIG9mIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbi4KIAkJCVRoZSBvbmUtcGFzcyBtZXRob2QgaXMgZmFzdGVyIGFuZCBuZWVkcyBsZXNzIG1lbW9yeSwKQEAgLTMzMyw4ICszNTQsNyBAQAogbW9kZSBpcyBhbHdheXMgc2VsZWN0ZWQgd2hlbiBnZW5lcmF0aW5nIHByb2dyZXNzaXZlIEpQRUcgZmlsZXMuKQogCiBHSUYgaW5wdXQgZmlsZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHRvIGF2b2lkIHRoZSBVbmlzeXMgTFpXIHBhdGVudC4KLVVzZSBhIFVuaXN5cy1saWNlbnNlZCBwcm9ncmFtIGlmIHlvdSBuZWVkIHRvIHJlYWQgYSBHSUYgZmlsZS4gIChDb252ZXJzaW9uCi1vZiBHSUYgZmlsZXMgdG8gSlBFRyBpcyB1c3VhbGx5IGEgYmFkIGlkZWEgYW55d2F5LikKKyhDb252ZXJzaW9uIG9mIEdJRiBmaWxlcyB0byBKUEVHIGlzIHVzdWFsbHkgYSBiYWQgaWRlYSBhbnl3YXkuKQogCiAKIEhJTlRTIEZPUiBESlBFRwpAQCAtNDI2LDYgKzQ0Niw3IEBACiAJLXByb2dyZXNzaXZlCUNyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUuCiAJLXJlc3RhcnQgTglFbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeQogCQkJTiBNQ1UgYmxvY2tzIGlmICJCIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgorCS1hcml0aG1ldGljCVVzZSBhcml0aG1ldGljIGNvZGluZy4KIAktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgogU2VlIHRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIG9mIGNqcGVnIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlc2Ugc3dpdGNoZXMuCiBJZiB5b3Ugc3BlY2lmeSBub25lIG9mIHRoZXNlIHN3aXRjaGVzLCB5b3UgZ2V0IGEgcGxhaW4gYmFzZWxpbmUtSlBFRyBvdXRwdXQKQEAgLTQ2Niw2ICs0ODcsMjYgQEAKICItcm90IDI3MCAtdHJpbSIgdHJpbXMgb25seSB0aGUgYm90dG9tIGVkZ2UsIGJ1dCAiLXJvdCA5MCAtdHJpbSIgZm9sbG93ZWQgYnkKICItcm90IDE4MCAtdHJpbSIgdHJpbXMgYm90aCBlZGdlcy4KIAorSWYgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gcGVyZmVjdCB0cmFuc2Zvcm1hdGlvbiwgYWRkIHRoZSAtcGVyZmVjdCBzd2l0Y2g6CisJLXBlcmZlY3QJRmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgbm90CisJCQlwZXJmZWN0LgorRm9yIGV4YW1wbGUgeW91IG1heSB3YW50IHRvIGRvCisgIGpwZWd0cmFuIC1yb3QgOTAgLXBlcmZlY3QgZm9vLmpwZyB8fCBkanBlZyBmb28uanBnIHwgcG5tZmxpcCAtcjkwIHwgY2pwZWcKK3RvIGRvIGEgcGVyZmVjdCByb3RhdGlvbiBpZiBhdmFpbGFibGUgb3IgYW4gYXBwcm94aW1hdGVkIG9uZSBpZiBub3QuCisKK1dlIGFsc28gb2ZmZXIgYSBsb3NzbGVzcy1jcm9wIG9wdGlvbiwgd2hpY2ggZGlzY2FyZHMgZGF0YSBvdXRzaWRlIGEgZ2l2ZW4KK2ltYWdlIHJlZ2lvbiBidXQgbG9zc2xlc3NseSBwcmVzZXJ2ZXMgd2hhdCBpcyBpbnNpZGUuICBMaWtlIHRoZSByb3RhdGUgYW5kCitmbGlwIHRyYW5zZm9ybXMsIGxvc3NsZXNzIGNyb3AgaXMgcmVzdHJpY3RlZCBieSB0aGUgY3VycmVudCBKUEVHIGZvcm1hdDogdGhlCit1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc2VsZWN0ZWQgcmVnaW9uIG11c3QgZmFsbCBvbiBhbiBpTUNVIGJvdW5kYXJ5LiAgSWYKK3RoaXMgZG9lcyBub3QgaG9sZCBmb3IgdGhlIGdpdmVuIGNyb3AgcGFyYW1ldGVycywgd2Ugc2lsZW50bHkgbW92ZSB0aGUgdXBwZXIKK2xlZnQgY29ybmVyIHVwIGFuZC9vciBsZWZ0IHRvIG1ha2UgaXQgc28sIHNpbXVsdGFuZW91c2x5IGluY3JlYXNpbmcgdGhlIHJlZ2lvbgorZGltZW5zaW9ucyB0byBrZWVwIHRoZSBsb3dlciByaWdodCBjcm9wIGNvcm5lciB1bmNoYW5nZWQuICAoVGh1cywgdGhlIG91dHB1dAoraW1hZ2UgY292ZXJzIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgcmVnaW9uLCBidXQgbWF5IGNvdmVyIG1vcmUuKQorCitUaGUgaW1hZ2UgY2FuIGJlIGxvc3NsZXNzbHkgY3JvcHBlZCBieSBnaXZpbmcgdGhlIHN3aXRjaDoKKwktY3JvcCBXeEgrWCtZCUNyb3AgdG8gYSByZWN0YW5ndWxhciBzdWJhcmVhIG9mIHdpZHRoIFcsIGhlaWdodCBICisJCQlzdGFydGluZyBhdCBwb2ludCBYLFkuCisKIEFub3RoZXIgbm90LXN0cmljdGx5LWxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIHN3aXRjaCBpczoKIAktZ3JheXNjYWxlCUZvcmNlIGdyYXlzY2FsZSBvdXRwdXQuCiBUaGlzIG9wdGlvbiBkaXNjYXJkcyB0aGUgY2hyb21pbmFuY2UgY2hhbm5lbHMgaWYgdGhlIGlucHV0IGltYWdlIGlzIFlDYkNyCkBAIC00ODQsMTEgKzUyNSwxMSBAQAogCQkJcHJlc2VudCBpbiB0aGUgc291cmNlIGZpbGUuCiAJLWNvcHkgY29tbWVudHMJQ29weSBvbmx5IGNvbW1lbnQgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBjb3BpZXMKIAkJCWNvbW1lbnRzIGZyb20gdGhlIHNvdXJjZSBmaWxlLCBidXQgZGlzY2FyZHMKLQkJCWFueSBvdGhlciBpbmVzc2VudGlhbCBkYXRhLiAKKwkJCWFueSBvdGhlciBpbmVzc2VudGlhbCAoZm9yIGltYWdlIGRpc3BsYXkpIGRhdGEuCiAJLWNvcHkgYWxsCUNvcHkgYWxsIGV4dHJhIG1hcmtlcnMuICBUaGlzIHNldHRpbmcgcHJlc2VydmVzCiAJCQltaXNjZWxsYW5lb3VzIG1hcmtlcnMgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLCBzdWNoCi0JCQlhcyBKRklGIHRodW1ibmFpbHMgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4gIEluIHNvbWUKLQkJCWZpbGVzIHRoZXNlIGV4dHJhIG1hcmtlcnMgY2FuIGJlIHNpemFibGUuCisJCQlhcyBKRklGIHRodW1ibmFpbHMsIEV4aWYgZGF0YSwgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4KKwkJCUluIHNvbWUgZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIC1jb3B5IGNvbW1lbnRzLiAgKE5vdGU6IGluIElKRyByZWxlYXNlcyB2NiBhbmQgdjZhLAoganBlZ3RyYW4gYWx3YXlzIGRpZCB0aGUgZXF1aXZhbGVudCBvZiAtY29weSBub25lLikKIApAQCAtNTE1LDcgKzU1Niw5IEBACiAKIHJkanBnY29tIHNlYXJjaGVzIGEgSlBFRyBmaWxlIGFuZCBwcmludHMgdGhlIGNvbnRlbnRzIG9mIGFueSBDT00gYmxvY2tzIG9uCiBzdGFuZGFyZCBvdXRwdXQuICBUaGUgY29tbWFuZCBsaW5lIHN5bnRheCBpcwotCXJkanBnY29tIFstdmVyYm9zZV0gW2lucHV0ZmlsZW5hbWVdCisJcmRqcGdjb20gWy1yYXddIFstdmVyYm9zZV0gW2lucHV0ZmlsZW5hbWVdCitUaGUgc3dpdGNoICItcmF3IiAob3IganVzdCAiLXIiKSBjYXVzZXMgcmRqcGdjb20gdG8gYWxzbyBvdXRwdXQgbm9uLXByaW50YWJsZQorY2hhcmFjdGVycyBpbiBjb21tZW50cywgd2hpY2ggYXJlIG5vcm1hbGx5IGVzY2FwZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCiBUaGUgc3dpdGNoICItdmVyYm9zZSIgKG9yIGp1c3QgIi12IikgY2F1c2VzIHJkanBnY29tIHRvIGFsc28gZGlzcGxheSB0aGUgSlBFRwogaW1hZ2UgZGltZW5zaW9ucy4gIElmIHlvdSBvbWl0IHRoZSBpbnB1dCBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAogdGhlIEpQRUcgZmlsZSBpcyByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBtYXkgbm90IHdvcmsgb24gc29tZQpkaWZmIC0tZ2l0IGEvd2l6YXJkLmRvYyBiL3dpemFyZC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHdpemFyZC5kb2MKcmVuYW1lIHRvIHdpemFyZC50eHQKZGlmZiAtLWdpdCBhL3dycHBtLmMgYi93cnBwbS5jCmluZGV4IDZjNmQ5MDguLjY4ZTBjODUgMTAwNjQ0Ci0tLSBhL3dycHBtLmMKKysrIGIvd3JwcG0uYwpAQCAtMiw2ICsyLDcgQEAKICAqIHdycHBtLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBNb2RpZmllZCAyMDA5IGJ5IEd1aWRvIFZvbGxiZWRpbmcuCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgogICoKQEAgLTQwLDExICs0MSwxMSBAQAogI2RlZmluZSBCWVRFU1BFUlNBTVBMRSAxCiAjZGVmaW5lIFBQTV9NQVhWQUwgMjU1CiAjZWxzZQotLyogVGhlIHdvcmQtcGVyLXNhbXBsZSBmb3JtYXQgYWx3YXlzIHB1dHMgdGhlIExTQiBmaXJzdC4gKi8KKy8qIFRoZSB3b3JkLXBlci1zYW1wbGUgZm9ybWF0IGFsd2F5cyBwdXRzIHRoZSBNU0IgZmlyc3QuICovCiAjZGVmaW5lIFBVVFBQTVNBTVBMRShwdHIsdikJCQlcCiAJeyByZWdpc3RlciBpbnQgdmFsXyA9IHY7CQlcCi0JICAqcHRyKysgPSAoY2hhcikgKHZhbF8gJiAweEZGKTsJXAogCSAgKnB0cisrID0gKGNoYXIpICgodmFsXyA+PiA4KSAmIDB4RkYpOwlcCisJICAqcHRyKysgPSAoY2hhcikgKHZhbF8gJiAweEZGKTsJXAogCX0KICNkZWZpbmUgQllURVNQRVJTQU1QTEUgMgogI2RlZmluZSBQUE1fTUFYVkFMICgoMTw8QklUU19JTl9KU0FNUExFKS0xKQo=