ZGlmZiAtLWdpdCBhLy5qZW5raW5zIGIvLmplbmtpbnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmMxYzg0NwotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zCkBAIC0wLDAgKzEsMzIgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKK3NldCAtZQorc291cmNlIC5qZW5raW5zLmQvdXRpbC5zaAorCitleHBvcnQgQ0FDSEVfRElSPSR7Q0FDSEVfRElSOi0vdG1wfQorZXhwb3J0IFdBRl9KT0JTPSR7V0FGX0pPQlM6LTF9CitbWyAkSk9CX05BTUUgPT0gKiJjb2RlLWNvdmVyYWdlIiBdXSAmJiBleHBvcnQgRElTQUJMRV9BU0FOPXllcworCituYW5vcygpIHsKKyAgICAjIENhbm5vdCB1c2UgZGF0ZSgxKSBiZWNhdXNlIG1hY09TIGRvZXMgbm90IHN1cHBvcnQgJU4gZm9ybWF0IHNwZWNpZmllcgorICAgIHB5dGhvbjMgLWMgJ2ltcG9ydCB0aW1lOyBwcmludChpbnQodGltZS50aW1lKCkgKiAxZTkpKScKK30KKworZm9yIGZpbGUgaW4gLmplbmtpbnMuZC8qOyBkbworICAgIFtbIC1mICRmaWxlICYmIC14ICRmaWxlIF1dIHx8IGNvbnRpbnVlCisKKyAgICBpZiBbWyAtbiAkVFJBVklTIF1dOyB0aGVuCisgICAgICAgIGxhYmVsPSQoYmFzZW5hbWUgIiRmaWxlIiB8IHNlZCAtRSAncy9bWzpkaWdpdDpdXSstKC4qKVwuLiovXDEvJykKKyAgICAgICAgZWNobyAtbmUgInRyYXZpc19mb2xkOnN0YXJ0OiR7bGFiZWx9XHIiCisgICAgICAgIGVjaG8gLW5lICJ0cmF2aXNfdGltZTpzdGFydDoke2xhYmVsfVxyIgorICAgICAgICBzdGFydD0kKG5hbm9zKQorICAgIGZpCisKKyAgICBlY2hvICJcJCAkZmlsZSIKKyAgICAiJGZpbGUiCisKKyAgICBpZiBbWyAtbiAkVFJBVklTIF1dOyB0aGVuCisgICAgICAgIGZpbmlzaD0kKG5hbm9zKQorICAgICAgICBlY2hvIC1uZSAidHJhdmlzX3RpbWU6ZW5kOiR7bGFiZWx9OnN0YXJ0PSR7c3RhcnR9LGZpbmlzaD0ke2ZpbmlzaH0sZHVyYXRpb249JCgoZmluaXNoLXN0YXJ0KSksZXZlbnQ9JHtsYWJlbH1cciIKKyAgICAgICAgZWNobyAtbmUgInRyYXZpc19mb2xkOmVuZDoke2xhYmVsfVxyIgorICAgIGZpCitkb25lCmRpZmYgLS1naXQgYS8uamVua2lucy5kLzAwLWRlcHMuc2ggYi8uamVua2lucy5kLzAwLWRlcHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDRkOWMzMwotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvMDAtZGVwcy5zaApAQCAtMCwwICsxLDM0IEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLWV4CisKK2lmIGhhcyBPU1ggJE5PREVfTEFCRUxTOyB0aGVuCisgICAgRk9STVVMQUU9KGJvb3N0IG9wZW5zc2wgcGtnLWNvbmZpZykKKyAgICBpZiBoYXMgT1NYLTEwLjEzICROT0RFX0xBQkVMUyB8fCBoYXMgT1NYLTEwLjE0ICROT0RFX0xBQkVMUzsgdGhlbgorICAgICAgICBGT1JNVUxBRSs9KHB5dGhvbikKKyAgICBmaQorCisgICAgaWYgW1sgLW4gJFRSQVZJUyBdXTsgdGhlbgorICAgICAgICAjIFRyYXZpcyBpbWFnZXMgY29tZSB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIHByZS1pbnN0YWxsZWQKKyAgICAgICAgIyBicmV3IHBhY2thZ2VzLCBkb24ndCB3YXN0ZSB0aW1lIHVwZ3JhZGluZyBhbGwgb2YgdGhlbQorICAgICAgICBicmV3IGxpc3QgLS12ZXJzaW9ucyAiJHtGT1JNVUxBRVtAXX0iIHx8IGJyZXcgdXBkYXRlCisgICAgICAgIGZvciBGT1JNVUxBIGluICIke0ZPUk1VTEFFW0BdfSI7IGRvCisgICAgICAgICAgICBicmV3IGxpc3QgLS12ZXJzaW9ucyAiJEZPUk1VTEEiIHx8IGJyZXcgaW5zdGFsbCAiJEZPUk1VTEEiCisgICAgICAgIGRvbmUKKyAgICAgICAgIyBFbnN1cmUgL3Vzci9sb2NhbC9vcHQvb3BlbnNzbCBleGlzdHMKKyAgICAgICAgYnJldyByZWluc3RhbGwgb3BlbnNzbAorICAgIGVsc2UKKyAgICAgICAgYnJldyB1cGRhdGUKKyAgICAgICAgYnJldyB1cGdyYWRlCisgICAgICAgIGJyZXcgaW5zdGFsbCAiJHtGT1JNVUxBRVtAXX0iCisgICAgICAgIGJyZXcgY2xlYW51cAorICAgIGZpCisKK2VsaWYgaGFzIFVidW50dSAkTk9ERV9MQUJFTFM7IHRoZW4KKyAgICBzdWRvIGFwdC1nZXQgLXFxIHVwZGF0ZQorICAgIHN1ZG8gYXB0LWdldCAtcXkgaW5zdGFsbCBnKysgcGtnLWNvbmZpZyBweXRob24zLW1pbmltYWwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJib29zdC1hbGwtZGV2IGxpYnNzbC1kZXYgbGlic3FsaXRlMy1kZXYKKworICAgIGlmIFtbICRKT0JfTkFNRSA9PSAqImNvZGUtY292ZXJhZ2UiIF1dOyB0aGVuCisgICAgICAgIHN1ZG8gYXB0LWdldCAtcXkgaW5zdGFsbCBnY292ciBsY292CisgICAgZmkKK2ZpCmRpZmYgLS1naXQgYS8uamVua2lucy5kLzAxLW5kbi1jeHguc2ggYi8uamVua2lucy5kLzAxLW5kbi1jeHguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2JmMWNmZQotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvMDEtbmRuLWN4eC5zaApAQCAtMCwwICsxLDU5IEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLWV4CisKK3B1c2hkICIkQ0FDSEVfRElSIiA+L2Rldi9udWxsCisKK0lOU1RBTExFRF9WRVJTSU9OPQoraWYgaGFzIE9TWCAkTk9ERV9MQUJFTFM7IHRoZW4KKyAgICBCT09TVD0kKGJyZXcgbHMgLS12ZXJzaW9ucyBib29zdCkKKyAgICBPTERfQk9PU1Q9JChjYXQgYm9vc3QudHh0IHx8IDopCisgICAgaWYgW1sgJE9MRF9CT09TVCAhPSAkQk9PU1QgXV07IHRoZW4KKyAgICAgICAgZWNobyAiJEJPT1NUIiA+IGJvb3N0LnR4dAorICAgICAgICBJTlNUQUxMRURfVkVSU0lPTj1OT05FCisgICAgZmkKK2ZpCisKK2lmIFtbIC16ICRJTlNUQUxMRURfVkVSU0lPTiBdXTsgdGhlbgorICAgIElOU1RBTExFRF9WRVJTSU9OPSQoZ2l0IC1DIG5kbi1jeHggcmV2LXBhcnNlIEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyBOT05FKQorZmkKKworc3VkbyBybSAtcmYgbmRuLWN4eC1sYXRlc3QKK2dpdCBjbG9uZSAtLWRlcHRoIDEgaHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvbmRuLWN4eC5naXQgbmRuLWN4eC1sYXRlc3QKK0xBVEVTVF9WRVJTSU9OPSQoZ2l0IC1DIG5kbi1jeHgtbGF0ZXN0IHJldi1wYXJzZSBIRUFEIDI+L2Rldi9udWxsIHx8IGVjaG8gVU5LTk9XTikKKworaWYgW1sgJElOU1RBTExFRF9WRVJTSU9OICE9ICRMQVRFU1RfVkVSU0lPTiBdXTsgdGhlbgorICAgIHN1ZG8gcm0gLXJmIG5kbi1jeHgKKyAgICBtdiBuZG4tY3h4LWxhdGVzdCBuZG4tY3h4CitlbHNlCisgICAgc3VkbyBybSAtcmYgbmRuLWN4eC1sYXRlc3QKK2ZpCisKK3N1ZG8gcm0gLWYgL3Vzci9sb2NhbC9iaW4vbmRuc2VjKgorc3VkbyBybSAtZnIgL3Vzci9sb2NhbC9pbmNsdWRlL25kbi1jeHgKK3N1ZG8gcm0gLWYgL3Vzci9sb2NhbC9saWJ7LDY0fS9saWJuZG4tY3h4Kgorc3VkbyBybSAtZiAvdXNyL2xvY2FsL2xpYnssNjR9L3BrZ2NvbmZpZy9saWJuZG4tY3h4LnBjCisKK3B1c2hkIG5kbi1jeHggPi9kZXYvbnVsbAorCitpZiBoYXMgTGludXggJE5PREVfTEFCRUxTICYmIFtbICRDWFggIT0gY2xhbmcqICYmIC16ICRESVNBQkxFX0FTQU4gXV07IHRoZW4KKyAgICAjIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NzAyMjE0MQorICAgIEFTQU49Ii0td2l0aC1zYW5pdGl6ZXI9YWRkcmVzcyIKK2ZpCitpZiBoYXMgQ2VudE9TLTggJE5PREVfTEFCRUxTOyB0aGVuCisgICAgIyBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTE3MjE1NTMKKyAgICBQQ0g9Ii0td2l0aG91dC1wY2giCitmaQorCisuL3dhZiAtLWNvbG9yPXllcyBjb25maWd1cmUgLS1kaXNhYmxlLXN0YXRpYyAtLWVuYWJsZS1zaGFyZWQgLS13aXRob3V0LW9zeC1rZXljaGFpbiAkQVNBTiAkUENICisuL3dhZiAtLWNvbG9yPXllcyBidWlsZCAtaiRXQUZfSk9CUworc3Vkb19wcmVzZXJ2ZV9lbnYgUEFUSCAtLSAuL3dhZiAtLWNvbG9yPXllcyBpbnN0YWxsCisKK3BvcGQgPi9kZXYvbnVsbAorcG9wZCA+L2Rldi9udWxsCisKK2lmIGhhcyBDZW50T1MtOCAkTk9ERV9MQUJFTFM7IHRoZW4KKyAgICBzdWRvIHRlZSAvZXRjL2xkLnNvLmNvbmYuZC9uZG4uY29uZiA+L2Rldi9udWxsIDw8PCAvdXNyL2xvY2FsL2xpYjY0CitmaQoraWYgaGFzIExpbnV4ICROT0RFX0xBQkVMUzsgdGhlbgorICAgIHN1ZG8gbGRjb25maWcKK2ZpCmRpZmYgLS1naXQgYS8uamVua2lucy5kLzEwLWJ1aWxkLnNoIGIvLmplbmtpbnMuZC8xMC1idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGU2YmQxCi0tLSAvZGV2L251bGwKKysrIGIvLmplbmtpbnMuZC8xMC1idWlsZC5zaApAQCAtMCwwICsxLDQxIEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLWV4CisKK2dpdCBzdWJtb2R1bGUgc3luYworZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0CisKK2lmIFtbIC16ICRESVNBQkxFX0FTQU4gXV07IHRoZW4KKyAgICBBU0FOPSItLXdpdGgtc2FuaXRpemVyPWFkZHJlc3MiCitmaQoraWYgW1sgJEpPQl9OQU1FID09ICoiY29kZS1jb3ZlcmFnZSIgXV07IHRoZW4KKyAgICBDT1ZFUkFHRT0iLS13aXRoLWNvdmVyYWdlIgorZmkKKworaWYgW1sgJEpPQl9OQU1FICE9ICoiY29kZS1jb3ZlcmFnZSIgJiYgJEpPQl9OQU1FICE9ICoibGltaXRlZC1idWlsZCIgXV07IHRoZW4KKyAgICAjIEJ1aWxkIGluIHJlbGVhc2UgbW9kZSB3aXRoIHRlc3RzCisgICAgLi93YWYgLS1jb2xvcj15ZXMgY29uZmlndXJlIC0td2l0aC10ZXN0cworICAgIC4vd2FmIC0tY29sb3I9eWVzIGJ1aWxkIC1qJFdBRl9KT0JTCisKKyAgICAjIENsZWFudXAKKyAgICAuL3dhZiAtLWNvbG9yPXllcyBkaXN0Y2xlYW4KKworICAgICMgQnVpbGQgaW4gcmVsZWFzZSBtb2RlIHdpdGhvdXQgdGVzdHMKKyAgICAuL3dhZiAtLWNvbG9yPXllcyBjb25maWd1cmUKKyAgICAuL3dhZiAtLWNvbG9yPXllcyBidWlsZCAtaiRXQUZfSk9CUworCisgICAgIyBDbGVhbnVwCisgICAgLi93YWYgLS1jb2xvcj15ZXMgZGlzdGNsZWFuCitmaQorCisjIEJ1aWxkIGluIGRlYnVnIG1vZGUgd2l0aCB0ZXN0cworLi93YWYgLS1jb2xvcj15ZXMgY29uZmlndXJlIC0tZGVidWcgLS13aXRoLXRlc3RzICRBU0FOICRDT1ZFUkFHRQorLi93YWYgLS1jb2xvcj15ZXMgYnVpbGQgLWokV0FGX0pPQlMKKworIyAodGVzdHMgd2lsbCBiZSBydW4gYWdhaW5zdCB0aGUgZGVidWcgdmVyc2lvbikKKworIyBJbnN0YWxsCitzdWRvX3ByZXNlcnZlX2VudiBQQVRIIC0tIC4vd2FmIC0tY29sb3I9eWVzIGluc3RhbGwKKworaWYgaGFzIExpbnV4ICROT0RFX0xBQkVMUzsgdGhlbgorICAgIHN1ZG8gbGRjb25maWcKK2ZpCmRpZmYgLS1naXQgYS8uamVua2lucy5kLzIwLXRlc3RzLnNoIGIvLmplbmtpbnMuZC8yMC10ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjZjNzdkCi0tLSAvZGV2L251bGwKKysrIGIvLmplbmtpbnMuZC8yMC10ZXN0cy5zaApAQCAtMCwwICsxLDM2IEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLWV4CisKKyMgUHJlcGFyZSBlbnZpcm9ubWVudAorcm0gLXJmIH4vLm5kbgorCitCT09TVF9WRVJTSU9OPSQocHl0aG9uMyAtYyAiaW1wb3J0IHN5czsgc3lzLnBhdGguYXBwZW5kKCdidWlsZC9jNGNoZScpOyBpbXBvcnQgX2NhY2hlOyBwcmludChfY2FjaGUuQk9PU1RfVkVSU0lPTl9OVU1CRVIpOyIpCisKK3V0X2xvZ19hcmdzKCkgeworICAgIGlmICgoIEJPT1NUX1ZFUlNJT04gPj0gMTA2MjAwICkpOyB0aGVuCisgICAgICAgIGVjaG8gLS1sb2dnZXI9SFJGLHRlc3Rfc3VpdGUsc3Rkb3V0OlhNTCxhbGwsYnVpbGQveHVuaXQtJHsxOi1yZXBvcnR9LnhtbAorICAgIGVsc2UKKyAgICAgICAgaWYgW1sgLW4gJFhVTklUIF1dOyB0aGVuCisgICAgICAgICAgICBlY2hvIC0tbG9nX2xldmVsPWFsbCAkKCAoKCBCT09TVF9WRVJTSU9OID49IDEwNjAwMCApKSAmJiBlY2hvIC0tICkgXAorICAgICAgICAgICAgICAgICAtLWxvZ19mb3JtYXQyPVhNTCAtLWxvZ19zaW5rMj1idWlsZC94dW5pdC0kezE6LXJlcG9ydH0ueG1sCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gLS1sb2dfbGV2ZWw9dGVzdF9zdWl0ZQorICAgICAgICBmaQorICAgIGZpCit9CisKKyMgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9zYW5pdGl6ZXJzL3dpa2kvQWRkcmVzc1Nhbml0aXplckZsYWdzCitBU0FOX09QVElPTlM9ImNvbG9yPWFsd2F5cyIKK0FTQU5fT1BUSU9OUys9IjpjaGVja19pbml0aWFsaXphdGlvbl9vcmRlcj0xIgorQVNBTl9PUFRJT05TKz0iOmRldGVjdF9zdGFja191c2VfYWZ0ZXJfcmV0dXJuPTEiCitBU0FOX09QVElPTlMrPSI6c3RyaWN0X2luaXRfb3JkZXI9MSIKK0FTQU5fT1BUSU9OUys9IjpzdHJpY3Rfc3RyaW5nX2NoZWNrcz0xIgorQVNBTl9PUFRJT05TKz0iOmRldGVjdF9pbnZhbGlkX3BvaW50ZXJfcGFpcnM9MiIKK0FTQU5fT1BUSU9OUys9IjpzdHJpcF9wYXRoX3ByZWZpeD0ke1BXRH0vIgorZXhwb3J0IEFTQU5fT1BUSU9OUworCitleHBvcnQgQk9PU1RfVEVTVF9CVUlMRF9JTkZPPTEKK2V4cG9ydCBCT09TVF9URVNUX0NPTE9SX09VVFBVVD0xCisKKyMgUnVuIHVuaXQgdGVzdHMKKy4vYnVpbGQvdW5pdC10ZXN0cyAkKHV0X2xvZ19hcmdzKQpkaWZmIC0tZ2l0IGEvLmplbmtpbnMuZC8zMC1jb3ZlcmFnZS5zaCBiLy5qZW5raW5zLmQvMzAtY292ZXJhZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGNjZTg3ZAotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvMzAtY292ZXJhZ2Uuc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorc2V0IC1leAorCitpZiBbWyAkSk9CX05BTUUgPT0gKiJjb2RlLWNvdmVyYWdlIiBdXTsgdGhlbgorICAgIGdjb3ZyIC0tb2JqZWN0LWRpcmVjdG9yeT1idWlsZCBcCisgICAgICAgICAgLS1vdXRwdXQ9YnVpbGQvY292ZXJhZ2UueG1sIFwKKyAgICAgICAgICAtLWV4Y2x1ZGU9IiRQV0QvdGVzdHMiIFwKKyAgICAgICAgICAtLXJvb3Q9LiBcCisgICAgICAgICAgLS14bWwKKworICAgICMgR2VuZXJhdGUgYWxzbyBhIGRldGFpbGVkIEhUTUwgb3V0cHV0LCBidXQgdXNpbmcgbGNvdiAoYmV0dGVyIHJlc3VsdHMpCisgICAgbGNvdiAtLXF1aWV0IFwKKyAgICAgICAgIC0tY2FwdHVyZSBcCisgICAgICAgICAtLWRpcmVjdG9yeSAuIFwKKyAgICAgICAgIC0tbm8tZXh0ZXJuYWwgXAorICAgICAgICAgLS1yYyBsY292X2JyYW5jaF9jb3ZlcmFnZT0xIFwKKyAgICAgICAgIC0tb3V0cHV0LWZpbGUgYnVpbGQvY292ZXJhZ2Utd2l0aC10ZXN0cy5pbmZvCisKKyAgICBsY292IC0tcXVpZXQgXAorICAgICAgICAgLS1yZW1vdmUgYnVpbGQvY292ZXJhZ2Utd2l0aC10ZXN0cy5pbmZvICIkUFdEL3Rlc3RzLyoiIFwKKyAgICAgICAgIC0tcmMgbGNvdl9icmFuY2hfY292ZXJhZ2U9MSBcCisgICAgICAgICAtLW91dHB1dC1maWxlIGJ1aWxkL2NvdmVyYWdlLmluZm8KKworICAgIGdlbmh0bWwgLS1icmFuY2gtY292ZXJhZ2UgXAorICAgICAgICAgICAgLS1kZW1hbmdsZS1jcHAgXAorICAgICAgICAgICAgLS1sZWdlbmQgXAorICAgICAgICAgICAgLS1vdXRwdXQtZGlyZWN0b3J5IGJ1aWxkL2NvdmVyYWdlIFwKKyAgICAgICAgICAgIC0tdGl0bGUgIm5kbmNlcnQgdW5pdCB0ZXN0cyIgXAorICAgICAgICAgICAgYnVpbGQvY292ZXJhZ2UuaW5mbworZmkKZGlmZiAtLWdpdCBhLy5qZW5raW5zLmQvUkVBRE1FLm1kIGIvLmplbmtpbnMuZC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkYmYzNwotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjggQEAKKyMgQ09OVElOVU9VUyBJTlRFR1JBVElPTiBTQ1JJUFRTCisKKyMjIEVudmlyb25tZW50IFZhcmlhYmxlcyBVc2VkIGluIEJ1aWxkIFNjcmlwdHMKKworLSBgTk9ERV9MQUJFTFNgOiBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwbGF0Zm9ybSBwcm9wZXJ0aWVzLiBUaGUgaW5jbHVkZWQgdmFsdWVzIGFyZSB1c2VkIGJ5CisgIHRoZSBidWlsZCBzY3JpcHRzIHRvIHNlbGVjdCB0aGUgcHJvcGVyIGJlaGF2aW9yIGZvciBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMgYW5kIHZlcnNpb25zLgorCisgIFRoZSBsaXN0IHNob3VsZCBub3JtYWxseSBjb250YWluIGBbT1NfVFlQRV1gLCBgW0RJU1RST19UWVBFXWAsIGFuZCBgW0RJU1RST19WRVJTSU9OXWAuCisKKyAgRXhhbXBsZSB2YWx1ZXM6CisKKyAgLSBgW09TX1RZUEVdYDogYExpbnV4YCwgYE9TWGAKKyAgLSBgW0RJU1RST19UWVBFXWA6IGBVYnVudHVgLCBgQ2VudE9TYAorICAtIGBbRElTVFJPX1ZFUlNJT05dYDogYFVidW50dS0xNi4wNGAsIGBVYnVudHUtMTguMDRgLCBgQ2VudE9TLThgLCBgT1NYLTEwLjE0YCwgYE9TWC0xMC4xNWAKKworLSBgSk9CX05BTUVgOiBvcHRpb25hbCB2YXJpYWJsZSB0aGF0IGRlZmluZXMgdGhlIHR5cGUgb2YgYnVpbGQgam9iLiBEZXBlbmRpbmcgb24gdGhlIGpvYiB0eXBlLAorICB0aGUgYnVpbGQgc2NyaXB0cyBjYW4gcGVyZm9ybSBkaWZmZXJlbnQgdGFza3MuCisKKyAgUG9zc2libGUgdmFsdWVzOgorCisgIC0gZW1wdHk6IGRlZmF1bHQgYnVpbGQgdGFzaworICAtIGBjb2RlLWNvdmVyYWdlYDogZGVidWcgYnVpbGQgd2l0aCB0ZXN0cyBhbmQgY29kZSBjb3ZlcmFnZSBhbmFseXNpcyAoVWJ1bnR1IExpbnV4IGlzIGFzc3VtZWQpCisgIC0gYGxpbWl0ZWQtYnVpbGRgOiBvbmx5IGEgc2luZ2xlIGRlYnVnIGJ1aWxkIHdpdGggdGVzdHMKKworLSBgQ0FDSEVfRElSYDogZGlyZWN0b3J5IGNvbnRhaW5pbmcgY2FjaGVkIGZpbGVzIGZyb20gcHJldmlvdXMgYnVpbGRzLCBlLmcuLCBhIGNvbXBpbGVkIHZlcnNpb24KKyAgb2YgbmRuLWN4eC4gSWYgbm90IHNldCwgYC90bXBgIGlzIHVzZWQuCisKKy0gYFdBRl9KT0JTYDogbnVtYmVyIG9mIHBhcmFsbGVsIGJ1aWxkIHRocmVhZHMgdXNlZCBieSB3YWYsIGRlZmF1bHRzIHRvIDEuCmRpZmYgLS1naXQgYS8uamVua2lucy5kL3V0aWwuc2ggYi8uamVua2lucy5kL3V0aWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3N2E3NAotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvdXRpbC5zaApAQCAtMCwwICsxLDM5IEBACitoYXMoKSB7CisgICAgbG9jYWwgc2F2ZWRfeHRyYWNlCisgICAgW1sgJC0gPT0gKngqIF1dICYmIHNhdmVkX3h0cmFjZT0teCB8fCBzYXZlZF94dHJhY2U9K3gKKyAgICBzZXQgK3gKKworICAgIGxvY2FsIHA9JDEKKyAgICBzaGlmdAorICAgIGxvY2FsIGkgcmV0PTEKKyAgICBmb3IgaSBpbiAiJEAiOyBkbworICAgICAgICBpZiBbWyAiJHtpfSIgPT0gIiR7cH0iIF1dOyB0aGVuCisgICAgICAgICAgICByZXQ9MAorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICBkb25lCisKKyAgICBzZXQgJHtzYXZlZF94dHJhY2V9CisgICAgcmV0dXJuICR7cmV0fQorfQorZXhwb3J0IC1mIGhhcworCitzdWRvX3ByZXNlcnZlX2VudigpIHsKKyAgICBsb2NhbCBzYXZlZF94dHJhY2UKKyAgICBbWyAkLSA9PSAqeCogXV0gJiYgc2F2ZWRfeHRyYWNlPS14IHx8IHNhdmVkX3h0cmFjZT0reAorICAgIHNldCAreAorCisgICAgbG9jYWwgdmFycz0oKQorICAgIHdoaWxlIFtbICQjIC1ndCAwIF1dOyBkbworICAgICAgICBsb2NhbCBhcmc9JDEKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY2FzZSAke2FyZ30gaW4KKyAgICAgICAgICAgIC0tKSBicmVhayA7OworICAgICAgICAgICAgKikgIHZhcnMrPSgiJHthcmd9PSR7IWFyZ30iKSA7OworICAgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgc2V0ICR7c2F2ZWRfeHRyYWNlfQorICAgIHN1ZG8gZW52ICIke3ZhcnNbQF19IiAiJEAiCit9CitleHBvcnQgLWYgc3Vkb19wcmVzZXJ2ZV9lbnYKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmNmQyNwotLS0gL2Rldi9udWxsCisrKyBiLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMTA1IEBACit2ZXJzaW9uOiB+PiAxLjAKK2xhbmd1YWdlOiBjcHAKK29zOiBsaW51eAorZGlzdDogYmlvbmljCisKK2FyY2g6CisgIC0gYW1kNjQKKyAgLSBhcm02NAorICAtIHBwYzY0bGUKKyAgLSBzMzkweAorCitlbnY6CisgIC0gQ09NUElMRVI9ZysrLTcKKyAgLSBDT01QSUxFUj1nKystOQorICAtIENPTVBJTEVSPWNsYW5nKystNi4wCisgIC0gQ09NUElMRVI9Y2xhbmcrKy05CisKK2pvYnM6CisgIGluY2x1ZGU6CisgICAgIyBMaW51eAorICAgIC0gZW52OiBDT01QSUxFUj1nKystOAorICAgIC0gZW52OiBDT01QSUxFUj1jbGFuZysrLTUuMAorICAgIC0gZW52OiBDT01QSUxFUj1jbGFuZysrLTcKKyAgICAtIGVudjogQ09NUElMRVI9Y2xhbmcrKy04CisgICAgLSBlbnY6IENPTVBJTEVSPWNsYW5nKystMTAKKyAgICAtIGVudjogQ09NUElMRVI9Y2xhbmcrKy0xMQorICAgIC0gZW52OiBDT01QSUxFUj1jbGFuZysrLTEyCisKKyAgICAjIG1hY09TCisgICAgLSBvczogb3N4CisgICAgICBvc3hfaW1hZ2U6IHhjb2RlOS40CisgICAgICBlbnY6ICMgZGVmYXVsdCBjb21waWxlcgorICAgIC0gb3M6IG9zeAorICAgICAgb3N4X2ltYWdlOiB4Y29kZTEwLjEKKyAgICAgIGVudjogIyBkZWZhdWx0IGNvbXBpbGVyCisgICAgLSBvczogb3N4CisgICAgICBvc3hfaW1hZ2U6IHhjb2RlMTAuMworICAgICAgZW52OiAjIGRlZmF1bHQgY29tcGlsZXIKKyAgICAtIG9zOiBvc3gKKyAgICAgIG9zeF9pbWFnZTogeGNvZGUxMS4zCisgICAgICBlbnY6ICMgZGVmYXVsdCBjb21waWxlcgorICAgIC0gb3M6IG9zeAorICAgICAgb3N4X2ltYWdlOiB4Y29kZTExLjYKKyAgICAgIGVudjogIyBkZWZhdWx0IGNvbXBpbGVyCisgICAgLSBvczogb3N4CisgICAgICBvc3hfaW1hZ2U6IHhjb2RlMTIKKyAgICAgIGVudjogIyBkZWZhdWx0IGNvbXBpbGVyCisKKyAgYWxsb3dfZmFpbHVyZXM6CisgICAgLSBlbnY6IENPTVBJTEVSPWNsYW5nKystMTIKKworICBmYXN0X2ZpbmlzaDogdHJ1ZQorCitiZWZvcmVfaW5zdGFsbDoKKyAgLSB8CisgICAgOiBBZGRpbmcgYXB0IHJlcG9zaXRvcmllcworICAgIGNhc2UgJHtDT01QSUxFUn0gaW4KKyAgICAgIGcrKy05KQorICAgICAgICAjIGh0dHBzOi8vbGF1bmNocGFkLm5ldC9+dWJ1bnR1LXRvb2xjaGFpbi1yLythcmNoaXZlL3VidW50dS90ZXN0LytwYWNrYWdlcworICAgICAgICB0cmF2aXNfcmV0cnkgc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgLXkgcHBhOnVidW50dS10b29sY2hhaW4tci90ZXN0CisgICAgICAgIHRyYXZpc19yZXRyeSBzdWRvIGFwdC1nZXQgLXFxIHVwZGF0ZQorICAgICAgICA7OworICAgICAgY2xhbmcrKy0xPykKKyAgICAgICAgIyBodHRwczovL2FwdC5sbHZtLm9yZy8KKyAgICAgICAgTExWTV9SRVBPPSR7Q09NUElMRVIvY2xhbmcrKy9sbHZtLXRvb2xjaGFpbi0ke1RSQVZJU19ESVNUfX0KKyAgICAgICAgdHJhdmlzX3JldHJ5IHdnZXQgLW52IC1PIC0gImh0dHBzOi8vYXB0Lmxsdm0ub3JnL2xsdm0tc25hcHNob3QuZ3BnLmtleSIgfCBzdWRvIGFwdC1rZXkgYWRkIC0KKyAgICAgICAgdHJhdmlzX3JldHJ5IHN1ZG8gYWRkLWFwdC1yZXBvc2l0b3J5IC15ICJkZWIgaHR0cDovL2FwdC5sbHZtLm9yZy8ke1RSQVZJU19ESVNUfS8gJHtMTFZNX1JFUE8lLTEyfSBtYWluIgorICAgICAgICB0cmF2aXNfcmV0cnkgc3VkbyBhcHQtZ2V0IC1xcSB1cGRhdGUKKyAgICAgICAgOzsKKyAgICBlc2FjCisKK2luc3RhbGw6CisgIC0gfAorICAgIDogSW5zdGFsbGluZyBDKysgY29tcGlsZXIKKyAgICBpZiBbWyAtbiAke0NPTVBJTEVSfSBdXTsgdGhlbgorICAgICAgdHJhdmlzX3JldHJ5IHN1ZG8gYXB0LWdldCAtcXkgaW5zdGFsbCAke0NPTVBJTEVSL2NsYW5nKysvY2xhbmd9CisgICAgZmkKKworYmVmb3JlX3NjcmlwdDoKKyAgLSB8CisgICAgOiBTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgIGlmIFtbIC1uICR7Q09NUElMRVJ9IF1dOyB0aGVuCisgICAgICBleHBvcnQgQ1hYPSR7Q09NUElMRVJ9CisgICAgZmkKKyAgICBjYXNlICR7VFJBVklTX09TX05BTUV9IGluCisgICAgICBsaW51eCkgIGV4cG9ydCBOT0RFX0xBQkVMUz0iTGludXggVWJ1bnR1IFVidW50dS0xOC4wNCIgOzsKKyAgICAgIG9zeCkgICAgZXhwb3J0IE5PREVfTEFCRUxTPSJPU1ggT1NYLSQoc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBjdXQgLWQgLiAtZiAtMikiIDs7CisgICAgZXNhYworICAgIGV4cG9ydCBXQUZfSk9CUz0yCisgIC0gfAorICAgIDogRW5hYmxpbmcgd29ya2Fyb3VuZHMKKyAgICBjYXNlICIke1RSQVZJU19DUFVfQVJDSH0sJHtDT01QSUxFUn0iIGluCisgICAgICBwcGM2NGxlLGcrKy03KQorICAgICAgICAjIEFkZHJlc3NTYW5pdGl6ZXIgZG9lcyBub3Qgc2VlbSB0byBiZSB3b3JraW5nCisgICAgICAgIGV4cG9ydCBESVNBQkxFX0FTQU49eWVzCisgICAgICAgIDs7CisgICAgICAqLGNsYW5nKystOCkKKyAgICAgICAgIyBodHRwczovL2J1Z3MubGx2bS5vcmcvc2hvd19idWcuY2dpP2lkPTQwODA4CisgICAgICAgIGV4cG9ydCBESVNBQkxFX0FTQU49eWVzCisgICAgICAgIDs7CisgICAgZXNhYworICAtICR7Q1hYOi1jKyt9IC0tdmVyc2lvbgorCitzY3JpcHQ6CisgIC0gLi8uamVua2lucwpkaWZmIC0tZ2l0IGEvLndhZi10b29scy9ib29zdC5weSBiLy53YWYtdG9vbHMvYm9vc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyZWRlNQotLS0gL2Rldi9udWxsCisrKyBiLy53YWYtdG9vbHMvYm9vc3QucHkKQEAgLTAsMCArMSw1MzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgcGFydGlhbGx5IGJhc2VkIG9uIGJvb3N0LnB5IHdyaXR0ZW4gYnkgR2Vybm90IFZvcm1heXIKKyMgd3JpdHRlbiBieSBSdWVkaWdlciBTb25kZXJmZWxkIDxydWVkaWdlckBjLXBsdXNwbHVzLmRlPiwgMjAwOAorIyBtb2RpZmllZCBieSBCam9lcm4gTWljaGFlbHNlbiwgMjAwOAorIyBtb2RpZmllZCBieSBMdWNhIEZvc3NhdGksIDIwMDgKKyMgcmV3cml0dGVuIGZvciB3YWYgMS41LjEsIFRob21hcyBOYWd5LCAyMDA4CisjIHJld3JpdHRlbiBmb3Igd2FmIDEuNi4yLCBTeWx2YWluIFJvdXF1ZXR0ZSwgMjAxMQorCisnJycKKworVGhpcyBpcyBhbiBleHRyYSB0b29sLCBub3QgYnVuZGxlZCB3aXRoIHRoZSBkZWZhdWx0IHdhZiBiaW5hcnkuCitUbyBhZGQgdGhlIGJvb3N0IHRvb2wgdG8gdGhlIHdhZiBmaWxlOgorJCAuL3dhZi1saWdodCAtLXRvb2xzPWNvbXBhdDE1LGJvb3N0CisJb3IsIGlmIHlvdSBoYXZlIHdhZiA+PSAxLjYuMgorJCAuL3dhZiB1cGRhdGUgLS1maWxlcz1ib29zdAorCitXaGVuIHVzaW5nIHRoaXMgdG9vbCwgdGhlIHdzY3JpcHQgd2lsbCBsb29rIGxpa2U6CisKKwlkZWYgb3B0aW9ucyhvcHQpOgorCQlvcHQubG9hZCgnY29tcGlsZXJfY3h4IGJvb3N0JykKKworCWRlZiBjb25maWd1cmUoY29uZik6CisJCWNvbmYubG9hZCgnY29tcGlsZXJfY3h4IGJvb3N0JykKKwkJY29uZi5jaGVja19ib29zdChsaWI9J3N5c3RlbSBmaWxlc3lzdGVtJykKKworCWRlZiBidWlsZChibGQpOgorCQlibGQoc291cmNlPSdtYWluLmNwcCcsIHRhcmdldD0nYXBwJywgdXNlPSdCT09TVCcpCisKK09wdGlvbnMgYXJlIGdlbmVyYXRlZCwgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgYm9vc3QgaW5jbHVkZXMvbGlicmFyaWVzLgorVGhlIGBjaGVja19ib29zdGAgY29uZmlndXJhdGlvbiBmdW5jdGlvbiBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgdXNlZCBib29zdCBsaWJyYXJpZXMuCitJdCBjYW4gYWxzbyBwcm92aWRlIGRlZmF1bHQgYXJndW1lbnRzIHRvIHRoZSAtLWJvb3N0LW10IGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCitFdmVyeXRoaW5nIHdpbGwgYmUgcGFja2FnZWQgdG9nZXRoZXIgaW4gYSBCT09TVCBjb21wb25lbnQgdGhhdCB5b3UgY2FuIHVzZS4KKworV2hlbiB1c2luZyBNU1ZDLCBhIGxvdCBvZiBjb21waWxhdGlvbiBmbGFncyBuZWVkIHRvIG1hdGNoIHlvdXIgQk9PU1QgYnVpbGQgY29uZmlndXJhdGlvbjoKKyAtIHlvdSBtYXkgaGF2ZSB0byBhZGQgL0VIc2MgdG8geW91ciBDWFhGTEFHUyBvciBkZWZpbmUgYm9vc3Q6OnRocm93X2V4Y2VwdGlvbiBpZiBCT09TVF9OT19FWENFUFRJT05TIGlzIGRlZmluZWQuCisgICBFcnJvcnM6IEM0NTMwCisgLSBib29zdCBsaWJyYXJpZXMgd2lsbCB0cnkgdG8gYmUgc21hcnQgYW5kIHVzZSB0aGUgKHByZXR0eSBidXQgb2Z0ZW4gbm90IHVzZWZ1bCkgYXV0by1saW5raW5nIGZlYXR1cmUgb2YgTVNWQworICAgU28gYmVmb3JlIGNhbGxpbmcgYGNvbmYuY2hlY2tfYm9vc3RgIHlvdSBtaWdodCB3YW50IHRvIGRpc2FibGluZyBieSBhZGRpbmcKKwkJY29uZi5lbnYuREVGSU5FU19CT09TVCArPSBbJ0JPT1NUX0FMTF9OT19MSUInXQorICAgRXJyb3JzOgorIC0gYm9vc3QgbWlnaHQgYWxzbyBiZSBjb21waWxlZCB3aXRoIC9NVCwgd2hpY2ggbGlua3MgdGhlIHJ1bnRpbWUgc3RhdGljYWxseS4KKyAgIElmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggcmVkZWZpbmVkIHN5bWJvbHMsCisJCXNlbGYuZW52WydERUZJTkVTXyVzJyAlIHZhcl0gKz0gWydCT09TVF9BTExfTk9fTElCJ10KKwkJc2VsZi5lbnZbJ0NYWEZMQUdTXyVzJyAlIHZhcl0gKz0gWycvTUQnLCAnL0VIc2MnXQorUGFzc2luZyBgLS1ib29zdC1saW5rYWdlX2F1dG9kZXRlY3RgIG1pZ2h0IGhlbHAgZW5zdXJpbmcgaGF2aW5nIGEgY29ycmVjdCBsaW5rYWdlIGluIHNvbWUgYmFzaWMgY2FzZXMuCisKKycnJworCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2Zyb20gd2FmbGliIGltcG9ydCBVdGlscywgTG9ncywgRXJyb3JzCitmcm9tIHdhZmxpYi5Db25maWd1cmUgaW1wb3J0IGNvbmYKK2Zyb20gd2FmbGliLlRhc2tHZW4gaW1wb3J0IGZlYXR1cmUsIGFmdGVyX21ldGhvZAorCitCT09TVF9MSUJTID0gWycvdXNyL2xpYicsICcvdXNyL2xvY2FsL2xpYicsICcvb3B0L2xvY2FsL2xpYicsICcvc3cvbGliJywgJy9saWInXQorQk9PU1RfSU5DTFVERVMgPSBbJy91c3IvaW5jbHVkZScsICcvdXNyL2xvY2FsL2luY2x1ZGUnLCAnL29wdC9sb2NhbC9pbmNsdWRlJywgJy9zdy9pbmNsdWRlJ10KKworQk9PU1RfVkVSU0lPTl9GSUxFID0gJ2Jvb3N0L3ZlcnNpb24uaHBwJworQk9PU1RfVkVSU0lPTl9DT0RFID0gJycnCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CitpbnQgbWFpbigpIHsgc3RkOjpjb3V0IDw8IEJPT1NUX0xJQl9WRVJTSU9OIDw8ICI6IiA8PCBCT09TVF9WRVJTSU9OIDw8IHN0ZDo6ZW5kbDsgfQorJycnCisKK0JPT1NUX0VSUk9SX0NPREUgPSAnJycKKyNpbmNsdWRlIDxib29zdC9zeXN0ZW0vZXJyb3JfY29kZS5ocHA+CitpbnQgbWFpbigpIHsgYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBjOyB9CisnJycKKworUFRIUkVBRF9DT0RFID0gJycnCisjaW5jbHVkZSA8cHRocmVhZC5oPgorc3RhdGljIHZvaWQqIGYodm9pZCopIHsgcmV0dXJuIDA7IH0KK2ludCBtYWluKCkgeworCXB0aHJlYWRfdCB0aDsKKwlwdGhyZWFkX2F0dHJfdCBhdHRyOworCXB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKwlwdGhyZWFkX2NyZWF0ZSgmdGgsICZhdHRyLCAmZiwgMCk7CisJcHRocmVhZF9qb2luKHRoLCAwKTsKKwlwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKwlwdGhyZWFkX2NsZWFudXBfcG9wKDApOworCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKK30KKycnJworCitCT09TVF9USFJFQURfQ09ERSA9ICcnJworI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CitpbnQgbWFpbigpIHsgYm9vc3Q6OnRocmVhZCB0OyB9CisnJycKKworQk9PU1RfTE9HX0NPREUgPSAnJycKKyNpbmNsdWRlIDxib29zdC9sb2cvdHJpdmlhbC5ocHA+CitpbnQgbWFpbigpIHsgQk9PU1RfTE9HX1RSSVZJQUwoaW5mbykgPDwgImJvb3N0X2xvZyBpcyB3b3JraW5nIjsgfQorJycnCisKK0JPT1NUX0xPR19TRVRVUF9DT0RFID0gJycnCisjaW5jbHVkZSA8Ym9vc3QvbG9nL3RyaXZpYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2xvZy91dGlsaXR5L3NldHVwL2NvbnNvbGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2xvZy91dGlsaXR5L3NldHVwL2NvbW1vbl9hdHRyaWJ1dGVzLmhwcD4KK2ludCBtYWluKCkgeworCXVzaW5nIG5hbWVzcGFjZSBib29zdDo6bG9nOworCWFkZF9jb21tb25fYXR0cmlidXRlcygpOworCWFkZF9jb25zb2xlX2xvZyhzdGQ6OmNsb2csIGtleXdvcmRzOjpmb3JtYXQgPSAiJU1lc3NhZ2UlIik7CisJQk9PU1RfTE9HX1RSSVZJQUwoaW5mbykgPDwgImJvb3N0X2xvZ19zZXR1cCBpcyB3b3JraW5nIjsKK30KKycnJworCisjIHRvb2xzZXRzIGZyb20ge2Jvb3N0X2Rpcn0vdG9vbHMvYnVpbGQvdjIvdG9vbHMvY29tbW9uLmphbQorUExBVEZPUk0gPSBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKQorZGV0ZWN0X2ludGVsID0gbGFtYmRhIGVudjogKFBMQVRGT1JNID09ICd3aW4zMicpIGFuZCAnaXcnIG9yICdpbCcKK2RldGVjdF9jbGFuZyA9IGxhbWJkYSBlbnY6IChQTEFURk9STSA9PSAnZGFyd2luJykgYW5kICdjbGFuZy1kYXJ3aW4nIG9yICdjbGFuZycKK2RldGVjdF9taW5ndyA9IGxhbWJkYSBlbnY6IChyZS5zZWFyY2goJ01pbkdXJywgZW52LkNYWFswXSkpIGFuZCAnbWd3JyBvciAnZ2NjJworQk9PU1RfVE9PTFNFVFMgPSB7CisJJ2JvcmxhbmQnOiAgJ2JjYicsCisJJ2NsYW5nJzoJZGV0ZWN0X2NsYW5nLAorCSdjb21vJzoJICdjb21vJywKKwknY3cnOgkgICAnY3cnLAorCSdkYXJ3aW4nOiAgICd4Z2NjJywKKwknZWRnJzoJICAnZWRnJywKKwknZysrJzoJICBkZXRlY3RfbWluZ3csCisJJ2djYyc6CSAgZGV0ZWN0X21pbmd3LAorCSdpY3BjJzoJIGRldGVjdF9pbnRlbCwKKwknaW50ZWwnOglkZXRlY3RfaW50ZWwsCisJJ2tjYyc6CSAgJ2tjYycsCisJJ2t5bGl4JzoJJ2JjaycsCisJJ21pcHNwcm8nOiAgJ21wJywKKwknbWluZ3cnOgknbWd3JywKKwknbXN2Yyc6CSAndmMnLAorCSdxY2MnOgkgICdxY2MnLAorCSdzdW4nOgkgICdzdycsCisJJ3N1bmMrKyc6ICAgJ3N3JywKKwkndHJ1NjRjeHgnOiAndHJ1JywKKwkndmFjcHAnOgkneGxjJworfQorCisKK2RlZiBvcHRpb25zKG9wdCk6CisJb3B0ID0gb3B0LmFkZF9vcHRpb25fZ3JvdXAoJ0Jvb3N0IE9wdGlvbnMnKQorCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LWluY2x1ZGVzJywgdHlwZT0nc3RyaW5nJywKKwkJCQkgICBkZWZhdWx0PScnLCBkZXN0PSdib29zdF9pbmNsdWRlcycsCisJCQkJICAgaGVscD0nJydwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGJvb3N0IGluY2x1ZGVzIGFyZSwKKwkJCQkgICBlLmcuLCAvcGF0aC90by9ib29zdF8xXzU1XzAvc3RhZ2UvaW5jbHVkZScnJykKKwlvcHQuYWRkX29wdGlvbignLS1ib29zdC1saWJzJywgdHlwZT0nc3RyaW5nJywKKwkJCQkgICBkZWZhdWx0PScnLCBkZXN0PSdib29zdF9saWJzJywKKwkJCQkgICBoZWxwPScnJ3BhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgYm9vc3QgbGlicyBhcmUsCisJCQkJICAgZS5nLiwgcGF0aC90by9ib29zdF8xXzU1XzAvc3RhZ2UvbGliJycnKQorCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LW10JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKwkJCQkgICBkZWZhdWx0PUZhbHNlLCBkZXN0PSdib29zdF9tdCcsCisJCQkJICAgaGVscD0nc2VsZWN0IG11bHRpLXRocmVhZGVkIGxpYnJhcmllcycpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtYWJpJywgdHlwZT0nc3RyaW5nJywgZGVmYXVsdD0nJywgZGVzdD0nYm9vc3RfYWJpJywKKwkJCQkgICBoZWxwPScnJ3NlbGVjdCBsaWJyYXJpZXMgd2l0aCB0YWdzIChnZCBmb3IgZGVidWcsIHN0YXRpYyBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkKSwKKwkJCQkgICBzZWUgZG9jIEJvb3N0LCBHZXR0aW5nIFN0YXJ0ZWQsIGNoYXB0ZXIgNi4xJycnKQorCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LWxpbmthZ2VfYXV0b2RldGVjdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2Jvb3N0X2xpbmthZ2VfYXV0b2RldGVjdCcsCisJCQkJICAgaGVscD0iYXV0by1kZXRlY3QgYm9vc3QgbGlua2FnZSBvcHRpb25zIChkb24ndCBnZXQgdXNlZCB0byBpdCAvIG1pZ2h0IGJyZWFrIG90aGVyIHN0dWZmKSIpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtdG9vbHNldCcsIHR5cGU9J3N0cmluZycsCisJCQkJICAgZGVmYXVsdD0nJywgZGVzdD0nYm9vc3RfdG9vbHNldCcsCisJCQkJICAgaGVscD0nZm9yY2UgYSB0b29sc2V0IGUuZy4gbXN2YywgdmM5MCwgXAorCQkJCQkJZ2NjLCBtaW5ndywgbWd3NDUgKGRlZmF1bHQ6IGF1dG8pJykKKwlweV92ZXJzaW9uID0gJyVkJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtcHl0aG9uJywgdHlwZT0nc3RyaW5nJywKKwkJCQkgICBkZWZhdWx0PXB5X3ZlcnNpb24sIGRlc3Q9J2Jvb3N0X3B5dGhvbicsCisJCQkJICAgaGVscD0nc2VsZWN0IHRoZSBsaWIgcHl0aG9uIHdpdGggdGhpcyB2ZXJzaW9uIFwKKwkJCQkJCShkZWZhdWx0OiAlcyknICUgcHlfdmVyc2lvbikKKworCitAY29uZgorZGVmIF9fYm9vc3RfZ2V0X3ZlcnNpb25fZmlsZShzZWxmLCBkKToKKwlpZiBub3QgZDoKKwkJcmV0dXJuIE5vbmUKKwlkbm9kZSA9IHNlbGYucm9vdC5maW5kX2RpcihkKQorCWlmIGRub2RlOgorCQlyZXR1cm4gZG5vZGUuZmluZF9ub2RlKEJPT1NUX1ZFUlNJT05fRklMRSkKKwlyZXR1cm4gTm9uZQorCitAY29uZgorZGVmIGJvb3N0X2dldF92ZXJzaW9uKHNlbGYsIGQpOgorCSIiInNpbGVudGx5IHJldHJpZXZlIHRoZSBib29zdCB2ZXJzaW9uIG51bWJlciIiIgorCW5vZGUgPSBzZWxmLl9fYm9vc3RfZ2V0X3ZlcnNpb25fZmlsZShkKQorCWlmIG5vZGU6CisJCXRyeToKKwkJCXR4dCA9IG5vZGUucmVhZCgpCisJCWV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorCQkJTG9ncy5lcnJvcignQ291bGQgbm90IHJlYWQgdGhlIGZpbGUgJXInICUgbm9kZS5hYnNwYXRoKCkpCisJCWVsc2U6CisJCQlyZV9idXQxID0gcmUuY29tcGlsZSgnXiNkZWZpbmVcXHMrQk9PU1RfTElCX1ZFUlNJT05cXHMrIiguKykiJywgcmUuTSkKKwkJCW0xID0gcmVfYnV0MS5zZWFyY2godHh0KQorCQkJcmVfYnV0MiA9IHJlLmNvbXBpbGUoJ14jZGVmaW5lXFxzK0JPT1NUX1ZFUlNJT05cXHMrKFxcZCspJywgcmUuTSkKKwkJCW0yID0gcmVfYnV0Mi5zZWFyY2godHh0KQorCQkJaWYgbTEgYW5kIG0yOgorCQkJCXJldHVybiAobTEuZ3JvdXAoMSksIG0yLmdyb3VwKDEpKQorCXJldHVybiBzZWxmLmNoZWNrX2N4eChmcmFnbWVudD1CT09TVF9WRVJTSU9OX0NPREUsIGluY2x1ZGVzPVtkXSwgZXhlY3V0ZT1UcnVlLCBkZWZpbmVfcmV0PVRydWUpLnNwbGl0KCc6JykKKworQGNvbmYKK2RlZiBib29zdF9nZXRfaW5jbHVkZXMoc2VsZiwgKmssICoqa3cpOgorCWluY2x1ZGVzID0gayBhbmQga1swXSBvciBrdy5nZXQoJ2luY2x1ZGVzJywgTm9uZSkKKwlpZiBpbmNsdWRlcyBhbmQgc2VsZi5fX2Jvb3N0X2dldF92ZXJzaW9uX2ZpbGUoaW5jbHVkZXMpOgorCQlyZXR1cm4gaW5jbHVkZXMKKwlmb3IgZCBpbiBzZWxmLmVudmlyb24uZ2V0KCdJTkNMVURFJywgJycpLnNwbGl0KCc7JykgKyBCT09TVF9JTkNMVURFUzoKKwkJaWYgc2VsZi5fX2Jvb3N0X2dldF92ZXJzaW9uX2ZpbGUoZCk6CisJCQlyZXR1cm4gZAorCWlmIGluY2x1ZGVzOgorCQlzZWxmLmVuZF9tc2coJ2hlYWRlcnMgbm90IGZvdW5kIGluICVzJyAlIGluY2x1ZGVzLCAnWUVMTE9XJykKKwkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwllbHNlOgorCQlzZWxmLmVuZF9tc2coJ2hlYWRlcnMgbm90IGZvdW5kLCBwbGVhc2UgcHJvdmlkZSBhIC0tYm9vc3QtaW5jbHVkZXMgYXJndW1lbnQgKHNlZSBoZWxwKScsICdZRUxMT1cnKQorCQlzZWxmLmZhdGFsKCdUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQnKQorCisKK0Bjb25mCitkZWYgYm9vc3RfZ2V0X3Rvb2xzZXQoc2VsZiwgY2MpOgorCXRvb2xzZXQgPSBjYworCWlmIG5vdCBjYzoKKwkJYnVpbGRfcGxhdGZvcm0gPSBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKQorCQlpZiBidWlsZF9wbGF0Zm9ybSBpbiBCT09TVF9UT09MU0VUUzoKKwkJCWNjID0gYnVpbGRfcGxhdGZvcm0KKwkJZWxzZToKKwkJCWNjID0gc2VsZi5lbnYuQ1hYX05BTUUKKwlpZiBjYyBpbiBCT09TVF9UT09MU0VUUzoKKwkJdG9vbHNldCA9IEJPT1NUX1RPT0xTRVRTW2NjXQorCXJldHVybiBpc2luc3RhbmNlKHRvb2xzZXQsIHN0cikgYW5kIHRvb2xzZXQgb3IgdG9vbHNldChzZWxmLmVudikKKworCitAY29uZgorZGVmIF9fYm9vc3RfZ2V0X2xpYnNfcGF0aChzZWxmLCAqaywgKiprdyk6CisJJycnIHJldHVybiB0aGUgbGliIHBhdGggYW5kIGFsbCB0aGUgZmlsZXMgaW4gaXQgJycnCisJaWYgJ2ZpbGVzJyBpbiBrdzoKKwkJcmV0dXJuIHNlbGYucm9vdC5maW5kX2RpcignLicpLCBVdGlscy50b19saXN0KGt3WydmaWxlcyddKQorCWxpYnMgPSBrIGFuZCBrWzBdIG9yIGt3LmdldCgnbGlicycsIE5vbmUpCisJaWYgbGliczoKKwkJcGF0aCA9IHNlbGYucm9vdC5maW5kX2RpcihsaWJzKQorCQlmaWxlcyA9IHBhdGguYW50X2dsb2IoJypib29zdF8qJykKKwlpZiBub3QgbGlicyBvciBub3QgZmlsZXM6CisJCWZvciBkIGluIHNlbGYuZW52aXJvbi5nZXQoJ0xJQicsICcnKS5zcGxpdCgnOycpICsgQk9PU1RfTElCUzoKKwkJCWlmIG5vdCBkOgorCQkJCWNvbnRpbnVlCisJCQlwYXRoID0gc2VsZi5yb290LmZpbmRfZGlyKGQpCisJCQlpZiBwYXRoOgorCQkJCWZpbGVzID0gcGF0aC5hbnRfZ2xvYignKmJvb3N0XyonKQorCQkJCWlmIGZpbGVzOgorCQkJCQlicmVhaworCQkJcGF0aCA9IHNlbGYucm9vdC5maW5kX2RpcihkICsgJzY0JykKKwkJCWlmIHBhdGg6CisJCQkJZmlsZXMgPSBwYXRoLmFudF9nbG9iKCcqYm9vc3RfKicpCisJCQkJaWYgZmlsZXM6CisJCQkJCWJyZWFrCisJaWYgbm90IHBhdGg6CisJCWlmIGxpYnM6CisJCQlzZWxmLmVuZF9tc2coJ2xpYnMgbm90IGZvdW5kIGluICVzJyAlIGxpYnMsICdZRUxMT1cnKQorCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwkJZWxzZToKKwkJCXNlbGYuZW5kX21zZygnbGlicyBub3QgZm91bmQsIHBsZWFzZSBwcm92aWRlIGEgLS1ib29zdC1saWJzIGFyZ3VtZW50IChzZWUgaGVscCknLCAnWUVMTE9XJykKKwkJCXNlbGYuZmF0YWwoJ1RoZSBjb25maWd1cmF0aW9uIGZhaWxlZCcpCisKKwlzZWxmLnRvX2xvZygnRm91bmQgdGhlIGJvb3N0IHBhdGggaW4gJXIgd2l0aCB0aGUgbGlicmFyaWVzOicgJSBwYXRoKQorCWZvciB4IGluIGZpbGVzOgorCQlzZWxmLnRvX2xvZygnICAgICVyJyAlIHgpCisJcmV0dXJuIHBhdGgsIGZpbGVzCisKK0Bjb25mCitkZWYgYm9vc3RfZ2V0X2xpYnMoc2VsZiwgKmssICoqa3cpOgorCScnJworCXJldHVybiB0aGUgbGliIHBhdGggYW5kIHRoZSByZXF1aXJlZCBsaWJzCisJYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzCisJJycnCisJcGF0aCwgZmlsZXMgPSBzZWxmLl9fYm9vc3RfZ2V0X2xpYnNfcGF0aCgqKmt3KQorCWZpbGVzID0gc29ydGVkKGZpbGVzLCBrZXk9bGFtYmRhIGY6IChsZW4oZi5uYW1lKSwgZi5uYW1lKSwgcmV2ZXJzZT1UcnVlKQorCXRvb2xzZXQgPSBzZWxmLmJvb3N0X2dldF90b29sc2V0KGt3LmdldCgndG9vbHNldCcsICcnKSkKKwl0b29sc2V0X3BhdCA9ICcoLSVzWzAtOV17MCwzfSknICUgdG9vbHNldAorCXZlcnNpb24gPSAnLSVzJyAlIHNlbGYuZW52LkJPT1NUX1ZFUlNJT04KKworCWRlZiBmaW5kX2xpYihyZV9saWIsIGZpbGVzKToKKwkJZm9yIGZpbGUgaW4gZmlsZXM6CisJCQlpZiByZV9saWIuc2VhcmNoKGZpbGUubmFtZSk6CisJCQkJc2VsZi50b19sb2coJ0ZvdW5kIGJvb3N0IGxpYiAlcycgJSBmaWxlKQorCQkJCXJldHVybiBmaWxlCisJCXJldHVybiBOb25lCisKKwlkZWYgZm9ybWF0X2xpYl9uYW1lKG5hbWUpOgorCQlpZiBuYW1lLnN0YXJ0c3dpdGgoJ2xpYicpIGFuZCBzZWxmLmVudi5DQ19OQU1FICE9ICdtc3ZjJzoKKwkJCW5hbWUgPSBuYW1lWzM6XQorCQlyZXR1cm4gbmFtZVs6bmFtZS5yZmluZCgnLicpXQorCisJZGVmIG1hdGNoX2xpYnMobGliX25hbWVzLCBpc19zdGF0aWMpOgorCQlsaWJzID0gW10KKwkJbGliX25hbWVzID0gVXRpbHMudG9fbGlzdChsaWJfbmFtZXMpCisJCWlmIG5vdCBsaWJfbmFtZXM6CisJCQlyZXR1cm4gbGlicworCQl0ID0gW10KKwkJaWYga3cuZ2V0KCdtdCcsIEZhbHNlKToKKwkJCXQuYXBwZW5kKCctbXQnKQorCQlpZiBrdy5nZXQoJ2FiaScsIE5vbmUpOgorCQkJdC5hcHBlbmQoJyVzJXMnICUgKGlzX3N0YXRpYyBhbmQgJy1zJyBvciAnLScsIGt3WydhYmknXSkpCisJCWVsaWYgaXNfc3RhdGljOgorCQkJdC5hcHBlbmQoJy1zJykKKwkJdGFnc19wYXQgPSB0IGFuZCAnJy5qb2luKHQpIG9yICcnCisJCWV4dCA9IGlzX3N0YXRpYyBhbmQgc2VsZi5lbnYuY3h4c3RsaWJfUEFUVEVSTiBvciBzZWxmLmVudi5jeHhzaGxpYl9QQVRURVJOCisJCWV4dCA9IGV4dC5wYXJ0aXRpb24oJyVzJylbMl0gIyByZW1vdmUgJyVzJyBvciAnbGliJXMnIGZyb20gUEFUVEVSTgorCisJCWZvciBsaWIgaW4gbGliX25hbWVzOgorCQkJaWYgbGliID09ICdweXRob24nOgorCQkJCSMgZm9yIGluc3RhbmNlLCB3aXRoIHB5dGhvbj0nMjcnLAorCQkJCSMgYWNjZXB0cyAnLXB5MjcnLCAnLXB5MicsICcyNycgYW5kICcyJworCQkJCSMgYnV0IHdpbGwgcmVqZWN0ICctcHkzJywgJy1weTI2JywgJzI2JyBhbmQgJzMnCisJCQkJdGFncyA9ICcoezB9KT8oKC1weXsyfSl8KC1weXsxfSg/PVteMC05XSkpfCh7Mn0pfCh7MX0oPz1bXjAtOV0pKXwoPz1bXjAtOV0pKD8hLXB5KSknLmZvcm1hdCh0YWdzX3BhdCwga3dbJ3B5dGhvbiddWzBdLCBrd1sncHl0aG9uJ10pCisJCQllbHNlOgorCQkJCXRhZ3MgPSB0YWdzX3BhdAorCQkJIyBUcnlpbmcgbGlicmFyaWVzLCBmcm9tIG1vc3Qgc3RyaWN0IG1hdGNoIHRvIGxlYXN0IG9uZQorCQkJZm9yIHBhdHRlcm4gaW4gWydib29zdF8lcyVzJXMlcyVzJCcgJSAobGliLCB0b29sc2V0X3BhdCwgdGFncywgdmVyc2lvbiwgZXh0KSwKKwkJCQkJCQknYm9vc3RfJXMlcyVzJXMkJyAlIChsaWIsIHRhZ3MsIHZlcnNpb24sIGV4dCksCisJCQkJCQkJIyBHaXZlIHVwIHRyeWluZyB0byBmaW5kIHRoZSByaWdodCB2ZXJzaW9uCisJCQkJCQkJJ2Jvb3N0XyVzJXMlcyVzJCcgJSAobGliLCB0b29sc2V0X3BhdCwgdGFncywgZXh0KSwKKwkJCQkJCQknYm9vc3RfJXMlcyVzJCcgJSAobGliLCB0YWdzLCBleHQpLAorCQkJCQkJCSdib29zdF8lcyVzJCcgJSAobGliLCBleHQpLAorCQkJCQkJCSdib29zdF8lcycgJSBsaWJdOgorCQkJCXNlbGYudG9fbG9nKCdUcnlpbmcgcGF0dGVybiAlcycgJSBwYXR0ZXJuKQorCQkJCWZpbGUgPSBmaW5kX2xpYihyZS5jb21waWxlKHBhdHRlcm4pLCBmaWxlcykKKwkJCQlpZiBmaWxlOgorCQkJCQlsaWJzLmFwcGVuZChmb3JtYXRfbGliX25hbWUoZmlsZS5uYW1lKSkKKwkJCQkJYnJlYWsKKwkJCWVsc2U6CisJCQkJc2VsZi5lbmRfbXNnKCdsaWIgJXMgbm90IGZvdW5kIGluICVzJyAlIChsaWIsIHBhdGguYWJzcGF0aCgpKSwgJ1lFTExPVycpCisJCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwkJcmV0dXJuIGxpYnMKKworCXJldHVybiAgcGF0aC5hYnNwYXRoKCksIG1hdGNoX2xpYnMoa3cuZ2V0KCdsaWInLCBOb25lKSwgRmFsc2UpLCBtYXRjaF9saWJzKGt3LmdldCgnc3RsaWInLCBOb25lKSwgVHJ1ZSkKKworQGNvbmYKK2RlZiBfY2hlY2tfcHRocmVhZF9mbGFnKHNlbGYsICprLCAqKmt3KToKKwknJycKKwlDb21wdXRlcyB3aGljaCBmbGFncyBzaG91bGQgYmUgYWRkZWQgdG8gQ1hYRkxBR1MgYW5kIExJTktGTEFHUyB0byBjb21waWxlIGluIG11bHRpLXRocmVhZGluZyBtb2RlCisKKwlZZXMsIHdlICpuZWVkKiB0byBwdXQgdGhlIC1wdGhyZWFkIHRoaW5nIGluIENQUEZMQUdTIGJlY2F1c2Ugd2l0aCBHQ0MzLAorCWJvb3N0L3RocmVhZC5ocHAgd2lsbCB0cmlnZ2VyIGEgI2Vycm9yIGlmIC1wdGhyZWFkIGlzbid0IHVzZWQ6CisJICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorCSAgaXMgbm90IHR1cm5lZCBvbi4gUGxlYXNlIHNldCB0aGUgY29ycmVjdCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IKKwkgIHRocmVhZGluZzogLXB0aHJlYWQgKExpbnV4KSwgLXB0aHJlYWRzIChTb2xhcmlzKSBvciAtbXRocmVhZHMgKE1pbmd3MzIpIgorCisJQmFzZWQgb24gX0JPT1NUX1BUSFJFQURfRkxBRygpOiBodHRwczovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvYmxvYi9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisgICAgJycnCisKKwl2YXIgPSBrdy5nZXQoJ3VzZWxpYl9zdG9yZScsICdCT09TVCcpCisKKwlzZWxmLnN0YXJ0X21zZygnQ2hlY2tpbmcgdGhlIGZsYWdzIG5lZWRlZCB0byB1c2UgcHRocmVhZHMnKQorCisJIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorCSMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisJIyAobm9uZSk6IGluIGNhc2UgdGhyZWFkcyBhcmUgaW4gbGliYzsgc2hvdWxkIGJlIHRyaWVkIGJlZm9yZSAtS3RocmVhZCBhbmQKKwkjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisJIyAtbHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorCSMgLUt0aHJlYWQ6IFNlcXVlbnQgKHRocmVhZHMgaW4gbGliYywgYnV0IC1LdGhyZWFkIG5lZWRlZCBmb3IgcHRocmVhZC5oKQorCSMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKwkjIC1sbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisJIyAtcHRocmVhZDogR05VIExpbnV4L0dDQyAoa2VybmVsIHRocmVhZHMpLCBCU0QvR0NDICh1c2VybGFuZCB0aHJlYWRzKQorCSMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworCSMgLW10aHJlYWRzOiBNaW5HVzMyL0dDQywgTHlueC9HQ0MKKwkjIC1tdDogU3VuIFdvcmtzaG9wIEMgKG1heSBvbmx5IGxpbmsgU3VuT1MgdGhyZWFkcyBbLWx0aHJlYWRdLCBidXQgaXQKKwkjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworCSMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorCSMgICAgICAuLi4gLW10IGlzIGFsc28gdGhlIHB0aHJlYWRzIGZsYWcgZm9yIEhQL2FDQworCSMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKwkjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKwlpZiBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAnc3Vub3MnOgorCQkjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorCQkjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisJCSMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkcy8tbXQvCisJCSMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorCQkjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKwkJIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKwkJIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCQlib29zdF9wdGhyZWFkX2ZsYWdzID0gWyctcHRocmVhZHMnLCAnLWxwdGhyZWFkJywgJy1tdCcsICctcHRocmVhZCddCisJZWxzZToKKwkJYm9vc3RfcHRocmVhZF9mbGFncyA9IFsnJywgJy1scHRocmVhZHMnLCAnLUt0aHJlYWQnLCAnLWt0aHJlYWQnLCAnLWxsdGhyZWFkJywgJy1wdGhyZWFkJywKKwkJCQkJCQkgICAnLXB0aHJlYWRzJywgJy1tdGhyZWFkcycsICctbHB0aHJlYWQnLCAnLS10aHJlYWQtc2FmZScsICctbXQnXQorCisJZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiBib29zdF9wdGhyZWFkX2ZsYWdzOgorCQl0cnk6CisJCQlzZWxmLmVudi5zdGFzaCgpCisJCQlzZWxmLmVudlsnQ1hYRkxBR1NfJXMnICUgdmFyXSArPSBbYm9vc3RfcHRocmVhZF9mbGFnXQorCQkJc2VsZi5lbnZbJ0xJTktGTEFHU18lcycgJSB2YXJdICs9IFtib29zdF9wdGhyZWFkX2ZsYWddCisJCQlzZWxmLmNoZWNrX2N4eChjb2RlPVBUSFJFQURfQ09ERSwgbXNnPU5vbmUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UsIHF1aWV0PVRydWUpCisJCQlzZWxmLmVuZF9tc2coYm9vc3RfcHRocmVhZF9mbGFnKQorCQkJcmV0dXJuCisJCWV4Y2VwdCBzZWxmLmVycm9ycy5Db25maWd1cmF0aW9uRXJyb3I6CisJCQlzZWxmLmVudi5yZXZlcnQoKQorCXNlbGYuZW5kX21zZygnbm9uZScpCisKK0Bjb25mCitkZWYgY2hlY2tfYm9vc3Qoc2VsZiwgKmssICoqa3cpOgorCSIiIgorCUluaXRpYWxpemUgYm9vc3QgbGlicmFyaWVzIHRvIGJlIHVzZWQuCisKKwlLZXl3b3JkczogeW91IGNhbiBwYXNzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgd2l0aCB0aGUgY29tbWFuZCBsaW5lICh3aXRob3V0ICItLWJvb3N0LSIpLgorCU5vdGUgdGhhdCB0aGUgY29tbWFuZCBsaW5lIGhhcyB0aGUgcHJpb3JpdHksIGFuZCBzaG91bGQgcHJlZmVyYWJseSBiZSB1c2VkLgorCSIiIgorCWlmIG5vdCBzZWxmLmVudlsnQ1hYJ106CisJCXNlbGYuZmF0YWwoJ2xvYWQgYSBjKysgY29tcGlsZXIgZmlyc3QsIGNvbmYubG9hZCgiY29tcGlsZXJfY3h4IiknKQorCisJcGFyYW1zID0geworCQknbGliJzogayBhbmQga1swXSBvciBrdy5nZXQoJ2xpYicsIE5vbmUpLAorCQknc3RsaWInOiBrdy5nZXQoJ3N0bGliJywgTm9uZSkKKwl9CisJZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5vcHRpb25zLl9fZGljdF9fLml0ZW1zKCk6CisJCWlmIG5vdCBrZXkuc3RhcnRzd2l0aCgnYm9vc3RfJyk6CisJCQljb250aW51ZQorCQlrZXkgPSBrZXlbbGVuKCdib29zdF8nKTpdCisJCXBhcmFtc1trZXldID0gdmFsdWUgYW5kIHZhbHVlIG9yIGt3LmdldChrZXksICcnKQorCisJdmFyID0ga3cuZ2V0KCd1c2VsaWJfc3RvcmUnLCAnQk9PU1QnKQorCisJaWYgbm90IHNlbGYuZW52LkRPTkVfRklORF9CT09TVF9DT01NT046CisJCXNlbGYuZmluZF9wcm9ncmFtKCdkcGtnLWFyY2hpdGVjdHVyZScsIHZhcj0nRFBLR19BUkNISVRFQ1RVUkUnLCBtYW5kYXRvcnk9RmFsc2UpCisJCWlmIHNlbGYuZW52LkRQS0dfQVJDSElURUNUVVJFOgorCQkJZGViX2hvc3RfbXVsdGlhcmNoID0gc2VsZi5jbWRfYW5kX2xvZyhbc2VsZi5lbnYuRFBLR19BUkNISVRFQ1RVUkVbMF0sICctcURFQl9IT1NUX01VTFRJQVJDSCddKQorCQkJQk9PU1RfTElCUy5pbnNlcnQoMCwgJy91c3IvbGliLyVzJyAlIGRlYl9ob3N0X211bHRpYXJjaC5zdHJpcCgpKQorCisJCXNlbGYuc3RhcnRfbXNnKCdDaGVja2luZyBib29zdCBpbmNsdWRlcycpCisJCXNlbGYuZW52WydJTkNMVURFU18lcycgJSB2YXJdID0gaW5jID0gc2VsZi5ib29zdF9nZXRfaW5jbHVkZXMoKipwYXJhbXMpCisJCXZlcnNpb25zID0gc2VsZi5ib29zdF9nZXRfdmVyc2lvbihpbmMpCisJCXNlbGYuZW52LkJPT1NUX1ZFUlNJT04gPSB2ZXJzaW9uc1swXQorCQlzZWxmLmVudi5CT09TVF9WRVJTSU9OX05VTUJFUiA9IGludCh2ZXJzaW9uc1sxXSkKKwkJc2VsZi5lbmRfbXNnKCclZC4lZC4lZCcgJSAoaW50KHZlcnNpb25zWzFdKSAvIDEwMDAwMCwKKwkJCQkJCQkJICAgaW50KHZlcnNpb25zWzFdKSAvIDEwMCAlIDEwMDAsCisJCQkJCQkJCSAgIGludCh2ZXJzaW9uc1sxXSkgJSAxMDApKQorCQlpZiBMb2dzLnZlcmJvc2U6CisJCQlMb2dzLnBwcmludCgnQ1lBTicsICcJcGF0aCA6ICVzJyAlIHNlbGYuZW52WydJTkNMVURFU18lcycgJSB2YXJdKQorCisJCXNlbGYuZW52LkRPTkVfRklORF9CT09TVF9DT01NT04gPSBUcnVlCisKKwlpZiBub3QgcGFyYW1zWydsaWInXSBhbmQgbm90IHBhcmFtc1snc3RsaWInXToKKwkJcmV0dXJuCisJaWYgJ3N0YXRpYycgaW4ga3cgb3IgJ3N0YXRpYycgaW4gcGFyYW1zOgorCQlMb2dzLndhcm4oJ2Jvb3N0OiBzdGF0aWMgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdGxpYiBpbnN0ZWFkLicpCisJc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIGJvb3N0IGxpYnMnKQorCXBhdGgsIGxpYnMsIHN0bGlicyA9IHNlbGYuYm9vc3RfZ2V0X2xpYnMoKipwYXJhbXMpCisJc2VsZi5lbnZbJ0xJQlBBVEhfJXMnICUgdmFyXSA9IFtwYXRoXQorCXNlbGYuZW52WydTVExJQlBBVEhfJXMnICUgdmFyXSA9IFtwYXRoXQorCXNlbGYuZW52WydMSUJfJXMnICUgdmFyXSA9IGxpYnMKKwlzZWxmLmVudlsnU1RMSUJfJXMnICUgdmFyXSA9IHN0bGlicworCXNlbGYuZW5kX21zZygnICcuam9pbihsaWJzICsgc3RsaWJzKSkKKwlpZiBMb2dzLnZlcmJvc2U6CisJCUxvZ3MucHByaW50KCdDWUFOJywgJwlwYXRoIDogJXMnICUgcGF0aCkKKwkJTG9ncy5wcHJpbnQoJ0NZQU4nLCAnCXNoYXJlZCBsaWJzIDogJXMnICUgbGlicykKKwkJTG9ncy5wcHJpbnQoJ0NZQU4nLCAnCXN0YXRpYyBsaWJzIDogJXMnICUgc3RsaWJzKQorCisJZGVmIGhhc19zaGxpYihsaWIpOgorCQlyZXR1cm4gcGFyYW1zWydsaWInXSBhbmQgbGliIGluIHBhcmFtc1snbGliJ10KKwlkZWYgaGFzX3N0bGliKGxpYik6CisJCXJldHVybiBwYXJhbXNbJ3N0bGliJ10gYW5kIGxpYiBpbiBwYXJhbXNbJ3N0bGliJ10KKwlkZWYgaGFzX2xpYihsaWIpOgorCQlyZXR1cm4gaGFzX3NobGliKGxpYikgb3IgaGFzX3N0bGliKGxpYikKKwlpZiBoYXNfbGliKCd0aHJlYWQnKToKKwkJIyBub3QgaW5zaWRlIHRyeV9saW5rIHRvIG1ha2UgY2hlY2sgdmlzaWJsZSBpbiB0aGUgb3V0cHV0CisJCXNlbGYuX2NoZWNrX3B0aHJlYWRfZmxhZyhrLCBrdykKKworCWRlZiB0cnlfbGluaygpOgorCQlpZiBoYXNfbGliKCdzeXN0ZW0nKToKKwkJCXNlbGYuY2hlY2tfY3h4KGZyYWdtZW50PUJPT1NUX0VSUk9SX0NPREUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UpCisJCWlmIGhhc19saWIoJ3RocmVhZCcpOgorCQkJc2VsZi5jaGVja19jeHgoZnJhZ21lbnQ9Qk9PU1RfVEhSRUFEX0NPREUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UpCisJCWlmIGhhc19saWIoJ2xvZycpIG9yIGhhc19saWIoJ2xvZ19zZXR1cCcpOgorCQkJaWYgbm90IGhhc19saWIoJ3RocmVhZCcpOgorCQkJCXNlbGYuZW52WydERUZJTkVTXyVzJyAlIHZhcl0gKz0gWydCT09TVF9MT0dfTk9fVEhSRUFEUyddCisJCQlpZiBoYXNfc2hsaWIoJ2xvZycpIG9yIGhhc19zaGxpYignbG9nX3NldHVwJyk6CisJCQkJc2VsZi5lbnZbJ0RFRklORVNfJXMnICUgdmFyXSArPSBbJ0JPT1NUX0xPR19EWU5fTElOSyddCisJCQlpZiBoYXNfbGliKCdsb2dfc2V0dXAnKToKKwkJCQlzZWxmLmNoZWNrX2N4eChmcmFnbWVudD1CT09TVF9MT0dfU0VUVVBfQ09ERSwgdXNlPXZhciwgZXhlY3V0ZT1GYWxzZSkKKwkJCWVsc2U6CisJCQkJc2VsZi5jaGVja19jeHgoZnJhZ21lbnQ9Qk9PU1RfTE9HX0NPREUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UpCisKKwlpZiBwYXJhbXMuZ2V0KCdsaW5rYWdlX2F1dG9kZXRlY3QnLCBGYWxzZSk6CisJCXNlbGYuc3RhcnRfbXNnKCdBdHRlbXB0aW5nIHRvIGRldGVjdCBib29zdCBsaW5rYWdlIGZsYWdzJykKKwkJdG9vbHNldCA9IHNlbGYuYm9vc3RfZ2V0X3Rvb2xzZXQoa3cuZ2V0KCd0b29sc2V0JywgJycpKQorCQlpZiB0b29sc2V0IGluICgndmMnLCk6CisJCQkjIGRpc2FibGUgYXV0by1saW5raW5nIGZlYXR1cmUsIGNhdXNpbmcgZXJyb3IgTE5LMTE4MQorCQkJIyBiZWNhdXNlIHRoZSBjb2RlIHdhbnRzIHRvIGJlIGxpbmtlZCBhZ2FpbnN0CisJCQlzZWxmLmVudlsnREVGSU5FU18lcycgJSB2YXJdICs9IFsnQk9PU1RfQUxMX05PX0xJQiddCisKKwkJCSMgaWYgbm8gZGxscyBhcmUgcHJlc2VudCwgd2UgZ3Vlc3MgdGhlIC5saWIgZmlsZXMgYXJlIG5vdCBzdHVicworCQkJaGFzX2RsbHMgPSBGYWxzZQorCQkJZm9yIHggaW4gVXRpbHMubGlzdGRpcihwYXRoKToKKwkJCQlpZiB4LmVuZHN3aXRoKHNlbGYuZW52LmN4eHNobGliX1BBVFRFUk4gJSAnJyk6CisJCQkJCWhhc19kbGxzID0gVHJ1ZQorCQkJCQlicmVhaworCQkJaWYgbm90IGhhc19kbGxzOgorCQkJCXNlbGYuZW52WydTVExJQlBBVEhfJXMnICUgdmFyXSA9IFtwYXRoXQorCQkJCXNlbGYuZW52WydTVExJQl8lcycgJSB2YXJdID0gbGlicworCQkJCWRlbCBzZWxmLmVudlsnTElCXyVzJyAlIHZhcl0KKwkJCQlkZWwgc2VsZi5lbnZbJ0xJQlBBVEhfJXMnICUgdmFyXQorCisJCQkjIHdlIGF0dGVtcHQgdG8gcGxheSB3aXRoIHNvbWUga25vd24tdG8td29yayBDWFhGTEFHUyBjb21iaW5hdGlvbnMKKwkJCWZvciBjeHhmbGFncyBpbiAoWycvTUQnLCAnL0VIc2MnXSwgW10pOgorCQkJCXNlbGYuZW52LnN0YXNoKCkKKwkJCQlzZWxmLmVudlsnQ1hYRkxBR1NfJXMnICUgdmFyXSArPSBjeHhmbGFncworCQkJCXRyeToKKwkJCQkJdHJ5X2xpbmsoKQorCQkJCQlzZWxmLmVuZF9tc2coJ29rOiB3aW5uaW5nIGN4eGZsYWdzIGNvbWJpbmF0aW9uOiAlcycgJSAoc2VsZi5lbnZbJ0NYWEZMQUdTXyVzJyAlIHZhcl0pKQorCQkJCQlleGMgPSBOb25lCisJCQkJCWJyZWFrCisJCQkJZXhjZXB0IEVycm9ycy5Db25maWd1cmF0aW9uRXJyb3IgYXMgZToKKwkJCQkJc2VsZi5lbnYucmV2ZXJ0KCkKKwkJCQkJZXhjID0gZQorCisJCQlpZiBleGMgaXMgbm90IE5vbmU6CisJCQkJc2VsZi5lbmRfbXNnKCdDb3VsZCBub3QgYXV0by1kZXRlY3QgYm9vc3QgbGlua2luZyBmbGFncyBjb21iaW5hdGlvbiwgeW91IG1heSByZXBvcnQgaXQgdG8gYm9vc3QucHkgYXV0aG9yJywgZXg9ZXhjKQorCQkJCXNlbGYuZmF0YWwoJ1RoZSBjb25maWd1cmF0aW9uIGZhaWxlZCcpCisJCWVsc2U6CisJCQlzZWxmLmVuZF9tc2coJ0Jvb3N0IGxpbmthZ2UgZmxhZ3MgYXV0by1kZXRlY3Rpb24gbm90IGltcGxlbWVudGVkIChuZWVkZWQgPykgZm9yIHRoaXMgdG9vbGNoYWluJykKKwkJCXNlbGYuZmF0YWwoJ1RoZSBjb25maWd1cmF0aW9uIGZhaWxlZCcpCisJZWxzZToKKwkJc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIGZvciBib29zdCBsaW5rYWdlJykKKwkJdHJ5OgorCQkJdHJ5X2xpbmsoKQorCQlleGNlcHQgRXJyb3JzLkNvbmZpZ3VyYXRpb25FcnJvciBhcyBlOgorCQkJc2VsZi5lbmRfbXNnKCdDb3VsZCBub3QgbGluayBhZ2FpbnN0IGJvb3N0IGxpYnJhcmllcyB1c2luZyBzdXBwbGllZCBvcHRpb25zJywgJ1lFTExPVycpCisJCQlzZWxmLmZhdGFsKCdUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQnKQorCQlzZWxmLmVuZF9tc2coJ29rJykKKworCitAZmVhdHVyZSgnY3h4JykKK0BhZnRlcl9tZXRob2QoJ2FwcGx5X2xpbmsnKQorZGVmIGluc3RhbGxfYm9vc3Qoc2VsZik6CisJaWYgaW5zdGFsbF9ib29zdC5kb25lIG9yIG5vdCBVdGlscy5pc193aW4zMiBvciBub3Qgc2VsZi5ibGQuY21kLnN0YXJ0c3dpdGgoJ2luc3RhbGwnKToKKwkJcmV0dXJuCisJaW5zdGFsbF9ib29zdC5kb25lID0gVHJ1ZQorCWluc3RfdG8gPSBnZXRhdHRyKHNlbGYsICdpbnN0YWxsX3BhdGgnLCAnJHtCSU5ESVJ9JykKKwlmb3IgbGliIGluIHNlbGYuZW52LkxJQl9CT09TVDoKKwkJdHJ5OgorCQkJZmlsZSA9IHNlbGYuYmxkLmZpbmRfZmlsZShzZWxmLmVudi5jeHhzaGxpYl9QQVRURVJOICUgbGliLCBzZWxmLmVudi5MSUJQQVRIX0JPT1NUKQorCQkJc2VsZi5ibGQuaW5zdGFsbF9maWxlcyhpbnN0X3RvLCBzZWxmLmJsZC5yb290LmZpbmRfbm9kZShmaWxlKSkKKwkJZXhjZXB0OgorCQkJY29udGludWUKK2luc3RhbGxfYm9vc3QuZG9uZSA9IEZhbHNlCmRpZmYgLS1naXQgYS8ud2FmLXRvb2xzL2NvdmVyYWdlLnB5IGIvLndhZi10b29scy9jb3ZlcmFnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU4MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvLndhZi10b29scy9jb3ZlcmFnZS5weQpAQCAtMCwwICsxLDIyIEBACisjIC0qLSBNb2RlOiBweXRob247IHB5LWluZGVudC1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgY29kaW5nOiB1dGYtODsgLSotCisKK2Zyb20gd2FmbGliIGltcG9ydCBUYXNrR2VuCisKK2RlZiBvcHRpb25zKG9wdCk6CisgICAgb3B0LmFkZF9vcHRpb24oJy0td2l0aC1jb3ZlcmFnZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgaGVscD0nQWRkIGNvbXBpbGVyIGZsYWdzIHRvIGVuYWJsZSBjb2RlIGNvdmVyYWdlIGluZm9ybWF0aW9uJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBpZiBjb25mLm9wdGlvbnMud2l0aF9jb3ZlcmFnZToKKyAgICAgICAgaWYgbm90IGNvbmYub3B0aW9ucy5kZWJ1ZzoKKyAgICAgICAgICAgIGNvbmYuZmF0YWwoJ0NvZGUgY292ZXJhZ2UgZmxhZ3MgcmVxdWlyZSBkZWJ1ZyBtb2RlIGNvbXBpbGF0aW9uIChhZGQgLS1kZWJ1ZyknKQorICAgICAgICBjb25mLmNoZWNrX2N4eChjeHhmbGFncz1bJy1mcHJvZmlsZS1hcmNzJywgJy1mdGVzdC1jb3ZlcmFnZScsICctZlBJQyddLAorICAgICAgICAgICAgICAgICAgICAgICBsaW5rZmxhZ3M9WyctZnByb2ZpbGUtYXJjcyddLCB1c2VsaWJfc3RvcmU9J0dDT1YnLCBtYW5kYXRvcnk9VHJ1ZSkKKworQFRhc2tHZW4uZmVhdHVyZSgnY3h4JywnY2MnKQorQFRhc2tHZW4uYWZ0ZXIoJ3Byb2Nlc3Nfc291cmNlJykKK2RlZiBhZGRfY292ZXJhZ2Uoc2VsZik6CisgICAgaWYgZ2V0YXR0cihzZWxmLCAndXNlJywgJycpOgorICAgICAgICBzZWxmLnVzZSArPSAnIEdDT1YnCisgICAgZWxzZToKKyAgICAgICAgc2VsZi51c2UgPSAnR0NPVicKZGlmZiAtLWdpdCBhLy53YWYtdG9vbHMvZGVmYXVsdC1jb21waWxlci1mbGFncy5weSBiLy53YWYtdG9vbHMvZGVmYXVsdC1jb21waWxlci1mbGFncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA0NWMzCi0tLSAvZGV2L251bGwKKysrIGIvLndhZi10b29scy9kZWZhdWx0LWNvbXBpbGVyLWZsYWdzLnB5CkBAIC0wLDAgKzEsMjE2IEBACisjIC0qLSBNb2RlOiBweXRob247IHB5LWluZGVudC1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgY29kaW5nOiB1dGYtODsgLSotCisKK2Zyb20gd2FmbGliIGltcG9ydCBDb25maWd1cmUsIExvZ3MsIFV0aWxzCisKK2RlZiBvcHRpb25zKG9wdCk6CisgICAgb3B0LmFkZF9vcHRpb24oJy0tZGVidWcnLCAnLS13aXRoLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICBoZWxwPSdDb21waWxlIGluIGRlYnVnZ2luZyBtb2RlIHdpdGggbWluaW1hbCBvcHRpbWl6YXRpb25zICgtTzAgb3IgLU9nKScpCisKK2RlZiBjb25maWd1cmUoY29uZik6CisgICAgY29uZi5zdGFydF9tc2coJ0NoZWNraW5nIEMrKyBjb21waWxlciB2ZXJzaW9uJykKKworICAgIGN4eCA9IGNvbmYuZW52LkNYWF9OQU1FICMgZ2VuZXJpYyBuYW1lIG9mIHRoZSBjb21waWxlcgorICAgIGNjdmVyID0gdHVwbGUoaW50KGkpIGZvciBpIGluIGNvbmYuZW52LkNDX1ZFUlNJT04pCisgICAgY2N2ZXJzdHIgPSAnLicuam9pbihjb25mLmVudi5DQ19WRVJTSU9OKQorICAgIGVycm1zZyA9ICcnCisgICAgd2Fybm1zZyA9ICcnCisgICAgaWYgY3h4ID09ICdnY2MnOgorICAgICAgICBpZiBjY3ZlciA8ICg1LCAzLCAwKToKKyAgICAgICAgICAgIGVycm1zZyA9ICgnVGhlIHZlcnNpb24gb2YgZ2NjIHlvdSBhcmUgdXNpbmcgaXMgdG9vIG9sZC5cbicKKyAgICAgICAgICAgICAgICAgICAgICAnVGhlIG1pbmltdW0gc3VwcG9ydGVkIGdjYyB2ZXJzaW9uIGlzIDUuMy4wLicpCisgICAgICAgIGNvbmYuZmxhZ3MgPSBHY2NGbGFncygpCisgICAgZWxpZiBjeHggPT0gJ2NsYW5nJzoKKyAgICAgICAgaWYgY2N2ZXIgPCAoMywgNiwgMCk6CisgICAgICAgICAgICBlcnJtc2cgPSAoJ1RoZSB2ZXJzaW9uIG9mIGNsYW5nIHlvdSBhcmUgdXNpbmcgaXMgdG9vIG9sZC5cbicKKyAgICAgICAgICAgICAgICAgICAgICAnVGhlIG1pbmltdW0gc3VwcG9ydGVkIGNsYW5nIHZlcnNpb24gaXMgMy42LjAuJykKKyAgICAgICAgY29uZi5mbGFncyA9IENsYW5nRmxhZ3MoKQorICAgIGVsc2U6CisgICAgICAgIHdhcm5tc2cgPSAnTm90ZTogJXMgY29tcGlsZXIgaXMgdW5zdXBwb3J0ZWQnICUgY3h4CisgICAgICAgIGNvbmYuZmxhZ3MgPSBDb21waWxlckZsYWdzKCkKKworICAgIGlmIGVycm1zZzoKKyAgICAgICAgY29uZi5lbmRfbXNnKGNjdmVyc3RyLCBjb2xvcj0nUkVEJykKKyAgICAgICAgY29uZi5mYXRhbChlcnJtc2cpCisgICAgZWxpZiB3YXJubXNnOgorICAgICAgICBjb25mLmVuZF9tc2coY2N2ZXJzdHIsIGNvbG9yPSdZRUxMT1cnKQorICAgICAgICBMb2dzLndhcm4od2Fybm1zZykKKyAgICBlbHNlOgorICAgICAgICBjb25mLmVuZF9tc2coY2N2ZXJzdHIpCisKKyAgICBjb25mLmFyZUN1c3RvbUN4eGZsYWdzUHJlc2VudCA9IChsZW4oY29uZi5lbnYuQ1hYRkxBR1MpID4gMCkKKworICAgICMgR2VuZXJhbCBmbGFncyBhcmUgYWx3YXlzIGFwcGxpZWQgKGUuZy4sIHNlbGVjdGluZyBDKysgbGFuZ3VhZ2Ugc3RhbmRhcmQpCisgICAgZ2VuZXJhbEZsYWdzID0gY29uZi5mbGFncy5nZXRHZW5lcmFsRmxhZ3MoY29uZikKKyAgICBjb25mLmFkZF9zdXBwb3J0ZWRfY3h4ZmxhZ3MoZ2VuZXJhbEZsYWdzWydDWFhGTEFHUyddKQorICAgIGNvbmYuYWRkX3N1cHBvcnRlZF9saW5rZmxhZ3MoZ2VuZXJhbEZsYWdzWydMSU5LRkxBR1MnXSkKKyAgICBjb25mLmVudi5ERUZJTkVTICs9IGdlbmVyYWxGbGFnc1snREVGSU5FUyddCisKK0BDb25maWd1cmUuY29uZgorZGVmIGNoZWNrX2NvbXBpbGVyX2ZsYWdzKGNvbmYpOgorICAgICMgRGVidWcgb3Igb3B0aW1pemVkIENYWEZMQUdTIGFuZCBMSU5LRkxBR1MgYXJlIGFwcGxpZWQgb25seSBpZiB0aGUKKyAgICAjIGNvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qgc2V0LgorICAgICMgREVGSU5FUyBhcmUgYWx3YXlzIGFwcGxpZWQuCisgICAgaWYgY29uZi5vcHRpb25zLmRlYnVnOgorICAgICAgICBleHRyYUZsYWdzID0gY29uZi5mbGFncy5nZXREZWJ1Z0ZsYWdzKGNvbmYpCisgICAgICAgIGlmIGNvbmYuYXJlQ3VzdG9tQ3h4ZmxhZ3NQcmVzZW50OgorICAgICAgICAgICAgbWlzc2luZ0ZsYWdzID0gW3ggZm9yIHggaW4gZXh0cmFGbGFnc1snQ1hYRkxBR1MnXSBpZiB4IG5vdCBpbiBjb25mLmVudi5DWFhGTEFHU10KKyAgICAgICAgICAgIGlmIG1pc3NpbmdGbGFnczoKKyAgICAgICAgICAgICAgICBMb2dzLndhcm4oJ1NlbGVjdGVkIGRlYnVnIG1vZGUsIGJ1dCBDWFhGTEFHUyBpcyBzZXQgdG8gYSBjdXN0b20gdmFsdWUgIiVzIicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJSAnICcuam9pbihjb25mLmVudi5DWFhGTEFHUykpCisgICAgICAgICAgICAgICAgTG9ncy53YXJuKCdEZWZhdWx0IGZsYWdzICIlcyIgd2lsbCBub3QgYmUgdXNlZCcgJSAnICcuam9pbihtaXNzaW5nRmxhZ3MpKQorICAgIGVsc2U6CisgICAgICAgIGV4dHJhRmxhZ3MgPSBjb25mLmZsYWdzLmdldE9wdGltaXplZEZsYWdzKGNvbmYpCisKKyAgICBpZiBub3QgY29uZi5hcmVDdXN0b21DeHhmbGFnc1ByZXNlbnQ6CisgICAgICAgIGNvbmYuYWRkX3N1cHBvcnRlZF9jeHhmbGFncyhleHRyYUZsYWdzWydDWFhGTEFHUyddKQorICAgICAgICBjb25mLmFkZF9zdXBwb3J0ZWRfbGlua2ZsYWdzKGV4dHJhRmxhZ3NbJ0xJTktGTEFHUyddKQorCisgICAgY29uZi5lbnYuREVGSU5FUyArPSBleHRyYUZsYWdzWydERUZJTkVTJ10KKworQENvbmZpZ3VyZS5jb25mCitkZWYgYWRkX3N1cHBvcnRlZF9jeHhmbGFncyhzZWxmLCBjeHhmbGFncyk6CisgICAgIiIiCisgICAgQ2hlY2sgd2hpY2ggY3h4ZmxhZ3MgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlciBhbmQgYWRkIHRoZW0gdG8gZW52LkNYWEZMQUdTIHZhcmlhYmxlCisgICAgIiIiCisgICAgaWYgbGVuKGN4eGZsYWdzKSA9PSAwOgorICAgICAgICByZXR1cm4KKworICAgIHNlbGYuc3RhcnRfbXNnKCdDaGVja2luZyBzdXBwb3J0ZWQgQ1hYRkxBR1MnKQorCisgICAgc3VwcG9ydGVkRmxhZ3MgPSBbXQorICAgIGZvciBmbGFncyBpbiBjeHhmbGFnczoKKyAgICAgICAgZmxhZ3MgPSBVdGlscy50b19saXN0KGZsYWdzKQorICAgICAgICBpZiBzZWxmLmNoZWNrX2N4eChjeHhmbGFncz1bJy1XZXJyb3InXSArIGZsYWdzLCBtYW5kYXRvcnk9RmFsc2UpOgorICAgICAgICAgICAgc3VwcG9ydGVkRmxhZ3MgKz0gZmxhZ3MKKworICAgIHNlbGYuZW5kX21zZygnICcuam9pbihzdXBwb3J0ZWRGbGFncykpCisgICAgc2VsZi5lbnYucHJlcGVuZF92YWx1ZSgnQ1hYRkxBR1MnLCBzdXBwb3J0ZWRGbGFncykKKworQENvbmZpZ3VyZS5jb25mCitkZWYgYWRkX3N1cHBvcnRlZF9saW5rZmxhZ3Moc2VsZiwgbGlua2ZsYWdzKToKKyAgICAiIiIKKyAgICBDaGVjayB3aGljaCBsaW5rZmxhZ3MgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlciBhbmQgYWRkIHRoZW0gdG8gZW52LkxJTktGTEFHUyB2YXJpYWJsZQorICAgICIiIgorICAgIGlmIGxlbihsaW5rZmxhZ3MpID09IDA6CisgICAgICAgIHJldHVybgorCisgICAgc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIHN1cHBvcnRlZCBMSU5LRkxBR1MnKQorCisgICAgc3VwcG9ydGVkRmxhZ3MgPSBbXQorICAgIGZvciBmbGFncyBpbiBsaW5rZmxhZ3M6CisgICAgICAgIGZsYWdzID0gVXRpbHMudG9fbGlzdChmbGFncykKKyAgICAgICAgaWYgc2VsZi5jaGVja19jeHgobGlua2ZsYWdzPVsnLVdlcnJvciddICsgZmxhZ3MsIG1hbmRhdG9yeT1GYWxzZSk6CisgICAgICAgICAgICBzdXBwb3J0ZWRGbGFncyArPSBmbGFncworCisgICAgc2VsZi5lbmRfbXNnKCcgJy5qb2luKHN1cHBvcnRlZEZsYWdzKSkKKyAgICBzZWxmLmVudi5wcmVwZW5kX3ZhbHVlKCdMSU5LRkxBR1MnLCBzdXBwb3J0ZWRGbGFncykKKworCitjbGFzcyBDb21waWxlckZsYWdzKG9iamVjdCk6CisgICAgZGVmIGdldENvbXBpbGVyVmVyc2lvbihzZWxmLCBjb25mKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGludChpKSBmb3IgaSBpbiBjb25mLmVudi5DQ19WRVJTSU9OKQorCisgICAgZGVmIGdldEdlbmVyYWxGbGFncyhzZWxmLCBjb25mKToKKyAgICAgICAgIiIiR2V0IGRpY3Qgb2YgQ1hYRkxBR1MsIExJTktGTEFHUywgYW5kIERFRklORVMgdGhhdCBhcmUgYWx3YXlzIG5lZWRlZCIiIgorICAgICAgICByZXR1cm4geydDWFhGTEFHUyc6IFtdLCAnTElOS0ZMQUdTJzogW10sICdERUZJTkVTJzogW119CisKKyAgICBkZWYgZ2V0RGVidWdGbGFncyhzZWxmLCBjb25mKToKKyAgICAgICAgIiIiR2V0IGRpY3Qgb2YgQ1hYRkxBR1MsIExJTktGTEFHUywgYW5kIERFRklORVMgdGhhdCBhcmUgbmVlZGVkIG9ubHkgaW4gZGVidWcgbW9kZSIiIgorICAgICAgICByZXR1cm4geydDWFhGTEFHUyc6IFtdLCAnTElOS0ZMQUdTJzogW10sICdERUZJTkVTJzogWydfREVCVUcnXX0KKworICAgIGRlZiBnZXRPcHRpbWl6ZWRGbGFncyhzZWxmLCBjb25mKToKKyAgICAgICAgIiIiR2V0IGRpY3Qgb2YgQ1hYRkxBR1MsIExJTktGTEFHUywgYW5kIERFRklORVMgdGhhdCBhcmUgbmVlZGVkIG9ubHkgaW4gb3B0aW1pemVkIG1vZGUiIiIKKyAgICAgICAgcmV0dXJuIHsnQ1hYRkxBR1MnOiBbXSwgJ0xJTktGTEFHUyc6IFtdLCAnREVGSU5FUyc6IFsnTkRFQlVHJ119CisKK2NsYXNzIEdjY0Jhc2ljRmxhZ3MoQ29tcGlsZXJGbGFncyk6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBkZWZpbmVzIGJhc2ljIGZsYWdzIHRoYXQgd29yayBmb3IgYm90aCBnY2MgYW5kIGNsYW5nIGNvbXBpbGVycworICAgICIiIgorICAgIGRlZiBnZXRHZW5lcmFsRmxhZ3Moc2VsZiwgY29uZik6CisgICAgICAgIGZsYWdzID0gc3VwZXIoR2NjQmFzaWNGbGFncywgc2VsZikuZ2V0R2VuZXJhbEZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLXN0ZD1jKysxNCddCisgICAgICAgIGlmIFV0aWxzLnVudmVyc2lvbmVkX3N5c19wbGF0Zm9ybSgpID09ICdsaW51eCc6CisgICAgICAgICAgICBmbGFnc1snTElOS0ZMQUdTJ10gKz0gWyctZnVzZS1sZD1nb2xkJ10KKyAgICAgICAgZWxpZiBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAnZnJlZWJzZCc6CisgICAgICAgICAgICBmbGFnc1snTElOS0ZMQUdTJ10gKz0gWyctZnVzZS1sZD1sbGQnXQorICAgICAgICByZXR1cm4gZmxhZ3MKKworICAgIGRlZiBnZXREZWJ1Z0ZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKEdjY0Jhc2ljRmxhZ3MsIHNlbGYpLmdldERlYnVnRmxhZ3MoY29uZikKKyAgICAgICAgZmxhZ3NbJ0NYWEZMQUdTJ10gKz0gWyctTzAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1PZycsICMgZ2NjID49IDQuOCwgY2xhbmcgPj0gNC4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctcGVkYW50aWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1XYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV2V4dHJhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV2Vycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vbi12aXJ0dWFsLWR0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMnLCAjIEJ1ZyAjMzc5NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tZXJyb3I9bWF5YmUtdW5pbml0aWFsaXplZCcsICMgQnVnICMxNjE1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVduby11bnVzZWQtcGFyYW1ldGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZmxhZ3NbJ0xJTktGTEFHUyddICs9IFsnLVdsLC1PMSddCisgICAgICAgIHJldHVybiBmbGFncworCisgICAgZGVmIGdldE9wdGltaXplZEZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKEdjY0Jhc2ljRmxhZ3MsIHNlbGYpLmdldE9wdGltaXplZEZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLU8yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLXBlZGFudGljJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdleHRyYScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdub24tdmlydHVhbC1kdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLXVudXNlZC1wYXJhbWV0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmbGFnc1snTElOS0ZMQUdTJ10gKz0gWyctV2wsLU8xJ10KKyAgICAgICAgcmV0dXJuIGZsYWdzCisKK2NsYXNzIEdjY0ZsYWdzKEdjY0Jhc2ljRmxhZ3MpOgorICAgIGRlZiBnZXREZWJ1Z0ZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKEdjY0ZsYWdzLCBzZWxmKS5nZXREZWJ1Z0ZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLWZkaWFnbm9zdGljcy1jb2xvciddCisgICAgICAgIHJldHVybiBmbGFncworCisgICAgZGVmIGdldE9wdGltaXplZEZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKEdjY0ZsYWdzLCBzZWxmKS5nZXRPcHRpbWl6ZWRGbGFncyhjb25mKQorICAgICAgICBmbGFnc1snQ1hYRkxBR1MnXSArPSBbJy1mZGlhZ25vc3RpY3MtY29sb3InXQorICAgICAgICByZXR1cm4gZmxhZ3MKKworY2xhc3MgQ2xhbmdGbGFncyhHY2NCYXNpY0ZsYWdzKToKKyAgICBkZWYgZ2V0R2VuZXJhbEZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKENsYW5nRmxhZ3MsIHNlbGYpLmdldEdlbmVyYWxGbGFncyhjb25mKQorICAgICAgICBpZiBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAnZGFyd2luJyBhbmQgc2VsZi5nZXRDb21waWxlclZlcnNpb24oY29uZikgPj0gKDksIDAsIDApOgorICAgICAgICAgICAgIyBCdWcgIzQyOTYKKyAgICAgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFtbJy1pc3lzdGVtJywgJy91c3IvbG9jYWwvaW5jbHVkZSddLCAjIGZvciBIb21lYnJldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLWlzeXN0ZW0nLCAnL29wdC9sb2NhbC9pbmNsdWRlJ11dICMgZm9yIE1hY1BvcnRzCisgICAgICAgIGlmIFV0aWxzLnVudmVyc2lvbmVkX3N5c19wbGF0Zm9ybSgpID09ICdmcmVlYnNkJzoKKyAgICAgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFtbJy1pc3lzdGVtJywgJy91c3IvbG9jYWwvaW5jbHVkZSddXSAjIEJ1ZyAjNDc5MAorICAgICAgICByZXR1cm4gZmxhZ3MKKworICAgIGRlZiBnZXREZWJ1Z0ZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKENsYW5nRmxhZ3MsIHNlbGYpLmdldERlYnVnRmxhZ3MoY29uZikKKyAgICAgICAgZmxhZ3NbJ0NYWEZMQUdTJ10gKz0gWyctZmNvbG9yLWRpYWdub3N0aWNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV2V4dHJhLXNlbWknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1XdW5kZWZpbmVkLWZ1bmMtdGVtcGxhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLWxvY2FsLXR5cGVkZWYnLCAjIEJ1Z3MgIzI2NTcgYW5kICMzMjA5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIHZlcnNpb24gPSBzZWxmLmdldENvbXBpbGVyVmVyc2lvbihjb25mKQorICAgICAgICBpZiB2ZXJzaW9uIDwgKDMsIDksIDApIG9yIChVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAnZGFyd2luJyBhbmQgdmVyc2lvbiA8ICg4LCAxLCAwKSk6CisgICAgICAgICAgICBmbGFnc1snQ1hYRkxBR1MnXSArPSBbJy1Xbm8tdW5rbm93bi1wcmFnbWFzJ10KKyAgICAgICAgaWYgdmVyc2lvbiA8ICg2LCAwLCAwKToKKyAgICAgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLVduby1taXNzaW5nLWJyYWNlcyddICMgQnVnICM0NzIxCisgICAgICAgIHJldHVybiBmbGFncworCisgICAgZGVmIGdldE9wdGltaXplZEZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKENsYW5nRmxhZ3MsIHNlbGYpLmdldE9wdGltaXplZEZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLWZjb2xvci1kaWFnbm9zdGljcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdleHRyYS1zZW1pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV3VuZGVmaW5lZC1mdW5jLXRlbXBsYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLXVudXNlZC1sb2NhbC10eXBlZGVmJywgIyBCdWdzICMyNjU3IGFuZCAjMzIwOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICB2ZXJzaW9uID0gc2VsZi5nZXRDb21waWxlclZlcnNpb24oY29uZikKKyAgICAgICAgaWYgdmVyc2lvbiA8ICgzLCA5LCAwKSBvciAoVXRpbHMudW52ZXJzaW9uZWRfc3lzX3BsYXRmb3JtKCkgPT0gJ2RhcndpbicgYW5kIHZlcnNpb24gPCAoOCwgMSwgMCkpOgorICAgICAgICAgICAgZmxhZ3NbJ0NYWEZMQUdTJ10gKz0gWyctV25vLXVua25vd24tcHJhZ21hcyddCisgICAgICAgIGlmIHZlcnNpb24gPCAoNiwgMCwgMCk6CisgICAgICAgICAgICBmbGFnc1snQ1hYRkxBR1MnXSArPSBbJy1Xbm8tbWlzc2luZy1icmFjZXMnXSAjIEJ1ZyAjNDcyMQorICAgICAgICByZXR1cm4gZmxhZ3MKZGlmZiAtLWdpdCBhLy53YWYtdG9vbHMvb3BlbnNzbC5weSBiLy53YWYtdG9vbHMvb3BlbnNzbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzU3OTVmCi0tLSAvZGV2L251bGwKKysrIGIvLndhZi10b29scy9vcGVuc3NsLnB5CkBAIC0wLDAgKzEsMTAyIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGVuY29kaW5nOiB1dGYtOAorIyBZaW5nZGkgWXUgKFVDTEEpIDIwMTYKKworJycnCisKK1doZW4gdXNpbmcgdGhpcyB0b29sLCB0aGUgd3NjcmlwdCB3aWxsIGxvb2sgbGlrZToKKworICAgIGRlZiBvcHRpb25zKG9wdCk6CisgICAgICAgIG9wdC5sb2FkKCdvcGVuc3NsJykKKworICAgIGRlZiBjb25maWd1cmUoY29uZik6CisgICAgICAgIGNvbmYubG9hZCgnY29tcGlsZXJfY3h4IG9wZW5zc2wnKQorICAgICAgICBjb25mLmNoZWNrX29wZW5zc2woKQorCisgICAgZGVmIGJ1aWxkKGJsZCk6CisgICAgICAgIGJsZChzb3VyY2U9J21haW4uY3BwJywgdGFyZ2V0PSdhcHAnLCB1c2U9J09QRU5TU0wnKQorCisnJycKKworaW1wb3J0IHJlCitmcm9tIHdhZmxpYiBpbXBvcnQgVXRpbHMKK2Zyb20gd2FmbGliLkNvbmZpZ3VyZSBpbXBvcnQgY29uZgorCitPUEVOU1NMX0RJUl9PU1ggPSBbJy91c3IvbG9jYWwnLCAnL29wdC9sb2NhbCcsICcvdXNyL2xvY2FsL29wdC9vcGVuc3NsJ10KK09QRU5TU0xfRElSID0gWycvdXNyJywgJy91c3IvbG9jYWwnLCAnL29wdC9sb2NhbCcsICcvc3cnXQorCitkZWYgb3B0aW9ucyhvcHQpOgorICAgIG9wdC5hZGRfb3B0aW9uKCctLXdpdGgtb3BlbnNzbCcsIHR5cGU9J3N0cmluZycsIGRlZmF1bHQ9Tm9uZSwgZGVzdD0nb3BlbnNzbF9kaXInLAorICAgICAgICAgICAgICAgICAgIGhlbHA9J2RpcmVjdG9yeSB3aGVyZSBPcGVuU1NMIGlzIGluc3RhbGxlZCwgZS5nLiwgL3Vzci9sb2NhbCcpCisKK0Bjb25mCitkZWYgX19vcGVuc3NsX2dldF92ZXJzaW9uX2ZpbGUoc2VsZiwgZGlyKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzZWxmLnJvb3QuZmluZF9kaXIoZGlyKS5maW5kX25vZGUoJ2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oJykKKyAgICBleGNlcHQ6CisgICAgICAgIHJldHVybiBOb25lCisKK0Bjb25mCitkZWYgX19vcGVuc3NsX2ZpbmRfcm9vdF9hbmRfdmVyc2lvbl9maWxlKHNlbGYsICprLCAqKmt3KToKKyAgICByb290ID0gayBhbmQga1swXSBvciBrdy5nZXQoJ3BhdGgnLCBzZWxmLm9wdGlvbnMub3BlbnNzbF9kaXIpCisKKyAgICBmaWxlID0gc2VsZi5fX29wZW5zc2xfZ2V0X3ZlcnNpb25fZmlsZShyb290KQorICAgIGlmIHJvb3QgYW5kIGZpbGU6CisgICAgICAgIHJldHVybiAocm9vdCwgZmlsZSkKKworICAgIG9wZW5zc2xfZGlyID0gW10KKyAgICBpZiBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAnZGFyd2luJzoKKyAgICAgICAgb3BlbnNzbF9kaXIgPSBPUEVOU1NMX0RJUl9PU1gKKyAgICBlbHNlOgorICAgICAgICBvcGVuc3NsX2RpciA9IE9QRU5TU0xfRElSCisKKyAgICBpZiBub3Qgcm9vdDoKKyAgICAgICAgZm9yIGRpciBpbiBvcGVuc3NsX2RpcjoKKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLl9fb3BlbnNzbF9nZXRfdmVyc2lvbl9maWxlKGRpcikKKyAgICAgICAgICAgIGlmIGZpbGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIChkaXIsIGZpbGUpCisKKyAgICBpZiByb290OgorICAgICAgICBzZWxmLmZhdGFsKCdPcGVuU1NMIG5vdCBmb3VuZCBpbiAlcycgJSByb290KQorICAgIGVsc2U6CisgICAgICAgIHNlbGYuZmF0YWwoJ09wZW5TU0wgbm90IGZvdW5kLCBwbGVhc2UgcHJvdmlkZSBhIC0td2l0aC1vcGVuc3NsPVBBVEggYXJndW1lbnQgKHNlZSBoZWxwKScpCisKK0Bjb25mCitkZWYgY2hlY2tfb3BlbnNzbChzZWxmLCAqaywgKiprdyk6CisgICAgc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIGZvciBPcGVuU1NMIHZlcnNpb24nKQorICAgIChyb290LCBmaWxlKSA9IHNlbGYuX19vcGVuc3NsX2ZpbmRfcm9vdF9hbmRfdmVyc2lvbl9maWxlKCprLCAqKmt3KQorCisgICAgdHJ5OgorICAgICAgICB0eHQgPSBmaWxlLnJlYWQoKQorICAgICAgICByZV92ZXJzaW9uID0gcmUuY29tcGlsZSgnXiNcXHMqZGVmaW5lXFxzK09QRU5TU0xfVkVSU0lPTl9OVU1CRVJcXHMrKC4qKUwnLCByZS5NKQorICAgICAgICB2ZXJzaW9uX251bWJlciA9IHJlX3ZlcnNpb24uc2VhcmNoKHR4dCkKKworICAgICAgICByZV92ZXJzaW9uX3RleHQgPSByZS5jb21waWxlKCdeI1xccypkZWZpbmVcXHMrT1BFTlNTTF9WRVJTSU9OX1RFWFRcXHMrKC4qKScsIHJlLk0pCisgICAgICAgIHZlcnNpb25fdGV4dCA9IHJlX3ZlcnNpb25fdGV4dC5zZWFyY2godHh0KQorCisgICAgICAgIGlmIHZlcnNpb25fbnVtYmVyIGFuZCB2ZXJzaW9uX3RleHQ6CisgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbl9udW1iZXIuZ3JvdXAoMSkKKyAgICAgICAgICAgIHNlbGYuZW5kX21zZyh2ZXJzaW9uX3RleHQuZ3JvdXAoMSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhdGFsKCdPcGVuU1NMIHZlcnNpb24gZmlsZSBpcyBwcmVzZW50LCBidXQgaXMgbm90IHJlY29nbml6YWJsZScpCisgICAgZXhjZXB0OgorICAgICAgICBzZWxmLmZhdGFsKCdPcGVuU1NMIHZlcnNpb24gZmlsZSBpcyBub3QgZm91bmQgb3IgaXMgbm90IHVzYWJsZScpCisKKyAgICBhdGxlYXN0X3ZlcnNpb24gPSBrdy5nZXQoJ2F0bGVhc3RfdmVyc2lvbicsIDApCisgICAgaWYgaW50KHZlcnNpb24sIDE2KSA8IGF0bGVhc3RfdmVyc2lvbjoKKyAgICAgICAgc2VsZi5mYXRhbCgnVGhlIHZlcnNpb24gb2YgT3BlblNTTCBpcyB0b28gb2xkXG4nCisgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSB1cGdyYWRlIHlvdXIgZGlzdHJpYnV0aW9uIG9yIG1hbnVhbGx5IGluc3RhbGwgYSBuZXdlciB2ZXJzaW9uIG9mIE9wZW5TU0wnKQorCisgICAgaWYgJ21zZycgbm90IGluIGt3OgorICAgICAgICBrd1snbXNnJ10gPSAnQ2hlY2tpbmcgaWYgT3BlblNTTCBsaWJyYXJ5IHdvcmtzJworICAgIGlmICdsaWInIG5vdCBpbiBrdzoKKyAgICAgICAga3dbJ2xpYiddID0gWydzc2wnLCAnY3J5cHRvJ10KKyAgICBpZiAndXNlbGliX3N0b3JlJyBub3QgaW4ga3c6CisgICAgICAgIGt3Wyd1c2VsaWJfc3RvcmUnXSA9ICdPUEVOU1NMJworICAgIGlmICdkZWZpbmVfbmFtZScgbm90IGluIGt3OgorICAgICAgICBrd1snZGVmaW5lX25hbWUnXSA9ICdIQVZFXyVzJyAlIGt3Wyd1c2VsaWJfc3RvcmUnXQorICAgIGlmIHJvb3Q6CisgICAgICAgIGt3WydpbmNsdWRlcyddID0gJyVzL2luY2x1ZGUnICUgcm9vdAorICAgICAgICBrd1snbGlicGF0aCddID0gJyVzL2xpYicgJSByb290CisKKyAgICBzZWxmLmNoZWNrX2N4eCgqKmt3KQpkaWZmIC0tZ2l0IGEvLndhZi10b29scy9zYW5pdGl6ZXJzLnB5IGIvLndhZi10b29scy9zYW5pdGl6ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmU1NWQKLS0tIC9kZXYvbnVsbAorKysgYi8ud2FmLXRvb2xzL3Nhbml0aXplcnMucHkKQEAgLTAsMCArMSwyMiBAQAorIyAtKi0gTW9kZTogcHl0aG9uOyBweS1pbmRlbnQtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGNvZGluZzogdXRmLTg7IC0qLQorCitkZWYgb3B0aW9ucyhvcHQpOgorICAgIG9wdC5hZGRfb3B0aW9uKCctLXdpdGgtc2FuaXRpemVyJywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9JycsIGRlc3Q9J3Nhbml0aXplcnMnLAorICAgICAgICAgICAgICAgICAgIGhlbHA9J0NvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbXBpbGVyIHNhbml0aXplcnMgdG8gZW5hYmxlIFtkZWZhdWx0PW5vbmVdJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBmb3Igc2FuIGluIGNvbmYub3B0aW9ucy5zYW5pdGl6ZXJzLnNwbGl0KCcsJyk6CisgICAgICAgIGlmIG5vdCBzYW46CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHNhbmZsYWcgPSAnLWZzYW5pdGl6ZT0lcycgJSBzYW4KKyAgICAgICAgY29uZi5zdGFydF9tc2coJ0NoZWNraW5nIGlmIGNvbXBpbGVyIHN1cHBvcnRzICVzJyAlIHNhbmZsYWcpCisKKyAgICAgICAgaWYgY29uZi5jaGVja19jeHgoY3h4ZmxhZ3M9WyctV2Vycm9yJywgc2FuZmxhZywgJy1mbm8tb21pdC1mcmFtZS1wb2ludGVyJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtmbGFncz1bc2FuZmxhZ10sIG1hbmRhdG9yeT1GYWxzZSk6CisgICAgICAgICAgICBjb25mLmVuZF9tc2coJ3llcycpCisgICAgICAgICAgICBjb25mLmVudi5hcHBlbmRfdW5pcXVlKCdDWFhGTEFHUycsIFtzYW5mbGFnLCAnLWZuby1vbWl0LWZyYW1lLXBvaW50ZXInXSkKKyAgICAgICAgICAgIGNvbmYuZW52LmFwcGVuZF91bmlxdWUoJ0xJTktGTEFHUycsIFtzYW5mbGFnXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbmYuZW5kX21zZygnbm8nLCBjb2xvcj0nUkVEJykKKyAgICAgICAgICAgIGNvbmYuZmF0YWwoJyVzIHNhbml0aXplciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGNvbXBpbGVyJyAlIHNhbikKZGlmZiAtLWdpdCBhLy53YWYtdG9vbHMvc3FsaXRlMy5weSBiLy53YWYtdG9vbHMvc3FsaXRlMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjJjMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvLndhZi10b29scy9zcWxpdGUzLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMgZW5jb2Rpbmc6IHV0Zi04CisKK2Zyb20gd2FmbGliLkNvbmZpZ3VyZSBpbXBvcnQgY29uZgorCitkZWYgb3B0aW9ucyhvcHQpOgorICAgIG9wdC5hZGRfb3B0aW9uKCctLXdpdGgtc3FsaXRlMycsIHR5cGU9J3N0cmluZycsIGRlZmF1bHQ9Tm9uZSwgZGVzdD0nc3FsaXRlM19kaXInLAorICAgICAgICAgICAgICAgICAgIGhlbHA9J2RpcmVjdG9yeSB3aGVyZSBTUUxpdGUzIGlzIGluc3RhbGxlZCwgZS5nLiwgL3Vzci9sb2NhbCcpCisKK0Bjb25mCitkZWYgY2hlY2tfc3FsaXRlMyhzZWxmLCAqaywgKiprdyk6CisgICAgcm9vdCA9IGsgYW5kIGtbMF0gb3Iga3cuZ2V0KCdwYXRoJywgc2VsZi5vcHRpb25zLnNxbGl0ZTNfZGlyKQorICAgIG1hbmRhdG9yeSA9IGt3LmdldCgnbWFuZGF0b3J5JywgVHJ1ZSkKKyAgICB2YXIgPSBrdy5nZXQoJ3VzZWxpYl9zdG9yZScsICdTUUxJVEUzJykKKworICAgIGlmIHJvb3Q6CisgICAgICAgIHNlbGYuY2hlY2tfY3h4KGxpYj0nc3FsaXRlMycsCisgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nQ2hlY2tpbmcgZm9yIFNRTGl0ZTMgbGlicmFyeScsCisgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZV9uYW1lPSdIQVZFXyVzJyAlIHZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlbGliX3N0b3JlPXZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5PW1hbmRhdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9JyVzL2luY2x1ZGUnICUgcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgbGlicGF0aD0nJXMvbGliJyAlIHJvb3QpCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jaGVja19jZmcocGFja2FnZT0nc3FsaXRlMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPVsnLS1jZmxhZ3MnLCAnLS1saWJzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfZGVmaW5lPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVfbmFtZT0nSEFWRV8lcycgJSB2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VsaWJfc3RvcmU9J1NRTElURTMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5PVRydWUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfY3h4KGxpYj0nc3FsaXRlMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J0NoZWNraW5nIGZvciBTUUxpdGUzIGxpYnJhcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lX25hbWU9J0hBVkVfJXMnICUgdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlbGliX3N0b3JlPXZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeT1tYW5kYXRvcnkpCmRpZmYgLS1naXQgYS9BVVRIT1JTLm1kIGIvQVVUSE9SUy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzQwYzhkCi0tLSAvZGV2L251bGwKKysrIGIvQVVUSE9SUy5tZApAQCAtMCwwICsxLDE5IEBACisjIG5kbmNlcnQgQXV0aG9ycworCitUaGUgZm9sbG93aW5nIGxpc3RzIG1haW50YWluZXJzLCBwcmltYXJ5IGRldmVsb3BlcnMsIGFuZCBhbGwgbXVjaC1hcHByZWNpYXRlZCBjb250cmlidXRvcnMgdG8gbmRuY2VydCBpbiBhbHBoYWJldGljIG9yZGVyLgorVGhlIHNwZWNpZmljIGNvbnRyaWJ1dGlvbnMgb2YgaW5kaXZpZHVhbCBhdXRob3JzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBnaXQgaGlzdG9yeSBvZiB0aGUgW29mZmljaWFsIG5kbmNlcnQgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvbmRuY2VydCkuCitJZiB5b3Ugd291bGQgbGlrZSB0byBiZWNvbWUgYSBjb250cmlidXRvciB0byB0aGUgb2ZmaWNpYWwgcmVwb3NpdG9yeSwgcGxlYXNlIGZvbGxvdyB0aGUgcmVjb21tZW5kYXRpb25zIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhLy5naXRodWIvYmxvYi9tYXN0ZXIvQ09OVFJJQlVUSU5HLm1kLgorCisqIEFsZXhhbmRlciBBZmFuYXN5ZXYgPGh0dHBzOi8vdXNlcnMuY3MuZml1LmVkdS9+YWZhbmFzeWV2Lz4KKyogQXNobGVzaCBHYXdhbmRlIDxodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vYWdhd2FuZGU+CisqIFNpcWkgTGl1IDxodHRwczovL2dpdGh1Yi5jb20vdHlsZXJsaXU+CisqIEVyaWMgTmV3YmVycnkgPGh0dHBzOi8vZXJpY25ld2JlcnJ5LmNvbT4KKyogRGF2aWRlIFBlc2F2ZW50byA8aHR0cHM6Ly9naXRodWIuY29tL1Blc2E+CisqIE1kIEFzaGlxdXIgUmFobWFuIDxodHRwczovL2FzaGlxcmFobWFuLmNvbT4KKyogSnVueGlhbyBTaGkgPGh0dHBzOi8vY3MuYXJpem9uYS5lZHUvfnNoaWp1bnhpYW8+CisqIFl1ZmVuZyBaaGFuZyA8aHR0cHM6Ly95dWZlbmd6aC5pbz4KKyogKioqKE1haW50YWluZXIpKioqIFpoaXlpIFpoYW5nIDxodHRwczovL3poaXlpLXpoYW5nLmNvbT4KKworIyBUZWNobmljYWwgQWR2aXNvcnMKKworKiBMaXhpYSBaaGFuZyA8aHR0cHM6Ly93ZWIuY3MudWNsYS5lZHUvfmxpeGlhPgpkaWZmIC0tZ2l0IGEvQ09QWUlORy5tZCBiL0NPUFlJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzYjJjNAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcubWQKQEAgLTAsMCArMSw2OTcgQEAKK25kbmNlcnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKK3ZlcnNpb24gMyBvciBsYXRlci4KKworbmRuY2VydCByZWxpZXMgb24gdGhpcmQtcGFydHkgc29mdHdhcmUsIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZXM6CisKKy0gbmRuLWN4eCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgIFtHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzXShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG4tY3h4L2Jsb2IvbWFzdGVyL0NPUFlJTkcubWQpCisKKy0gVGhlIEJvb3N0IGxpYnJhcmllcyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlCisgIFtCb29zdCBTb2Z0d2FyZSBMaWNlbnNlIDEuMF0oaHR0cHM6Ly93d3cuYm9vc3Qub3JnL3VzZXJzL2xpY2Vuc2UuaHRtbCkKKworLSBTUUxpdGUgaXMgaW4gdGhlIFtwdWJsaWMgZG9tYWluXShodHRwczovL3d3dy5zcWxpdGUub3JnL2NvcHlyaWdodC5odG1sKQorCistIFRoZSB3YWYgYnVpbGQgc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgW0JTRCBsaWNlbnNlXShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG5jZXJ0L2Jsb2IvbWFzdGVyL3dhZikKKworCitUaGUgR1BMIGxpY2Vuc2UgaXMgcHJvdmlkZWQgYmVsb3cgaW4gdGhpcyBmaWxlLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK3RoZXNlIGxpY2Vuc2VzLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIyMgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKworVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKKworQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorPGh0dHBzOi8vZnNmLm9yZy8+CisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzCitsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKyMjIyBQcmVhbWJsZQorCitUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgorc29mdHdhcmUgYW5kIG90aGVyIGtpbmRzIG9mIHdvcmtzLgorCitUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKK3RvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuIEJ5IGNvbnRyYXN0LAordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20KK3RvIHNoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMKK2ZyZWUgc29mdHdhcmUgZm9yIGFsbCBpdHMgdXNlcnMuIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9zdCBvZiBvdXIgc29mdHdhcmU7IGl0IGFwcGxpZXMKK2Fsc28gdG8gYW55IG90aGVyIHdvcmsgcmVsZWFzZWQgdGhpcyB3YXkgYnkgaXRzIGF1dGhvcnMuIFlvdSBjYW4gYXBwbHkKK2l0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KKworV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQord2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKK2ZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCitUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKK3RoZXNlIHJpZ2h0cyBvciBhc2tpbmcgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVyZWZvcmUsIHlvdQoraGF2ZSBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbQorb2Ygb3RoZXJzLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBwYXNzIG9uIHRvIHRoZSByZWNpcGllbnRzIHRoZSBzYW1lCitmcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlCitvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Citrbm93IHRoZWlyIHJpZ2h0cy4KKworRGV2ZWxvcGVycyB0aGF0IHVzZSB0aGUgR05VIEdQTCBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOgorKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKK2dpdmluZyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQuCisKK0ZvciB0aGUgZGV2ZWxvcGVycycgYW5kIGF1dGhvcnMnIHByb3RlY3Rpb24sIHRoZSBHUEwgY2xlYXJseSBleHBsYWlucwordGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiBGb3IgYm90aCB1c2VycycgYW5kCithdXRob3JzJyBzYWtlLCB0aGUgR1BMIHJlcXVpcmVzIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgYmUgbWFya2VkIGFzCitjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KK2F1dGhvcnMgb2YgcHJldmlvdXMgdmVyc2lvbnMuCisKK1NvbWUgZGV2aWNlcyBhcmUgZGVzaWduZWQgdG8gZGVueSB1c2VycyBhY2Nlc3MgdG8gaW5zdGFsbCBvciBydW4KK21vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlCittYW51ZmFjdHVyZXIgY2FuIGRvIHNvLiBUaGlzIGlzIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlIHdpdGggdGhlCithaW0gb2YgcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiBUaGUKK3N5c3RlbWF0aWMgcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IKK2luZGl2aWR1YWxzIHRvIHVzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLgorVGhlcmVmb3JlLCB3ZSBoYXZlIGRlc2lnbmVkIHRoaXMgdmVyc2lvbiBvZiB0aGUgR1BMIHRvIHByb2hpYml0IHRoZQorcHJhY3RpY2UgZm9yIHRob3NlIHByb2R1Y3RzLiBJZiBzdWNoIHByb2JsZW1zIGFyaXNlIHN1YnN0YW50aWFsbHkgaW4KK290aGVyIGRvbWFpbnMsIHdlIHN0YW5kIHJlYWR5IHRvIGV4dGVuZCB0aGlzIHByb3Zpc2lvbiB0byB0aG9zZQorZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlCitmcmVlZG9tIG9mIHVzZXJzLgorCitGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCitzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaAordG8gYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtCitjb3VsZCBtYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiBUbyBwcmV2ZW50IHRoaXMsIHRoZSBHUEwKK2Fzc3VyZXMgdGhhdCBwYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4KKworVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKyMjIyBURVJNUyBBTkQgQ09ORElUSU9OUworCisjIyMjIDAuIERlZmluaXRpb25zLgorCisiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMKK29mIHdvcmtzLCBzdWNoIGFzIHNlbWljb25kdWN0b3IgbWFza3MuCisKKyJUaGUgUHJvZ3JhbSIgcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcworTGljZW5zZS4gRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuICJMaWNlbnNlZXMiIGFuZAorInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgorCitUbyAibW9kaWZ5IiBhIHdvcmsgbWVhbnMgdG8gY29weSBmcm9tIG9yIGFkYXB0IGFsbCBvciBwYXJ0IG9mIHRoZSB3b3JrCitpbiBhIGZhc2hpb24gcmVxdWlyaW5nIGNvcHlyaWdodCBwZXJtaXNzaW9uLCBvdGhlciB0aGFuIHRoZSBtYWtpbmcgb2YKK2FuIGV4YWN0IGNvcHkuIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YKK3RoZSBlYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KKworQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLgorCitUbyAicHJvcGFnYXRlIiBhIHdvcmsgbWVhbnMgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCB0aGF0LCB3aXRob3V0CitwZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yCitpbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKK2NvbXB1dGVyIG9yIG1vZGlmeWluZyBhIHByaXZhdGUgY29weS4gUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKK2Rpc3RyaWJ1dGlvbiAod2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiksIG1ha2luZyBhdmFpbGFibGUgdG8gdGhlCitwdWJsaWMsIGFuZCBpbiBzb21lIGNvdW50cmllcyBvdGhlciBhY3Rpdml0aWVzIGFzIHdlbGwuCisKK1RvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXIKK3BhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gTWVyZSBpbnRlcmFjdGlvbiB3aXRoIGEgdXNlcgordGhyb3VnaCBhIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QKK2NvbnZleWluZy4KKworQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiIHRvCit0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCitmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKK3RlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCitleHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCit3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuIElmCit0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQorbWVudSwgYSBwcm9taW5lbnQgaXRlbSBpbiB0aGUgbGlzdCBtZWV0cyB0aGlzIGNyaXRlcmlvbi4KKworIyMjIyAxLiBTb3VyY2UgQ29kZS4KKworVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZSBmb3JtIG9mCithIHdvcmsuCisKK0EgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCitzdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCitpbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAoraXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCisKK1RoZSAiU3lzdGVtIExpYnJhcmllcyIgb2YgYW4gZXhlY3V0YWJsZSB3b3JrIGluY2x1ZGUgYW55dGhpbmcsIG90aGVyCit0aGFuIHRoZSB3b3JrIGFzIGEgd2hvbGUsIHRoYXQgKGEpIGlzIGluY2x1ZGVkIGluIHRoZSBub3JtYWwgZm9ybSBvZgorcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgorQ29tcG9uZW50LCBhbmQgKGIpIHNlcnZlcyBvbmx5IHRvIGVuYWJsZSB1c2Ugb2YgdGhlIHdvcmsgd2l0aCB0aGF0CitNYWpvciBDb21wb25lbnQsIG9yIHRvIGltcGxlbWVudCBhIFN0YW5kYXJkIEludGVyZmFjZSBmb3Igd2hpY2ggYW4KK2ltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uIEEKKyJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAorKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQorKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8KK3Byb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgorCitUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCit0aGUgc291cmNlIGNvZGUgbmVlZGVkIHRvIGdlbmVyYXRlLCBpbnN0YWxsLCBhbmQgKGZvciBhbiBleGVjdXRhYmxlCit3b3JrKSBydW4gdGhlIG9iamVjdCBjb2RlIGFuZCB0byBtb2RpZnkgdGhlIHdvcmssIGluY2x1ZGluZyBzY3JpcHRzIHRvCitjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncworU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQorcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0Cit3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuIEZvciBleGFtcGxlLCBDb3JyZXNwb25kaW5nIFNvdXJjZQoraW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3IKK3RoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQorbGlua2VkIHN1YnByb2dyYW1zIHRoYXQgdGhlIHdvcmsgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJlcXVpcmUsCitzdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQorc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgorCitUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzIGNhbgorcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLgorCitUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQgc2FtZQord29yay4KKworIyMjIyAyLiBCYXNpYyBQZXJtaXNzaW9ucy4KKworQWxsIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSBhcmUgZ3JhbnRlZCBmb3IgdGhlIHRlcm0gb2YKK2NvcHlyaWdodCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGFyZSBpcnJldm9jYWJsZSBwcm92aWRlZCB0aGUgc3RhdGVkCitjb25kaXRpb25zIGFyZSBtZXQuIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQKK3Blcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKK2NvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cworY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgorcmlnaHRzIG9mIGZhaXIgdXNlIG9yIG90aGVyIGVxdWl2YWxlbnQsIGFzIHByb3ZpZGVkIGJ5IGNvcHlyaWdodCBsYXcuCisKK1lvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QgY29udmV5LAord2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zIGluIGZvcmNlLgorWW91IG1heSBjb252ZXkgY292ZXJlZCB3b3JrcyB0byBvdGhlcnMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgaGF2aW5nCit0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdSB3aXRoCitmYWNpbGl0aWVzIGZvciBydW5uaW5nIHRob3NlIHdvcmtzLCBwcm92aWRlZCB0aGF0IHlvdSBjb21wbHkgd2l0aCB0aGUKK3Rlcm1zIG9mIHRoaXMgTGljZW5zZSBpbiBjb252ZXlpbmcgYWxsIG1hdGVyaWFsIGZvciB3aGljaCB5b3UgZG8gbm90Citjb250cm9sIGNvcHlyaWdodC4gVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3JrcyBmb3IKK3lvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbiBhbmQKK2NvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mIHlvdXIKK2NvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91LgorCitDb252ZXlpbmcgdW5kZXIgYW55IG90aGVyIGNpcmN1bXN0YW5jZXMgaXMgcGVybWl0dGVkIHNvbGVseSB1bmRlciB0aGUKK2NvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTAgbWFrZXMKK2l0IHVubmVjZXNzYXJ5LgorCisjIyMjIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCisKK05vIGNvdmVyZWQgd29yayBzaGFsbCBiZSBkZWVtZWQgcGFydCBvZiBhbiBlZmZlY3RpdmUgdGVjaG5vbG9naWNhbAorbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCisxMSBvZiB0aGUgV0lQTyBjb3B5cmlnaHQgdHJlYXR5IGFkb3B0ZWQgb24gMjAgRGVjZW1iZXIgMTk5Niwgb3IKK3NpbWlsYXIgbGF3cyBwcm9oaWJpdGluZyBvciByZXN0cmljdGluZyBjaXJjdW12ZW50aW9uIG9mIHN1Y2gKK21lYXN1cmVzLgorCitXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCitjaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgdG8gdGhlIGV4dGVudCBzdWNoCitjaXJjdW12ZW50aW9uIGlzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoCityZXNwZWN0IHRvIHRoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdAorb3BlcmF0aW9uIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBhcyBhIG1lYW5zIG9mIGVuZm9yY2luZywgYWdhaW5zdAordGhlIHdvcmsncyB1c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkCitjaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCisKKyMjIyMgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4KKworWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91CityZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55Citub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbAorcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGFueSBwcmljZSBvciBubyBwcmljZSBmb3IgZWFjaCBjb3B5IHRoYXQgeW91IGNvbnZleSwKK2FuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCisKKyMjIyMgNS4gQ29udmV5aW5nIE1vZGlmaWVkIFNvdXJjZSBWZXJzaW9ucy4KKworWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bworcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZQorY29uZGl0aW9uczoKKworLSAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZAorICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4KKy0gICBiKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCBpdCBpcworICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIKKyAgICBzZWN0aW9uIDcuIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNAorICAgIHRvICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuCistICAgYykgWW91IG11c3QgbGljZW5zZSB0aGUgZW50aXJlIHdvcmssIGFzIGEgd2hvbGUsIHVuZGVyIHRoaXMKKyAgICBMaWNlbnNlIHRvIGFueW9uZSB3aG8gY29tZXMgaW50byBwb3NzZXNzaW9uIG9mIGEgY29weS4gVGhpcworICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3CisgICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKKyAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gVGhpcyBMaWNlbnNlIGdpdmVzIG5vCisgICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAorICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCistICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkKKyAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKKyAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cgorICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLgorCitBIGNvbXBpbGF0aW9uIG9mIGEgY292ZXJlZCB3b3JrIHdpdGggb3RoZXIgc2VwYXJhdGUgYW5kIGluZGVwZW5kZW50Cit3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAorYW5kIHdoaWNoIGFyZSBub3QgY29tYmluZWQgd2l0aCBpdCBzdWNoIGFzIHRvIGZvcm0gYSBsYXJnZXIgcHJvZ3JhbSwKK2luIG9yIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtLCBpcyBjYWxsZWQgYW4KKyJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAordXNlZCB0byBsaW1pdCB0aGUgYWNjZXNzIG9yIGxlZ2FsIHJpZ2h0cyBvZiB0aGUgY29tcGlsYXRpb24ncyB1c2VycworYmV5b25kIHdoYXQgdGhlIGluZGl2aWR1YWwgd29ya3MgcGVybWl0LiBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK2luIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyCitwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgorCisjIyMjIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgorCitZb3UgbWF5IGNvbnZleSBhIGNvdmVyZWQgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlIG1hY2hpbmUtcmVhZGFibGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluIG9uZSBvZiB0aGVzZQord2F5czoKKworLSAgIGEpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKy0gICBiKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhCisgICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKKyAgICBsb25nIGFzIHlvdSBvZmZlciBzcGFyZSBwYXJ0cyBvciBjdXN0b21lciBzdXBwb3J0IGZvciB0aGF0IHByb2R1Y3QKKyAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhCisgICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCisgICAgcHJvZHVjdCB0aGF0IGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBvbiBhIGR1cmFibGUgcGh5c2ljYWwKKyAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vCisgICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCisgICAgY29udmV5aW5nIG9mIHNvdXJjZSwgb3IgKDIpIGFjY2VzcyB0byBjb3B5IHRoZSBDb3JyZXNwb25kaW5nCisgICAgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuCistICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKKyAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiBUaGlzCisgICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKKyAgICBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgb2JqZWN0IGNvZGUgd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQKKyAgICB3aXRoIHN1YnNlY3Rpb24gNmIuCistICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKKyAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubworICAgIGZ1cnRoZXIgY2hhcmdlLiBZb3UgbmVlZCBub3QgcmVxdWlyZSByZWNpcGllbnRzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuIElmIHRoZSBwbGFjZSB0bworICAgIGNvcHkgdGhlIG9iamVjdCBjb2RlIGlzIGEgbmV0d29yayBzZXJ2ZXIsIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZQorICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQorICAgIHRoYXQgc3VwcG9ydHMgZXF1aXZhbGVudCBjb3B5aW5nIGZhY2lsaXRpZXMsIHByb3ZpZGVkIHlvdSBtYWludGFpbgorICAgIGNsZWFyIGRpcmVjdGlvbnMgbmV4dCB0byB0aGUgb2JqZWN0IGNvZGUgc2F5aW5nIHdoZXJlIHRvIGZpbmQgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCisgICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KKy0gICBlKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24sCisgICAgcHJvdmlkZWQgeW91IGluZm9ybSBvdGhlciBwZWVycyB3aGVyZSB0aGUgb2JqZWN0IGNvZGUgYW5kCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwKKyAgICBwdWJsaWMgYXQgbm8gY2hhcmdlIHVuZGVyIHN1YnNlY3Rpb24gNmQuCisKK0Egc2VwYXJhYmxlIHBvcnRpb24gb2YgdGhlIG9iamVjdCBjb2RlLCB3aG9zZSBzb3VyY2UgY29kZSBpcyBleGNsdWRlZAorZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUKK2luY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KKworQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKK3RhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLAorZmFtaWx5LCBvciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvcgoraW5jb3Jwb3JhdGlvbiBpbnRvIGEgZHdlbGxpbmcuIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEKK2NvbnN1bWVyIHByb2R1Y3QsIGRvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mCitjb3ZlcmFnZS4gRm9yIGEgcGFydGljdWxhciBwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLAorIm5vcm1hbGx5IHVzZWQiIHJlZmVycyB0byBhIHR5cGljYWwgb3IgY29tbW9uIHVzZSBvZiB0aGF0IGNsYXNzIG9mCitwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMgb2YgdGhlIHBhcnRpY3VsYXIgdXNlciBvciBvZiB0aGUgd2F5CitpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyIGFjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQKK3RvIHVzZSwgdGhlIHByb2R1Y3QuIEEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZgord2hldGhlciB0aGUgcHJvZHVjdCBoYXMgc3Vic3RhbnRpYWwgY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvcgorbm9uLWNvbnN1bWVyIHVzZXMsIHVubGVzcyBzdWNoIHVzZXMgcmVwcmVzZW50IHRoZSBvbmx5IHNpZ25pZmljYW50Cittb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KKworIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLAorcHJvY2VkdXJlcywgYXV0aG9yaXphdGlvbiBrZXlzLCBvciBvdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0bworaW5zdGFsbCBhbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIKK1Byb2R1Y3QgZnJvbSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiBUaGUKK2luZm9ybWF0aW9uIG11c3Qgc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mCit0aGUgbW9kaWZpZWQgb2JqZWN0IGNvZGUgaXMgaW4gbm8gY2FzZSBwcmV2ZW50ZWQgb3IgaW50ZXJmZXJlZCB3aXRoCitzb2xlbHkgYmVjYXVzZSBtb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZS4KKworSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3IKK3NwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCitwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdGhlIHJpZ2h0IG9mIHBvc3Nlc3Npb24gYW5kIHVzZSBvZiB0aGUKK1VzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGEKK2ZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCB1bmRlciB0aGlzIHNlY3Rpb24gbXVzdCBiZSBhY2NvbXBhbmllZAorYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gQnV0IHRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkKK2lmIG5laXRoZXIgeW91IG5vciBhbnkgdGhpcmQgcGFydHkgcmV0YWlucyB0aGUgYWJpbGl0eSB0byBpbnN0YWxsCittb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCitiZWVuIGluc3RhbGxlZCBpbiBST00pLgorCitUaGUgcmVxdWlyZW1lbnQgdG8gcHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBhCityZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yCit1cGRhdGVzIGZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlCityZWNpcGllbnQsIG9yIGZvciB0aGUgVXNlciBQcm9kdWN0IGluIHdoaWNoIGl0IGhhcyBiZWVuIG1vZGlmaWVkIG9yCitpbnN0YWxsZWQuIEFjY2VzcyB0byBhIG5ldHdvcmsgbWF5IGJlIGRlbmllZCB3aGVuIHRoZSBtb2RpZmljYXRpb24KK2l0c2VsZiBtYXRlcmlhbGx5IGFuZCBhZHZlcnNlbHkgYWZmZWN0cyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBuZXR3b3JrCitvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kIHByb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlCituZXR3b3JrLgorCitDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKK2luIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKK2RvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCitzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKK3VucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgorCisjIyMjIDcuIEFkZGl0aW9uYWwgVGVybXMuCisKKyJBZGRpdGlvbmFsIHBlcm1pc3Npb25zIiBhcmUgdGVybXMgdGhhdCBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIGJ5IG1ha2luZyBleGNlcHRpb25zIGZyb20gb25lIG9yIG1vcmUgb2YgaXRzIGNvbmRpdGlvbnMuCitBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCitiZSB0cmVhdGVkIGFzIHRob3VnaCB0aGV5IHdlcmUgaW5jbHVkZWQgaW4gdGhpcyBMaWNlbnNlLCB0byB0aGUgZXh0ZW50Cit0aGF0IHRoZXkgYXJlIHZhbGlkIHVuZGVyIGFwcGxpY2FibGUgbGF3LiBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCithcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Cit1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Cit0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCisKK1doZW4geW91IGNvbnZleSBhIGNvcHkgb2YgYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgYXQgeW91ciBvcHRpb24KK3JlbW92ZSBhbnkgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBmcm9tIHRoYXQgY29weSwgb3IgZnJvbSBhbnkgcGFydCBvZgoraXQuIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCityZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgWW91IG1heSBwbGFjZQorYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLAorZm9yIHdoaWNoIHlvdSBoYXZlIG9yIGNhbiBnaXZlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwZXJtaXNzaW9uLgorCitOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKK2FkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMKK29mIHRoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgorCistICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCisgICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKKy0gICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKKyAgICBhdXRob3IgYXR0cmlidXRpb25zIGluIHRoYXQgbWF0ZXJpYWwgb3IgaW4gdGhlIEFwcHJvcHJpYXRlIExlZ2FsCisgICAgTm90aWNlcyBkaXNwbGF5ZWQgYnkgd29ya3MgY29udGFpbmluZyBpdDsgb3IKKy0gICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsCisgICAgb3IgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KKyAgICByZWFzb25hYmxlIHdheXMgYXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb247IG9yCistICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycworICAgIG9yIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgorLSAgIGUpIERlY2xpbmluZyB0byBncmFudCByaWdodHMgdW5kZXIgdHJhZGVtYXJrIGxhdyBmb3IgdXNlIG9mIHNvbWUKKyAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKKy0gICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CisgICAgbWF0ZXJpYWwgYnkgYW55b25lIHdobyBjb252ZXlzIHRoZSBtYXRlcmlhbCAob3IgbW9kaWZpZWQgdmVyc2lvbnMKKyAgICBvZiBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwKKyAgICBmb3IgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5CisgICAgaW1wb3NlIG9uIHRob3NlIGxpY2Vuc29ycyBhbmQgYXV0aG9ycy4KKworQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuIElmIHRoZSBQcm9ncmFtIGFzIHlvdQorcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMKK2dvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgorcmVzdHJpY3Rpb24sIHlvdSBtYXkgcmVtb3ZlIHRoYXQgdGVybS4gSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCithIGZ1cnRoZXIgcmVzdHJpY3Rpb24gYnV0IHBlcm1pdHMgcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nIHVuZGVyIHRoaXMKK0xpY2Vuc2UsIHlvdSBtYXkgYWRkIHRvIGEgY292ZXJlZCB3b3JrIG1hdGVyaWFsIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcworb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKK25vdCBzdXJ2aXZlIHN1Y2ggcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nLgorCitJZiB5b3UgYWRkIHRlcm1zIHRvIGEgY292ZXJlZCB3b3JrIGluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiwgeW91CittdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUKK2FkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZword2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYWJsZSB0ZXJtcy4KKworQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKK2Zvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7IHRoZQorYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCisKKyMjIyMgOC4gVGVybWluYXRpb24uCisKK1lvdSBtYXkgbm90IHByb3BhZ2F0ZSBvciBtb2RpZnkgYSBjb3ZlcmVkIHdvcmsgZXhjZXB0IGFzIGV4cHJlc3NseQorcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKK3RoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQKK3BhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4KKworSG93ZXZlciwgaWYgeW91IGNlYXNlIGFsbCB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlLCB0aGVuIHlvdXIgbGljZW5zZQorZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKSBwcm92aXNpb25hbGx5LAordW5sZXNzIGFuZCB1bnRpbCB0aGUgY29weXJpZ2h0IGhvbGRlciBleHBsaWNpdGx5IGFuZCBmaW5hbGx5Cit0ZXJtaW5hdGVzIHlvdXIgbGljZW5zZSwgYW5kIChiKSBwZXJtYW5lbnRseSwgaWYgdGhlIGNvcHlyaWdodCBob2xkZXIKK2ZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMgcHJpb3IgdG8KKzYwIGRheXMgYWZ0ZXIgdGhlIGNlc3NhdGlvbi4KKworTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCityZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUKK3Zpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKK3JlY2VpdmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZyb20gdGhhdAorY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcgoreW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCisKK1Rlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCitsaWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZS4gSWYgeW91ciByaWdodHMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYW5kIG5vdCBwZXJtYW5lbnRseQorcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQorbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KKworIyMjIyA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KKworWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yIHJ1bgorYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK29jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCit0byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuIEhvd2V2ZXIsCitub3RoaW5nIG90aGVyIHRoYW4gdGhpcyBMaWNlbnNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBhbnkgY292ZXJlZCB3b3JrLiBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8KK25vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCitjb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgorCisjIyMjIDEwLiBBdXRvbWF0aWMgTGljZW5zaW5nIG9mIERvd25zdHJlYW0gUmVjaXBpZW50cy4KKworRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQorcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gWW91IGFyZSBub3QgcmVzcG9uc2libGUKK2ZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgorCitBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCitvcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuCitvcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCit3b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAordHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCitsaWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKK2dpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKK3RoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KKworWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlCityaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuIEZvciBleGFtcGxlLCB5b3UgbWF5Citub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKK3JpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CithbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKK3NhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KKworIyMjIyAxMS4gUGF0ZW50cy4KKworQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcworTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuIFRoZQord29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCisKK0EgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcyBvd25lZAorb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcgoraGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkCitieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCitidXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQorY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uIEZvcgorcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50CitwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKK3RoaXMgTGljZW5zZS4KKworRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bworbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLgorCitJbiB0aGUgZm9sbG93aW5nIHRocmVlIHBhcmFncmFwaHMsIGEgInBhdGVudCBsaWNlbnNlIiBpcyBhbnkgZXhwcmVzcworYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQsIGhvd2V2ZXIgZGVub21pbmF0ZWQsIG5vdCB0byBlbmZvcmNlIGEgcGF0ZW50Cisoc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCitzdWUgZm9yIHBhdGVudCBpbmZyaW5nZW1lbnQpLiBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCitwYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQorcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5LgorCitJZiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCBrbm93aW5nbHkgcmVseWluZyBvbiBhIHBhdGVudCBsaWNlbnNlLAorYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKK3RvIGNvcHksIGZyZWUgb2YgY2hhcmdlIGFuZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB0aHJvdWdoIGEKK3B1YmxpY2x5IGF2YWlsYWJsZSBuZXR3b3JrIHNlcnZlciBvciBvdGhlciByZWFkaWx5IGFjY2Vzc2libGUgbWVhbnMsCit0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCithdmFpbGFibGUsIG9yICgyKSBhcnJhbmdlIHRvIGRlcHJpdmUgeW91cnNlbGYgb2YgdGhlIGJlbmVmaXQgb2YgdGhlCitwYXRlbnQgbGljZW5zZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdvcmssIG9yICgzKSBhcnJhbmdlLCBpbiBhIG1hbm5lcgorY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudAorbGljZW5zZSB0byBkb3duc3RyZWFtIHJlY2lwaWVudHMuICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKK2FjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQorY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yaworaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0Citjb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLgorCitJZiwgcHVyc3VhbnQgdG8gb3IgaW4gY29ubmVjdGlvbiB3aXRoIGEgc2luZ2xlIHRyYW5zYWN0aW9uIG9yCithcnJhbmdlbWVudCwgeW91IGNvbnZleSwgb3IgcHJvcGFnYXRlIGJ5IHByb2N1cmluZyBjb252ZXlhbmNlIG9mLCBhCitjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKK3JlY2VpdmluZyB0aGUgY292ZXJlZCB3b3JrIGF1dGhvcml6aW5nIHRoZW0gdG8gdXNlLCBwcm9wYWdhdGUsIG1vZGlmeQorb3IgY29udmV5IGEgc3BlY2lmaWMgY29weSBvZiB0aGUgY292ZXJlZCB3b3JrLCB0aGVuIHRoZSBwYXRlbnQgbGljZW5zZQoreW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKK3dvcmsgYW5kIHdvcmtzIGJhc2VkIG9uIGl0LgorCitBIHBhdGVudCBsaWNlbnNlIGlzICJkaXNjcmltaW5hdG9yeSIgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB3aXRoaW4gdGhlCitzY29wZSBvZiBpdHMgY292ZXJhZ2UsIHByb2hpYml0cyB0aGUgZXhlcmNpc2Ugb2YsIG9yIGlzIGNvbmRpdGlvbmVkIG9uCit0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUgc3BlY2lmaWNhbGx5CitncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZCB3b3JrIGlmIHlvdQorYXJlIGEgcGFydHkgdG8gYW4gYXJyYW5nZW1lbnQgd2l0aCBhIHRoaXJkIHBhcnR5IHRoYXQgaXMgaW4gdGhlCitidXNpbmVzcyBvZiBkaXN0cmlidXRpbmcgc29mdHdhcmUsIHVuZGVyIHdoaWNoIHlvdSBtYWtlIHBheW1lbnQgdG8gdGhlCit0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nIHRoZQord29yaywgYW5kIHVuZGVyIHdoaWNoIHRoZSB0aGlyZCBwYXJ0eSBncmFudHMsIHRvIGFueSBvZiB0aGUgcGFydGllcword2hvIHdvdWxkIHJlY2VpdmUgdGhlIGNvdmVyZWQgd29yayBmcm9tIHlvdSwgYSBkaXNjcmltaW5hdG9yeSBwYXRlbnQKK2xpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yayBjb252ZXllZCBieQoreW91IChvciBjb3BpZXMgbWFkZSBmcm9tIHRob3NlIGNvcGllcyksIG9yIChiKSBwcmltYXJpbHkgZm9yIGFuZCBpbgorY29ubmVjdGlvbiB3aXRoIHNwZWNpZmljIHByb2R1Y3RzIG9yIGNvbXBpbGF0aW9ucyB0aGF0IGNvbnRhaW4gdGhlCitjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsIG9yIHRoYXQgcGF0ZW50CitsaWNlbnNlIHdhcyBncmFudGVkLCBwcmlvciB0byAyOCBNYXJjaCAyMDA3LgorCitOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBjb25zdHJ1ZWQgYXMgZXhjbHVkaW5nIG9yIGxpbWl0aW5nCithbnkgaW1wbGllZCBsaWNlbnNlIG9yIG90aGVyIGRlZmVuc2VzIHRvIGluZnJpbmdlbWVudCB0aGF0IG1heQorb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgorCisjIyMjIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLgorCitJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGNvbnZleSBhCitjb3ZlcmVkIHdvcmsgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyCit0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYQorY29uc2VxdWVuY2UgeW91IG1heSBub3QgY29udmV5IGl0IGF0IGFsbC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhZ3JlZSB0bwordGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UgdG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nCitmcm9tIHRob3NlIHRvIHdob20geW91IGNvbnZleSB0aGUgUHJvZ3JhbSwgdGhlIG9ubHkgd2F5IHlvdSBjb3VsZAorc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseQorZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCisKKyMjIyMgMTMuIFVzZSB3aXRoIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKK05vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKK3Blcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKK2NvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiBUaGUgdGVybXMgb2YgdGhpcworTGljZW5zZSB3aWxsIGNvbnRpbnVlIHRvIGFwcGx5IHRvIHRoZSBwYXJ0IHdoaWNoIGlzIHRoZSBjb3ZlcmVkIHdvcmssCitidXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCitzZWN0aW9uIDEzLCBjb25jZXJuaW5nIGludGVyYWN0aW9uIHRocm91Z2ggYSBuZXR3b3JrIHdpbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBhcyBzdWNoLgorCisjIyMjIDE0LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4KKworVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcgdmVyc2lvbnMKK3dpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4KK2RldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIgYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZgorZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBudW1iZXJlZCB2ZXJzaW9uIG9yCitvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlCitQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4KKworSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlIHdoaWNoIGZ1dHVyZSB2ZXJzaW9ucworb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MgcHVibGljCitzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhIHZlcnNpb24gcGVybWFuZW50bHkgYXV0aG9yaXplcyB5b3UgdG8KK2Nob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZSBQcm9ncmFtLgorCitMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAorcGVybWlzc2lvbnMuIEhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMgYXJlIGltcG9zZWQgb24gYW55CithdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCitsYXRlciB2ZXJzaW9uLgorCisjIyMjIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgorCitUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCitBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKK0hPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQKK1dBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAorUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRQorREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IKK0NPUlJFQ1RJT04uCisKKyMjIyMgMTYuIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LgorCitJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTU9ESUZJRVMgQU5EL09SCitDT05WRVlTIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKK0FSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVAorTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUgorTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0KK1RPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSCitQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKyMjIyMgMTcuIEludGVycHJldGF0aW9uIG9mIFNlY3Rpb25zIDE1IGFuZCAxNi4KKworSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCithYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKK3Jldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcworYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQorUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQorY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworIyMjIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCitJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZQordGVybXMuCisKK1RvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiBJdCBpcyBzYWZlc3QgdG8KK2F0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgc3RhdGUKK3RoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyCittYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Citub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICAgICAgPHByb2dyYW0+ICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorICAgICAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgICAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBcYHNob3cgdycgYW5kIFxgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUKK2FwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHlvdXIKK3Byb2dyYW0ncyBjb21tYW5kcyBtaWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZAordXNlIGFuICJhYm91dCBib3giLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMsIGFuZCBob3cgdG8gYXBwbHkgYW5kIGZvbGxvdwordGhlIEdOVSBHUEwsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91cgorcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lCitsaWJyYXJ5LCB5b3UgbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5CithcHBsaWNhdGlvbnMgd2l0aCB0aGUgbGlicmFyeS4gSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuIEJ1dCBmaXJzdCwKK3BsZWFzZSByZWFkIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL3doeS1ub3QtbGdwbC5odG1sPi4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjgwNmUzCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzQgQEAKKyMgTkROIENlcnRpZmljYXRlIE1hbmFnZW1lbnQgUHJvdG9jb2wgKE5ETkNFUlQpCisKKyFbTGFuZ3VhZ2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvQyUyQiUyQi0xNC1ibHVlLnN2ZykKK1shW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL25hbWVkLWRhdGEvbmRuY2VydC5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9uYW1lZC1kYXRhL25kbmNlcnQpCisKK1RoZSBORE4gY2VydGlmaWNhdGUgbWFuYWdlbWVudCBwcm90b2NvbCAoKipORE5DRVJUKiopIGVuYWJsZXMgYXV0b21hdGljIGNlcnRpZmljYXRlIG1hbmFnZW1lbnQKK2luIE5ETi4gSW4gTmFtZWQgRGF0YSBOZXR3b3JraW5nIChORE4pLCBldmVyeSBlbnRpdHkgc2hvdWxkIGhhdmUgYSBjb3JyZXNwb25kaW5nIGlkZW50aXR5CisobmFtZXNwYWNlKSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2VydGlmaWNhdGUgZm9yIHRoaXMgbmFtZXNwYWNlLiBNb3Jlb3ZlciwgZW50aXRpZXMgbmVlZCBzaW1wbGUKK21lY2hhbmlzbXMgdG8gbWFuYWdlIHN1Yi1pZGVudGl0aWVzIGFuZCB0aGVpciBjZXJ0aWZpY2F0ZXMuIE5ETkNFUlQgcHJvdmlkZXMgZmxleGlibGUgbWVjaGFuaXNtcwordG8gcmVxdWVzdCBjZXJ0aWZpY2F0ZXMgZnJvbSBhIGNlcnRpZmljYXRlIGF1dGhvcml0eSAoQ0EpIGFuZCwgYXMgc29vbiBhcyB0aGUgY2VydGlmaWNhdGUgaXMKK29idGFpbmVkLCBtZWNoYW5pc21zIHRvIGlzc3VlIGFuZCBtYW5hZ2UgY2VydGlmaWNhdGVzIGluIHRoZSBkZXNpZ25hdGVkIG5hbWVzcGFjZS4gTm90ZSB0aGF0CitORE5DRVJUIGRvZXMgbm90IGltcG9zZSBhbnkgc3BlY2lmaWMgdHJ1c3QgbW9kZWwgb3IgdHJ1c3QgYW5jaG9ycy4gV2hpbGUgdGhlIHByaW1hcnkgdXNlIGNhc2Ugb2YKK3RoaXMgcHJvdG9jb2wgaXMgdG8gbWFuYWdlIE5ETiB0ZXN0YmVkIGNlcnRpZmljYXRlcywgaXQgY2FuIGJlIHVzZWQgd2l0aCBhbnkgb3RoZXIgc2V0IG9mIGdsb2JhbAorYW5kIGxvY2FsIHRydXN0IGFuY2hvcnMuCisKK1NlZSBbb3VyIEdpdEh1YiB3aWtpXShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG5jZXJ0L3dpa2kpIGZvciBtb3JlIGRldGFpbHMuCisKKyMjIFJlcG9ydGluZyBidWdzCisKK1BsZWFzZSBzdWJtaXQgYW55IGJ1ZyByZXBvcnRzIG9yIGZlYXR1cmUgcmVxdWVzdHMgdG8gdGhlCitbTkROQ0VSVCBpc3N1ZSB0cmFja2VyXShodHRwczovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmRuY2VydC9pc3N1ZXMpLgorCisjIyBDb250cmlidXRpbmcKKworV2UgZ3JlYXRseSBhcHByZWNpYXRlIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIE5ETkNFUlQgY29kZSBiYXNlLCBwcm92aWRlZCB0aGF0IHRoZXkgYXJlCitsaWNlbnNlZCB1bmRlciB0aGUgR1BMIDMuMCsgb3IgYSBjb21wYXRpYmxlIGxpY2Vuc2UgKHNlZSBiZWxvdykuCitJZiB5b3UgYXJlIG5ldyB0byB0aGUgTkROIHNvZnR3YXJlIGNvbW11bml0eSwgcGxlYXNlIHJlYWQgdGhlCitbQ29udHJpYnV0b3IncyBHdWlkZV0oaHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvLmdpdGh1Yi9ibG9iL21hc3Rlci9DT05UUklCVVRJTkcubWQpCit0byBnZXQgc3RhcnRlZC4KKworIyMgTGljZW5zZQorCitORE5DRVJUIGlzIGFuIG9wZW4gc291cmNlIHByb2plY3QgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDMuCitTZWUgW2BDT1BZSU5HLm1kYF0oQ09QWUlORy5tZCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9saWJuZG4tY2VydC5wYy5pbiBiL2xpYm5kbi1jZXJ0LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MjIxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJuZG4tY2VydC5wYy5pbgpAQCAtMCwwICsxLDEwIEBACitwcmVmaXg9QFBSRUZJWEAKK2xpYmRpcj1ATElCRElSQAoraW5jbHVkZWRpcj1ASU5DTFVERURJUkAKKworTmFtZTogbGlibmRuLWNlcnQKK0Rlc2NyaXB0aW9uOiBuZG5jZXJ0IGxpYnJhcnkKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxuZG4tY2VydAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK1JlcXVpcmVzOiBsaWJuZG4tY3h4ID49IDAuNy4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2RldGFpbC9jcnlwdG8taGVscGVycy5jcHAgYi9zcmMvZGV0YWlsL2NyeXB0by1oZWxwZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQyMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2RldGFpbC9jcnlwdG8taGVscGVycy5jcHAKQEAgLTAsMCArMSwzODYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNy0yMDIwLCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmRuY2VydCwgYSBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50IHN5c3RlbSBiYXNlZCBvbiBORE4uCisgKgorICogbmRuY2VydCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG5jZXJ0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIG5kbmNlcnQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG5jZXJ0IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjaW5jbHVkZSAiZGV0YWlsL2NyeXB0by1oZWxwZXJzLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L2VuZGlhbi9jb252ZXJzaW9uLmhwcD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPG5kbi1jeHgvZW5jb2RpbmcvYnVmZmVyLXN0cmVhbS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS90cmFuc2Zvcm0vYmFzZTY0LWRlY29kZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS90cmFuc2Zvcm0vYmFzZTY0LWVuY29kZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS90cmFuc2Zvcm0vYnVmZmVyLXNvdXJjZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS90cmFuc2Zvcm0vc3RyZWFtLXNpbmsuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9yYW5kb20uaHBwPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wva2RmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgbmRuY2VydCB7CisKK0VDREhTdGF0ZTo6RUNESFN0YXRlKCkKK3sKKyAgYXV0byBFQ19OSUQgPSBOSURfWDlfNjJfcHJpbWUyNTZ2MTsKKyAgLy8gcGFyYW1zIGNvbnRleHQKKyAgRVZQX1BLRVlfQ1RYKiBjdHhfcGFyYW1zID0gRVZQX1BLRVlfQ1RYX25ld19pZChFVlBfUEtFWV9FQywgbnVsbHB0cik7CisgIGlmIChjdHhfcGFyYW1zID09IG51bGxwdHIpIHsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDb3VsZCBub3QgY3JlYXRlIGNvbnRleHQiKSk7CisgIH0KKyAgaWYgKEVWUF9QS0VZX3BhcmFtZ2VuX2luaXQoY3R4X3BhcmFtcykgIT0gMSkgeworICAgIEVWUF9QS0VZX0NUWF9mcmVlKGN0eF9wYXJhbXMpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNvdWxkIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciBnZW5lcmF0aW9uIikpOworICB9CisgIGlmICgxICE9IEVWUF9QS0VZX0NUWF9zZXRfZWNfcGFyYW1nZW5fY3VydmVfbmlkKGN0eF9wYXJhbXMsIEVDX05JRCkpIHsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShjdHhfcGFyYW1zKTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJMaWtlbHkgdW5rbm93biBlbGxpcHRpY2FsIGN1cnZlIElEIHNwZWNpZmllZCIpKTsKKyAgfQorICAvLyBnZW5lcmF0ZSBwYXJhbXMKKyAgRVZQX1BLRVkqIHBhcmFtcyA9IG51bGxwdHI7CisgIGlmICghRVZQX1BLRVlfcGFyYW1nZW4oY3R4X3BhcmFtcywgJnBhcmFtcykpIHsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShjdHhfcGFyYW1zKTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDb3VsZCBub3QgY3JlYXRlIHBhcmFtZXRlciBvYmplY3QgcGFyYW1ldGVycyIpKTsKKyAgfQorICAvLyBrZXkgZ2VuZXJhdGlvbiBjb250ZXh0CisgIEVWUF9QS0VZX0NUWCogY3R4X2tleWdlbiA9IEVWUF9QS0VZX0NUWF9uZXcocGFyYW1zLCBudWxscHRyKTsKKyAgaWYgKGN0eF9rZXlnZW4gPT0gbnVsbHB0cikgeworICAgIEVWUF9QS0VZX2ZyZWUocGFyYW1zKTsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShjdHhfcGFyYW1zKTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDb3VsZCBub3QgY3JlYXRlIHRoZSBjb250ZXh0IGZvciB0aGUga2V5IGdlbmVyYXRpb24iKSk7CisgIH0KKyAgaWYgKDEgIT0gRVZQX1BLRVlfa2V5Z2VuX2luaXQoY3R4X2tleWdlbikpIHsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShjdHhfa2V5Z2VuKTsKKyAgICBFVlBfUEtFWV9mcmVlKHBhcmFtcyk7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUoY3R4X3BhcmFtcyk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ291bGQgbm90IGluaXQgY29udGV4dCBmb3Iga2V5IGdlbmVyYXRpb24iKSk7CisgIH0KKyAgaWYgKDEgIT0gRVZQX1BLRVlfa2V5Z2VuKGN0eF9rZXlnZW4sICZtX3ByaXZrZXkpKSB7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUoY3R4X2tleWdlbik7CisgICAgRVZQX1BLRVlfZnJlZShwYXJhbXMpOworICAgIEVWUF9QS0VZX0NUWF9mcmVlKGN0eF9wYXJhbXMpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNvdWxkIG5vdCBnZW5lcmF0ZSBESEUga2V5cyBpbiBmaW5hbCBzdGVwIikpOworICB9CisgIEVWUF9QS0VZX0NUWF9mcmVlKGN0eF9rZXlnZW4pOworICBFVlBfUEtFWV9mcmVlKHBhcmFtcyk7CisgIEVWUF9QS0VZX0NUWF9mcmVlKGN0eF9wYXJhbXMpOworfQorCitFQ0RIU3RhdGU6On5FQ0RIU3RhdGUoKQoreworICBpZiAobV9wcml2a2V5ICE9IG51bGxwdHIpIHsKKyAgICBFVlBfUEtFWV9mcmVlKG1fcHJpdmtleSk7CisgIH0KK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mCitFQ0RIU3RhdGU6OmdldFNlbGZQdWJLZXkoKQoreworICBhdXRvIHByaXZFQ0tleSA9IEVWUF9QS0VZX2dldDFfRUNfS0VZKG1fcHJpdmtleSk7CisgIGlmIChwcml2RUNLZXkgPT0gbnVsbHB0cikgeworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNvdWxkIG5vdCBnZXQga2V5IHdoZW4gY2FsbGluZyBFVlBfUEtFWV9nZXQxX0VDX0tFWSgpIikpOworICB9CisgIGF1dG8gZWNQb2ludCA9IEVDX0tFWV9nZXQwX3B1YmxpY19rZXkocHJpdkVDS2V5KTsKKyAgYXV0byBncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKHByaXZFQ0tleSk7CisgIGF1dG8gcmVxdWlyZWRCdWZMZW4gPSBFQ19QT0lOVF9wb2ludDJvY3QoZ3JvdXAsIGVjUG9pbnQsIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELCBudWxscHRyLCAwLCBudWxscHRyKTsKKyAgbV9wdWJLZXkucmVzaXplKHJlcXVpcmVkQnVmTGVuKTsKKyAgYXV0byByZXYgPSBFQ19QT0lOVF9wb2ludDJvY3QoZ3JvdXAsIGVjUG9pbnQsIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3B1YktleS5kYXRhKCksIHJlcXVpcmVkQnVmTGVuLCBudWxscHRyKTsKKyAgRUNfS0VZX2ZyZWUocHJpdkVDS2V5KTsKKyAgaWYgKHJldiA9PSAwKSB7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ291bGQgbm90IGNvbnZlcnQgRUNfUE9JTlRTIHRvIG9jdGV0IHN0cmluZyB3aGVuIGNhbGxpbmcgRUNfUE9JTlRfcG9pbnQyb2N0KCkiKSk7CisgIH0KKyAgcmV0dXJuIG1fcHViS2V5OworfQorCitjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYKK0VDREhTdGF0ZTo6ZGVyaXZlU2VjcmV0KGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwZWVyS2V5KQoreworICAvLyBwcmVwYXJlIHNlbGYgcHJpdmF0ZSBrZXkKKyAgYXV0byBwcml2RUNLZXkgPSBFVlBfUEtFWV9nZXQxX0VDX0tFWShtX3ByaXZrZXkpOworICBpZiAocHJpdkVDS2V5ID09IG51bGxwdHIpIHsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDYW5ub3Qgbm90IGdldCBrZXkgd2hlbiBjYWxsaW5nIEVWUF9QS0VZX2dldDFfRUNfS0VZKCkiKSk7CisgIH0KKyAgYXV0byBncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKHByaXZFQ0tleSk7CisgIEVDX0tFWV9mcmVlKHByaXZFQ0tleSk7CisgIC8vIHByZXBhcmUgdGhlIHBlZXIgcHVibGljIGtleQorICBhdXRvIHBlZXJQb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCk7CisgIGlmIChwZWVyUG9pbnQgPT0gbnVsbHB0cikgeworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBjcmVhdGUgdGhlIEVDX1BPSU5UIGZvciBwZWVyIGtleSB3aGVuIGNhbGxpbmcgRUNfUE9JTlRfbmV3KCkiKSk7CisgIH0KKyAgaWYgKEVDX1BPSU5UX29jdDJwb2ludChncm91cCwgcGVlclBvaW50LCBwZWVyS2V5LmRhdGEoKSwgcGVlcktleS5zaXplKCksIG51bGxwdHIpID09IDApIHsKKyAgICBFQ19QT0lOVF9mcmVlKHBlZXJQb2ludCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IGNvbnZlcnQgcGVlcidzIGtleSBpbnRvIGEgRUMgcG9pbnQgd2hlbiBjYWxsaW5nIEVDX1BPSU5UX29jdDJwb2ludCgpIikpOworICB9CisgIEVDX0tFWSogZWNQZWVya2V5ID0gRUNfS0VZX25ldygpOworICBpZiAoZWNQZWVya2V5ID09IG51bGxwdHIpIHsKKyAgICBFQ19QT0lOVF9mcmVlKHBlZXJQb2ludCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IGNyZWF0ZSBFQ19LRVkgZm9yIHBlZXIga2V5IHdoZW4gY2FsbGluZyBFQ19LRVlfbmV3KCkiKSk7CisgIH0KKyAgaWYgKEVDX0tFWV9zZXRfZ3JvdXAoZWNQZWVya2V5LCBncm91cCkgIT0gMSkgeworICAgIEVDX1BPSU5UX2ZyZWUocGVlclBvaW50KTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDYW5ub3Qgc2V0IGdyb3VwIGZvciBwZWVyIGtleSdzIEVDX0tFWSB3aGVuIGNhbGxpbmcgRUNfS0VZX3NldF9ncm91cCgpIikpOworICB9CisgIGlmIChFQ19LRVlfc2V0X3B1YmxpY19rZXkoZWNQZWVya2V5LCBwZWVyUG9pbnQpID09IDApIHsKKyAgICBFQ19LRVlfZnJlZShlY1BlZXJrZXkpOworICAgIEVDX1BPSU5UX2ZyZWUocGVlclBvaW50KTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSBwZWVyIEVDX0tFWSB3aXRoIHRoZSBFQ19QT0lOVCB3aGVuIGNhbGxpbmcgRUNfS0VZX3NldF9wdWJsaWNfa2V5KCkiKSk7CisgIH0KKyAgRVZQX1BLRVkqIGV2cFBlZXJrZXkgPSBFVlBfUEtFWV9uZXcoKTsKKyAgaWYgKEVWUF9QS0VZX3NldDFfRUNfS0VZKGV2cFBlZXJrZXksIGVjUGVlcmtleSkgPT0gMCkgeworICAgIEVDX0tFWV9mcmVlKGVjUGVlcmtleSk7CisgICAgRUNfUE9JTlRfZnJlZShwZWVyUG9pbnQpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBjcmVhdGUgRVZQX1BLRVkgZm9yIHBlZXIga2V5IHdoZW4gY2FsbGluZyBFVlBfUEtFWV9uZXcoKSIpKTsKKyAgfQorICBFQ19LRVlfZnJlZShlY1BlZXJrZXkpOworICBFQ19QT0lOVF9mcmVlKHBlZXJQb2ludCk7CisgIC8vIEVDREggY29udGV4dAorICBFVlBfUEtFWV9DVFgqIGN0eCA9IEVWUF9QS0VZX0NUWF9uZXcobV9wcml2a2V5LCBudWxscHRyKTsKKyAgaWYgKGN0eCA9PSBudWxscHRyKSB7CisgICAgRVZQX1BLRVlfZnJlZShldnBQZWVya2V5KTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDYW5ub3QgY3JlYXRlIGNvbnRleHQgZm9yIEVDREggd2hlbiBjYWxsaW5nIEVWUF9QS0VZX0NUWF9uZXcoKSIpKTsKKyAgfQorICAvLyBJbml0aWFsaXplCisgIGlmICgxICE9IEVWUF9QS0VZX2Rlcml2ZV9pbml0KGN0eCkpIHsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShjdHgpOworICAgIEVWUF9QS0VZX2ZyZWUoZXZwUGVlcmtleSk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IGluaXRpYWxpemUgY29udGV4dCBmb3IgRUNESCB3aGVuIGNhbGxpbmcgRVZQX1BLRVlfZGVyaXZlX2luaXQoKSIpKTsKKyAgfQorICAvLyBQcm92aWRlIHRoZSBwZWVyIHB1YmxpYyBrZXkKKyAgaWYgKDEgIT0gRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyKGN0eCwgZXZwUGVlcmtleSkpIHsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShjdHgpOworICAgIEVWUF9QS0VZX2ZyZWUoZXZwUGVlcmtleSk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IHNldCBwZWVyIGtleSBmb3IgRUNESCB3aGVuIGNhbGxpbmcgRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyKCkiKSk7CisgIH0KKyAgLy8gRGV0ZXJtaW5lIGJ1ZmZlciBsZW5ndGggZm9yIHNoYXJlZCBzZWNyZXQKKyAgc2l6ZV90IHNlY3JldExlbiA9IDA7CisgIGlmICgxICE9IEVWUF9QS0VZX2Rlcml2ZShjdHgsIG51bGxwdHIsICZzZWNyZXRMZW4pKSB7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUoY3R4KTsKKyAgICBFVlBfUEtFWV9mcmVlKGV2cFBlZXJrZXkpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBkZXRlcm1pbmUgdGhlIG5lZWRlZCBidWZmZXIgbGVuZ3RoIHdoZW4gY2FsbGluZyBFVlBfUEtFWV9kZXJpdmUoKSIpKTsKKyAgfQorICBtX3NlY3JldC5yZXNpemUoc2VjcmV0TGVuKTsKKyAgLy8gRGVyaXZlIHRoZSBzaGFyZWQgc2VjcmV0CisgIGlmICgxICE9IChFVlBfUEtFWV9kZXJpdmUoY3R4LCBtX3NlY3JldC5kYXRhKCksICZzZWNyZXRMZW4pKSkgeworICAgIEVWUF9QS0VZX0NUWF9mcmVlKGN0eCk7CisgICAgRVZQX1BLRVlfZnJlZShldnBQZWVya2V5KTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDYW5ub3QgZGVyaXZlIEVDREggc2VjcmV0IHdoZW4gY2FsbGluZyBFVlBfUEtFWV9kZXJpdmUoKSIpKTsKKyAgfQorICBFVlBfUEtFWV9DVFhfZnJlZShjdHgpOworICBFVlBfUEtFWV9mcmVlKGV2cFBlZXJrZXkpOworICByZXR1cm4gbV9zZWNyZXQ7Cit9CisKK3ZvaWQKK2htYWNTaGEyNTYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFMZW4sCisgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwgc2l6ZV90IGtleUxlbiwKKyAgICAgICAgICAgdWludDhfdCogcmVzdWx0KQoreworICBhdXRvIHJldCA9IEhNQUMoRVZQX3NoYTI1NigpLCBrZXksIGtleUxlbiwKKyAgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGFMZW4sIHJlc3VsdCwgbnVsbHB0cik7CisgIGlmIChyZXQgPT0gbnVsbHB0cikgeworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkVycm9yIGNvbXB1dGluZyBITUFDIHdoZW4gY2FsbGluZyBITUFDKCkiKSk7CisgIH0KK30KKworc2l6ZV90Citoa2RmKGNvbnN0IHVpbnQ4X3QqIHNlY3JldCwgc2l6ZV90IHNlY3JldExlbiwgY29uc3QgdWludDhfdCogc2FsdCwKKyAgICAgc2l6ZV90IHNhbHRMZW4sIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dExlbiwKKyAgICAgY29uc3QgdWludDhfdCogaW5mbywgc2l6ZV90IGluZm9MZW4pCit7CisgIEVWUF9QS0VZX0NUWCogcGN0eCA9IEVWUF9QS0VZX0NUWF9uZXdfaWQoRVZQX1BLRVlfSEtERiwgbnVsbHB0cik7CisgIGlmIChFVlBfUEtFWV9kZXJpdmVfaW5pdChwY3R4KSA8PSAwKSB7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUocGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiSEtERjogQ2Fubm90IGluaXQgY3R4IHdoZW4gY2FsbGluZyBFVlBfUEtFWV9kZXJpdmVfaW5pdCgpIikpOworICB9CisgIGlmIChFVlBfUEtFWV9DVFhfc2V0X2hrZGZfbWQocGN0eCwgRVZQX3NoYTI1NigpKSA8PSAwKSB7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUocGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiSEtERjogQ2Fubm90IHNldCBtZCB3aGVuIGNhbGxpbmcgRVZQX1BLRVlfQ1RYX3NldF9oa2RmX21kKCkiKSk7CisgIH0KKyAgaWYgKEVWUF9QS0VZX0NUWF9zZXQxX2hrZGZfc2FsdChwY3R4LCBzYWx0LCBzYWx0TGVuKSA8PSAwKSB7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUocGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiSEtERjogQ2Fubm90IHNldCBzYWx0IHdoZW4gY2FsbGluZyBFVlBfUEtFWV9DVFhfc2V0MV9oa2RmX3NhbHQoKSIpKTsKKyAgfQorICBpZiAoRVZQX1BLRVlfQ1RYX3NldDFfaGtkZl9rZXkocGN0eCwgc2VjcmV0LCBzZWNyZXRMZW4pIDw9IDApIHsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShwY3R4KTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJIS0RGOiBDYW5ub3Qgc2V0IHNlY3JldCB3aGVuIGNhbGxpbmcgRVZQX1BLRVlfQ1RYX3NldDFfaGtkZl9rZXkoKSIpKTsKKyAgfQorICBpZiAoRVZQX1BLRVlfQ1RYX2FkZDFfaGtkZl9pbmZvKHBjdHgsIGluZm8sIGluZm9MZW4pIDw9IDApIHsKKyAgICBFVlBfUEtFWV9DVFhfZnJlZShwY3R4KTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJIS0RGOiBDYW5ub3Qgc2V0IGluZm8gd2hlbiBjYWxsaW5nIEVWUF9QS0VZX0NUWF9hZGQxX2hrZGZfaW5mbygpIikpOworICB9CisgIHNpemVfdCBvdXRMZW4gPSBvdXRwdXRMZW47CisgIGlmIChFVlBfUEtFWV9kZXJpdmUocGN0eCwgb3V0cHV0LCAmb3V0TGVuKSA8PSAwKSB7CisgICAgRVZQX1BLRVlfQ1RYX2ZyZWUocGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiSEtERjogQ2Fubm90IGRlcml2ZSByZXN1bHQgd2hlbiBjYWxsaW5nIEVWUF9QS0VZX2Rlcml2ZSgpIikpOworICB9CisgIEVWUF9QS0VZX0NUWF9mcmVlKHBjdHgpOworICByZXR1cm4gb3V0TGVuOworfQorCitzaXplX3QKK2Flc0djbTEyOEVuY3J5cHQoY29uc3QgdWludDhfdCogcGxhaW50ZXh0LCBzaXplX3QgcGxhaW50ZXh0TGVuLCBjb25zdCB1aW50OF90KiBhc3NvY2lhdGVkLCBzaXplX3QgYXNzb2NpYXRlZExlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LCBjb25zdCB1aW50OF90KiBpdiwgdWludDhfdCogY2lwaGVydGV4dCwgdWludDhfdCogdGFnKQoreworICBFVlBfQ0lQSEVSX0NUWCogY3R4OworICBpbnQgbGVuOworICBzaXplX3QgY2lwaGVydGV4dExlbjsKKyAgaWYgKCEoY3R4ID0gRVZQX0NJUEhFUl9DVFhfbmV3KCkpKSB7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IGNyZWF0ZSBhbmQgaW5pdGlhbGlzZSB0aGUgY29udGV4dCB3aGVuIGNhbGxpbmcgRVZQX0NJUEhFUl9DVFhfbmV3KCkiKSk7CisgIH0KKyAgaWYgKDEgIT0gRVZQX0VuY3J5cHRJbml0X2V4KGN0eCwgRVZQX2Flc18xMjhfZ2NtKCksIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBpbml0aWFsaXplIHRoZSBlbmNyeXB0aW9uIG9wZXJhdGlvbiB3aGVuIGNhbGxpbmcgRVZQX0VuY3J5cHRJbml0X2V4KCkiKSk7CisgIH0KKyAgaWYgKDEgIT0gRVZQX0NJUEhFUl9DVFhfY3RybChjdHgsIEVWUF9DVFJMX0dDTV9TRVRfSVZMRU4sIDEyLCBudWxscHRyKSkgeworICAgIEVWUF9DSVBIRVJfQ1RYX2ZyZWUoY3R4KTsKKyAgICBORE5fVEhST1coc3RkOjpydW50aW1lX2Vycm9yKCJDYW5ub3Qgc2V0IElWIGxlbmd0aCB3aGVuIGNhbGxpbmcgRVZQX0NJUEhFUl9DVFhfY3RybCgpIikpOworICB9CisgIGlmICgxICE9IEVWUF9FbmNyeXB0SW5pdF9leChjdHgsIG51bGxwdHIsIG51bGxwdHIsIGtleSwgaXYpKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBpbml0aWFsaXplIGtleSBhbmQgSVYgd2hlbiBjYWxsaW5nIEVWUF9FbmNyeXB0SW5pdF9leCgpIikpOworICB9CisgIGlmICgxICE9IEVWUF9FbmNyeXB0VXBkYXRlKGN0eCwgbnVsbHB0ciwgJmxlbiwgYXNzb2NpYXRlZCwgYXNzb2NpYXRlZExlbikpIHsKKyAgICBFVlBfQ0lQSEVSX0NUWF9mcmVlKGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IHNldCBhc3NvY2lhdGVkIGF1dGhlbnRpY2F0aW9uIGRhdGEgd2hlbiBjYWxsaW5nIEVWUF9FbmNyeXB0VXBkYXRlKCkiKSk7CisgIH0KKyAgaWYgKDEgIT0gRVZQX0VuY3J5cHRVcGRhdGUoY3R4LCBjaXBoZXJ0ZXh0LCAmbGVuLCBwbGFpbnRleHQsIHBsYWludGV4dExlbikpIHsKKyAgICBFVlBfQ0lQSEVSX0NUWF9mcmVlKGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IGVuY3J5cHQgd2hlbiBjYWxsaW5nIEVWUF9FbmNyeXB0VXBkYXRlKCkiKSk7CisgIH0KKyAgY2lwaGVydGV4dExlbiA9IGxlbjsKKyAgaWYgKDEgIT0gRVZQX0VuY3J5cHRGaW5hbF9leChjdHgsIGNpcGhlcnRleHQgKyBsZW4sICZsZW4pKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBmaW5hbGlzZSB0aGUgZW5jcnlwdGlvbiB3aGVuIGNhbGxpbmcgRVZQX0VuY3J5cHRGaW5hbF9leCgpIikpOworICB9CisgIGNpcGhlcnRleHRMZW4gKz0gbGVuOworICBpZiAoMSAhPSBFVlBfQ0lQSEVSX0NUWF9jdHJsKGN0eCwgRVZQX0NUUkxfR0NNX0dFVF9UQUcsIDE2LCB0YWcpKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBnZXQgdGFnIHdoZW4gY2FsbGluZyBFVlBfQ0lQSEVSX0NUWF9jdHJsKCkiKSk7CisgIH0KKyAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICByZXR1cm4gY2lwaGVydGV4dExlbjsKK30KKworc2l6ZV90CithZXNHY20xMjhEZWNyeXB0KGNvbnN0IHVpbnQ4X3QqIGNpcGhlcnRleHQsIHNpemVfdCBjaXBoZXJ0ZXh0TGVuLCBjb25zdCB1aW50OF90KiBhc3NvY2lhdGVkLCBzaXplX3QgYXNzb2NpYXRlZExlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdGFnLCBjb25zdCB1aW50OF90KiBrZXksIGNvbnN0IHVpbnQ4X3QqIGl2LCB1aW50OF90KiBwbGFpbnRleHQpCit7CisgIEVWUF9DSVBIRVJfQ1RYKiBjdHg7CisgIGludCBsZW47CisgIHNpemVfdCBwbGFpbnRleHRMZW47CisgIGlmICghKGN0eCA9IEVWUF9DSVBIRVJfQ1RYX25ldygpKSkgeworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBjcmVhdGUgYW5kIGluaXRpYWxpc2UgdGhlIGNvbnRleHQgd2hlbiBjYWxsaW5nIEVWUF9DSVBIRVJfQ1RYX25ldygpIikpOworICB9CisgIGlmICghRVZQX0RlY3J5cHRJbml0X2V4KGN0eCwgRVZQX2Flc18xMjhfZ2NtKCksIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBpbml0aWFsaXNlIHRoZSBkZWNyeXB0aW9uIG9wZXJhdGlvbiB3aGVuIGNhbGxpbmcgRVZQX0RlY3J5cHRJbml0X2V4KCkiKSk7CisgIH0KKyAgaWYgKCFFVlBfQ0lQSEVSX0NUWF9jdHJsKGN0eCwgRVZQX0NUUkxfR0NNX1NFVF9JVkxFTiwgMTIsIG51bGxwdHIpKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBzZXQgSVYgbGVuZ3RoIHdoZW4gY2FsbGluZyBFVlBfQ0lQSEVSX0NUWF9jdHJsIikpOworICB9CisgIGlmICghRVZQX0RlY3J5cHRJbml0X2V4KGN0eCwgbnVsbHB0ciwgbnVsbHB0ciwga2V5LCBpdikpIHsKKyAgICBFVlBfQ0lQSEVSX0NUWF9mcmVlKGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IGluaXRpYWxpc2Uga2V5IGFuZCBJViB3aGVuIGNhbGxpbmcgRVZQX0RlY3J5cHRJbml0X2V4KCkiKSk7CisgIH0KKyAgaWYgKCFFVlBfRGVjcnlwdFVwZGF0ZShjdHgsIG51bGxwdHIsICZsZW4sIGFzc29jaWF0ZWQsIGFzc29jaWF0ZWRMZW4pKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBzZXQgYXNzb2NpYXRlZCBhdXRoZW50aWNhdGlvbiBkYXRhIHdoZW4gY2FsbGluZyBFVlBfRW5jcnlwdFVwZGF0ZSgpIikpOworICB9CisgIGlmICghRVZQX0RlY3J5cHRVcGRhdGUoY3R4LCBwbGFpbnRleHQsICZsZW4sIGNpcGhlcnRleHQsIGNpcGhlcnRleHRMZW4pKSB7CisgICAgRVZQX0NJUEhFUl9DVFhfZnJlZShjdHgpOworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBkZWNyeXB0IHdoZW4gY2FsbGluZyBFVlBfRGVjcnlwdFVwZGF0ZSgpIikpOworICB9CisgIHBsYWludGV4dExlbiA9IGxlbjsKKyAgaWYgKCFFVlBfQ0lQSEVSX0NUWF9jdHJsKGN0eCwgRVZQX0NUUkxfR0NNX1NFVF9UQUcsIDE2LCBjb25zdF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPih0YWcpKSkpIHsKKyAgICBFVlBfQ0lQSEVSX0NUWF9mcmVlKGN0eCk7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiQ2Fubm90IHNldCB0YWcgdmFsdWUgd2hlbiBjYWxsaW5nIEVWUF9DSVBIRVJfQ1RYX2N0cmwoKSIpKTsKKyAgfQorICBhdXRvIHJldCA9IEVWUF9EZWNyeXB0RmluYWxfZXgoY3R4LCBwbGFpbnRleHQgKyBsZW4sICZsZW4pOworICBFVlBfQ0lQSEVSX0NUWF9mcmVlKGN0eCk7CisgIGlmIChyZXQgPiAwKSB7CisgICAgcGxhaW50ZXh0TGVuICs9IGxlbjsKKyAgICByZXR1cm4gcGxhaW50ZXh0TGVuOworICB9CisgIGVsc2UgeworICAgIE5ETl9USFJPVyhzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNhbm5vdCBmaW5hbGl6ZSB0aGUgZGVjcnlwdGlvbiB3aGVuIGNhbGxpbmcgRVZQX0RlY3J5cHRGaW5hbF9leCgpIikpOworICB9Cit9CisKK0Jsb2NrCitlbmNvZGVCbG9ja1dpdGhBZXNHY20xMjgodWludDMyX3QgdGx2VHlwZSwgY29uc3QgdWludDhfdCoga2V5LCBjb25zdCB1aW50OF90KiBwYXlsb2FkLCBzaXplX3QgcGF5bG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYXNzb2NpYXRlZERhdGEsIHNpemVfdCBhc3NvY2lhdGVkRGF0YVNpemUsIHVpbnQzMl90JiBjb3VudGVyKQoreworICBCdWZmZXIgaXYoMTIpOworICByYW5kb206OmdlbmVyYXRlU2VjdXJlQnl0ZXMoaXYuZGF0YSgpLCA4KTsKKyAgaWYgKHRsdlR5cGUgPT0gbmRuOjp0bHY6OkFwcGxpY2F0aW9uUGFyYW1ldGVycykgeworICAgIC8vIHJlcXVlc3RlcgorICAgIGl2WzBdICY9IH4oMVVMIDw8IDcpOworICB9CisgIGVsc2UgeworICAgIC8vIENBCisgICAgaXZbMF0gfD0gMVVMIDw8IDc7CisgIH0KKyAgdWludDMyX3QgdGVtcCA9IGJvb3N0OjplbmRpYW46Om5hdGl2ZV90b19iaWcoY291bnRlcik7CisgIHN0ZDo6bWVtY3B5KCZpdls4XSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJnRlbXApLCA0KTsKKyAgdWludDMyX3QgaW5jcmVtZW50ID0gKHBheWxvYWRTaXplICsgMTUpIC8gMTY7CisgIGlmIChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkgLSBjb3VudGVyIDwgaW5jcmVtZW50KSB7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiRXJyb3IgaW5jcmVtZW50aW5nIHRoZSBBRVMgYmxvY2sgY291bnRlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IGJsb2NrcyBoYXZlIGJlZW4gZW5jcnlwdGVkIGZvciB0aGUgc2FtZSByZXF1ZXN0IGluc3RhbmNlIikpOworICB9CisgIGVsc2UgeworICAgIGNvdW50ZXIgKz0gaW5jcmVtZW50OworICB9CisKKyAgLy8gVGhlIHNwZWMgb2YgQUVTIGVuY3J5cHRlZCBwYXlsb2FkIFRMViB1c2VkIGluIE5ETkNFUlQ6CisgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvbmRuY2VydC93aWtpL05ETkNFUlQtUHJvdG9jb2wtMC4zIzI0Mi1hZXMtZ2NtLWVuY3J5cHRpb24KKyAgQnVmZmVyIGVuY3J5cHRlZFBheWxvYWQocGF5bG9hZFNpemUpOworICB1aW50OF90IHRhZ1sxNl07CisgIHNpemVfdCBlbmNyeXB0ZWRQYXlsb2FkTGVuID0gYWVzR2NtMTI4RW5jcnlwdChwYXlsb2FkLCBwYXlsb2FkU2l6ZSwgYXNzb2NpYXRlZERhdGEsIGFzc29jaWF0ZWREYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgaXYuZGF0YSgpLCBlbmNyeXB0ZWRQYXlsb2FkLmRhdGEoKSwgdGFnKTsKKyAgYXV0byBjb250ZW50ID0gbWFrZUVtcHR5QmxvY2sodGx2VHlwZSk7CisgIGNvbnRlbnQucHVzaF9iYWNrKG1ha2VCaW5hcnlCbG9jayh0bHY6OkluaXRpYWxpemF0aW9uVmVjdG9yLCBpdi5kYXRhKCksIGl2LnNpemUoKSkpOworICBjb250ZW50LnB1c2hfYmFjayhtYWtlQmluYXJ5QmxvY2sodGx2OjpBdXRoZW50aWNhdGlvblRhZywgdGFnLCAxNikpOworICBjb250ZW50LnB1c2hfYmFjayhtYWtlQmluYXJ5QmxvY2sodGx2OjpFbmNyeXB0ZWRQYXlsb2FkLCBlbmNyeXB0ZWRQYXlsb2FkLmRhdGEoKSwgZW5jcnlwdGVkUGF5bG9hZExlbikpOworICBjb250ZW50LmVuY29kZSgpOworICByZXR1cm4gY29udGVudDsKK30KKworQnVmZmVyCitkZWNvZGVCbG9ja1dpdGhBZXNHY20xMjgoY29uc3QgQmxvY2smIGJsb2NrLCBjb25zdCB1aW50OF90KiBrZXksIGNvbnN0IHVpbnQ4X3QqIGFzc29jaWF0ZWREYXRhLCBzaXplX3QgYXNzb2NpYXRlZERhdGFTaXplKQoreworICAvLyBUaGUgc3BlYyBvZiBBRVMgZW5jcnlwdGVkIHBheWxvYWQgVExWIHVzZWQgaW4gTkROQ0VSVDoKKyAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG5jZXJ0L3dpa2kvTkROQ0VSVC1Qcm90b2NvbC0wLjMjMjQyLWFlcy1nY20tZW5jcnlwdGlvbgorICBibG9jay5wYXJzZSgpOworICBjb25zdCBhdXRvJiBlbmNyeXB0ZWRQYXlsb2FkQmxvY2sgPSBibG9jay5nZXQodGx2OjpFbmNyeXB0ZWRQYXlsb2FkKTsKKyAgQnVmZmVyIHJlc3VsdChlbmNyeXB0ZWRQYXlsb2FkQmxvY2sudmFsdWVfc2l6ZSgpKTsKKyAgYXV0byByZXN1bHRMZW4gPSBhZXNHY20xMjhEZWNyeXB0KGVuY3J5cHRlZFBheWxvYWRCbG9jay52YWx1ZSgpLCBlbmNyeXB0ZWRQYXlsb2FkQmxvY2sudmFsdWVfc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZERhdGEsIGFzc29jaWF0ZWREYXRhU2l6ZSwgYmxvY2suZ2V0KHRsdjo6QXV0aGVudGljYXRpb25UYWcpLnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIGJsb2NrLmdldCh0bHY6OkluaXRpYWxpemF0aW9uVmVjdG9yKS52YWx1ZSgpLCByZXN1bHQuZGF0YSgpKTsKKyAgaWYgKHJlc3VsdExlbiAhPSBlbmNyeXB0ZWRQYXlsb2FkQmxvY2sudmFsdWVfc2l6ZSgpKSB7CisgICAgTkROX1RIUk9XKHN0ZDo6cnVudGltZV9lcnJvcigiRXJyb3Igd2hlbiBkZWNyeXB0aW5nIHRoZSBBRVMgRW5jcnlwdGVkIEJsb2NrOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjcnlwdGVkIHBheWxvYWQgaXMgb2YgYW4gdW5leHBlY3RlZCBzaXplIikpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5kbmNlcnQKK30gLy8gbmFtZXNwYWNlIG5kbgpkaWZmIC0tZ2l0IGEvc3JjL2RldGFpbC9jcnlwdG8taGVscGVycy5ocHAgYi9zcmMvZGV0YWlsL2NyeXB0by1oZWxwZXJzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ0NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2RldGFpbC9jcnlwdG8taGVscGVycy5ocHAKQEAgLTAsMCArMSwxNzMgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNy0yMDIwLCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmRuY2VydCwgYSBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50IHN5c3RlbSBiYXNlZCBvbiBORE4uCisgKgorICogbmRuY2VydCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG5jZXJ0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIG5kbmNlcnQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG5jZXJ0IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjaWZuZGVmIE5ETkNFUlRfREVUQUlMX0NSWVBUT19IRUxQRVJTX0hQUAorI2RlZmluZSBORE5DRVJUX0RFVEFJTF9DUllQVE9fSEVMUEVSU19IUFAKKworI2luY2x1ZGUgImRldGFpbC9uZG5jZXJ0LWNvbW1vbi5ocHAiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgbmRuY2VydCB7CisKKy8qKgorICogQGJyaWVmIFN0YXRlIGZvciBFQ0RILgorICoKKyAqIFRoZSBFQ0RIIGlzIGJhc2VkIG9uIHByaW1lMjU2djEuCisgKi8KK2NsYXNzIEVDREhTdGF0ZSA6IG5vbmNvcHlhYmxlCit7CitwdWJsaWM6CisgIEVDREhTdGF0ZSgpOworICB+RUNESFN0YXRlKCk7CisKKyAgLyoqCisgICAqIEBicmllZiBEZXJpdmUgRUNESCBzZWNyZXQgZnJvbSBwZWVyJ3MgRUMgcHVibGljIGtleSBhbmQgc2VsZidzIHByaXZhdGUga2V5LgorICAgKgorICAgKiBAcGFyYW0gcGVlcmtleSBQZWVyJ3MgRUMgcHVibGljIGtleSBpbiB0aGUgdW5jb21wcmVzc2VkIG9jdGV0IHN0cmluZyBmb3JtYXQuCisgICAqICAgICAgICAgICAgICAgIFNlZSBkZXRhaWxzIGluIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvbWFuMS4xLjEvbWFuMy9FQ19QT0lOVF9wb2ludDJvY3QuaHRtbC4KKyAgICogQHJldHVybiBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdGhlIGRlcml2ZWQgc2VjcmV0LgorICAgKi8KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mCisgIGRlcml2ZVNlY3JldChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGVlcmtleSk7CisKKyAgLyoqCisgICAqIEBicmllZiBHZXQgdGhlIFNlbGYgUHViIEtleSBvYmplY3QKKyAgICoKKyAgICogQHJldHVybiBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdGhlIFNlbGYgcHVibGljIGtleSBpbiB0aGUgdW5jb21wcmVzc2VkIG9jdCBzdHJpbmcgZm9ybWF0LgorICAgKiAgICAgICAgIFNlZSBkZXRhaWxzIGluIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvbWFuMS4xLjEvbWFuMy9FQ19QT0lOVF9wb2ludDJvY3QuaHRtbC4KKyAgICovCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JgorICBnZXRTZWxmUHViS2V5KCk7CisKK3ByaXZhdGU6CisgIEVWUF9QS0VZKiBtX3ByaXZrZXkgPSBudWxscHRyOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX3B1YktleTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9zZWNyZXQ7Cit9OworCisvKioKKyAqIEBicmllZiBITUFDIGJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIChIS0RGKS4KKyAqCisgKiBAcGFyYW0gc2VjcmV0IFRoZSBpbnB1dCB0byB0aGUgSEtERi4KKyAqIEBwYXJhbSBzZWNyZXRMZW4gVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0LgorICogQHBhcmFtIHNhbHQgVGhlIHNhbHQgdXNlZCBpbiBIS0RGLgorICogQHBhcmFtIHNhbHRMZW4gVGhlIGxlbmd0aCBvZiB0aGUgc2FsdC4KKyAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBvZiB0aGUgSEtERi4KKyAqIEBwYXJhbSBvdXRwdXRMZW4gVGhlIGxlbmd0aCBvZiBleHBlY3RlZCBvdXRwdXQuCisgKiBAcGFyYW0gaW5mbyBUaGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB1c2VkIGluIEhLREYuCisgKiBAcGFyYW0gaW5mb0xlbiBUaGUgbGVuZ3RoIG9mIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICogQHJldHVybiBzaXplX3QgVGhlIGxlbmd0aCBvZiB0aGUgZGVyaXZlZCBrZXkgaWYgc3VjY2Vzc2Z1bC4KKyAqLworc2l6ZV90Citoa2RmKGNvbnN0IHVpbnQ4X3QqIHNlY3JldCwgc2l6ZV90IHNlY3JldExlbiwKKyAgICAgY29uc3QgdWludDhfdCogc2FsdCwgc2l6ZV90IHNhbHRMZW4sCisgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dExlbiwKKyAgICAgY29uc3QgdWludDhfdCogaW5mbyA9IG51bGxwdHIsIHNpemVfdCBpbmZvTGVuID0gMCk7CisKKy8qKgorICogQGJyaWVmIEhNQUMgYmFzZWQgb24gU0hBLTI1Ni4KKyAqCisgKiBAcGFyYW0gZGF0YSBUaGUgaW50cHV0IGFycmF5IHRvIGhtYWMuCisgKiBAcGFyYW0gZGF0YUxlbiBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBhcnJheS4KKyAqIEBwYXJhbSBrZXkgVGhlIEhNQUMga2V5LgorICogQHBhcmFtIGtleUxlbiBUaGUgbGVuZ3RoIG9mIHRoZSBITUFDIGtleS4KKyAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdCBvZiB0aGUgSE1BQy4gRW5vdWdoIG1lbW9yeSAoMzIgQnl0ZXMpIG11c3QgYmUgYWxsb2NhdGVkIGJlZm9yZWhhbmRzLgorICogQHRocm93IHJ1bnRpbWVfZXJyb3Igd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgdW5kZXJseWluZyBITUFDLgorICovCit2b2lkCitobWFjU2hhMjU2KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhTGVuLAorICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXksIHNpemVfdCBrZXlMZW4sCisgICAgICAgICAgIHVpbnQ4X3QqIHJlc3VsdCk7CisKKy8qKgorICogQGJyaWVmIEF1dGhlbnRpY2F0ZWQgR0NNIDEyOCBFbmNyeXB0aW9uIHdpdGggYXNzb2NpYXRlZCBkYXRhLgorICoKKyAqIEBwYXJhbSBwbGFpbnRleHQgVGhlIHBsYWludGV4dC4KKyAqIEBwYXJhbSBwbGFpbnRleHRMZW4gVGhlIHNpemUgb2YgcGxhaW50ZXh0LgorICogQHBhcmFtIGFzc29jaWF0ZWQgVGhlIGFzc29jaWF0ZWQgYXV0aGVudGljYXRpb24gZGF0YS4KKyAqIEBwYXJhbSBhc3NvY2lhdGVkTGVuIFRoZSBzaXplIG9mIGFzc29jaWF0ZWQgYXV0aGVudGljYXRpb24gZGF0YS4KKyAqIEBwYXJhbSBrZXkgMTYgYnl0ZXMgQUVTIGtleS4KKyAqIEBwYXJhbSBpdiAxMiBieXRlcyBJVi4KKyAqIEBwYXJhbSBjaXBoZXJ0ZXh0IFRoZSBvdXRwdXQgYW5kIGVub3VnaCBtZW1vcnkgbXVzdCBiZSBhbGxvY2F0ZWQgYmVmb3JlaGFuZHMuCisgKiBAcGFyYW0gdGFnIDE2IGJ5dGVzIHRhZy4KKyAqIEByZXR1cm4gc2l6ZV90IFRoZSBzaXplIG9mIGNpcGhlcnRleHQuCisgKiBAdGhyb3cgcnVudGltZV9lcnJvciBXaGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBwcm9jZXNzIG9mIGVuY3J5cHRpb24uCisgKi8KK3NpemVfdAorYWVzR2NtMTI4RW5jcnlwdChjb25zdCB1aW50OF90KiBwbGFpbnRleHQsIHNpemVfdCBwbGFpbnRleHRMZW4sIGNvbnN0IHVpbnQ4X3QqIGFzc29jaWF0ZWQsIHNpemVfdCBhc3NvY2lhdGVkTGVuLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXksIGNvbnN0IHVpbnQ4X3QqIGl2LCB1aW50OF90KiBjaXBoZXJ0ZXh0LCB1aW50OF90KiB0YWcpOworCisvKioKKyAqIEBicmllZiBBdXRoZW50aWNhdGVkIEdDTSAxMjggRGVjcnlwdGlvbiB3aXRoIGFzc29jaWF0ZWQgZGF0YS4KKyAqCisgKiBAcGFyYW0gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dC4KKyAqIEBwYXJhbSBjaXBoZXJ0ZXh0TGVuIFRoZSBzaXplIG9mIGNpcGhlcnRleHQuCisgKiBAcGFyYW0gYXNzb2NpYXRlZCBUaGUgYXNzb2NpYXRlZCBhdXRoZW50aWNhdGlvbiBkYXRhLgorICogQHBhcmFtIGFzc29jaWF0ZWRMZW4gVGhlIHNpemUgb2YgYXNzb2NpYXRlZCBhdXRoZW50aWNhdGlvbiBkYXRhLgorICogQHBhcmFtIHRhZyAxNiBieXRlcyB0YWcuCisgKiBAcGFyYW0ga2V5IDE2IGJ5dGVzIEFFUyBrZXkuCisgKiBAcGFyYW0gaXYgMTIgYnl0ZXMgSVYuCisgKiBAcGFyYW0gcGxhaW50ZXh0IFRoZSBvdXRwdXQgYW5kIGVub3VnaCBtZW1vcnkgbXVzdCBiZSBhbGxvY2F0ZWQgYmVmb3JlaGFuZHMuCisgKiBAcmV0dXJuIHNpemVfdCBUaGUgc2l6ZSBvZiBwbGFpbnRleHQuCisgKiBAdGhyb3cgcnVudGltZV9lcnJvciBXaGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBwcm9jZXNzIG9mIGRlY3J5cHRpb24uCisgKi8KK3NpemVfdAorYWVzR2NtMTI4RGVjcnlwdChjb25zdCB1aW50OF90KiBjaXBoZXJ0ZXh0LCBzaXplX3QgY2lwaGVydGV4dExlbiwgY29uc3QgdWludDhfdCogYXNzb2NpYXRlZCwgc2l6ZV90IGFzc29jaWF0ZWRMZW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhZywgY29uc3QgdWludDhfdCoga2V5LCBjb25zdCB1aW50OF90KiBpdiwgdWludDhfdCogcGxhaW50ZXh0KTsKKworLyoqCisgKiBAYnJpZWYgRW5jb2RlIHRoZSBwYXlsb2FkIGludG8gVExWIGJsb2NrIHdpdGggQXV0aGVudGljYXRlZCBHQ00gMTI4IEVuY3J5cHRpb24uCisgKgorICogVGhlIFRMViBzcGVjOiBodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG5jZXJ0L3dpa2kvTkROQ0VSVC1Qcm90b2NvbC0wLjMjMjQyLWFlcy1nY20tZW5jcnlwdGlvbi4KKyAqCisgKiBAcGFyYW0gdGx2X3R5cGUgVGhlIFRMViBUWVBFIG9mIHRoZSBlbmNvZGVkIGJsb2NrLCBlaXRoZXIgQXBwbGljYXRpb25QYXJhbWV0ZXJzIG9yIENvbnRlbnQuCisgKiBAcGFyYW0ga2V5IFRoZSBBRVMga2V5IHVzZWQgZm9yIGVuY3J5cHRpb24uCisgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcGxhaW50ZXh0IHBheWxvYWQuCisgKiBAcGFyYW0gcGF5bG9hZFNpemUgVGhlIHNpemUgb2YgdGhlIHBsYWludGV4dCBwYXlsb2FkLgorICogQHBhcmFtIGFzc29jaWF0ZWREYXRhIFRoZSBhc3NvY2lhdGVkIGRhdGEgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisgKiBAcGFyYW0gYXNzb2NpYXRlZERhdGFTaXplIFRoZSBzaXplIG9mIGFzc29jaWF0ZWQgZGF0YS4KKyAqIEBwYXJhbSBjb3VudGVyIEFuIG9wYXF1ZSBjb3VudGVyIHRoYXQgbXVzdCBiZSBwYXNzZWQgdG8gc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiB0aGlzIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgICB3aXRoIHRoZSBzYW1lIEBwIGtleS4KKyAqIEByZXR1cm4gQmxvY2sgVGhlIFRMViBibG9jayB3aXRoIEBwIHRsdl90eXBlIFRMViBUWVBFLgorICovCitCbG9jaworZW5jb2RlQmxvY2tXaXRoQWVzR2NtMTI4KHVpbnQzMl90IHRsdlR5cGUsIGNvbnN0IHVpbnQ4X3QqIGtleSwgY29uc3QgdWludDhfdCogcGF5bG9hZCwgc2l6ZV90IHBheWxvYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFzc29jaWF0ZWREYXRhLCBzaXplX3QgYXNzb2NpYXRlZERhdGFTaXplLCB1aW50MzJfdCYgY291bnRlcik7CisKKy8qKgorICogQGJyaWVmIERlY29kZSB0aGUgcGF5bG9hZCBmcm9tIFRMViBibG9jayB3aXRoIEF1dGhlbnRpY2F0ZWQgR0NNIDEyOCBFbmNyeXB0aW9uLgorICoKKyAqIFRoZSBUTFYgc3BlYzogaHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvbmRuY2VydC93aWtpL05ETkNFUlQtUHJvdG9jb2wtMC4zIzI0Mi1hZXMtZ2NtLWVuY3J5cHRpb24uCisgKgorICogQHBhcmFtIGJsb2NrIFRoZSBUTFYgYmxvY2sgaW4gdGhlIGZvcm1hdCBvZiBORE5DRVJUIHByb3RvY29sLgorICogQHBhcmFtIGtleSBUaGUgQUVTIGtleSB1c2VkIGZvciBlbmNyeXB0aW9uLgorICogQHBhcmFtIGFzc29jaWF0ZWREYXRhIFRoZSBhc3NvY2lhdGVkIGRhdGEgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisgKiBAcGFyYW0gYXNzb2NpYXRlZERhdGFTaXplIFRoZSBzaXplIG9mIGFzc29jaWF0ZWQgZGF0YS4KKyAqIEByZXR1cm4gQnVmZmVyIFRoZSBwbGFpbnRleHQgYnVmZmVyLgorICovCitCdWZmZXIKK2RlY29kZUJsb2NrV2l0aEFlc0djbTEyOChjb25zdCBCbG9jayYgYmxvY2ssIGNvbnN0IHVpbnQ4X3QqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhc3NvY2lhdGVkRGF0YSwgc2l6ZV90IGFzc29jaWF0ZWREYXRhU2l6ZSk7CisKK30gLy8gbmFtZXNwYWNlIG5kbmNlcnQKK30gLy8gbmFtZXNwYWNlIG5kbgorCisjZW5kaWYgLy8gTkROQ0VSVF9ERVRBSUxfQ1JZUFRPX0hFTFBFUlNfSFBQCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlsL25kbmNlcnQtY29tbW9uLmNwcCBiL3NyYy9kZXRhaWwvbmRuY2VydC1jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjEwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGV0YWlsL25kbmNlcnQtY29tbW9uLmNwcApAQCAtMCwwICsxLDU5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG5kbmNlcnQsIGEgY2VydGlmaWNhdGUgbWFuYWdlbWVudCBzeXN0ZW0gYmFzZWQgb24gTkROLgorICoKKyAqIG5kbmNlcnQgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbmRuY2VydCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBuZG5jZXJ0LCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgbmRuY2VydCBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKi8KKworI2luY2x1ZGUgImRldGFpbC9uZG5jZXJ0LWNvbW1vbi5ocHAiCisKK25hbWVzcGFjZSBuZG4geworbmFtZXNwYWNlIG5kbmNlcnQgeworCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBFcnJvckNvZGUgY29kZSkKK3sKKyAgc3dpdGNoIChjb2RlKSB7CisgICAgY2FzZSBFcnJvckNvZGU6Ok5PX0VSUk9SOiBvdXQgPDwgIk5PX0VSUk9SIjsgYnJlYWs7CisgICAgY2FzZSBFcnJvckNvZGU6OkJBRF9JTlRFUkVTVF9GT1JNQVQ6IG91dCA8PCAiQkFEX0lOVEVSRVNUX0ZPUk1BVCI7IGJyZWFrOworICAgIGNhc2UgRXJyb3JDb2RlOjpCQURfUEFSQU1FVEVSX0ZPUk1BVDogb3V0IDw8ICJCQURfUEFSQU1FVEVSX0ZPUk1BVCI7IGJyZWFrOworICAgIGNhc2UgRXJyb3JDb2RlOjpCQURfU0lHTkFUVVJFOiBvdXQgPDwgIkJBRF9TSUdOQVRVUkUiOyBicmVhazsKKyAgICBjYXNlIEVycm9yQ29kZTo6SU5WQUxJRF9QQVJBTUVURVI6IG91dCA8PCAiSU5WQUxJRF9QQVJBTUVURVIiOyBicmVhazsKKyAgICBjYXNlIEVycm9yQ29kZTo6TkFNRV9OT1RfQUxMT1dFRDogb3V0IDw8ICJOQU1FX05PVF9BTExPV0VEIjsgYnJlYWs7CisgICAgY2FzZSBFcnJvckNvZGU6OkJBRF9WQUxJRElUWV9QRVJJT0Q6IG91dCA8PCAiQkFEX1ZBTElESVRZX1BFUklPRCI7IGJyZWFrOworICAgIGNhc2UgRXJyb3JDb2RlOjpPVVRfT0ZfVFJJRVM6IG91dCA8PCAiT1VUX09GX1RSSUVTIjsgYnJlYWs7CisgICAgY2FzZSBFcnJvckNvZGU6Ok9VVF9PRl9USU1FOiBvdXQgPDwgIk9VVF9PRl9USU1FIjsgYnJlYWs7CisgICAgY2FzZSBFcnJvckNvZGU6Ok5PX0FWQUlMQUJMRV9OQU1FUzogb3V0IDw8ICJOT19BVkFJTEFCTEVfTkFNRVMiOyBicmVhazsKKyAgICBkZWZhdWx0OiBvdXQgPDwgIlVOS05PV05fRVJST1IiOyBicmVhazsKKyAgfQorICByZXR1cm4gb3V0OworfQorCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBSZXF1ZXN0VHlwZSB0eXBlKQoreworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFJlcXVlc3RUeXBlOjpORVc6IG91dCA8PCAiTmV3IjsgYnJlYWs7CisgICAgY2FzZSBSZXF1ZXN0VHlwZTo6UkVORVc6IG91dCA8PCAiUmVuZXciOyBicmVhazsKKyAgICBjYXNlIFJlcXVlc3RUeXBlOjpSRVZPS0U6IG91dCA8PCAiUmV2b2tlIjsgYnJlYWs7CisgICAgY2FzZSBSZXF1ZXN0VHlwZTo6Tk9USU5JVElBTElaRUQ6IG91dCA8PCAiTm90IEluaXRpYWxpemVkIjsgYnJlYWs7CisgICAgZGVmYXVsdDogb3V0IDw8ICJVTktOT1dOX1JFUVVFU1RfVFlQRSI7IGJyZWFrOworICB9CisgIHJldHVybiBvdXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIG5kbmNlcnQKK30gLy8gbmFtZXNwYWNlIG5kbgpkaWZmIC0tZ2l0IGEvc3JjL2RldGFpbC9uZG5jZXJ0LWNvbW1vbi5ocHAgYi9zcmMvZGV0YWlsL25kbmNlcnQtY29tbW9uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y2Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2RldGFpbC9uZG5jZXJ0LWNvbW1vbi5ocHAKQEAgLTAsMCArMSwxMzEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNy0yMDIwLCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmRuY2VydCwgYSBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50IHN5c3RlbSBiYXNlZCBvbiBORE4uCisgKgorICogbmRuY2VydCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG5jZXJ0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIG5kbmNlcnQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG5jZXJ0IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjaWZuZGVmIE5ETkNFUlRfREVUQUlMX05ETkNFUlRfQ09NTU9OX0hQUAorI2RlZmluZSBORE5DRVJUX0RFVEFJTF9ORE5DRVJUX0NPTU1PTl9IUFAKKworI2luY2x1ZGUgImRldGFpbC9uZG5jZXJ0LWNvbmZpZy5ocHAiCisKKyNpZmRlZiBORE5DRVJUX0hBVkVfVEVTVFMKKyNkZWZpbmUgTkROQ0VSVF9WSVJUVUFMX1dJVEhfVEVTVFMgdmlydHVhbAorI2RlZmluZSBORE5DRVJUX1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJPVEVDVEVEIHB1YmxpYworI2RlZmluZSBORE5DRVJUX1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURSBwdWJsaWMKKyNkZWZpbmUgTkROQ0VSVF9QUk9URUNURURfV0lUSF9URVNUU19FTFNFX1BSSVZBVEUgcHJvdGVjdGVkCisjZWxzZQorI2RlZmluZSBORE5DRVJUX1ZJUlRVQUxfV0lUSF9URVNUUworI2RlZmluZSBORE5DRVJUX1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJPVEVDVEVEIHByb3RlY3RlZAorI2RlZmluZSBORE5DRVJUX1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURSBwcml2YXRlCisjZGVmaW5lIE5ETkNFUlRfUFJPVEVDVEVEX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFIHByaXZhdGUKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG5kbi1jeHgvZGF0YS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9lbmNvZGluZy9ibG9jay1oZWxwZXJzLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L2VuY29kaW5nL2Jsb2NrLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L2VuY29kaW5nL3Rsdi5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9mYWNlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L2ludGVyZXN0LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L2xwL25hY2suaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbmFtZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9jZXJ0aWZpY2F0ZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9rZXktY2hhaW4uaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9sb2dnZXIuaHBwPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Byb3BlcnR5X3RyZWUvaW5mb19wYXJzZXIuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Byb3BlcnR5X3RyZWUvanNvbl9wYXJzZXIuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Byb3BlcnR5X3RyZWUvcHRyZWUuaHBwPgorCituYW1lc3BhY2UgbmRuIHsKK25hbWVzcGFjZSBuZG5jZXJ0IHsKKworbmFtZXNwYWNlIHRsdiB7CisKK2VudW0gOiB1aW50MzJfdCB7CisgIENhUHJlZml4ID0gMTI5LAorICBDYUluZm8gPSAxMzEsCisgIFBhcmFtZXRlcktleSA9IDEzMywKKyAgUGFyYW1ldGVyVmFsdWUgPSAxMzUsCisgIENhQ2VydGlmaWNhdGUgPSAxMzcsCisgIE1heFZhbGlkaXR5UGVyaW9kID0gMTM5LAorICBQcm9iZVJlc3BvbnNlID0gMTQxLAorICBNYXhTdWZmaXhMZW5ndGggPSAxNDMsCisgIEVjZGhQdWIgPSAxNDUsCisgIENlcnRSZXF1ZXN0ID0gMTQ3LAorICBTYWx0ID0gMTQ5LAorICBSZXF1ZXN0SWQgPSAxNTEsCisgIENoYWxsZW5nZSA9IDE1MywKKyAgU3RhdHVzID0gMTU1LAorICBJbml0aWFsaXphdGlvblZlY3RvciA9IDE1NywKKyAgRW5jcnlwdGVkUGF5bG9hZCA9IDE1OSwKKyAgU2VsZWN0ZWRDaGFsbGVuZ2UgPSAxNjEsCisgIENoYWxsZW5nZVN0YXR1cyA9IDE2MywKKyAgUmVtYWluaW5nVHJpZXMgPSAxNjUsCisgIFJlbWFpbmluZ1RpbWUgPSAxNjcsCisgIElzc3VlZENlcnROYW1lID0gMTY5LAorICBFcnJvckNvZGUgPSAxNzEsCisgIEVycm9ySW5mbyA9IDE3MywKKyAgQXV0aGVudGljYXRpb25UYWcgPSAxNzUsCisgIENlcnRUb1Jldm9rZSA9IDE3NywKKyAgUHJvYmVSZWRpcmVjdCA9IDE3OQorfTsKKworfSAvLyBuYW1lc3BhY2UgdGx2CisKK3VzaW5nIGJvb3N0Ojpub25jb3B5YWJsZTsKK3R5cGVkZWYgYm9vc3Q6OnByb3BlcnR5X3RyZWU6OnB0cmVlIEpzb25TZWN0aW9uOworCisvLyBORE5DRVJUIGVycm9yIGNvZGUKK2VudW0gY2xhc3MgRXJyb3JDb2RlIDogdWludDY0X3QgeworICBOT19FUlJPUiA9IDAsCisgIEJBRF9JTlRFUkVTVF9GT1JNQVQgPSAxLAorICBCQURfUEFSQU1FVEVSX0ZPUk1BVCA9IDIsCisgIEJBRF9TSUdOQVRVUkUgPSAzLAorICBJTlZBTElEX1BBUkFNRVRFUiA9IDQsCisgIE5BTUVfTk9UX0FMTE9XRUQgPSA1LAorICBCQURfVkFMSURJVFlfUEVSSU9EID0gNiwKKyAgT1VUX09GX1RSSUVTID0gNywKKyAgT1VUX09GX1RJTUUgPSA4LAorICBOT19BVkFJTEFCTEVfTkFNRVMgPSA5Cit9OworCisvLyBDb252ZXJ0IGVycm9yIGNvZGUgdG8gc3RyaW5nCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIEVycm9yQ29kZSBjb2RlKTsKKworLy8gTkROQ0VSVCByZXF1ZXN0IHR5cGUKK2VudW0gY2xhc3MgUmVxdWVzdFR5cGUgOiB1aW50NjRfdCB7CisgIE5PVElOSVRJQUxJWkVEID0gMCwKKyAgTkVXID0gMSwKKyAgUkVORVcgPSAyLAorICBSRVZPS0UgPSAzCit9OworCisvLyBDb252ZXJ0IHJlcXVlc3QgdHlwZSB0byBzdHJpbmcKK3N0ZDo6b3N0cmVhbSYKK29wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIFJlcXVlc3RUeXBlIHR5cGUpOworCit9IC8vIG5hbWVzcGFjZSBuZG5jZXJ0Cit9IC8vIG5hbWVzcGFjZSBuZG4KKworI2VuZGlmIC8vIE5ETkNFUlRfREVUQUlMX05ETkNFUlRfQ09NTU9OX0hQUApkaWZmIC0tZ2l0IGEvdGVzdHMvYm9vc3QtdGVzdC5ocHAgYi90ZXN0cy9ib29zdC10ZXN0LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTliMDFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYm9vc3QtdGVzdC5ocHAKQEAgLTAsMCArMSwzOCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMuCisgKgorICogVGhpcyBmaWxlLCBvcmlnaW5hbGx5IHdyaXR0ZW4gYXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbiksCisgKiBpcyBhIHBhcnQgb2YgbmRuY2VydCwgYSBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50IHN5c3RlbSBiYXNlZCBvbiBORE4uCisgKgorICogbmRuY2VydCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG5jZXJ0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIG5kbmNlcnQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG5jZXJ0IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjaWZuZGVmIE5ETkNFUlRfVEVTVFNfQk9PU1RfVEVTVF9IUFAKKyNkZWZpbmUgTkROQ0VSVF9URVNUU19CT09TVF9URVNUX0hQUAorCisvLyBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIEJvb3N0LlRlc3QKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNwcmFnbWEgY2xhbmcgc3lzdGVtX2hlYWRlcgorCisjZGVmaW5lIEJPT1NUX1RFU1RfRFlOX0xJTksKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNlbmRpZiAvLyBORE5DRVJUX1RFU1RTX0JPT1NUX1RFU1RfSFBQCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhYmFzZS1maXh0dXJlLmhwcCBiL3Rlc3RzL2RhdGFiYXNlLWZpeHR1cmUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGUzMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhYmFzZS1maXh0dXJlLmhwcApAQCAtMCwwICsxLDYzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDIwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBuZG4tY3h4IGxpYnJhcnkgKE5ETiBDKysgbGlicmFyeSB3aXRoIGVYcGVyaW1lbnRhbCBlWHRlbnNpb25zKS4KKyAqCisgKiBuZG4tY3h4IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5kbi1jeHggbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIEdOVSBMZXNzZXIKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCBuZG4tY3h4LCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZQorICogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIG5kbi1jeHggYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICovCisKKyNpZm5kZWYgTkROQ0VSVF9URVNUU19EQVRBQkFTRV9GSVhUVVJFX0hQUAorI2RlZmluZSBORE5DRVJUX1RFU1RTX0RBVEFCQVNFX0ZJWFRVUkVfSFBQCisKKyNpbmNsdWRlICJpZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuaHBwIgorI2luY2x1ZGUgInVuaXQtdGVzdC10aW1lLWZpeHR1cmUuaHBwIgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorCituYW1lc3BhY2UgbmRuIHsKK25hbWVzcGFjZSBuZG5jZXJ0IHsKK25hbWVzcGFjZSB0ZXN0cyB7CisKK2NsYXNzIElkZW50aXR5TWFuYWdlbWVudFRpbWVGaXh0dXJlIDogcHVibGljIFVuaXRUZXN0VGltZUZpeHR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcHVibGljIElkZW50aXR5TWFuYWdlbWVudEZpeHR1cmUKK3sKK307CisKK2NsYXNzIERhdGFiYXNlRml4dHVyZSA6IHB1YmxpYyBJZGVudGl0eU1hbmFnZW1lbnRUaW1lRml4dHVyZQoreworcHVibGljOgorICBEYXRhYmFzZUZpeHR1cmUoKQorICB7CisgICAgYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggcGFyZW50RGlye1RNUF9URVNUU19QQVRIfTsKKyAgICBkYkRpciA9IHBhcmVudERpciAvICJ0ZXN0LWhvbWUiIC8gIi5uZG5jZXJ0IjsKKyAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoZGJEaXIpKSB7CisgICAgICBib29zdDo6ZmlsZXN5c3RlbTo6Y3JlYXRlX2RpcmVjdG9yeShkYkRpcik7CisgICAgfQorICB9CisKKyAgfkRhdGFiYXNlRml4dHVyZSgpCisgIHsKKyAgICBib29zdDo6ZmlsZXN5c3RlbTo6cmVtb3ZlX2FsbChkYkRpcik7CisgIH0KKworcHJvdGVjdGVkOgorICBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBkYkRpcjsKK307CisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZG5jZXJ0Cit9IC8vIG5hbWVzcGFjZSBuZG4KKworI2VuZGlmIC8vIE5ETkNFUlRfVEVTVFNfREFUQUJBU0VfRklYVFVSRV9IUFAKZGlmZiAtLWdpdCBhL3Rlc3RzL2dsb2JhbC1jb25maWd1cmF0aW9uLmNwcCBiL3Rlc3RzL2dsb2JhbC1jb25maWd1cmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQwY2JkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ2xvYmFsLWNvbmZpZ3VyYXRpb24uY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNy0yMDIwLCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmRuY2VydCwgYSBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50IHN5c3RlbSBiYXNlZCBvbiBORE4uCisgKgorICogbmRuY2VydCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG5jZXJ0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIG5kbmNlcnQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG5jZXJ0IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjaW5jbHVkZSAiYm9vc3QtdGVzdC5ocHAiCisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgbmRuY2VydCB7CituYW1lc3BhY2UgdGVzdHMgeworCitjbGFzcyBHbG9iYWxDb25maWd1cmF0aW9uCit7CitwdWJsaWM6CisgIEdsb2JhbENvbmZpZ3VyYXRpb24oKQorICB7CisgICAgY29uc3QgY2hhciogZW52SG9tZSA9IDo6Z2V0ZW52KCJIT01FIik7CisgICAgaWYgKGVudkhvbWUpCisgICAgICBtX2hvbWUgPSBlbnZIb21lOworCisgICAgYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggZGlye1RNUF9URVNUU19QQVRIfTsKKyAgICBkaXIgLz0gInRlc3QtaG9tZSI7CisgICAgOjpzZXRlbnYoIkhPTUUiLCBkaXIuY19zdHIoKSwgMSk7CisKKyAgICBib29zdDo6ZmlsZXN5c3RlbTo6Y3JlYXRlX2RpcmVjdG9yaWVzKGRpcik7CisgICAgc3RkOjpvZnN0cmVhbSBjbGllbnRDb25mKChkaXIgLyAiLm5kbiIgLyAiY2xpZW50LmNvbmYiKS5jX3N0cigpKTsKKyAgICBjbGllbnRDb25mIDw8ICJwaWI9cGliLXNxbGl0ZTMiIDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICAgICAgPDwgInRwbT10cG0tZmlsZSIgPDwgc3RkOjplbmRsOworICB9CisKKyAgfkdsb2JhbENvbmZpZ3VyYXRpb24oKQorICB7CisgICAgaWYgKCFtX2hvbWUuZW1wdHkoKSkKKyAgICAgIDo6c2V0ZW52KCJIT01FIiwgbV9ob21lLmRhdGEoKSwgMSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbV9ob21lOworfTsKKworI2lmIEJPT1NUX1ZFUlNJT04gPj0gMTA2NTAwCitCT09TVF9URVNUX0dMT0JBTF9DT05GSUdVUkFUSU9OKEdsb2JhbENvbmZpZ3VyYXRpb24pOworI2VsaWYgQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDAKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbENvbmZpZ3VyYXRpb24pOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbENvbmZpZ3VyYXRpb24pCisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgdGVzdHMKK30gLy8gbmFtZXNwYWNlIG5kbmNlcnQKK30gLy8gbmFtZXNwYWNlIG5kbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2lkZW50aXR5LW1hbmFnZW1lbnQtZml4dHVyZS5jcHAgYi90ZXN0cy9pZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTA1NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuY3BwCkBAIC0wLDAgKzEsMTMxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDIwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBuZG4tY3h4IGxpYnJhcnkgKE5ETiBDKysgbGlicmFyeSB3aXRoIGVYcGVyaW1lbnRhbCBlWHRlbnNpb25zKS4KKyAqCisgKiBuZG4tY3h4IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5kbi1jeHggbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIEdOVSBMZXNzZXIKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCBuZG4tY3h4LCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZQorICogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIG5kbi1jeHggYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICovCisKKyNpbmNsdWRlICJpZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuaHBwIgorI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkvYWRkaXRpb25hbC1kZXNjcmlwdGlvbi5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2lvLmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgbmRuY2VydCB7CituYW1lc3BhY2UgdGVzdHMgeworCituYW1lc3BhY2UgdjIgPSBzZWN1cml0eTo6djI7CisKK0lkZW50aXR5TWFuYWdlbWVudEJhc2VGaXh0dXJlOjp+SWRlbnRpdHlNYW5hZ2VtZW50QmFzZUZpeHR1cmUoKQoreworICBib29zdDo6c3lzdGVtOjplcnJvcl9jb2RlIGVjOworICBmb3IgKGNvbnN0IGF1dG8mIGNlcnRGaWxlIDogbV9jZXJ0RmlsZXMpIHsKKyAgICBib29zdDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKGNlcnRGaWxlLCBlYyk7IC8vIGlnbm9yZSBlcnJvcgorICB9Cit9CisKK2Jvb2wKK0lkZW50aXR5TWFuYWdlbWVudEJhc2VGaXh0dXJlOjpzYXZlQ2VydFRvRmlsZShjb25zdCBEYXRhJiBvYmosIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgbV9jZXJ0RmlsZXMuaW5zZXJ0KGZpbGVuYW1lKTsKKyAgdHJ5IHsKKyAgICBpbzo6c2F2ZShvYmosIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXRjaCAoY29uc3QgaW86OkVycm9yJikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitJZGVudGl0eU1hbmFnZW1lbnRGaXh0dXJlOjpJZGVudGl0eU1hbmFnZW1lbnRGaXh0dXJlKCkKKyAgOiBtX2tleUNoYWluKCJwaWItbWVtb3J5OiIsICJ0cG0tbWVtb3J5OiIpCit7Cit9CisKK3NlY3VyaXR5OjpJZGVudGl0eQorSWRlbnRpdHlNYW5hZ2VtZW50Rml4dHVyZTo6YWRkSWRlbnRpdHkoY29uc3QgTmFtZSYgaWRlbnRpdHlOYW1lLCBjb25zdCBLZXlQYXJhbXMmIHBhcmFtcykKK3sKKyAgYXV0byBpZGVudGl0eSA9IG1fa2V5Q2hhaW4uY3JlYXRlSWRlbnRpdHkoaWRlbnRpdHlOYW1lLCBwYXJhbXMpOworICBtX2lkZW50aXRpZXMuaW5zZXJ0KGlkZW50aXR5TmFtZSk7CisgIHJldHVybiBpZGVudGl0eTsKK30KKworYm9vbAorSWRlbnRpdHlNYW5hZ2VtZW50Rml4dHVyZTo6c2F2ZUNlcnRpZmljYXRlKGNvbnN0IHNlY3VyaXR5OjpJZGVudGl0eSYgaWRlbnRpdHksIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgdHJ5IHsKKyAgICBhdXRvIGNlcnQgPSBpZGVudGl0eS5nZXREZWZhdWx0S2V5KCkuZ2V0RGVmYXVsdENlcnRpZmljYXRlKCk7CisgICAgcmV0dXJuIHNhdmVDZXJ0VG9GaWxlKGNlcnQsIGZpbGVuYW1lKTsKKyAgfQorICBjYXRjaCAoY29uc3Qgc2VjdXJpdHk6OlBpYjo6RXJyb3ImKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3NlY3VyaXR5OjpJZGVudGl0eQorSWRlbnRpdHlNYW5hZ2VtZW50Rml4dHVyZTo6YWRkU3ViQ2VydGlmaWNhdGUoY29uc3QgTmFtZSYgc3ViSWRlbnRpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VjdXJpdHk6OklkZW50aXR5JiBpc3N1ZXIsIGNvbnN0IEtleVBhcmFtcyYgcGFyYW1zKQoreworICBhdXRvIHN1YklkZW50aXR5ID0gYWRkSWRlbnRpdHkoc3ViSWRlbnRpdHlOYW1lLCBwYXJhbXMpOworCisgIHYyOjpDZXJ0aWZpY2F0ZSByZXF1ZXN0ID0gc3ViSWRlbnRpdHkuZ2V0RGVmYXVsdEtleSgpLmdldERlZmF1bHRDZXJ0aWZpY2F0ZSgpOworCisgIHJlcXVlc3Quc2V0TmFtZShyZXF1ZXN0LmdldEtleU5hbWUoKS5hcHBlbmQoInBhcmVudCIpLmFwcGVuZFZlcnNpb24oKSk7CisKKyAgU2lnbmF0dXJlSW5mbyBpbmZvOworICBhdXRvIG5vdyA9IHRpbWU6OnN5c3RlbV9jbG9jazo6bm93KCk7CisgIGluZm8uc2V0VmFsaWRpdHlQZXJpb2Qoc2VjdXJpdHk6OlZhbGlkaXR5UGVyaW9kKG5vdywgbm93ICsgNzMwMF9kYXlzKSk7CisKKyAgdjI6OkFkZGl0aW9uYWxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKyAgZGVzY3JpcHRpb24uc2V0KCJ0eXBlIiwgInN1Yi1jZXJ0aWZpY2F0ZSIpOworICBpbmZvLmFkZEN1c3RvbVRsdihkZXNjcmlwdGlvbi53aXJlRW5jb2RlKCkpOworCisgIG1fa2V5Q2hhaW4uc2lnbihyZXF1ZXN0LCBzaWduaW5nQnlJZGVudGl0eShpc3N1ZXIpLnNldFNpZ25hdHVyZUluZm8oaW5mbykpOworICBtX2tleUNoYWluLnNldERlZmF1bHRDZXJ0aWZpY2F0ZShzdWJJZGVudGl0eS5nZXREZWZhdWx0S2V5KCksIHJlcXVlc3QpOworCisgIHJldHVybiBzdWJJZGVudGl0eTsKK30KKwordjI6OkNlcnRpZmljYXRlCitJZGVudGl0eU1hbmFnZW1lbnRGaXh0dXJlOjphZGRDZXJ0aWZpY2F0ZShjb25zdCBzZWN1cml0eTo6S2V5JiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpc3N1ZXIpCit7CisgIE5hbWUgY2VydGlmaWNhdGVOYW1lID0ga2V5LmdldE5hbWUoKTsKKyAgY2VydGlmaWNhdGVOYW1lCisgICAgLmFwcGVuZChpc3N1ZXIpCisgICAgLmFwcGVuZFZlcnNpb24oKTsKKyAgdjI6OkNlcnRpZmljYXRlIGNlcnRpZmljYXRlOworICBjZXJ0aWZpY2F0ZS5zZXROYW1lKGNlcnRpZmljYXRlTmFtZSk7CisKKyAgLy8gc2V0IG1ldGFpbmZvCisgIGNlcnRpZmljYXRlLnNldENvbnRlbnRUeXBlKG5kbjo6dGx2OjpDb250ZW50VHlwZV9LZXkpOworICBjZXJ0aWZpY2F0ZS5zZXRGcmVzaG5lc3NQZXJpb2QoMV9oKTsKKworICAvLyBzZXQgY29udGVudAorICBjZXJ0aWZpY2F0ZS5zZXRDb250ZW50KGtleS5nZXRQdWJsaWNLZXkoKS5kYXRhKCksIGtleS5nZXRQdWJsaWNLZXkoKS5zaXplKCkpOworCisgIC8vIHNldCBzaWduYXR1cmUtaW5mbworICBTaWduYXR1cmVJbmZvIGluZm87CisgIGF1dG8gbm93ID0gdGltZTo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgaW5mby5zZXRWYWxpZGl0eVBlcmlvZChzZWN1cml0eTo6VmFsaWRpdHlQZXJpb2Qobm93LCBub3cgKyAxMF9kYXlzKSk7CisKKyAgbV9rZXlDaGFpbi5zaWduKGNlcnRpZmljYXRlLCBzaWduaW5nQnlLZXkoa2V5KS5zZXRTaWduYXR1cmVJbmZvKGluZm8pKTsKKyAgcmV0dXJuIGNlcnRpZmljYXRlOworfQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmRuY2VydAorfSAvLyBuYW1lc3BhY2UgbmRuCmRpZmYgLS1naXQgYS90ZXN0cy9pZGVudGl0eS1tYW5hZ2VtZW50LWZpeHR1cmUuaHBwIGIvdGVzdHMvaWRlbnRpdHktbWFuYWdlbWVudC1maXh0dXJlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjEwZGJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWRlbnRpdHktbWFuYWdlbWVudC1maXh0dXJlLmhwcApAQCAtMCwwICsxLDEwMSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmRuLWN4eCBsaWJyYXJ5IChORE4gQysrIGxpYnJhcnkgd2l0aCBlWHBlcmltZW50YWwgZVh0ZW5zaW9ucykuCisgKgorICogbmRuLWN4eCBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG4tY3h4IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCBHTlUgTGVzc2VyCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggbmRuLWN4eCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUKKyAqIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG4tY3h4IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjaWZuZGVmIE5ETl9URVNUU19JREVOVElUWV9NQU5BR0VNRU5UX0ZJWFRVUkVfSFBQCisjZGVmaW5lIE5ETl9URVNUU19JREVOVElUWV9NQU5BR0VNRU5UX0ZJWFRVUkVfSFBQCisKKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9zaWduaW5nLWhlbHBlcnMuaHBwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgbmRuY2VydCB7CituYW1lc3BhY2UgdGVzdHMgeworCitjbGFzcyBJZGVudGl0eU1hbmFnZW1lbnRCYXNlRml4dHVyZQoreworcHVibGljOgorICB+SWRlbnRpdHlNYW5hZ2VtZW50QmFzZUZpeHR1cmUoKTsKKworICBib29sCisgIHNhdmVDZXJ0VG9GaWxlKGNvbnN0IERhdGEmIG9iaiwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNldDxOYW1lPiBtX2lkZW50aXRpZXM7CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtX2NlcnRGaWxlczsKK307CisKKy8qKgorICogQGJyaWVmIEEgdGVzdCBzdWl0ZSBsZXZlbCBmaXh0dXJlIHRvIGhlbHAgd2l0aCBpZGVudGl0eSBtYW5hZ2VtZW50CisgKgorICogVGVzdCBjYXNlcyBpbiB0aGUgc3VpdGUgY2FuIHVzZSB0aGlzIGZpeHR1cmUgdG8gY3JlYXRlIGlkZW50aXRpZXMuICBJZGVudGl0aWVzLAorICogY2VydGlmaWNhdGVzLCBhbmQgc2F2ZWQgY2VydGlmaWNhdGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZHVyaW5nIHRlc3QgdGVhcmRvd24uCisgKi8KK2NsYXNzIElkZW50aXR5TWFuYWdlbWVudEZpeHR1cmUgOiBwdWJsaWMgSWRlbnRpdHlNYW5hZ2VtZW50QmFzZUZpeHR1cmUKK3sKK3B1YmxpYzoKKyAgSWRlbnRpdHlNYW5hZ2VtZW50Rml4dHVyZSgpOworCisgIC8qKgorICAgKiBAYnJpZWYgQWRkIGlkZW50aXR5IEBwIGlkZW50aXR5TmFtZQorICAgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIGNyZWF0ZWQgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUKKyAgICovCisgIHNlY3VyaXR5OjpJZGVudGl0eQorICBhZGRJZGVudGl0eShjb25zdCBOYW1lJiBpZGVudGl0eU5hbWUsCisgICAgICAgICAgICAgIGNvbnN0IEtleVBhcmFtcyYgcGFyYW1zID0gc2VjdXJpdHk6OktleUNoYWluOjpnZXREZWZhdWx0S2V5UGFyYW1zKCkpOworCisgIC8qKgorICAgKiAgQGJyaWVmIFNhdmUgaWRlbnRpdHkgY2VydGlmaWNhdGUgdG8gYSBmaWxlCisgICAqICBAcGFyYW0gaWRlbnRpdHkgaWRlbnRpdHkKKyAgICogIEBwYXJhbSBmaWxlbmFtZSBmaWxlIG5hbWUsIHNob3VsZCBiZSB3cml0YWJsZQorICAgKiAgQHJldHVybiB3aGV0aGVyIHN1Y2Nlc3NmdWwKKyAgICovCisgIGJvb2wKKyAgc2F2ZUNlcnRpZmljYXRlKGNvbnN0IHNlY3VyaXR5OjpJZGVudGl0eSYgaWRlbnRpdHksIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisKKyAgLyoqCisgICAqIEBicmllZiBJc3N1ZSBhIGNlcnRpZmljYXRlIGZvciBccCBzdWJJZGVudGl0eU5hbWUgc2lnbmVkIGJ5IFxwIGlzc3VlcgorICAgKgorICAgKiAgSWYgaWRlbnRpdHkgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuCisgICAqICBBIG5ldyBrZXkgaXMgZ2VuZXJhdGVkIGFzIHRoZSBkZWZhdWx0IGtleSBmb3IgaWRlbnRpdHkuCisgICAqICBBIGRlZmF1bHQgY2VydGlmaWNhdGUgZm9yIHRoZSBrZXkgaXMgc2lnbmVkIGJ5IHRoZSBpc3N1ZXIgdXNpbmcgaXRzIGRlZmF1bHQgY2VydGlmaWNhdGUuCisgICAqCisgICAqICBAcmV0dXJuIHRoZSBzdWIgaWRlbnRpdHkKKyAgICovCisgIHNlY3VyaXR5OjpJZGVudGl0eQorICBhZGRTdWJDZXJ0aWZpY2F0ZShjb25zdCBOYW1lJiBzdWJJZGVudGl0eU5hbWUsIGNvbnN0IHNlY3VyaXR5OjpJZGVudGl0eSYgaXNzdWVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXlQYXJhbXMmIHBhcmFtcyA9IHNlY3VyaXR5OjpLZXlDaGFpbjo6Z2V0RGVmYXVsdEtleVBhcmFtcygpKTsKKworICAvKioKKyAgICogQGJyaWVmIEFkZCBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHRvIEBwIGtleSB3aXRoIGlzc3VlciBJRCBAcCBpc3N1ZXIKKyAgICovCisgIHNlY3VyaXR5OjpDZXJ0aWZpY2F0ZQorICBhZGRDZXJ0aWZpY2F0ZShjb25zdCBzZWN1cml0eTo6S2V5JiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpc3N1ZXIpOworCitwcm90ZWN0ZWQ6CisgIEtleUNoYWluIG1fa2V5Q2hhaW47Cit9OworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmRuY2VydAorfSAvLyBuYW1lc3BhY2UgbmRuCisKKyNlbmRpZiAvLyBORE5fVEVTVFNfSURFTlRJVFlfTUFOQUdFTUVOVF9GSVhUVVJFX0hQUApkaWZmIC0tZ2l0IGEvdGVzdHMvbWFpbi5jcHAgYi90ZXN0cy9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlkNzRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWFpbi5jcHAKQEAgLTAsMCArMSwyOSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCwgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvcmFkbyBTdGF0ZSBVbml2ZXJzaXR5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUGllcnJlICYgTWFyaWUgQ3VyaWUsIFNvcmJvbm5lIFVuaXZlcnNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBCZWlqaW5nIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMuCisgKgorICogVGhpcyBmaWxlLCBvcmlnaW5hbGx5IHdyaXR0ZW4gYXMgcGFydCBvZiBORkQgKE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbiksCisgKiBpcyBhIHBhcnQgb2YgbmRuY2VydCwgYSBjZXJ0aWZpY2F0ZSBtYW5hZ2VtZW50IHN5c3RlbSBiYXNlZCBvbiBORE4uCisgKgorICogbmRuY2VydCBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIKKyAqIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG5jZXJ0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIG5kbmNlcnQsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG5jZXJ0IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIG5kbmNlcnQKKyNpbmNsdWRlICJib29zdC10ZXN0LmhwcCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0LWNvbW1vbi5ocHAgYi90ZXN0cy90ZXN0LWNvbW1vbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjY2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3QtY29tbW9uLmhwcApAQCAtMCwwICsxLDM4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDIwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBuZG4tY3h4IGxpYnJhcnkgKE5ETiBDKysgbGlicmFyeSB3aXRoIGVYcGVyaW1lbnRhbCBlWHRlbnNpb25zKS4KKyAqCisgKiBuZG4tY3h4IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5kbi1jeHggbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIEdOVSBMZXNzZXIKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCBuZG4tY3h4LCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZQorICogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIG5kbi1jeHggYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICovCisKKyNpZm5kZWYgTkROQ0VSVF9URVNUU19URVNUX0NPTU1PTl9IUFAKKyNkZWZpbmUgTkROQ0VSVF9URVNUU19URVNUX0NPTU1PTl9IUFAKKworI2luY2x1ZGUgImJvb3N0LXRlc3QuaHBwIgorI2luY2x1ZGUgImRhdGFiYXNlLWZpeHR1cmUuaHBwIgorI2luY2x1ZGUgImlkZW50aXR5LW1hbmFnZW1lbnQtZml4dHVyZS5ocHAiCisjaW5jbHVkZSAidW5pdC10ZXN0LXRpbWUtZml4dHVyZS5ocHAiCisjaW5jbHVkZSA8bmRuLWN4eC9tZXRhZGF0YS1vYmplY3QuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkvc2lnbmluZy1oZWxwZXJzLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L3RyYW5zZm9ybS9iYXNlNjQtZW5jb2RlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L3RyYW5zZm9ybS9idWZmZXItc291cmNlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L3RyYW5zZm9ybS9wdWJsaWMta2V5LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L3RyYW5zZm9ybS9zdHJlYW0tc2luay5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS92ZXJpZmljYXRpb24taGVscGVycy5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2R1bW15LWNsaWVudC1mYWNlLmhwcD4KKworI2VuZGlmIC8vIE5ETkNFUlRfVEVTVFNfVEVTVF9DT01NT05fSFBQCmRpZmYgLS1naXQgYS90ZXN0cy91bml0LXRlc3QtdGltZS1maXh0dXJlLmhwcCBiL3Rlc3RzL3VuaXQtdGVzdC10aW1lLWZpeHR1cmUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYmNlMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91bml0LXRlc3QtdGltZS1maXh0dXJlLmhwcApAQCAtMCwwICsxLDEwNyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmRuLWN4eCBsaWJyYXJ5IChORE4gQysrIGxpYnJhcnkgd2l0aCBlWHBlcmltZW50YWwgZVh0ZW5zaW9ucykuCisgKgorICogbmRuLWN4eCBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZG4tY3h4IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCBHTlUgTGVzc2VyCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggbmRuLWN4eCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUKKyAqIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBuZG4tY3h4IGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqLworCisjaWZuZGVmIE5ETl9URVNUU19VTklUX1VOSVRfVEVTVF9USU1FX0ZJWFRVUkVfSFBQCisjZGVmaW5lIE5ETl9URVNUU19VTklUX1VOSVRfVEVTVF9USU1FX0ZJWFRVUkVfSFBQCisKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvdGltZS11bml0LXRlc3QtY2xvY2suaHBwPgorI2luY2x1ZGUgPGJvb3N0L2FzaW8vaW9fc2VydmljZS5ocHA+CisKK25hbWVzcGFjZSBuZG4geworbmFtZXNwYWNlIG5kbmNlcnQgeworbmFtZXNwYWNlIHRlc3RzIHsKKworLyoqIFxicmllZiBhIHRlc3QgZml4dHVyZSB0aGF0IG92ZXJyaWRlcyBzdGVhZHkgY2xvY2sgYW5kIHN5c3RlbSBjbG9jaworICovCitjbGFzcyBVbml0VGVzdFRpbWVGaXh0dXJlCit7CitwdWJsaWM6CisgIFVuaXRUZXN0VGltZUZpeHR1cmUoKQorICAgIDogc3RlYWR5Q2xvY2sobWFrZV9zaGFyZWQ8dGltZTo6VW5pdFRlc3RTdGVhZHlDbG9jaz4oKSkKKyAgICAsIHN5c3RlbUNsb2NrKG1ha2Vfc2hhcmVkPHRpbWU6OlVuaXRUZXN0U3lzdGVtQ2xvY2s+KCkpCisgIHsKKyAgICB0aW1lOjpzZXRDdXN0b21DbG9ja3Moc3RlYWR5Q2xvY2ssIHN5c3RlbUNsb2NrKTsKKyAgfQorCisgIH5Vbml0VGVzdFRpbWVGaXh0dXJlKCkKKyAgeworICAgIHRpbWU6OnNldEN1c3RvbUNsb2NrcyhudWxscHRyLCBudWxscHRyKTsKKyAgfQorCisgIC8qKiBcYnJpZWYgYWR2YW5jZSBzdGVhZHkgYW5kIHN5c3RlbSBjbG9ja3MKKyAgICoKKyAgICogIENsb2NrcyBhcmUgYWR2YW5jZWQgaW4gaW5jcmVtZW50cyBvZiBccCB0aWNrIGZvciBccCBuVGlja3MgdGlja3MuCisgICAqICBBZnRlciBlYWNoIHRpY2ssIGlvX3NlcnZpY2UgaXMgcG9sbGVkIHRvIHByb2Nlc3MgcGVuZGluZyBJL08gZXZlbnRzLgorICAgKgorICAgKiAgRXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIEkvTyBldmVudHMgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlci4KKyAgICogIENsb2NrIGFkdmFuY2luZyB3b3VsZCBzdG9wIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uLgorICAgKi8KKyAgdm9pZAorICBhZHZhbmNlQ2xvY2tzKGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzJiB0aWNrLCBzaXplX3QgblRpY2tzID0gMSkKKyAgeworICAgIHRoaXMtPmFkdmFuY2VDbG9ja3ModGljaywgdGljayAqIG5UaWNrcyk7CisgIH0KKworICAvKiogXGJyaWVmIGFkdmFuY2Ugc3RlYWR5IGFuZCBzeXN0ZW0gY2xvY2tzCisgICAqCisgICAqICBDbG9ja3MgYXJlIGFkdmFuY2VkIGluIGluY3JlbWVudHMgb2YgXHAgdGljayBmb3IgXHAgdG90YWwgdGltZS4KKyAgICogIFRoZSBsYXN0IGluY3JlbWVudCBtaWdodCBiZSBzaG9ydGVyIHRoYW4gXHAgdGljay4KKyAgICogIEFmdGVyIGVhY2ggdGljaywgaW9fc2VydmljZSBpcyBwb2xsZWQgdG8gcHJvY2VzcyBwZW5kaW5nIEkvTyBldmVudHMuCisgICAqCisgICAqICBFeGNlcHRpb25zIHRocm93biBkdXJpbmcgSS9PIGV2ZW50cyBhcmUgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyLgorICAgKiAgQ2xvY2sgYWR2YW5jaW5nIHdvdWxkIHN0b3AgaW4gY2FzZSBvZiBhbiBleGNlcHRpb24uCisgICAqLworICB2b2lkCisgIGFkdmFuY2VDbG9ja3MoY29uc3QgdGltZTo6bmFub3NlY29uZHMmIHRpY2ssIGNvbnN0IHRpbWU6Om5hbm9zZWNvbmRzJiB0b3RhbCkKKyAgeworICAgIEJPT1NUX0FTU0VSVCh0aWNrID4gdGltZTo6bmFub3NlY29uZHM6Onplcm8oKSk7CisgICAgQk9PU1RfQVNTRVJUKHRvdGFsID49IHRpbWU6Om5hbm9zZWNvbmRzOjp6ZXJvKCkpOworCisgICAgdGltZTo6bmFub3NlY29uZHMgcmVtYWluaW5nID0gdG90YWw7CisgICAgd2hpbGUgKHJlbWFpbmluZyA+IHRpbWU6Om5hbm9zZWNvbmRzOjp6ZXJvKCkpIHsKKyAgICAgIGlmIChyZW1haW5pbmcgPj0gdGljaykgeworICAgICAgICBzdGVhZHlDbG9jay0+YWR2YW5jZSh0aWNrKTsKKyAgICAgICAgc3lzdGVtQ2xvY2stPmFkdmFuY2UodGljayk7CisgICAgICAgIHJlbWFpbmluZyAtPSB0aWNrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHN0ZWFkeUNsb2NrLT5hZHZhbmNlKHJlbWFpbmluZyk7CisgICAgICAgIHN5c3RlbUNsb2NrLT5hZHZhbmNlKHJlbWFpbmluZyk7CisgICAgICAgIHJlbWFpbmluZyA9IHRpbWU6Om5hbm9zZWNvbmRzOjp6ZXJvKCk7CisgICAgICB9CisKKyAgICAgIGlmIChpby5zdG9wcGVkKCkpCisgICAgICAgIGlvLnJlc2V0KCk7CisgICAgICBpby5wb2xsKCk7CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgc2hhcmVkX3B0cjx0aW1lOjpVbml0VGVzdFN0ZWFkeUNsb2NrPiBzdGVhZHlDbG9jazsKKyAgc2hhcmVkX3B0cjx0aW1lOjpVbml0VGVzdFN5c3RlbUNsb2NrPiBzeXN0ZW1DbG9jazsKKyAgYm9vc3Q6OmFzaW86OmlvX3NlcnZpY2UgaW87Cit9OworCit9IC8vIG5hbWVzcGFjZSB0ZXN0cworfSAvLyBuYW1lc3BhY2UgbmRuY2VydAorfSAvLyBuYW1lc3BhY2UgbmRuCisKKyNlbmRpZiAvLyBORE5fVEVTVFNfVU5JVF9VTklUX1RFU1RfVElNRV9GSVhUVVJFX0hQUApkaWZmIC0tZ2l0IGEvdGVzdHMvdW5pdC10ZXN0cy9jcnlwdG8taGVscGVycy50LmNwcCBiL3Rlc3RzL3VuaXQtdGVzdHMvY3J5cHRvLWhlbHBlcnMudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyOWEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3VuaXQtdGVzdHMvY3J5cHRvLWhlbHBlcnMudC5jcHAKQEAgLTAsMCArMSwzMzQgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMjAsIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBuZG5jZXJ0LCBhIGNlcnRpZmljYXRlIG1hbmFnZW1lbnQgc3lzdGVtIGJhc2VkIG9uIE5ETi4KKyAqCisgKiBuZG5jZXJ0IGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlcgorICogdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5kbmNlcnQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogbmRuY2VydCwgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIG5kbmNlcnQgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICovCisKKyNpbmNsdWRlICJkZXRhaWwvY3J5cHRvLWhlbHBlcnMuaHBwIgorI2luY2x1ZGUgInRlc3QtY29tbW9uLmhwcCIKKworbmFtZXNwYWNlIG5kbiB7CituYW1lc3BhY2UgbmRuY2VydCB7CituYW1lc3BhY2UgdGVzdHMgeworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVGVzdENyeXB0b0hlbHBlcnMpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVjZGhXaXRoUmF3S2V5KQoreworICBFQ0RIU3RhdGUgYWxpY2VTdGF0ZTsKKyAgYXV0byBhbGljZVB1YiA9IGFsaWNlU3RhdGUuZ2V0U2VsZlB1YktleSgpOworICBCT09TVF9DSEVDSyghYWxpY2VQdWIuZW1wdHkoKSk7CisKKyAgRUNESFN0YXRlIGJvYlN0YXRlOworICBhdXRvIGJvYlB1YiA9IGJvYlN0YXRlLmdldFNlbGZQdWJLZXkoKTsKKyAgQk9PU1RfQ0hFQ0soIWJvYlB1Yi5lbXB0eSgpKTsKKworICBhdXRvIGFsaWNlUmVzdWx0ID0gYWxpY2VTdGF0ZS5kZXJpdmVTZWNyZXQoYm9iUHViKTsKKyAgQk9PU1RfQ0hFQ0soIWFsaWNlUmVzdWx0LmVtcHR5KCkpOworICBhdXRvIGJvYlJlc3VsdCA9IGJvYlN0YXRlLmRlcml2ZVNlY3JldChhbGljZVB1Yik7CisgIEJPT1NUX0NIRUNLKCFib2JSZXN1bHQuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMX0NPTExFQ1RJT05TKGFsaWNlUmVzdWx0LmJlZ2luKCksIGFsaWNlUmVzdWx0LmVuZCgpLCBib2JSZXN1bHQuYmVnaW4oKSwgYm9iUmVzdWx0LmVuZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRWNkaFdpdGhSYXdLZXlXcm9uZ0lucHV0KQoreworICBFQ0RIU3RhdGUgYWxpY2VTdGF0ZTsKKyAgYXV0byBhbGljZVB1YiA9IGFsaWNlU3RhdGUuZ2V0U2VsZlB1YktleSgpOworICBCT09TVF9DSEVDSyghYWxpY2VQdWIuZW1wdHkoKSk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGZha2VQdWIoMTAsIDB4MGIpOworICBCT09TVF9DSEVDS19USFJPVyhhbGljZVN0YXRlLmRlcml2ZVNlY3JldChmYWtlUHViKSwgc3RkOjpydW50aW1lX2Vycm9yKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSG1hY1NoYTI1NikKK3sKKyAgY29uc3QgdWludDhfdCBpbnB1dFtdID0gezB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYn07CisgIGNvbnN0IHVpbnQ4X3Qga2V5W10gPSB7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwY307CisgIGNvbnN0IHVpbnQ4X3QgZXhwZWN0ZWRbXSA9IHsweDA3LCAweDc3LCAweDA5LCAweDM2LCAweDJjLCAweDJlLCAweDMyLCAweGRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZCwgMHhkYywgMHgzZiwgMHgwZCwgMHhjNCwgMHg3YiwgMHhiYSwgMHg2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTAsIDB4YjYsIDB4YzcsIDB4M2IsIDB4YjUsIDB4MGYsIDB4OWMsIDB4MzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIyLCAweGVjLCAweDg0LCAweDRhLCAweGQ3LCAweGMyLCAweGIzLCAweGU1fTsKKyAgdWludDhfdCByZXN1bHRbMzJdOworICBobWFjU2hhMjU2KGlucHV0LCBzaXplb2YoaW5wdXQpLCBrZXksIHNpemVvZihrZXkpLCByZXN1bHQpOworICBCT09TVF9DSEVDS19FUVVBTF9DT0xMRUNUSU9OUyhyZXN1bHQsIHJlc3VsdCArIHNpemVvZihyZXN1bHQpLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKyBzaXplb2YoZXhwZWN0ZWQpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSGtkZjEpCit7CisgIC8vIFJGQzU4NjkgYXBwZW5kaXggQS4xCisgIGNvbnN0IHVpbnQ4X3QgaWttW10gPSB7MHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGJ9OworICBjb25zdCB1aW50OF90IHNhbHRbXSA9IHsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjfTsKKyAgY29uc3QgdWludDhfdCBpbmZvW10gPSB7MHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOX07CisgIGNvbnN0IHVpbnQ4X3QgZXhwZWN0ZWRbXSA9IHsKKyAgICAgIDB4M2MsIDB4YjIsIDB4NWYsIDB4MjUsIDB4ZmEsIDB4YWMsIDB4ZDUsIDB4N2EsIDB4OTAsIDB4NDMsIDB4NGYsCisgICAgICAweDY0LCAweGQwLCAweDM2LCAweDJmLCAweDJhLCAweDJkLCAweDJkLCAweDBhLCAweDkwLCAweGNmLCAweDFhLAorICAgICAgMHg1YSwgMHg0YywgMHg1ZCwgMHhiMCwgMHgyZCwgMHg1NiwgMHhlYywgMHhjNCwgMHhjNSwgMHhiZiwgMHgzNCwKKyAgICAgIDB4MDAsIDB4NzIsIDB4MDgsIDB4ZDUsIDB4YjgsIDB4ODcsIDB4MTgsIDB4NTgsIDB4NjV9OworICB1aW50OF90IHJlc3VsdFs0Ml07CisgIGF1dG8gcmVzdWx0TGVuID0gaGtkZihpa20sIHNpemVvZihpa20pLCBzYWx0LCBzaXplb2Yoc2FsdCksIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZXN1bHQpLCBpbmZvLCBzaXplb2YoaW5mbykpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3VsdExlbiwgc2l6ZW9mKHJlc3VsdCkpOworICBCT09TVF9DSEVDS19FUVVBTF9DT0xMRUNUSU9OUyhyZXN1bHQsIHJlc3VsdCArIHNpemVvZihyZXN1bHQpLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKyBzaXplb2YoZXhwZWN0ZWQpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoSGtkZjIpCit7CisgIC8vIFJGQzU4NjkgYXBwZW5kaXggQS4yCisgIGNvbnN0IHVpbnQ4X3QgaWttW10gPSB7CisgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAorICAgICAgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKyAgICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsCisgICAgICAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLAorICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwKKyAgICAgIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisgICAgICAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmfTsKKyAgY29uc3QgdWludDhfdCBzYWx0W10gPSB7CisgICAgICAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLAorICAgICAgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywKKyAgICAgIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsCisgICAgICAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLAorICAgICAgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwKKyAgICAgIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCisgICAgICAweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmfTsKKyAgY29uc3QgdWludDhfdCBpbmZvW10gPSB7CisgICAgICAweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLAorICAgICAgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywKKyAgICAgIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsCisgICAgICAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLAorICAgICAgMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwKKyAgICAgIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmfTsKKyAgY29uc3QgdWludDhfdCBleHBlY3RlZFtdID0geworICAgICAgMHhiMSwgMHgxZSwgMHgzOSwgMHg4ZCwgMHhjOCwgMHgwMywgMHgyNywgMHhhMSwgMHhjOCwgMHhlNywgMHhmNywgMHg4YywKKyAgICAgIDB4NTksIDB4NmEsIDB4NDksIDB4MzQsIDB4NGYsIDB4MDEsIDB4MmUsIDB4ZGEsIDB4MmQsIDB4NGUsIDB4ZmEsIDB4ZDgsCisgICAgICAweGEwLCAweDUwLCAweGNjLCAweDRjLCAweDE5LCAweGFmLCAweGE5LCAweDdjLCAweDU5LCAweDA0LCAweDVhLCAweDk5LAorICAgICAgMHhjYSwgMHhjNywgMHg4MiwgMHg3MiwgMHg3MSwgMHhjYiwgMHg0MSwgMHhjNiwgMHg1ZSwgMHg1OSwgMHgwZSwgMHgwOSwKKyAgICAgIDB4ZGEsIDB4MzIsIDB4NzUsIDB4NjAsIDB4MGMsIDB4MmYsIDB4MDksIDB4YjgsIDB4MzYsIDB4NzcsIDB4OTMsIDB4YTksCisgICAgICAweGFjLCAweGEzLCAweGRiLCAweDcxLCAweGNjLCAweDMwLCAweGM1LCAweDgxLCAweDc5LCAweGVjLCAweDNlLCAweDg3LAorICAgICAgMHhjMSwgMHg0YywgMHgwMSwgMHhkNSwgMHhjMSwgMHhmMywgMHg0MywgMHg0ZiwgMHgxZCwgMHg4N307CisKKyAgdWludDhfdCByZXN1bHRbODJdOworICBhdXRvIHJlc3VsdExlbiA9IGhrZGYoaWttLCBzaXplb2YoaWttKSwgc2FsdCwgc2l6ZW9mKHNhbHQpLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVzdWx0KSwgaW5mbywgc2l6ZW9mKGluZm8pKTsKKworICBCT09TVF9DSEVDS19FUVVBTChyZXN1bHRMZW4sIHNpemVvZihyZXN1bHQpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUxfQ09MTEVDVElPTlMocmVzdWx0LCByZXN1bHQgKyBzaXplb2YocmVzdWx0KSwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICsgc2l6ZW9mKGV4cGVjdGVkKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEhrZGYzKQoreworICAvLyBSRkM1ODY5IGFwcGVuZGl4IEEuMworICBjb25zdCB1aW50OF90IGlrbVtdID0gezB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBifTsKKyAgY29uc3QgdWludDhfdCBleHBlY3RlZFtdID0geworICAgICAgMHg4ZCwgMHhhNCwgMHhlNywgMHg3NSwgMHhhNSwgMHg2MywgMHhjMSwgMHg4ZiwgMHg3MSwgMHg1ZiwgMHg4MCwKKyAgICAgIDB4MmEsIDB4MDYsIDB4M2MsIDB4NWEsIDB4MzEsIDB4YjgsIDB4YTEsIDB4MWYsIDB4NWMsIDB4NWUsIDB4ZTEsCisgICAgICAweDg3LCAweDllLCAweGMzLCAweDQ1LCAweDRlLCAweDVmLCAweDNjLCAweDczLCAweDhkLCAweDJkLCAweDlkLAorICAgICAgMHgyMCwgMHgxMywgMHg5NSwgMHhmYSwgMHhhNCwgMHhiNiwgMHgxYSwgMHg5NiwgMHhjOH07CisgIHVpbnQ4X3QgcmVzdWx0WzQyXTsKKworICBhdXRvIHJlc3VsdExlbiA9IGhrZGYoaWttLCBzaXplb2YoaWttKSwgbnVsbHB0ciwgMCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlc3VsdCksIG51bGxwdHIsIDApOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3VsdExlbiwgc2l6ZW9mKHJlc3VsdCkpOworICBCT09TVF9DSEVDS19FUVVBTF9DT0xMRUNUSU9OUyhyZXN1bHQsIHJlc3VsdCArIHNpemVvZihyZXN1bHQpLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKyBzaXplb2YoZXhwZWN0ZWQpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQWVzR2NtMSkKK3sKKyAgLy8gVGVzdCBjYXNlIGZyb20gTklTVCBDcnlwdG9ncmFwaGljIEFsZ29yaXRobSBWYWxpZGF0aW9uIFByb2dyYW0KKyAgLy8gaHR0cHM6Ly9jc3JjLm5pc3QuZ292L1Byb2plY3RzL2NyeXB0b2dyYXBoaWMtYWxnb3JpdGhtLXZhbGlkYXRpb24tcHJvZ3JhbS9DQVZQLVRFU1RJTkctQkxPQ0stQ0lQSEVSLU1PREVTCisgIC8vIENvdW50ID0gMAorICAvLyBLZXkgPSBjZjA2M2EzNGQ0YTlhNzZjMmM4Njc4N2QzZjk2ZGI3MQorICAvLyBJViA9IDExM2I5Nzg1OTcxODY0YzgzYjAxYzc4NworICAvLyBDVCA9CisgIC8vIEFBRCA9CisgIC8vIFRhZyA9IDcyYWM4NDkzZTNhNTIyOGI1ZDEzMGE2OWQyNTEwZTQyCisgIC8vIFBUID0KKyAgY29uc3QgdWludDhfdCBrZXlbXSA9IHsweGNmLCAweDA2LCAweDNhLCAweDM0LCAweGQ0LCAweGE5LCAweGE3LCAweDZjLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmMsIDB4ODYsIDB4NzgsIDB4N2QsIDB4M2YsIDB4OTYsIDB4ZGIsIDB4NzF9OworICBjb25zdCB1aW50OF90IGl2W10gPSB7MHgxMSwgMHgzYiwgMHg5NywgMHg4NSwgMHg5NywgMHgxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDB4NjQsIDB4YzgsIDB4M2IsIDB4MDEsIDB4YzcsIDB4ODd9OworICBjb25zdCB1aW50OF90IGV4cGVjdGVkX3RhZ1tdID0gezB4NzIsIDB4YWMsIDB4ODQsIDB4OTMsIDB4ZTMsIDB4YTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMiwgMHg4YiwgMHg1ZCwgMHgxMywgMHgwYSwgMHg2OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGQyLCAweDUxLCAweDBlLCAweDQyfTsKKworICB1aW50OF90IGNpcGhlcnRleHRbMjU2XSA9IHswfTsKKyAgdWludDhfdCB0YWdbMTZdID0gezB9OworICBjb25zdCB1aW50OF90IGVtcHR5X2J1ZmZlclsxXSA9IHswfTsKKyAgaW50IHNpemUgPSBhZXNHY20xMjhFbmNyeXB0KGVtcHR5X2J1ZmZlciwgMCwgZW1wdHlfYnVmZmVyLCAwLCBrZXksIGl2LCBjaXBoZXJ0ZXh0LCB0YWcpOworICBCT09TVF9DSEVDSyhzaXplID09IDApOworICBCT09TVF9DSEVDS19FUVVBTF9DT0xMRUNUSU9OUyh0YWcsIHRhZyArIDE2LCBleHBlY3RlZF90YWcsIGV4cGVjdGVkX3RhZyArIHNpemVvZihleHBlY3RlZF90YWcpKTsKKworICB1aW50OF90IGRlY3J5cHRlZFsyNTZdID0gezB9OworICBzaXplID0gYWVzR2NtMTI4RGVjcnlwdChjaXBoZXJ0ZXh0LCBzaXplLCBlbXB0eV9idWZmZXIsIDAsIHRhZywga2V5LCBpdiwgZGVjcnlwdGVkKTsKKyAgQk9PU1RfQ0hFQ0soc2l6ZSA9PSAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQWVzR2NtMikKK3sKKyAgLy8gVGVzdCBjYXNlIGZyb20gTklTVCBDcnlwdG9ncmFwaGljIEFsZ29yaXRobSBWYWxpZGF0aW9uIFByb2dyYW0KKyAgLy8gaHR0cHM6Ly9jc3JjLm5pc3QuZ292L1Byb2plY3RzL2NyeXB0b2dyYXBoaWMtYWxnb3JpdGhtLXZhbGlkYXRpb24tcHJvZ3JhbS9DQVZQLVRFU1RJTkctQkxPQ0stQ0lQSEVSLU1PREVTCisgIC8vIENvdW50ID0gMQorICAvLyBLZXkgPSAyMzcwZTMyMGQ0MzQ0MjA4ZTBmZjU2ODNmMjQzYjIxMworICAvLyBJViA9IDA0ZGJiODJmMDQ0ZDMwODMxYzQ0MTIyOAorICAvLyBDVCA9CisgIC8vIEFBRCA9IGQ0M2E4ZTUwODllZWEwZDAyNmMwM2E4NTE3OGIyN2RhCisgIC8vIFRhZyA9IDJhMDQ5YzA0OWQyNWFhOTU5NjliNDUxZDkzYzMxYzZlCisgIC8vIFBUID0KKyAgY29uc3QgdWludDhfdCBrZXlbXSA9IHsweDIzLCAweDcwLCAweGUzLCAweDIwLCAweGQ0LCAweDM0LCAweDQyLCAweDA4LAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTAsIDB4ZmYsIDB4NTYsIDB4ODMsIDB4ZjIsIDB4NDMsIDB4YjIsIDB4MTN9OworICBjb25zdCB1aW50OF90IGl2W10gPSB7MHgwNCwgMHhkYiwgMHhiOCwgMHgyZiwgMHgwNCwgMHg0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAsIDB4ODMsIDB4MWMsIDB4NDQsIDB4MTIsIDB4Mjh9OworICBjb25zdCB1aW50OF90IGFhZFtdID0gezB4ZDQsIDB4M2EsIDB4OGUsIDB4NTAsIDB4ODksIDB4ZWUsIDB4YTAsIDB4ZDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNiwgMHhjMCwgMHgzYSwgMHg4NSwgMHgxNywgMHg4YiwgMHgyNywgMHhkYX07CisgIGNvbnN0IHVpbnQ4X3QgZXhwZWN0ZWRfdGFnW10gPSB7MHgyYSwgMHgwNCwgMHg5YywgMHgwNCwgMHg5ZCwgMHgyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFhLCAweDk1LCAweDk2LCAweDliLCAweDQ1LCAweDFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTMsIDB4YzMsIDB4MWMsIDB4NmV9OworCisgIHVpbnQ4X3QgY2lwaGVydGV4dFsyNTZdID0gezB9OworICB1aW50OF90IHRhZ1sxNl0gPSB7MH07CisgIGNvbnN0IHVpbnQ4X3QgZW1wdHlfYnVmZmVyWzFdID0gezB9OworICBpbnQgc2l6ZSA9IGFlc0djbTEyOEVuY3J5cHQoZW1wdHlfYnVmZmVyLCAwLCBhYWQsIHNpemVvZihhYWQpLCBrZXksIGl2LCBjaXBoZXJ0ZXh0LCB0YWcpOworICBCT09TVF9DSEVDSyhzaXplID09IDApOworICBCT09TVF9DSEVDS19FUVVBTF9DT0xMRUNUSU9OUyh0YWcsIHRhZyArIDE2LCBleHBlY3RlZF90YWcsIGV4cGVjdGVkX3RhZyArIHNpemVvZihleHBlY3RlZF90YWcpKTsKKworICB1aW50OF90IGRlY3J5cHRlZFsyNTZdID0gezB9OworICBzaXplID0gYWVzR2NtMTI4RGVjcnlwdChjaXBoZXJ0ZXh0LCBzaXplLCBhYWQsIHNpemVvZihhYWQpLCB0YWcsIGtleSwgaXYsIGRlY3J5cHRlZCk7CisgIEJPT1NUX0NIRUNLKHNpemUgPT0gMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFlc0djbTMpCit7CisgIC8vIFRlc3QgY2FzZSBmcm9tIE5JU1QgQ3J5cHRvZ3JhcGhpYyBBbGdvcml0aG0gVmFsaWRhdGlvbiBQcm9ncmFtCisgIC8vIGh0dHBzOi8vY3NyYy5uaXN0Lmdvdi9Qcm9qZWN0cy9jcnlwdG9ncmFwaGljLWFsZ29yaXRobS12YWxpZGF0aW9uLXByb2dyYW0vQ0FWUC1URVNUSU5HLUJMT0NLLUNJUEhFUi1NT0RFUworICAvLyBDb3VudCA9IDAKKyAgLy8gS2V5ID0gYmMyMmYzZjA1Y2M0MGRiOTMxMWU0MTkyOTY2ZmVlOTIKKyAgLy8gSVYgPSAxMzQ5ODhlNjYyMzQzYzA2ZDNhYjgzZGIKKyAgLy8gQ1QgPSA0YzAxNjhhYjk1ZDNhMTBlZjI1ZTU5MjQxMDgzODkzNjVjNjdkOTc3Nzg5OTU4OTJkOWZkNDY4OTczODRhZjYxZmM1NTkyMTJiMzI2N2U5MGZlNGRmN2JmZDFmYmVkNDZmNGI5ZWUKKyAgLy8gQUFEID0gMTAwODdlNmVkODEwNDliNTA5YzMxZDEyZmVlODhjNjQKKyAgLy8gVGFnID0gNzcxMzU3OTU4YTMxNmYxNjZiZDBkYWNjOThlYTgwMWEKKyAgLy8gUFQgPSAzMzdjMWJjOTkyMzg2Y2YwZjk1NzYxN2ZlNGQ1ZWMxMjE4YWUxY2M0MDM2OTMwNTUxOGViMTc3ZTliMTVjMTY0NmIxNDJmZjcxMjM3ZWZhYTU4NzkwMDgwY2Q4MmU4ODQ4YjI5NWMKKyAgY29uc3QgdWludDhfdCBrZXlbXSA9IHsweGJjLCAweDIyLCAweGYzLCAweGYwLCAweDVjLCAweGM0LCAweDBkLCAweGI5LAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzEsIDB4MWUsIDB4NDEsIDB4OTIsIDB4OTYsIDB4NmYsIDB4ZWUsIDB4OTJ9OworICBjb25zdCB1aW50OF90IGl2W10gPSB7MHgxMywgMHg0OSwgMHg4OCwgMHhlNiwgMHg2MiwgMHgzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDB4M2MsIDB4MDYsIDB4ZDMsIDB4YWIsIDB4ODMsIDB4ZGJ9OworICBjb25zdCB1aW50OF90IGFhZFtdID0gezB4MTAsIDB4MDgsIDB4N2UsIDB4NmUsIDB4ZDgsIDB4MTAsIDB4NDksIDB4YjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwgMHhjMywgMHgxZCwgMHgxMiwgMHhmZSwgMHhlOCwgMHg4YywgMHg2NH07CisgIGNvbnN0IHVpbnQ4X3QgZXhwZWN0ZWRfY2lwaGVydGV4dFtdID0geworICAgICAgMHg0YywgMHgwMSwgMHg2OCwgMHhhYiwgMHg5NSwgMHhkMywgMHhhMSwgMHgwZSwgMHhmMiwgMHg1ZSwgMHg1OSwKKyAgICAgIDB4MjQsIDB4MTAsIDB4ODMsIDB4ODksIDB4MzYsIDB4NWMsIDB4NjcsIDB4ZDksIDB4NzcsIDB4NzgsIDB4OTksCisgICAgICAweDU4LCAweDkyLCAweGQ5LCAweGZkLCAweDQ2LCAweDg5LCAweDczLCAweDg0LCAweGFmLCAweDYxLCAweGZjLAorICAgICAgMHg1NSwgMHg5MiwgMHgxMiwgMHhiMywgMHgyNiwgMHg3ZSwgMHg5MCwgMHhmZSwgMHg0ZCwgMHhmNywgMHhiZiwKKyAgICAgIDB4ZDEsIDB4ZmIsIDB4ZWQsIDB4NDYsIDB4ZjQsIDB4YjksIDB4ZWV9OworICBjb25zdCB1aW50OF90IGV4cGVjdGVkX3RhZ1tdID0gezB4NzcsIDB4MTMsIDB4NTcsIDB4OTUsIDB4OGEsIDB4MzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZiwgMHgxNiwgMHg2YiwgMHhkMCwgMHhkYSwgMHhjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk4LCAweGVhLCAweDgwLCAweDFhfTsKKyAgY29uc3QgdWludDhfdCBwbGFpbnRleHRbXSA9IHsKKyAgICAgIDB4MzMsIDB4N2MsIDB4MWIsIDB4YzksIDB4OTIsIDB4MzgsIDB4NmMsIDB4ZjAsIDB4ZjksIDB4NTcsIDB4NjEsCisgICAgICAweDdmLCAweGU0LCAweGQ1LCAweGVjLCAweDEyLCAweDE4LCAweGFlLCAweDFjLCAweGM0LCAweDAzLCAweDY5LAorICAgICAgMHgzMCwgMHg1NSwgMHgxOCwgMHhlYiwgMHgxNywgMHg3ZSwgMHg5YiwgMHgxNSwgMHhjMSwgMHg2NCwgMHg2YiwKKyAgICAgIDB4MTQsIDB4MmYsIDB4ZjcsIDB4MTIsIDB4MzcsIDB4ZWYsIDB4YWEsIDB4NTgsIDB4NzksIDB4MDAsIDB4ODAsCisgICAgICAweGNkLCAweDgyLCAweGU4LCAweDg0LCAweDhiLCAweDI5LCAweDVjfTsKKworICB1aW50OF90IGNpcGhlcnRleHRbMjU2XSA9IHswfTsKKyAgdWludDhfdCB0YWdbMTZdID0gezB9OworICBpbnQgc2l6ZSA9IGFlc0djbTEyOEVuY3J5cHQocGxhaW50ZXh0LCBzaXplb2YocGxhaW50ZXh0KSwgYWFkLCBzaXplb2YoYWFkKSwga2V5LCBpdiwgY2lwaGVydGV4dCwgdGFnKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUxfQ09MTEVDVElPTlMoY2lwaGVydGV4dCwgY2lwaGVydGV4dCArIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2NpcGhlcnRleHQsIGV4cGVjdGVkX2NpcGhlcnRleHQgKyBzaXplb2YoZXhwZWN0ZWRfY2lwaGVydGV4dCkpOworICBCT09TVF9DSEVDS19FUVVBTF9DT0xMRUNUSU9OUyh0YWcsIHRhZyArIDE2LCBleHBlY3RlZF90YWcsIGV4cGVjdGVkX3RhZyArIHNpemVvZihleHBlY3RlZF90YWcpKTsKKworICB1aW50OF90IGRlY3J5cHRlZFsyNTZdID0gezB9OworICBzaXplID0gYWVzR2NtMTI4RGVjcnlwdChjaXBoZXJ0ZXh0LCBzaXplLCBhYWQsIHNpemVvZihhYWQpLCB0YWcsIGtleSwgaXYsIGRlY3J5cHRlZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMX0NPTExFQ1RJT05TKGRlY3J5cHRlZCwgZGVjcnlwdGVkICsgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW50ZXh0LCBwbGFpbnRleHQgKyBzaXplb2YocGxhaW50ZXh0KSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFlc0lWKQoreworICBjb25zdCB1aW50OF90IGtleVtdID0gezB4YmMsIDB4MjIsIDB4ZjMsIDB4ZjAsIDB4NWMsIDB4YzQsIDB4MGQsIDB4YjksCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMSwgMHgxZSwgMHg0MSwgMHg5MiwgMHg5NiwgMHg2ZiwgMHhlZSwgMHg5Mn07CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHBsYWludGV4dCA9ICJhbG9uZ3N0cmluZ2Fsb25nc3RyaW5nYWxvbmdzdHJpbmdhbG9uZ3N0cmluZ2Fsb25nc3RyaW5nYWxvbmdzdHJpbmdhbG9uZ3N0cmluZ2Fsb25nc3RyaW5nIjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgYXNzb2NpYXRlZERhdGEgPSAidGVzdCI7CisgIHVpbnQzMl90IGNvdW50ZXIgPSAwOworICBhdXRvIGJsb2NrID0gZW5jb2RlQmxvY2tXaXRoQWVzR2NtMTI4KG5kbjo6dGx2OjpDb250ZW50LCBrZXksICh1aW50OF90KilwbGFpbnRleHQuY19zdHIoKSwgcGxhaW50ZXh0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopYXNzb2NpYXRlZERhdGEuY19zdHIoKSwgYXNzb2NpYXRlZERhdGEuc2l6ZSgpLCBjb3VudGVyKTsKKyAgYmxvY2sucGFyc2UoKTsKKyAgYXV0byBpdkJsb2NrID0gYmxvY2suZ2V0KHRsdjo6SW5pdGlhbGl6YXRpb25WZWN0b3IpOworICBCdWZmZXIgaXZCdWYoaXZCbG9jay52YWx1ZSgpLCBpdkJsb2NrLnZhbHVlX3NpemUoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGl2QnVmLnNpemUoKSwgMTIpOworICBCT09TVF9DSEVDSyhpdkJ1ZlswXSA+PSAxMjgpOworICBCT09TVF9DSEVDS19FUVVBTChpdkJ1Zls4XSArIGl2QnVmWzldICsgaXZCdWZbMTBdICsgaXZCdWZbMTFdLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY291bnRlciwgNik7CisgIGNvdW50ZXIgPSAzMDA7CisgIGJsb2NrID0gZW5jb2RlQmxvY2tXaXRoQWVzR2NtMTI4KG5kbjo6dGx2OjpBcHBsaWNhdGlvblBhcmFtZXRlcnMsIGtleSwgKHVpbnQ4X3QqKXBsYWludGV4dC5jX3N0cigpLCBwbGFpbnRleHQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopYXNzb2NpYXRlZERhdGEuY19zdHIoKSwgYXNzb2NpYXRlZERhdGEuc2l6ZSgpLCBjb3VudGVyKTsKKyAgYmxvY2sucGFyc2UoKTsKKyAgaXZCbG9jayA9IGJsb2NrLmdldCh0bHY6OkluaXRpYWxpemF0aW9uVmVjdG9yKTsKKyAgQnVmZmVyIGl2QnVmMihpdkJsb2NrLnZhbHVlKCksIGl2QmxvY2sudmFsdWVfc2l6ZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXZCdWYyLnNpemUoKSwgMTIpOworICBCT09TVF9DSEVDSyhpdkJ1ZjJbMF0gPCAxMjgpOworICBCT09TVF9DSEVDS19FUVVBTChpdkJ1ZjJbOF0gKyBpdkJ1ZjJbOV0sIDApOworICBCT09TVF9DSEVDS19FUVVBTChpdkJ1ZjJbMTBdLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaXZCdWYyWzExXSwgNDQpOworICBCT09TVF9DSEVDS19FUVVBTChjb3VudGVyLCAzMDYpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShCbG9ja0VuY29kaW5nRGVjb2RpbmcpCit7CisgIGNvbnN0IHVpbnQ4X3Qga2V5W10gPSB7MHhiYywgMHgyMiwgMHhmMywgMHhmMCwgMHg1YywgMHhjNCwgMHgwZCwgMHhiOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDMxLCAweDFlLCAweDQxLCAweDkyLCAweDk2LCAweDZmLCAweGVlLCAweDkyfTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcGxhaW50ZXh0ID0gImFsb25nc3RyaW5nYWxvbmdzdHJpbmdhbG9uZ3N0cmluZ2Fsb25nc3RyaW5nYWxvbmdzdHJpbmdhbG9uZ3N0cmluZ2Fsb25nc3RyaW5nYWxvbmdzdHJpbmciOworICBjb25zdCBzdGQ6OnN0cmluZyBwbGFpbnRleHQyID0gInNob3J0c3RyaW5nIjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgYXNzb2NpYXRlZERhdGEgPSAicmlnaHQiOworICBjb25zdCBzdGQ6OnN0cmluZyB3cm9uZ0Fzc29jaWF0ZWREYXRhID0gIndyb25nIjsKKyAgdWludDMyX3QgY291bnRlciA9IDA7CisgIC8vIGxvbmcgc3RyaW5nIGVuY3J5cHRpb24KKyAgYXV0byBibG9jayA9IGVuY29kZUJsb2NrV2l0aEFlc0djbTEyOChuZG46OnRsdjo6Q29udGVudCwga2V5LCAodWludDhfdCopcGxhaW50ZXh0LmNfc3RyKCksIHBsYWludGV4dC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWFzc29jaWF0ZWREYXRhLmNfc3RyKCksIGFzc29jaWF0ZWREYXRhLnNpemUoKSwgY291bnRlcik7CisgIGF1dG8gZGVjb2RlZCA9IGRlY29kZUJsb2NrV2l0aEFlc0djbTEyOChibG9jaywga2V5LCAodWludDhfdCopYXNzb2NpYXRlZERhdGEuY19zdHIoKSwgYXNzb2NpYXRlZERhdGEuc2l6ZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGxhaW50ZXh0LCBzdGQ6OnN0cmluZyhkZWNvZGVkLmdldDxjaGFyPigpLCBkZWNvZGVkLnNpemUoKSkpOworCisgIC8vIHNob3J0IHN0cmluZyBlbmNyeXB0aW9uCisgIGJsb2NrID0gZW5jb2RlQmxvY2tXaXRoQWVzR2NtMTI4KG5kbjo6dGx2OjpDb250ZW50LCBrZXksICh1aW50OF90KilwbGFpbnRleHQyLmNfc3RyKCksIHBsYWludGV4dDIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopYXNzb2NpYXRlZERhdGEuY19zdHIoKSwgYXNzb2NpYXRlZERhdGEuc2l6ZSgpLCBjb3VudGVyKTsKKyAgZGVjb2RlZCA9IGRlY29kZUJsb2NrV2l0aEFlc0djbTEyOChibG9jaywga2V5LCAodWludDhfdCopYXNzb2NpYXRlZERhdGEuY19zdHIoKSwgYXNzb2NpYXRlZERhdGEuc2l6ZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGxhaW50ZXh0Miwgc3RkOjpzdHJpbmcoZGVjb2RlZC5nZXQ8Y2hhcj4oKSwgZGVjb2RlZC5zaXplKCkpKTsKKworICAvLyB1c2Ugd3JvbmcgYXNzb2NpYXRlZCBkYXRhCisgIEJPT1NUX0NIRUNLX1RIUk9XKGRlY29kZUJsb2NrV2l0aEFlc0djbTEyOChibG9jaywga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKXdyb25nQXNzb2NpYXRlZERhdGEuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyb25nQXNzb2NpYXRlZERhdGEuc2l6ZSgpKSwgc3RkOjpydW50aW1lX2Vycm9yKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZG5jZXJ0Cit9IC8vIG5hbWVzcGFjZSBuZG4KZGlmZiAtLWdpdCBhL3Rlc3RzL3dzY3JpcHQgYi90ZXN0cy93c2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTUxYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy93c2NyaXB0CkBAIC0wLDAgKzEsMTcgQEAKKyMgLSotIE1vZGU6IHB5dGhvbjsgcHktaW5kZW50LW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjb2Rpbmc6IHV0Zi04OyAtKi0KK3RvcCA9ICcuLicKKworZGVmIGJ1aWxkKGJsZCk6CisgICAgaWYgbm90IGJsZC5lbnYuV0lUSF9URVNUUzoKKyAgICAgICAgcmV0dXJuCisKKyAgICB0bXBfcGF0aCA9ICdUTVBfVEVTVFNfUEFUSD0iJXMiJyAlIGJsZC5ibGRub2RlLm1ha2Vfbm9kZSgndG1wLXRlc3RzJykKKworICAgIGJsZC5wcm9ncmFtKAorICAgICAgICB0YXJnZXQ9Jy4uL3VuaXQtdGVzdHMnLAorICAgICAgICBuYW1lPSd1bml0LXRlc3RzJywKKyAgICAgICAgc291cmNlPWJsZC5wYXRoLmFudF9nbG9iKFsnKi5jcHAnLCAndW5pdC10ZXN0cy8qKi8qLmNwcCddKSwKKyAgICAgICAgdXNlPSduZG4tY2VydCBCT09TVCcsCisgICAgICAgIGluY2x1ZGVzPScuJywKKyAgICAgICAgZGVmaW5lcz1bdG1wX3BhdGhdLAorICAgICAgICBpbnN0YWxsX3BhdGg9Tm9uZSkKZGlmZiAtLWdpdCBhL3dhZiBiL3dhZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMWM1Yzk2Ci0tLSAvZGV2L251bGwKKysrIGIvd2FmCkBAIC0wLDAgKzEsMTczIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjIGVuY29kaW5nOiBsYXRpbi0xCisjIFRob21hcyBOYWd5LCAyMDA1LTIwMTgKKyMKKyIiIgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKK0lORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCitTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKK1NUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyIiIgorCitpbXBvcnQgb3MsIHN5cywgaW5zcGVjdAorCitWRVJTSU9OPSIyLjAuMTkiCitSRVZJU0lPTj0iMWYzYzU4MDI3MmIxNWEwM2QyNTY2ODQzYzVmZTg3MmEiCitHSVQ9IjYxZWUyMmI1OThjZjgwZTI2MGJlYjY0ZTQ3NTk2NmY1OGIzMDRkMGQiCitJTlNUQUxMPScnCitDMT0nIzYnCitDMj0nIy4nCitDMz0nIyUnCitjd2QgPSBvcy5nZXRjd2QoKQoram9pbiA9IG9zLnBhdGguam9pbgorCisKK1dBRj0nd2FmJworZGVmIGIoeCk6CisJcmV0dXJuIHgKK2lmIHN5cy5oZXh2ZXJzaW9uPjB4MzAwMDAwZjoKKwlXQUY9J3dhZjMnCisJZGVmIGIoeCk6CisJCXJldHVybiB4LmVuY29kZSgpCisKK2RlZiBlcnIobSk6CisJcHJpbnQoKCdcMDMzWzkxbUVycm9yOiAlc1wwMzNbMG0nICUgbSkpCisJc3lzLmV4aXQoMSkKKworZGVmIHVucGFja193YWZkaXIoZGlyLCBzcmMpOgorCWYgPSBvcGVuKHNyYywncmInKQorCWMgPSAnY29ycnVwdCBhcmNoaXZlICglZCknCisJd2hpbGUgMToKKwkJbGluZSA9IGYucmVhZGxpbmUoKQorCQlpZiBub3QgbGluZTogZXJyKCdydW4gd2FmLWxpZ2h0IGZyb20gYSBmb2xkZXIgY29udGFpbmluZyB3YWZsaWInKQorCQlpZiBsaW5lID09IGIoJyM9PT5cbicpOgorCQkJdHh0ID0gZi5yZWFkbGluZSgpCisJCQlpZiBub3QgdHh0OiBlcnIoYyAlIDEpCisJCQlpZiBmLnJlYWRsaW5lKCkgIT0gYignIzw9PVxuJyk6IGVycihjICUgMikKKwkJCWJyZWFrCisJaWYgbm90IHR4dDogZXJyKGMgJSAzKQorCXR4dCA9IHR4dFsxOi0xXS5yZXBsYWNlKGIoQzEpLCBiKCdcbicpKS5yZXBsYWNlKGIoQzIpLCBiKCdccicpKS5yZXBsYWNlKGIoQzMpLCBiKCdceDAwJykpCisKKwlpbXBvcnQgc2h1dGlsLCB0YXJmaWxlCisJdHJ5OiBzaHV0aWwucm10cmVlKGRpcikKKwlleGNlcHQgT1NFcnJvcjogcGFzcworCXRyeToKKwkJZm9yIHggaW4gKCdUb29scycsICdleHRyYXMnKToKKwkJCW9zLm1ha2VkaXJzKGpvaW4oZGlyLCAnd2FmbGliJywgeCkpCisJZXhjZXB0IE9TRXJyb3I6CisJCWVycigiQ2Fubm90IHVucGFjayB3YWYgbGliIGludG8gJXNcbk1vdmUgd2FmIGluIGEgd3JpdGFibGUgZGlyZWN0b3J5IiAlIGRpcikKKworCW9zLmNoZGlyKGRpcikKKwl0bXAgPSAndC5iejInCisJdCA9IG9wZW4odG1wLCd3YicpCisJdHJ5OiB0LndyaXRlKHR4dCkKKwlmaW5hbGx5OiB0LmNsb3NlKCkKKworCXRyeToKKwkJdCA9IHRhcmZpbGUub3Blbih0bXApCisJZXhjZXB0OgorCQl0cnk6CisJCQlvcy5zeXN0ZW0oJ2J1bnppcDIgdC5iejInKQorCQkJdCA9IHRhcmZpbGUub3BlbigndCcpCisJCQl0bXAgPSAndCcKKwkJZXhjZXB0OgorCQkJb3MuY2hkaXIoY3dkKQorCQkJdHJ5OiBzaHV0aWwucm10cmVlKGRpcikKKwkJCWV4Y2VwdCBPU0Vycm9yOiBwYXNzCisJCQllcnIoIldhZiBjYW5ub3QgYmUgdW5wYWNrZWQsIGNoZWNrIHRoYXQgYnppcDIgc3VwcG9ydCBpcyBwcmVzZW50IikKKworCXRyeToKKwkJZm9yIHggaW4gdDogdC5leHRyYWN0KHgpCisJZmluYWxseToKKwkJdC5jbG9zZSgpCisKKwlmb3IgeCBpbiAoJ1Rvb2xzJywgJ2V4dHJhcycpOgorCQlvcy5jaG1vZChqb2luKCd3YWZsaWInLHgpLCA0OTMpCisKKwlpZiBzeXMuaGV4dmVyc2lvbjwweDMwMDAwMGY6CisJCXN5cy5wYXRoID0gW2pvaW4oZGlyLCAnd2FmbGliJyldICsgc3lzLnBhdGgKKwkJaW1wb3J0IGZpeHB5MgorCQlmaXhweTIuZml4ZGlyKGRpcikKKworCW9zLnJlbW92ZSh0bXApCisJb3MuY2hkaXIoY3dkKQorCisJdHJ5OiBkaXIgPSB1bmljb2RlKGRpciwgJ21iY3MnKQorCWV4Y2VwdDogcGFzcworCXRyeToKKwkJZnJvbSBjdHlwZXMgaW1wb3J0IHdpbmRsbAorCQl3aW5kbGwua2VybmVsMzIuU2V0RmlsZUF0dHJpYnV0ZXNXKGRpciwgMikKKwlleGNlcHQ6CisJCXBhc3MKKworZGVmIHRlc3QoZGlyKToKKwl0cnk6CisJCW9zLnN0YXQoam9pbihkaXIsICd3YWZsaWInKSkKKwkJcmV0dXJuIG9zLnBhdGguYWJzcGF0aChkaXIpCisJZXhjZXB0IE9TRXJyb3I6CisJCXBhc3MKKworZGVmIGZpbmRfbGliKCk6CisJc3JjID0gb3MucGF0aC5hYnNwYXRoKGluc3BlY3QuZ2V0ZmlsZShpbnNwZWN0LmdldG1vZHVsZShlcnIpKSkKKwliYXNlLCBuYW1lID0gb3MucGF0aC5zcGxpdChzcmMpCisKKwkjZGV2cyB1c2UgJFdBRkRJUgorCXc9dGVzdChvcy5lbnZpcm9uLmdldCgnV0FGRElSJywgJycpKQorCWlmIHc6IHJldHVybiB3CisKKwkjd2FmLWxpZ2h0CisJaWYgbmFtZS5lbmRzd2l0aCgnd2FmLWxpZ2h0Jyk6CisJCXcgPSB0ZXN0KGJhc2UpCisJCWlmIHc6IHJldHVybiB3CisJCWZvciBkaXIgaW4gc3lzLnBhdGg6CisJCQlpZiB0ZXN0KGRpcik6CisJCQkJcmV0dXJuIGRpcgorCQllcnIoJ3dhZi1saWdodCByZXF1aXJlcyB3YWZsaWIgLT4gZXhwb3J0IFdBRkRJUj0vZm9sZGVyJykKKworCWRpcm5hbWUgPSAnJXMtJXMtJXMnICUgKFdBRiwgVkVSU0lPTiwgUkVWSVNJT04pCisJZm9yIGkgaW4gKElOU1RBTEwsJy91c3InLCcvdXNyL2xvY2FsJywnL29wdCcpOgorCQl3ID0gdGVzdChpICsgJy9saWIvJyArIGRpcm5hbWUpCisJCWlmIHc6IHJldHVybiB3CisKKwkjd2FmLWxvY2FsCisJZGlyID0gam9pbihiYXNlLCAoc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgYW5kICcuJyBvciAnJykgKyBkaXJuYW1lKQorCXcgPSB0ZXN0KGRpcikKKwlpZiB3OiByZXR1cm4gdworCisJI3VucGFjaworCXVucGFja193YWZkaXIoZGlyLCBzcmMpCisJcmV0dXJuIGRpcgorCit3YWZkaXIgPSBmaW5kX2xpYigpCitzeXMucGF0aC5pbnNlcnQoMCwgd2FmZGlyKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCisJZnJvbSB3YWZsaWIgaW1wb3J0IFNjcmlwdGluZworCVNjcmlwdGluZy53YWZfZW50cnlfcG9pbnQoY3dkLCBWRVJTSU9OLCB3YWZkaXIpCisKKyM9PT4KKyNCWmg5MUFZJlNZOQm9tANcpf///7NEUH///////////////22gKMKsAyMlBDCBFRowZYAoYhYc9y9t0IAjJSMlIyUjJSMlIyUjJSMlIyUjJSMlIyUjJSMlIyUjJSMlIyUjJSMlBfbe+nrzbW1r7h3WWp7e5peyVSMutAZbadq+7p31ubG1lvo6pSdrZIvuN3vb72+6tdu2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eG5xeEtNaTNMU0k0TlBqZkZHeTYyRmtTazNNUzRwNlJkcDAvV0FLd3dOalxudzdXRWpRQ05tTGIzN3orRkdTelhnMjhhbGpZZXRlQlpFdGhzVm1HSjVRcVZ3TUJ3Z2oyK3k1Rk9UekZmeG1xQlxucldnakZZUzBsODVrZ1lSWnY5eXpkTm1GczVTU2N3YWZ3cFQ4WG1kcjQ5dEZuLyswTHhYeVJ4WCtyZE9EZ3JwVlxuWTRFT2lRejBmZDZtTU1uYVREWGxMU1hsczNKeVZZbWJUamVOTC85Z2NIbW5TdHpKODUxQ0pRZnlRZzdBK0pvQ1xuYzduejBIYmlGeVRnQitQVVpyMU9oR2ozQTcyODdvOFhRMHRxUjNvYTdqWElPWDBPeW5yR3BsTVFLcisrMGpFMVxuQmdLempMb0U5Q1RiamtRZklDTEcrYVV5M1MxWnlEay9CY08rNStZdGJydStxWHVEc0lnQWRWb3NNZk5TdjlqSlxuWHZPSU5zYlJNZWtkZWpZTVp2OGZJa241T0VqQ0ZIVmhOcG9iRXNDYjc2OGJqQjNwN2FsUUdFQ0J2akhDbTZkeVxuWFpQemw5Y0JNV0lYY0JqUFRTK0daaitQSVhHY3U3NnBic3g2SEJIV2YrdUorNHhnT3NVQ1Z1Ly8wQVYwOWp2QVxuME1qdExXd1E4bWRSSDZXdDRoc3A0SEt0U3ZRcmhtbGpmMk9udVlCZ2FGbWNkSmtOMXpJPVxuPUMwb1Rcbi0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLVxuCmRpZmYgLS1naXQgYS93c2NyaXB0IGIvd3NjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODZjMjhhCi0tLSAvZGV2L251bGwKKysrIGIvd3NjcmlwdApAQCAtMCwwICsxLDg4IEBACisjIC0qLSBNb2RlOiBweXRob247IHB5LWluZGVudC1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgY29kaW5nOiB1dGYtODsgLSotCisKK2Zyb20gd2FmbGliIGltcG9ydCBVdGlscworaW1wb3J0IG9zCisKK1ZFUlNJT04gPSAnMC4xLjAnCitBUFBOQU1FID0gJ25kbmNlcnQnCitHSVRfVEFHX1BSRUZJWCA9ICduZG5jZXJ0LScKKworZGVmIG9wdGlvbnMob3B0KToKKyAgICBvcHQubG9hZChbJ2NvbXBpbGVyX2N4eCcsICdnbnVfZGlycyddKQorICAgIG9wdC5sb2FkKFsnZGVmYXVsdC1jb21waWxlci1mbGFncycsICdjb3ZlcmFnZScsICdzYW5pdGl6ZXJzJywKKyAgICAgICAgICAgICAgJ2Jvb3N0JywgJ29wZW5zc2wnLCAnc3FsaXRlMyddLAorICAgICAgICAgICAgIHRvb2xkaXI9Wycud2FmLXRvb2xzJ10pCisKKyAgICBvcHRncnAgPSBvcHQuYWRkX29wdGlvbl9ncm91cCgnbmRuY2VydCBPcHRpb25zJykKKyAgICBvcHRncnAuYWRkX29wdGlvbignLS13aXRoLXRlc3RzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdCdWlsZCB1bml0IHRlc3RzJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBjb25mLmxvYWQoWydjb21waWxlcl9jeHgnLCAnZ251X2RpcnMnLAorICAgICAgICAgICAgICAgJ2RlZmF1bHQtY29tcGlsZXItZmxhZ3MnLCAnYm9vc3QnLCAnb3BlbnNzbCcsICdzcWxpdGUzJ10pCisKKyAgICBjb25mLmVudi5XSVRIX1RFU1RTID0gY29uZi5vcHRpb25zLndpdGhfdGVzdHMKKworICAgIGNvbmYuY2hlY2tfY2ZnKHBhY2thZ2U9J2xpYm5kbi1jeHgnLCBhcmdzPVsnLS1jZmxhZ3MnLCAnLS1saWJzJ10sIHVzZWxpYl9zdG9yZT0nTkROX0NYWCcsCisgICAgICAgICAgICAgICAgICAgcGtnX2NvbmZpZ19wYXRoPW9zLmVudmlyb24uZ2V0KCdQS0dfQ09ORklHX1BBVEgnLCAnJXMvcGtnY29uZmlnJyAlIGNvbmYuZW52LkxJQkRJUikpCisKKyAgICBjb25mLmNoZWNrX3NxbGl0ZTMoKQorICAgIGNvbmYuY2hlY2tfb3BlbnNzbChsaWI9J2NyeXB0bycsIGF0bGVhc3RfdmVyc2lvbj0weDEwMTAxMDBmKSAjIDEuMS4xCisKKyAgICBib29zdF9saWJzID0gWydzeXN0ZW0nLCAncHJvZ3JhbV9vcHRpb25zJywgJ2ZpbGVzeXN0ZW0nXQorICAgIGlmIGNvbmYuZW52LldJVEhfVEVTVFM6CisgICAgICAgIGJvb3N0X2xpYnMuYXBwZW5kKCd1bml0X3Rlc3RfZnJhbWV3b3JrJykKKworICAgIGNvbmYuY2hlY2tfYm9vc3QobGliPWJvb3N0X2xpYnMsIG10PVRydWUpCisgICAgaWYgY29uZi5lbnYuQk9PU1RfVkVSU0lPTl9OVU1CRVIgPCAxMDU4MDA6CisgICAgICAgIGNvbmYuZmF0YWwoJ01pbmltdW0gcmVxdWlyZWQgQm9vc3QgdmVyc2lvbiBpcyAxLjU4LjBcbicKKyAgICAgICAgICAgICAgICAgICAnUGxlYXNlIHVwZ3JhZGUgeW91ciBkaXN0cmlidXRpb24gb3IgbWFudWFsbHkgaW5zdGFsbCBhIG5ld2VyIHZlcnNpb24gb2YgQm9vc3QnCisgICAgICAgICAgICAgICAgICAgJyAoaHR0cHM6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL0Jvb3N0X0ZBUSknKQorCisgICAgY29uZi5jaGVja19jb21waWxlcl9mbGFncygpCisKKyAgICAjIExvYWRpbmcgImxhdGUiIHRvIHByZXZlbnQgdGVzdHMgZnJvbSBiZWluZyBjb21waWxlZCB3aXRoIHByb2ZpbGluZyBmbGFncworICAgIGNvbmYubG9hZCgnY292ZXJhZ2UnKQorICAgIGNvbmYubG9hZCgnc2FuaXRpemVycycpCisKKyAgICAjIElmIHRoZXJlIGhhcHBlbnMgdG8gYmUgYSBzdGF0aWMgbGlicmFyeSwgd2FmIHdpbGwgcHV0IHRoZSBjb3JyZXNwb25kaW5nIC1MIGZsYWdzCisgICAgIyBiZWZvcmUgZHluYW1pYyBsaWJyYXJ5IGZsYWdzLiAgVGhpcyBjYW4gcmVzdWx0IGluIGNvbXBpbGF0aW9uIGZhaWx1cmUgd2hlbiB0aGUKKyAgICAjIHN5c3RlbSBoYXMgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGUgbmRuY2VydCBsaWJyYXJ5IGluc3RhbGxlZC4KKyAgICBjb25mLmVudi5wcmVwZW5kX3ZhbHVlKCdTVExJQlBBVEgnLCBbJy4nXSkKKworICAgIGNvbmYuZGVmaW5lX2NvbmQoJ0hBVkVfVEVTVFMnLCBjb25mLmVudi5XSVRIX1RFU1RTKQorICAgIGNvbmYuZGVmaW5lKCdTWVNDT05GRElSJywgY29uZi5lbnYuU1lTQ09ORkRJUikKKyAgICAjIFRoZSBjb25maWcgaGVhZGVyIHdpbGwgY29udGFpbiBhbGwgZGVmaW5lcyB0aGF0IHdlcmUgYWRkZWQgdXNpbmcgY29uZi5kZWZpbmUoKQorICAgICMgb3IgY29uZi5kZWZpbmVfY29uZCgpLiAgRXZlcnl0aGluZyB0aGF0IHdhcyBhZGRlZCBkaXJlY3RseSB0byBjb25mLmVudi5ERUZJTkVTCisgICAgIyB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIGNvbmZpZyBoZWFkZXIsIGJ1dCB3aWxsIGluc3RlYWQgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZQorICAgICMgY29tcGlsZXIgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBjb25mLndyaXRlX2NvbmZpZ19oZWFkZXIoJ3NyYy9kZXRhaWwvbmRuY2VydC1jb25maWcuaHBwJywgZGVmaW5lX3ByZWZpeD0nTkROQ0VSVF8nKQorCitkZWYgYnVpbGQoYmxkKToKKyAgICBibGQuc2hsaWIodGFyZ2V0PSduZG4tY2VydCcsCisgICAgICAgICAgICAgIHZudW09VkVSU0lPTiwKKyAgICAgICAgICAgICAgY251bT1WRVJTSU9OLAorICAgICAgICAgICAgICBzb3VyY2U9YmxkLnBhdGguYW50X2dsb2IoJ3NyYy8qKi8qLmNwcCcpLAorICAgICAgICAgICAgICB1c2U9J05ETl9DWFggQk9PU1QgT1BFTlNTTCBTUUxJVEUzJywKKyAgICAgICAgICAgICAgaW5jbHVkZXM9J3NyYycsCisgICAgICAgICAgICAgIGV4cG9ydF9pbmNsdWRlcz0nc3JjJykKKworICAgIGJsZChmZWF0dXJlcz0nc3Vic3QnLAorICAgICAgICBzb3VyY2U9J2xpYm5kbi1jZXJ0LnBjLmluJywKKyAgICAgICAgdGFyZ2V0PSdsaWJuZG4tY2VydC5wYycsCisgICAgICAgIGluc3RhbGxfcGF0aD0nJHtMSUJESVJ9L3BrZ2NvbmZpZycsCisgICAgICAgIFZFUlNJT049VkVSU0lPTikKKworICAgIGJsZC5yZWN1cnNlKCd0ZXN0cycpCisKKyAgICBibGQuaW5zdGFsbF9maWxlcygKKyAgICAgICAgZGVzdD0nJHtJTkNMVURFRElSfS9uZG5jZXJ0JywKKyAgICAgICAgZmlsZXM9YmxkLnBhdGguYW50X2dsb2IoJ3NyYy8qKi8qLmhwcCcpLAorICAgICAgICBjd2Q9YmxkLnBhdGguZmluZF9kaXIoJ3NyYycpLAorICAgICAgICByZWxhdGl2ZV90cmljaz1UcnVlKQorCisgICAgYmxkLmluc3RhbGxfZmlsZXMoCisgICAgICAgIGRlc3Q9JyR7SU5DTFVERURJUn0vbmRuY2VydCcsCisgICAgICAgIGZpbGVzPWJsZC5wYXRoLmdldF9ibGQoKS5hbnRfZ2xvYignc3JjLyoqLyouaHBwJyksCisgICAgICAgIGN3ZD1ibGQucGF0aC5nZXRfYmxkKCkuZmluZF9kaXIoJ3NyYycpLAorICAgICAgICByZWxhdGl2ZV90cmljaz1GYWxzZSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==